Changeset: 2804f1ca791d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2804f1ca791d
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
Branch: Aug2018
Log Message:

In certain cases, have join and select compare NULL as ordinary value.
This fixes bug 6638.


diffs (141 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
@@ -1604,6 +1604,7 @@ rel2bin_hash_lookup(backend *be, sql_rel
        sql_exp *l = e->l;
        stmt *idx = bin_find_column(be, left, l->l, sa_strconcat(sql->sa, "%", 
i->base.name));
        int swap_exp = 0, swap_rel = 0;
+       comp_type comp = cmp_equal;
 
        if (!idx) {
                swap_exp = 1;
@@ -1644,6 +1645,7 @@ rel2bin_hash_lookup(backend *be, sql_rel
 
                        h = stmt_Nop(be, stmt_list(be, list_append( list_append(
                                list_append(sa_list(sql->sa), h), bits), s)), 
xor);
+                       comp = cmp_equal_nil;
                } else {
                        sql_subfunc *hf = sql_bind_func_result(sql->sa, 
sql->session->schema, "hash", tail_type(s), NULL, lng);
 
@@ -1652,12 +1654,12 @@ rel2bin_hash_lookup(backend *be, sql_rel
        }
        if (h && h->nrcols) {
                if (!swap_rel) {
-                       return stmt_join(be, idx, h, 0, cmp_equal);
+                       return stmt_join(be, idx, h, 0, comp);
                } else {
-                       return stmt_join(be, h, idx, 0, cmp_equal);
+                       return stmt_join(be, h, idx, 0, comp);
                }
        } else {
-               return stmt_uselect(be, idx, h, cmp_equal, NULL, 0);
+               return stmt_uselect(be, idx, h, comp, NULL, 0);
        }
 }
 
@@ -1711,7 +1713,7 @@ releqjoin( backend *be, list *l1, list *
        } else { /* need hash */
                l = join_hash_key(be, l1);
                r = join_hash_key(be, l2);
-               res = stmt_join(be, l, r, 0, cmp_op);
+               res = stmt_join(be, l, r, 0, cmp_op == cmp_equal ? 
cmp_equal_nil : cmp_op);
        }
        if (need_left) 
                res->flag = cmp_left;
@@ -3114,7 +3116,7 @@ insert_check_ukey(backend *be, list *ins
                if (s->key && s->nrcols == 0) {
                        s = NULL;
                        if (k->idx && hash_index(k->idx->type))
-                               s = stmt_uselect(be, stmt_idx(be, k->idx, 
dels), idx_inserts, cmp_equal, s, 0);
+                               s = stmt_uselect(be, stmt_idx(be, k->idx, 
dels), idx_inserts, cmp_equal_nil, s, 0);
                        for (m = k->columns->h; m; m = m->next) {
                                sql_kc *c = m->data;
                                stmt *cs = list_fetch(inserts, c->c->colnr); 
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1379,6 +1379,7 @@ stmt_uselect(backend *be, stmt *op1, stm
 
                switch (cmptype) {
                case cmp_equal:
+               case cmp_equal_nil:
                        op = "=";
                        break;
                case cmp_notequal:
@@ -1418,35 +1419,47 @@ stmt_uselect(backend *be, stmt *op1, stm
                k = getDestVar(q);
        } else {
                assert (cmptype != cmp_filter);
-               q = newStmt(mb, algebraRef, thetaselectRef);
-               q = pushArgument(mb, q, l);
-               if (sub)
-                       q = pushArgument(mb, q, sub->nr);
-               q = pushArgument(mb, q, r);
-               switch (cmptype) {
-               case cmp_equal:
-                       q = pushStr(mb, q, anti?"!=":"==");
-                       break;
-               case cmp_notequal:
-                       q = pushStr(mb, q, anti?"==":"!=");
-                       break;
-               case cmp_lt:
-                       q = pushStr(mb, q, anti?">=":"<");
-                       break;
-               case cmp_lte:
-                       q = pushStr(mb, q, anti?">":"<=");
-                       break;
-               case cmp_gt:
-                       q = pushStr(mb, q, anti?"<=":">");
-                       break;
-               case cmp_gte:
-                       q = pushStr(mb, q, anti?"<":">=");
-                       break;
-               default:
-                       showException(GDKout, SQL, "sql", "SQL2MAL: error 
impossible select compare\n");
-                       if (q)
-                               freeInstruction(q);
-                       q = NULL;
+               if (cmptype == cmp_equal_nil) {
+                       q = newStmt(mb, algebraRef, selectRef);
+                       q = pushArgument(mb, q, l);
+                       if (sub)
+                               q = pushArgument(mb, q, sub->nr);
+                       q = pushArgument(mb, q, r);
+                       q = pushArgument(mb, q, r);
+                       q = pushBit(mb, q, TRUE);
+                       q = pushBit(mb, q, TRUE);
+                       q = pushBit(mb, q, anti);
+               } else {
+                       q = newStmt(mb, algebraRef, thetaselectRef);
+                       q = pushArgument(mb, q, l);
+                       if (sub)
+                               q = pushArgument(mb, q, sub->nr);
+                       q = pushArgument(mb, q, r);
+                       switch (cmptype) {
+                       case cmp_equal:
+                               q = pushStr(mb, q, anti?"!=":"==");
+                               break;
+                       case cmp_notequal:
+                               q = pushStr(mb, q, anti?"==":"!=");
+                               break;
+                       case cmp_lt:
+                               q = pushStr(mb, q, anti?">=":"<");
+                               break;
+                       case cmp_lte:
+                               q = pushStr(mb, q, anti?">":"<=");
+                               break;
+                       case cmp_gt:
+                               q = pushStr(mb, q, anti?"<=":">");
+                               break;
+                       case cmp_gte:
+                               q = pushStr(mb, q, anti?"<":">=");
+                               break;
+                       default:
+                               showException(GDKout, SQL, "sql", "SQL2MAL: 
error impossible select compare\n");
+                               if (q)
+                                       freeInstruction(q);
+                               q = NULL;
+                       }
                }
                if (q == NULL)
                        return NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to