Changeset: 41db648fa734 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/41db648fa734
Branch: scatter
Log Message:
merged
diffs (truncated from 999 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 ? */
@@ -5614,10 +5610,8 @@ check_for_foreign_key_references(mvc *sq
if (k->t != t && !cascade) {
node *n =
ol_first_node(t->columns);
sql_column *c = n->data;
- size_t n_rows =
store->storage_api.count_col(sql->session->tr, c, 0);
- size_t n_deletes =
store->storage_api.count_del(sql->session->tr, c->t, 0);
- assert (n_rows >=
n_deletes);
- if (n_rows - n_deletes
> 0) {
+ size_t n_rows =
store->storage_api.count_col(sql->session->tr, c, 10);
+ if (n_rows > 0) {
list_destroy(keys);
sql_error(sql,
02, SQLSTATE(23000) "TRUNCATE: FOREIGN KEY %s.%s depends on %s",
k->t->base.name, k->base.name, t->base.name);
*error = 1;
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);
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list