diff options
Diffstat (limited to 'src/backend/catalog/index.c')
-rw-r--r-- | src/backend/catalog/index.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 9b1d5467917..e9399bef14c 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -39,6 +39,7 @@ #include "catalog/heap.h" #include "catalog/index.h" #include "catalog/objectaccess.h" +#include "catalog/partition.h" #include "catalog/pg_am.h" #include "catalog/pg_collation.h" #include "catalog/pg_constraint.h" @@ -1263,7 +1264,13 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, const char indexColNames = lappend(indexColNames, NameStr(att->attname)); } - /* Now create the new index */ + /* + * Now create the new index. + * + * For a partition index, we adjust the partition dependency later, to + * ensure a consistent state at all times. That is why parentIndexRelid + * is not set here. + */ newIndexId = index_create(heapRelation, newName, InvalidOid, /* indexRelationId */ @@ -1395,6 +1402,9 @@ index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName) namestrcpy(&newClassForm->relname, NameStr(oldClassForm->relname)); namestrcpy(&oldClassForm->relname, oldName); + /* Copy partition flag to track inheritance properly */ + newClassForm->relispartition = oldClassForm->relispartition; + CatalogTupleUpdate(pg_class, &oldClassTuple->t_self, oldClassTuple); CatalogTupleUpdate(pg_class, &newClassTuple->t_self, newClassTuple); @@ -1555,29 +1565,23 @@ index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName) } /* - * Move all dependencies on the old index to the new one + * Swap inheritance relationship with parent index */ - - if (OidIsValid(indexConstraintOid)) + if (get_rel_relispartition(oldIndexId)) { - ObjectAddress myself, - referenced; - - /* Change to having the new index depend on the constraint */ - deleteDependencyRecordsForClass(RelationRelationId, oldIndexId, - ConstraintRelationId, DEPENDENCY_INTERNAL); + List *ancestors = get_partition_ancestors(oldIndexId); + Oid parentIndexRelid = linitial_oid(ancestors); - myself.classId = RelationRelationId; - myself.objectId = newIndexId; - myself.objectSubId = 0; + DeleteInheritsTuple(oldIndexId, parentIndexRelid); + StoreSingleInheritance(newIndexId, parentIndexRelid, 1); - referenced.classId = ConstraintRelationId; - referenced.objectId = indexConstraintOid; - referenced.objectSubId = 0; - - recordDependencyOn(&myself, &referenced, DEPENDENCY_INTERNAL); + list_free(ancestors); } + /* + * Move all dependencies of and on the old index to the new one + */ + changeDependenciesOf(RelationRelationId, oldIndexId, newIndexId); changeDependenciesOn(RelationRelationId, oldIndexId, newIndexId); /* |