Changeset: da41c93d9a58 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/da41c93d9a58
Modified Files:
        sql/server/rel_select.c
Branch: default
Log Message:

improved error message on using none aggregated or group by expressions


diffs (62 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
@@ -1122,6 +1122,7 @@ rel_column_ref(sql_query *query, sql_rel
        sql_exp *exp = NULL;
        dlist *l = NULL;
        sql_rel *inner = rel?*rel:NULL;
+       int used_lower_after_processed = 0;
 
        assert((column_r->token == SQL_COLUMN || column_r->token == SQL_IDENT) 
&& column_r->type == type_list);
        l = column_r->data.lval;
@@ -1144,8 +1145,12 @@ rel_column_ref(sql_query *query, sql_rel
                        for (i=query_has_outer(query)-1; i>= 0 && !exp && 
(outer = query_fetch_outer(query,i)); i--) {
                                if (!(exp = rel_bind_column(sql, outer, name, 
f, 0)) && sql->session->status == -ERR_AMBIGUOUS)
                                        return NULL;
-                               if (!exp && is_groupby(outer->op) && !(exp = 
rel_bind_column(sql, outer->l, name, f, 0)) && sql->session->status == 
-ERR_AMBIGUOUS)
-                                       return NULL;
+                               if (!exp && is_groupby(outer->op)) {
+                                       if (!(exp = rel_bind_column(sql, 
outer->l, name, f, 0)) && sql->session->status == -ERR_AMBIGUOUS)
+                                               return NULL;
+                                       else
+                                               used_lower_after_processed = 
is_processed(outer);
+                               }
                                if (exp && is_simple_project(outer->op) && 
!rel_find_exp(outer, exp))
                                        exp = rel_project_add_exp(sql, outer, 
exp);
                                if (exp)
@@ -1154,8 +1159,8 @@ rel_column_ref(sql_query *query, sql_rel
                        if (exp && outer && outer->card <= CARD_AGGR && 
exp->card > CARD_AGGR && !is_sql_aggr(f))
                                return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results 
without an aggregate function", name);
                        if (exp && outer && !is_sql_aggr(f)) {
-                               if (query_outer_used_exp( query, i, exp, f)) {
-                                       sql_exp *lu = 
query_outer_last_used(query, i);
+                               if (used_lower_after_processed || 
query_outer_used_exp( query, i, exp, f)) {
+                                       sql_exp *lu = 
used_lower_after_processed?exp:query_outer_last_used(query, i);
                                        if (exp_name(lu) && exp_relname(lu) && 
!has_label(lu))
                                                return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: subquery uses ungrouped column \"%s.%s\" 
from outer query", exp_relname(lu), exp_name(lu));
                                        return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: subquery uses ungrouped column from outer query");
@@ -1221,9 +1226,12 @@ rel_column_ref(sql_query *query, sql_rel
                        for (i=query_has_outer(query)-1; i>= 0 && !exp && 
(outer = query_fetch_outer(query,i)); i--) {
                                if (!(exp = rel_bind_column2(sql, outer, tname, 
cname, f | sql_outer)) && sql->session->status == -ERR_AMBIGUOUS)
                                        return NULL;
-                               if (!exp && is_groupby(outer->op))
+                               if (!exp && is_groupby(outer->op)) {
                                        if (!(exp = rel_bind_column2(sql, 
outer->l, tname, cname, f)) && sql->session->status == -ERR_AMBIGUOUS)
                                                return NULL;
+                                       else
+                                               used_lower_after_processed = 
is_processed(outer);
+                               }
                                if (exp && is_simple_project(outer->op) && 
!rel_find_exp(outer, exp))
                                        exp = rel_project_add_exp(sql, outer, 
exp);
                                if (exp)
@@ -1232,8 +1240,8 @@ rel_column_ref(sql_query *query, sql_rel
                        if (exp && outer && outer->card <= CARD_AGGR && 
exp->card > CARD_AGGR && !is_sql_aggr(f))
                                return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in query 
results without an aggregate function", tname, cname);
                        if (exp && outer && !is_sql_aggr(f)) {
-                               if (query_outer_used_exp( query, i, exp, f)) {
-                                       sql_exp *lu = 
query_outer_last_used(query, i);
+                               if (used_lower_after_processed || 
query_outer_used_exp( query, i, exp, f)) {
+                                       sql_exp *lu = 
used_lower_after_processed?exp:query_outer_last_used(query, i);
                                        if (exp_name(lu) && exp_relname(lu) && 
!has_label(lu))
                                                return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: subquery uses ungrouped column \"%s.%s\" 
from outer query", exp_relname(lu), exp_name(lu));
                                        return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: subquery uses ungrouped column from outer query");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to