You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// The outer expressions we will search through for aggregates.
222
-
// Aggregates may be sourced from the SELECT list or from the HAVING expression.
223
-
let aggr_expr_haystack = select_exprs
224
-
.iter()
225
-
.chain(having_expr_opt.iter())
226
-
.chain(qualify_expr_opt.iter());
227
-
// All of the aggregate expressions (deduplicated).
228
-
let aggr_exprs = find_aggregate_exprs(aggr_expr_haystack);
237
+
// First, find aggregates in SELECT, HAVING, and QUALIFY
238
+
let select_having_qualify_aggrs = find_aggregate_exprs(
239
+
select_exprs
240
+
.iter()
241
+
.chain(having_expr_opt.iter())
242
+
.chain(qualify_expr_opt.iter()),
243
+
);
244
+
245
+
// Find aggregates in ORDER BY
246
+
let order_by_aggrs = find_aggregate_exprs(order_by_rex.iter().map(|s| &s.expr));
247
+
248
+
// Combine: all aggregates from SELECT/HAVING/QUALIFY, plus ORDER BY aggregates
249
+
// that aren't already in SELECT/HAVING/QUALIFY
250
+
letmut aggr_exprs = select_having_qualify_aggrs;
251
+
for order_by_aggr in order_by_aggrs {
252
+
if !aggr_exprs.iter().any(|e| e == &order_by_aggr){
253
+
aggr_exprs.push(order_by_aggr);
254
+
}
255
+
}
229
256
230
257
// Process group by, aggregation or having
231
-
let(
258
+
letAggregatePlanResult{
232
259
plan,
233
-
mut select_exprs_post_aggr,
234
-
having_expr_post_aggr,
235
-
qualify_expr_post_aggr,
236
-
) = if !group_by_exprs.is_empty() || !aggr_exprs.is_empty(){
260
+
select_exprs:mut select_exprs_post_aggr,
261
+
having_expr: having_expr_post_aggr,
262
+
qualify_expr: qualify_expr_post_aggr,
263
+
order_by_exprs: order_by_rex,
264
+
} = if !group_by_exprs.is_empty() || !aggr_exprs.is_empty(){
237
265
self.aggregate(
238
266
&base_plan,
239
267
&select_exprs,
240
268
having_expr_opt.as_ref(),
241
269
qualify_expr_opt.as_ref(),
270
+
&order_by_rex,
242
271
&group_by_exprs,
243
272
&aggr_exprs,
244
273
)?
245
274
}else{
246
275
match having_expr_opt {
247
276
Some(having_expr) => returnplan_err!("HAVING clause references: {having_expr} must appear in the GROUP BY clause or be used in an aggregate function"),
sql:"select min(ta.j1_id) as j1_min from j1 ta order by min(ta.j1_id) limit 10;",
335
335
parser_dialect:MySqlDialect{},
336
336
unparser_dialect:UnparserMySqlDialect{},
337
-
// top projection sort gets derived into a subquery
338
-
// for MySQL, this subquery needs an alias
339
-
expected: @"SELECT `j1_min` FROM (SELECT min(`ta`.`j1_id`) AS `j1_min`, min(`ta`.`j1_id`) FROM `j1` AS `ta` ORDER BY min(`ta`.`j1_id`) ASC) AS `derived_sort` LIMIT 10",
337
+
expected: @"SELECT min(`ta`.`j1_id`) AS `j1_min` FROM `j1` AS `ta` ORDER BY `j1_min` ASC LIMIT 10",
sql:"select min(ta.j1_id) as j1_min, max(tb.j1_max) from j1 ta, (select distinct max(ta.j1_id) as j1_max from j1 ta order by max(ta.j1_id)) tb order by min(ta.j1_id) limit 10;",
361
357
parser_dialect:MySqlDialect{},
362
358
unparser_dialect:UnparserMySqlDialect{},
363
-
expected: @"SELECT `j1_min`, `max(tb.j1_max)` FROM (SELECT min(`ta`.`j1_id`) AS `j1_min`, max(`tb`.`j1_max`), min(`ta`.`j1_id`) FROM `j1` AS `ta` CROSS JOIN (SELECT `j1_max` FROM (SELECT DISTINCT max(`ta`.`j1_id`) AS `j1_max` FROM `j1` AS `ta`) AS `derived_distinct`) AS `tb` ORDER BY min(`ta`.`j1_id`) ASC) AS `derived_sort` LIMIT 10",
359
+
expected: @"SELECT min(`ta`.`j1_id`) AS `j1_min`, max(`tb`.`j1_max`)FROM `j1` AS `ta` CROSS JOIN (SELECT DISTINCT max(`ta`.`j1_id`) AS `j1_max` FROM `j1` AS `ta`) AS `tb` ORDER BY `j1_min` ASC LIMIT 10",
@r#"SELECT j1.j1_id, j1.j1_string, lochierarchy FROM (SELECT j1.j1_id, j1.j1_string, (grouping(j1.j1_id) + grouping(j1.j1_string)) AS lochierarchy, grouping(j1.j1_string), grouping(j1.j1_id) FROM j1 GROUP BY ROLLUP (j1.j1_id, j1.j1_string) ORDER BY (grouping(j1.j1_id) + grouping(j1.j1_string)) DESC NULLS FIRST, CASE WHEN ((grouping(j1.j1_id) + grouping(j1.j1_string)) = 0) THEN j1.j1_id END ASC NULLS LAST) LIMIT 100"#
1908
+
@r#"SELECT j1.j1_id, j1.j1_string, lochierarchy FROM (SELECT j1.j1_id, j1.j1_string, (grouping(j1.j1_id) + grouping(j1.j1_string)) AS lochierarchy, grouping(j1.j1_string), grouping(j1.j1_id) FROM j1 GROUP BY ROLLUP (j1.j1_id, j1.j1_string) ORDER BY lochierarchy DESC NULLS FIRST, CASE WHEN ((grouping(j1.j1_id) + grouping(j1.j1_string)) = 0) THEN j1.j1_id END ASC NULLS LAST) LIMIT 100"#
0 commit comments