Changeset: 6baf5e734cab for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6baf5e734cab
Modified Files:
        sql/server/rel_select.c
        sql/test/SQLancer/Tests/sqlancer18.test
Branch: Jan2022
Log Message:

fix crashes in sqlancer18, ie wrong combination of group by and use of 
ungrouped columns


diffs (72 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
@@ -1156,6 +1156,8 @@ rel_column_ref(sql_query *query, sql_rel
                                if (exp)
                                        break;
                        }
+                       if (exp && exp->card != CARD_AGGR && 
is_groupby(outer->op) && !is_sql_aggr(f) && rel_find_exp(outer->l, exp))
+                               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 && 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)) {
@@ -1237,6 +1239,8 @@ rel_column_ref(sql_query *query, sql_rel
                                if (exp)
                                        break;
                        }
+                       if (exp && exp->card != CARD_AGGR && 
is_groupby(outer->op) && !is_sql_aggr(f) && rel_find_exp(outer->l, exp))
+                               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 && 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)) {
@@ -2271,6 +2275,7 @@ rel_logical_value_exp(sql_query *query, 
                symbol *ro = n->next->next->data.sym;
                char *compare_op = n->next->data.sval;
                int quantifier = 0;
+               int grouped = 0;
 
                sql_exp *rs = NULL, *ls;
                comp_type cmp_type = compare_str2type(compare_op);
@@ -2304,6 +2309,7 @@ rel_logical_value_exp(sql_query *query, 
                        compare_op = "=";
                }
 
+               grouped = (rel && (*rel) && is_groupby((*rel)->op));
                ls = rel_value_exp(query, rel, lo, f|sql_farg, ek);
                if (!ls)
                        return NULL;
@@ -2314,6 +2320,13 @@ rel_logical_value_exp(sql_query *query, 
                if (!rs)
                        return NULL;
 
+               if (!grouped && rel && (*rel) && is_groupby((*rel)->op) && 
!rel_find_exp(*rel, ls) && !is_freevar(ls) && (!exp_is_rel(ls))) {
+                       if (exp_name(ls) && exp_relname(ls))
+                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s.%s' in query results without an 
aggregate function", exp_relname(ls), exp_name(ls));
+                       else
+                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: subquery uses ungrouped column");
+               }
+
                if (!exp_is_rel(ls) && !exp_is_rel(rs) && ls->card < rs->card) {
                        sql_exp *swap = ls; /* has to swap parameters like in 
the rel_logical_exp case */
                        ls = rs;
diff --git a/sql/test/SQLancer/Tests/sqlancer18.test 
b/sql/test/SQLancer/Tests/sqlancer18.test
--- a/sql/test/SQLancer/Tests/sqlancer18.test
+++ b/sql/test/SQLancer/Tests/sqlancer18.test
@@ -348,7 +348,7 @@ select greatest(1, (select (select vy.vc
 statement ok
 DROP VIEW vy
 
-statement error 42000!SELECT: subquery uses ungrouped column "vz.c0" from 
outer query
+statement error 42000!SELECT: cannot use non GROUP BY column 'vz.c0' in query 
results without an aggregate function
 SELECT 1 FROM (select 0,1) vz(c0,c1) GROUP BY c1 HAVING sum(1) < ANY(SELECT 
vz.c0 FROM t1)
 
 statement ok
@@ -683,7 +683,7 @@ SELECT 1 FROM v100 WHERE (SELECT 1 HAVIN
 statement error 42000!SELECT: cannot use non GROUP BY column 'vx.vc0' in query 
results without an aggregate function
 SELECT vx.vc0 < ANY(SELECT sum(vx.vc0) FROM tx) FROM (select 240 FROM tx) 
vx(vc0)
 
-statement error 42000!SELECT: subquery uses ungrouped column "vx.vc0" from 
outer query
+statement error 42000!SELECT: cannot use non GROUP BY column 'vx.vc0' in query 
results without an aggregate function
 SELECT sum(vx.vc0) < ANY(SELECT vx.vc0 FROM tx) FROM (select 240 FROM tx) 
vx(vc0)
 
 #these are right
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to