aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/path/equivclass.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/path/equivclass.c')
-rw-r--r--src/backend/optimizer/path/equivclass.c22
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;