From 6ea3100c3df46ee131ea3d7590eaba378536c320 Mon Sep 17 00:00:00 2001 From: amit Date: Tue, 19 Dec 2017 16:20:09 +0900 Subject: [PATCH 3/4] ExecSetupPartitionTupleRouting refactoring --- src/backend/commands/copy.c | 22 +---------- src/backend/executor/execPartition.c | 69 +++++++++++++++------------------- src/backend/executor/nodeModifyTable.c | 25 +----------- src/include/executor/execPartition.h | 9 +---- 4 files changed, 33 insertions(+), 92 deletions(-) diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 280d449dec..e7fe020fa7 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -2466,12 +2466,6 @@ CopyFrom(CopyState cstate) */ if (cstate->rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { - PartitionDispatch *partition_dispatch_info; - ResultRelInfo **partitions; - TupleConversionMap **partition_tupconv_maps; - TupleTableSlot *partition_tuple_slot; - int num_parted, - num_partitions; ModifyTable *node = makeNode(ModifyTable); /* Just need make this field appear valid. */ @@ -2479,21 +2473,7 @@ CopyFrom(CopyState cstate) mtstate->ps.plan = (Plan *) node; mtstate->ps.state = estate; mtstate->resultRelInfo = resultRelInfo; - ExecSetupPartitionTupleRouting(mtstate, - cstate->rel, - node->nominalRelation, - estate, - &partition_dispatch_info, - &partitions, - &partition_tupconv_maps, - &partition_tuple_slot, - &num_parted, &num_partitions); - mtstate->mt_partition_dispatch_info = partition_dispatch_info; - mtstate->mt_num_dispatch = num_parted; - mtstate->mt_partitions = partitions; - mtstate->mt_num_partitions = num_partitions; - mtstate->mt_partition_tupconv_maps = partition_tupconv_maps; - mtstate->mt_partition_tuple_slot = partition_tuple_slot; + ExecSetupPartitionTupleRouting(mtstate, cstate->rel); /* * If we are capturing transition tuples, they may need to be diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c index a40c174230..a495b165bd 100644 --- a/src/backend/executor/execPartition.c +++ b/src/backend/executor/execPartition.c @@ -41,42 +41,19 @@ static char *ExecBuildSlotPartitionKeyDescription(Relation rel, * ExecSetupPartitionTupleRouting - set up information needed during * tuple routing for partitioned tables * - * Output arguments: - * 'pd' receives an array of PartitionDispatch objects with one entry for - * every partitioned table in the partition tree - * 'partitions' receives an array of ResultRelInfo* objects with one entry for - * every leaf partition in the partition tree - * 'tup_conv_maps' receives an array of TupleConversionMap objects with one - * entry for every leaf partition (required to convert input tuple based - * on the root table's rowtype to a leaf partition's rowtype after tuple - * routing is done) - * 'partition_tuple_slot' receives a standalone TupleTableSlot to be used - * to manipulate any given leaf partition's rowtype after that partition - * is chosen by tuple-routing. - * 'num_parted' receives the number of partitioned tables in the partition - * tree (= the number of entries in the 'pd' output array) - * 'num_partitions' receives the number of leaf partitions in the partition - * tree (= the number of entries in the 'partitions' and 'tup_conv_maps' - * output arrays - * * Note that all the relations in the partition tree are locked using the * RowExclusiveLock mode upon return from this function. */ void -ExecSetupPartitionTupleRouting(ModifyTableState *mtstate, - Relation rel, - Index resultRTindex, - EState *estate, - PartitionDispatch **pd, - ResultRelInfo ***partitions, - TupleConversionMap ***tup_conv_maps, - TupleTableSlot **partition_tuple_slot, - int *num_parted, int *num_partitions) +ExecSetupPartitionTupleRouting(ModifyTableState *mtstate, Relation rel) { TupleDesc tupDesc = RelationGetDescr(rel); List *leaf_parts; ListCell *cell; int i; + EState *estate = mtstate->ps.state; + ModifyTable *node = (ModifyTable *) mtstate->ps.plan; + Index resultRTindex = node->nominalRelation; ResultRelInfo *leaf_part_rri; /* @@ -84,23 +61,35 @@ ExecSetupPartitionTupleRouting(ModifyTableState *mtstate, * partitions. */ (void) find_all_inheritors(RelationGetRelid(rel), RowExclusiveLock, NULL); - *pd = RelationGetPartitionDispatchInfo(rel, num_parted, &leaf_parts); - *num_partitions = list_length(leaf_parts); - *partitions = (ResultRelInfo **) palloc(*num_partitions * - sizeof(ResultRelInfo *)); - *tup_conv_maps = (TupleConversionMap **) palloc0(*num_partitions * - sizeof(TupleConversionMap *)); + mtstate->mt_partition_dispatch_info = + RelationGetPartitionDispatchInfo(rel, + &mtstate->mt_num_dispatch, + &leaf_parts); + mtstate->mt_num_partitions = list_length(leaf_parts); /* + * Allocate an array of ResultRelInfo pointers, but actual + * ResultRelInfo's will be allocated if and when needed. See + * ExecFindPartition where it's done. + */ + mtstate->mt_partitions = (ResultRelInfo **) + palloc0(sizeof(ResultRelInfo *) * + mtstate->mt_num_partitions); + /* Ditto. */ + mtstate->mt_partition_tupconv_maps = + (TupleConversionMap **) + palloc0(sizeof(TupleConversionMap *) * + mtstate->mt_num_partitions); + /* * Initialize an empty slot that will be used to manipulate tuples of any * given partition's rowtype. It is attached to the caller-specified node * (such as ModifyTableState) and released when the node finishes * processing. */ - *partition_tuple_slot = MakeTupleTableSlot(); + mtstate->mt_partition_tuple_slot = MakeTupleTableSlot(); - leaf_part_rri = (ResultRelInfo *) palloc0(*num_partitions * - sizeof(ResultRelInfo)); + leaf_part_rri = (ResultRelInfo *) palloc0(sizeof(ResultRelInfo) * + mtstate->mt_num_partitions); i = 0; foreach(cell, leaf_parts) { @@ -119,8 +108,10 @@ ExecSetupPartitionTupleRouting(ModifyTableState *mtstate, * Save a tuple conversion map to convert a tuple routed to this * partition from the parent's type to the partition's. */ - (*tup_conv_maps)[i] = convert_tuples_by_name(tupDesc, part_tupdesc, - gettext_noop("could not convert row type")); + mtstate->mt_partition_tupconv_maps[i] = + convert_tuples_by_name(tupDesc, + part_tupdesc, + gettext_noop("could not convert row type")); InitResultRelInfo(leaf_part_rri, partrel, @@ -149,7 +140,7 @@ ExecSetupPartitionTupleRouting(ModifyTableState *mtstate, estate->es_leaf_result_relations = lappend(estate->es_leaf_result_relations, leaf_part_rri); - (*partitions)[i] = leaf_part_rri++; + mtstate->mt_partitions[i] = leaf_part_rri++; i++; } } diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index f836dd3703..6a3b171587 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -1942,30 +1942,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) /* Build state for INSERT tuple routing */ if (operation == CMD_INSERT && rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - { - PartitionDispatch *partition_dispatch_info; - ResultRelInfo **partitions; - TupleConversionMap **partition_tupconv_maps; - TupleTableSlot *partition_tuple_slot; - int num_parted, - num_partitions; - - ExecSetupPartitionTupleRouting(mtstate, - rel, - node->nominalRelation, - estate, - &partition_dispatch_info, - &partitions, - &partition_tupconv_maps, - &partition_tuple_slot, - &num_parted, &num_partitions); - mtstate->mt_partition_dispatch_info = partition_dispatch_info; - mtstate->mt_num_dispatch = num_parted; - mtstate->mt_partitions = partitions; - mtstate->mt_num_partitions = num_partitions; - mtstate->mt_partition_tupconv_maps = partition_tupconv_maps; - mtstate->mt_partition_tuple_slot = partition_tuple_slot; - } + ExecSetupPartitionTupleRouting(mtstate, rel); /* * Build state for collecting transition tuples. This requires having a diff --git a/src/include/executor/execPartition.h b/src/include/executor/execPartition.h index 19e3b9d233..c3ddf879b9 100644 --- a/src/include/executor/execPartition.h +++ b/src/include/executor/execPartition.h @@ -50,14 +50,7 @@ typedef struct PartitionDispatchData typedef struct PartitionDispatchData *PartitionDispatch; extern void ExecSetupPartitionTupleRouting(ModifyTableState *mtstate, - Relation rel, - Index resultRTindex, - EState *estate, - PartitionDispatch **pd, - ResultRelInfo ***partitions, - TupleConversionMap ***tup_conv_maps, - TupleTableSlot **partition_tuple_slot, - int *num_parted, int *num_partitions); + Relation rel); extern int ExecFindPartition(ModifyTableState *mtstate, TupleTableSlot *slot); #endif /* EXECPARTITION_H */ -- 2.11.0