# 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"