Changeset: 6ffbcc06b72c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6ffbcc06b72c
Modified Files:
        sql/include/sql_catalog.h
        sql/server/rel_optimizer.c
Branch: scatter
Log Message:

Merged with Jul2021


diffs (truncated from 986 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
@@ -56,9 +56,7 @@ static stmt *
 stmt_selectnil( backend *be, stmt *col)
 {
        sql_subtype *t = tail_type(col);
-       stmt *n = stmt_atom(be, atom_general(be->mvc->sa, t, NULL));
-       stmt *nn = stmt_uselect2(be, col, n, n, 3, NULL, 0, 1);
-       return nn;
+       return stmt_uselect(be, col, stmt_atom(be, atom_general(be->mvc->sa, t, 
NULL)), cmp_equal, NULL, 0, 1);
 }
 
 static stmt *
@@ -378,9 +376,7 @@ static stmt *
 stmt_selectnonil( backend *be, stmt *col, stmt *s )
 {
        sql_subtype *t = tail_type(col);
-       stmt *n = stmt_atom(be, atom_general(be->mvc->sa, t, NULL));
-       stmt *nn = stmt_uselect2(be, col, n, n, 3, s, 1, 1);
-       return nn;
+       return stmt_uselect(be, col, stmt_atom(be, atom_general(be->mvc->sa, t, 
NULL)), cmp_equal, s, 1, 1);
 }
 
 static int
@@ -1510,7 +1506,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        if (r2 && r2->nrcols == 0)
                                r2 = stmt_const(be, 
bin_find_smallest_column(be, swapped?left:right), r2);
                        if (r2) {
-                               s = stmt_join2(be, l, r, r2, 
(comp_type)e->flag, is_anti(e), swapped);
+                               s = stmt_join2(be, l, r, r2, 
(comp_type)e->flag, is_anti(e), is_symmetric(e), swapped);
                        } else if (swapped) {
                                s = stmt_join(be, r, l, is_anti(e), 
swap_compare((comp_type)e->flag), 0, is_semantics(e), false);
                        } else {
@@ -1520,7 +1516,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        if (r2) { /* handle all cases in stmt_uselect, 
reducing, non reducing, scalar etc */
                                if (l->nrcols == 0 && ((sel && sel->nrcols > 0) 
|| r->nrcols > 0 || r2->nrcols > 0 || reduce))
                                        l = left ? stmt_const(be, 
bin_find_smallest_column(be, left), l) : column(be, l);
-                               s = stmt_uselect2(be, l, r, r2, 
(comp_type)e->flag, sel, is_anti(e), reduce);
+                               s = stmt_uselect2(be, l, r, r2, 
(comp_type)e->flag, sel, is_anti(e), is_symmetric(e), reduce);
                        } else {
                                /* value compare or select */
                                if ((!reduce || (l->nrcols == 0 && r->nrcols == 
0)) && (e->flag == mark_in || e->flag == mark_notin)) {
@@ -2414,7 +2410,7 @@ split_join_exps(sql_rel *rel, list *join
                        /* we can handle thetajoins, rangejoins and filter 
joins (like) */
                        /* ToDo how about atom expressions? */
                        if (e->type == e_cmp) {
-                               int flag = e->flag & ~CMP_BETWEEN;
+                               int flag = e->flag;
                                /* check if its a select or join expression, ie 
use only expressions of one relation left and of the other right (than join) */
                                if (flag < cmp_filter || flag == mark_in || 
flag == mark_notin) { /* theta and range joins */
                                        /* join or select ? */
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -300,7 +300,12 @@ SQLprepareClient(Client c, int login)
                        } else if (sscanf(tok, "columnar_protocol=%d", &value) 
== 1) {
                                c->protocol = (value != 0) ? PROTOCOL_COLUMNAR 
: PROTOCOL_9;
                        } else if (sscanf(tok, "time_zone=%d", &value) == 1) {
-                               m->timezone = 1000 * value;
+                               sql_schema *s = mvc_bind_schema(m, "sys");
+                               sql_var *var = find_global_var(m, s, 
"current_timezone");
+                               ValRecord val;
+                               VALinit(&val, TYPE_lng, &(lng){1000 * value});
+                               sql_update_var(m, s, "current_timezone", &val);
+                               sqlvar_set(var, &val);
                        } else {
                                msg = createException(SQL, "SQLprepareClient", 
SQLSTATE(42000) "unexpected handshake option: %s", tok);
                                goto bailout;
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
@@ -1618,8 +1618,7 @@ argumentZero(MalBlkPtr mb, int tpe)
 */
 
 static InstrPtr
-select2_join2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt 
**Sub, int anti, int swapped, int type, int
-               reduce)
+select2_join2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt 
**Sub, int anti, int symmetric, int swapped, int type, int reduce)
 {
        MalBlkPtr mb = be->mb;
        InstrPtr p, q;
@@ -1630,7 +1629,7 @@ select2_join2(backend *be, stmt *op1, st
        if (op1->nr < 0 || (sub && sub->nr < 0))
                return NULL;
        l = op1->nr;
-       if (((cmp & CMP_BETWEEN && cmp & CMP_SYMMETRIC) || op2->nrcols > 0 || 
op3->nrcols > 0 || !reduce) && (type == st_uselect2)) {
+       if ((symmetric || op2->nrcols > 0 || op3->nrcols > 0 || !reduce) && 
(type == st_uselect2)) {
                int k;
                int nrcols = (op1->nrcols || op2->nrcols || op3->nrcols);
 
@@ -1666,7 +1665,7 @@ select2_join2(backend *be, stmt *op1, st
                        sub = NULL;
                }
 
-               p = pushBit(mb, p, (cmp & CMP_SYMMETRIC) != 0); /* symmetric */
+               p = pushBit(mb, p, (symmetric)?TRUE:FALSE); /* symmetric */
                p = pushBit(mb, p, (cmp & 1) != 0);         /* lo inclusive */
                p = pushBit(mb, p, (cmp & 2) != 0);         /* hi inclusive */
                p = pushBit(mb, p, FALSE);                  /* nils_false */
@@ -1767,10 +1766,9 @@ select2_join2(backend *be, stmt *op1, st
                }
                q = pushBit(mb, q, anti);
                if (type == st_uselect2) {
-                       if (cmp & CMP_BETWEEN)
-                               q = pushBit(mb, q, TRUE); /* all nil's are != */
+                       q = pushBit(mb, q, TRUE); /* all nil's are != */
                } else {
-                       q = pushBit(mb, q, (cmp & CMP_SYMMETRIC)?TRUE:FALSE);
+                       q = pushBit(mb, q, (symmetric)?TRUE:FALSE);
                }
                if (type == st_join2)
                        q = pushNil(mb, q, TYPE_lng); /* estimate */
@@ -1794,10 +1792,10 @@ select2_join2(backend *be, stmt *op1, st
 }
 
 stmt *
-stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt 
*sub, int anti, int reduce)
+stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt 
*sub, int anti, int symmetric, int reduce)
 {
        stmt *sel = sub;
-       InstrPtr q = select2_join2(be, op1, op2, op3, cmp, &sub, anti, 0, 
st_uselect2, reduce);
+       InstrPtr q = select2_join2(be, op1, op2, op3, cmp, &sub, anti, 
symmetric, 0, st_uselect2, reduce);
 
        if (q) {
                stmt *s = stmt_create(be->mvc->sa, st_uselect2);
@@ -2253,9 +2251,9 @@ stmt_left_project(backend *be, stmt *op1
 }
 
 stmt *
-stmt_join2(backend *be, stmt *l, stmt *ra, stmt *rb, int cmp, int anti, int 
swapped)
+stmt_join2(backend *be, stmt *l, stmt *ra, stmt *rb, int cmp, int anti, int 
symmetric, int swapped)
 {
-       InstrPtr q = select2_join2(be, l, ra, rb, cmp, NULL, anti, swapped, 
st_join2, 1/*reduce semantics*/);
+       InstrPtr q = select2_join2(be, l, ra, rb, cmp, NULL, anti, symmetric, 
swapped, st_join2, 1/*reduce semantics*/);
        if (q) {
                stmt *s = stmt_create(be->mvc->sa, st_join2);
                if (s == NULL) {
diff --git a/sql/backends/monet5/sql_statement.h 
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -187,7 +187,7 @@ extern stmt *stmt_uselect(backend *be, s
        2 ==   l <= x <  h
        3 ==   l <= x <= h
        */
-extern stmt *stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int 
cmp, stmt *sub, int anti, int reduce);
+extern stmt *stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int 
cmp, stmt *sub, int anti, int symmetric, int reduce);
 extern stmt *stmt_genselect(backend *be, stmt *lops, stmt *rops, sql_subfunc 
*f, stmt *sub, int anti);
 
 extern stmt *stmt_tunion(backend *be, stmt *op1, stmt *op2);
@@ -196,7 +196,7 @@ extern stmt *stmt_tdiff2(backend *be, st
 extern stmt *stmt_tinter(backend *be, stmt *op1, stmt *op2, bool single);
 
 extern stmt *stmt_join(backend *be, stmt *op1, stmt *op2, int anti, comp_type 
cmptype, int need_left, int is_semantics, bool single);
-extern stmt *stmt_join2(backend *be, stmt *l, stmt *ra, stmt *rb, int cmp, int 
anti, int swapped);
+extern stmt *stmt_join2(backend *be, stmt *l, stmt *ra, stmt *rb, int cmp, int 
anti, int symmetric, int swapped);
 /* generic join operator, with a left and right statement list */
 extern stmt *stmt_genjoin(backend *be, stmt *l, stmt *r, sql_subfunc *op, int 
anti, int swapped);
 extern stmt *stmt_semijoin(backend *be, stmt *l, stmt *r, stmt *lcand, stmt 
*rcand, int is_semantics, bool single);
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -176,10 +176,6 @@ typedef enum comp_type {
        cmp_left_project = 15   /* last step of outer join */
 } comp_type;
 
-/* for ranges we keep the requirment for symmetric */
-#define CMP_SYMMETRIC 8
-#define CMP_BETWEEN 16
-
 #define is_theta_exp(e) ((e) == cmp_gt || (e) == cmp_gte || (e) == cmp_lte ||\
                                                 (e) == cmp_lt || (e) == 
cmp_equal || (e) == cmp_notequal)
 
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -59,7 +59,8 @@ typedef struct expression {
 
         base:1,
         ref:1,         /* used to indicate an other expression may reference 
this one */
-        used:1;        /* used for quick dead code removal */
+        used:1,        /* used for quick dead code removal */
+        symmetric:1; /* compare between symmetric */
        sql_subtype     tpe;
        void *p;        /* properties for the optimizer */
 } sql_exp;
@@ -232,6 +233,8 @@ typedef enum operator_type {
 #define set_anti(e)            (e)->anti = 1
 #define is_semantics(e)        ((e)->semantics)
 #define set_semantics(e)       (e)->semantics = 1
+#define is_symmetric(e)        ((e)->symmetric)
+#define set_symmetric(e)       (e)->symmetric = 1
 #define is_intern(e)           ((e)->intern)
 #define set_intern(e)          (e)->intern = 1
 #define is_basecol(e)          ((e)->base)
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -267,9 +267,8 @@ exp_print(mvc *sql, stream *fout, sql_ex
                                mnstr_printf(fout, " !");
                        cmp_print(sql, fout, range2rcompare(e->flag) );
                        exp_print(sql, fout, e->f, depth+1, refs, 0, 0);
-                       if (e->flag & CMP_BETWEEN)
-                               mnstr_printf(fout, " BETWEEN ");
-                       if (e->flag & CMP_SYMMETRIC)
+                       mnstr_printf(fout, " BETWEEN ");
+                       if (e->symmetric)
                                mnstr_printf(fout, " SYM ");
                } else {
                        exp_print(sql, fout, e->l, depth+1, refs, 0, 0);
@@ -1420,7 +1419,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                return NULL;
                        return exp_in(sql->sa, exp, exps, f);
                } else {
-                       int sym = 0, between = 0;
+                       int sym = 0;
                        sql_exp *e = exp_read(sql, lrel, rrel, top_exps, r, 
pos, 0);
 
                        if (!e)
@@ -1428,7 +1427,6 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        if (strncmp(r+*pos, "BETWEEN",  strlen("BETWEEN")) == 
0) {
                                (*pos)+= (int) strlen("BETWEEN");
                                skipWS(r,pos);
-                               between = 1;
                        }
                        if (strncmp(r+*pos, "SYM",  strlen("SYM")) == 0) {
                                (*pos)+= (int) strlen("SYM");
@@ -1436,20 +1434,12 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                sym = 1;
                        }
                        if (e->type == e_cmp) {
-                               sql_exp *ne = exp_compare2(sql->sa, e->l, exp, 
e->r, compare2range(swap_compare((comp_type)f), e->flag & 
~(CMP_SYMMETRIC|CMP_BETWEEN)));
-                               if (sym)
-                                       ne->flag |= CMP_SYMMETRIC;
-                               if (between)
-                                       ne->flag |= CMP_BETWEEN;
+                               sql_exp *ne = exp_compare2(sql->sa, e->l, exp, 
e->r, compare2range(swap_compare((comp_type)f), e->flag), sym);
                                if (is_anti(exp))
                                        set_anti(ne);
                                return ne;
                        } else {
                                sql_exp *ne = exp_compare(sql->sa, exp, e, f);
-                               if (sym)
-                                       ne->flag |= CMP_SYMMETRIC;
-                               if (between)
-                                       ne->flag |= CMP_BETWEEN;
                                if (is_anti(exp))
                                        set_anti(ne);
                                if (is_semantics(exp))
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -173,7 +173,7 @@ exp_compare(sql_allocator *sa, sql_exp *
 }
 
 sql_exp *
-exp_compare2(sql_allocator *sa, sql_exp *l, sql_exp *r, sql_exp *f, int 
cmptype)
+exp_compare2(sql_allocator *sa, sql_exp *l, sql_exp *r, sql_exp *f, int 
cmptype, int symmetric)
 {
        sql_exp *e = exp_create(sa, e_cmp);
        if (e == NULL)
@@ -184,6 +184,8 @@ exp_compare2(sql_allocator *sa, sql_exp 
        e->r = r;
        e->f = f;
        e->flag = cmptype;
+       if (symmetric)
+               set_symmetric(e);
        if (!has_nil(l) && !has_nil(r) && !has_nil(f))
                set_has_no_nil(e);
        return e;
@@ -671,6 +673,8 @@ exp_propagate(sql_allocator *sa, sql_exp
                set_anti(ne);
        if (is_semantics(oe))
                set_semantics(ne);
+       if (is_symmetric(oe))
+               set_symmetric(ne);
        if (is_ascending(oe))
                set_ascending(ne);
        if (nulls_last(oe))
@@ -1779,7 +1783,7 @@ exp_two_sided_bound_cmp_exp_is_false(sql
     sql_exp* h = e->f;
     assert (v && l && h);
 
-    return exp_is_null(l) || exp_is_null(v) || exp_is_null(h);
+    return is_anti(e) ? exp_is_null(v) || (exp_is_null(l) && exp_is_null(h)) : 
exp_is_null(l) || exp_is_null(v) || exp_is_null(h);
 }
 
 static inline bool
@@ -2728,7 +2732,7 @@ exp_copy(mvc *sql, sql_exp * e)
 
                        if (e->f) {
                                r2 = exp_copy(sql, e->f);
-                               ne = exp_compare2(sql->sa, l, r, r2, e->flag);
+                               ne = exp_compare2(sql->sa, l, r, r2, e->flag, 
is_symmetric(e));
                        } else {
                                ne = exp_compare(sql->sa, l, r, e->flag);
                        }
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to