diff --git a/core/translate/planner.rs b/core/translate/planner.rs index c7e5c9f6a..001c734a1 100644 --- a/core/translate/planner.rs +++ b/core/translate/planner.rs @@ -41,7 +41,7 @@ pub fn resolve_aggregates( .any(|a| exprs_are_equivalent(&a.original_expr, expr)) { contains_aggregates = true; - return Ok(WalkControl::Continue); + return Ok(WalkControl::SkipChildren); } match expr { Expr::FunctionCall { @@ -78,6 +78,7 @@ pub fn resolve_aggregates( Ok(Func::Agg(f)) => { aggs.push(Aggregate::new(f, args, expr, distinctness)); contains_aggregates = true; + return Ok(WalkControl::SkipChildren); } Err(e) => { if let Some(f) = syms.resolve_function(name.as_str(), args_count) { @@ -90,6 +91,7 @@ pub fn resolve_aggregates( ); aggs.push(agg); contains_aggregates = true; + return Ok(WalkControl::SkipChildren); } } else { return Err(e); @@ -108,6 +110,7 @@ pub fn resolve_aggregates( Ok(Func::Agg(f)) => { aggs.push(Aggregate::new(f, &[], expr, Distinctness::NonDistinct)); contains_aggregates = true; + return Ok(WalkControl::SkipChildren); } Ok(_) => { crate::bail_parse_error!("Invalid aggregate function: {}", name.as_str()); diff --git a/testing/agg-functions.test b/testing/agg-functions.test index 7caf628b9..52c45ce9b 100755 --- a/testing/agg-functions.test +++ b/testing/agg-functions.test @@ -191,3 +191,11 @@ do_execsql_test_error select-scalar-func-star { do_execsql_test_error select-scalar-func-star-in-expression { SELECT CASE WHEN abs(*) > 0 THEN 1 ELSE 0 END FROM users; } {.*(Invalid aggregate function|wrong number of arguments to function).*} + +do_execsql_test_error_content select-nested-agg-func { + SELECT max(abs(sum(age))), sum(age) FROM users; +} {"misuse of aggregate function"} + +do_execsql_test_error_content select-nested-agg-func-in-expression { + SELECT CASE WHEN max(abs(sum(age))) > 0 THEN 1 ELSE 0 END, sum(age) FROM users; +} {"misuse of aggregate function"}