From 345b2dcf070bd8fbccde643b1b2856027623e9e5 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 4 Jan 2017 13:05:29 -0500 Subject: Move partition_tuple_slot out of EState. Commit 2ac3ef7a01df859c62d0a02333b646d65eaec5ff added a TupleTapleSlot for partition tuple slot to EState (es_partition_tuple_slot) but it's more logical to have it as part of ModifyTableState (mt_partition_tuple_slot) and CopyState (partition_tuple_slot). Discussion: http://postgr.es/m/1bd459d9-4c0c-197a-346e-e5e59e217d97@lab.ntt.co.jp Amit Langote, per a gripe from me --- src/backend/executor/execMain.c | 12 ++++++++++++ src/backend/executor/nodeModifyTable.c | 17 ++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) (limited to 'src/backend/executor') diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 7e3c207018f..eb9b528c4e4 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -3012,6 +3012,9 @@ EvalPlanQualEnd(EPQState *epqstate) * 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 @@ -3026,6 +3029,7 @@ ExecSetupPartitionTupleRouting(Relation rel, PartitionDispatch **pd, ResultRelInfo **partitions, TupleConversionMap ***tup_conv_maps, + TupleTableSlot **partition_tuple_slot, int *num_parted, int *num_partitions) { TupleDesc tupDesc = RelationGetDescr(rel); @@ -3043,6 +3047,14 @@ ExecSetupPartitionTupleRouting(Relation rel, *tup_conv_maps = (TupleConversionMap **) palloc0(*num_partitions * sizeof(TupleConversionMap *)); + /* + * 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(); + leaf_part_rri = *partitions; i = 0; foreach(cell, leaf_parts) diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index c7dd148944e..aa364707f8d 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -329,7 +329,7 @@ ExecInsert(ModifyTableState *mtstate, * Use the dedicated slot for that. */ oldslot = slot; - slot = estate->es_partition_tuple_slot; + slot = mtstate->mt_partition_tuple_slot; Assert(slot != NULL); ExecSetSlotDescriptor(slot, RelationGetDescr(partrel)); ExecStoreTuple(tuple, slot, InvalidBuffer, true); @@ -1738,6 +1738,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) PartitionDispatch *partition_dispatch_info; ResultRelInfo *partitions; TupleConversionMap **partition_tupconv_maps; + TupleTableSlot *partition_tuple_slot; int num_parted, num_partitions; @@ -1745,21 +1746,15 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) &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; - - /* - * Initialize a dedicated slot to manipulate tuples of any given - * partition's rowtype. - */ - estate->es_partition_tuple_slot = ExecInitExtraTupleSlot(estate); + mtstate->mt_partition_tuple_slot = partition_tuple_slot; } - else - estate->es_partition_tuple_slot = NULL; /* * Initialize any WITH CHECK OPTION constraints if needed. @@ -2100,6 +2095,10 @@ ExecEndModifyTable(ModifyTableState *node) heap_close(resultRelInfo->ri_RelationDesc, NoLock); } + /* Release the standalone partition tuple descriptor, if any */ + if (node->mt_partition_tuple_slot) + ExecDropSingleTupleTableSlot(node->mt_partition_tuple_slot); + /* * Free the exprcontext */ -- cgit v1.2.3