1use nom::bytes::complete::tag;
2use nom::character::complete::char;
3use nom::combinator::cut;
4use nom::sequence::{preceded, terminated, tuple};
5use nom::IResult;
6
7use crate::sql::Expr;
8use crate::sql::Func;
9
10use crate::parser::{parse_expr, whitespace};
11
12pub fn count<'a>(input: &'a str) -> IResult<&'a str, Expr> {
13 let name = "COUNT";
14 let (input, (_, _, expr)) = tuple((
15 preceded(whitespace, tag(name)),
16 char('('),
17 cut(terminated(
18 preceded(whitespace, parse_expr),
19 preceded(whitespace, char(')')),
20 )),
21 ))(input)?;
22
23 let res = Expr::Func(Box::new(Func::Count(expr)));
24
25 Ok((input, res))
26}
27
28pub fn upper<'a>(input: &'a str) -> IResult<&'a str, Expr> {
29 let name = "UPPER";
30 let (input, (_, _, expr)) = tuple((
31 preceded(whitespace, tag(name)),
32 char('('),
33 cut(terminated(
34 preceded(whitespace, parse_expr),
35 preceded(whitespace, char(')')),
36 )),
37 ))(input)?;
38
39 let res = Expr::Func(Box::new(Func::Upper(expr)));
40
41 Ok((input, res))
42}