diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index b6751da574..2824da64fe 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -1262,7 +1262,6 @@ InitResultRelInfo(ResultRelInfo *resultRelInfo,
 	resultRelInfo->ri_ChildToRootMap = NULL;
 	resultRelInfo->ri_ChildToRootMapValid = false;
 	resultRelInfo->ri_CopyMultiInsertBuffer = NULL;
-	resultRelInfo->ri_ModifyTableState = NULL;
 }
 
 /*
diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c
index 8e6453aec2..f12707ff35 100644
--- a/src/backend/executor/execPartition.c
+++ b/src/backend/executor/execPartition.c
@@ -1038,13 +1038,6 @@ ExecInitRoutingInfo(ModifyTableState *mtstate,
 
 	Assert(partRelInfo->ri_BatchSize >= 1);
 
-	/*
-	 * If doing batch insert, setup back-link so we can easily find the
-	 * mtstate again.
-	 */
-	if (partRelInfo->ri_BatchSize > 1)
-		partRelInfo->ri_ModifyTableState = mtstate;
-
 	partRelInfo->ri_CopyMultiInsertBuffer = NULL;
 
 	/*
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 9695de85b9..3cc77a60de 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -128,9 +128,11 @@ CreateExecutorState(void)
 	estate->es_result_relations = NULL;
 	estate->es_opened_result_relations = NIL;
 	estate->es_tuple_routing_result_relations = NIL;
-	estate->es_insert_pending_result_relations = NIL;
 	estate->es_trig_target_relations = NIL;
 
+	estate->es_insert_pending_result_relations = NIL;
+	estate->es_insert_pending_modifytables = NIL;
+
 	estate->es_param_list_info = NULL;
 	estate->es_param_exec_vals = NULL;
 
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 271ff2be8e..882ae73c5c 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -858,10 +858,12 @@ ExecInsert(ModifyTableContext *context,
 
 			/*
 			 * If these are the first tuples stored in the buffers, add the
-			 * target rel to the es_insert_pending_result_relations list,
-			 * except in the case where flushing was done above, in which case
-			 * the target rel would already have been added to the list, so no
-			 * need to do this.
+			 * target rel and the mtstate to the
+			 * es_insert_pending_result_relations and
+			 * es_insert_pending_modifytables lists respectively, execpt in
+			 * the case where flushing was done above, in which case they
+			 * would already have been added to the lists, so no need to do
+			 * this.
 			 */
 			if (resultRelInfo->ri_NumSlots == 0 && !flushed)
 			{
@@ -870,6 +872,8 @@ ExecInsert(ModifyTableContext *context,
 				estate->es_insert_pending_result_relations =
 					lappend(estate->es_insert_pending_result_relations,
 							resultRelInfo);
+				estate->es_insert_pending_modifytables =
+					lappend(estate->es_insert_pending_modifytables, mtstate);
 			}
 			Assert(list_member_ptr(estate->es_insert_pending_result_relations,
 								   resultRelInfo));
@@ -1219,12 +1223,14 @@ ExecBatchInsert(ModifyTableState *mtstate,
 static void
 ExecPendingInserts(EState *estate)
 {
-	ListCell   *lc;
+	ListCell   *l1,
+			   *l2;
 
-	foreach(lc, estate->es_insert_pending_result_relations)
+	forboth(l1, estate->es_insert_pending_result_relations,
+			l2, estate->es_insert_pending_modifytables)
 	{
-		ResultRelInfo *resultRelInfo = (ResultRelInfo *) lfirst(lc);
-		ModifyTableState *mtstate = resultRelInfo->ri_ModifyTableState;
+		ResultRelInfo *resultRelInfo = (ResultRelInfo *) lfirst(l1);
+		ModifyTableState *mtstate = (ModifyTableState *) lfirst(l2);
 
 		Assert(mtstate);
 		ExecBatchInsert(mtstate, resultRelInfo,
@@ -1236,7 +1242,9 @@ ExecPendingInserts(EState *estate)
 	}
 
 	list_free(estate->es_insert_pending_result_relations);
+	list_free(estate->es_insert_pending_modifytables);
 	estate->es_insert_pending_result_relations = NIL;
+	estate->es_insert_pending_modifytables = NIL;
 }
 
 /*
@@ -4342,13 +4350,6 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 		}
 		else
 			resultRelInfo->ri_BatchSize = 1;
-
-		/*
-		 * If doing batch insert, setup back-link so we can easily find the
-		 * mtstate again.
-		 */
-		if (resultRelInfo->ri_BatchSize > 1)
-			resultRelInfo->ri_ModifyTableState = mtstate;
 	}
 
 	/*
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index a2008846c6..541fbda5b2 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -571,9 +571,6 @@ typedef struct ResultRelInfo
 	 * one of its ancestors; see ExecCrossPartitionUpdateForeignKey().
 	 */
 	List	   *ri_ancestorResultRels;
-
-	/* for use by nodeModifyTable.c when performing batch-inserts */
-	struct ModifyTableState *ri_ModifyTableState;
 } ResultRelInfo;
 
 /* ----------------
@@ -698,10 +695,11 @@ typedef struct EState
 	struct JitInstrumentation *es_jit_worker_instr;
 
 	/*
-	 * The following list contains ResultRelInfos for foreign tables on which
-	 * batch-inserts are to be executed.
+	 * Lists of ResultRelInfos for foreign tables on which batch-inserts are
+	 * to be executed and owning ModifyTableStates, stored in the same order.
 	 */
 	List	   *es_insert_pending_result_relations;
+	List	   *es_insert_pending_modifytables;
 } EState;
 
 
