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

Reply via email to