Changeset: 0b72d54e38a2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0b72d54e38a2 Removed Files: sql/test/SQLancer/Tests/sqlancer07.sql sql/test/SQLancer/Tests/sqlancer07.stable.err sql/test/SQLancer/Tests/sqlancer07.stable.err.int128 sql/test/SQLancer/Tests/sqlancer07.stable.out sql/test/SQLancer/Tests/sqlancer07.stable.out.int128 sql/test/SQLancer/Tests/sqlancer10.sql Modified Files: sql/server/rel_exp.c sql/server/rel_optimizer.c sql/server/rel_select.c sql/server/rel_unnest.c sql/test/SQLancer/Tests/sqlancer07.test sql/test/prepare/Tests/sqlancer_prepare.sql sql/test/prepare/Tests/sqlancer_prepare.stable.err sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128 sql/test/prepare/Tests/sqlancer_prepare.stable.out sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128 Branch: default Log Message:
Merged with Oct2020 diffs (204 lines): diff --git a/NT/mkodbcwxs.py b/NT/mkodbcwxs.py --- a/NT/mkodbcwxs.py +++ b/NT/mkodbcwxs.py @@ -84,6 +84,8 @@ def main(): vcpkg.format(r'bin\bz2.dll'), vcpkg.format(r'bin\charset-1.dll'), # for iconv-2.dll vcpkg.format(r'bin\libcrypto-1_1{}.dll'.format(libcrypto)), + vcpkg.format(r'bin\lz4.dll'), + vcpkg.format(r'bin\lzma.dll'), vcpkg.format(r'bin\zlib1.dll')]) print(r' </Directory>') id = comp(features, id, 12, 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 @@ -3048,21 +3048,30 @@ exp_set_list_recurse(mvc *sql, sql_subty if (!e) return 0; - assert(e->type == e_atom); - if (e->f) { - const char *next_rel = exp_relname(e), *next_exp = exp_name(e); - if (next_rel && next_exp && !strcmp(next_rel, *relname) && !strcmp(next_exp, *expname)) - for (node *n = ((list *) e->f)->h; n; n = n->next) + if (exp_is_rel(e)) { + /* Try to set parameters on the list of projections of the subquery. For now I won't go any further, ugh */ + sql_rel *r = exp_rel_get_rel(sql->sa, e); + if ((is_simple_project(r->op) || is_groupby(r->op)) && list_length(r->exps) == 1) { + for (node *n = r->exps->h; n; n = n->next) if (exp_set_list_recurse(sql, type, (sql_exp *) n->data, relname, expname) < 0) return -1; - } - if (e->f && !e->tpe.type) { - e->tpe = *type; - } else if (!e->l && !e->r && !e->f && !e->tpe.type) { - if (set_type_param(sql, type, e->flag) == 0) + } + } else if (e->type == e_atom) { + if (e->f) { + const char *next_rel = exp_relname(e), *next_exp = exp_name(e); + if (next_rel && next_exp && !strcmp(next_rel, *relname) && !strcmp(next_exp, *expname)) + for (node *n = ((list *) e->f)->h; n; n = n->next) + if (exp_set_list_recurse(sql, type, (sql_exp *) n->data, relname, expname) < 0) + return -1; + } + if (e->f && !e->tpe.type) { e->tpe = *type; - else - return -1; + } else if (!e->l && !e->r && !e->f && !e->tpe.type) { + if (set_type_param(sql, type, e->flag) == 0) + e->tpe = *type; + else + return -1; + } } return 0; } 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 @@ -5711,7 +5711,7 @@ rel_groupby_order(visitor *v, sql_rel *r if (ngbe - i > 1) { for (int j = i; j < ngbe; j++) { sql_subtype *t = exp_subtype(exps[j]); - scores[j] = t->digits; + scores[j] = t ? t->digits : 0; } /* the less number of digits the better, order ascending */ GDKqsort(scores + i, exps + i, NULL, ngbe - i, sizeof(int), sizeof(void *), TYPE_int, false, true); 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 @@ -1794,8 +1794,16 @@ exp_exist(sql_query *query, sql_rel *rel if (!exp_name(le)) exp_label(sql->sa, le, ++sql->label); - if (!exp_subtype(le) && rel_set_type_param(sql, sql_bind_localtype("bit"), rel, le, 0) < 0) /* workaround */ + if (!exp_subtype(le) && rel_set_type_param(sql, sql_bind_localtype("bit"), rel, le, 0) < 0) { /* workaround */ return NULL; + } else if (exp_is_rel(le)) { /* for the subquery case, propagate to the inner query */ + sql_rel *r = exp_rel_get_rel(sql->sa, le); + if (is_simple_project(r->op) || is_groupby(r->op)) { + for (node *n = r->exps->h; n; n = n->next) + if (!exp_subtype(n->data) && rel_set_type_param(sql, sql_bind_localtype("bit"), r, n->data, 0) < 0) /* workaround */ + return NULL; + } + } t = exp_subtype(le); if (exists) diff --git a/sql/test/SQLancer/Tests/sqlancer07.test b/sql/test/SQLancer/Tests/sqlancer07.test --- a/sql/test/SQLancer/Tests/sqlancer07.test +++ b/sql/test/SQLancer/Tests/sqlancer07.test @@ -623,3 +623,7 @@ select interval '1' month * cast(1 as bi ---- 1 +query I rowsort +select case 3 <> any(select 4) when true then 2 when false then 8 end; +---- +2 diff --git a/sql/test/prepare/Tests/sqlancer_prepare.sql b/sql/test/prepare/Tests/sqlancer_prepare.sql --- a/sql/test/prepare/Tests/sqlancer_prepare.sql +++ b/sql/test/prepare/Tests/sqlancer_prepare.sql @@ -43,3 +43,14 @@ PREPARE (SELECT DISTINCT ((CAST(- (CASE WHERE ((rtrim(r'Z'))LIKE(r'rK'))) UNION ALL (SELECT ALL ? WHERE (scale_down(ifthenelse(TRUE, 18, ?), r'4')) IS NULL); PREPARE VALUES (CASE WHEN true THEN 5 BETWEEN 4 AND 2 END); + +START TRANSACTION; +create view v10(vc0) as (select l0v0.vc0 from (values (1, 2)) as l0v0(vc0, vc1)); +prepare select case when true then false when ? then not exists (select ?, ?, 6) end from v10 as l0v10; +ROLLBACK; + +prepare values (0.34, (values ((select ? from (select 1) as t1(x))))), (3, 2); + +prepare with cte0(c0) as (select 1), cte1(c0,c1,c2) as (select distinct 1, 2, false) +select distinct least('y', (values (''), (''))), 1, (select ? from (select 1) as l1v0(x)) +from cte0 as l0cte0, cte1 as l0cte1 order by l0cte0.c0 desc nulls last, l0cte1.c2 desc nulls first; -- ? can't be defined, so error diff --git a/sql/test/prepare/Tests/sqlancer_prepare.stable.err b/sql/test/prepare/Tests/sqlancer_prepare.stable.err --- a/sql/test/prepare/Tests/sqlancer_prepare.stable.err +++ b/sql/test/prepare/Tests/sqlancer_prepare.stable.err @@ -22,3 +22,9 @@ MAPI = (monetdb) /var/tmp/mtest-918314/ QUERY = PREPARE VALUES (CAST(? >> 1.2 AS INTERVAL SECOND)), (interval '1' second); -- error, types decimal(2,1) and sec_interval(13,0) are not equal ERROR = !types decimal(2,1) and sec_interval(13,0) are not equal CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-363257/.s.monetdb.38983 +QUERY = prepare with cte0(c0) as (select 1), cte1(c0,c1,c2) as (select distinct 1, 2, false) + select distinct least('y', (values (''), (''))), 1, (select ? from (select 1) as l1v0(x)) + from cte0 as l0cte0, cte1 as l0cte1 order by l0cte0.c0 desc nulls last, l0cte1.c2 desc nulls first; -- ? can't be defined, so error +ERROR = !Could not determine type for argument number 1 +CODE = 42000 diff --git a/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128 b/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128 --- a/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128 +++ b/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128 @@ -26,3 +26,9 @@ MAPI = (monetdb) /var/tmp/mtest-918314/ QUERY = PREPARE VALUES (CAST(? >> 1.2 AS INTERVAL SECOND)), (interval '1' second); -- error, types decimal(2,1) and sec_interval(13,0) are not equal ERROR = !types decimal(2,1) and sec_interval(13,0) are not equal CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-363257/.s.monetdb.38983 +QUERY = prepare with cte0(c0) as (select 1), cte1(c0,c1,c2) as (select distinct 1, 2, false) + select distinct least('y', (values (''), (''))), 1, (select ? from (select 1) as l1v0(x)) + from cte0 as l0cte0, cte1 as l0cte1 order by l0cte0.c0 desc nulls last, l0cte1.c2 desc nulls first; -- ? can't be defined, so error +ERROR = !Could not determine type for argument number 1 +CODE = 42000 diff --git a/sql/test/prepare/Tests/sqlancer_prepare.stable.out b/sql/test/prepare/Tests/sqlancer_prepare.stable.out --- a/sql/test/prepare/Tests/sqlancer_prepare.stable.out +++ b/sql/test/prepare/Tests/sqlancer_prepare.stable.out @@ -88,3 +88,25 @@ % varchar, int, int, str, str, str # type % 7, 1, 1, 0, 2, 2 # length [ "boolean", 1, 0, "", "%1", "%1" ] +#START TRANSACTION; +#create view v10(vc0) as (select l0v0.vc0 from (values (1, 2)) as l0v0(vc0, vc1)); +#prepare select case when true then false when ? then not exists (select ?, ?, 6) end from v10 as l0v10; +#prepare select case when true then false when ? then not exists (select ?, ?, 6) end from v10 as l0v10; +% .prepare, .prepare, .prepare, .prepare, .prepare, .prepare # table_name +% type, digits, scale, schema, table, column # name +% varchar, int, int, str, str, str # type +% 7, 1, 1, 0, 3, 3 # length +[ "boolean", 1, 0, "", "%11", "%11" ] +[ "boolean", 1, 0, NULL, NULL, NULL ] +[ "boolean", 1, 0, NULL, NULL, NULL ] +[ "boolean", 1, 0, NULL, NULL, NULL ] +#ROLLBACK; +#prepare values (0.34, (values ((select ? from (select 1) as t1(x))))), (3, 2); +#prepare values (0.34, (values ((select ? from (select 1) as t1(x))))), (3, 2); +% .prepare, .prepare, .prepare, .prepare, .prepare, .prepare # table_name +% type, digits, scale, schema, table, column # name +% varchar, int, int, str, str, str # type +% 7, 1, 1, 0, 2, 2 # length +[ "decimal", 3, 2, "", "%1", "%1" ] +[ "tinyint", 2, 0, "", "%2", "%2" ] +[ "tinyint", 2, 0, NULL, NULL, NULL ] diff --git a/sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128 b/sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128 --- a/sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128 +++ b/sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128 @@ -79,3 +79,25 @@ % varchar, int, int, str, str, str # type % 7, 1, 1, 0, 2, 2 # length [ "boolean", 1, 0, "", "%1", "%1" ] +#START TRANSACTION; +#create view v10(vc0) as (select l0v0.vc0 from (values (1, 2)) as l0v0(vc0, vc1)); +#prepare select case when true then false when ? then not exists (select ?, ?, 6) end from v10 as l0v10; +#prepare select case when true then false when ? then not exists (select ?, ?, 6) end from v10 as l0v10; +% .prepare, .prepare, .prepare, .prepare, .prepare, .prepare # table_name +% type, digits, scale, schema, table, column # name +% varchar, int, int, str, str, str # type +% 7, 1, 1, 0, 3, 3 # length +[ "boolean", 1, 0, "", "%11", "%11" ] +[ "boolean", 1, 0, NULL, NULL, NULL ] +[ "boolean", 1, 0, NULL, NULL, NULL ] +[ "boolean", 1, 0, NULL, NULL, NULL ] +#ROLLBACK; +#prepare values (0.34, (values ((select ? from (select 1) as t1(x))))), (3, 2); +#prepare values (0.34, (values ((select ? from (select 1) as t1(x))))), (3, 2); +% .prepare, .prepare, .prepare, .prepare, .prepare, .prepare # table_name +% type, digits, scale, schema, table, column # name +% varchar, int, int, str, str, str # type +% 7, 1, 1, 0, 2, 2 # length +[ "decimal", 3, 2, "", "%1", "%1" ] +[ "tinyint", 2, 0, "", "%2", "%2" ] +[ "tinyint", 2, 0, NULL, NULL, NULL ] _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list