diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/heap.c | 4 | ||||
-rw-r--r-- | src/backend/catalog/partition.c | 4 | ||||
-rw-r--r-- | src/backend/commands/copy.c | 72 | ||||
-rw-r--r-- | src/backend/commands/tablecmds.c | 238 | ||||
-rw-r--r-- | src/backend/executor/nodeModifyTable.c | 22 | ||||
-rw-r--r-- | src/include/catalog/pg_partitioned_table.h | 32 |
6 files changed, 187 insertions, 185 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 5ffea748554..c09c9f28a73 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -1887,6 +1887,10 @@ heap_drop_with_catalog(Oid relid) if (parent) { + /* + * Invalidate the parent's relcache so that the partition is no longer + * included in its partition descriptor. + */ CacheInvalidateRelcache(parent); heap_close(parent, NoLock); /* keep the lock */ } diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c index 219d380cde5..63d9b13db44 100644 --- a/src/backend/catalog/partition.c +++ b/src/backend/catalog/partition.c @@ -1492,7 +1492,7 @@ generate_partition_qual(Relation rel, bool recurse) * Construct values[] and isnull[] arrays for the partition key * of a tuple. * - * pkinfo partition key execution info + * pd Partition dispatch object of the partitioned table * slot Heap tuple from which to extract partition key * estate executor state for evaluating any partition key * expressions (must be non-NULL) @@ -1565,7 +1565,7 @@ FormPartitionKeyDatum(PartitionDispatch pd, * the latter case. */ int -get_partition_for_tuple(PartitionDispatch * pd, +get_partition_for_tuple(PartitionDispatch *pd, TupleTableSlot *slot, EState *estate, Oid *failed_at) diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 270be0af18e..7a8da338f07 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -161,11 +161,11 @@ typedef struct CopyStateData ExprState **defexprs; /* array of default att expressions */ bool volatile_defexprs; /* is any of defexprs volatile? */ List *range_table; - PartitionDispatch *partition_dispatch_info; - int num_dispatch; - int num_partitions; - ResultRelInfo *partitions; - TupleConversionMap **partition_tupconv_maps; + PartitionDispatch *partition_dispatch_info; + int num_dispatch; + int num_partitions; + ResultRelInfo *partitions; + TupleConversionMap **partition_tupconv_maps; /* * These variables are used to reduce overhead in textual COPY FROM. @@ -1403,31 +1403,28 @@ BeginCopy(ParseState *pstate, errmsg("table \"%s\" does not have OIDs", RelationGetRelationName(cstate->rel)))); - /* - * Initialize state for CopyFrom tuple routing. Watch out for - * any foreign partitions. - */ + /* Initialize state for CopyFrom tuple routing. */ if (is_from && rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { - PartitionDispatch *pd; - List *leaf_parts; - ListCell *cell; - int i, - num_parted, - num_leaf_parts; - ResultRelInfo *leaf_part_rri; + List *leaf_parts; + ListCell *cell; + int i, + num_parted; + ResultRelInfo *leaf_part_rri; /* Get the tuple-routing information and lock partitions */ - pd = RelationGetPartitionDispatchInfo(rel, RowExclusiveLock, - &num_parted, &leaf_parts); - num_leaf_parts = list_length(leaf_parts); - cstate->partition_dispatch_info = pd; + cstate->partition_dispatch_info = + RelationGetPartitionDispatchInfo(rel, RowExclusiveLock, + &num_parted, + &leaf_parts); cstate->num_dispatch = num_parted; - cstate->num_partitions = num_leaf_parts; - cstate->partitions = (ResultRelInfo *) palloc(num_leaf_parts * - sizeof(ResultRelInfo)); + cstate->num_partitions = list_length(leaf_parts); + cstate->partitions = (ResultRelInfo *) + palloc(cstate->num_partitions * + sizeof(ResultRelInfo)); cstate->partition_tupconv_maps = (TupleConversionMap **) - palloc0(num_leaf_parts * sizeof(TupleConversionMap *)); + palloc0(cstate->num_partitions * + sizeof(TupleConversionMap *)); leaf_part_rri = cstate->partitions; i = 0; @@ -1438,8 +1435,8 @@ BeginCopy(ParseState *pstate, /* * We locked all the partitions above including the leaf * partitions. Note that each of the relations in - * cstate->partitions will be closed by CopyFrom() after - * it's finished with its processing. + * cstate->partitions will be closed by CopyFrom() after it's + * finished with its processing. */ partrel = heap_open(lfirst_oid(cell), NoLock); @@ -1451,8 +1448,9 @@ BeginCopy(ParseState *pstate, InitResultRelInfo(leaf_part_rri, partrel, - 1, /* dummy */ - false, /* no partition constraint check */ + 1, /* dummy */ + false, /* no partition constraint + * check */ 0); /* Open partition indices */ @@ -1460,9 +1458,9 @@ BeginCopy(ParseState *pstate, if (!equalTupleDescs(tupDesc, RelationGetDescr(partrel))) cstate->partition_tupconv_maps[i] = - convert_tuples_by_name(tupDesc, - RelationGetDescr(partrel), - gettext_noop("could not convert row type")); + convert_tuples_by_name(tupDesc, + RelationGetDescr(partrel), + gettext_noop("could not convert row type")); leaf_part_rri++; i++; } @@ -2486,8 +2484,8 @@ CopyFrom(CopyState cstate) * BEFORE/INSTEAD OF triggers, or we need to evaluate volatile default * expressions. Such triggers or expressions might query the table we're * inserting to, and act differently if the tuples that have already been - * processed and prepared for insertion are not there. We also can't - * do it if the table is partitioned. + * processed and prepared for insertion are not there. We also can't do + * it if the table is partitioned. */ if ((resultRelInfo->ri_TrigDesc != NULL && (resultRelInfo->ri_TrigDesc->trig_insert_before_row || @@ -2572,7 +2570,7 @@ CopyFrom(CopyState cstate) /* Determine the partition to heap_insert the tuple into */ if (cstate->partition_dispatch_info) { - int leaf_part_index; + int leaf_part_index; TupleConversionMap *map; /* @@ -2584,7 +2582,7 @@ CopyFrom(CopyState cstate) * partition, respectively. */ leaf_part_index = ExecFindPartition(resultRelInfo, - cstate->partition_dispatch_info, + cstate->partition_dispatch_info, slot, estate); Assert(leaf_part_index >= 0 && @@ -2601,7 +2599,7 @@ CopyFrom(CopyState cstate) if (resultRelInfo->ri_FdwRoutine) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot route inserted tuples to a foreign table"))); + errmsg("cannot route inserted tuples to a foreign table"))); /* * For ExecInsertIndexTuples() to work on the partition's indexes @@ -2752,7 +2750,7 @@ CopyFrom(CopyState cstate) /* Close all the partitioned tables, leaf partitions, and their indices */ if (cstate->partition_dispatch_info) { - int i; + int i; /* * Remember cstate->partition_dispatch_info[0] corresponds to the root diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 5856e729180..7a574dc50da 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -166,7 +166,7 @@ typedef struct AlteredTableInfo Oid newTableSpace; /* new tablespace; 0 means no change */ bool chgPersistence; /* T if SET LOGGED/UNLOGGED is used */ char newrelpersistence; /* if above is true */ - List *partition_constraint; /* for attach partition validation */ + List *partition_constraint; /* for attach partition validation */ /* Objects to rebuild after completing ALTER TYPE operations */ List *changedConstraintOids; /* OIDs of constraints to rebuild */ List *changedConstraintDefs; /* string definitions of same */ @@ -454,7 +454,7 @@ static void ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *pa static void CreateInheritance(Relation child_rel, Relation parent_rel); static void RemoveInheritance(Relation child_rel, Relation parent_rel); static ObjectAddress ATExecAttachPartition(List **wqueue, Relation rel, - PartitionCmd *cmd); + PartitionCmd *cmd); static ObjectAddress ATExecDetachPartition(Relation rel, RangeVar *name); @@ -630,7 +630,7 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, */ localHasOids = interpretOidsOption(stmt->options, (relkind == RELKIND_RELATION || - relkind == RELKIND_PARTITIONED_TABLE)); + relkind == RELKIND_PARTITIONED_TABLE)); descriptor->tdhasoid = (localHasOids || parentOidCount > 0); if (stmt->partbound) @@ -791,19 +791,19 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, } /* - * Process the partitioning specification (if any) and store the - * partition key information into the catalog. + * Process the partitioning specification (if any) and store the partition + * key information into the catalog. */ if (stmt->partspec) { - char strategy; - int partnatts, - i; - AttrNumber partattrs[PARTITION_MAX_KEYS]; - Oid partopclass[PARTITION_MAX_KEYS]; - Oid partcollation[PARTITION_MAX_KEYS]; - List *partexprs = NIL; - List *cmds = NIL; + char strategy; + int partnatts, + i; + AttrNumber partattrs[PARTITION_MAX_KEYS]; + Oid partopclass[PARTITION_MAX_KEYS]; + Oid partcollation[PARTITION_MAX_KEYS]; + List *partexprs = NIL; + List *cmds = NIL; /* * We need to transform the raw parsetrees corresponding to partition @@ -827,7 +827,7 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, for (i = 0; i < partnatts; i++) { AttrNumber partattno = partattrs[i]; - Form_pg_attribute attform = descriptor->attrs[partattno-1]; + Form_pg_attribute attform = descriptor->attrs[partattno - 1]; if (partattno != 0 && !attform->attnotnull) { @@ -1613,8 +1613,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence, MaxHeapAttributeNumber))); /* - * In case of a partition, there are no new column definitions, only - * dummy ColumnDefs created for column constraints. We merge these + * In case of a partition, there are no new column definitions, only dummy + * ColumnDefs created for column constraints. We merge them with the * constraints inherited from the parent. */ if (is_partition) @@ -1704,9 +1704,9 @@ MergeAttributes(List *schema, List *supers, char relpersistence, * the parent's relhassubclass field, if its previous children were * recently dropped. * - * If the child table is a partition, then we instead grab an exclusive - * lock on the parent because its partition descriptor will be changed - * by addition of the new partition. + * If the child table is a partition, then we instead grab an + * exclusive lock on the parent because its partition descriptor will + * be changed by addition of the new partition. */ if (!is_partition) relation = heap_openrv(parent, ShareUpdateExclusiveLock); @@ -1714,8 +1714,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence, relation = heap_openrv(parent, AccessExclusiveLock); /* - * We do not allow partitioned tables and partitions to participate - * in regular inheritance. + * We do not allow partitioned tables and partitions to participate in + * regular inheritance. */ if (relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !is_partition) @@ -1752,7 +1752,7 @@ MergeAttributes(List *schema, List *supers, char relpersistence, ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg(!is_partition - ? "cannot inherit from temporary relation of another session" + ? "cannot inherit from temporary relation of another session" : "cannot create as partition of temporary relation of another session"))); /* @@ -2030,8 +2030,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence, newcollid; /* - * Partitions have only one parent, so conflict should never - * occur + * Partitions have only one parent and have no column + * definitions of their own, so conflict should never occur. */ Assert(!is_partition); @@ -2118,8 +2118,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence, /* * Now that we have the column definition list for a partition, we can - * check whether the columns referenced in column option specifications - * actually exist. Also, we merge the options into the corresponding + * check whether the columns referenced in the column constraint specs + * actually exist. Also, we merge the constraints into the corresponding * column definitions. */ if (is_partition && list_length(saved_schema) > 0) @@ -2139,14 +2139,14 @@ MergeAttributes(List *schema, List *supers, char relpersistence, */ if (coldef->typeName == NULL) ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_COLUMN), - errmsg("column \"%s\" does not exist", - coldef->colname))); + (errcode(ERRCODE_UNDEFINED_COLUMN), + errmsg("column \"%s\" does not exist", + coldef->colname))); while (rest != NULL) { ColumnDef *restdef = lfirst(rest); - ListCell *next = lnext(rest); /* need to save it in case - * we delete it */ + ListCell *next = lnext(rest); /* need to save it in case we + * delete it */ if (strcmp(coldef->colname, restdef->colname) == 0) { @@ -3735,7 +3735,7 @@ ATRewriteCatalogs(List **wqueue, LOCKMODE lockmode) */ if (((tab->relkind == RELKIND_RELATION || tab->relkind == RELKIND_PARTITIONED_TABLE) && - tab->partition_constraint == NIL) || + tab->partition_constraint == NIL) || tab->relkind == RELKIND_MATVIEW) AlterTableCreateToastTable(tab->relid, (Datum) 0, lockmode); } @@ -4326,8 +4326,8 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode) { needscan = true; partqualstate = (List *) - ExecPrepareExpr((Expr *) tab->partition_constraint, - estate); + ExecPrepareExpr((Expr *) tab->partition_constraint, + estate); } foreach(l, tab->newvals) @@ -4522,7 +4522,7 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode) if (partqualstate && !ExecQual(partqualstate, econtext, true)) ereport(ERROR, (errcode(ERRCODE_CHECK_VIOLATION), - errmsg("partition constraint is violated by some row"))); + errmsg("partition constraint is violated by some row"))); /* Write the tuple out to the new relation */ if (newrel) @@ -5596,20 +5596,20 @@ ATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode) if (tupDesc->attrs[parent_attnum - 1]->attnotnull) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), - errmsg("column \"%s\" is marked NOT NULL in parent table", - colName))); + errmsg("column \"%s\" is marked NOT NULL in parent table", + colName))); heap_close(parent, AccessShareLock); } /* - * If the table is a range partitioned table, check that the column - * is not in the partition key. + * If the table is a range partitioned table, check that the column is not + * in the partition key. */ if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { - PartitionKey key = RelationGetPartitionKey(rel); - int partnatts = get_partition_natts(key), - i; + PartitionKey key = RelationGetPartitionKey(rel); + int partnatts = get_partition_natts(key), + i; for (i = 0; i < partnatts; i++) { @@ -6093,11 +6093,11 @@ ATPrepDropColumn(List **wqueue, Relation rel, bool recurse, bool recursing, static bool is_partition_attr(Relation rel, AttrNumber attnum, bool *used_in_expr) { - PartitionKey key; - int partnatts; - List *partexprs; - ListCell *partexprs_item; - int i; + PartitionKey key; + int partnatts; + List *partexprs; + ListCell *partexprs_item; + int i; if (rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) return false; @@ -8258,9 +8258,9 @@ ATExecDropConstraint(Relation rel, const char *constrName, } /* - * In case of a partitioned table, the constraint must be dropped from - * the partitions too. There is no such thing as NO INHERIT constraints - * in case of partitioned tables. + * In case of a partitioned table, the constraint must be dropped from the + * partitions too. There is no such thing as NO INHERIT constraints in + * case of partitioned tables. */ if (!recurse && rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) ereport(ERROR, @@ -8432,7 +8432,7 @@ ATPrepAlterColumnType(List **wqueue, if (!is_expr) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), - errmsg("cannot alter type of column named in partition key"))); + errmsg("cannot alter type of column named in partition key"))); else ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), @@ -10704,7 +10704,8 @@ CreateInheritance(Relation child_rel, Relation parent_rel) /* * Check for duplicates in the list of parents, and determine the highest * inhseqno already present; we'll use the next one for the new parent. - * Also, if proposed child is a partition, it cannot already be inheriting. + * Also, if proposed child is a partition, it cannot already be + * inheriting. * * Note: we do not reject the case where the child already inherits from * the parent indirectly; CREATE TABLE doesn't reject comparable cases. @@ -11054,8 +11055,8 @@ MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel) static ObjectAddress ATExecDropInherit(Relation rel, RangeVar *parent, LOCKMODE lockmode) { - ObjectAddress address; - Relation parent_rel; + ObjectAddress address; + Relation parent_rel; if (rel->rd_rel->relispartition) ereport(ERROR, @@ -11154,15 +11155,15 @@ RemoveInheritance(Relation child_rel, Relation parent_rel) if (child_is_partition) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_TABLE), - errmsg("relation \"%s\" is not a partition of relation \"%s\"", - RelationGetRelationName(child_rel), - RelationGetRelationName(parent_rel)))); + errmsg("relation \"%s\" is not a partition of relation \"%s\"", + RelationGetRelationName(child_rel), + RelationGetRelationName(parent_rel)))); else ereport(ERROR, (errcode(ERRCODE_UNDEFINED_TABLE), - errmsg("relation \"%s\" is not a parent of relation \"%s\"", - RelationGetRelationName(parent_rel), - RelationGetRelationName(child_rel)))); + errmsg("relation \"%s\" is not a parent of relation \"%s\"", + RelationGetRelationName(parent_rel), + RelationGetRelationName(child_rel)))); } /* @@ -11283,6 +11284,7 @@ RemoveInheritance(Relation child_rel, Relation parent_rel) drop_parent_dependency(RelationGetRelid(child_rel), RelationRelationId, RelationGetRelid(parent_rel)); + /* * Post alter hook of this inherits. Since object_access_hook doesn't take * multiple object identifiers, we relay oid of parent relation using @@ -12735,10 +12737,10 @@ RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid, static PartitionSpec * transformPartitionSpec(Relation rel, PartitionSpec *partspec, char *strategy) { - PartitionSpec *newspec; - ParseState *pstate; - RangeTblEntry *rte; - ListCell *l; + PartitionSpec *newspec; + ParseState *pstate; + RangeTblEntry *rte; + ListCell *l; newspec = (PartitionSpec *) makeNode(PartitionSpec); @@ -12768,16 +12770,16 @@ transformPartitionSpec(Relation rel, PartitionSpec *partspec, char *strategy) /* take care of any partition expressions */ foreach(l, partspec->partParams) { - ListCell *lc; - PartitionElem *pelem = (PartitionElem *) lfirst(l); + ListCell *lc; + PartitionElem *pelem = (PartitionElem *) lfirst(l); /* Check for PARTITION BY ... (foo, foo) */ foreach(lc, newspec->partParams) { - PartitionElem *pparam = (PartitionElem *) lfirst(lc); + PartitionElem *pparam = (PartitionElem *) lfirst(lc); if (pelem->name && pparam->name && - !strcmp(pelem->name, pparam->name)) + !strcmp(pelem->name, pparam->name)) ereport(ERROR, (errcode(ERRCODE_DUPLICATE_COLUMN), errmsg("column \"%s\" appears more than once in partition key", @@ -12814,29 +12816,29 @@ ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *partattrs, attn = 0; foreach(lc, partParams) { - PartitionElem *pelem = (PartitionElem *) lfirst(lc); - Oid atttype; - Oid attcollation; + PartitionElem *pelem = (PartitionElem *) lfirst(lc); + Oid atttype; + Oid attcollation; if (pelem->name != NULL) { /* Simple attribute reference */ - HeapTuple atttuple; + HeapTuple atttuple; Form_pg_attribute attform; atttuple = SearchSysCacheAttName(RelationGetRelid(rel), pelem->name); if (!HeapTupleIsValid(atttuple)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_COLUMN), - errmsg("column \"%s\" named in partition key does not exist", - pelem->name))); + errmsg("column \"%s\" named in partition key does not exist", + pelem->name))); attform = (Form_pg_attribute) GETSTRUCT(atttuple); if (attform->attnum <= 0) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_COLUMN), - errmsg("cannot use system column \"%s\" in partition key", - pelem->name))); + errmsg("cannot use system column \"%s\" in partition key", + pelem->name))); partattrs[attn] = attform->attnum; atttype = attform->atttypid; @@ -12872,9 +12874,9 @@ ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *partattrs, } else { - Bitmapset *expr_attrs = NULL; + Bitmapset *expr_attrs = NULL; - partattrs[attn] = 0; /* marks the column as expression */ + partattrs[attn] = 0; /* marks the column as expression */ *partexprs = lappend(*partexprs, expr); /* @@ -12896,8 +12898,8 @@ ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *partattrs, errmsg("functions in partition key expression must be marked IMMUTABLE"))); /* - * While it is not exactly *wrong* for an expression to be - * a constant value, it seems better to prevent such input. + * While it is not exactly *wrong* for an expression to be a + * constant value, it seems better to prevent such input. */ if (IsA(expr, Const)) ereport(ERROR, @@ -12905,9 +12907,9 @@ ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *partattrs, errmsg("cannot use constant expression as partition key"))); /* - * transformPartitionSpec() should have already rejected subqueries, - * aggregates, window functions, and SRFs, based on the EXPR_KIND_ - * for partition expressions. + * transformPartitionSpec() should have already rejected + * subqueries, aggregates, window functions, and SRFs, based + * on the EXPR_KIND_ for partition expressions. */ /* Cannot have expressions containing whole-row references */ @@ -12929,8 +12931,8 @@ ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *partattrs, /* * Check we have a collation iff it's a collatable type. The only * expected failures here are (1) COLLATE applied to a noncollatable - * type, or (2) partition expression had an unresolved collation. - * But we might as well code this to be a complete consistency check. + * type, or (2) partition expression had an unresolved collation. But + * we might as well code this to be a complete consistency check. */ if (type_is_collatable(atttype)) { @@ -12962,8 +12964,8 @@ ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *partattrs, if (!OidIsValid(partopclass[attn])) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("data type %s has no default btree operator class", - format_type_be(atttype)), + errmsg("data type %s has no default btree operator class", + format_type_be(atttype)), errhint("You must specify a btree operator class or define a default btree operator class for the data type."))); } else @@ -12984,11 +12986,11 @@ ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *partattrs, static ObjectAddress ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) { - PartitionKey key = RelationGetPartitionKey(rel); + PartitionKey key = RelationGetPartitionKey(rel); Relation attachRel, catalog; List *childrels; - TupleConstr *attachRel_constr; + TupleConstr *attachRel_constr; List *partConstraint, *existConstraint; SysScanDesc scan; @@ -13053,8 +13055,8 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) heap_close(catalog, AccessShareLock); /* - * Prevent circularity by seeing if rel is a partition of attachRel. - * (In particular, this disallows making a rel a partition of itself.) + * Prevent circularity by seeing if rel is a partition of attachRel. (In + * particular, this disallows making a rel a partition of itself.) */ childrels = find_all_inheritors(RelationGetRelid(attachRel), AccessShareLock, NULL); @@ -13079,30 +13081,30 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) !rel->rd_islocaltemp) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot attach as partition of temporary relation of another session"))); + errmsg("cannot attach as partition of temporary relation of another session"))); /* Ditto for the partition */ if (attachRel->rd_rel->relpersistence == RELPERSISTENCE_TEMP && !attachRel->rd_islocaltemp) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot attach temporary relation of another session as partition"))); + errmsg("cannot attach temporary relation of another session as partition"))); /* If parent has OIDs then child must have OIDs */ if (rel->rd_rel->relhasoids && !attachRel->rd_rel->relhasoids) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot attach table \"%s\" without OIDs as partition of" - " table \"%s\" with OIDs", RelationGetRelationName(attachRel), - RelationGetRelationName(rel)))); + errmsg("cannot attach table \"%s\" without OIDs as partition of" + " table \"%s\" with OIDs", RelationGetRelationName(attachRel), + RelationGetRelationName(rel)))); /* OTOH, if parent doesn't have them, do not allow in attachRel either */ if (attachRel->rd_rel->relhasoids && !rel->rd_rel->relhasoids) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot attach table \"%s\" with OIDs as partition of table" - " \"%s\" without OIDs", RelationGetRelationName(attachRel), - RelationGetRelationName(rel)))); + errmsg("cannot attach table \"%s\" with OIDs as partition of table" + " \"%s\" without OIDs", RelationGetRelationName(attachRel), + RelationGetRelationName(rel)))); /* Check if there are any columns in attachRel that aren't in the parent */ tupleDesc = RelationGetDescr(attachRel); @@ -13132,8 +13134,8 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) /* * 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 error. + * of existing partitions of the parent - note that it does not return on + * error. */ check_new_partition_bound(RelationGetRelationName(attachRel), rel, cmd->bound); @@ -13155,8 +13157,8 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) partConstraint = list_make1(make_ands_explicit(partConstraint)); /* - * Check if we can do away with having to scan the table being attached - * to validate the partition constraint, by *proving* that the existing + * Check if we can do away with having to scan the table being attached to + * validate the partition constraint, by *proving* that the existing * constraints of the table *imply* the partition predicate. We include * the table's check constraints and NOT NULL constraints in the list of * clauses passed to predicate_implied_by(). @@ -13243,14 +13245,14 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) skip_validate = true; /* - * We choose to err on the safer side, ie, give up on skipping the - * the validation scan, if the partition key column doesn't have - * the NOT NULL constraint and the table is to become a list partition - * that does not accept nulls. In this case, the partition predicate + * We choose to err on the safer side, ie, give up on skipping the the + * validation scan, if the partition key column doesn't have the NOT + * NULL constraint and the table is to become a list partition that + * does not accept nulls. In this case, the partition predicate * (partConstraint) does include an 'key IS NOT NULL' expression, - * however, because of the way predicate_implied_by_simple_clause() - * is designed to handle IS NOT NULL predicates in the absence of a - * IS NOT NULL clause, we cannot rely on just the above proof. + * however, because of the way predicate_implied_by_simple_clause() is + * designed to handle IS NOT NULL predicates in the absence of a IS + * NOT NULL clause, we cannot rely on just the above proof. * * That is not an issue in case of a range partition, because if there * were no NOT NULL constraint defined on the key columns, an error @@ -13269,7 +13271,7 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) */ foreach(lc, part_constr) { - Node *expr = lfirst(lc); + Node *expr = lfirst(lc); if (IsA(expr, NullTest) && ((NullTest *) expr)->nulltesttype == IS_NOT_NULL) @@ -13299,8 +13301,8 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) /* * Set up to have the table to be scanned to validate the partition - * constraint (see partConstraint above). If it's a partitioned table, - * we instead schdule its leaf partitions to be scanned instead. + * constraint (see partConstraint above). If it's a partitioned table, we + * instead schdule its leaf partitions to be scanned instead. */ if (!skip_validate) { @@ -13310,7 +13312,7 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) /* Take an exclusive lock on the partitions to be checked */ if (attachRel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) all_parts = find_all_inheritors(RelationGetRelid(attachRel), - AccessExclusiveLock, NULL); + AccessExclusiveLock, NULL); else all_parts = list_make1_oid(RelationGetRelid(attachRel)); @@ -13351,8 +13353,8 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd) } /* - * Invalidate the relcache so that the new partition is now included - * in rel's partition descriptor. + * Invalidate the parent's relcache so that the new partition is now + * included its partition descriptor. */ CacheInvalidateRelcache(rel); @@ -13414,8 +13416,8 @@ ATExecDetachPartition(Relation rel, RangeVar *name) heap_close(classRel, RowExclusiveLock); /* - * Invalidate the relcache so that the partition is no longer included - * in our partition descriptor. + * Invalidate the parent's relcache so that the partition is no longer + * included in its partition descriptor. */ CacheInvalidateRelcache(rel); diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index c0b58d1841c..ec440b353d0 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -1718,26 +1718,26 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) if (operation == CMD_INSERT && rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { - PartitionDispatch *pd; int i, j, - num_parted, - num_leaf_parts; + num_parted; List *leaf_parts; ListCell *cell; ResultRelInfo *leaf_part_rri; - /* Form the partition node tree and lock partitions */ - pd = RelationGetPartitionDispatchInfo(rel, RowExclusiveLock, - &num_parted, &leaf_parts); - mtstate->mt_partition_dispatch_info = pd; + /* Get the tuple-routing information and lock partitions */ + mtstate->mt_partition_dispatch_info = + RelationGetPartitionDispatchInfo(rel, RowExclusiveLock, + &num_parted, + &leaf_parts); mtstate->mt_num_dispatch = num_parted; - num_leaf_parts = list_length(leaf_parts); - mtstate->mt_num_partitions = num_leaf_parts; + mtstate->mt_num_partitions = list_length(leaf_parts); mtstate->mt_partitions = (ResultRelInfo *) - palloc0(num_leaf_parts * sizeof(ResultRelInfo)); + palloc0(mtstate->mt_num_partitions * + sizeof(ResultRelInfo)); mtstate->mt_partition_tupconv_maps = (TupleConversionMap **) - palloc0(num_leaf_parts * sizeof(TupleConversionMap *)); + palloc0(mtstate->mt_num_partitions * + sizeof(TupleConversionMap *)); leaf_part_rri = mtstate->mt_partitions; i = j = 0; diff --git a/src/include/catalog/pg_partitioned_table.h b/src/include/catalog/pg_partitioned_table.h index cec54ae62e5..c986428a65a 100644 --- a/src/include/catalog/pg_partitioned_table.h +++ b/src/include/catalog/pg_partitioned_table.h @@ -7,7 +7,7 @@ * * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/include/catalog/pg_partitioned_table.h $ + * src/include/catalog/pg_partitioned_table.h * * NOTES * the genbki.sh script reads this file and generates .bki @@ -29,9 +29,9 @@ CATALOG(pg_partitioned_table,3350) BKI_WITHOUT_OIDS { - Oid partrelid; /* partitioned table oid */ - char partstrat; /* partitioning strategy */ - int16 partnatts; /* number of partition key columns */ + Oid partrelid; /* partitioned table oid */ + char partstrat; /* partitioning strategy */ + int16 partnatts; /* number of partition key columns */ /* * variable-length fields start here, but we allow direct access to @@ -39,29 +39,27 @@ CATALOG(pg_partitioned_table,3350) BKI_WITHOUT_OIDS * field of a heap tuple can be reliably accessed using its C struct * offset, as previous fields are all non-nullable fixed-length fields. */ - int2vector partattrs; /* each member of the array is the - * attribute number of a partition key - * column, or 0 if the column is actually - * an expression */ + int2vector partattrs; /* each member of the array is the attribute + * number of a partition key column, or 0 if + * the column is actually an expression */ #ifdef CATALOG_VARLEN - oidvector partclass; /* operator class to compare keys */ - oidvector partcollation; /* user-specified collation for keys */ - pg_node_tree partexprs; /* list of expressions in the partitioning - * key; one item for each zero entry in - * partattrs[] */ + oidvector partclass; /* operator class to compare keys */ + oidvector partcollation; /* user-specified collation for keys */ + pg_node_tree partexprs; /* list of expressions in the partition key; + * one item for each zero entry in partattrs[] */ #endif } FormData_pg_partitioned_table; /* ---------------- - * Form_pg_partitioned_table corresponds to a pointer to a tuple with - * the format of pg_partitioned_table relation. + * Form_pg_partitioned_table corresponds to a pointer to a tuple with + * the format of pg_partitioned_table relation. * ---------------- */ typedef FormData_pg_partitioned_table *Form_pg_partitioned_table; /* ---------------- - * compiler constants for pg_partitioned_table + * compiler constants for pg_partitioned_table * ---------------- */ #define Natts_pg_partitioned_table 7 @@ -70,7 +68,7 @@ typedef FormData_pg_partitioned_table *Form_pg_partitioned_table; #define Anum_pg_partitioned_table_partnatts 3 #define Anum_pg_partitioned_table_partattrs 4 #define Anum_pg_partitioned_table_partclass 5 -#define Anum_pg_partitioned_table_partcollation 6 +#define Anum_pg_partitioned_table_partcollation 6 #define Anum_pg_partitioned_table_partexprs 7 #endif /* PG_PARTITIONED_TABLE_H */ |