Changeset: ff9b7a53e172 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ff9b7a53e172 Modified Files: monetdb5/modules/atoms/Tests/json02.stable.out sql/server/rel_rel.h sql/server/rel_select.c sql/test/subquery/Tests/correlated.sql sql/test/subquery/Tests/correlated.stable.err Branch: default Log Message:
Merge with Nov2019 diffs (105 lines): diff --git a/monetdb5/modules/atoms/Tests/json02.stable.out b/monetdb5/modules/atoms/Tests/json02.stable.out --- a/monetdb5/modules/atoms/Tests/json02.stable.out +++ b/monetdb5/modules/atoms/Tests/json02.stable.out @@ -95,7 +95,7 @@ stdout of test 'json02` in directory 'mo #-------------------------# [ 0@0, "1" ] [ 1@0, "2" ] -[ 2@0, nil ] +[ 2@0, "null" ] [ 3@0, "true" ] [ 4@0, "false" ] [ 5 ] 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 @@ -21,6 +21,7 @@ #define sql_aggr 64 //ORed #define sql_farg 128 //ORed #define sql_window 256 //ORed +#define sql_join 512 //ORed #define is_sql_from(X) ((X & sql_from) == sql_from) #define is_sql_where(X) ((X & sql_where) == sql_where) @@ -31,6 +32,7 @@ #define is_sql_aggr(X) ((X & sql_aggr) == sql_aggr) #define is_sql_farg(X) ((X & sql_farg) == sql_farg) #define is_sql_window(X) ((X & sql_window) == sql_window) +#define is_sql_join(X) ((X & sql_join) == sql_join) #define rel_groupby_gbe(m,r,e) rel_groupby(m, r, append(new_exp_list(m->sa), e)) #define new_rel_list(sa) sa_list(sa) 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 @@ -4069,6 +4069,13 @@ rel_aggr_intern(sql_query *query, sql_re if (uaname) GDKfree(uaname); return e; + } else if (is_sql_join(f)) { /* the is_sql_join test must come before is_sql_where, because the join conditions are handled with sql_where */ + char *uaname = GDKmalloc(strlen(aname) + 1); + sql_exp *e = sql_error(sql, 02, SQLSTATE(42000) "%s: aggregate functions not allowed in JOIN conditions", + uaname ? toUpperCopy(uaname, aname) : aname); + if (uaname) + GDKfree(uaname); + return e; } else if (!query_has_outer(query) && is_sql_where(f)) { char *uaname = GDKmalloc(strlen(aname) + 1); sql_exp *e = sql_error(sql, 02, SQLSTATE(42000) "%s: aggregate functions not allowed in WHERE clause", @@ -5187,10 +5194,10 @@ rel_rankop(sql_query *query, sql_rel **r 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)) { + if (is_sql_join(f) || is_sql_where(f) || is_sql_groupby(f) || is_sql_having(f)) { char *uaname = GDKmalloc(strlen(aname) + 1); - const char *clause = is_sql_where(f)?"WHERE":is_sql_groupby(f)?"GROUP BY":"HAVING"; - (void) sql_error(sql, 02, SQLSTATE(42000) "%s: window function '%s' not allowed in %s clause", + const char *clause = is_sql_join(f)?"JOIN conditions":is_sql_where(f)?"WHERE clause":is_sql_groupby(f)?"GROUP BY clause":"HAVING clause"; + (void) sql_error(sql, 02, SQLSTATE(42000) "%s: window function '%s' not allowed in %s", uaname ? toUpperCopy(uaname, aname) : aname, aname, clause); if (uaname) GDKfree(uaname); @@ -6573,7 +6580,7 @@ rel_joinquery_(sql_query *query, sql_rel } if (js && js->token != SQL_USING) { /* On sql_logical_exp */ - rel = rel_logical_exp(query, rel, js, sql_where); + rel = rel_logical_exp(query, rel, js, sql_where | sql_join); } else if (js) { /* using */ char rname[16], *rnme; dnode *n = js->data.lval->h; diff --git a/sql/test/subquery/Tests/correlated.sql b/sql/test/subquery/Tests/correlated.sql --- a/sql/test/subquery/Tests/correlated.sql +++ b/sql/test/subquery/Tests/correlated.sql @@ -150,6 +150,10 @@ SELECT CAST(SUM(i) AS BIGINT), CAST((SEL SELECT CAST((SELECT SUM(i) FROM integers WHERE i>SUM(i1.i)) AS BIGINT) FROM integers i1; -- NULL +SELECT i1.i FROM integers i1 INNER JOIN integers i ON SUM(i1.i) = SUM(i.i); --error, aggregations not allowed in join conditions + +SELECT i1.i FROM integers i1 INNER JOIN integers i ON RANK() OVER (); --error, window functions not allowed in join conditions + -- subquery with aggregation inside aggregation should fail SELECT SUM((SELECT SUM(i))) FROM integers; -- error -- aggregate with correlation in filter diff --git a/sql/test/subquery/Tests/correlated.stable.err b/sql/test/subquery/Tests/correlated.stable.err --- a/sql/test/subquery/Tests/correlated.stable.err +++ b/sql/test/subquery/Tests/correlated.stable.err @@ -58,7 +58,15 @@ MAPI = (monetdb) /var/tmp/mtest-8372/.s QUERY = SELECT i+1, (SELECT SUM(i1.i)) FROM integers i1; ERROR = !Cannot use non GROUP BY column in query results without an aggregate function CODE = 42000 -MAPI = (monetdb) /var/tmp/mtest-27844/.s.monetdb.31122 +MAPI = (monetdb) /var/tmp/mtest-17692/.s.monetdb.32120 +QUERY = SELECT i1.i FROM integers i1 INNER JOIN integers i ON SUM(i1.i) = SUM(i.i); --error, aggregations not allowed in join conditions +ERROR = !SUM: aggregate functions not allowed in JOIN conditions +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-23431/.s.monetdb.34452 +QUERY = SELECT i1.i FROM integers i1 INNER JOIN integers i ON RANK() OVER (); --error, window functions not allowed in join conditions +ERROR = !RANK: window function 'rank' not allowed in JOIN conditions +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-23431/.s.monetdb.34452 QUERY = SELECT SUM((SELECT SUM(i))) FROM integers; -- error ERROR = !SUM: aggregate functions cannot be nested CODE = 42000 _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list