From 8c9e1f4d75be114fb4e0878c0624bcb2be37f214 Mon Sep 17 00:00:00 2001 From: jcoleman Date: Fri, 7 May 2021 15:37:22 +0000 Subject: [PATCH v4 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 e419773dcf..93d522b141 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 e3f4214d68..c2276fdfcf 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 a4057ab48c..32ba4a2cb9 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -4096,6 +4096,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. @@ -4293,6 +4294,7 @@ create_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel) * 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. @@ -4647,6 +4649,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 6e5a8b09ca..bcd0bfa580 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -1020,6 +1020,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; @@ -2176,6 +2177,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; } /* @@ -2184,6 +2186,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 20074660e4..486520fe22 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