diff options
author | Richard Guo <rguo@postgresql.org> | 2024-07-23 11:18:53 +0900 |
---|---|---|
committer | Richard Guo <rguo@postgresql.org> | 2024-07-23 11:18:53 +0900 |
commit | 8b2e9fd26afd9f379ea8bedeb4b11a354c09a3e1 (patch) | |
tree | 8733dd6eb6cf0ad304b88fcd305658a5af4d1720 /src/backend/optimizer/util/pathnode.c | |
parent | 581df2148737fdb0ba6f2d8fda5ceb9d1e6302e6 (diff) | |
download | postgresql-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
Diffstat (limited to 'src/backend/optimizer/util/pathnode.c')
-rw-r--r-- | src/backend/optimizer/util/pathnode.c | 35 |
1 files changed, 12 insertions, 23 deletions
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); |