Changeset: 547ed385ec9a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=547ed385ec9a Added Files: sql/test/BugTracker-2018/Tests/ordered-index-error.Bug-6572.sql sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case.Bug-6568.stable.err sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case.Bug-6568.stable.out sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case.Bug-6573.sql sql/test/BugTracker-2018/Tests/sqlitelogictest-undefined-calc.Bug-6570.stable.err sql/test/BugTracker-2018/Tests/sqlitelogictest-undefined-calc.Bug-6570.stable.out Modified Files: sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimizer.c sql/server/rel_select.c sql/test/BugTracker-2018/Tests/All sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-nullif-coalesce.Bug-6565.sql sql/test/BugTracker-2018/Tests/sqlitelogictest-mal-calc-undefined.Bug-6566.sql sql/test/bugs/Tests/create_insert_select_aggr-bug-00001.stable.out sql/test/mergetables/Tests/part-elim.stable.out Branch: default Log Message:
Merge with Mar2018 diffs (truncated from 434 to 300 lines): 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 @@ -1977,3 +1977,43 @@ exp_flatten(mvc *sql, sql_exp *e) return NULL; } +void +exp_sum_scales(sql_subfunc *f, sql_exp *l, sql_exp *r) +{ + sql_arg *ares = f->func->res->h->data; + + if (strcmp(f->func->imp, "*") == 0 && ares->type.type->scale == SCALE_FIX) { + sql_subtype t; + sql_subtype *lt = exp_subtype(l); + sql_subtype *rt = exp_subtype(r); + sql_subtype *res = f->res->h->data; + + res->scale = lt->scale + rt->scale; + res->digits = lt->digits + rt->digits; + + /* HACK alert: digits should be less than max */ +#ifdef HAVE_HGE + if (have_hge) { + if (ares->type.type->radix == 10 && res->digits > 39) + res->digits = 39; + if (ares->type.type->radix == 2 && res->digits > 128) + res->digits = 128; + } else +#endif + { + + if (ares->type.type->radix == 10 && res->digits > 19) + res->digits = 19; + if (ares->type.type->radix == 2 && res->digits > 64) + res->digits = 64; + } + + /* numeric types are fixed length */ + if (ares->type.type->eclass == EC_NUM) { + sql_find_numeric(&t, ares->type.type->localtype, res->digits); + } else { + sql_find_subtype(&t, ares->type.type->sqlname, res->digits, res->scale); + } + *res = t; + } +} 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 @@ -150,4 +150,6 @@ extern int is_identity( sql_exp *e, sql_ extern atom *exp_flatten(mvc *sql, sql_exp *e); +extern void exp_sum_scales(sql_subfunc *f, sql_exp *l, sql_exp *r); + #endif /* _REL_EXP_H_ */ 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 @@ -2942,10 +2942,11 @@ exp_simplify_math( mvc *sql, sql_exp *e, } } /* move constants to the right, ie c*A = A*c */ - /* TODO beware of overflow, */ else if (exp_is_atom(le)) { l->h->data = re; l->h->next->data = le; + e->f = sql_bind_func(sql->sa, NULL, "sql_mul", exp_subtype(re), exp_subtype(le), F_FUNC); + exp_sum_scales(e->f, re, le); (*changes)++; return e; } @@ -2993,9 +2994,13 @@ exp_simplify_math( mvc *sql, sql_exp *e, append(l, lre); append(l, re); le->l = l; + le->f = sql_bind_func(sql->sa, NULL, "sql_mul", exp_subtype(lre), exp_subtype(re), F_FUNC); + exp_sum_scales(le->f, lre, re); l = e->l; l->h->data = lle; l->h->next->data = le; + e->f = sql_bind_func(sql->sa, NULL, "sql_mul", exp_subtype(lle), exp_subtype(le), F_FUNC); + exp_sum_scales(e->f, lle, le); (*changes)++; return e; } diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1341,63 +1341,6 @@ rel_check_type(mvc *sql, sql_subtype *t, } static sql_exp * -exp_sum_scales(mvc *sql, sql_subfunc *f, sql_exp *l, sql_exp *r) -{ - sql_arg *ares = f->func->res->h->data; - - if (strcmp(f->func->imp, "*") == 0 && ares->type.type->scale == SCALE_FIX) { - sql_subtype t; - sql_subtype *lt = exp_subtype(l); - sql_subtype *rt = exp_subtype(r); - sql_subtype *res = f->res->h->data; - - res->scale = lt->scale + rt->scale; - res->digits = lt->digits + rt->digits; - - /* HACK alert: digits should be less than max */ -#ifdef HAVE_HGE - if (have_hge) { - if (ares->type.type->radix == 10 && res->digits > 39) - res->digits = 39; - if (ares->type.type->radix == 2 && res->digits > 128) - res->digits = 128; - } else -#endif - { - - if (ares->type.type->radix == 10 && res->digits > 19) - res->digits = 19; - if (ares->type.type->radix == 2 && res->digits > 64) - res->digits = 64; - } - - /* sum of digits may mean we need a bigger result type - * as the function don't support this we need to - * make bigger input types! - */ - - /* numeric types are fixed length */ - if (ares->type.type->eclass == EC_NUM) { - sql_find_numeric(&t, ares->type.type->localtype, res->digits); - } else { - sql_find_subtype(&t, ares->type.type->sqlname, res->digits, res->scale); - } - if (type_cmp(t.type, ares->type.type) != 0) { - /* do we need to convert to the a larger localtype - int * int may not fit in an int, so we need to - convert to lng * int. - */ - sql_subtype nlt; - - sql_init_subtype(&nlt, t.type, res->digits, lt->scale); - l = rel_check_type( sql, &nlt, l, type_equal ); - } - *res = t; - } - return l; -} - -static sql_exp * exp_scale_algebra(mvc *sql, sql_subfunc *f, sql_exp *l, sql_exp *r) { sql_subtype *lt = exp_subtype(l); @@ -2135,7 +2078,7 @@ rel_logical_value_exp(mvc *sql, sql_rel } } - if (!left || (!left->l && f == sql_sel)) { + if (!left || (!left->l && f == sql_sel && list_empty(left->exps))) { needproj = (left != NULL); left = rel_project_exp(sql->sa, l); } @@ -3276,7 +3219,7 @@ rel_binop_(mvc *sql, sql_exp *l, sql_exp } else if (f->func->fix_scale == SCALE_DIV) { l = exp_scale_algebra(sql, f, l, r); } else if (f->func->fix_scale == SCALE_MUL) { - l = exp_sum_scales(sql, f, l, r); + exp_sum_scales(f, l, r); } else if (f->func->fix_scale == DIGITS_ADD) { sql_subtype *res = f->res->h->data; res->digits = (t1->digits && t2->digits)?t1->digits + t2->digits:0; @@ -3370,7 +3313,7 @@ rel_binop_(mvc *sql, sql_exp *l, sql_exp } else if (f->func->fix_scale == SCALE_DIV) { l = exp_scale_algebra(sql, f, l, r); } else if (f->func->fix_scale == SCALE_MUL) { - l = exp_sum_scales(sql, f, l, r); + exp_sum_scales(f, l, r); } else if (f->func->fix_scale == DIGITS_ADD) { sql_subtype *res = f->res->h->data; res->digits = (t1->digits && t2->digits)?t1->digits + t2->digits:0; diff --git a/sql/test/BugTracker-2018/Tests/All b/sql/test/BugTracker-2018/Tests/All --- a/sql/test/BugTracker-2018/Tests/All +++ b/sql/test/BugTracker-2018/Tests/All @@ -45,3 +45,5 @@ sqlitelogictest-mal-calc-undefined.Bug-6 sqlitelogictest-complex-case.Bug-6568 sqlitelogictest-not-between-wrong.Bug-6569 sqlitelogictest-undefined-calc.Bug-6570 +ordered-index-error.Bug-6572 +sqlitelogictest-complex-case.Bug-6573 diff --git a/sql/test/BugTracker-2018/Tests/ordered-index-error.Bug-6572.sql b/sql/test/BugTracker-2018/Tests/ordered-index-error.Bug-6572.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2018/Tests/ordered-index-error.Bug-6572.sql @@ -0,0 +1,15 @@ +create table t1(v0 int, v1 char(1)); +insert into t1 values (1,'a'),(2,'b'),(3,'c'); +create ordered index index_t1_v1 on t1(v1); + +create table t2(v1 char(1)); +insert into t2 values ('a'); + +create temp table t3 as +(select t1.v0 from t1,t2 where trim(t2.v1)=t1.v1) +on commit preserve rows; + +drop index index_t1_v1; +drop table t1; +drop table t2; +drop table t3; diff --git a/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-nullif-coalesce.Bug-6565.sql b/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-nullif-coalesce.Bug-6565.sql --- a/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-nullif-coalesce.Bug-6565.sql +++ b/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-nullif-coalesce.Bug-6565.sql @@ -1,3 +1,3 @@ SELECT + NULLIF ( + 67, + + NULLIF ( + + 46, 66 - CASE WHEN 51 IN ( + 91 ) THEN + SUM ( CAST ( NULL AS INTEGER ) ) + - 92 ELSE - ( - 47 ) END ) ) / - CAST ( NULL AS INTEGER ) + + NULLIF ( - COALESCE ( CAST ( - 35 AS INTEGER ), + 6, -COUNT ( ALL 28 ) ), 75 + 14 ); +CAST ( COUNT ( ALL 28 ) AS INT) ), 75 + 14 ); diff --git a/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case.Bug-6568.stable.err b/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case.Bug-6568.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case.Bug-6568.stable.err @@ -0,0 +1,35 @@ +stderr of test 'sqlitelogictest-complex-case.Bug-6568` in directory 'sql/test/BugTracker-2018` itself: + + +# 10:35:09 > +# 10:35:09 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=31034" "--set" "mapi_usock=/var/tmp/mtest-7017/.s.monetdb.31034" "--set" "monet_prompt=" "--forcemito" "--dbpath=/home/niels/scratch/rc-old/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2018" "--set" "embedded_c=true" +# 10:35:09 > + +# builtin opt gdk_dbpath = /home/niels/scratch/rc-old/Linux-x86_64/var/monetdb5/dbfarm/demo +# builtin opt gdk_debug = 0 +# builtin opt gdk_vmtrim = no +# builtin opt monet_prompt = > +# builtin opt monet_daemon = no +# builtin opt mapi_port = 50000 +# builtin opt mapi_open = false +# builtin opt mapi_autosense = false +# builtin opt sql_optimizer = default_pipe +# builtin opt sql_debug = 0 +# cmdline opt gdk_nr_threads = 0 +# cmdline opt mapi_open = true +# cmdline opt mapi_port = 31034 +# cmdline opt mapi_usock = /var/tmp/mtest-7017/.s.monetdb.31034 +# cmdline opt monet_prompt = +# cmdline opt gdk_dbpath = /home/niels/scratch/rc-old/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2018 +# cmdline opt embedded_c = true +# cmdline opt gdk_debug = 553648138 + +# 10:35:09 > +# 10:35:09 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-7017" "--port=31034" +# 10:35:09 > + + +# 10:35:09 > +# 10:35:09 > "Done." +# 10:35:09 > + diff --git a/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case.Bug-6568.stable.out b/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case.Bug-6568.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case.Bug-6568.stable.out @@ -0,0 +1,39 @@ +stdout of test 'sqlitelogictest-complex-case.Bug-6568` in directory 'sql/test/BugTracker-2018` itself: + + +# 10:35:09 > +# 10:35:09 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=31034" "--set" "mapi_usock=/var/tmp/mtest-7017/.s.monetdb.31034" "--set" "monet_prompt=" "--forcemito" "--dbpath=/home/niels/scratch/rc-old/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2018" "--set" "embedded_c=true" +# 10:35:09 > + +# MonetDB 5 server v11.29.2 +# This is an unreleased version +# Serving database 'mTests_sql_test_BugTracker-2018', using 8 threads +# Compiled for x86_64-unknown-linux-gnu/64bit +# Found 15.387 GiB available main-memory. +# Copyright (c) 1993 - July 2008 CWI. +# Copyright (c) August 2008 - 2018 MonetDB B.V., all rights reserved +# Visit https://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://xps13:31034/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-7017/.s.monetdb.31034 +# MonetDB/GIS module loaded +# MonetDB/SQL module loaded + +Ready. + +# 10:35:09 > +# 10:35:09 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-7017" "--port=31034" +# 10:35:09 > + +#SELECT - 76 AS col2, CASE WHEN CAST ( - MAX ( DISTINCT - 75 ) AS INTEGER ) IS NOT NULL THEN + 4 * - + 48 * + 51 * - - +#54 * - 77 * 46 WHEN NOT ( NULL ) IN ( + - ( - - 49 ) * - 1, - 41, - 14 - - CASE - - 1 WHEN - - 82 THEN - - 23 END / + 46 +#- - 87 * + 52 ) THEN 56 ELSE NULL END AS col2; +% .L2, .L21 # table_name +% col2, col2 # name +% tinyint, bigint # type +% 3, 10 # length +[ -76, 1872896256 ] + +# 10:35:09 > +# 10:35:09 > "Done." _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list