diff --git a/src/common/backend/utils/adt/ruleutils.cpp b/src/common/backend/utils/adt/ruleutils.cpp index 786dcc98e..5ec750219 100644 --- a/src/common/backend/utils/adt/ruleutils.cpp +++ b/src/common/backend/utils/adt/ruleutils.cpp @@ -2971,7 +2971,7 @@ Datum pg_get_indexdef_for_dump(PG_FUNCTION_ARGS) bool dumpSchemaOnly = PG_GETARG_BOOL(1); PG_RETURN_TEXT_P(string_to_text(pg_get_indexdef_worker(indexrelid, 0, NULL, false, true, 0, dumpSchemaOnly, - true, false))); + true, true))); } Datum pg_get_indexdef_ext(PG_FUNCTION_ARGS) @@ -3026,10 +3026,12 @@ static void AppendOnePartitionIndex(Oid indexRelId, Oid partOid, bool showTblSpc } if (isSub) { - appendStringInfo(buf, "\n "); + appendStringInfo(buf, "\n "); + appendStringInfo(buf, "SUBPARTITION %s", quote_identifier(partIdxTuple->relname.data)); + } else { + appendStringInfo(buf, "PARTITION %s", quote_identifier(partIdxTuple->relname.data)); } - appendStringInfo(buf, "PARTITION %s", quote_identifier(partIdxTuple->relname.data)); if (showTblSpc && OidIsValid(partIdxTuple->reltablespace)) { char *tblspacName = get_tablespace_name(partIdxTuple->reltablespace); if (tblspacName != NULL) @@ -3089,31 +3091,47 @@ static void pg_get_indexdef_partitions(Oid indexrelid, Form_pg_index idxrec, boo } List *partList = NIL; - ListCell *lc = NULL; + ListCell *lc1 = NULL; + ListCell *lc2 = NULL; bool isFirst = true; - if (isSub) { - /* reserve this code, oneday we will support it */ - partList = RelationGetSubPartitionOidList(rel); - } else { - partList = relationGetPartitionOidList(rel); - } - if (isSub) { - appendStringInfo(buf, "\n"); - } appendStringInfoChar(buf, '('); - foreach (lc, partList) { - Oid partOid = DatumGetObjectId(lfirst(lc)); - AppendOnePartitionIndex(indexrelid, partOid, showTblSpc, &isFirst, buf, isSub); - } if (isSub) { + int i = 0; + partList = RelationGetSubPartitionOidListList(rel); + int partListLen = list_length(partList); appendStringInfo(buf, "\n"); + foreach (lc1, partList) { + appendStringInfo(buf, " PARTITION partition_name("); + foreach (lc2, (List*)lfirst(lc1)) { + Oid partOid = DatumGetObjectId(lfirst(lc2)); + AppendOnePartitionIndex(indexrelid, partOid, showTblSpc, &isFirst, buf, isSub); + } + appendStringInfo(buf, "\n )"); + if (i != partListLen - 1) { + appendStringInfo(buf, ",\n"); + } + isFirst = true; + i++; + } + appendStringInfo(buf, "\n"); + } else { + partList = relationGetPartitionOidList(rel); + foreach (lc1, partList) { + Oid partOid = DatumGetObjectId(lfirst(lc1)); + AppendOnePartitionIndex(indexrelid, partOid, showTblSpc, &isFirst, buf, isSub); + } } + appendStringInfo(buf, ") "); heap_close(rel, NoLock); - releasePartitionOidList(&partList); + if (isSub) { + ReleaseSubPartitionOidList(&partList); + } else { + releasePartitionOidList(&partList); + } } /* diff --git a/src/test/regress/expected/function_get_table_def.out b/src/test/regress/expected/function_get_table_def.out index 4554553ee..7359f05a1 100644 --- a/src/test/regress/expected/function_get_table_def.out +++ b/src/test/regress/expected/function_get_table_def.out @@ -449,103 +449,129 @@ create unique index list_hash_2_idx1 on list_hash_2(col_2, col_3, col_4) local; create index list_hash_2_idx2 on list_hash_2(col_3, col_1) local; create index list_hash_2_idx3 on list_hash_2(col_4) global; select * from pg_get_tabledef('list_hash_2'); - pg_get_tabledef ---------------------------------------------------------------------------------------------- - SET search_path = test_get_table_def; + - CREATE TABLE list_hash_2 ( + - col_1 integer NOT NULL, + - col_2 integer, + - col_3 character varying(30), + - col_4 integer + - ) + - WITH (orientation=row, compression=no) + - PARTITION BY LIST (col_2) SUBPARTITION BY HASH (col_3) + - ( + - PARTITION p_list_1 VALUES (-1,-2,-3,-4,-5,-6,-7,-8,-9,-10) TABLESPACE pg_default + - ( + - SUBPARTITION p_hash_1_1 TABLESPACE pg_default, + - SUBPARTITION p_hash_1_2 TABLESPACE pg_default, + - SUBPARTITION p_hash_1_3 TABLESPACE pg_default + - ), + - PARTITION p_list_2 VALUES (1,2,3,4,5,6,7,8,9,10) TABLESPACE pg_default + - ( + - SUBPARTITION p_list_2_subpartdefault1 TABLESPACE pg_default + - ), + - PARTITION p_list_3 VALUES (11,12,13,14,15,16,17,18,19,20) TABLESPACE pg_default + - ( + - SUBPARTITION p_hash_3_1 TABLESPACE pg_default, + - SUBPARTITION p_hash_3_2 TABLESPACE pg_default + - ), + - PARTITION p_list_4 VALUES (21,22,23,24,25,26,27,28,29,30) TABLESPACE pg_default + - ( + - SUBPARTITION p_hash_4_1 TABLESPACE pg_default, + - SUBPARTITION p_hash_4_2 TABLESPACE pg_default, + - SUBPARTITION p_hash_4_3 TABLESPACE pg_default, + - SUBPARTITION p_hash_4_4 TABLESPACE pg_default, + - SUBPARTITION p_hash_4_5 TABLESPACE pg_default + - ), + - PARTITION p_list_5 VALUES (31,32,33,34,35,36,37,38,39,40) TABLESPACE pg_default + - ( + - SUBPARTITION p_list_5_subpartdefault1 TABLESPACE pg_default + - ), + - PARTITION p_list_6 VALUES (41,42,43,44,45,46,47,48,49,50) TABLESPACE pg_default + - ( + - SUBPARTITION p_hash_6_1 TABLESPACE pg_default, + - SUBPARTITION p_hash_6_2 TABLESPACE pg_default, + - SUBPARTITION p_hash_6_3 TABLESPACE pg_default, + - SUBPARTITION p_hash_6_4 TABLESPACE pg_default, + - SUBPARTITION p_hash_6_5 TABLESPACE pg_default + - ), + - PARTITION p_list_7 VALUES (DEFAULT) TABLESPACE pg_default + - ( + - SUBPARTITION p_list_7_subpartdefault1 TABLESPACE pg_default + - ) + - ) + - ENABLE ROW MOVEMENT; + - CREATE INDEX list_hash_2_idx3 ON list_hash_2 USING btree (col_4) TABLESPACE pg_default; + - CREATE INDEX list_hash_2_idx2 ON list_hash_2 USING btree (col_3, col_1) LOCAL + - ( + - PARTITION p_list_7_subpartdefault1_col_3_col_1_idx, + - PARTITION p_hash_6_5_col_3_col_1_idx, + - PARTITION p_hash_6_4_col_3_col_1_idx, + - PARTITION p_hash_6_3_col_3_col_1_idx, + - PARTITION p_hash_6_2_col_3_col_1_idx, + - PARTITION p_hash_6_1_col_3_col_1_idx, + - PARTITION p_list_5_subpartdefault1_col_3_col_1_idx, + - PARTITION p_hash_4_5_col_3_col_1_idx, + - PARTITION p_hash_4_4_col_3_col_1_idx, + - PARTITION p_hash_4_3_col_3_col_1_idx, + - PARTITION p_hash_4_2_col_3_col_1_idx, + - PARTITION p_hash_4_1_col_3_col_1_idx, + - PARTITION p_hash_3_2_col_3_col_1_idx, + - PARTITION p_hash_3_1_col_3_col_1_idx, + - PARTITION p_list_2_subpartdefault1_col_3_col_1_idx, + - PARTITION p_hash_1_3_col_3_col_1_idx, + - PARTITION p_hash_1_2_col_3_col_1_idx, + - PARTITION p_hash_1_1_col_3_col_1_idx + - ) TABLESPACE pg_default; + - CREATE UNIQUE INDEX list_hash_2_idx1 ON list_hash_2 USING btree (col_2, col_3, col_4) LOCAL+ - ( + - PARTITION p_list_7_subpartdefault1_col_2_col_3_col_4_idx, + - PARTITION p_hash_6_5_col_2_col_3_col_4_idx, + - PARTITION p_hash_6_4_col_2_col_3_col_4_idx, + - PARTITION p_hash_6_3_col_2_col_3_col_4_idx, + - PARTITION p_hash_6_2_col_2_col_3_col_4_idx, + - PARTITION p_hash_6_1_col_2_col_3_col_4_idx, + - PARTITION p_list_5_subpartdefault1_col_2_col_3_col_4_idx, + - PARTITION p_hash_4_5_col_2_col_3_col_4_idx, + - PARTITION p_hash_4_4_col_2_col_3_col_4_idx, + - PARTITION p_hash_4_3_col_2_col_3_col_4_idx, + - PARTITION p_hash_4_2_col_2_col_3_col_4_idx, + - PARTITION p_hash_4_1_col_2_col_3_col_4_idx, + - PARTITION p_hash_3_2_col_2_col_3_col_4_idx, + - PARTITION p_hash_3_1_col_2_col_3_col_4_idx, + - PARTITION p_list_2_subpartdefault1_col_2_col_3_col_4_idx, + - PARTITION p_hash_1_3_col_2_col_3_col_4_idx, + - PARTITION p_hash_1_2_col_2_col_3_col_4_idx, + - PARTITION p_hash_1_1_col_2_col_3_col_4_idx + - ) TABLESPACE pg_default; + - ALTER TABLE list_hash_2 ADD CONSTRAINT list_hash_2_col_3_tableoid_key UNIQUE (col_3); + + pg_get_tabledef +---------------------------------------------------------------------------------------------- + SET search_path = test_get_table_def; + + CREATE TABLE list_hash_2 ( + + col_1 integer NOT NULL, + + col_2 integer, + + col_3 character varying(30), + + col_4 integer + + ) + + WITH (orientation=row, compression=no) + + PARTITION BY LIST (col_2) SUBPARTITION BY HASH (col_3) + + ( + + PARTITION p_list_1 VALUES (-1,-2,-3,-4,-5,-6,-7,-8,-9,-10) TABLESPACE pg_default + + ( + + SUBPARTITION p_hash_1_1 TABLESPACE pg_default, + + SUBPARTITION p_hash_1_2 TABLESPACE pg_default, + + SUBPARTITION p_hash_1_3 TABLESPACE pg_default + + ), + + PARTITION p_list_2 VALUES (1,2,3,4,5,6,7,8,9,10) TABLESPACE pg_default + + ( + + SUBPARTITION p_list_2_subpartdefault1 TABLESPACE pg_default + + ), + + PARTITION p_list_3 VALUES (11,12,13,14,15,16,17,18,19,20) TABLESPACE pg_default + + ( + + SUBPARTITION p_hash_3_1 TABLESPACE pg_default, + + SUBPARTITION p_hash_3_2 TABLESPACE pg_default + + ), + + PARTITION p_list_4 VALUES (21,22,23,24,25,26,27,28,29,30) TABLESPACE pg_default + + ( + + SUBPARTITION p_hash_4_1 TABLESPACE pg_default, + + SUBPARTITION p_hash_4_2 TABLESPACE pg_default, + + SUBPARTITION p_hash_4_3 TABLESPACE pg_default, + + SUBPARTITION p_hash_4_4 TABLESPACE pg_default, + + SUBPARTITION p_hash_4_5 TABLESPACE pg_default + + ), + + PARTITION p_list_5 VALUES (31,32,33,34,35,36,37,38,39,40) TABLESPACE pg_default + + ( + + SUBPARTITION p_list_5_subpartdefault1 TABLESPACE pg_default + + ), + + PARTITION p_list_6 VALUES (41,42,43,44,45,46,47,48,49,50) TABLESPACE pg_default + + ( + + SUBPARTITION p_hash_6_1 TABLESPACE pg_default, + + SUBPARTITION p_hash_6_2 TABLESPACE pg_default, + + SUBPARTITION p_hash_6_3 TABLESPACE pg_default, + + SUBPARTITION p_hash_6_4 TABLESPACE pg_default, + + SUBPARTITION p_hash_6_5 TABLESPACE pg_default + + ), + + PARTITION p_list_7 VALUES (DEFAULT) TABLESPACE pg_default + + ( + + SUBPARTITION p_list_7_subpartdefault1 TABLESPACE pg_default + + ) + + ) + + ENABLE ROW MOVEMENT; + + CREATE INDEX list_hash_2_idx3 ON list_hash_2 USING btree (col_4) TABLESPACE pg_default; + + CREATE INDEX list_hash_2_idx2 ON list_hash_2 USING btree (col_3, col_1) LOCAL( + + PARTITION partition_name( + + SUBPARTITION p_list_7_subpartdefault1_col_3_col_1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_hash_6_5_col_3_col_1_idx, + + SUBPARTITION p_hash_6_4_col_3_col_1_idx, + + SUBPARTITION p_hash_6_3_col_3_col_1_idx, + + SUBPARTITION p_hash_6_2_col_3_col_1_idx, + + SUBPARTITION p_hash_6_1_col_3_col_1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_list_5_subpartdefault1_col_3_col_1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_hash_4_5_col_3_col_1_idx, + + SUBPARTITION p_hash_4_4_col_3_col_1_idx, + + SUBPARTITION p_hash_4_3_col_3_col_1_idx, + + SUBPARTITION p_hash_4_2_col_3_col_1_idx, + + SUBPARTITION p_hash_4_1_col_3_col_1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_hash_3_2_col_3_col_1_idx, + + SUBPARTITION p_hash_3_1_col_3_col_1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_list_2_subpartdefault1_col_3_col_1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_hash_1_3_col_3_col_1_idx, + + SUBPARTITION p_hash_1_2_col_3_col_1_idx, + + SUBPARTITION p_hash_1_1_col_3_col_1_idx + + ) + + ) TABLESPACE pg_default; + + CREATE UNIQUE INDEX list_hash_2_idx1 ON list_hash_2 USING btree (col_2, col_3, col_4) LOCAL(+ + PARTITION partition_name( + + SUBPARTITION p_list_7_subpartdefault1_col_2_col_3_col_4_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_hash_6_5_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_6_4_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_6_3_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_6_2_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_6_1_col_2_col_3_col_4_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_list_5_subpartdefault1_col_2_col_3_col_4_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_hash_4_5_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_4_4_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_4_3_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_4_2_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_4_1_col_2_col_3_col_4_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_hash_3_2_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_3_1_col_2_col_3_col_4_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_list_2_subpartdefault1_col_2_col_3_col_4_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p_hash_1_3_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_1_2_col_2_col_3_col_4_idx, + + SUBPARTITION p_hash_1_1_col_2_col_3_col_4_idx + + ) + + ) TABLESPACE pg_default; + + ALTER TABLE list_hash_2 ADD CONSTRAINT list_hash_2_col_3_tableoid_key UNIQUE (col_3); + ALTER TABLE list_hash_2 ADD CONSTRAINT list_hash_2_pkey PRIMARY KEY (col_1); (1 row) diff --git a/src/test/regress/expected/hw_subpartition_createtable.out b/src/test/regress/expected/hw_subpartition_createtable.out index 4fa5c6a0b..5c3c54d16 100644 --- a/src/test/regress/expected/hw_subpartition_createtable.out +++ b/src/test/regress/expected/hw_subpartition_createtable.out @@ -1549,18 +1549,27 @@ select pg_get_tabledef('range_range_03'); ENABLE ROW MOVEMENT; + CREATE INDEX range_range_03_idx4 ON range_range_03 USING btree (c_varchar4) TABLESPACE pg_default;+ CREATE INDEX range_range_03_idx3 ON range_range_03 USING btree (c_varchar3) TABLESPACE pg_default;+ - CREATE INDEX range_range_03_idx1 ON range_range_03 USING btree (c_varchar1) LOCAL + - ( + - PARTITION p1_1_c_varchar1_idx, + - PARTITION p1_2_c_varchar1_idx, + - PARTITION p2_1_c_varchar1_idx, + - PARTITION p2_2_c_varchar1_idx, + - PARTITION p3_1_c_varchar1_idx, + - PARTITION p3_2_c_varchar1_idx, + - PARTITION p4_1_c_varchar1_idx, + - PARTITION p4_2_c_varchar1_idx, + - PARTITION p5_1_c_varchar1_idx, + - PARTITION p5_2_c_varchar1_idx + + CREATE INDEX range_range_03_idx1 ON range_range_03 USING btree (c_varchar1) LOCAL( + + PARTITION partition_name( + + SUBPARTITION p1_1_c_varchar1_idx, + + SUBPARTITION p1_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p2_1_c_varchar1_idx, + + SUBPARTITION p2_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p3_1_c_varchar1_idx, + + SUBPARTITION p3_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p4_1_c_varchar1_idx, + + SUBPARTITION p4_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p5_1_c_varchar1_idx, + + SUBPARTITION p5_2_c_varchar1_idx + + ) + ) TABLESPACE pg_default; + ALTER TABLE range_range_03 ADD CONSTRAINT range_range_03_pkey PRIMARY KEY (c, c_int); (1 row) diff --git a/src/test/regress/expected/segment_subpartition_createtable.out b/src/test/regress/expected/segment_subpartition_createtable.out index 733574285..92c34d9ab 100644 --- a/src/test/regress/expected/segment_subpartition_createtable.out +++ b/src/test/regress/expected/segment_subpartition_createtable.out @@ -1455,18 +1455,27 @@ select pg_get_tabledef('range_range_03'); ENABLE ROW MOVEMENT; + CREATE INDEX range_range_03_idx4 ON range_range_03 USING btree (c_varchar4) TABLESPACE pg_default;+ CREATE INDEX range_range_03_idx3 ON range_range_03 USING btree (c_varchar3) TABLESPACE pg_default;+ - CREATE INDEX range_range_03_idx1 ON range_range_03 USING btree (c_varchar1) LOCAL + - ( + - PARTITION p1_1_c_varchar1_idx, + - PARTITION p1_2_c_varchar1_idx, + - PARTITION p2_1_c_varchar1_idx, + - PARTITION p2_2_c_varchar1_idx, + - PARTITION p3_1_c_varchar1_idx, + - PARTITION p3_2_c_varchar1_idx, + - PARTITION p4_1_c_varchar1_idx, + - PARTITION p4_2_c_varchar1_idx, + - PARTITION p5_1_c_varchar1_idx, + - PARTITION p5_2_c_varchar1_idx + + CREATE INDEX range_range_03_idx1 ON range_range_03 USING btree (c_varchar1) LOCAL( + + PARTITION partition_name( + + SUBPARTITION p1_1_c_varchar1_idx, + + SUBPARTITION p1_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p2_1_c_varchar1_idx, + + SUBPARTITION p2_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p3_1_c_varchar1_idx, + + SUBPARTITION p3_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p4_1_c_varchar1_idx, + + SUBPARTITION p4_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p5_1_c_varchar1_idx, + + SUBPARTITION p5_2_c_varchar1_idx + + ) + ) TABLESPACE pg_default; + ALTER TABLE range_range_03 ADD CONSTRAINT range_range_03_pkey PRIMARY KEY (c, c_int); (1 row) diff --git a/src/test/regress/expected/ustore_subpartition_createtable.out b/src/test/regress/expected/ustore_subpartition_createtable.out index c1d76a4c5..102321994 100644 --- a/src/test/regress/expected/ustore_subpartition_createtable.out +++ b/src/test/regress/expected/ustore_subpartition_createtable.out @@ -1455,18 +1455,27 @@ select pg_get_tabledef('range_range_03'); ENABLE ROW MOVEMENT; + CREATE INDEX range_range_03_idx4 ON range_range_03 USING ubtree (c_varchar4) WITH (storage_type=USTORE) TABLESPACE pg_default;+ CREATE INDEX range_range_03_idx3 ON range_range_03 USING ubtree (c_varchar3) WITH (storage_type=USTORE) TABLESPACE pg_default;+ - CREATE INDEX range_range_03_idx1 ON range_range_03 USING ubtree (c_varchar1) LOCAL + - ( + - PARTITION p1_1_c_varchar1_idx, + - PARTITION p1_2_c_varchar1_idx, + - PARTITION p2_1_c_varchar1_idx, + - PARTITION p2_2_c_varchar1_idx, + - PARTITION p3_1_c_varchar1_idx, + - PARTITION p3_2_c_varchar1_idx, + - PARTITION p4_1_c_varchar1_idx, + - PARTITION p4_2_c_varchar1_idx, + - PARTITION p5_1_c_varchar1_idx, + - PARTITION p5_2_c_varchar1_idx + + CREATE INDEX range_range_03_idx1 ON range_range_03 USING ubtree (c_varchar1) LOCAL( + + PARTITION partition_name( + + SUBPARTITION p1_1_c_varchar1_idx, + + SUBPARTITION p1_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p2_1_c_varchar1_idx, + + SUBPARTITION p2_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p3_1_c_varchar1_idx, + + SUBPARTITION p3_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p4_1_c_varchar1_idx, + + SUBPARTITION p4_2_c_varchar1_idx + + ), + + PARTITION partition_name( + + SUBPARTITION p5_1_c_varchar1_idx, + + SUBPARTITION p5_2_c_varchar1_idx + + ) + ) WITH (storage_type=USTORE) TABLESPACE pg_default; + ALTER TABLE range_range_03 ADD CONSTRAINT range_range_03_pkey PRIMARY KEY (c, c_int) WITH (storage_type=USTORE); (1 row)