mirror of
https://github.com/postgres/postgres.git
synced 2025-12-12 02:37:31 +03:00
Fix tablespace handling in MERGE/SPLIT partition commands.
As commit ca4103025d stated, new partitions without a specified tablespace
should inherit the parent relation's tablespace. However, previously,
ALTER TABLE MERGE PARTITIONS and ALTER TABLE SPLIT PARTITION commands
always created new partitions in the default tablespace, ignoring
the parent's tablespace. This commit ensures new partitions inherit
the parent's tablespace.
Backpatch to v17 where these commands were introduced.
Author: Fujii Masao
Reviewed-by: Masahiko Sawada
Discussion: https://postgr.es/m/abaf390b-3320-40a5-8815-ef476db5cfe7@oss.nttdata.com
This commit is contained in:
@@ -20340,7 +20340,7 @@ createPartitionTable(RangeVar *newPartName, Relation modelRel,
|
||||
createStmt->constraints = NIL;
|
||||
createStmt->options = NIL;
|
||||
createStmt->oncommit = ONCOMMIT_NOOP;
|
||||
createStmt->tablespacename = NULL;
|
||||
createStmt->tablespacename = get_tablespace_name(modelRel->rd_rel->reltablespace);
|
||||
createStmt->if_not_exists = false;
|
||||
createStmt->accessMethod = get_am_name(modelRel->rd_rel->relam);
|
||||
|
||||
|
||||
@@ -861,6 +861,29 @@ 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;
|
||||
-- Check the new partition inherits parent's tablespace
|
||||
CREATE TABLE t (i int PRIMARY KEY USING INDEX TABLESPACE regress_tblspace)
|
||||
PARTITION BY RANGE (i) TABLESPACE regress_tblspace;
|
||||
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);
|
||||
ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2;
|
||||
SELECT tablename, tablespace FROM pg_tables
|
||||
WHERE tablename IN ('t', 'tp_0_2') ORDER BY tablename, tablespace;
|
||||
tablename | tablespace
|
||||
-----------+------------------
|
||||
t | regress_tblspace
|
||||
tp_0_2 | regress_tblspace
|
||||
(2 rows)
|
||||
|
||||
SELECT tablename, indexname, tablespace FROM pg_indexes
|
||||
WHERE tablename IN ('t', 'tp_0_2') ORDER BY tablename, indexname, tablespace;
|
||||
tablename | indexname | tablespace
|
||||
-----------+-------------+------------------
|
||||
t | t_pkey | regress_tblspace
|
||||
tp_0_2 | tp_0_2_pkey | regress_tblspace
|
||||
(2 rows)
|
||||
|
||||
DROP TABLE t;
|
||||
-- Check the new partition inherits parent's table access method
|
||||
SET search_path = partitions_merge_schema, public;
|
||||
CREATE ACCESS METHOD partitions_merge_heap TYPE TABLE HANDLER heap_tableam_handler;
|
||||
|
||||
@@ -1493,6 +1493,32 @@ SELECT c.oid::pg_catalog.regclass, pg_catalog.pg_get_expr(c.relpartbound, c.oid)
|
||||
tp_1_2 | FOR VALUES FROM (1) TO (2) | t
|
||||
(2 rows)
|
||||
|
||||
DROP TABLE t;
|
||||
-- Check the new partitions inherit parent's tablespace
|
||||
CREATE TABLE t (i int PRIMARY KEY USING INDEX TABLESPACE regress_tblspace)
|
||||
PARTITION BY RANGE (i) TABLESPACE regress_tblspace;
|
||||
CREATE TABLE tp_0_2 PARTITION OF t FOR VALUES FROM (0) TO (2);
|
||||
ALTER TABLE t SPLIT PARTITION tp_0_2 INTO
|
||||
(PARTITION tp_0_1 FOR VALUES FROM (0) TO (1),
|
||||
PARTITION tp_1_2 FOR VALUES FROM (1) TO (2));
|
||||
SELECT tablename, tablespace FROM pg_tables
|
||||
WHERE tablename IN ('t', 'tp_0_1', 'tp_1_2') ORDER BY tablename, tablespace;
|
||||
tablename | tablespace
|
||||
-----------+------------------
|
||||
t | regress_tblspace
|
||||
tp_0_1 | regress_tblspace
|
||||
tp_1_2 | regress_tblspace
|
||||
(3 rows)
|
||||
|
||||
SELECT tablename, indexname, tablespace FROM pg_indexes
|
||||
WHERE tablename IN ('t', 'tp_0_1', 'tp_1_2') ORDER BY tablename, indexname, tablespace;
|
||||
tablename | indexname | tablespace
|
||||
-----------+-------------+------------------
|
||||
t | t_pkey | regress_tblspace
|
||||
tp_0_1 | tp_0_1_pkey | regress_tblspace
|
||||
tp_1_2 | tp_1_2_pkey | regress_tblspace
|
||||
(3 rows)
|
||||
|
||||
DROP TABLE t;
|
||||
-- Check new partitions inherits parent's table access method
|
||||
CREATE ACCESS METHOD partition_split_heap TYPE TABLE HANDLER heap_tableam_handler;
|
||||
|
||||
@@ -536,6 +536,18 @@ SET search_path = partitions_merge_schema, pg_temp, public;
|
||||
ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2;
|
||||
ROLLBACK;
|
||||
|
||||
-- Check the new partition inherits parent's tablespace
|
||||
CREATE TABLE t (i int PRIMARY KEY USING INDEX TABLESPACE regress_tblspace)
|
||||
PARTITION BY RANGE (i) TABLESPACE regress_tblspace;
|
||||
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);
|
||||
ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2;
|
||||
SELECT tablename, tablespace FROM pg_tables
|
||||
WHERE tablename IN ('t', 'tp_0_2') ORDER BY tablename, tablespace;
|
||||
SELECT tablename, indexname, tablespace FROM pg_indexes
|
||||
WHERE tablename IN ('t', 'tp_0_2') ORDER BY tablename, indexname, tablespace;
|
||||
DROP TABLE t;
|
||||
|
||||
-- Check the new partition inherits parent's table access method
|
||||
SET search_path = partitions_merge_schema, public;
|
||||
CREATE ACCESS METHOD partitions_merge_heap TYPE TABLE HANDLER heap_tableam_handler;
|
||||
|
||||
@@ -880,6 +880,19 @@ SELECT c.oid::pg_catalog.regclass, pg_catalog.pg_get_expr(c.relpartbound, c.oid)
|
||||
|
||||
DROP TABLE t;
|
||||
|
||||
-- Check the new partitions inherit parent's tablespace
|
||||
CREATE TABLE t (i int PRIMARY KEY USING INDEX TABLESPACE regress_tblspace)
|
||||
PARTITION BY RANGE (i) TABLESPACE regress_tblspace;
|
||||
CREATE TABLE tp_0_2 PARTITION OF t FOR VALUES FROM (0) TO (2);
|
||||
ALTER TABLE t SPLIT PARTITION tp_0_2 INTO
|
||||
(PARTITION tp_0_1 FOR VALUES FROM (0) TO (1),
|
||||
PARTITION tp_1_2 FOR VALUES FROM (1) TO (2));
|
||||
SELECT tablename, tablespace FROM pg_tables
|
||||
WHERE tablename IN ('t', 'tp_0_1', 'tp_1_2') ORDER BY tablename, tablespace;
|
||||
SELECT tablename, indexname, tablespace FROM pg_indexes
|
||||
WHERE tablename IN ('t', 'tp_0_1', 'tp_1_2') ORDER BY tablename, indexname, tablespace;
|
||||
DROP TABLE t;
|
||||
|
||||
-- Check new partitions inherits parent's table access method
|
||||
CREATE ACCESS METHOD partition_split_heap TYPE TABLE HANDLER heap_tableam_handler;
|
||||
CREATE TABLE t (i int) PARTITION BY RANGE (i) USING partition_split_heap;
|
||||
|
||||
Reference in New Issue
Block a user