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