# Test NOWAIT on an updated tuple chain setup { DROP TABLE IF EXISTS test_nowait; CREATE TABLE test_nowait ( id integer PRIMARY KEY, value integer not null ); INSERT INTO test_nowait SELECT x,x FROM generate_series(1,2) x; } teardown { DROP TABLE test_nowait; } session "sl1" step "sl1_prep" { PREPARE sl1_run AS SELECT id FROM test_nowait WHERE pg_advisory_lock(0) is not null FOR UPDATE NOWAIT; } step "sl1_exec" { BEGIN ISOLATION LEVEL READ COMMITTED; EXECUTE sl1_run; SELECT xmin, xmax, ctid, * FROM test_nowait; } teardown { COMMIT; } # A session that's used for an UPDATE of the rows to be locked, for when we're testing ctid # chain following. session "upd" step "upd_getlock" { SELECT pg_advisory_lock(0); } step "upd_doupdate" { BEGIN ISOLATION LEVEL READ COMMITTED; UPDATE test_nowait SET value = value WHERE id % 2 = 0; COMMIT; } step "upd_releaselock" { SELECT pg_advisory_unlock(0); } # A session that acquires locks that sl1 is supposed to avoid blocking on session "lk1" step "lk1_doforshare" { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT id FROM test_nowait WHERE id % 2 = 0 FOR SHARE; } teardown { COMMIT; } permutation "sl1_prep" "upd_getlock" "sl1_exec" "upd_doupdate" "lk1_doforshare" "upd_releaselock"