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 -- [email protected]
To unsubscribe send an email to [email protected]