mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Clean up code, comments, and formatting for table partitioning.
Amit Langote, plus pgindent-ing by me. Inspired in part by review comments from Tomas Vondra.
This commit is contained in:
@ -1887,6 +1887,10 @@ heap_drop_with_catalog(Oid relid)
|
|||||||
|
|
||||||
if (parent)
|
if (parent)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Invalidate the parent's relcache so that the partition is no longer
|
||||||
|
* included in its partition descriptor.
|
||||||
|
*/
|
||||||
CacheInvalidateRelcache(parent);
|
CacheInvalidateRelcache(parent);
|
||||||
heap_close(parent, NoLock); /* keep the lock */
|
heap_close(parent, NoLock); /* keep the lock */
|
||||||
}
|
}
|
||||||
|
@ -1492,7 +1492,7 @@ generate_partition_qual(Relation rel, bool recurse)
|
|||||||
* Construct values[] and isnull[] arrays for the partition key
|
* Construct values[] and isnull[] arrays for the partition key
|
||||||
* of a tuple.
|
* 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
|
* slot Heap tuple from which to extract partition key
|
||||||
* estate executor state for evaluating any partition key
|
* estate executor state for evaluating any partition key
|
||||||
* expressions (must be non-NULL)
|
* expressions (must be non-NULL)
|
||||||
|
@ -1403,31 +1403,28 @@ BeginCopy(ParseState *pstate,
|
|||||||
errmsg("table \"%s\" does not have OIDs",
|
errmsg("table \"%s\" does not have OIDs",
|
||||||
RelationGetRelationName(cstate->rel))));
|
RelationGetRelationName(cstate->rel))));
|
||||||
|
|
||||||
/*
|
/* Initialize state for CopyFrom tuple routing. */
|
||||||
* Initialize state for CopyFrom tuple routing. Watch out for
|
|
||||||
* any foreign partitions.
|
|
||||||
*/
|
|
||||||
if (is_from && rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
if (is_from && rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
||||||
{
|
{
|
||||||
PartitionDispatch *pd;
|
|
||||||
List *leaf_parts;
|
List *leaf_parts;
|
||||||
ListCell *cell;
|
ListCell *cell;
|
||||||
int i,
|
int i,
|
||||||
num_parted,
|
num_parted;
|
||||||
num_leaf_parts;
|
|
||||||
ResultRelInfo *leaf_part_rri;
|
ResultRelInfo *leaf_part_rri;
|
||||||
|
|
||||||
/* Get the tuple-routing information and lock partitions */
|
/* Get the tuple-routing information and lock partitions */
|
||||||
pd = RelationGetPartitionDispatchInfo(rel, RowExclusiveLock,
|
cstate->partition_dispatch_info =
|
||||||
&num_parted, &leaf_parts);
|
RelationGetPartitionDispatchInfo(rel, RowExclusiveLock,
|
||||||
num_leaf_parts = list_length(leaf_parts);
|
&num_parted,
|
||||||
cstate->partition_dispatch_info = pd;
|
&leaf_parts);
|
||||||
cstate->num_dispatch = num_parted;
|
cstate->num_dispatch = num_parted;
|
||||||
cstate->num_partitions = num_leaf_parts;
|
cstate->num_partitions = list_length(leaf_parts);
|
||||||
cstate->partitions = (ResultRelInfo *) palloc(num_leaf_parts *
|
cstate->partitions = (ResultRelInfo *)
|
||||||
|
palloc(cstate->num_partitions *
|
||||||
sizeof(ResultRelInfo));
|
sizeof(ResultRelInfo));
|
||||||
cstate->partition_tupconv_maps = (TupleConversionMap **)
|
cstate->partition_tupconv_maps = (TupleConversionMap **)
|
||||||
palloc0(num_leaf_parts * sizeof(TupleConversionMap *));
|
palloc0(cstate->num_partitions *
|
||||||
|
sizeof(TupleConversionMap *));
|
||||||
|
|
||||||
leaf_part_rri = cstate->partitions;
|
leaf_part_rri = cstate->partitions;
|
||||||
i = 0;
|
i = 0;
|
||||||
@ -1438,8 +1435,8 @@ BeginCopy(ParseState *pstate,
|
|||||||
/*
|
/*
|
||||||
* We locked all the partitions above including the leaf
|
* We locked all the partitions above including the leaf
|
||||||
* partitions. Note that each of the relations in
|
* partitions. Note that each of the relations in
|
||||||
* cstate->partitions will be closed by CopyFrom() after
|
* cstate->partitions will be closed by CopyFrom() after it's
|
||||||
* it's finished with its processing.
|
* finished with its processing.
|
||||||
*/
|
*/
|
||||||
partrel = heap_open(lfirst_oid(cell), NoLock);
|
partrel = heap_open(lfirst_oid(cell), NoLock);
|
||||||
|
|
||||||
@ -1452,7 +1449,8 @@ BeginCopy(ParseState *pstate,
|
|||||||
InitResultRelInfo(leaf_part_rri,
|
InitResultRelInfo(leaf_part_rri,
|
||||||
partrel,
|
partrel,
|
||||||
1, /* dummy */
|
1, /* dummy */
|
||||||
false, /* no partition constraint check */
|
false, /* no partition constraint
|
||||||
|
* check */
|
||||||
0);
|
0);
|
||||||
|
|
||||||
/* Open partition indices */
|
/* Open partition indices */
|
||||||
@ -2486,8 +2484,8 @@ CopyFrom(CopyState cstate)
|
|||||||
* BEFORE/INSTEAD OF triggers, or we need to evaluate volatile default
|
* BEFORE/INSTEAD OF triggers, or we need to evaluate volatile default
|
||||||
* expressions. Such triggers or expressions might query the table we're
|
* expressions. Such triggers or expressions might query the table we're
|
||||||
* inserting to, and act differently if the tuples that have already been
|
* inserting to, and act differently if the tuples that have already been
|
||||||
* processed and prepared for insertion are not there. We also can't
|
* processed and prepared for insertion are not there. We also can't do
|
||||||
* do it if the table is partitioned.
|
* it if the table is partitioned.
|
||||||
*/
|
*/
|
||||||
if ((resultRelInfo->ri_TrigDesc != NULL &&
|
if ((resultRelInfo->ri_TrigDesc != NULL &&
|
||||||
(resultRelInfo->ri_TrigDesc->trig_insert_before_row ||
|
(resultRelInfo->ri_TrigDesc->trig_insert_before_row ||
|
||||||
|
@ -791,8 +791,8 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process the partitioning specification (if any) and store the
|
* Process the partitioning specification (if any) and store the partition
|
||||||
* partition key information into the catalog.
|
* key information into the catalog.
|
||||||
*/
|
*/
|
||||||
if (stmt->partspec)
|
if (stmt->partspec)
|
||||||
{
|
{
|
||||||
@ -1613,8 +1613,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence,
|
|||||||
MaxHeapAttributeNumber)));
|
MaxHeapAttributeNumber)));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In case of a partition, there are no new column definitions, only
|
* In case of a partition, there are no new column definitions, only dummy
|
||||||
* dummy ColumnDefs created for column constraints. We merge these
|
* ColumnDefs created for column constraints. We merge them with the
|
||||||
* constraints inherited from the parent.
|
* constraints inherited from the parent.
|
||||||
*/
|
*/
|
||||||
if (is_partition)
|
if (is_partition)
|
||||||
@ -1704,9 +1704,9 @@ MergeAttributes(List *schema, List *supers, char relpersistence,
|
|||||||
* the parent's relhassubclass field, if its previous children were
|
* the parent's relhassubclass field, if its previous children were
|
||||||
* recently dropped.
|
* recently dropped.
|
||||||
*
|
*
|
||||||
* If the child table is a partition, then we instead grab an exclusive
|
* If the child table is a partition, then we instead grab an
|
||||||
* lock on the parent because its partition descriptor will be changed
|
* exclusive lock on the parent because its partition descriptor will
|
||||||
* by addition of the new partition.
|
* be changed by addition of the new partition.
|
||||||
*/
|
*/
|
||||||
if (!is_partition)
|
if (!is_partition)
|
||||||
relation = heap_openrv(parent, ShareUpdateExclusiveLock);
|
relation = heap_openrv(parent, ShareUpdateExclusiveLock);
|
||||||
@ -1714,8 +1714,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence,
|
|||||||
relation = heap_openrv(parent, AccessExclusiveLock);
|
relation = heap_openrv(parent, AccessExclusiveLock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We do not allow partitioned tables and partitions to participate
|
* We do not allow partitioned tables and partitions to participate in
|
||||||
* in regular inheritance.
|
* regular inheritance.
|
||||||
*/
|
*/
|
||||||
if (relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE &&
|
if (relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE &&
|
||||||
!is_partition)
|
!is_partition)
|
||||||
@ -2030,8 +2030,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence,
|
|||||||
newcollid;
|
newcollid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Partitions have only one parent, so conflict should never
|
* Partitions have only one parent and have no column
|
||||||
* occur
|
* definitions of their own, so conflict should never occur.
|
||||||
*/
|
*/
|
||||||
Assert(!is_partition);
|
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
|
* Now that we have the column definition list for a partition, we can
|
||||||
* check whether the columns referenced in column option specifications
|
* check whether the columns referenced in the column constraint specs
|
||||||
* actually exist. Also, we merge the options into the corresponding
|
* actually exist. Also, we merge the constraints into the corresponding
|
||||||
* column definitions.
|
* column definitions.
|
||||||
*/
|
*/
|
||||||
if (is_partition && list_length(saved_schema) > 0)
|
if (is_partition && list_length(saved_schema) > 0)
|
||||||
@ -2145,8 +2145,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence,
|
|||||||
while (rest != NULL)
|
while (rest != NULL)
|
||||||
{
|
{
|
||||||
ColumnDef *restdef = lfirst(rest);
|
ColumnDef *restdef = lfirst(rest);
|
||||||
ListCell *next = lnext(rest); /* need to save it in case
|
ListCell *next = lnext(rest); /* need to save it in case we
|
||||||
* we delete it */
|
* delete it */
|
||||||
|
|
||||||
if (strcmp(coldef->colname, restdef->colname) == 0)
|
if (strcmp(coldef->colname, restdef->colname) == 0)
|
||||||
{
|
{
|
||||||
@ -5602,8 +5602,8 @@ ATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the table is a range partitioned table, check that the column
|
* If the table is a range partitioned table, check that the column is not
|
||||||
* is not in the partition key.
|
* in the partition key.
|
||||||
*/
|
*/
|
||||||
if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
||||||
{
|
{
|
||||||
@ -8258,9 +8258,9 @@ ATExecDropConstraint(Relation rel, const char *constrName,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In case of a partitioned table, the constraint must be dropped from
|
* In case of a partitioned table, the constraint must be dropped from the
|
||||||
* the partitions too. There is no such thing as NO INHERIT constraints
|
* partitions too. There is no such thing as NO INHERIT constraints in
|
||||||
* in case of partitioned tables.
|
* case of partitioned tables.
|
||||||
*/
|
*/
|
||||||
if (!recurse && rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
if (!recurse && rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
@ -10704,7 +10704,8 @@ CreateInheritance(Relation child_rel, Relation parent_rel)
|
|||||||
/*
|
/*
|
||||||
* Check for duplicates in the list of parents, and determine the highest
|
* 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.
|
* 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
|
* Note: we do not reject the case where the child already inherits from
|
||||||
* the parent indirectly; CREATE TABLE doesn't reject comparable cases.
|
* the parent indirectly; CREATE TABLE doesn't reject comparable cases.
|
||||||
@ -11283,6 +11284,7 @@ RemoveInheritance(Relation child_rel, Relation parent_rel)
|
|||||||
drop_parent_dependency(RelationGetRelid(child_rel),
|
drop_parent_dependency(RelationGetRelid(child_rel),
|
||||||
RelationRelationId,
|
RelationRelationId,
|
||||||
RelationGetRelid(parent_rel));
|
RelationGetRelid(parent_rel));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Post alter hook of this inherits. Since object_access_hook doesn't take
|
* Post alter hook of this inherits. Since object_access_hook doesn't take
|
||||||
* multiple object identifiers, we relay oid of parent relation using
|
* multiple object identifiers, we relay oid of parent relation using
|
||||||
@ -12896,8 +12898,8 @@ ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *partattrs,
|
|||||||
errmsg("functions in partition key expression must be marked IMMUTABLE")));
|
errmsg("functions in partition key expression must be marked IMMUTABLE")));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* While it is not exactly *wrong* for an expression to be
|
* While it is not exactly *wrong* for an expression to be a
|
||||||
* a constant value, it seems better to prevent such input.
|
* constant value, it seems better to prevent such input.
|
||||||
*/
|
*/
|
||||||
if (IsA(expr, Const))
|
if (IsA(expr, Const))
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
@ -12905,9 +12907,9 @@ ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *partattrs,
|
|||||||
errmsg("cannot use constant expression as partition key")));
|
errmsg("cannot use constant expression as partition key")));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* transformPartitionSpec() should have already rejected subqueries,
|
* transformPartitionSpec() should have already rejected
|
||||||
* aggregates, window functions, and SRFs, based on the EXPR_KIND_
|
* subqueries, aggregates, window functions, and SRFs, based
|
||||||
* for partition expressions.
|
* on the EXPR_KIND_ for partition expressions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Cannot have expressions containing whole-row references */
|
/* 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
|
* Check we have a collation iff it's a collatable type. The only
|
||||||
* expected failures here are (1) COLLATE applied to a noncollatable
|
* expected failures here are (1) COLLATE applied to a noncollatable
|
||||||
* type, or (2) partition expression had an unresolved collation.
|
* type, or (2) partition expression had an unresolved collation. But
|
||||||
* But we might as well code this to be a complete consistency check.
|
* we might as well code this to be a complete consistency check.
|
||||||
*/
|
*/
|
||||||
if (type_is_collatable(atttype))
|
if (type_is_collatable(atttype))
|
||||||
{
|
{
|
||||||
@ -13053,8 +13055,8 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
|
|||||||
heap_close(catalog, AccessShareLock);
|
heap_close(catalog, AccessShareLock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prevent circularity by seeing if rel is a partition of attachRel.
|
* Prevent circularity by seeing if rel is a partition of attachRel. (In
|
||||||
* (In particular, this disallows making a rel a partition of itself.)
|
* particular, this disallows making a rel a partition of itself.)
|
||||||
*/
|
*/
|
||||||
childrels = find_all_inheritors(RelationGetRelid(attachRel),
|
childrels = find_all_inheritors(RelationGetRelid(attachRel),
|
||||||
AccessShareLock, NULL);
|
AccessShareLock, NULL);
|
||||||
@ -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
|
* 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
|
* of existing partitions of the parent - note that it does not return on
|
||||||
* on error.
|
* error.
|
||||||
*/
|
*/
|
||||||
check_new_partition_bound(RelationGetRelationName(attachRel), rel,
|
check_new_partition_bound(RelationGetRelationName(attachRel), rel,
|
||||||
cmd->bound);
|
cmd->bound);
|
||||||
@ -13155,8 +13157,8 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
|
|||||||
partConstraint = list_make1(make_ands_explicit(partConstraint));
|
partConstraint = list_make1(make_ands_explicit(partConstraint));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if we can do away with having to scan the table being attached
|
* Check if we can do away with having to scan the table being attached to
|
||||||
* to validate the partition constraint, by *proving* that the existing
|
* validate the partition constraint, by *proving* that the existing
|
||||||
* constraints of the table *imply* the partition predicate. We include
|
* constraints of the table *imply* the partition predicate. We include
|
||||||
* the table's check constraints and NOT NULL constraints in the list of
|
* the table's check constraints and NOT NULL constraints in the list of
|
||||||
* clauses passed to predicate_implied_by().
|
* clauses passed to predicate_implied_by().
|
||||||
@ -13243,14 +13245,14 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
|
|||||||
skip_validate = true;
|
skip_validate = true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We choose to err on the safer side, ie, give up on skipping the
|
* We choose to err on the safer side, ie, give up on skipping the the
|
||||||
* the validation scan, if the partition key column doesn't have
|
* validation scan, if the partition key column doesn't have the NOT
|
||||||
* the NOT NULL constraint and the table is to become a list partition
|
* NULL constraint and the table is to become a list partition that
|
||||||
* that does not accept nulls. In this case, the partition predicate
|
* does not accept nulls. In this case, the partition predicate
|
||||||
* (partConstraint) does include an 'key IS NOT NULL' expression,
|
* (partConstraint) does include an 'key IS NOT NULL' expression,
|
||||||
* however, because of the way predicate_implied_by_simple_clause()
|
* however, because of the way predicate_implied_by_simple_clause() is
|
||||||
* is designed to handle IS NOT NULL predicates in the absence of a
|
* designed to handle IS NOT NULL predicates in the absence of a IS
|
||||||
* IS NOT NULL clause, we cannot rely on just the above proof.
|
* 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
|
* 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
|
* were no NOT NULL constraint defined on the key columns, an error
|
||||||
@ -13299,8 +13301,8 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up to have the table to be scanned to validate the partition
|
* Set up to have the table to be scanned to validate the partition
|
||||||
* constraint (see partConstraint above). If it's a partitioned table,
|
* constraint (see partConstraint above). If it's a partitioned table, we
|
||||||
* we instead schdule its leaf partitions to be scanned instead.
|
* instead schdule its leaf partitions to be scanned instead.
|
||||||
*/
|
*/
|
||||||
if (!skip_validate)
|
if (!skip_validate)
|
||||||
{
|
{
|
||||||
@ -13351,8 +13353,8 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Invalidate the relcache so that the new partition is now included
|
* Invalidate the parent's relcache so that the new partition is now
|
||||||
* in rel's partition descriptor.
|
* included its partition descriptor.
|
||||||
*/
|
*/
|
||||||
CacheInvalidateRelcache(rel);
|
CacheInvalidateRelcache(rel);
|
||||||
|
|
||||||
@ -13414,8 +13416,8 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
|
|||||||
heap_close(classRel, RowExclusiveLock);
|
heap_close(classRel, RowExclusiveLock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Invalidate the relcache so that the partition is no longer included
|
* Invalidate the parent's relcache so that the partition is no longer
|
||||||
* in our partition descriptor.
|
* included in its partition descriptor.
|
||||||
*/
|
*/
|
||||||
CacheInvalidateRelcache(rel);
|
CacheInvalidateRelcache(rel);
|
||||||
|
|
||||||
|
@ -1718,26 +1718,26 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
|||||||
if (operation == CMD_INSERT &&
|
if (operation == CMD_INSERT &&
|
||||||
rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
||||||
{
|
{
|
||||||
PartitionDispatch *pd;
|
|
||||||
int i,
|
int i,
|
||||||
j,
|
j,
|
||||||
num_parted,
|
num_parted;
|
||||||
num_leaf_parts;
|
|
||||||
List *leaf_parts;
|
List *leaf_parts;
|
||||||
ListCell *cell;
|
ListCell *cell;
|
||||||
ResultRelInfo *leaf_part_rri;
|
ResultRelInfo *leaf_part_rri;
|
||||||
|
|
||||||
/* Form the partition node tree and lock partitions */
|
/* Get the tuple-routing information and lock partitions */
|
||||||
pd = RelationGetPartitionDispatchInfo(rel, RowExclusiveLock,
|
mtstate->mt_partition_dispatch_info =
|
||||||
&num_parted, &leaf_parts);
|
RelationGetPartitionDispatchInfo(rel, RowExclusiveLock,
|
||||||
mtstate->mt_partition_dispatch_info = pd;
|
&num_parted,
|
||||||
|
&leaf_parts);
|
||||||
mtstate->mt_num_dispatch = num_parted;
|
mtstate->mt_num_dispatch = num_parted;
|
||||||
num_leaf_parts = list_length(leaf_parts);
|
mtstate->mt_num_partitions = list_length(leaf_parts);
|
||||||
mtstate->mt_num_partitions = num_leaf_parts;
|
|
||||||
mtstate->mt_partitions = (ResultRelInfo *)
|
mtstate->mt_partitions = (ResultRelInfo *)
|
||||||
palloc0(num_leaf_parts * sizeof(ResultRelInfo));
|
palloc0(mtstate->mt_num_partitions *
|
||||||
|
sizeof(ResultRelInfo));
|
||||||
mtstate->mt_partition_tupconv_maps = (TupleConversionMap **)
|
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;
|
leaf_part_rri = mtstate->mt_partitions;
|
||||||
i = j = 0;
|
i = j = 0;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
* Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
|
* 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
|
* NOTES
|
||||||
* the genbki.sh script reads this file and generates .bki
|
* the genbki.sh script reads this file and generates .bki
|
||||||
@ -39,17 +39,15 @@ CATALOG(pg_partitioned_table,3350) BKI_WITHOUT_OIDS
|
|||||||
* field of a heap tuple can be reliably accessed using its C struct
|
* field of a heap tuple can be reliably accessed using its C struct
|
||||||
* offset, as previous fields are all non-nullable fixed-length fields.
|
* offset, as previous fields are all non-nullable fixed-length fields.
|
||||||
*/
|
*/
|
||||||
int2vector partattrs; /* each member of the array is the
|
int2vector partattrs; /* each member of the array is the attribute
|
||||||
* attribute number of a partition key
|
* number of a partition key column, or 0 if
|
||||||
* column, or 0 if the column is actually
|
* the column is actually an expression */
|
||||||
* an expression */
|
|
||||||
|
|
||||||
#ifdef CATALOG_VARLEN
|
#ifdef CATALOG_VARLEN
|
||||||
oidvector partclass; /* operator class to compare keys */
|
oidvector partclass; /* operator class to compare keys */
|
||||||
oidvector partcollation; /* user-specified collation for keys */
|
oidvector partcollation; /* user-specified collation for keys */
|
||||||
pg_node_tree partexprs; /* list of expressions in the partitioning
|
pg_node_tree partexprs; /* list of expressions in the partition key;
|
||||||
* key; one item for each zero entry in
|
* one item for each zero entry in partattrs[] */
|
||||||
* partattrs[] */
|
|
||||||
#endif
|
#endif
|
||||||
} FormData_pg_partitioned_table;
|
} FormData_pg_partitioned_table;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user