diff --git a/src/test/isolation/expected/tuplelock-update.out b/src/test/isolation/expected/tuplelock-update.out new file mode 100644 index 0000000000..43754e0715 --- /dev/null +++ b/src/test/isolation/expected/tuplelock-update.out @@ -0,0 +1,24 @@ +Parsed test spec with 4 sessions + +starting permutation: s1_advlock s2_update s3_update s4_update s1_chain s1_begin s1_grablock s1_advunlock s1_commit +step s1_advlock: SELECT pg_advisory_lock(142857); +pg_advisory_lock + + +step s2_update: UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; +step s3_update: UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; +step s4_update: UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; +step s1_chain: UPDATE pktab SET data = DEFAULT; +step s1_begin: BEGIN; +step s1_grablock: SELECT * FROM pktab FOR KEY SHARE; +id data + +1 2 +step s1_advunlock: SELECT pg_advisory_unlock(142857); +pg_advisory_unlock + +t +step s2_update: <... completed> +step s3_update: <... completed> +step s4_update: <... completed> +step s1_commit: COMMIT; diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index fcde38ce45..138a0b762d 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -31,6 +31,7 @@ test: multixact-no-deadlock test: multixact-no-forget test: propagate-lock-delete test: tuplelock-conflict +test: tuplelock-update test: nowait test: nowait-2 test: nowait-3 diff --git a/src/test/isolation/specs/tuplelock-update.spec b/src/test/isolation/specs/tuplelock-update.spec new file mode 100644 index 0000000000..d93e883ebb --- /dev/null +++ b/src/test/isolation/specs/tuplelock-update.spec @@ -0,0 +1,28 @@ +setup { + DROP TABLE IF EXISTS pktab; + CREATE TABLE pktab (id int PRIMARY KEY, data SERIAL NOT NULL); + INSERT INTO pktab VALUES (1, DEFAULT); +} + +teardown { + DROP TABLE pktab; +} + +session "s1" +step "s1_advlock" { SELECT pg_advisory_lock(142857); } +step "s1_chain" { UPDATE pktab SET data = DEFAULT; } +step "s1_begin" { BEGIN; } +step "s1_grablock" { SELECT * FROM pktab FOR KEY SHARE; } +step "s1_advunlock" { SELECT pg_advisory_unlock(142857); } +step "s1_commit" { COMMIT; } + +session "s2" +step "s2_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; } + +session "s3" +step "s3_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; } + +session "s4" +step "s4_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; } + +permutation "s1_advlock" "s2_update" "s3_update" "s4_update" "s1_chain" "s1_begin" "s1_grablock" "s1_advunlock" "s1_commit"