87 lines
3.0 KiB
Python
87 lines
3.0 KiB
Python
# Test that an error if thrown if the target row has been moved to a
|
|
# different partition by a concurrent session.
|
|
|
|
setup
|
|
{
|
|
--
|
|
-- Setup to test an error from ExecUpdate and ExecDelete.
|
|
--
|
|
CREATE TABLE foo (a int, b text) PARTITION BY LIST(a);
|
|
CREATE TABLE foo1 PARTITION OF foo FOR VALUES IN (1);
|
|
CREATE TABLE foo2 PARTITION OF foo FOR VALUES IN (2);
|
|
INSERT INTO foo VALUES (1, 'ABC');
|
|
|
|
--
|
|
-- Setup to test an error from GetTupleForTrigger
|
|
--
|
|
CREATE TABLE footrg (a int, b text) PARTITION BY LIST(a);
|
|
CREATE TABLE footrg1 PARTITION OF footrg FOR VALUES IN (1);
|
|
CREATE TABLE footrg2 PARTITION OF footrg FOR VALUES IN (2);
|
|
INSERT INTO footrg VALUES (1, 'ABC');
|
|
CREATE FUNCTION func_footrg_mod_a() RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.a = 2; -- This is changing partition key column.
|
|
RETURN NEW;
|
|
END $$ LANGUAGE PLPGSQL;
|
|
CREATE TRIGGER footrg_mod_a BEFORE UPDATE ON footrg1
|
|
FOR EACH ROW EXECUTE PROCEDURE func_footrg_mod_a();
|
|
|
|
--
|
|
-- Setup to test an error from ExecLockRows
|
|
--
|
|
CREATE TABLE foo_range_parted (a int, b text) PARTITION BY RANGE(a);
|
|
CREATE TABLE foo_range_parted1 PARTITION OF foo_range_parted FOR VALUES FROM (1) TO (10);
|
|
CREATE TABLE foo_range_parted2 PARTITION OF foo_range_parted FOR VALUES FROM (10) TO (20);
|
|
INSERT INTO foo_range_parted VALUES(7, 'ABC');
|
|
CREATE UNIQUE INDEX foo_range_parted1_a_unique ON foo_range_parted1 (a);
|
|
CREATE TABLE bar (a int REFERENCES foo_range_parted1(a));
|
|
}
|
|
|
|
teardown
|
|
{
|
|
DROP TABLE foo;
|
|
DROP TRIGGER footrg_mod_a ON footrg1;
|
|
DROP FUNCTION func_footrg_mod_a();
|
|
DROP TABLE footrg;
|
|
DROP TABLE bar, foo_range_parted;
|
|
}
|
|
|
|
session s1
|
|
step s1b { BEGIN ISOLATION LEVEL READ COMMITTED; }
|
|
step s1u { UPDATE foo SET a=2 WHERE a=1; }
|
|
step s1u2 { UPDATE footrg SET b='EFG' WHERE a=1; }
|
|
step s1u3pc { UPDATE foo_range_parted SET a=11 WHERE a=7; }
|
|
step s1u3npc { UPDATE foo_range_parted SET b='XYZ' WHERE a=7; }
|
|
step s1c { COMMIT; }
|
|
step s1r { ROLLBACK; }
|
|
|
|
session s2
|
|
step s2b { BEGIN ISOLATION LEVEL READ COMMITTED; }
|
|
step s2u { UPDATE foo SET b='EFG' WHERE a=1; }
|
|
step s2u2 { UPDATE footrg SET b='XYZ' WHERE a=1; }
|
|
step s2i { INSERT INTO bar VALUES(7); }
|
|
step s2d { DELETE FROM foo WHERE a=1; }
|
|
step s2c { COMMIT; }
|
|
|
|
# Concurrency error from ExecUpdate and ExecDelete.
|
|
permutation s1b s2b s1u s1c s2d s2c
|
|
permutation s1b s2b s1u s2d s1c s2c
|
|
permutation s1b s2b s1u s2u s1c s2c
|
|
permutation s1b s2b s2d s1u s2c s1c
|
|
|
|
# Concurrency error from GetTupleForTrigger
|
|
permutation s1b s2b s1u2 s1c s2u2 s2c
|
|
permutation s1b s2b s1u2 s2u2 s1c s2c
|
|
permutation s1b s2b s2u2 s1u2 s2c s1c
|
|
|
|
# Concurrency error from ExecLockRows
|
|
# test waiting for moved row itself
|
|
permutation s1b s2b s1u3pc s2i s1c s2c
|
|
permutation s1b s2b s1u3pc s2i s1r s2c
|
|
# test waiting for in-partition update, followed by cross-partition move
|
|
permutation s1b s2b s1u3npc s1u3pc s2i s1c s2c
|
|
permutation s1b s2b s1u3npc s1u3pc s2i s1r s2c
|
|
# test waiting for in-partition update, followed by cross-partition move
|
|
permutation s1b s2b s1u3npc s1u3pc s1u3pc s2i s1c s2c
|
|
permutation s1b s2b s1u3npc s1u3pc s1u3pc s2i s1r s2c
|