0002-Special-purpose-generate_join_implied_equalities-imp.patch
application/octet-stream
Filename: 0002-Special-purpose-generate_join_implied_equalities-imp.patch
Type: application/octet-stream
Part: 1
Patch
Format: format-patch
Series: patch 0002
Subject: Special purpose generate_join_implied_equalities implementation
| File | + | − |
|---|---|---|
| src/backend/optimizer/path/equivclass.c | 63 | 5 |
From 5757eaaec4fda492957cb829e9c261e2e7e1ede0 Mon Sep 17 00:00:00 2001
From: "dgrowley@gmail.com" <dgrowley@gmail.com>
Date: Thu, 18 Jul 2019 18:31:25 +1200
Subject: [PATCH 2/2] Special purpose generate_join_implied_equalities
implementation
---
src/backend/optimizer/path/equivclass.c | 68 +++++++++++++++++++++++--
1 file changed, 63 insertions(+), 5 deletions(-)
diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c
index 6e7db4b969..c82d5d97ef 100644
--- a/src/backend/optimizer/path/equivclass.c
+++ b/src/backend/optimizer/path/equivclass.c
@@ -1127,11 +1127,69 @@ 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);
+ List *result = NIL;
+ Relids inner_relids = inner_rel->relids;
+ Relids nominal_inner_relids;
+ Relids nominal_join_relids;
+ Bitmapset * matching_ecs;
+ int i;
+
+ /* If inner rel is a child, extra setup work is needed */
+ if (IS_OTHER_REL(inner_rel))
+ {
+ Assert(!bms_is_empty(inner_rel->top_parent_relids));
+
+ /* Fetch relid set for the topmost parent rel */
+ nominal_inner_relids = inner_rel->top_parent_relids;
+ /* ECs will be marked with the parent's relid, not the child's */
+ nominal_join_relids = bms_union(outer_relids, nominal_inner_relids);
+ }
+ else
+ {
+ nominal_inner_relids = inner_relids;
+ nominal_join_relids = join_relids;
+ }
+
+ /* Get all eclasses in common between inner_relids and join_relids */
+ matching_ecs = get_common_eclass_indexes(root, inner_relids, join_relids);
+
+ i = -1;
+ while ((i = bms_next_member(matching_ecs, i)) >= 0)
+ {
+ EquivalenceClass *ec = (EquivalenceClass *) list_nth(root->eq_classes, i);
+ List *sublist = NIL;
+
+ /* ECs containing consts do not need any further enforcement */
+ if (ec->ec_has_const)
+ continue;
+
+ /* Single-member ECs won't generate any deductions */
+ if (list_length(ec->ec_members) <= 1)
+ continue;
+
+ /* Sanity check that this eclass overlaps the join */
+ Assert(bms_overlap(ec->ec_relids, nominal_join_relids));
+
+ if (!ec->ec_broken)
+ sublist = generate_join_implied_equalities_normal(root,
+ ec,
+ join_relids,
+ outer_relids,
+ inner_relids);
+
+ /* Recover if we failed to generate required derived clauses */
+ if (ec->ec_broken)
+ sublist = generate_join_implied_equalities_broken(root,
+ ec,
+ nominal_join_relids,
+ outer_relids,
+ nominal_inner_relids,
+ inner_rel);
+
+ result = list_concat(result, sublist);
+ }
+
+ return result;
}
/*
--
2.17.1