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