diff options
Diffstat (limited to 'src/backend/optimizer/path/equivclass.c')
-rw-r--r-- | src/backend/optimizer/path/equivclass.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 49fc43bf167..bfa0c650687 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -988,7 +988,7 @@ generate_base_implied_equalities_broken(PlannerInfo *root, * * join_relids should always equal bms_union(outer_relids, inner_rel->relids). * We could simplify this function's API by computing it internally, but in - * all current uses, the caller has the value at hand anyway. + * most current uses, the caller has the value at hand anyway. */ List * generate_join_implied_equalities(PlannerInfo *root, @@ -996,6 +996,24 @@ generate_join_implied_equalities(PlannerInfo *root, Relids outer_relids, RelOptInfo *inner_rel) { + return generate_join_implied_equalities_for_ecs(root, + root->eq_classes, + join_relids, + outer_relids, + inner_rel); +} + +/* + * generate_join_implied_equalities_for_ecs + * As above, but consider only the listed ECs. + */ +List * +generate_join_implied_equalities_for_ecs(PlannerInfo *root, + List *eclasses, + Relids join_relids, + Relids outer_relids, + RelOptInfo *inner_rel) +{ List *result = NIL; Relids inner_relids = inner_rel->relids; Relids nominal_inner_relids; @@ -1016,7 +1034,7 @@ generate_join_implied_equalities(PlannerInfo *root, nominal_join_relids = join_relids; } - foreach(lc, root->eq_classes) + foreach(lc, eclasses) { EquivalenceClass *ec = (EquivalenceClass *) lfirst(lc); List *sublist = NIL; |