From ac93b6513dfd3fd066cbbe51eced2bc00146f0c0 Mon Sep 17 00:00:00 2001
From: jcoleman <jtc331@gmail.com>
Date: Fri, 7 May 2021 15:37:22 +0000
Subject: [PATCH v1 3/3] Other places to consider for completeness

---
 src/backend/optimizer/path/allpaths.c  | 4 ++++
 src/backend/optimizer/plan/planmain.c  | 2 +-
 src/backend/optimizer/plan/planner.c   | 3 +++
 src/backend/optimizer/plan/subselect.c | 3 +++
 src/backend/optimizer/prep/prepunion.c | 2 ++
 5 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c
index ae744da135..5696a54b18 100644
--- a/src/backend/optimizer/path/allpaths.c
+++ b/src/backend/optimizer/path/allpaths.c
@@ -1142,6 +1142,8 @@ set_append_rel_size(PlannerInfo *root, RelOptInfo *rel,
 		 */
 		if (!childrel->consider_parallel)
 			rel->consider_parallel = false;
+		if (!childrel->consider_parallel_rechecking_params)
+			rel->consider_parallel_rechecking_params = false;
 
 		/*
 		 * Accumulate size information from each live child.
@@ -1263,6 +1265,8 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
 		 */
 		if (!rel->consider_parallel)
 			childrel->consider_parallel = false;
+		if (!childrel->consider_parallel_rechecking_params)
+			rel->consider_parallel_rechecking_params = false;
 
 		/*
 		 * Compute the child's access paths.
diff --git a/src/backend/optimizer/plan/planmain.c b/src/backend/optimizer/plan/planmain.c
index bdbce2b87d..5135f9ee97 100644
--- a/src/backend/optimizer/plan/planmain.c
+++ b/src/backend/optimizer/plan/planmain.c
@@ -119,7 +119,7 @@ query_planner(PlannerInfo *root,
 				if (root->glob->parallelModeOK &&
 					force_parallel_mode != FORCE_PARALLEL_OFF)
 					final_rel->consider_parallel =
-						is_parallel_safe(root, parse->jointree->quals, NULL);
+						is_parallel_safe(root, parse->jointree->quals, &final_rel->consider_parallel_rechecking_params);
 
 				/*
 				 * The only path for it is a trivial Result path.  We cheat a
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 28b8f7d8b5..fb35cd78d1 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -4088,6 +4088,7 @@ create_window_paths(PlannerInfo *root,
 	if (input_rel->consider_parallel && output_target_parallel_safe &&
 		is_parallel_safe(root, (Node *) activeWindows, NULL))
 		window_rel->consider_parallel = true;
+	/* consider_parallel_rechecking_params */
 
 	/*
 	 * If the input rel belongs to a single FDW, so does the window rel.
@@ -4292,6 +4293,7 @@ create_distinct_paths(PlannerInfo *root,
 	 * expressions are parallel-safe.
 	 */
 	distinct_rel->consider_parallel = input_rel->consider_parallel;
+	distinct_rel->consider_parallel_rechecking_params = input_rel->consider_parallel_rechecking_params;
 
 	/*
 	 * If the input rel belongs to a single FDW, so does the distinct_rel.
@@ -4493,6 +4495,7 @@ create_ordered_paths(PlannerInfo *root,
 	 */
 	if (input_rel->consider_parallel && target_parallel_safe)
 		ordered_rel->consider_parallel = true;
+	/* consider_parallel_rechecking_params */
 
 	/*
 	 * If the input rel belongs to a single FDW, so does the ordered_rel.
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index fd1cfe6c73..0c6fbf16a2 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -1022,6 +1022,7 @@ SS_process_ctes(PlannerInfo *root)
 		 * parallel-safe.
 		 */
 		splan->parallel_safe = false;
+		splan->parallel_safe_ignoring_params = false;
 		splan->setParam = NIL;
 		splan->parParam = NIL;
 		splan->args = NIL;
@@ -2178,6 +2179,7 @@ SS_charge_for_initplans(PlannerInfo *root, RelOptInfo *final_rel)
 		path->startup_cost += initplan_cost;
 		path->total_cost += initplan_cost;
 		path->parallel_safe = false;
+		path->parallel_safe_ignoring_params = false;
 	}
 
 	/*
@@ -2186,6 +2188,7 @@ SS_charge_for_initplans(PlannerInfo *root, RelOptInfo *final_rel)
 	 */
 	final_rel->partial_pathlist = NIL;
 	final_rel->consider_parallel = false;
+	final_rel->consider_parallel_rechecking_params = false;
 
 	/* We needn't do set_cheapest() here, caller will do it */
 }
diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c
index a57bc1c2a8..c535131144 100644
--- a/src/backend/optimizer/prep/prepunion.c
+++ b/src/backend/optimizer/prep/prepunion.c
@@ -273,6 +273,7 @@ recurse_set_operations(Node *setOp, PlannerInfo *root,
 		 */
 		final_rel = fetch_upper_rel(subroot, UPPERREL_FINAL, NULL);
 		rel->consider_parallel = final_rel->consider_parallel;
+		rel->consider_parallel_rechecking_params = final_rel->consider_parallel_rechecking_params;
 
 		/*
 		 * For the moment, we consider only a single Path for the subquery.
@@ -617,6 +618,7 @@ generate_union_paths(SetOperationStmt *op, PlannerInfo *root,
 	result_rel = fetch_upper_rel(root, UPPERREL_SETOP, relids);
 	result_rel->reltarget = create_pathtarget(root, tlist);
 	result_rel->consider_parallel = consider_parallel;
+	/* consider_parallel_rechecking_params */
 
 	/*
 	 * Append the child results together.
-- 
2.20.1

