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

Reply via email to