diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c index 86596b5a79..936e8e7e5b 100644 --- a/src/backend/executor/execPartition.c +++ b/src/backend/executor/execPartition.c @@ -681,9 +681,6 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, List *matchedActionStates = NIL; List *notMatchedActionStates = NIL; - leaf_part_rri->ri_mergeState->mergeSlot = - ExecInitExtraTupleSlot(estate, NULL); - foreach (l, node->mergeActionList) { MergeAction *action = lfirst_node(MergeAction, l); @@ -713,11 +710,9 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, /* build action projection state */ econtext = mtstate->ps.ps_ExprContext; - ExecSetSlotDescriptor(leaf_part_rri->ri_mergeState->mergeSlot, - action_state->tupDesc); action_state->proj = ExecBuildProjectionInfo(conv_tl, econtext, - leaf_part_rri->ri_mergeState->mergeSlot, + mtstate->mt_mergeproj, &mtstate->ps, partrelDesc); diff --git a/src/backend/executor/nodeMerge.c b/src/backend/executor/nodeMerge.c index fed10db520..560fd5cf91 100644 --- a/src/backend/executor/nodeMerge.c +++ b/src/backend/executor/nodeMerge.c @@ -202,8 +202,7 @@ lmerge_matched:; * Project, no need for any other tasks prior to the * ExecUpdate. */ - ExecSetSlotDescriptor(resultRelInfo->ri_mergeState->mergeSlot, - action->tupDesc); + ExecSetSlotDescriptor(mtstate->mt_mergeproj, action->tupDesc); ExecProject(action->proj); /* @@ -212,7 +211,7 @@ lmerge_matched:; * attribute. */ slot = ExecUpdate(mtstate, tupleid, NULL, - resultRelInfo->ri_mergeState->mergeSlot, + mtstate->mt_mergeproj, slot, epqstate, estate, &tuple_updated, &hufd, action, mtstate->canSetTag); @@ -444,15 +443,14 @@ ExecMergeNotMatched(ModifyTableState *mtstate, EState *estate, * Project, no need for any other tasks prior to the * ExecInsert. */ - ExecSetSlotDescriptor(resultRelInfo->ri_mergeState->mergeSlot, - action->tupDesc); + ExecSetSlotDescriptor(mtstate->mt_mergeproj, action->tupDesc); ExecProject(action->proj); /* * ExecPrepareTupleRouting may modify the passed-in slot. Hence * pass a local reference so that action->slot is not modified. */ - myslot = resultRelInfo->ri_mergeState->mergeSlot; + myslot = mtstate->mt_mergeproj; /* Prepare for tuple routing if needed. */ if (proute) diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 4927bfebfa..2672a581a9 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -2668,8 +2668,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) mtstate->mt_existing = ExecInitExtraTupleSlot(estate, NULL); /* initialise slot for merge actions */ - resultRelInfo->ri_mergeState->mergeSlot = - ExecInitExtraTupleSlot(estate, NULL); + mtstate->mt_mergeproj = ExecInitExtraTupleSlot(estate, NULL); /* * Create a MergeActionState for each action on the mergeActionList @@ -2691,13 +2690,11 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) tupDesc = ExecTypeFromTL((List *) action->targetList, resultRelInfo->ri_RelationDesc->rd_rel->relhasoids); action_state->tupDesc = tupDesc; - ExecSetSlotDescriptor(resultRelInfo->ri_mergeState->mergeSlot, - action_state->tupDesc); /* build action projection state */ action_state->proj = ExecBuildProjectionInfo(action->targetList, econtext, - resultRelInfo->ri_mergeState->mergeSlot, &mtstate->ps, + mtstate->mt_mergeproj, &mtstate->ps, resultRelInfo->ri_RelationDesc->rd_att); /* diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 36885ff888..13a81c88d1 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -369,8 +369,6 @@ typedef struct MergeState List *matchedActionStates; /* List of MERGE NOT MATCHED action states */ List *notMatchedActionStates; - /* Slot for MERGE actions */ - TupleTableSlot *mergeSlot; } MergeState; /* @@ -1065,6 +1063,8 @@ typedef struct ModifyTableState List *mt_excludedtlist; /* the excluded pseudo relation's tlist */ TupleTableSlot *mt_conflproj; /* CONFLICT ... SET ... projection target */ + TupleTableSlot *mt_mergeproj; /* MERGE action projection target */ + /* Tuple-routing support info */ struct PartitionTupleRouting *mt_partition_tuple_routing;