diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c index 8219d05d83..75e41ed21c 100644 --- a/src/backend/catalog/partition.c +++ b/src/backend/catalog/partition.c @@ -195,23 +195,12 @@ RelationBuildPartitionDesc(Relation rel) if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for relation %u", inhrelid); - /* - * It is possible that the pg_class tuple of a partition has not been - * updated yet to set its relpartbound field. The only case where - * this happens is when we open the parent relation to check using its - * partition descriptor that a new partition's bound does not overlap - * some existing partition. - */ - if (!((Form_pg_class) GETSTRUCT(tuple))->relispartition) - { - ReleaseSysCache(tuple); - continue; - } - datum = SysCacheGetAttr(RELOID, tuple, Anum_pg_class_relpartbound, &isnull); - Assert(!isnull); + if(isnull) + elog(ERROR, "null relpartbound for relation %u", inhrelid); + boundspec = (Node *) stringToNode(TextDatumGetCString(datum)); boundspecs = lappend(boundspecs, boundspec); partoids = lappend_oid(partoids, inhrelid); @@ -1856,8 +1845,7 @@ generate_partition_qual(Relation rel) Anum_pg_class_relpartbound, &isnull); if (isnull) /* should not happen */ - elog(ERROR, "relation \"%s\" has relpartbound = null", - RelationGetRelationName(rel)); + elog(ERROR, "null relpartbound for relation %u", RelationGetRelid(rel)); bound = castNode(PartitionBoundSpec, stringToNode(TextDatumGetCString(boundDatum))); ReleaseSysCache(tuple); diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index f143101b5d..43b76812d2 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -745,9 +745,6 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, false, typaddress); - /* Store inheritance information for new rel. */ - StoreCatalogInheritance(relationId, inheritOids, stmt->partbound != NULL); - /* * We must bump the command counter to make the newly-created relation * tuple visible for opening. @@ -809,6 +806,9 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, CommandCounterIncrement(); } + /* Store inheritance information for new rel. */ + StoreCatalogInheritance(relationId, inheritOids, stmt->partbound != NULL); + /* * Process the partitioning specification (if any) and store the partition * key information into the catalog. @@ -13611,9 +13611,6 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) trigger_name, RelationGetRelationName(attachrel)), errdetail("ROW triggers with transition tables are not supported on partitions"))); - /* OK to create inheritance. Rest of the checks performed there */ - CreateInheritance(attachrel, rel); - /* * Check that the new partition's bound is valid and does not overlap any * of existing partitions of the parent - note that it does not return on @@ -13622,6 +13619,9 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) check_new_partition_bound(RelationGetRelationName(attachrel), rel, cmd->bound); + /* OK to create inheritance. Rest of the checks performed there */ + CreateInheritance(attachrel, rel); + /* Update the pg_class entry. */ StorePartitionBound(attachrel, rel, cmd->bound); @@ -13837,10 +13837,6 @@ ATExecDetachPartition(Relation rel, RangeVar *name) RelationGetRelid(partRel)); Assert(((Form_pg_class) GETSTRUCT(tuple))->relispartition); - (void) SysCacheGetAttr(RELOID, tuple, Anum_pg_class_relpartbound, - &isnull); - Assert(!isnull); - /* Clear relpartbound and reset relispartition */ memset(new_val, 0, sizeof(new_val)); memset(new_null, false, sizeof(new_null));