aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Vondra <tomas.vondra@postgresql.org>2020-12-15 23:13:38 +0100
committerTomas Vondra <tomas.vondra@postgresql.org>2020-12-15 23:19:41 +0100
commit6bc27698324a3eadb8a4a5a79d96e16687be6141 (patch)
tree6f30c03d872d8fbc10419bec1f206792c7581be9
parentc06d6aa4c35177655e0fd4acaca888a73c3f9845 (diff)
downloadpostgresql-6bc27698324a3eadb8a4a5a79d96e16687be6141.tar.gz
postgresql-6bc27698324a3eadb8a4a5a79d96e16687be6141.zip
Error out when Gather Merge input is not sorted
To build Gather Merge path, the input needs to be sufficiently sorted. Ensuring this is the responsibility of the code constructing the paths, but create_gather_merge_plan tried to handle unsorted paths by adding an explicit Sort. In light of the recent issues related to Incremental Sort, this is rather fragile. Some of the expressions may be volatile or parallel unsafe, in which case we can't add the Sort here. We could do more checks and add the Sort in at least some cases, but it seems cleaner to just error out and make it clear this is a bug in code constructing those paths. Author: James Coleman Reviewed-by: Tomas Vondra Discussion: https://postgr.es/m/CAAaqYe8cK3g5CfLC4w7bs%3DhC0mSksZC%3DH5M8LSchj5e5OxpTAg%40mail.gmail.com Discussion: https://postgr.es/m/CAJGNTeNaxpXgBVcRhJX%2B2vSbq%2BF2kJqGBcvompmpvXb7pq%2BoFA%40mail.gmail.com
-rw-r--r--src/backend/optimizer/plan/createplan.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 40abe6f9f62..5ecf9f40658 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -1793,13 +1793,15 @@ create_gather_merge_plan(PlannerInfo *root, GatherMergePath *best_path)
&gm_plan->nullsFirst);
- /* Now, insert a Sort node if subplan isn't sufficiently ordered */
+ /*
+ * 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.
+ */
if (!pathkeys_contained_in(pathkeys, best_path->subpath->pathkeys))
- subplan = (Plan *) make_sort(subplan, gm_plan->numCols,
- gm_plan->sortColIdx,
- gm_plan->sortOperators,
- gm_plan->collations,
- gm_plan->nullsFirst);
+ elog(ERROR, "gather merge input not sufficiently sorted");
/* Now insert the subplan under GatherMerge. */
gm_plan->plan.lefttree = subplan;