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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org