Changeset: 37a71fcb6675 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/37a71fcb6675 Modified Files: sql/server/rel_select.c sql/test/SQLancer/Tests/sqlancer23.test Branch: default Log Message:
Look for subquery group transformation after parsing set subqueries diffs (58 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 @@ -2467,8 +2467,16 @@ rel_logical_value_exp(sql_query *query, if (rel && *rel) query_push_outer(query, *rel, f); sq = rel_setquery(query, sc); - if (rel && *rel) + if (rel && *rel) { *rel = query_pop_outer(query); + if (is_sql_join(f) && is_groupby((*rel)->op)) { + return sql_error(sql, 05, SQLSTATE(42000) "SELECT: aggregate functions not allowed in JOIN conditions"); + } else if (is_sql_where(f) && is_groupby((*rel)->op)) { + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: aggregate functions not allowed in WHERE clause"); + } else if ((is_sql_update_set(f) || is_sql_psm(f)) && is_groupby((*rel)->op)) { + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: aggregate functions not allowed in SET, WHILE, IF, ELSE, CASE, WHEN, RETURN, ANALYZE clauses"); + } + } if (!sq) return NULL; if (ek.type == type_value && ek.card <= card_set && is_project(sq->op) && list_length(sq->exps) > 1) @@ -2752,8 +2760,16 @@ rel_logical_exp(sql_query *query, sql_re if (rel) query_push_outer(query, rel, f); sq = rel_setquery(query, sc); - if (rel) + if (rel) { rel = query_pop_outer(query); + if (is_sql_join(f) && is_groupby(rel->op)) { + return sql_error(sql, 05, SQLSTATE(42000) "SELECT: aggregate functions not allowed in JOIN conditions"); + } else if (is_sql_where(f) && is_groupby(rel->op)) { + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: aggregate functions not allowed in WHERE clause"); + } else if ((is_sql_update_set(f) || is_sql_psm(f)) && is_groupby(rel->op)) { + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: aggregate functions not allowed in SET, WHILE, IF, ELSE, CASE, WHEN, RETURN, ANALYZE clauses"); + } + } if (!sq) return NULL; assert(ek.type == type_value); /* I don't expect IN tuple matching calls to land here */ diff --git a/sql/test/SQLancer/Tests/sqlancer23.test b/sql/test/SQLancer/Tests/sqlancer23.test --- a/sql/test/SQLancer/Tests/sqlancer23.test +++ b/sql/test/SQLancer/Tests/sqlancer23.test @@ -178,3 +178,15 @@ SELECT 1 FROM (SELECT 3) vx(vx) WHERE 1 statement error GDK reported error: mergejoin: more than one match SELECT 1 FROM (SELECT 3) vx(vx) WHERE 1 <> (SELECT 2 UNION ALL SELECT vx.vx) + +statement error 42000!SELECT: aggregate functions not allowed in JOIN conditions +SELECT 1 FROM (SELECT 2) x(x) JOIN (SELECT 3) y(y) ON (SELECT max((SELECT x.x))) + +statement error 42000!SELECT: aggregate functions not allowed in JOIN conditions +SELECT 1 FROM (SELECT 2) x(x) JOIN (SELECT 3) y(y) ON ((SELECT max((SELECT x.x))) UNION (SELECT 4)) + +statement error 42000!SELECT: aggregate functions not allowed in JOIN conditions +SELECT 1 FROM (SELECT 1) x(x) JOIN (SELECT 1) y(y) ON max((((SELECT (SELECT x.x))) UNION (SELECT 1))) + +statement error 42000!SELECT: aggregate functions not allowed in JOIN conditions +SELECT 1 FROM (SELECT 1) x(x) JOIN (SELECT 1) y(y) ON max((((SELECT (SELECT x.x))) UNION (SELECT (SELECT y.y)))) _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org