IndexSetParentIndex-update_relispartition.patch
application/octet-stream
Filename: IndexSetParentIndex-update_relispartition.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/indexcmds.c | 32 | 0 |
| src/backend/commands/tablecmds.c | 0 | 37 |
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index a1c91b5fb8..c84ea7ad2a 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -89,6 +89,7 @@ static void RangeVarCallbackForReindexIndex(const RangeVar *relation,
Oid relId, Oid oldRelId, void *arg);
static bool ReindexRelationConcurrently(Oid relationOid, int options);
static void ReindexPartitionedIndex(Relation parentIdx);
+static void update_relispartition(Oid relationId, bool newval);
/*
* CheckIndexCompatible
@@ -3361,7 +3362,12 @@ IndexSetParentIndex(Relation partitionIdx, Oid parentOid)
/* set relhassubclass if an index partition has been added to the parent */
if (OidIsValid(parentOid))
+ {
SetRelationHasSubclass(parentOid, true);
+ update_relispartition(partRelid, true);
+ }
+ else
+ update_relispartition(partRelid, false);
if (fix_dependencies)
{
@@ -3399,3 +3405,29 @@ IndexSetParentIndex(Relation partitionIdx, Oid parentOid)
CommandCounterIncrement();
}
}
+
+/*
+ * Update the relispartition flag of the given relation to the given value.
+ *
+ * classRel is the pg_class relation, already open and suitably locked.
+ * It can be passed as NULL, in which case it's opened and closed locally.
+ */
+static void
+update_relispartition(Oid relationId, bool newval)
+{
+ HeapTuple tup;
+ HeapTuple newtup;
+ Form_pg_class classForm;
+ Relation classRel;
+
+ classRel = table_open(RelationRelationId, RowExclusiveLock);
+ tup = SearchSysCache1(RELOID, ObjectIdGetDatum(relationId));
+ newtup = heap_copytuple(tup);
+ classForm = (Form_pg_class) GETSTRUCT(newtup);
+ classForm->relispartition = newval;
+ CatalogTupleUpdate(classRel, &tup->t_self, newtup);
+ heap_freetuple(newtup);
+ ReleaseSysCache(tup);
+
+ table_close(classRel, RowExclusiveLock);
+}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index aa7328ea40..0b86e8cd50 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -525,8 +525,6 @@ static ObjectAddress ATExecAttachPartitionIdx(List **wqueue, Relation rel,
static void validatePartitionedIndex(Relation partedIdx, Relation partedTbl);
static void refuseDupeIndexAttach(Relation parentIdx, Relation partIdx,
Relation partitionTbl);
-static void update_relispartition(Relation classRel, Oid relationId,
- bool newval);
static List *GetParentedForeignKeyRefs(Relation partition);
static void ATDetachCheckNoForeignKeyRefs(Relation partition);
@@ -15714,7 +15712,6 @@ AttachPartitionEnsureIndexes(Relation rel, Relation attachrel)
if (OidIsValid(constraintOid))
ConstraintSetParentConstraint(cldConstrOid, constraintOid,
RelationGetRelid(attachrel));
- update_relispartition(NULL, cldIdxId, true);
found = true;
CommandCounterIncrement();
@@ -15970,7 +15967,6 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
idx = index_open(idxid, AccessExclusiveLock);
IndexSetParentIndex(idx, InvalidOid);
- update_relispartition(classRel, idxid, false);
/* If there's a constraint associated with the index, detach it too */
constrOid = get_relation_idx_constraint_oid(RelationGetRelid(partRel),
@@ -16268,7 +16264,6 @@ ATExecAttachPartitionIdx(List **wqueue, Relation parentIdx, RangeVar *name)
if (OidIsValid(constraintOid))
ConstraintSetParentConstraint(cldConstrId, constraintOid,
RelationGetRelid(partTbl));
- update_relispartition(NULL, partIdxId, true);
pfree(attmap);
@@ -16401,38 +16396,6 @@ validatePartitionedIndex(Relation partedIdx, Relation partedTbl)
}
}
-/*
- * Update the relispartition flag of the given relation to the given value.
- *
- * classRel is the pg_class relation, already open and suitably locked.
- * It can be passed as NULL, in which case it's opened and closed locally.
- */
-static void
-update_relispartition(Relation classRel, Oid relationId, bool newval)
-{
- HeapTuple tup;
- HeapTuple newtup;
- Form_pg_class classForm;
- bool opened = false;
-
- if (classRel == NULL)
- {
- classRel = table_open(RelationRelationId, RowExclusiveLock);
- opened = true;
- }
-
- tup = SearchSysCache1(RELOID, ObjectIdGetDatum(relationId));
- newtup = heap_copytuple(tup);
- classForm = (Form_pg_class) GETSTRUCT(newtup);
- classForm->relispartition = newval;
- CatalogTupleUpdate(classRel, &tup->t_self, newtup);
- heap_freetuple(newtup);
- ReleaseSysCache(tup);
-
- if (opened)
- table_close(classRel, RowExclusiveLock);
-}
-
/*
* Return an OID list of constraints that reference the given relation
* that are marked as having a parent constraints.