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]