Changeset: 22e26f2548f2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=22e26f2548f2 Removed Files: sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.sql sql/test/SQLancer/Tests/sqlancer11.sql Modified Files: clients/mapiclient/dump.c gdk/gdk_subquery.c sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_select.c sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.test sql/test/SQLancer/Tests/sqlancer11.test sql/test/testdb-upgrade-hge/Tests/dump.stable.out sql/test/testdb-upgrade/Tests/dump.stable.out sql/test/testdb/Tests/dump-nogeom.stable.out sql/test/testdb/Tests/dump.stable.out Branch: default Log Message:
Merged with Oct2020 diffs (truncated from 495 to 300 lines): diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -1256,7 +1256,11 @@ describe_table(Mapi mid, const char *sch goto bailout; while (mapi_fetch_row(hdl) != 0) expr = mapi_fetch_field(hdl, 0); - mnstr_printf(toConsole, " PARTITION BY %s %s (%s)", phow, pusing, expr); + mnstr_printf(toConsole, " PARTITION BY %s %s (", phow, pusing); + if (column) + dquoted_print(toConsole, expr, ")"); + else + mnstr_printf(toConsole, "%s)", expr); mapi_close_handle(hdl); } } diff --git a/gdk/gdk_subquery.c b/gdk/gdk_subquery.c --- a/gdk/gdk_subquery.c +++ b/gdk/gdk_subquery.c @@ -574,7 +574,6 @@ alloc_fail: ret[gid] = VAL2; \ } else if (is_##TYPE##_nil(vals1[i]) || is_##TYPE##_nil(vals2[i])) { \ ret[gid] = bit_nil; \ - hasnil = 1; \ } else if (vals1[i] == vals2[i]) { \ ret[gid] = VAL1; \ } \ @@ -671,7 +670,6 @@ BATanyequal_grp2(BAT *l, BAT *r, BAT *ri const void *rv = BUNtail(ri, i); if (ocmp(lv, nilp) == 0 || ocmp(rv, nilp) == 0) { ret[gid] = bit_nil; - hasnil = 1; } else if (ocmp(lv, rv) == 0) ret[gid] = TRUE; } @@ -680,6 +678,8 @@ BATanyequal_grp2(BAT *l, BAT *r, BAT *ri } } } + for (BUN i = 0 ; i < ngrp ; i++) + hasnil |= ret[i] == bit_nil; BATsetcount(res, ngrp); res->tkey = BATcount(res) <= 1; res->tsorted = BATcount(res) <= 1; @@ -790,7 +790,6 @@ BATallnotequal_grp2(BAT *l, BAT *r, BAT const void *rv = BUNtail(ri, i); if (ocmp(lv, nilp) == 0 || ocmp(rv, nilp) == 0) { ret[gid] = bit_nil; - hasnil = 1; } else if (ocmp(lv, rv) == 0) ret[gid] = FALSE; } @@ -799,6 +798,8 @@ BATallnotequal_grp2(BAT *l, BAT *r, BAT } } } + for (BUN i = 0 ; i < ngrp ; i++) + hasnil |= ret[i] == bit_nil; BATsetcount(res, ngrp); res->tkey = BATcount(res) <= 1; res->tsorted = BATcount(res) <= 1; 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 @@ -228,26 +228,6 @@ exp_or(sql_allocator *sa, list *l, list return e; } -static int /* if the quantifier has to be upcasted, ignore the upper conversion for the cardinalilty */ -quantifier_has_rel(sql_exp *e) -{ - if (!e) - return 0; - switch(e->type){ - case e_convert: - return quantifier_has_rel(e->l); - case e_psm: - return exp_is_rel(e); - case e_atom: - case e_column: - case e_func: - case e_aggr: - case e_cmp: - return 0; - } - return 0; -} - sql_exp * exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype) { @@ -261,7 +241,7 @@ exp_in(sql_allocator *sa, sql_exp *l, li for (node *n = r->h; n ; n = n->next) { sql_exp *next = n->data; - if (!quantifier_has_rel(next) && exps_card < next->card) + if (!exp_is_rel(next) && exps_card < next->card) exps_card = next->card; } e->card = MAX(l->card, exps_card); @@ -296,10 +276,10 @@ exp_in_func(mvc *sql, sql_exp *le, sql_e for (node *n = ((list*)vals->f)->h ; n ; n = n->next) { sql_exp *next = n->data; - if (!quantifier_has_rel(next) && exps_card < next->card) + if (!exp_is_rel(next) && exps_card < next->card) exps_card = next->card; } - } else if (!quantifier_has_rel(vals)) + } else if (!exp_is_rel(vals)) exps_card = vals->card; e->card = MAX(le->card, exps_card); @@ -320,7 +300,7 @@ exp_compare_func(mvc *sql, sql_exp *le, if (e) { e->flag = quantifier; /* At ANY and ALL operators, the cardinality on the right side is ignored if it is a sub-relation */ - e->card = quantifier && quantifier_has_rel(re) ? le->card : MAX(le->card, re->card); + e->card = quantifier && exp_is_rel(re) ? le->card : MAX(le->card, re->card); if (!has_nil(le) && !has_nil(re)) set_has_no_nil(e); } @@ -1919,7 +1899,28 @@ exp_is_null(sql_exp *e ) int exp_is_rel( sql_exp *e ) { - return (e && e->type == e_psm && e->flag == PSM_REL && e->l); + if (e) { + switch(e->type){ + case e_convert: + return exp_is_rel(e->l); + case e_psm: + return e->flag == PSM_REL && e->l; + default: + return 0; + } + } + return 0; +} + +int +exps_one_is_rel(list *exps) +{ + if (list_empty(exps)) + return 0; + for(node *n = exps->h ; n ; n = n->next) + if (exp_is_rel(n->data)) + return 1; + return 0; } int 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 @@ -152,6 +152,7 @@ extern int exp_is_zero(sql_exp *e); extern int exp_is_not_null(sql_exp *e); extern int exp_is_null(sql_exp *e); extern int exp_is_rel(sql_exp *e); +extern int exps_one_is_rel(list *exps); extern int exp_has_rel(sql_exp *e); extern int exps_have_rel_exp(list *exps); extern int exps_have_func(list *exps); 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 @@ -1504,6 +1504,8 @@ rel_filter(mvc *sql, sql_rel *rel, list return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "SELECT: no such FILTER function %s%s%s'%s'", sname ? "'":"", sname ? sname : "", sname ? "'.":"", filter_op); e = exp_filter(sql->sa, l, r, f, anti); + if (exps_one_is_rel(l) || exps_one_is_rel(r)) /* uncorrelated subquery case */ + return rel_select(sql->sa, rel, e); /* atom or row => select */ if (exps_card(l) > rel->card) { sql_exp *ls = l->h->data; @@ -1550,9 +1552,10 @@ rel_select_push_exp_down(mvc *sql, sql_r { if (!is_join(rel->op) && !is_select(rel->op)) return rel_select(sql->sa, rel, e); - if (rs->card <= CARD_ATOM && (exp_is_atom(rs) || exp_has_freevar(sql, rs) || exp_has_freevar(sql, ls)) && - (!rs2 || (rs2->card <= CARD_ATOM && (exp_is_atom(rs2) || exp_has_freevar(sql, rs2))))) { - if ((ls->card == rs->card && (!rs2 || ls->card == rs2->card)) || rel->processed) /* bin compare op */ + if ((rs->card <= CARD_ATOM || (rs2 && ls->card <= CARD_ATOM)) && + (exp_is_atom(rs) || (rs2 && exp_is_atom(ls)) || exp_has_freevar(sql, rs) || exp_has_freevar(sql, ls)) && + (!rs2 || (rs2->card <= CARD_ATOM && (exp_is_atom(rs2) || exp_has_freevar(sql, rs2))))) { + if ((ls->card == rs->card && (!rs2 || ls->card == rs2->card || rs->card == rs2->card)) || rel->processed) /* bin compare op */ return rel_select(sql->sa, rel, e); return push_select_exp(sql, rel, e, ls, L, f); @@ -1568,7 +1571,7 @@ rel_compare_exp_(sql_query *query, sql_r mvc *sql = query->sql; sql_exp *e = NULL; - if (quantifier || exp_is_rel(ls) || exp_is_rel(rs)) { + if (quantifier || exp_is_rel(ls) || exp_is_rel(rs) || (rs2 && exp_is_rel(rs2))) { if (rs2) { e = exp_compare2(sql->sa, ls, rs, rs2, type); if (anti) diff --git a/sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.test b/sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.test --- a/sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.test +++ b/sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.test @@ -1,8 +1,9 @@ query IIII rowsort -select extract(second from interval '3600' second), extract(hour from interval '3600' second), extract(epoch from interval '3600' second), extract(epoch from now() - now()) +select extract(second from interval '3600' second), extract(hour from interval '3600' second), extract(epoch from interval '3600' second), extract(epoch from timestamp '2010-10-01 10:00:00' - timestamp '2010-10-01 10:00:00') ---- 0 1 3600000 0 + diff --git a/sql/test/SQLancer/Tests/sqlancer11.test b/sql/test/SQLancer/Tests/sqlancer11.test --- a/sql/test/SQLancer/Tests/sqlancer11.test +++ b/sql/test/SQLancer/Tests/sqlancer11.test @@ -49,4 +49,123 @@ DROP TABLE t1 statement ok DROP TABLE t0 +statement ok +CREATE TABLE "sys"."t0" ("c0" BOOLEAN,"c1" DECIMAL(14,3)) +statement ok +COPY 7 RECORDS INTO "sys"."t0" FROM stdin USING DELIMITERS E'\t',E'\n','"' +<COPY_INTO_DATA> +false 0.458 +true 4.112 +false 0.201 +false 0.347 +true 0.420 +false 0.127 +false 0.502 + +statement ok +CREATE TABLE "sys"."t1" ("c0" BOOLEAN,"c1" DECIMAL(14,3)) + +statement ok +COPY 10 RECORDS INTO "sys"."t1" FROM stdin USING DELIMITERS E'\t',E'\n','"' +<COPY_INTO_DATA> +NULL 0.000 +false 0.187 +false 0.000 +false NULL +false NULL +true NULL +NULL 0.325 +NULL 0.374 +true NULL +true NULL + +statement error +select 1 from t1, t0 where cast(t1.c1 as clob) not like ((select 'A' from t0, t1) except all (select 'B' from t0)) + +statement error +select 1 from t1, t0 where (select 1 from t1) like cast(t1.c1 as clob) + +statement error +select 1 from t1, t0 where cast(t1.c1 as clob) between 'b' and ((select 'A' from t0)) + +statement error +select 1 from t1, t0 where ((select 'A' from t0)) between cast(t1.c1 as clob) and 'a' + +statement error +select 1 from t1, t0 where cast(t1.c1 as clob) between ((select 1 from t0)) and 'c' + +statement ok +drop table t0 + +statement ok +drop table t1 + +statement ok +START TRANSACTION + +statement ok +CREATE TABLE "t0" ("c0" DOUBLE PRECISION,"c2" BIGINT) + +statement ok +INSERT INTO "t0" VALUES (NULL, 4), (NULL, 6), (NULL, 0), (NULL, 2), (NULL, 1) + +statement ok +CREATE TABLE "t2" ("c0" DOUBLE PRECISION,"c1" bigint,"c2" BIGINT,"c4" REAL) + +statement ok +INSERT INTO "t2" VALUES (4, 0, 6, NULL),(0.692789052132086, -1, 9, NULL),(2, 0, 6, NULL),(0.9469594820593024, 1, NULL, NULL),(NULL, 0, 6, NULL), +(0.39272912837466945, 8, NULL, NULL),(NULL, NULL, 4, NULL),(2, 0, 6, NULL),(-1596101049, 0, 6, NULL),(-1951243968, 0, 6, NULL),(NULL, 0, 6, NULL), +(NULL, 0, 6, NULL),(NULL, 0, 6, NULL),(NULL, 0, 6, NULL) + +query T rowsort +SELECT 4 = ANY(SELECT t2.c2 FROM t2) FROM t0 +---- +True +True +True +True +True + +statement ok +ROLLBACK + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list