Changeset: 40d42715b1b9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/40d42715b1b9
Added Files:
        sql/test/BugTracker-2025/Tests/7760-groupby_posarg_CP.test
Modified Files:
        sql/server/rel_select.c
        sql/test/BugTracker-2025/Tests/All
        sql/test/SQLancer/Tests/sqlancer04.test
Branch: Dec2025
Log Message:

Fix group by positional arg of multilevel name projection. Fix #7760


diffs (74 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
@@ -1669,8 +1669,11 @@ rel_column_ref(sql_query *query, sql_rel
                        if (!(exp = rel_bind_column3(sql, inner, sname, tname, 
cname, f)) &&
                                sql->session->status == -ERR_AMBIGUOUS)
                                return NULL;
+               if (!exp && inner && is_groupby(inner->op) && inner->flag)
+                       if (!(exp = rel_bind_column3(sql, inner->l, sname, 
tname, cname, f)) &&
+                               sql->session->status == -ERR_AMBIGUOUS)
+                               return NULL;
                if (!exp && inner && is_sql_aggr(f) && (is_groupby(inner->op) 
|| is_select(inner->op))) {
-                       /* if inner is selection, ie having clause, get the 
left relation to reach group by */
                        sql_rel *gp = inner;
                        while (gp && is_select(gp->op))
                                gp = gp->l;
@@ -1787,7 +1790,8 @@ rel_column_ref(sql_query *query, sql_rel
                if (!exp)
                        return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42S22) 
"SELECT: no such column '%s.%s'", tname, cname);
                if (exp && inner && inner->card <= CARD_AGGR && exp->card > 
CARD_AGGR &&
-                       (is_sql_sel(f) || is_sql_having(f)) && !is_sql_aggr(f))
+                       (is_sql_sel(f) || is_sql_having(f)) &&
+                        (!is_sql_aggr(f) && !(inner->flag)))
                        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);
diff --git a/sql/test/BugTracker-2025/Tests/7760-groupby_posarg_CP.test 
b/sql/test/BugTracker-2025/Tests/7760-groupby_posarg_CP.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7760-groupby_posarg_CP.test
@@ -0,0 +1,14 @@
+statement ok
+SELECT id FROM sys.columns WHERE id IN (SELECT columns.id FROM (SELECT a.id 
FROM sys.columns a JOIN sys.columns b ON 1=1 ) AS columns GROUP BY 1)
+
+statement ok
+SELECT columns.id FROM (SELECT a.id FROM sys.columns a JOIN sys.columns b ON 
true) AS columns GROUP BY 1
+
+statement ok
+SELECT a.id FROM sys._columns a JOIN sys._columns b ON true group by 1
+
+statement ok
+SELECT x FROM (select 1) a(x) JOIN (SELECT 2) b(y) ON true group by 1
+
+statement ok
+SELECT x FROM (select 1) a(x) JOIN (SELECT 2) b(y) ON true group by x
diff --git a/sql/test/BugTracker-2025/Tests/All 
b/sql/test/BugTracker-2025/Tests/All
--- a/sql/test/BugTracker-2025/Tests/All
+++ b/sql/test/BugTracker-2025/Tests/All
@@ -83,3 +83,4 @@ 7752-union-sum
 7756-anti-join-null
 7759-replace-wrong-error
 7763-exits-with-null
+7760-groupby_posarg_CP
diff --git a/sql/test/SQLancer/Tests/sqlancer04.test 
b/sql/test/SQLancer/Tests/sqlancer04.test
--- a/sql/test/SQLancer/Tests/sqlancer04.test
+++ b/sql/test/SQLancer/Tests/sqlancer04.test
@@ -645,7 +645,7 @@ case 1108638173 when 1 then 'PS     ' when 0
 statement ok
 create view v40(vc0) as (values ((true) not in (false, false)), 
("isauuid"(case 8 when 4 then 'F&' when 0 then '&' end)))
 
-statement error 42000!SELECT: cannot use non GROUP BY column 'v20.vc0' in 
query results without an aggregate function
+query I
 select cast(sum(count) as bigint) from (select cast(greatest(false, true) as 
int) as count from v37 full outer join
 (select all ((((1074663557)%(0.8367095941704169)))%(v20.vc0 * 
0.25281408194923194)), 0.573499282341099
 from v20 where ((((true)or(true)))or(true)) group by 2) as sub0 on
@@ -657,6 +657,8 @@ then 0.782559214696659233290176871378207
 then 0.8350239383024128 when '6r' then 932574625 when '[]' then 9 when '' then 
5 when 'LnP/Amb9' then 2 end)
 from v40, v3 where (0.4906208915598539999081140194903127849102020263671875) 
not in (1654919043, 6)) as sub1
 on ((trim(v37.vc0))>=(substr(v37.vc0, 9, 8)))) as res
+----
+8
 
 statement ok
 ROLLBACK
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to