aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/test/isolation/expected/tuplelock-update.out24
-rw-r--r--src/test/isolation/isolation_schedule1
-rw-r--r--src/test/isolation/specs/tuplelock-update.spec28
3 files changed, 53 insertions, 0 deletions
diff --git a/src/test/isolation/expected/tuplelock-update.out b/src/test/isolation/expected/tuplelock-update.out
new file mode 100644
index 00000000000..43754e0715b
--- /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; <waiting ...>
+step s3_update: UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; <waiting ...>
+step s4_update: UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; <waiting ...>
+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 fcde38ce452..138a0b762df 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 00000000000..d93e883ebbc
--- /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"