From a1c779ff030b9b2ffaeb15806cafe0c7fed34f43 Mon Sep 17 00:00:00 2001 From: jian he Date: Thu, 21 Aug 2025 14:28:33 +0800 Subject: [PATCH v52 1/1] refactor relpersistence related issue --- src/backend/commands/tablecmds.c | 1 - src/test/regress/expected/partition_merge.out | 60 +++++++++++-------- src/test/regress/sql/partition_merge.sql | 51 ++++++++-------- 3 files changed, 62 insertions(+), 50 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index cc24a92c504..0d520745670 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -22793,7 +22793,6 @@ ATExecMergePartitions(List **wqueue, AlteredTableInfo *tab, Relation rel, * stmt->relation as RELPERSISTENCE_TEMP if a temporary namespace is * selected. */ - cmd->name->relpersistence = rel->rd_rel->relpersistence; RangeVarGetAndCheckCreationNamespace(cmd->name, NoLock, &existingRelid); /* diff --git a/src/test/regress/expected/partition_merge.out b/src/test/regress/expected/partition_merge.out index 5159fd37d82..00ed2516c68 100644 --- a/src/test/regress/expected/partition_merge.out +++ b/src/test/regress/expected/partition_merge.out @@ -656,28 +656,6 @@ DROP TABLE t3; DROP TABLE t2; DROP TABLE t1; -- --- Try to MERGE partitions of temporary table. --- -CREATE TEMP TABLE t (i int) PARTITION BY RANGE (i); -CREATE TEMP TABLE tp_0_1 PARTITION OF t FOR VALUES FROM (0) TO (1); -CREATE TEMP TABLE tp_1_2 PARTITION OF t FOR VALUES FROM (1) TO (2); -EXECUTE get_partition_info('{t}'); - oid | relpersistence | relkind | inhdetachpending | pg_get_expr ---------+----------------+---------+------------------+---------------------------- - tp_0_1 | t | r | f | FOR VALUES FROM (0) TO (1) - tp_1_2 | t | r | f | FOR VALUES FROM (1) TO (2) -(2 rows) - -ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2; --- Partition should be temporary. -EXECUTE get_partition_info('{t}'); - oid | relpersistence | relkind | inhdetachpending | pg_get_expr ---------+----------------+---------+------------------+---------------------------- - tp_0_2 | t | r | f | FOR VALUES FROM (0) TO (2) -(1 row) - -DROP TABLE t; --- -- Check the partition index name if the partition name is the same as one -- of the merged partitions. -- @@ -703,8 +681,37 @@ Not-null constraints: DROP TABLE t; -- +-- Try to MERGE partitions of temporary table. +-- +BEGIN; +SHOW search_path; + search_path +--------------------------------- + partitions_merge_schema, public +(1 row) + +CREATE TEMP TABLE t (i int) PARTITION BY RANGE (i) ON COMMIT DROP; +CREATE TEMP TABLE tp_0_1 PARTITION OF t FOR VALUES FROM (0) TO (1); +CREATE TEMP TABLE tp_1_2 PARTITION OF t FOR VALUES FROM (1) TO (2); +CREATE TEMP TABLE tp_2_3 PARTITION OF t FOR VALUES FROM (2) TO (3); +CREATE TEMP TABLE tp_3_4 PARTITION OF t FOR VALUES FROM (3) TO (4); +ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO pg_temp.tp_0_2; +ALTER TABLE t MERGE PARTITIONS (tp_0_2, tp_2_3) INTO pg_temp.tp_0_3; +-- Partition should be temporary. +EXECUTE get_partition_info('{t}'); + oid | relpersistence | relkind | inhdetachpending | pg_get_expr +--------+----------------+---------+------------------+---------------------------- + tp_0_3 | t | r | f | FOR VALUES FROM (0) TO (3) + tp_3_4 | t | r | f | FOR VALUES FROM (3) TO (4) +(2 rows) + +ALTER TABLE t MERGE PARTITIONS (tp_0_3, tp_3_4) INTO tp_0_4; --error +ERROR: cannot create a permanent relation as partition of temporary relation "t" +ROLLBACK; +-- -- Try mixing permanent and temporary partitions. -- +BEGIN; SET search_path = partitions_merge_schema, pg_temp, public; CREATE TABLE t (i int) PARTITION BY RANGE (i); CREATE TABLE tp_0_1 PARTITION OF t FOR VALUES FROM (0) TO (1); @@ -722,17 +729,19 @@ EXECUTE get_partition_info('{t}'); tp_1_2 | p | r | f | FOR VALUES FROM (1) TO (2) (2 rows) +SAVEPOINT s; SET search_path = pg_temp, partitions_merge_schema, public; -- Can't merge persistent partitions into a temporary partition ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2; ERROR: cannot create a temporary relation as partition of permanent relation "t" +ROLLBACK TO SAVEPOINT s; SET search_path = partitions_merge_schema, public; -- Can't merge persistent partitions into a temporary partition ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO pg_temp.tp_0_2; ERROR: cannot create a temporary relation as partition of permanent relation "t" -DROP TABLE t; -SET search_path = pg_temp, partitions_merge_schema, public; +ROLLBACK; BEGIN; +SET search_path = pg_temp, partitions_merge_schema, public; CREATE TABLE t (i int) PARTITION BY RANGE (i); CREATE TABLE tp_0_1 PARTITION OF t FOR VALUES FROM (0) TO (1); CREATE TABLE tp_1_2 PARTITION OF t FOR VALUES FROM (1) TO (2); @@ -749,11 +758,12 @@ EXECUTE get_partition_info('{t}'); tp_1_2 | t | r | f | FOR VALUES FROM (1) TO (2) (2 rows) -DEALLOCATE get_partition_info; SET search_path = partitions_merge_schema, pg_temp, public; -- Can't merge temporary partitions into a persistent partition ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2; +ERROR: cannot create a permanent relation as partition of temporary relation "t" ROLLBACK; +DEALLOCATE get_partition_info; -- Check the new partition inherits parent's tablespace SET search_path = partitions_merge_schema, public; CREATE TABLE t (i int PRIMARY KEY USING INDEX TABLESPACE regress_tblspace) diff --git a/src/test/regress/sql/partition_merge.sql b/src/test/regress/sql/partition_merge.sql index bb5386fe381..0812d33186c 100644 --- a/src/test/regress/sql/partition_merge.sql +++ b/src/test/regress/sql/partition_merge.sql @@ -449,21 +449,6 @@ DROP TABLE t3; DROP TABLE t2; DROP TABLE t1; --- --- Try to MERGE partitions of temporary table. --- -CREATE TEMP TABLE t (i int) PARTITION BY RANGE (i); -CREATE TEMP TABLE tp_0_1 PARTITION OF t FOR VALUES FROM (0) TO (1); -CREATE TEMP TABLE tp_1_2 PARTITION OF t FOR VALUES FROM (1) TO (2); - -EXECUTE get_partition_info('{t}'); - -ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2; - --- Partition should be temporary. -EXECUTE get_partition_info('{t}'); - -DROP TABLE t; -- -- Check the partition index name if the partition name is the same as one @@ -483,48 +468,66 @@ ALTER TABLE t MERGE PARTITIONS (tp_1_2, tp_0_1) INTO tp_1_2; DROP TABLE t; +-- +-- Try to MERGE partitions of temporary table. +-- +BEGIN; +SHOW search_path; +CREATE TEMP TABLE t (i int) PARTITION BY RANGE (i) ON COMMIT DROP; +CREATE TEMP TABLE tp_0_1 PARTITION OF t FOR VALUES FROM (0) TO (1); +CREATE TEMP TABLE tp_1_2 PARTITION OF t FOR VALUES FROM (1) TO (2); +CREATE TEMP TABLE tp_2_3 PARTITION OF t FOR VALUES FROM (2) TO (3); +CREATE TEMP TABLE tp_3_4 PARTITION OF t FOR VALUES FROM (3) TO (4); + +ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO pg_temp.tp_0_2; +ALTER TABLE t MERGE PARTITIONS (tp_0_2, tp_2_3) INTO pg_temp.tp_0_3; + +-- Partition should be temporary. +EXECUTE get_partition_info('{t}'); + +ALTER TABLE t MERGE PARTITIONS (tp_0_3, tp_3_4) INTO tp_0_4; --error +ROLLBACK; + -- -- Try mixing permanent and temporary partitions. -- +BEGIN; SET search_path = partitions_merge_schema, pg_temp, public; CREATE TABLE t (i int) PARTITION BY RANGE (i); CREATE TABLE tp_0_1 PARTITION OF t FOR VALUES FROM (0) TO (1); CREATE TABLE tp_1_2 PARTITION OF t FOR VALUES FROM (1) TO (2); SELECT c.oid::pg_catalog.regclass, c.relpersistence FROM pg_catalog.pg_class c WHERE c.oid = 't'::regclass; - EXECUTE get_partition_info('{t}'); +SAVEPOINT s; SET search_path = pg_temp, partitions_merge_schema, public; - -- Can't merge persistent partitions into a temporary partition ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2; +ROLLBACK TO SAVEPOINT s; SET search_path = partitions_merge_schema, public; - -- Can't merge persistent partitions into a temporary partition ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO pg_temp.tp_0_2; -DROP TABLE t; - -SET search_path = pg_temp, partitions_merge_schema, public; +ROLLBACK; BEGIN; +SET search_path = pg_temp, partitions_merge_schema, public; CREATE TABLE t (i int) PARTITION BY RANGE (i); CREATE TABLE tp_0_1 PARTITION OF t FOR VALUES FROM (0) TO (1); CREATE TABLE tp_1_2 PARTITION OF t FOR VALUES FROM (1) TO (2); SELECT c.oid::pg_catalog.regclass, c.relpersistence FROM pg_catalog.pg_class c WHERE c.oid = 't'::regclass; - EXECUTE get_partition_info('{t}'); -DEALLOCATE get_partition_info; - SET search_path = partitions_merge_schema, pg_temp, public; -- Can't merge temporary partitions into a persistent partition ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2; ROLLBACK; +DEALLOCATE get_partition_info; + -- Check the new partition inherits parent's tablespace SET search_path = partitions_merge_schema, public; CREATE TABLE t (i int PRIMARY KEY USING INDEX TABLESPACE regress_tblspace) -- 2.34.1