mt_mergeproj-delta.patch
text/plain
Filename: mt_mergeproj-delta.patch
Type: text/plain
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/executor/execPartition.c | 1 | 6 |
| src/backend/executor/nodeMerge.c | 4 | 6 |
| src/backend/executor/nodeModifyTable.c | 2 | 5 |
| src/include/nodes/execnodes.h | 2 | 2 |
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;