]> granicus.if.org Git - postgresql/commitdiff
Set correct cost data in Gather node added by force_parallel_mode.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 3 Jul 2016 19:35:29 +0000 (15:35 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 3 Jul 2016 19:35:29 +0000 (15:35 -0400)
We were just leaving the cost fields zeroes, which produces obviously bogus
output with force_parallel_mode = on.  With force_parallel_mode = regress,
the zeroes are hidden, but I wonder if they wouldn't still confuse add-on
code such as auto_explain.

src/backend/optimizer/plan/planner.c

index ddf1109de76f4a75601af0d2721f13aa3a8ee5c0..796f564e4f88e608c6bf86c60c389911a5a2078e 100644 (file)
@@ -343,7 +343,22 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
                gather->num_workers = 1;
                gather->single_copy = true;
                gather->invisible = (force_parallel_mode == FORCE_PARALLEL_REGRESS);
+
+               /*
+                * Ideally we'd use cost_gather here, but setting up dummy path data
+                * to satisfy it doesn't seem much cleaner than knowing what it does.
+                */
+               gather->plan.startup_cost = top_plan->startup_cost +
+                       parallel_setup_cost;
+               gather->plan.total_cost = top_plan->total_cost +
+                       parallel_setup_cost + parallel_tuple_cost * top_plan->plan_rows;
+               gather->plan.plan_rows = top_plan->plan_rows;
+               gather->plan.plan_width = top_plan->plan_width;
+               gather->plan.parallel_aware = false;
+
+               /* use parallel mode for parallel plans. */
                root->glob->parallelModeNeeded = true;
+
                top_plan = &gather->plan;
        }