aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/index.c5
-rw-r--r--src/backend/commands/indexcmds.c4
-rw-r--r--src/test/regress/expected/indexing.out56
-rw-r--r--src/test/regress/sql/indexing.sql18
4 files changed, 62 insertions, 21 deletions
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index f1ef4c319a0..5885899c9b4 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -994,9 +994,12 @@ index_create(Relation heapRelation,
*/
CacheInvalidateRelcache(heapRelation);
- /* update pg_inherits, if needed */
+ /* update pg_inherits and the parent's relhassubclass, if needed */
if (OidIsValid(parentIndexRelid))
+ {
StoreSingleInheritance(indexRelationId, parentIndexRelid, 1);
+ SetRelationHasSubclass(parentIndexRelid, true);
+ }
/*
* Register constraint and dependencies for the index.
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 3975f62c001..906d7113781 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -2608,6 +2608,10 @@ IndexSetParentIndex(Relation partitionIdx, Oid parentOid)
systable_endscan(scan);
relation_close(pg_inherits, RowExclusiveLock);
+ /* set relhassubclass if an index partition has been added to the parent */
+ if (OidIsValid(parentOid))
+ SetRelationHasSubclass(parentOid, true);
+
if (fix_dependencies)
{
ObjectAddress partIdx;
diff --git a/src/test/regress/expected/indexing.out b/src/test/regress/expected/indexing.out
index 225f4e95274..ca27346f182 100644
--- a/src/test/regress/expected/indexing.out
+++ b/src/test/regress/expected/indexing.out
@@ -1,25 +1,45 @@
-- Creating an index on a partitioned table makes the partitions
-- automatically get the index
create table idxpart (a int, b int, c text) partition by range (a);
+-- relhassubclass of a partitioned index is false before creating any partition.
+-- It will be set after the first partition is created.
+create index idxpart_idx on idxpart (a);
+select relhassubclass from pg_class where relname = 'idxpart_idx';
+ relhassubclass
+----------------
+ f
+(1 row)
+
+drop index idxpart_idx;
create table idxpart1 partition of idxpart for values from (0) to (10);
create table idxpart2 partition of idxpart for values from (10) to (100)
partition by range (b);
create table idxpart21 partition of idxpart2 for values from (0) to (100);
+-- Even with partitions, relhassubclass should not be set if a partitioned
+-- index is created only on the parent.
+create index idxpart_idx on only idxpart(a);
+select relhassubclass from pg_class where relname = 'idxpart_idx';
+ relhassubclass
+----------------
+ f
+(1 row)
+
+drop index idxpart_idx;
create index on idxpart (a);
-select relname, relkind, inhparent::regclass
+select relname, relkind, relhassubclass, inhparent::regclass
from pg_class left join pg_index ix on (indexrelid = oid)
left join pg_inherits on (ix.indexrelid = inhrelid)
where relname like 'idxpart%' order by relname;
- relname | relkind | inhparent
------------------+---------+----------------
- idxpart | p |
- idxpart1 | r |
- idxpart1_a_idx | i | idxpart_a_idx
- idxpart2 | p |
- idxpart21 | r |
- idxpart21_a_idx | i | idxpart2_a_idx
- idxpart2_a_idx | I | idxpart_a_idx
- idxpart_a_idx | I |
+ relname | relkind | relhassubclass | inhparent
+-----------------+---------+----------------+----------------
+ idxpart | p | t |
+ idxpart1 | r | f |
+ idxpart1_a_idx | i | f | idxpart_a_idx
+ idxpart2 | p | t |
+ idxpart21 | r | f |
+ idxpart21_a_idx | i | f | idxpart2_a_idx
+ idxpart2_a_idx | I | t | idxpart_a_idx
+ idxpart_a_idx | I | t |
(8 rows)
drop table idxpart;
@@ -110,16 +130,16 @@ Partition of: idxpart FOR VALUES FROM (0, 0) TO (10, 10)
Indexes:
"idxpart1_a_b_idx" btree (a, b)
-select relname, relkind, inhparent::regclass
+select relname, relkind, relhassubclass, inhparent::regclass
from pg_class left join pg_index ix on (indexrelid = oid)
left join pg_inherits on (ix.indexrelid = inhrelid)
where relname like 'idxpart%' order by relname;
- relname | relkind | inhparent
-------------------+---------+-----------------
- idxpart | p |
- idxpart1 | r |
- idxpart1_a_b_idx | i | idxpart_a_b_idx
- idxpart_a_b_idx | I |
+ relname | relkind | relhassubclass | inhparent
+------------------+---------+----------------+-----------------
+ idxpart | p | t |
+ idxpart1 | r | f |
+ idxpart1_a_b_idx | i | f | idxpart_a_b_idx
+ idxpart_a_b_idx | I | t |
(4 rows)
drop table idxpart;
diff --git a/src/test/regress/sql/indexing.sql b/src/test/regress/sql/indexing.sql
index f145384fbc9..400b7eb7ba3 100644
--- a/src/test/regress/sql/indexing.sql
+++ b/src/test/regress/sql/indexing.sql
@@ -1,12 +1,26 @@
-- Creating an index on a partitioned table makes the partitions
-- automatically get the index
create table idxpart (a int, b int, c text) partition by range (a);
+
+-- relhassubclass of a partitioned index is false before creating any partition.
+-- It will be set after the first partition is created.
+create index idxpart_idx on idxpart (a);
+select relhassubclass from pg_class where relname = 'idxpart_idx';
+drop index idxpart_idx;
+
create table idxpart1 partition of idxpart for values from (0) to (10);
create table idxpart2 partition of idxpart for values from (10) to (100)
partition by range (b);
create table idxpart21 partition of idxpart2 for values from (0) to (100);
+
+-- Even with partitions, relhassubclass should not be set if a partitioned
+-- index is created only on the parent.
+create index idxpart_idx on only idxpart(a);
+select relhassubclass from pg_class where relname = 'idxpart_idx';
+drop index idxpart_idx;
+
create index on idxpart (a);
-select relname, relkind, inhparent::regclass
+select relname, relkind, relhassubclass, inhparent::regclass
from pg_class left join pg_index ix on (indexrelid = oid)
left join pg_inherits on (ix.indexrelid = inhrelid)
where relname like 'idxpart%' order by relname;
@@ -54,7 +68,7 @@ create table idxpart1 partition of idxpart for values from (0, 0) to (10, 10);
create index on idxpart1 (a, b);
create index on idxpart (a, b);
\d idxpart1
-select relname, relkind, inhparent::regclass
+select relname, relkind, relhassubclass, inhparent::regclass
from pg_class left join pg_index ix on (indexrelid = oid)
left join pg_inherits on (ix.indexrelid = inhrelid)
where relname like 'idxpart%' order by relname;