Changeset: 0ba6202e9b38 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0ba6202e9b38
Modified Files:
        sql/backends/monet5/rel_bin.c
Branch: groupjoin
Log Message:

optimize (old style) antijoins (ie use diff and joins)


diffs (64 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -3345,6 +3345,7 @@ rel2bin_antijoin(backend *be, sql_rel *r
                sql_exp *e = en->data;
                assert(e->type == e_cmp);
                stmt *ls = exp_bin(be, e->l, left, NULL, NULL, NULL, NULL, 
NULL, 1, 0, 0), *rs;
+               bool constval = false;
                if (!ls) {
                        swap = true;
                        ls = exp_bin(be, e->l, right, NULL, NULL, NULL, NULL, 
NULL, 1, 0, 0);
@@ -3360,23 +3361,26 @@ rel2bin_antijoin(backend *be, sql_rel *r
                        ls = rs;
                        rs = t;
                }
-               if (ls->nrcols == 0)
+               if (ls->nrcols == 0) {
+                       constval = true;
                        ls = stmt_const(be, bin_find_smallest_column(be, left), 
ls);
+               }
                if (rs->nrcols == 0)
                        rs = stmt_const(be, bin_find_smallest_column(be, 
right), rs);
 
                if (!li)
                        li = ls;
 
-               if (!en->next) {
+               if (!en->next && (constval || stmt_has_null(ls) /*|| 
stmt_has_null(rs) (change into check for fk)*/)) {
                        assert(e->flag == cmp_equal);
                        join = stmt_tdiff2(be, ls, rs, NULL);
+                       jexps = NULL;
                } else {
                        join = stmt_join_cand(be, ls, rs, NULL, NULL, 
is_anti(e), (comp_type) e->flag, 0, is_semantics(e), false, true);
                }
                en = en->next;
        }
-       if (en) {
+       if (en || jexps) {
                stmt *jl = stmt_result(be, join, 0);
                stmt *jr = stmt_result(be, join, 1);
                stmt *nulls = NULL;
@@ -3440,11 +3444,13 @@ rel2bin_antijoin(backend *be, sql_rel *r
                        /* recreate join output */
                        jl = stmt_project(be, sel, jl);
                        join = stmt_tdiff(be, c, jl, NULL);
+               } else {
+                       join = stmt_tdiff2(be, c, jl, NULL);
                }
                if (nulls)
                        join = stmt_project(be, join, c);
 
-       } else if (list_empty(jexps)) {
+       } else if (jexps && list_empty(jexps)) {
                stmt *jl = stmt_result(be, join, 0);
                stmt *c = stmt_mirror(be, bin_find_smallest_column(be, left));
                join = stmt_tdiff2(be, c, jl, NULL);
@@ -3672,6 +3678,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
        if (!semijoin_only) {
                c = stmt_mirror(be, bin_find_smallest_column(be, left));
                if (rel->op == op_anti) {
+                       assert(0);
                        join = stmt_tdiff(be, c, jl, lcand);
                } else {
                        if (lcand)
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to