diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 3b130e724f7..a112b4ac119 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -331,6 +331,7 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions,
 	glob->subplans = NIL;
 	glob->subpaths = NIL;
 	glob->subroots = NIL;
+	glob->subplanNames = NIL;
 	glob->rewindPlanIDs = NULL;
 	glob->finalrtable = NIL;
 	glob->allRelids = NULL;
@@ -8837,6 +8838,39 @@ create_partial_unique_paths(PlannerInfo *root, RelOptInfo *input_rel,
 	}
 }
 
+/*
+ * Choose a unique name for some subroot.
+ *
+ * Modifies glob->subplanNames to track names already used.
+ */
+char *
+choose_plan_name(PlannerGlobal *glob, const char *name, bool always_number)
+{
+	size_t		base_len = strlen(name);
+	int			max_suffix = always_number ? 0 : -1;
+	char	   *canon_name;
+
+	foreach_ptr(char, subplan_name, glob->subplanNames)
+	{
+		char	   *last_underscore = strrchr(subplan_name, '_');
+
+		if ((last_underscore - subplan_name) == base_len &&
+			strncmp(subplan_name, name, base_len) == 0)
+		{
+			int			suffix_num = atoi(last_underscore + 1);
+
+			if (suffix_num > max_suffix)
+				max_suffix = suffix_num;
+		}
+	}
+
+	canon_name = psprintf("%s_%u", name, max_suffix + 1);
+	glob->subplanNames = lappend(glob->subplanNames, canon_name);
+
+	return (max_suffix == -1) ? pstrdup(name) : canon_name;
+}
+
+#if 0
 /*
  * Choose a unique name for some subroot.
  *
@@ -8903,3 +8937,4 @@ choose_plan_name(PlannerGlobal *glob, const char *name, bool always_number)
 		pfree(proposed_name);
 	}
 }
+#endif
