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

Reply via email to