@@ -241,6 +241,7 @@ pub enum ExprElement {
241241 } ,
242242 /// `Count(*)` expression
243243 CountAll {
244+ qualified : QualifiedName ,
244245 window : Option < Window > ,
245246 } ,
246247 /// `(foo, bar)`
@@ -569,8 +570,9 @@ impl<'a, I: Iterator<Item = WithSpan<'a, ExprElement>>> PrattParser<I> for ExprP
569570 span : transform_span ( elem. span . tokens ) ,
570571 value,
571572 } ,
572- ExprElement :: CountAll { window } => Expr :: CountAll {
573+ ExprElement :: CountAll { qualified , window } => Expr :: CountAll {
573574 span : transform_span ( elem. span . tokens ) ,
575+ qualified,
574576 window,
575577 } ,
576578 ExprElement :: Tuple { exprs } => Expr :: Tuple {
@@ -1036,10 +1038,28 @@ pub fn expr_element(i: Input) -> IResult<WithSpan<ExprElement>> {
10361038
10371039 let count_all_with_window = map (
10381040 rule ! {
1039- COUNT ~ "(" ~ "*" ~ ")" ~ ( OVER ~ #window_spec_ident ) ?
1040- } ,
1041- |( _, _, _, _, window) | ExprElement :: CountAll {
1042- window : window. map ( |w| w. 1 ) ,
1041+ COUNT ~ "(" ~ ( #ident ~ "." ~ ( #ident ~ "." ) ? ) ? ~ "*" ~ ")" ~ ( OVER ~ #window_spec_ident ) ?
1042+ } ,
1043+ |( _, _, res, star, _, window) | match res {
1044+ Some ( ( fst, _, Some ( ( snd, _) ) ) ) => ExprElement :: CountAll {
1045+ qualified : vec ! [
1046+ Indirection :: Identifier ( fst) ,
1047+ Indirection :: Identifier ( snd) ,
1048+ Indirection :: Star ( Some ( star. span) ) ,
1049+ ] ,
1050+ window : window. map ( |w| w. 1 ) ,
1051+ } ,
1052+ Some ( ( fst, _, None ) ) => ExprElement :: CountAll {
1053+ qualified : vec ! [
1054+ Indirection :: Identifier ( fst) ,
1055+ Indirection :: Star ( Some ( star. span) ) ,
1056+ ] ,
1057+ window : window. map ( |w| w. 1 ) ,
1058+ } ,
1059+ None => ExprElement :: CountAll {
1060+ qualified : vec ! [ Indirection :: Star ( Some ( star. span) ) ] ,
1061+ window : window. map ( |w| w. 1 ) ,
1062+ } ,
10431063 } ,
10441064 ) ;
10451065
0 commit comments