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