Changeset: fb9da9f2ad92 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fb9da9f2ad92
Modified Files:
sql/server/rel_exp.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
Branch: default
Log Message:
Don't look for parameters if not found under set relations. Later we could
attempt to set parameters types used as freevars
diffs (66 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
@@ -3080,6 +3080,10 @@ rel_set_type_param(mvc *sql, sql_subtype
else if (upcast && type->type->eclass == EC_FLT)
type = sql_bind_localtype("dbl");
+ /* TODO we could use the sql_query* struct to set paremeters used as
freevars,
+ but it requires to change a lot of interfaces */
+ /* if (is_freevar(exp))
+ rel = query_fetch_outer(query, is_freevar(exp)-1); */
return set_exp_type(sql, type, rel, exp);
}
@@ -3246,7 +3250,7 @@ rel_find_parameter(mvc *sql, sql_subtype
return 0;
const char *nrname = relname, *nename = expname;
- if ((is_simple_project(rel->op) || is_groupby(rel->op)) &&
!list_empty(rel->exps)) {
+ if (is_project(rel->op) && !list_empty(rel->exps)) {
sql_exp *e = NULL;
if (nrname && nename) { /* find the column reference and
propagate type setting */
@@ -3256,6 +3260,10 @@ rel_find_parameter(mvc *sql, sql_subtype
}
if (!e)
return 0; /* not found */
+ if (is_set(rel->op)) { /* TODO for set relations this needs
further improvement */
+ (void) sql_error(sql, 10, SQLSTATE(42000) "Cannot set
parameter types under set relations at the moment");
+ return -1;
+ }
/* set order by column types */
if (is_simple_project(rel->op) && !list_empty(rel->r)) {
sql_exp *ordere = 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
@@ -91,3 +91,6 @@ create or replace function mybooludf(a b
PREPARE (SELECT ?) EXCEPT (SELECT 'a' FROM (SELECT 1) x(x) JOIN ((SELECT
FALSE) EXCEPT (SELECT ?)) y(y) ON sys.mybooludf(y.y));
EXEC **('b',true);
ROLLBACK;
+
+-- TODO it requires some internal changes to be able to set types on
parameters used as freevars
+PREPARE SELECT 1 FROM (SELECT ?) x(x) CROSS JOIN LATERAL (SELECT 1 FROM
((SELECT 1) INTERSECT (SELECT 2)) vx(vx) JOIN (SELECT 1) z(z) ON x.x) w(w);
--error, Could not determine type for argument number 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
@@ -47,3 +47,7 @@ CODE = 42000
QUERY = PREPARE SELECT 1 FROM (SELECT 1) x(x) LEFT OUTER JOIN (SELECT DISTINCT
?) y(y) ON (SELECT TRUE FROM (SELECT 1) z(z)); --error while unnesting because
of unknown type
ERROR = !Cannot rewrite subquery because of parameter with unknown type
CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-185783/.s.monetdb.32587
+QUERY = PREPARE SELECT 1 FROM (SELECT ?) x(x) CROSS JOIN LATERAL (SELECT 1
FROM ((SELECT 1) INTERSECT (SELECT 2)) vx(vx) JOIN (SELECT 1) z(z) ON x.x)
w(w); --error, Could not determine type for argument number 1
+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
@@ -47,3 +47,7 @@ CODE = 42000
QUERY = PREPARE SELECT 1 FROM (SELECT 1) x(x) LEFT OUTER JOIN (SELECT DISTINCT
?) y(y) ON (SELECT TRUE FROM (SELECT 1) z(z)); --error while unnesting because
of unknown type
ERROR = !Cannot rewrite subquery because of parameter with unknown type
CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-185783/.s.monetdb.32587
+QUERY = PREPARE SELECT 1 FROM (SELECT ?) x(x) CROSS JOIN LATERAL (SELECT 1
FROM ((SELECT 1) INTERSECT (SELECT 2)) vx(vx) JOIN (SELECT 1) z(z) ON x.x)
w(w); --error, Could not determine type for argument number 1
+ERROR = !Could not determine type for argument number 1
+CODE = 42000
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]