join_search_one_level_tidyup.patch
application/octet-stream
Filename: join_search_one_level_tidyup.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/optimizer/path/joinrels.c | 13 | 24 |
diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c
index 015a0b3cbe..235c26d200 100644
--- a/src/backend/optimizer/path/joinrels.c
+++ b/src/backend/optimizer/path/joinrels.c
@@ -25,8 +25,8 @@
static void make_rels_by_clause_joins(PlannerInfo *root,
RelOptInfo *old_rel,
- List *other_rels_list,
- ListCell *other_rels);
+ List *other_rels,
+ int first_rel_idx);
static void make_rels_by_clauseless_joins(PlannerInfo *root,
RelOptInfo *old_rel,
List *other_rels);
@@ -93,6 +93,8 @@ join_search_one_level(PlannerInfo *root, int level)
if (old_rel->joininfo != NIL || old_rel->has_eclass_joins ||
has_join_restriction(root, old_rel))
{
+ int first_rel;
+
/*
* There are join clauses or join order restrictions relevant to
* this rel, so consider joins between this rel and (only) those
@@ -106,24 +108,12 @@ join_search_one_level(PlannerInfo *root, int level)
* to each initial rel they don't already include but have a join
* clause or restriction with.
*/
- List *other_rels_list;
- ListCell *other_rels;
-
if (level == 2) /* consider remaining initial rels */
- {
- other_rels_list = joinrels[level - 1];
- other_rels = lnext(other_rels_list, r);
- }
- else /* consider all initial rels */
- {
- other_rels_list = joinrels[1];
- other_rels = list_head(other_rels_list);
- }
+ first_rel = foreach_current_index(r) + 1;
+ else
+ first_rel = 0;
- make_rels_by_clause_joins(root,
- old_rel,
- other_rels_list,
- other_rels);
+ make_rels_by_clause_joins(root, old_rel, joinrels[1], first_rel);
}
else
{
@@ -286,9 +276,8 @@ join_search_one_level(PlannerInfo *root, int level)
* automatically ensures that each new joinrel is only added to the list once.
*
* 'old_rel' is the relation entry for the relation to be joined
- * 'other_rels_list': a list containing the other
- * rels to be considered for joining
- * 'other_rels': the first cell to be considered
+ * 'other_rels': a list containing the other rels to be considered for joining
+ * 'first_rel_idx': the first rel to be considered in 'other_rels'
*
* Currently, this is only used with initial rels in other_rels, but it
* will work for joining to joinrels too.
@@ -296,12 +285,12 @@ join_search_one_level(PlannerInfo *root, int level)
static void
make_rels_by_clause_joins(PlannerInfo *root,
RelOptInfo *old_rel,
- List *other_rels_list,
- ListCell *other_rels)
+ List *other_rels,
+ int first_rel_idx)
{
ListCell *l;
- for_each_cell(l, other_rels_list, other_rels)
+ for_each_from(l, other_rels, first_rel_idx)
{
RelOptInfo *other_rel = (RelOptInfo *) lfirst(l);