Changeset: 4e14c8395aa5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4e14c8395aa5
Modified Files:
        sql/server/rel_optimize_sel.c
        sql/test/BugTracker-2026/Tests/All
Branch: pp_hashjoin
Log Message:

improve join2semijoin optimizer


diffs (55 lines):

diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -2504,8 +2504,9 @@ rel_join2semijoin(visitor *v, sql_rel *r
                }
        }
        /* simplify group join returning only columns of left into semijoin */
-       if (0 && is_innerjoin(rel->op) && !list_empty(rel->attr)) { /* TODO 
test if those attr's are distinct ! */
+       if (is_innerjoin(rel->op) && !list_empty(rel->attr)) { /* if those 
attr's are distinct ! */
                int nr = 0;
+               int unique = 0;
                for(node *n = rel->attr->h; n; n = n->next) {
                        sql_exp *e = n->data;
 
@@ -2515,11 +2516,27 @@ rel_join2semijoin(visitor *v, sql_rel *r
                                break;
                        if (e->type == e_column && rel_find_nid(rel->l, e->nid))
                                nr++;
+                       unique += is_unique(e);
                }
-               if (nr == list_length(rel->attr)) {
+               if (nr == list_length(rel->attr) && nr == unique) {
                        rel->op = op_semi;
                        rel->attr = NULL;
                }
+               if (nr == list_length(rel->attr)) { /* join should be on same 
attributes */
+                       for (node *n = rel->exps->h; n; n = n->next) {
+                               sql_exp *je = n->data;
+                               if (je->type != e_cmp || je->flag != cmp_equal)
+                                       return rel;
+                               sql_exp *el = je->l, *er = je->r;
+                               if (!exps_bind_nid(rel->attr, el->nid) && 
!exps_bind_nid(rel->attr, er->nid))
+                                       return rel;
+                       }
+                       rel->op = op_semi;
+                       sql_rel *nr = rel_groupby(v->sql, rel->l, rel->attr);
+                       nr->r = rel->attr;
+                       rel->l = nr;
+                       rel->attr = NULL;
+               }
        }
        return rel;
 }
diff --git a/sql/test/BugTracker-2026/Tests/All 
b/sql/test/BugTracker-2026/Tests/All
--- a/sql/test/BugTracker-2026/Tests/All
+++ b/sql/test/BugTracker-2026/Tests/All
@@ -150,7 +150,7 @@ KNOWNFAIL?7961-list_empty-crash
 KNOWNFAIL?7963-having-sum-or-exists-or-sum-bug
 7964-optimize-limit-0-queries
 KNOWNFAIL?7965-select-1-limit-0-bug
-7966-optimize-select-distinct-from-union-queries
+PIPELINE?7966-optimize-select-distinct-from-union-queries
 7967-optimize-in-select-distinct-queries
 7968-optimize-distinct-from-q1-except-q2
 7969-optimize-distinct-from-q1-intersect-q2
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to