Changeset: ca1e9eb63393 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ca1e9eb63393
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_statement.c
sql/backends/monet5/sql_statement.h
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/test/BugTracker-2012/Tests/currenttime.Bug-2781.stable.out
sql/test/BugTracker-2016/Tests/null_in_null.Bug-3900.stable.out
sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out
sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out.single
sql/test/SQLancer/Tests/sqlancer02.stable.out
sql/test/miscellaneous/Tests/simple_plans.stable.out
sql/test/miscellaneous/Tests/simple_plans.stable.out.single
Branch: default
Log Message:
use cmp (between) instead of hared coded mal instruction
(cleans up the handling later, in rel_bin etc)
diffs (truncated from 806 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
@@ -36,7 +36,7 @@ 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);
+ stmt *nn = stmt_uselect2(be, col, n, n, 3, NULL, 0, 1);
return nn;
}
@@ -312,7 +312,7 @@ stmt_selectnonil( 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, s, 1);
+ stmt *nn = stmt_uselect2(be, col, n, n, 3, s, 1, 1);
return nn;
}
@@ -1065,44 +1065,11 @@ exp_bin(backend *be, sql_exp *e, stmt *l
s = stmt_join(be, l, r, is_anti(e),
(comp_type)e->flag, is_semantics(e), false);
}
} else {
- if (r2) {
- if (!reduce || (l->nrcols == 0 && r->nrcols ==
0 && r2->nrcols == 0)) {
- sql_subtype *bt =
sql_bind_localtype("bit");
- sql_subfunc *lf =
sql_bind_func(sql->sa, sql->session->schema,
-
compare_func(range2lcompare(e->flag), 0),
- tail_type(l),
tail_type(r), F_FUNC);
- sql_subfunc *rf =
sql_bind_func(sql->sa, sql->session->schema,
-
compare_func(range2rcompare(e->flag), 0),
- tail_type(l),
tail_type(r), F_FUNC);
- sql_subfunc *a = sql_bind_func(sql->sa,
sql->session->schema,
- "and", bt, bt, F_FUNC);
-
- if (is_atom(re->type) && re->l &&
atom_null((atom*)re->l) &&
- is_atom(re2->type) && re2->l &&
atom_null((atom*)re2->l)) {
- assert(0); // old hack is gone
...
- } else {
- assert(lf && rf && a);
- s = stmt_binop(be,
- stmt_binop(be, l, r,
lf),
- stmt_binop(be, l, r2,
rf), a);
- if (l->cand)
- s->cand = l->cand;
- if (r->cand)
- s->cand = r->cand;
- if (r2->cand)
- s->cand = r2->cand;
- }
- if (is_anti(e)) {
- stmt *cand = s->cand;
- sql_subfunc *a =
sql_bind_func(sql->sa, sql->session->schema, "not", bt, NULL, F_FUNC);
- s = stmt_unop(be, s, a);
- s->cand = cand;
- }
- } else {
- if (l->nrcols == 0)
- l = stmt_const(be,
bin_first_column(be, left), l);
- s = stmt_uselect2(be, l, r, r2,
(comp_type)e->flag, sel, is_anti(e));
- }
+ if (r2) { /* handle all cases in stmt_uselect,
+ reducing, non reducing, scalar
etc */
+ if (l->nrcols == 0)
+ l = stmt_const(be, bin_first_column(be,
left), l);
+ s = stmt_uselect2(be, l, r, r2,
(comp_type)e->flag, sel, is_anti(e), reduce);
} else {
/* value compare or select */
if ((!reduce || (l->nrcols == 0 && r->nrcols ==
0)) && (e->flag == mark_in || e->flag == mark_notin)) {
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
@@ -1612,7 +1612,8 @@ 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)
+select2_join2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt
*sub, int anti, int swapped, int type, int
+ reduce)
{
MalBlkPtr mb = be->mb;
InstrPtr p, q;
@@ -1622,18 +1623,23 @@ 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) || (cmp & CMP_BETWEEN
&& anti) || op2->nrcols > 0 || op3->nrcols > 0) && (type == st_uselect2)) {
+ if (((cmp & CMP_BETWEEN && cmp & CMP_SYMMETRIC) || (cmp & CMP_BETWEEN
&& anti) || op2->nrcols > 0 || op3->nrcols > 0 || !reduce) && (type ==
st_uselect2)) {
int k;
+ int nrcols = (op1->nrcols || op2->nrcols || op3->nrcols);
if (op2->nr < 0 || op3->nr < 0)
return NULL;
- p = newStmt(mb, batcalcRef, betweenRef);
+
+ if (nrcols)
+ p = newStmt(mb, batcalcRef, betweenRef);
+ else
+ p = newStmt(mb, calcRef, betweenRef);
p = pushArgument(mb, p, l);
p = pushArgument(mb, p, op2->nr);
p = pushArgument(mb, p, op3->nr);
/* cands */
- if (op1->cand || op2->cand || op3->cand) { /* some already
handled the previous selection */
+ if ((sub && !reduce) || op1->cand || op2->cand || op3->cand) {
/* some already handled the previous selection */
if (op1->cand && op1->nrcols)
p = pushNil(mb, p, TYPE_bat);
else if (op1->nrcols)
@@ -1658,6 +1664,8 @@ select2_join2(backend *be, stmt *op1, st
p = pushBit(mb, p, (cmp & 2) != 0); /* hi inclusive */
p = pushBit(mb, p, FALSE); /* nils_false */
p = pushBit(mb, p, (anti)?TRUE:FALSE); /* anti */
+ if (!reduce)
+ return p;
k = getDestVar(p);
q = newStmt(mb, algebraRef, selectRef);
@@ -1767,9 +1775,9 @@ select2_join2(backend *be, stmt *op1, st
}
stmt *
-stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt
*sub, int anti)
+stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt
*sub, int anti, int reduce)
{
- InstrPtr q = select2_join2(be, op1, op2, op3, cmp, sub, anti, 0,
st_uselect2);
+ InstrPtr q = select2_join2(be, op1, op2, op3, cmp, sub, anti, 0,
st_uselect2, reduce);
if (q) {
stmt *s = stmt_create(be->mvc->sa, st_uselect2);
@@ -2204,7 +2212,7 @@ stmt_left_project(backend *be, stmt *op1
stmt *
stmt_join2(backend *be, stmt *l, stmt *ra, stmt *rb, int cmp, int anti, int
swapped)
{
- InstrPtr q = select2_join2(be, l, ra, rb, cmp, NULL, anti, swapped,
st_join2);
+ InstrPtr q = select2_join2(be, l, ra, rb, cmp, NULL, anti, swapped,
st_join2, 1/*reduce semantics*/);
if (q) {
stmt *s = stmt_create(be->mvc->sa, st_join2);
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
@@ -176,7 +176,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);
+extern stmt *stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int
cmp, stmt *sub, int anti, 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);
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
@@ -135,6 +135,22 @@ compare2range( int l, int r )
return -1;
}
+int
+compare_funcs2range(const char *l_op, const char *r_op)
+{
+ assert(l_op[0] == '>' && r_op[0] == '<');
+ if (!l_op[1] && !r_op[1])
+ return 0;
+ if (!l_op[1] && r_op[1] == '=')
+ return 2;
+ if (l_op[1] == '=' && !r_op[1])
+ return 1;
+ if (l_op[1] == '=' && r_op[1] == '=')
+ return 3;
+ assert(0);
+ return 0;
+}
+
static sql_exp *
exp_create(sql_allocator *sa, int type)
{
@@ -2267,7 +2283,7 @@ exps_bind_column2( list *exps, const cha
for (; he; he = he->chain) {
sql_exp *e = he->value;
- if (e && is_column(e->type) &&
e->alias.name && e->alias.rname && strcmp(e->alias.name, cname) == 0 &&
strcmp(e->alias.rname, rname) == 0) {
+ if (e && e->alias.name &&
e->alias.rname && strcmp(e->alias.name, cname) == 0 && strcmp(e->alias.rname,
rname) == 0) {
MT_lock_unset(&exps->ht_lock);
return e;
}
@@ -2280,7 +2296,7 @@ exps_bind_column2( list *exps, const cha
for (en = exps->h; en; en = en->next ) {
sql_exp *e = en->data;
- if (e && is_column(e->type) && e->alias.name &&
e->alias.rname && strcmp(e->alias.name, cname) == 0 && strcmp(e->alias.rname,
rname) == 0)
+ if (e && e->alias.name && e->alias.rname &&
strcmp(e->alias.name, cname) == 0 && strcmp(e->alias.rname, rname) == 0)
return e;
}
}
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
@@ -30,6 +30,7 @@ extern comp_type negate_compare( comp_ty
extern comp_type range2lcompare( int r );
extern comp_type range2rcompare( int r );
extern int compare2range( int l, int r );
+extern int compare_funcs2range(const char *l, const char *r);
extern sql_exp *exp_compare(sql_allocator *sa, sql_exp *l, sql_exp *r, int
cmptype);
extern sql_exp *exp_compare2(sql_allocator *sa, sql_exp *l, sql_exp *r,
sql_exp *f, int cmptype);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -3894,25 +3894,12 @@ exp_merge_project_rse(visitor *v, sql_re
if (((strcmp(lf->func->base.name, ">=") == 0 ||
strcmp(lf->func->base.name, ">") == 0) && list_length(lfexps) == 2) &&
((strcmp(rf->func->base.name, "<=") == 0 ||
strcmp(rf->func->base.name, "<") == 0) && list_length(rfexps) == 2)
&& exp_equal(list_fetch(lfexps,0),
list_fetch(rfexps,0)) == 0) {
- sql_exp *ce = list_fetch(lfexps, 0);
- list *types, *ops = sa_list(sql->sa);
- sql_subfunc *between;
-
- append(ops, ce);
- append(ops, list_fetch(lfexps, 1));
- append(ops, list_fetch(rfexps, 1));
- append(ops, exp_atom_bool(sql->sa, 0));
/* non symetrical */
- append(ops, exp_atom_bool(sql->sa,
lf->func->base.name[1] == '=')); /* left inclusive */
- append(ops, exp_atom_bool(sql->sa,
rf->func->base.name[1] == '=')); /* right exclusive */
- append(ops, exp_atom_bool(sql->sa, 0));
/* nils_false */
- append(ops, exp_atom_bool(sql->sa, 0));
/* anti */
-
- types = exp_types(sql->sa, ops);
- /* convert into between */
- between = sql_bind_func_(sql->sa,
mvc_bind_schema(sql, "sys"), "between", types, F_FUNC);
- if (between) {
- sql_exp *ne = exp_op(sql->sa,
ops, between);
-
+ sql_exp *ne = exp_compare2(sql->sa,
+ list_fetch(lfexps, 0),
+ list_fetch(lfexps, 1),
+ list_fetch(rfexps, 1),
+
compare_funcs2range(lf->func->base.name, rf->func->base.name));
+ if (ne) {
exp_setname(sql->sa, ne,
exp_relname(e), exp_name(e));
e = ne;
}
diff --git a/sql/test/BugTracker-2012/Tests/currenttime.Bug-2781.stable.out
b/sql/test/BugTracker-2012/Tests/currenttime.Bug-2781.stable.out
--- a/sql/test/BugTracker-2012/Tests/currenttime.Bug-2781.stable.out
+++ b/sql/test/BugTracker-2012/Tests/currenttime.Bug-2781.stable.out
@@ -5,48 +5,11 @@ stdout of test 'currenttime.Bug-2781` in
# 14:00:10 > "/usr/bin/python" "currenttime.Bug-2781.py"
"currenttime.Bug-2781"
# 14:00:10 >
-# MonetDB 5 server v11.19.10 (hg id: 68ab398acb08)
-# This is an unreleased version
-# Serving database 'mTests_test_BugTracker-2012', using 8 threads
-# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically
linked
-# Found 15.629 GiB available main-memory.
-# Copyright (c) 1993-July 2008 CWI.
-# Copyright (c) August 2008-2015 MonetDB B.V., all rights reserved
-# Visit http://www.monetdb.org/ for further information
-# Listening for connection requests on mapi:monetdb://london.ins.cwi.nl:32575/
-# MonetDB/GIS module loaded
-# MonetDB/JAQL module loaded
-# MonetDB/SQL module loaded
-# MonetDB/R module loaded
-
-# SQL catalog created, loading sql scripts once
-# loading sql script: 09_like.sql
-# loading sql script: 10_math.sql
-# loading sql script: 11_times.sql
-# loading sql script: 12_url.sql
-# loading sql script: 13_date.sql
-# loading sql script: 14_inet.sql
-# loading sql script: 15_history.sql
-# loading sql script: 16_tracelog.sql
-# loading sql script: 17_compress.sql
-# loading sql script: 18_dictionary.sql
-# loading sql script: 19_cluster.sql
-# loading sql script: 20_vacuum.sql
-# loading sql script: 21_dependency_functions.sql
-# loading sql script: 22_clients.sql
-# loading sql script: 23_skyserver.sql
-# loading sql script: 24_zorder.sql
-# loading sql script: 25_debug.sql
-# loading sql script: 39_analytics.sql
-# loading sql script: 40_geom.sql
-# loading sql script: 80_udf.sql
-# loading sql script: 99_system.sql
-
-#select localtimestamp() between (timestamp '2020-05-06 10:22:12' - interval
'20' second) and (timestamp '2020-05-06 10:22:12' + interval '20' second);
-% . # table_name
-% %1 # name
-% boolean # type
-% 5 # length
+#select localtimestamp() between (timestamp '2020-07-07 14:25:20' - interval
'20' second) and (timestamp '2020-07-07 14:25:20' + interval '20' second);
+% .%2 # table_name
+% %2 # name
+% oid # type
+% 22 # length
[ true ]
# 09:58:28 >
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list