| # Test that detach partition concurrently makes the partition safe |
| # for foreign keys that reference it. |
| |
| setup |
| { |
| DROP TABLE IF EXISTS d_lp_fk, d_lp_fk_1, d_lp_fk_2, d_lp_fk_r; |
| |
| CREATE TABLE d_lp_fk (a int PRIMARY KEY) PARTITION BY LIST(a); |
| CREATE TABLE d_lp_fk_1 PARTITION OF d_lp_fk FOR VALUES IN (1); |
| CREATE TABLE d_lp_fk_2 PARTITION OF d_lp_fk FOR VALUES IN (2); |
| INSERT INTO d_lp_fk VALUES (1), (2); |
| |
| CREATE TABLE d_lp_fk_r (a int references d_lp_fk); |
| } |
| |
| teardown { DROP TABLE IF EXISTS d_lp_fk, d_lp_fk_1, d_lp_fk_2, d_lp_fk_r; } |
| |
| session s1 |
| step s1b { BEGIN; } |
| step s1s { SELECT * FROM d_lp_fk; } |
| step s1c { COMMIT; } |
| |
| session s2 |
| step s2d { ALTER TABLE d_lp_fk DETACH PARTITION d_lp_fk_1 CONCURRENTLY; } |
| |
| session s3 |
| step s3b { BEGIN; } |
| step s3i1 { INSERT INTO d_lp_fk_r VALUES (1); } |
| step s3i2 { INSERT INTO d_lp_fk_r VALUES (2); } |
| step s3c { COMMIT; } |
| |
| # The transaction that detaches hangs until it sees any older transaction |
| # terminate. |
| permutation s1b s1s s2d s3i1 s1c |
| permutation s1b s1s s2d s3i2 s3i2 s1c |
| |
| permutation s1b s1s s3i1 s2d s1c |
| permutation s1b s1s s3i2 s2d s1c |
| |
| # what if s3 has an uncommitted insertion? |
| permutation s1b s1s s3b s2d s3i1 s1c s3c |