aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/geqo/geqo_eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/geqo/geqo_eval.c')
-rw-r--r--src/backend/optimizer/geqo/geqo_eval.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/backend/optimizer/geqo/geqo_eval.c b/src/backend/optimizer/geqo/geqo_eval.c
index 0be2a73e05b..3ef7d7d8aa2 100644
--- a/src/backend/optimizer/geqo/geqo_eval.c
+++ b/src/backend/optimizer/geqo/geqo_eval.c
@@ -40,7 +40,7 @@ typedef struct
} Clump;
static List *merge_clump(PlannerInfo *root, List *clumps, Clump *new_clump,
- bool force);
+ int num_gene, bool force);
static bool desirable_join(PlannerInfo *root,
RelOptInfo *outer_rel, RelOptInfo *inner_rel);
@@ -196,7 +196,7 @@ gimme_tree(PlannerInfo *root, Gene *tour, int num_gene)
cur_clump->size = 1;
/* Merge it into the clumps list, using only desirable joins */
- clumps = merge_clump(root, clumps, cur_clump, false);
+ clumps = merge_clump(root, clumps, cur_clump, num_gene, false);
}
if (list_length(clumps) > 1)
@@ -210,7 +210,7 @@ gimme_tree(PlannerInfo *root, Gene *tour, int num_gene)
{
Clump *clump = (Clump *) lfirst(lc);
- fclumps = merge_clump(root, fclumps, clump, true);
+ fclumps = merge_clump(root, fclumps, clump, num_gene, true);
}
clumps = fclumps;
}
@@ -235,7 +235,8 @@ gimme_tree(PlannerInfo *root, Gene *tour, int num_gene)
* "desirable" joins.
*/
static List *
-merge_clump(PlannerInfo *root, List *clumps, Clump *new_clump, bool force)
+merge_clump(PlannerInfo *root, List *clumps, Clump *new_clump, int num_gene,
+ bool force)
{
ListCell *prev;
ListCell *lc;
@@ -267,8 +268,14 @@ merge_clump(PlannerInfo *root, List *clumps, Clump *new_clump, bool force)
/* Create paths for partitionwise joins. */
generate_partitionwise_join_paths(root, joinrel);
- /* Create GatherPaths for any useful partial paths for rel */
- generate_gather_paths(root, joinrel, false);
+ /*
+ * Except for the topmost scan/join rel, consider gathering
+ * partial paths. We'll do the same for the topmost scan/join
+ * rel once we know the final targetlist (see
+ * grouping_planner).
+ */
+ if (old_clump->size + new_clump->size < num_gene)
+ generate_gather_paths(root, joinrel, false);
/* Find and save the cheapest paths for this joinrel */
set_cheapest(joinrel);
@@ -286,7 +293,7 @@ merge_clump(PlannerInfo *root, List *clumps, Clump *new_clump, bool force)
* others. When no further merge is possible, we'll reinsert
* it into the list.
*/
- return merge_clump(root, clumps, old_clump, force);
+ return merge_clump(root, clumps, old_clump, num_gene, force);
}
}
prev = lc;