Changeset: 402b850db455 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=402b850db455
Modified Files:
        sql/server/rel_exp.c
        sql/test/SQLancer/Tests/sqlancer07.sql
        sql/test/SQLancer/Tests/sqlancer07.stable.out
        sql/test/SQLancer/Tests/sqlancer07.stable.out.int128
Branch: Oct2020
Log Message:

rel psm expressions are allowed in a list of atoms because of subqueries, ugh. 
Fixed sqlancer crash by exteding type propagation through subquery single 
projection


diffs (99 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
@@ -3040,21 +3040,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/test/SQLancer/Tests/sqlancer07.sql 
b/sql/test/SQLancer/Tests/sqlancer07.sql
--- a/sql/test/SQLancer/Tests/sqlancer07.sql
+++ b/sql/test/SQLancer/Tests/sqlancer07.sql
@@ -327,3 +327,5 @@ 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);
diff --git a/sql/test/SQLancer/Tests/sqlancer07.stable.out 
b/sql/test/SQLancer/Tests/sqlancer07.stable.out
--- a/sql/test/SQLancer/Tests/sqlancer07.stable.out
+++ b/sql/test/SQLancer/Tests/sqlancer07.stable.out
@@ -476,6 +476,18 @@ stdout of test 'sqlancer07` in directory
 % month_interval # type
 % 1 # length
 [ 1    ]
+#START TRANSACTION;
+#create view v10(vc0) as (select l0v0.vc0 from (values (1, 2)) as l0v0(vc0, 
vc1));
+#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    ]
 
 # 10:16:14 >  
 # 10:16:14 >  "Done."
diff --git a/sql/test/SQLancer/Tests/sqlancer07.stable.out.int128 
b/sql/test/SQLancer/Tests/sqlancer07.stable.out.int128
--- a/sql/test/SQLancer/Tests/sqlancer07.stable.out.int128
+++ b/sql/test/SQLancer/Tests/sqlancer07.stable.out.int128
@@ -473,6 +473,18 @@ stdout of test 'sqlancer07` in directory
 % month_interval # type
 % 1 # length
 [ 1    ]
+#START TRANSACTION;
+#create view v10(vc0) as (select l0v0.vc0 from (values (1, 2)) as l0v0(vc0, 
vc1));
+#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    ]
 
 # 10:16:14 >  
 # 10:16:14 >  "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to