Skip to main content

partiql/parser/
func.rs

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}