# Test that detach partition concurrently makes the partition invisible at the # correct time. setup { DROP TABLE IF EXISTS d_listp, d_listp1, d_listp2; CREATE TABLE d_listp (a int) PARTITION BY LIST(a); CREATE TABLE d_listp1 PARTITION OF d_listp FOR VALUES IN (1); CREATE TABLE d_listp2 PARTITION OF d_listp FOR VALUES IN (2); INSERT INTO d_listp VALUES (1),(2); } teardown { DROP TABLE IF EXISTS d_listp, d_listp2, d_listp_foobar; } session s1 step s1b { BEGIN; } step s1brr { BEGIN ISOLATION LEVEL REPEATABLE READ; } step s1s { SELECT * FROM d_listp; } step s1ins { INSERT INTO d_listp VALUES (1); } step s1ins2 { INSERT INTO d_listp VALUES (2); } step s1prep { PREPARE f(int) AS INSERT INTO d_listp VALUES ($1); } step s1prep1 { PREPARE f(int) AS INSERT INTO d_listp VALUES (1); } step s1prep2 { PREPARE f(int) AS INSERT INTO d_listp VALUES (2); } step s1exec1 { EXECUTE f(1); } step s1exec2 { EXECUTE f(2); } step s1dealloc { DEALLOCATE f; } step s1c { COMMIT; } session s2 step s2detach { ALTER TABLE d_listp DETACH PARTITION d_listp2 CONCURRENTLY; } step s2drop { DROP TABLE d_listp2; } session s3 step s3s { SELECT * FROM d_listp; } step s3i { SELECT relpartbound IS NULL FROM pg_class where relname = 'd_listp2'; } step s3ins2 { INSERT INTO d_listp VALUES (2); } # The transaction that detaches hangs until it sees any older transaction # terminate, as does anybody else. permutation s1b s1s s2detach s1s s1c s1s # relpartbound remains set until s1 commits # XXX this could be timing dependent :-( permutation s1b s1s s2detach s1s s3s s3i s1c s3i s2drop s1s # In read-committed mode, the partition disappears from view of concurrent # transactions immediately. But if a write lock is held, then the detach # has to wait. permutation s1b s1s s2detach s1ins s1s s1c permutation s1b s1s s1ins2 s2detach s1ins s1s s1c # In repeatable-read mode, the partition remains visible until commit even # if the to-be-detached partition is not locked for write. permutation s1brr s1s s2detach s1ins s1s s1c permutation s1brr s1s s2detach s1s s1c # Another process trying to acquire a write lock will be blocked behind the # detacher permutation s1b s1ins2 s2detach s3ins2 s1c # a prepared query is not blocked permutation s1brr s1prep s1s s2detach s1s s1exec1 s3s s1dealloc s1c permutation s1brr s1prep s1exec2 s2detach s1s s1exec2 s3s s1c s1dealloc permutation s1brr s1prep s1s s2detach s1s s1exec2 s1c s1dealloc permutation s1brr s1prep s2detach s1s s1exec2 s1c s1dealloc permutation s1brr s1prep1 s2detach s1s s1exec2 s1c s1dealloc permutation s1brr s1prep2 s2detach s1s s1exec2 s1c s1dealloc