diff options
Diffstat (limited to 'src/test/isolation/specs/subxid-overflow.spec')
-rw-r--r-- | src/test/isolation/specs/subxid-overflow.spec | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/test/isolation/specs/subxid-overflow.spec b/src/test/isolation/specs/subxid-overflow.spec new file mode 100644 index 00000000000..9a69db45e8a --- /dev/null +++ b/src/test/isolation/specs/subxid-overflow.spec @@ -0,0 +1,79 @@ +# 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 |