38 lines
1.1 KiB
Python
38 lines
1.1 KiB
Python
# Test predicate locks on HOT updated tuples.
|
|
#
|
|
# This test has two serializable transactions. Both select two rows
|
|
# from the table, and then update one of them.
|
|
# If these were serialized (run one at a time), the transaction that
|
|
# runs later would see one of the rows to be updated.
|
|
#
|
|
# Any overlap between the transactions must cause a serialization failure.
|
|
# We used to have a bug in predicate locking HOT updated tuples, which
|
|
# caused the conflict to be missed, if the row was HOT updated.
|
|
|
|
setup
|
|
{
|
|
CREATE TABLE test (i int PRIMARY KEY, t text);
|
|
INSERT INTO test VALUES (5, 'apple'), (7, 'pear'), (11, 'banana');
|
|
-- HOT-update 'pear' row.
|
|
UPDATE test SET t = 'pear_hot_updated' WHERE i = 7;
|
|
}
|
|
|
|
teardown
|
|
{
|
|
DROP TABLE test;
|
|
}
|
|
|
|
session s1
|
|
step b1 { BEGIN ISOLATION LEVEL SERIALIZABLE; }
|
|
step r1 { SELECT * FROM test WHERE i IN (5, 7) }
|
|
step w1 { UPDATE test SET t = 'pear_xact1' WHERE i = 7 }
|
|
step c1 { COMMIT; }
|
|
|
|
session s2
|
|
step b2 { BEGIN ISOLATION LEVEL SERIALIZABLE; }
|
|
step r2 { SELECT * FROM test WHERE i IN (5, 7) }
|
|
step w2 { UPDATE test SET t = 'apple_xact2' WHERE i = 5 }
|
|
step c2 { COMMIT; }
|
|
|
|
permutation b1 b2 r1 r2 w1 w2 c1 c2
|