aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guo <rguo@postgresql.org>2024-07-23 11:18:53 +0900
committerRichard Guo <rguo@postgresql.org>2024-07-23 11:18:53 +0900
commit8b2e9fd26afd9f379ea8bedeb4b11a354c09a3e1 (patch)
tree8733dd6eb6cf0ad304b88fcd305658a5af4d1720
parent581df2148737fdb0ba6f2d8fda5ceb9d1e6302e6 (diff)
downloadpostgresql-8b2e9fd26afd9f379ea8bedeb4b11a354c09a3e1.tar.gz
postgresql-8b2e9fd26afd9f379ea8bedeb4b11a354c09a3e1.zip
Remove redundant code in create_gather_merge_path
In create_gather_merge_path, we should always guarantee that the subpath is adequately ordered, and we do not add a Sort node in createplan.c for a Gather Merge node. Therefore, the 'else' branch in create_gather_merge_path, which computes the cost for a Sort node, is redundant. This patch removes the redundant code and emits an error if the subpath is not sufficiently ordered. Meanwhile, this patch changes the check for the subpath's pathkeys in create_gather_merge_plan to an Assert. Author: Richard Guo Discussion: https://postgr.es/m/CAMbWs48u=0bWf3epVtULjJ-=M9Hbkz+ieZQAOS=BfbXZFqbDCg@mail.gmail.com
-rw-r--r--src/backend/optimizer/plan/createplan.c9
-rw-r--r--src/backend/optimizer/util/pathnode.c35
2 files changed, 14 insertions, 30 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 6b64c4a362d..fe5a323cfd7 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -1987,16 +1987,11 @@ create_gather_merge_plan(PlannerInfo *root, GatherMergePath *best_path)
&gm_plan->collations,
&gm_plan->nullsFirst);
-
/*
* All gather merge paths should have already guaranteed the necessary
- * sort order either by adding an explicit sort node or by using presorted
- * input. We can't simply add a sort here on additional pathkeys, because
- * we can't guarantee the sort would be safe. For example, expressions may
- * be volatile or otherwise parallel unsafe.
+ * sort order. See create_gather_merge_path.
*/
- if (!pathkeys_contained_in(pathkeys, best_path->subpath->pathkeys))
- elog(ERROR, "gather merge input not sufficiently sorted");
+ Assert(pathkeys_contained_in(pathkeys, best_path->subpath->pathkeys));
/* Now insert the subplan under GatherMerge. */
gm_plan->plan.lefttree = subplan;
diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c
index d1c4e1a6aa7..b8b1eae295e 100644
--- a/src/backend/optimizer/util/pathnode.c
+++ b/src/backend/optimizer/util/pathnode.c
@@ -1889,6 +1889,16 @@ create_gather_merge_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath,
Assert(subpath->parallel_safe);
Assert(pathkeys);
+ /*
+ * The subpath should guarantee that it is adequately ordered either by
+ * adding an explicit sort node or by using presorted input. We cannot
+ * add an explicit Sort node for the subpath in createplan.c on additional
+ * pathkeys, because we can't guarantee the sort would be safe. For
+ * example, expressions may be volatile or otherwise parallel unsafe.
+ */
+ if (!pathkeys_contained_in(pathkeys, subpath->pathkeys))
+ elog(ERROR, "gather merge input not sufficiently sorted");
+
pathnode->path.pathtype = T_GatherMerge;
pathnode->path.parent = rel;
pathnode->path.param_info = get_baserel_parampathinfo(root, rel,
@@ -1900,29 +1910,8 @@ create_gather_merge_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath,
pathnode->path.pathkeys = pathkeys;
pathnode->path.pathtarget = target ? target : rel->reltarget;
- if (pathkeys_contained_in(pathkeys, subpath->pathkeys))
- {
- /* Subpath is adequately ordered, we won't need to sort it */
- input_startup_cost += subpath->startup_cost;
- input_total_cost += subpath->total_cost;
- }
- else
- {
- /* We'll need to insert a Sort node, so include cost for that */
- Path sort_path; /* dummy for result of cost_sort */
-
- cost_sort(&sort_path,
- root,
- pathkeys,
- subpath->total_cost,
- subpath->rows,
- subpath->pathtarget->width,
- 0.0,
- work_mem,
- -1);
- input_startup_cost += sort_path.startup_cost;
- input_total_cost += sort_path.total_cost;
- }
+ input_startup_cost += subpath->startup_cost;
+ input_total_cost += subpath->total_cost;
cost_gather_merge(pathnode, root, rel, pathnode->path.param_info,
input_startup_cost, input_total_cost, rows);