Skip to content

Commit a3699c5

Browse files
committed
Fix incorrect is-this-the-topmost-join tests in parallel planning.
Two callers of generate_useful_gather_paths were testing the wrong thing when deciding whether to call that function: they checked for being at the top of the current join subproblem, rather than being at the actual top join. This'd result in failing to construct parallel paths for a sub-join for which they might be useful. While set_rel_pathlist() isn't actively broken, it seems best to make its identical-in-intention test for this be like the other two. This has been wrong all along, but given the lack of field complaints I'm hesitant to back-patch into stable branches; we usually prefer to avoid non-bug-fix changes in plan choices in minor releases. It seems not too late for v15 though. Richard Guo, reviewed by Antonin Houska and Tom Lane Discussion: https://postgr.es/m/CAMbWs4-mH8Zf87-w+3P2J=nJB+5OyicO28ia9q_9o=Lamf_VHg@mail.gmail.com
1 parent d92f2bc commit a3699c5

File tree

2 files changed

+5
-6
lines changed

2 files changed

+5
-6
lines changed

src/backend/optimizer/geqo/geqo_eval.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ merge_clump(PlannerInfo *root, List *clumps, Clump *new_clump, int num_gene,
273273
* rel once we know the final targetlist (see
274274
* grouping_planner).
275275
*/
276-
if (old_clump->size + new_clump->size < num_gene)
276+
if (!bms_equal(joinrel->relids, root->all_baserels))
277277
generate_useful_gather_paths(root, joinrel, false);
278278

279279
/* Find and save the cheapest paths for this joinrel */

src/backend/optimizer/path/allpaths.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -553,12 +553,11 @@ set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
553553
* its own pool of workers. Instead, we'll consider gathering partial
554554
* paths for the parent appendrel.
555555
*
556-
* Also, if this is the topmost scan/join rel (that is, the only baserel),
557-
* we postpone gathering until the final scan/join targetlist is available
558-
* (see grouping_planner).
556+
* Also, if this is the topmost scan/join rel, we postpone gathering until
557+
* the final scan/join targetlist is available (see grouping_planner).
559558
*/
560559
if (rel->reloptkind == RELOPT_BASEREL &&
561-
bms_membership(root->all_baserels) != BMS_SINGLETON)
560+
!bms_equal(rel->relids, root->all_baserels))
562561
generate_useful_gather_paths(root, rel, false);
563562

564563
/* Now find the cheapest of the paths for this rel */
@@ -3402,7 +3401,7 @@ standard_join_search(PlannerInfo *root, int levels_needed, List *initial_rels)
34023401
* partial paths. We'll do the same for the topmost scan/join rel
34033402
* once we know the final targetlist (see grouping_planner).
34043403
*/
3405-
if (lev < levels_needed)
3404+
if (!bms_equal(rel->relids, root->all_baserels))
34063405
generate_useful_gather_paths(root, rel, false);
34073406

34083407
/* Find and save the cheapest paths for this rel */

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy