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

Reply via email to