mt_mergeproj-delta.patch

text/plain

Filename: mt_mergeproj-delta.patch
Type: text/plain
Part: 0
Message: Re: [HACKERS] MERGE SQL Statement for PG11

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;