Changeset: 131439ac0d89 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=131439ac0d89
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_statement.c
sql/backends/monet5/sql_statement.h
sql/include/sql_catalog.h
sql/include/sql_relation.h
sql/server/rel_dump.c
sql/server/rel_exp.c
sql/server/rel_unnest.c
sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
sql/test/BugTracker-2018/Tests/local_replica_table_not_detected.Bug-6620.stable.out
sql/test/analytics/Tests/analytics13.stable.out
Branch: default
Log Message:
merged with linear-hashing
diffs (truncated from 1040 to 300 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
@@ -332,7 +332,7 @@ handle_in_exps(backend *be, sql_exp *ce,
if (sel)
s = stmt_uselect(be,
stmt_const(be, bin_first_column(be, left), s),
- stmt_bool(be, 1), cmp_equal, sel, 0);
+ stmt_bool(be, 1), cmp_equal, sel, 0, 0);
} else if (list_length(nl) < 16) {
comp_type cmp = (in)?cmp_equal:cmp_notequal;
@@ -345,13 +345,13 @@ handle_in_exps(backend *be, sql_exp *ce,
return NULL;
if (in) {
- i = stmt_uselect(be, c, i, cmp, sel, 0);
+ i = stmt_uselect(be, c, i, cmp, sel, 0, 0);
if (s)
s = stmt_tunion(be, s, i);
else
s = i;
} else {
- s = stmt_uselect(be, c, i, cmp, s, 0);
+ s = stmt_uselect(be, c, i, cmp, s, 0, 0);
}
}
} else {
@@ -369,7 +369,7 @@ handle_in_exps(backend *be, sql_exp *ce,
s = stmt_project(be, stmt_selectnonil(be, s, NULL), s);
}
- s = stmt_join(be, c, s, in, cmp_left);
+ s = stmt_join(be, c, s, in, cmp_left, 0);
s = stmt_result(be, s, 0);
if (!in) {
@@ -383,7 +383,7 @@ handle_in_exps(backend *be, sql_exp *ce,
Ugly trick to return empty candidate list,
because for all x it holds that: (x == null) == false.
list* singleton_bat = sa_list(sql->sa);
list_append(singleton_bat, null_value); */
- s = stmt_uselect(be, c, last_null_value,
cmp_equal, NULL, 0);
+ s = stmt_uselect(be, c, last_null_value,
cmp_equal, NULL, 0, 0);
return s;
}
else {
@@ -645,7 +645,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
l = nl;
}
- es = stmt_uselect(be, es,
stmt_bool(be,1), cmp_equal, NULL, 0);
+ es = stmt_uselect(be, es,
stmt_bool(be,1), cmp_equal, NULL, 0, 0);
} else /* need a condition */
cond_execution = es;
}
@@ -830,9 +830,9 @@ exp_bin(backend *be, sql_exp *e, stmt *l
predicate = stmt_const(be, predicate,
stmt_bool(be, 1));
if (s->nrcols == 0)
- s = stmt_uselect(be, predicate,
s, cmp_equal, sel1, anti);
+ s = stmt_uselect(be, predicate,
s, cmp_equal, sel1, anti, is_semantics(c));
else
- s = stmt_uselect(be, predicate,
sel1, cmp_equal, s, anti);
+ s = stmt_uselect(be, predicate,
sel1, cmp_equal, s, anti, is_semantics(c));
}
sel1 = s;
}
@@ -857,9 +857,9 @@ exp_bin(backend *be, sql_exp *e, stmt *l
predicate = stmt_const(be, predicate,
stmt_bool(be, 1));
if (s->nrcols == 0)
- s = stmt_uselect(be, predicate,
s, cmp_equal, sel2, anti);
+ s = stmt_uselect(be, predicate,
s, cmp_equal, sel2, anti, 0);
else
- s = stmt_uselect(be, predicate,
sel2, cmp_equal, s, anti);
+ s = stmt_uselect(be, predicate,
sel2, cmp_equal, s, anti, 0);
}
sel2 = s;
}
@@ -872,13 +872,13 @@ exp_bin(backend *be, sql_exp *e, stmt *l
stmt *predicate = bin_first_column(be, left);
predicate = stmt_const(be, predicate,
stmt_bool(be, 1));
- sel1 = stmt_uselect(be, predicate, sel1,
cmp_equal, NULL, 0/*anti*/);
+ sel1 = stmt_uselect(be, predicate, sel1,
cmp_equal, NULL, 0/*anti*/, 0);
}
if (sel2->nrcols == 0) {
stmt *predicate = bin_first_column(be, left);
predicate = stmt_const(be, predicate,
stmt_bool(be, 1));
- sel2 = stmt_uselect(be, predicate, sel2,
cmp_equal, NULL, 0/*anti*/);
+ sel2 = stmt_uselect(be, predicate, sel2,
cmp_equal, NULL, 0/*anti*/, 0);
}
if (anti)
return stmt_project(be, stmt_tinter(be, sel1,
sel2), sel1);
@@ -937,9 +937,9 @@ exp_bin(backend *be, sql_exp *e, stmt *l
if (r2) {
s = stmt_join2(be, l, r, r2,
(comp_type)e->flag, is_anti(e), swapped);
} else if (swapped) {
- s = stmt_join(be, r, l, is_anti(e),
swap_compare((comp_type)e->flag));
+ s = stmt_join(be, r, l, is_anti(e),
swap_compare((comp_type)e->flag), is_semantics(e));
} else {
- s = stmt_join(be, l, r, is_anti(e),
(comp_type)e->flag);
+ s = stmt_join(be, l, r, is_anti(e),
(comp_type)e->flag, is_semantics(e));
}
} else {
if (r2) {
@@ -969,7 +969,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
}
} else if (((e->flag&3) != 3) /* both sides
closed use between implementation */ && l->nrcols > 0 && r->nrcols > 0 &&
r2->nrcols > 0) {
s = stmt_uselect(be, l, r,
range2lcompare(e->flag),
- stmt_uselect(be, l, r2,
range2rcompare(e->flag), sel, is_anti(e)), is_anti(e));
+ stmt_uselect(be, l, r2,
range2rcompare(e->flag), sel, is_anti(e), 0), is_anti(e), 0);
} else {
s = stmt_uselect2(be, l, r, r2,
(comp_type)e->flag, sel, is_anti(e));
}
@@ -987,7 +987,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
s = stmt_binop(be, l, r, f);
} else {
/* this can still be a join (as
relational algebra and single value subquery results still means joins */
- s = stmt_uselect(be, l, r,
(comp_type)e->flag, sel, is_anti(e));
+ s = stmt_uselect(be, l, r,
(comp_type)e->flag, sel, is_anti(e), is_semantics(e));
}
}
}
@@ -1751,8 +1751,7 @@ rel2bin_hash_lookup(backend *be, sql_rel
sql_exp *e = en->data;
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;
+ int swap_exp = 0, swap_rel = 0, semantics = 0;
if (!idx) {
swap_exp = 1;
@@ -1793,7 +1792,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;
+ semantics = 1;
} else {
sql_subfunc *hf = sql_bind_func_result(sql->sa,
sql->session->schema, "hash", F_FUNC, lng, 1, tail_type(s));
@@ -1802,12 +1801,12 @@ rel2bin_hash_lookup(backend *be, sql_rel
}
if (h && h->nrcols) {
if (!swap_rel) {
- return stmt_join(be, idx, h, 0, comp);
+ return stmt_join(be, idx, h, 0, cmp_equal, semantics);
} else {
- return stmt_join(be, h, idx, 0, comp);
+ return stmt_join(be, h, idx, 0, cmp_equal, semantics);
}
} else {
- return stmt_uselect(be, idx, h, comp, NULL, 0);
+ return stmt_uselect(be, idx, h, cmp_equal, NULL, 0, semantics);
}
}
@@ -1838,16 +1837,23 @@ join_hash_key( backend *be, list *l )
}
static stmt *
-releqjoin( backend *be, list *l1, list *l2, int used_hash, comp_type cmp_op,
int need_left )
+releqjoin( backend *be, list *l1, list *l2, list *exps, int used_hash,
comp_type cmp_op, int need_left, int is_semantics )
{
mvc *sql = be->mvc;
- node *n1 = l1->h, *n2 = l2->h;
+ node *n1 = l1->h, *n2 = l2->h, *n3 = NULL;
stmt *l, *r, *res;
-
+ sql_exp *e;
+
+ if (exps)
+ n3 = exps->h;
if (list_length(l1) <= 1) {
l = l1->h->data;
r = l2->h->data;
- r = stmt_join(be, l, r, 0, cmp_op);
+ if (!is_semantics && exps) {
+ e = n3->data;
+ is_semantics = is_semantics(e);
+ }
+ r = stmt_join(be, l, r, 0, cmp_op, is_semantics);
if (need_left)
r->flag = cmp_left;
return r;
@@ -1857,17 +1863,19 @@ releqjoin( backend *be, list *l1, list *
r = n2->data;
n1 = n1->next;
n2 = n2->next;
- res = stmt_join(be, l, r, 0, cmp_op);
+ n3 = n3?n3->next:NULL;
+ res = stmt_join(be, l, r, 0, cmp_op, 1);
} else { /* need hash */
l = join_hash_key(be, l1);
r = join_hash_key(be, l2);
- res = stmt_join(be, l, r, 0, cmp_op == cmp_equal ?
cmp_equal_nil : cmp_op);
+ res = stmt_join(be, l, r, 0, cmp_op, 1);
}
if (need_left)
res->flag = cmp_left;
l = stmt_result(be, res, 0);
r = stmt_result(be, res, 1);
- for (; n1 && n2; n1 = n1->next, n2 = n2->next) {
+ for (; n1 && n2; n1 = n1->next, n2 = n2->next, n3 = n3?n3->next:NULL) {
+ int semantics = is_semantics;
stmt *ld = n1->data;
stmt *rd = n2->data;
stmt *le = stmt_project(be, l, ld );
@@ -1883,14 +1891,18 @@ releqjoin( backend *be, list *l1, list *
ops = sa_list(be->mvc->sa);
list_append(ops, le);
list_append(ops, re);
- if (cmp_op == cmp_equal_nil)
+ if (!semantics && exps) {
+ e = n3->data;
+ semantics = is_semantics(e);
+ }
+ if (semantics)
list_append(ops, stmt_bool(be, 1));
cmp = stmt_Nop(be, stmt_list(be, ops), f);
- cmp = stmt_uselect(be, cmp, stmt_bool(be, 1), cmp_equal, NULL,
0);
+ cmp = stmt_uselect(be, cmp, stmt_bool(be, 1), cmp_equal, NULL,
0, 0);
l = stmt_project(be, cmp, l );
r = stmt_project(be, cmp, r );
}
- res = stmt_join(be, l, r, 0, cmp_joined);
+ res = stmt_join(be, l, r, 0, cmp_joined, 0);
return res;
}
@@ -1923,6 +1935,7 @@ rel2bin_join(backend *be, sql_rel *rel,
list *jexps = sa_list(sql->sa);
list *lje = sa_list(sql->sa);
list *rje = sa_list(sql->sa);
+ list *exps = sa_list(sql->sa);
char *handled = SA_ZNEW_ARRAY(sql->sa, char,
list_length(rel->exps));
/* get equi-joins/filters first */
@@ -1940,7 +1953,7 @@ rel2bin_join(backend *be, sql_rel *rel,
if (list_empty(jexps)) {
stmt *l = bin_first_column(be, left);
stmt *r = bin_first_column(be, right);
- join = stmt_join(be, l, r, 0, cmp_all);
+ join = stmt_join(be, l, r, 0, cmp_all, 0);
}
for( en = rel->exps->h, i=0; en; en = en->next, i++) {
sql_exp *e = en->data;
@@ -1969,7 +1982,7 @@ rel2bin_join(backend *be, sql_rel *rel,
if (!join && !list_length(lje)) {
stmt *l = bin_first_column(be, left);
stmt *r = bin_first_column(be, right);
- join = stmt_join(be, l, r, 0, cmp_all);
+ join = stmt_join(be, l, r, 0, cmp_all,
0);
}
break;
}
@@ -1992,6 +2005,7 @@ rel2bin_join(backend *be, sql_rel *rel,
if (s) {
list_append(lje, s->op1);
list_append(rje, s->op2);
+ list_append(exps, NULL);
used_hash = 1;
}
}
@@ -2012,14 +2026,14 @@ rel2bin_join(backend *be, sql_rel *rel,
stmt *l = bin_first_column(be, left);
stmt *r = bin_first_column(be, right);
- l = stmt_uselect(be, stmt_const(be, l,
stmt_bool(be, 1)), s, cmp_equal, NULL, 0);
- join = stmt_join(be, l, r, 0, cmp_all);
+ l = stmt_uselect(be, stmt_const(be, l,
stmt_bool(be, 1)), s, cmp_equal, NULL, 0, 0);
+ join = stmt_join(be, l, r, 0, cmp_all,
0);
continue;
}
if (!join) {
stmt *l = bin_first_column(be, left);
stmt *r = bin_first_column(be, right);
- join = stmt_join(be, l, r, 0, cmp_all);
+ join = stmt_join(be, l, r, 0, cmp_all,
0);
}
break;
}
@@ -2028,18 +2042,20 @@ rel2bin_join(backend *be, sql_rel *rel,
join = s;
list_append(lje, s->op1);
list_append(rje, s->op2);
+ list_append(exps, e);
}
if (list_length(lje) > 1) {
- join = releqjoin(be, lje, rje, used_hash, cmp_equal,
need_left);
+ join = releqjoin(be, lje, rje, exps, used_hash,
cmp_equal, need_left, 0);
} else if (!join) {
- join = stmt_join(be, lje->h->data, rje->h->data, 0,
cmp_equal);
+ sql_exp *e = exps->h->data;
+ join = stmt_join(be, lje->h->data, rje->h->data, 0,
cmp_equal, is_semantics(e));
if (need_left)
join->flag = cmp_left;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list