From 2ddd36806799cf262742debc4c58344ac2bf71b4 Mon Sep 17 00:00:00 2001 From: shihao zhong Date: Tue, 3 Nov 2026 21:22:14 -0500 Subject: [PATCH 2/2] Test partitioned index validity while a partition is pending detach Backpatch-through: 14 --- .../detach-partition-concurrently-3.out | 48 +++++++++++++++++++ .../detach-partition-concurrently-3.spec | 16 ++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/test/isolation/expected/detach-partition-concurrently-3.out b/src/test/isolation/expected/detach-partition-concurrently-3.out index c1705d80aa1..8f0a3c94a90 100644 --- a/src/test/isolation/expected/detach-partition-concurrently-3.out +++ b/src/test/isolation/expected/detach-partition-concurrently-3.out @@ -529,3 +529,51 @@ step s2detachfinal: ALTER TABLE d3_listp DETACH PARTITION d3_listp1 FINALIZE; step s1insertpart: INSERT INTO d3_listp1 VALUES (1); step s2commit: COMMIT; step s1insertpart: <... completed> + +starting permutation: s2snitch s1idx s1b s1s s2detach s1cancel s1c s1attach2 s1valid s1attach3 s1valid s2detachfinal s1valid +step s2snitch: INSERT INTO d3_pid SELECT pg_backend_pid(); +step s1idx: CREATE TABLE d3_listp3 PARTITION OF d3_listp FOR VALUES IN (3); + CREATE UNIQUE INDEX d3_idx ON ONLY d3_listp (a); + CREATE UNIQUE INDEX d3_listp1_a ON d3_listp1 (a); + CREATE UNIQUE INDEX d3_listp2_a ON d3_listp2 (a); + ALTER INDEX d3_idx ATTACH PARTITION d3_listp1_a; +step s1b: BEGIN; +step s1s: SELECT * FROM d3_listp; +a +- +1 +(1 row) + +step s2detach: ALTER TABLE d3_listp DETACH PARTITION d3_listp1 CONCURRENTLY; +step s1cancel: SELECT pg_cancel_backend(pid) FROM d3_pid; +step s2detach: <... completed> +ERROR: canceling statement due to user request +step s1cancel: <... completed> +pg_cancel_backend +----------------- +t +(1 row) + +step s1c: COMMIT; +step s1attach2: ALTER INDEX d3_idx ATTACH PARTITION d3_listp2_a; +step s1valid: SELECT indisvalid FROM pg_index WHERE indexrelid = 'd3_idx'::regclass; +indisvalid +---------- +f +(1 row) + +step s1attach3: CREATE UNIQUE INDEX d3_listp3_a ON d3_listp3 (a); + ALTER INDEX d3_idx ATTACH PARTITION d3_listp3_a; +step s1valid: SELECT indisvalid FROM pg_index WHERE indexrelid = 'd3_idx'::regclass; +indisvalid +---------- +t +(1 row) + +step s2detachfinal: ALTER TABLE d3_listp DETACH PARTITION d3_listp1 FINALIZE; +step s1valid: SELECT indisvalid FROM pg_index WHERE indexrelid = 'd3_idx'::regclass; +indisvalid +---------- +t +(1 row) + diff --git a/src/test/isolation/specs/detach-partition-concurrently-3.spec b/src/test/isolation/specs/detach-partition-concurrently-3.spec index 6d359756e31..0a8563f417f 100644 --- a/src/test/isolation/specs/detach-partition-concurrently-3.spec +++ b/src/test/isolation/specs/detach-partition-concurrently-3.spec @@ -17,7 +17,7 @@ setup } teardown { - DROP TABLE IF EXISTS d3_listp, d3_listp1, d3_listp2, d3_pid; + DROP TABLE IF EXISTS d3_listp, d3_listp1, d3_listp2, d3_listp3, d3_pid; } session s1 @@ -41,6 +41,15 @@ step s1list { SELECT relname FROM pg_catalog.pg_class WHERE relname LIKE 'd3_listp%' ORDER BY 1; } step s1describe { SELECT 'd3_listp' AS root, * FROM pg_partition_tree('d3_listp') UNION ALL SELECT 'd3_listp1', * FROM pg_partition_tree('d3_listp1'); } +step s1idx { CREATE TABLE d3_listp3 PARTITION OF d3_listp FOR VALUES IN (3); + CREATE UNIQUE INDEX d3_idx ON ONLY d3_listp (a); + CREATE UNIQUE INDEX d3_listp1_a ON d3_listp1 (a); + CREATE UNIQUE INDEX d3_listp2_a ON d3_listp2 (a); + ALTER INDEX d3_idx ATTACH PARTITION d3_listp1_a; } +step s1attach2 { ALTER INDEX d3_idx ATTACH PARTITION d3_listp2_a; } +step s1attach3 { CREATE UNIQUE INDEX d3_listp3_a ON d3_listp3 (a); + ALTER INDEX d3_idx ATTACH PARTITION d3_listp3_a; } +step s1valid { SELECT indisvalid FROM pg_index WHERE indexrelid = 'd3_idx'::regclass; } session s2 step s2begin { BEGIN; } @@ -94,3 +103,8 @@ permutation s2snitch s1b s1s s2detach s1cancel(s2detach) s1c s1b s1spart s2detac permutation s2snitch s1b s1s s2detach s1cancel(s2detach) s1c s2begin s2detachfinal s2commit permutation s2snitch s1b s1s s2detach s1cancel(s2detach) s1c s2begin s2detachfinal s1spart s2commit permutation s2snitch s1b s1s s2detach s1cancel(s2detach) s1c s2begin s2detachfinal s1insertpart s2commit + +# A partitioned index must not become valid while a partition has no index. +# The index of the partition pending detach is still attached, and must not +# make up for the missing one. +permutation s2snitch s1idx s1b s1s s2detach s1cancel(s2detach) s1c s1attach2 s1valid s1attach3 s1valid s2detachfinal s1valid -- 2.37.1 (Apple Git-137.1)