blob: e6199a313c88d484bf7573e4c8590c9bdc3cbdae [file]
# Simple tests for statement_timeout and lock_timeout features
setup
{
CREATE TABLE accounts (accountid text PRIMARY KEY, balance numeric not null);
INSERT INTO accounts VALUES ('checking', 600), ('savings', 600);
}
teardown
{
DROP TABLE accounts;
}
session s1
setup { BEGIN ISOLATION LEVEL READ COMMITTED; }
step rdtbl { SELECT * FROM accounts ORDER BY accountid; }
step wrtbl { UPDATE accounts SET balance = balance + 100; }
teardown { ABORT; }
session s2
setup { BEGIN ISOLATION LEVEL READ COMMITTED; }
step sto { SET statement_timeout = '10ms'; }
step lto { SET lock_timeout = '10ms'; }
step lsto { SET lock_timeout = '10ms'; SET statement_timeout = '10s'; }
step slto { SET lock_timeout = '10s'; SET statement_timeout = '10ms'; }
step locktbl { LOCK TABLE accounts; }
step update { DELETE FROM accounts WHERE accountid = 'checking'; }
teardown { ABORT; }
# It's possible that the isolation tester will not observe the final
# steps as "waiting", thanks to the relatively short timeouts we use.
# We can ensure consistent test output by marking those steps with (*).
# statement timeout, table-level lock
permutation rdtbl sto locktbl(*)
# lock timeout, table-level lock
permutation rdtbl lto locktbl(*)
# lock timeout expires first, table-level lock
permutation rdtbl lsto locktbl(*)
# statement timeout expires first, table-level lock
# With introducing the GUC for Global Deadlock Detector, if the GUC
# is disabled, the UPDATE/DELETE execute serially, So we can not
# trigger the row lock in QE.
permutation rdtbl slto locktbl(*)
# statement timeout, row-level lock
permutation wrtbl sto update(*)
# lock timeout, row-level lock
permutation wrtbl lto update(*)
# lock timeout expires first, row-level lock
permutation wrtbl lsto update(*)
# statement timeout expires first, row-level lock
# GPDB_93_MERGE_FIXME: The expected output of this test looks slightly
# different from upstream. There are no "<waiting>" lines. I believe that's
# because the pg_locks query that isolationtester uses to detect waiting
# doesn't work correctly in GPDB. It uses pg_backend_id() to get the QE
# process PID, but if the lock is held by a QE process, it won't match.
permutation wrtbl slto update(*)