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

Report the right expression causing the error


diffs (115 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
@@ -1558,19 +1558,23 @@ rel_filter(mvc *sql, sql_rel *rel, list 
        if (exps_one_is_rel(l) || exps_one_is_rel(r)) /* uncorrelated subquery 
case */
                return rel_select(sql->sa, rel, e);
        /* atom or row => select */
-       if (exps_card(l) > rel->card) {
-               sql_exp *ls = l->h->data;
-               if (exp_name(ls))
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", exp_name(ls));
-               else
+       for (node *n=l->h; n; n = n->next) {
+               sql_exp *ls = n->data;
+
+               if (ls->card > rel->card) {
+                       if (exp_name(ls))
+                               return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results 
without an aggregate function", exp_name(ls));
                        return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
-       }
-       if (exps_card(r) > rel->card) {
-               sql_exp *rs = l->h->data;
-               if (exp_name(rs))
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", exp_name(rs));
-               else
+               }
+       }
+       for (node *n=r->h; n; n = n->next) {
+               sql_exp *rs = n->data;
+
+               if (rs->card > rel->card) {
+                       if (exp_name(rs))
+                               return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results 
without an aggregate function", exp_name(rs));
                        return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
+               }
        }
        if (!is_join(rel->op) && !is_select(rel->op))
                return rel_select(sql->sa, rel, e);
@@ -1665,17 +1669,11 @@ rel_compare_exp_(sql_query *query, sql_r
                return rel_select(sql->sa, rel_project_exp(sql->sa, 
exp_atom_bool(sql->sa, 1)), e);
 
        /* atom or row => select */
-       if (ls->card > rel->card) {
-               if (exp_name(ls))
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", exp_name(ls));
-               else
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
-       }
-       if (rs->card > rel->card || (rs2 && rs2->card > rel->card)) {
-               if (exp_name(rs))
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", exp_name(rs));
-               else
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
+       if (ls->card > rel->card || rs->card > rel->card || (rs2 && rs2->card > 
rel->card)) {
+               sql_exp *e = ls->card > rel->card ? ls : rs->card > rel->card ? 
rs : rs2;
+               if (exp_name(e))
+                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", exp_name(e));
+               return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT: 
cannot use non GROUP BY column in query results without an aggregate function");
        }
        return rel_select_push_exp_down(sql, rel, e, ls, rs, rs2, f);
 }
@@ -3571,8 +3569,7 @@ static sql_exp *
                                sql_exp *lu = query_outer_last_used(query, 
all_freevar-1);
                                if (lu->type == e_column)
                                        return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: subquery uses ungrouped column \"%s.%s\" from outer 
query", (char*)lu->l, (char*)lu->r);
-                               else
-                                       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 \"%s.%s\" from outer 
query", exp_relname(lu), exp_name(lu));
                        }
                        if (is_outer(groupby))
                                return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: subquery uses ungrouped column from outer query");
@@ -4433,8 +4430,7 @@ rel_order_by_column_exp(sql_query *query
                                if (ee->card > r->card) {
                                        if (exp_name(ee))
                                                return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in 
query results without an aggregate function", exp_name(ee));
-                                       else
-                                               return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query 
results without an aggregate function");
+                                       return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results 
without an aggregate function");
                                }
                        }
                }
@@ -4518,8 +4514,7 @@ rel_order_by(sql_query *query, sql_rel *
                                } else if (e && exp_card(e) > rel->card) {
                                        if (exp_name(e))
                                                return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in 
query results without an aggregate function", exp_name(e));
-                                       else
-                                               return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query 
results without an aggregate function");
+                                       return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results 
without an aggregate function");
                                }
                                if (e && !exp_name(e))
                                        exp_label(sql->sa, e, ++sql->label);
@@ -5407,8 +5402,7 @@ rel_table_exp(sql_query *query, sql_rel 
                                        if (e->card > groupby->card) {
                                                if (exp_name(e))
                                                        return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in 
query results without an aggregate function", exp_name(e));
-                                               else
-                                                       return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query 
results without an aggregate function");
+                                               return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query 
results without an aggregate function");
                                        }
                                }
                        }
@@ -5686,11 +5680,9 @@ rel_select_exp(sql_query *query, sql_rel
                for (node *n=pexps->h; n; n = n->next) {
                        sql_exp *ce = n->data;
                        if (rel->card < ce->card) {
-                               if (exp_name(ce) && !has_label(ce)) {
+                               if (exp_name(ce) && !has_label(ce))
                                        return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results 
without an aggregate function", exp_name(ce));
-                               } else {
-                                       return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results 
without an aggregate function");
-                               }
+                               return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results 
without an aggregate function");
                        }
                }
                set_processed(rel);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to