@@ -169,7 +169,7 @@ pub struct AstToLogical<'a> {
169
169
arg_stack : Vec < Vec < CallArgument > > ,
170
170
path_stack : Vec < Vec < PathComponent > > ,
171
171
sort_stack : Vec < Vec < logical:: SortSpec > > ,
172
- aggregate_exprs : Vec < AggregateExpression > ,
172
+ aggregate_exprs : Vec < Vec < AggregateExpression > > ,
173
173
projection_renames : Vec < FnvIndexMap < String , BindingsName < ' a > > > ,
174
174
175
175
aliases : FnvIndexMap < NodeId , SymbolPrimitive > ,
@@ -493,6 +493,7 @@ impl<'a> AstToLogical<'a> {
493
493
#[ inline]
494
494
fn enter_q ( & mut self ) {
495
495
self . q_stack . push ( Default :: default ( ) ) ;
496
+ self . aggregate_exprs . push ( Default :: default ( ) ) ;
496
497
self . ctx_stack . push ( QueryContext :: Query ) ;
497
498
self . projection_renames . push ( Default :: default ( ) ) ;
498
499
}
@@ -501,6 +502,7 @@ impl<'a> AstToLogical<'a> {
501
502
fn exit_q ( & mut self ) -> QueryClauses {
502
503
self . projection_renames . pop ( ) . expect ( "q level" ) ;
503
504
self . ctx_stack . pop ( ) . expect ( "q level" ) ;
505
+ self . aggregate_exprs . pop ( ) . expect ( "q level" ) ;
504
506
self . q_stack . pop ( ) . expect ( "q level" )
505
507
}
506
508
@@ -852,7 +854,8 @@ impl<'ast> Visitor<'ast> for AstToLogical<'_> {
852
854
fn exit_select ( & mut self , _select : & ' ast Select ) -> Traverse {
853
855
// PartiQL permits SQL aggregations without a GROUP BY (e.g. SELECT SUM(t.a) FROM ...)
854
856
// What follows adds a GROUP BY clause with the rewrite `... GROUP BY true AS $__gk`
855
- if !self . aggregate_exprs . is_empty ( ) && self . current_clauses_mut ( ) . group_by_clause . is_none ( )
857
+ if !self . aggregate_exprs . last ( ) . unwrap ( ) . is_empty ( )
858
+ && self . current_clauses_mut ( ) . group_by_clause . is_none ( )
856
859
{
857
860
let exprs = HashMap :: from ( [ (
858
861
"$__gk" . to_string ( ) ,
@@ -861,7 +864,7 @@ impl<'ast> Visitor<'ast> for AstToLogical<'_> {
861
864
let group_by: BindingsOp = BindingsOp :: GroupBy ( logical:: GroupBy {
862
865
strategy : logical:: GroupingStrategy :: GroupFull ,
863
866
exprs,
864
- aggregate_exprs : self . aggregate_exprs . clone ( ) ,
867
+ aggregate_exprs : self . aggregate_exprs . last ( ) . unwrap ( ) . clone ( ) ,
865
868
group_as_alias : None ,
866
869
} ) ;
867
870
let id = self . curr_plan ( ) . add_operator ( group_by) ;
@@ -1367,7 +1370,7 @@ impl<'ast> Visitor<'ast> for AstToLogical<'_> {
1367
1370
}
1368
1371
}
1369
1372
} ;
1370
- self . aggregate_exprs . push ( agg_expr) ;
1373
+ self . aggregate_exprs . last_mut ( ) . unwrap ( ) . push ( agg_expr) ;
1371
1374
Traverse :: Continue
1372
1375
}
1373
1376
@@ -1680,8 +1683,8 @@ impl<'ast> Visitor<'ast> for AstToLogical<'_> {
1680
1683
Traverse :: Continue
1681
1684
}
1682
1685
1683
- fn exit_group_by_expr ( & mut self , _group_by_expr : & ' ast GroupByExpr ) -> Traverse {
1684
- let aggregate_exprs = self . aggregate_exprs . clone ( ) ;
1686
+ fn exit_group_by_expr ( & mut self , group_by_expr : & ' ast GroupByExpr ) -> Traverse {
1687
+ let aggregate_exprs = self . aggregate_exprs . last ( ) . unwrap ( ) . clone ( ) ;
1685
1688
let benv = self . exit_benv ( ) ;
1686
1689
if !benv. is_empty ( ) {
1687
1690
{
@@ -1691,12 +1694,12 @@ impl<'ast> Visitor<'ast> for AstToLogical<'_> {
1691
1694
let env = self . exit_env ( ) ;
1692
1695
true_or_fault ! ( self , env. len( ) . is_even( ) , "env.len() is not even" ) ;
1693
1696
1694
- let group_as_alias = _group_by_expr
1697
+ let group_as_alias = group_by_expr
1695
1698
. group_as_alias
1696
1699
. as_ref ( )
1697
1700
. map ( |SymbolPrimitive { value, case : _ } | value. clone ( ) ) ;
1698
1701
1699
- let strategy = match _group_by_expr . strategy {
1702
+ let strategy = match group_by_expr . strategy {
1700
1703
None => logical:: GroupingStrategy :: GroupFull ,
1701
1704
Some ( GroupingStrategy :: GroupFull ) => logical:: GroupingStrategy :: GroupFull ,
1702
1705
Some ( GroupingStrategy :: GroupPartial ) => logical:: GroupingStrategy :: GroupPartial ,
0 commit comments