Changeset: e47a467cfe7c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e47a467cfe7c
Modified Files:
        sql/server/rel_select.c
        sql/test/subquery/Tests/subquery5.stable.err
Branch: Jun2020
Log Message:

small fix (ie give error) for queries trying a single aggregate and a correlate 
aggregate where
the outer column isn't aggregated or the groupby column.


diffs (48 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
@@ -3346,9 +3346,10 @@ static sql_exp *
 
        exps = sa_list(sql->sa);
        if (args && args->data.sym) {
+               int ungrouped_col = -1, i;
                int all_aggr = query_has_outer(query);
                all_freevar = 1;
-               for (   ; args && args->data.sym; args = args->next ) {
+               for (i = 0; args && args->data.sym; args = args->next, i++) {
                        int base = (!groupby || !is_project(groupby->op) || 
is_base(groupby->op) || is_processed(groupby));
                        sql_rel *gl = base?groupby:groupby->l, *ogl = gl; /* 
handle case of subqueries without correlation */
                        sql_exp *e = rel_value_exp(query, &gl, args->data.sym, 
(f | sql_aggr)& ~sql_farg, ek);//, *lu;
@@ -3386,6 +3387,8 @@ static sql_exp *
                                        sql_exp *a = rel_find_exp(outer, e);
                                        if (a)
                                                aggr = is_aggr(a->type);
+                                       else if (outer->grouped)
+                                               ungrouped_col = i;
                                }
                                all_aggr &= aggr;
                        } else {
@@ -3440,6 +3443,9 @@ static sql_exp *
                                if (uaname)
                                        GDKfree(uaname);
                                return e;
+                       } else if (!all_aggr && ungrouped_col >= 0) {
+                               sql_exp *u = list_fetch(exps, ungrouped_col);
+                               return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: subquery uses ungrouped column \"%s.%s\" from outer 
query", exp_relname(u), exp_name(u));
                        }
                }
        }
diff --git a/sql/test/subquery/Tests/subquery5.stable.err 
b/sql/test/subquery/Tests/subquery5.stable.err
--- a/sql/test/subquery/Tests/subquery5.stable.err
+++ b/sql/test/subquery/Tests/subquery5.stable.err
@@ -62,6 +62,10 @@ MAPI  = (monetdb) /var/tmp/mtest-2392594
 QUERY = SELECT (SELECT i1.i IN (SELECT SUM(i1.i))) FROM integers i1; --error, 
subquery uses ungrouped column "i1.i" from outer query
 ERROR = !SELECT: subquery uses ungrouped column "i1.i" from outer query
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-3324560/.s.monetdb.33622
+QUERY = SELECT (SELECT SUM(i1.i) IN (SELECT CORR(i1.i, i2.i) FROM integers 
i2)) FROM integers i1; --error, subquery uses ungrouped column "i1.i" from 
outer query
+ERROR = !SELECT: subquery uses ungrouped column "i1.i" from outer query
+CODE  = 42000
 
 # 08:41:39 >  
 # 08:41:39 >  "Done."
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to