Changeset: 01234c17413d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/01234c17413d
Modified Files:
        sql/server/rel_select.c
        sql/test/subquery/Tests/correlated.test
        sql/test/subquery/Tests/subquery3.test
        sql/test/subquery/Tests/subquery4.test
        sql/test/subquery/Tests/subquery5.test
        sql/test/subquery/Tests/subquery6.test
Branch: default
Log Message:

give proper errors on use of ungrouped columns (before or after finding an 
aggregate)


diffs (178 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
@@ -3395,12 +3395,12 @@ exp_valid(visitor *v, sql_rel *rel, sql_
                                ai->err = SQLSTATE(42000) "SELECT: subquery 
uses ungrouped column from outer query";
                        }
                }
-       } else if (!v->changes && vf && vf == ai->groupby) {
+       } else if (!v->changes && vf && vf == ai->groupby) { /* check if input 
is allready aggregated */
                sql_rel *sq = query_fetch_outer(ai->query, vf-1);
-
-               /* problem freevar have cardinality CARD_ATOM */
+               sql_exp *a = NULL;
+
                if (sq->card <= CARD_AGGR && is_alias(e->type)) {
-                       if (exps_bind_column(sq->exps, e->l, e->r, NULL, 0)) { 
/* aggregate */
+                       if ((a = exps_bind_column(sq->exps, e->l, e->r, NULL, 
0)) && is_aggr(a->type)) { /* aggregate */
                                v->changes = 1;
                                ai->err = SQLSTATE(42000) "SELECT: aggregate 
function calls cannot be nested";
                        }
@@ -3492,10 +3492,6 @@ static sql_exp *
                                else
                                        groupby = subquery = gl;
                        }
-                       /*
-                       if (!subquery && exp_has_rel(e))
-                               subquery = gl;
-                               */
                        if (!exp_subtype(e)) { /* we also do not expect 
parameters here */
                                char *uaname = SA_NEW_ARRAY(sql->ta, char, 
strlen(aname) + 1);
                                return sql_error(sql, 02, SQLSTATE(42000) "%s: 
parameters not allowed as arguments to aggregate functions", 
toUpperCopy(uaname, aname));
@@ -3578,6 +3574,16 @@ static sql_exp *
                        card = query_outer_used_card(query, all_freevar-1);
                        /* given groupby validate all input expressions */
                        char *err;
+                       if (groupby && !is_groupby(groupby->op)) {
+                               sql_exp *p = query_outer_last_used(query, 
all_freevar-1);
+                               if (p && !is_aggr(p->type) && 
!is_groupby_col(groupby, p)) {
+                                       if (p->type == e_column)
+                                               return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in 
query results without an aggregate function", (char*)p->l, (char*)p->r);
+                                       if (exp_name(p) && exp_relname(p) && 
!has_label(p))
+                                               return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in 
query results without an aggregate function", exp_relname(p), exp_name(p));
+                                       return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results 
without an aggregate function");
+                               }
+                       }
                        if ((err = exps_valid(query, exps, all_freevar)) != 
NULL) {
                                strcpy(sql->errstr, err);
                                sql->session->status = -ERR_GROUPBY;
diff --git a/sql/test/subquery/Tests/correlated.test 
b/sql/test/subquery/Tests/correlated.test
--- a/sql/test/subquery/Tests/correlated.test
+++ b/sql/test/subquery/Tests/correlated.test
@@ -258,10 +258,10 @@ SELECT MIN(i), CAST((SELECT SUM(i1.i)) A
 1
 6
 
-statement error 42000!SELECT: cannot use non GROUP BY column 'i' in query 
results without an aggregate function
+statement error 42000!SELECT: cannot use non GROUP BY column 'i1.i' in query 
results without an aggregate function
 SELECT i, (SELECT SUM(i1.i)) FROM integers i1
 
-statement error 42000!SELECT: cannot use non GROUP BY column in query results 
without an aggregate function
+statement error 42000!SELECT: cannot use non GROUP BY column 'i1.i' in query 
results without an aggregate function
 SELECT i+1, (SELECT SUM(i1.i)) FROM integers i1
 
 query II rowsort
diff --git a/sql/test/subquery/Tests/subquery3.test 
b/sql/test/subquery/Tests/subquery3.test
--- a/sql/test/subquery/Tests/subquery3.test
+++ b/sql/test/subquery/Tests/subquery3.test
@@ -522,7 +522,7 @@ SELECT
     (SELECT 1 FROM integers i2 GROUP BY SUM(i2.i))
 FROM integers i1
 
-statement error 42000!SELECT: aggregate functions not allowed in WHERE clause
+statement error 42000!SELECT: cannot use non GROUP BY column 'another_t.col5' 
in query results without an aggregate function
 SELECT
     1
 FROM another_T
@@ -669,7 +669,7 @@ SELECT i FROM integers i1 ORDER BY SUM(i
 statement error 42000!SELECT: cannot use non GROUP BY column 'i' in query 
results without an aggregate function
 SELECT * FROM integers i1 ORDER BY (SELECT SUM(i1.i) FROM integers i2)
 
-statement error 42000!SELECT: cannot use non GROUP BY column 'i' in query 
results without an aggregate function
+statement error 42000!SELECT: cannot use non GROUP BY column 'i1.i' in query 
results without an aggregate function
 SELECT i FROM integers i1 ORDER BY (SELECT SUM(i1.i) FROM integers i2)
 
 statement ok
diff --git a/sql/test/subquery/Tests/subquery4.test 
b/sql/test/subquery/Tests/subquery4.test
--- a/sql/test/subquery/Tests/subquery4.test
+++ b/sql/test/subquery/Tests/subquery4.test
@@ -368,7 +368,7 @@ 1786
 186
 26
 
-statement error 42000!SELECT: aggregate functions not allowed in WHERE clause
+statement error 42000!SELECT: cannot use non GROUP BY column 'another_t.col5' 
in query results without an aggregate function
 UPDATE another_T SET col5 = 1 WHERE col5 = (SELECT AVG(col2))
 
 statement ok rowcount 0
@@ -383,7 +383,7 @@ UPDATE another_T SET col7 = 1 WHERE col5
 statement error 42000!COUNT: aggregate functions not allowed in WHERE clause
 DELETE FROM another_T WHERE col1 = COUNT(col2)
 
-statement error 42000!SELECT: aggregate functions not allowed in WHERE clause
+statement error 42000!SELECT: cannot use non GROUP BY column 'another_t.col7' 
in query results without an aggregate function
 DELETE FROM another_T WHERE col7 = (SELECT MIN(col3))
 
 statement ok rowcount 0
diff --git a/sql/test/subquery/Tests/subquery5.test 
b/sql/test/subquery/Tests/subquery5.test
--- a/sql/test/subquery/Tests/subquery5.test
+++ b/sql/test/subquery/Tests/subquery5.test
@@ -16,7 +16,7 @@ CREATE TABLE integers(i INTEGER)
 statement ok rowcount 4
 INSERT INTO integers VALUES (1), (2), (3), (NULL)
 
-statement error 42000!SELECT: subquery uses ungrouped column "another_t.col2" 
from outer query
+statement error 42000!SELECT: cannot use non GROUP BY column 'another_t.col2' 
in query results without an aggregate function
 SELECT
     (SELECT MIN(col1) GROUP BY col2)
 FROM another_T
@@ -125,7 +125,7 @@ 1
 1
 NULL
 
-statement error 42000!SELECT: subquery uses ungrouped column "i1.i" from outer 
query
+statement error 42000!SELECT: cannot use non GROUP BY column 'i1.i' in query 
results without an aggregate function
 SELECT (SELECT i1.i IN (SELECT SUM(i1.i))) FROM integers i1
 
 query R rowsort
@@ -181,7 +181,7 @@ SELECT (SELECT 1 WHERE SUM(col2 + 1) > 0
 ----
 1
 
-statement error 42000!SELECT: subquery uses ungrouped column "another_t.col1" 
from outer query
+statement error 42000!SELECT: cannot use non GROUP BY column 'another_t.col1' 
in query results without an aggregate function
 SELECT (SELECT col1 HAVING SUM(col2 + col1) > 0) FROM another_t
 
 statement error 42000!SELECT: identifier 'col1' ambiguous
@@ -341,13 +341,13 @@ 1
 1
 1
 
-statement error 42000!SELECT: subquery uses ungrouped column "i1.i" from outer 
query
+statement error 42000!SELECT: cannot use non GROUP BY column 'i1.i' in query 
results without an aggregate function
 SELECT (SELECT 1 FROM integers i2 INNER JOIN integers i3 ON i1.i = 1) = 
(SELECT 1 FROM integers i2 INNER JOIN integers i3 ON MIN(i1.i) = 1) FROM 
integers i1
 
-statement error 42000!SELECT: subquery uses ungrouped column "i1.i" from outer 
query
+statement error 42000!SELECT: cannot use non GROUP BY column 'i1.i' in query 
results without an aggregate function
 SELECT (SELECT i1.i) = (SELECT SUM(i1.i)) FROM integers i1
 
-statement error 42000!SELECT: subquery uses ungrouped column "another_t.col1" 
from outer query
+statement error 42000!SELECT: cannot use non GROUP BY column 'another_t.col1' 
in query results without an aggregate function
 SELECT (VALUES(col1)), (VALUES(MAX(col2))) FROM another_t
 
 statement error 42000!SELECT: aggregate function calls cannot be nested
@@ -447,7 +447,7 @@ SELECT (VALUES(SUM(i1.i)) UNION VALUES(A
 statement error GDK reported error: mergejoin: more than one match
 SELECT ((SELECT SUM(i1.i)) UNION ALL (SELECT AVG(i1.i))) FROM integers i1
 
-statement error 42000!SELECT: subquery uses ungrouped column "i1.i" from outer 
query
+statement error 42000!SELECT: cannot use non GROUP BY column 'i1.i' in query 
results without an aggregate function
 SELECT ((SELECT i1.i NOT IN (SELECT i1.i)) UNION (SELECT SUM(i1.i) IN (SELECT 
i1.i))) FROM integers i1
 
 query I rowsort
diff --git a/sql/test/subquery/Tests/subquery6.test 
b/sql/test/subquery/Tests/subquery6.test
--- a/sql/test/subquery/Tests/subquery6.test
+++ b/sql/test/subquery/Tests/subquery6.test
@@ -419,10 +419,10 @@ select min(i) as myx from integers group
 statement error 42000!SELECT: cannot use non GROUP BY column 'integers.i' in 
query results without an aggregate function
 select ntile(i) over (), count(*) from integers
 
-statement error 42000!SELECT: cannot use non GROUP BY column in query results 
without an aggregate function
+statement error 42000!SELECT: cannot use non GROUP BY column 'i2.i' in query 
results without an aggregate function
 select (select i2.i in (select sum(i1.i + i2.i)) from integers i2) from 
integers i1
 
-statement error 42000!SELECT: cannot use non GROUP BY column in query results 
without an aggregate function
+statement error 42000!SELECT: cannot use non GROUP BY column 'i2.i' in query 
results without an aggregate function
 select (select i2.i in (select sum(i1.i + i2.i)) from integers i2) from 
integers i1 group by i1.i
 
 statement error GDK reported error: mergejoin: more than one match
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to