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