80 lines
2.0 KiB
RPMSpec
80 lines
2.0 KiB
RPMSpec
# Subtransaction overflow
|
|
#
|
|
# This test is designed to cover some code paths which only occur when
|
|
# one transaction has overflowed the subtransaction cache.
|
|
|
|
setup
|
|
{
|
|
DROP TABLE IF EXISTS subxids;
|
|
CREATE TABLE subxids (subx integer, val integer);
|
|
|
|
CREATE OR REPLACE FUNCTION gen_subxids (n integer)
|
|
RETURNS VOID
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
IF n <= 0 THEN
|
|
UPDATE subxids SET val = 1 WHERE subx = 0;
|
|
RETURN;
|
|
ELSE
|
|
PERFORM gen_subxids(n - 1);
|
|
RETURN;
|
|
END IF;
|
|
EXCEPTION /* generates a subxid */
|
|
WHEN raise_exception THEN NULL;
|
|
END;
|
|
$$;
|
|
}
|
|
|
|
teardown
|
|
{
|
|
DROP TABLE subxids;
|
|
DROP FUNCTION gen_subxids(integer);
|
|
}
|
|
|
|
session s1
|
|
# setup step for each test
|
|
step ins { TRUNCATE subxids; INSERT INTO subxids VALUES (0, 0); }
|
|
# long running transaction with overflowed subxids
|
|
step subxov { BEGIN; SELECT gen_subxids(100); }
|
|
# commit should always come last to make this long running
|
|
step s1c { COMMIT; }
|
|
|
|
session s2
|
|
# move xmax forwards
|
|
step xmax { BEGIN; INSERT INTO subxids VALUES (99, 0); COMMIT;}
|
|
|
|
# step for test1
|
|
step s2sel { SELECT val FROM subxids WHERE subx = 0; }
|
|
|
|
# steps for test2
|
|
step s2brr { BEGIN ISOLATION LEVEL REPEATABLE READ; }
|
|
step s2brc { BEGIN ISOLATION LEVEL READ COMMITTED; }
|
|
# look for data written by sub3
|
|
step s2s3 { SELECT val FROM subxids WHERE subx = 1; }
|
|
step s2c { COMMIT; }
|
|
|
|
# step for test3
|
|
step s2upd { UPDATE subxids SET val = 1 WHERE subx = 0; }
|
|
|
|
session s3
|
|
# transaction with subxids that can commit before s1c
|
|
step sub3 { BEGIN; SAVEPOINT s; INSERT INTO subxids VALUES (1, 0); }
|
|
step s3c { COMMIT; }
|
|
|
|
# test1
|
|
# s2sel will see subxid as still running
|
|
# designed to test XidInMVCCSnapshot() when overflows, xid is found
|
|
permutation ins subxov xmax s2sel s1c
|
|
|
|
# test2
|
|
# designed to test XidInMVCCSnapshot() when overflows, xid is not found
|
|
# both SELECTs invisible
|
|
permutation ins subxov sub3 xmax s2brr s2s3 s3c s2s3 s2c s1c
|
|
# 2nd SELECT visible after commit
|
|
permutation ins subxov sub3 xmax s2brc s2s3 s3c s2s3 s2c s1c
|
|
|
|
# test3
|
|
# designed to test XactLockTableWait() for overflows
|
|
permutation ins subxov xmax s2upd s1c
|