aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/commands/tablecmds.c8
-rw-r--r--src/test/regress/expected/indexing.out30
-rw-r--r--src/test/regress/sql/indexing.sql22
3 files changed, 58 insertions, 2 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 93f41ed1ffa..207197c4b3c 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -16626,8 +16626,8 @@ AttachPartitionEnsureIndexes(Relation rel, Relation attachrel)
/*
* Scan the list of existing indexes in the partition-to-be, and mark
- * the first matching, unattached one we find, if any, as partition of
- * the parent index. If we find one, we're done.
+ * the first matching, valid, unattached one we find, if any, as
+ * partition of the parent index. If we find one, we're done.
*/
for (i = 0; i < list_length(attachRelIdxs); i++)
{
@@ -16638,6 +16638,10 @@ AttachPartitionEnsureIndexes(Relation rel, Relation attachrel)
if (attachrelIdxRels[i]->rd_rel->relispartition)
continue;
+ /* If this index is invalid, can't use it */
+ if (!attachrelIdxRels[i]->rd_index->indisvalid)
+ continue;
+
if (CompareIndexInfo(attachInfos[i], info,
attachrelIdxRels[i]->rd_indcollation,
idxRel->rd_indcollation,
diff --git a/src/test/regress/expected/indexing.out b/src/test/regress/expected/indexing.out
index 2dcfa92cb4f..2408fbf67c1 100644
--- a/src/test/regress/expected/indexing.out
+++ b/src/test/regress/expected/indexing.out
@@ -1419,3 +1419,33 @@ Indexes:
"parted_index_col_drop11_b_idx" btree (b)
drop table parted_index_col_drop;
+-- Check that invalid indexes are not selected when attaching a partition.
+create table parted_inval_tab (a int) partition by range (a);
+create index parted_inval_idx on parted_inval_tab (a);
+create table parted_inval_tab_1 (a int) partition by range (a);
+create table parted_inval_tab_1_1 partition of parted_inval_tab_1
+ for values from (0) to (10);
+create table parted_inval_tab_1_2 partition of parted_inval_tab_1
+ for values from (10) to (20);
+-- this creates an invalid index.
+create index parted_inval_ixd_1 on only parted_inval_tab_1 (a);
+-- this creates new indexes for all the partitions of parted_inval_tab_1,
+-- discarding the invalid index created previously as what is chosen.
+alter table parted_inval_tab attach partition parted_inval_tab_1
+ for values from (1) to (100);
+select indexrelid::regclass, indisvalid,
+ indrelid::regclass, inhparent::regclass
+ from pg_index idx left join
+ pg_inherits inh on (idx.indexrelid = inh.inhrelid)
+ where indexrelid::regclass::text like 'parted_inval%'
+ order by indexrelid::regclass::text collate "C";
+ indexrelid | indisvalid | indrelid | inhparent
+----------------------------+------------+----------------------+--------------------------
+ parted_inval_idx | t | parted_inval_tab |
+ parted_inval_ixd_1 | f | parted_inval_tab_1 |
+ parted_inval_tab_1_1_a_idx | t | parted_inval_tab_1_1 | parted_inval_tab_1_a_idx
+ parted_inval_tab_1_2_a_idx | t | parted_inval_tab_1_2 | parted_inval_tab_1_a_idx
+ parted_inval_tab_1_a_idx | t | parted_inval_tab_1 | parted_inval_idx
+(5 rows)
+
+drop table parted_inval_tab;
diff --git a/src/test/regress/sql/indexing.sql b/src/test/regress/sql/indexing.sql
index 445f4b26c20..139e6c11cdf 100644
--- a/src/test/regress/sql/indexing.sql
+++ b/src/test/regress/sql/indexing.sql
@@ -760,3 +760,25 @@ alter table parted_index_col_drop drop column c;
\d parted_index_col_drop2
\d parted_index_col_drop11
drop table parted_index_col_drop;
+
+-- Check that invalid indexes are not selected when attaching a partition.
+create table parted_inval_tab (a int) partition by range (a);
+create index parted_inval_idx on parted_inval_tab (a);
+create table parted_inval_tab_1 (a int) partition by range (a);
+create table parted_inval_tab_1_1 partition of parted_inval_tab_1
+ for values from (0) to (10);
+create table parted_inval_tab_1_2 partition of parted_inval_tab_1
+ for values from (10) to (20);
+-- this creates an invalid index.
+create index parted_inval_ixd_1 on only parted_inval_tab_1 (a);
+-- this creates new indexes for all the partitions of parted_inval_tab_1,
+-- discarding the invalid index created previously as what is chosen.
+alter table parted_inval_tab attach partition parted_inval_tab_1
+ for values from (1) to (100);
+select indexrelid::regclass, indisvalid,
+ indrelid::regclass, inhparent::regclass
+ from pg_index idx left join
+ pg_inherits inh on (idx.indexrelid = inh.inhrelid)
+ where indexrelid::regclass::text like 'parted_inval%'
+ order by indexrelid::regclass::text collate "C";
+drop table parted_inval_tab;