v1-0001-Fix-generate_orderedappend_paths.patch
application/octet-stream
Filename: v1-0001-Fix-generate_orderedappend_paths.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v1-0001
Subject: Fix generate_orderedappend_paths()
| File | + | − |
|---|---|---|
| src/backend/optimizer/path/allpaths.c | 19 | 10 |
From 7e7648759078ec4a7b024e5ed29771c45e6d1b9f Mon Sep 17 00:00:00 2001 From: Richard Guo <guofenglinux@gmail.com> Date: Mon, 3 Nov 2025 21:43:28 +0900 Subject: [PATCH v1] Fix generate_orderedappend_paths() --- src/backend/optimizer/path/allpaths.c | 29 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 9c6436eb72f..ad813f3c6d2 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -1810,9 +1810,11 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, * We generate a path for each ordering (pathkey list) appearing in * all_child_pathkeys. * - * We consider both cheapest-startup and cheapest-total cases, ie, for each - * interesting ordering, collect all the cheapest startup subpaths and all the - * cheapest total paths, and build a suitable path for each case. + * We consider the cheapest-startup and cheapest-total cases, and also the + * cheapest-fractional case when not all tuples need to be retrieved. For each + * interesting ordering, we collect all the cheapest startup subpaths, all the + * cheapest total paths, and, if applicable, all the cheapest fractional paths, + * and build a suitable path for each case. * * We don't currently generate any parameterized ordered paths here. While * it would not take much more code here to do so, it's very unclear that it @@ -1875,6 +1877,7 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, List *total_subpaths = NIL; List *fractional_subpaths = NIL; bool startup_neq_total = false; + bool fraction_neq_total = false; bool match_partition_order; bool match_partition_order_desc; int end_index; @@ -1980,11 +1983,11 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, * Merge Append considers only live children relations. Dummy * relations must be filtered out before. */ - Assert(childrel->rows > 0); + Assert(cheapest_total->rows > 0); /* Convert absolute limit to a path fraction */ if (path_fraction >= 1.0) - path_fraction /= childrel->rows; + path_fraction /= cheapest_total->rows; cheapest_fractional = get_cheapest_fractional_path_for_pathkeys(childrel->pathlist, @@ -1999,15 +2002,21 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, * XXX We might consider partially sorted paths too (with an * incremental sort on top). But we'd have to build all the * incremental paths, do the costing etc. + * + * Also, notice whether we actually have different paths for + * the "fractional" and "total" cases. This helps avoid + * generating two identical ordered append paths. */ - if (!cheapest_fractional) + if (cheapest_fractional == NULL) cheapest_fractional = cheapest_total; + else if (cheapest_fractional != cheapest_total) + fraction_neq_total = true; } /* * Notice whether we actually have different paths for the - * "cheapest" and "total" cases; frequently there will be no point - * in two create_merge_append_path() calls. + * "cheapest" and "total" cases. This helps avoid generating two + * identical ordered append paths. */ if (cheapest_startup != cheapest_total) startup_neq_total = true; @@ -2078,7 +2087,7 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, false, -1)); - if (fractional_subpaths) + if (fractional_subpaths && fraction_neq_total) add_path(rel, (Path *) create_append_path(root, rel, fractional_subpaths, @@ -2104,7 +2113,7 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, pathkeys, NULL)); - if (fractional_subpaths) + if (fractional_subpaths && fraction_neq_total) add_path(rel, (Path *) create_merge_append_path(root, rel, fractional_subpaths, -- 2.39.5 (Apple Git-154)