--
-- Hot Standby tests
--
-- hs_primary_extremes.sql
--
DROP TABLE IF EXISTS hs_extreme;

CREATE TABLE hs_extreme (
    col1 integer
);

CREATE OR REPLACE FUNCTION hs_subxids (n integer)
    RETURNS void
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF n <= 0 THEN
        RETURN;
    END IF;
    INSERT INTO hs_extreme
        VALUES (n);
    PERFORM
        hs_subxids (n - 1);
    RETURN;
EXCEPTION
    WHEN raise_exception THEN
        NULL;
END;

$$;

BEGIN;
SELECT
    hs_subxids (257);
ROLLBACK;

BEGIN;
SELECT
    hs_subxids (257);
COMMIT;

SET client_min_messages = 'warning';

CREATE OR REPLACE FUNCTION hs_locks_create (n integer)
    RETURNS void
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF n <= 0 THEN
        CHECKPOINT;
        RETURN;
    END IF;
    EXECUTE 'CREATE TABLE hs_locks_' || n::text || ' ()';
    PERFORM
        hs_locks_create (n - 1);
    RETURN;
EXCEPTION
    WHEN raise_exception THEN
        NULL;
END;

$$;

CREATE OR REPLACE FUNCTION hs_locks_drop (n integer)
    RETURNS void
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF n <= 0 THEN
        CHECKPOINT;
        RETURN;
    END IF;
    EXECUTE 'DROP TABLE IF EXISTS hs_locks_' || n::text;
    PERFORM
        hs_locks_drop (n - 1);
    RETURN;
EXCEPTION
    WHEN raise_exception THEN
        NULL;
END;

$$;

BEGIN;
SELECT
    hs_locks_drop (257);
SELECT
    hs_locks_create (257);
SELECT
    count(*) > 257
FROM
    pg_locks;
ROLLBACK;

BEGIN;
SELECT
    hs_locks_drop (257);
SELECT
    hs_locks_create (257);
SELECT
    count(*) > 257
FROM
    pg_locks;
COMMIT;

SELECT
    hs_locks_drop (257);

SELECT
    pg_switch_wal ();

