Changeset: d1af2cca27c8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d1af2cca27c8
Modified Files:
        sql/server/rel_rel.h
        sql/server/rel_select.c
        sql/test/analytics/Tests/analytics09.sql
        sql/test/analytics/Tests/analytics09.stable.err
        sql/test/analytics/Tests/analytics09.stable.out
        sql/test/miscellaneous/Tests/groupby_expressions.sql
        sql/test/miscellaneous/Tests/groupby_expressions.stable.err
        sql/test/miscellaneous/Tests/groupby_expressions.stable.out
Branch: groupby-expressions
Log Message:

Disallow aggregation functions in group by clauses and window functions in 
partition by clauses.


diffs (177 lines):

diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -18,6 +18,7 @@
 #define sql_having   8
 #define sql_orderby 16
 #define sql_groupby 32 //ORed
+#define sql_partitionby 64 //ORed
 
 #define is_sql_from(X)    ((X & sql_from) == sql_from)
 #define is_sql_where(X)   ((X & sql_where) == sql_where)
@@ -25,6 +26,7 @@
 #define is_sql_having(X)  ((X & sql_having) == sql_having)
 #define is_sql_orderby(X) ((X & sql_orderby) == sql_orderby)
 #define is_sql_groupby(X) ((X & sql_groupby) == sql_groupby)
+#define is_sql_partitionby(X) ((X & sql_partitionby) == sql_partitionby)
 
 #define ERR_AMBIGUOUS          050000
 
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
@@ -3561,6 +3561,13 @@ static sql_exp *
                if (uaname)
                        GDKfree(uaname);
                return e;
+       } else if(is_sql_groupby(f)) {
+               char *uaname = GDKmalloc(strlen(aname) + 1);
+               sql_exp *e = sql_error(sql, 02, SQLSTATE(42000) "%s: aggregate 
function '%s' not allowed in GROUP BY clause",
+                                                          uaname ? 
toUpperCopy(uaname, aname) : aname, aname);
+               if (uaname)
+                       GDKfree(uaname);
+               return e;
        }
 
        if (is_sql_having(f) && is_select(groupby->op))
@@ -4704,9 +4711,9 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
        supports_frames = (window_function->token != SQL_RANK) || is_nth_value 
||
                                          (strcmp(s->base.name, "sys") == 0 && 
((strcmp(aname, "first_value") == 0) || strcmp(aname, "last_value") == 0));
 
-       if (is_sql_where(f) || is_sql_groupby(f) || is_sql_having(f) || 
is_sql_orderby(f)) {
+       if (is_sql_where(f) || is_sql_groupby(f) || is_sql_having(f) || 
is_sql_orderby(f) || is_sql_partitionby(f)) {
                char *uaname = GDKmalloc(strlen(aname) + 1);
-               const char *clause = 
is_sql_where(f)?"WHERE":is_sql_groupby(f)?"GROUP 
BY":is_sql_having(f)?"HAVING":"ORDER BY";
+               const char *clause = 
is_sql_where(f)?"WHERE":is_sql_groupby(f)?"GROUP 
BY":is_sql_having(f)?"HAVING":is_sql_orderby(f)?"ORDER BY":"PARTITION BY";
                (void) sql_error(sql, 02, SQLSTATE(42000) "%s: window function 
'%s' not allowed in %s clause",
                                                 uaname ? toUpperCopy(uaname, 
aname) : aname, aname, clause);
                if (uaname)
@@ -4826,7 +4833,7 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
 
        /* Partition By */
        if (partition_by_clause) {
-               gbe = rel_group_by(sql, &pp, partition_by_clause, NULL /* 
cannot use (selection) column references, as this result is a selection column 
*/, f );
+               gbe = rel_group_by(sql, &pp, partition_by_clause, NULL /* 
cannot use (selection) column references, as this result is a selection column 
*/, f | sql_partitionby );
                if (!gbe)
                        return NULL;
                for(n = gbe->h ; n ; n = n->next) {
@@ -5057,7 +5064,7 @@ rel_value_exp2(mvc *sql, sql_rel **rel, 
        if (THRhighwater())
                return sql_error(sql, 10, SQLSTATE(42000) "SELECT: too many 
nested operators");
 
-       if (*rel && (*rel)->card == CARD_AGGR) { //group by expression case, 
handle it before
+       if (rel && *rel && (*rel)->card == CARD_AGGR) { //group by expression 
case, handle it before
                sql_exp *exp = stack_get_groupby_expression(sql, se);
                if (sql->errstr[0] != '\0')
                        return NULL;
diff --git a/sql/test/analytics/Tests/analytics09.sql 
b/sql/test/analytics/Tests/analytics09.sql
--- a/sql/test/analytics/Tests/analytics09.sql
+++ b/sql/test/analytics/Tests/analytics09.sql
@@ -53,7 +53,7 @@ select cast(sum(aa) * 100 / sum(sum(aa))
 
 select cast(prod(sum(aa)) * count(1 + aa) / avg(null) over () as bigint) from 
analytics; --error, nesting aggregation functions
 
-select rank() over (partition by case when aa > 5 then aa else aa + 5 end) 
from analytics; --TODO we don't support expressions in partition by as well 
group by statements
+select rank() over (partition by case when aa > 5 then aa else aa + 5 end) 
from analytics;
 
 select rank() over (partition by sum(aa)) from analytics; --TODO we don't 
support expressions in partition by as well group by
 
diff --git a/sql/test/analytics/Tests/analytics09.stable.err 
b/sql/test/analytics/Tests/analytics09.stable.err
--- a/sql/test/analytics/Tests/analytics09.stable.err
+++ b/sql/test/analytics/Tests/analytics09.stable.err
@@ -54,13 +54,9 @@ MAPI  = (monetdb) /var/tmp/mtest-1389/.s
 QUERY = select cast(prod(sum(aa)) * count(1 + aa) / avg(null) over () as 
bigint) from analytics; --error, nesting aggregation functions
 ERROR = !SELECT: subquery result missing
 CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-1389/.s.monetdb.37694
-QUERY = select rank() over (partition by case when aa > 5 then aa else aa + 5 
end) from analytics; --TODO we don't support expressions in partition by as 
well group by statements
-ERROR = !syntax error, unexpected CASE in: "select rank() over (partition by 
case"
-CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-1389/.s.monetdb.37694
+MAPI  = (monetdb) /var/tmp/mtest-11873/.s.monetdb.31832
 QUERY = select rank() over (partition by sum(aa)) from analytics; --TODO we 
don't support expressions in partition by as well group by
-ERROR = !syntax error, unexpected '(', expecting ')' in: "select rank() over 
(partition by sum("
+ERROR = !Cannot use non GROUP BY column 'aa' in query results without an 
aggregate function
 CODE  = 42000
 
 # 13:13:17 >  
diff --git a/sql/test/analytics/Tests/analytics09.stable.out 
b/sql/test/analytics/Tests/analytics09.stable.out
--- a/sql/test/analytics/Tests/analytics09.stable.out
+++ b/sql/test/analytics/Tests/analytics09.stable.out
@@ -175,6 +175,21 @@ Ready.
 [ 100  ]
 [ 100  ]
 [ NULL ]
+#select rank() over (partition by case when aa > 5 then aa else aa + 5 end) 
from analytics;
+% sys.L4 # table_name
+% L4 # name
+% int # type
+% 1 # length
+[ 1    ]
+[ 1    ]
+[ 1    ]
+[ 1    ]
+[ 1    ]
+[ 1    ]
+[ 1    ]
+[ 1    ]
+[ 1    ]
+[ 1    ]
 #drop table analytics;
 
 # 13:13:17 >  
diff --git a/sql/test/miscellaneous/Tests/groupby_expressions.sql 
b/sql/test/miscellaneous/Tests/groupby_expressions.sql
--- a/sql/test/miscellaneous/Tests/groupby_expressions.sql
+++ b/sql/test/miscellaneous/Tests/groupby_expressions.sql
@@ -21,9 +21,13 @@ select case when "aa" > 1 then "aa" else
 
 select cast(sum("aa"+"bb") as bigint) from "groupings" group by "aa"+"bb";
 select cast(sum("aa"+3452) as bigint) from "groupings" group by "aa"+"bb";
+
+select count(*) from "groupings" having count("aa"-54) > 2;
+select count(*) from "groupings" order by count("bb"+1);
 rollback;
 
 select "aa"+3452 from "groupings" group by "aa"+"bb"; --error
+select count(*) from "groupings" group by count("aa"); --error
 select count(*) from "groupings" group by rank() over (); --error
 select count(*) from "groupings" having rank() over (); --error
 select count(*) from "groupings" order by rank() over (); --error TODO?
diff --git a/sql/test/miscellaneous/Tests/groupby_expressions.stable.err 
b/sql/test/miscellaneous/Tests/groupby_expressions.stable.err
--- a/sql/test/miscellaneous/Tests/groupby_expressions.stable.err
+++ b/sql/test/miscellaneous/Tests/groupby_expressions.stable.err
@@ -34,7 +34,11 @@ MAPI  = (monetdb) /var/tmp/mtest-28161/.
 QUERY = select "aa"+3452 from "groupings" group by "aa"+"bb"; --error
 ERROR = !SELECT: no such aggregate 'sql_add'
 CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-28161/.s.monetdb.36698
+MAPI  = (monetdb) /var/tmp/mtest-11615/.s.monetdb.30717
+QUERY = select count(*) from "groupings" group by count("aa"); --error
+ERROR = !COUNT: aggregate function 'count' not allowed in GROUP BY clause
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-11615/.s.monetdb.30717
 QUERY = select count(*) from "groupings" group by rank() over (); --error
 ERROR = !RANK: window function 'rank' not allowed in GROUP BY clause
 CODE  = 42000
diff --git a/sql/test/miscellaneous/Tests/groupby_expressions.stable.out 
b/sql/test/miscellaneous/Tests/groupby_expressions.stable.out
--- a/sql/test/miscellaneous/Tests/groupby_expressions.stable.out
+++ b/sql/test/miscellaneous/Tests/groupby_expressions.stable.out
@@ -176,6 +176,18 @@ Ready.
 % 4 # length
 [ 3453 ]
 [ 6907 ]
+#select count(*) from "groupings" having count("aa"-54) > 2;
+% .L2 # table_name
+% L2 # name
+% bigint # type
+% 1 # length
+[ 3    ]
+#select count(*) from "groupings" order by count("bb"+1);
+% sys.L3 # table_name
+% L3 # name
+% bigint # type
+% 1 # length
+[ 3    ]
 #rollback;
 
 # 14:21:56 >  
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to