Changeset: 9b15988872ef for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9b15988872ef
Modified Files:
        sql/server/rel_select.c
        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: Jan2022
Log Message:

Type progagation in SQL parameters has been improved. Don't be so restrictive 
anymore


diffs (91 lines):

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
@@ -5666,14 +5666,13 @@ rel_select_exp(sql_query *query, sql_rel
                list *te = NULL;
                sql_exp *ce = rel_column_exp(query, &inner, n->data.sym, 
sql_sel | group_totals);
 
-               if (ce && (exp_subtype(ce) || exp_is_rel(ce) || (ce->type == 
e_atom && !ce->l && !ce->f))) { /* Allow parameters and subqueries to be 
propagated */
+               if (ce) {
                        pexps = append(pexps, ce);
                        rel = inner;
                        continue;
-               } else if (!ce) {
+               } else {
                        te = rel_table_exp(query, &rel, n->data.sym, 
!list_length(pexps) && !n->next);
-               } else
-                       ce = NULL;
+               }
                if (!ce && !te) {
                        if (sql->errstr[0])
                                return NULL;
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
@@ -69,3 +69,7 @@ PREPARE SELECT "quarter"(date '2021-01-0
 PREPARE SELECT "quarter"(date '2021-01-02') IN ("second"(TIME '01:00:00'), 
(select ? where true));
 
 PREPARE SELECT 1 FROM idontexist(?,16); --error, function doesn't exist
+
+PREPARE WITH x(a) AS (SELECT ?) SELECT x.a FROM x; --error, cannot define type 
for the parameter
+PREPARE WITH x(a) AS (SELECT ?) SELECT CAST(x.a AS INT) FROM x;
+EXEC **(1);
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
@@ -36,3 +36,7 @@ MAPI  = (monetdb) /var/tmp/mtest-185783/
 QUERY = PREPARE SELECT 1 FROM idontexist(?,16); --error, function doesn't exist
 ERROR = !SELECT: no such table returning function 'idontexist'(?, tinyint)
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-185783/.s.monetdb.32587
+QUERY = PREPARE WITH x(a) AS (SELECT ?) SELECT x.a FROM x; --error, cannot 
define type for the parameter
+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
@@ -40,3 +40,7 @@ MAPI  = (monetdb) /var/tmp/mtest-185783/
 QUERY = PREPARE SELECT 1 FROM idontexist(?,16); --error, function doesn't exist
 ERROR = !SELECT: no such table returning function 'idontexist'(?, tinyint)
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-185783/.s.monetdb.32587
+QUERY = PREPARE WITH x(a) AS (SELECT ?) SELECT x.a FROM x; --error, cannot 
define type for the parameter
+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
@@ -147,4 +147,14 @@
 % 7,   2,      1,      0,      3,      3 # length
 [ "boolean",   1,      0,      "",     "%12",  "%12"   ]
 [ "decimal",   16,     6,      NULL,   NULL,   NULL    ]
-
+% .prepare,    .prepare,       .prepare,       .prepare,       .prepare,       
.prepare # table_name
+% type,        digits, scale,  schema, table,  column # name
+% varchar,     int,    int,    varchar,        varchar,        varchar # type
+% 3,   2,      1,      0,      1,      1 # length
+[ "int",       32,     0,      "",     "x",    "a"     ]
+[ "int",       32,     0,      NULL,   NULL,   NULL    ]
+% .x # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
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
@@ -138,3 +138,14 @@
 % 7,   2,      1,      0,      3,      3 # length
 [ "boolean",   1,      0,      "",     "%12",  "%12"   ]
 [ "decimal",   16,     6,      NULL,   NULL,   NULL    ]
+% .prepare,    .prepare,       .prepare,       .prepare,       .prepare,       
.prepare # table_name
+% type,        digits, scale,  schema, table,  column # name
+% varchar,     int,    int,    varchar,        varchar,        varchar # type
+% 3,   2,      1,      0,      1,      1 # length
+[ "int",       32,     0,      "",     "x",    "a"     ]
+[ "int",       32,     0,      NULL,   NULL,   NULL    ]
+% .x # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to