openpql_pql_parser/ast/
stmt.rs

1use super::{Error, FromClause, FxHashSet, ResultE, Selector, user_err};
2
3#[derive(PartialEq, Debug)]
4pub struct Stmt<'i> {
5    pub selectors: Vec<Selector<'i>>,
6    pub from: FromClause<'i>,
7}
8
9fn ensure_uniq_names<'i>(selectors: &[Selector]) -> ResultE<'i, ()> {
10    let mut used = FxHashSet::default();
11
12    for selector in selectors {
13        if let Some(id) = &selector.alias
14            && !used.insert(id.inner.to_ascii_lowercase())
15        {
16            return Err(user_err(Error::DuplicatedSelectorName(id.loc)));
17        }
18    }
19
20    Ok(())
21}
22
23impl<'i> Stmt<'i> {
24    pub fn new(
25        selectors: Vec<Selector<'i>>,
26        from: FromClause<'i>,
27    ) -> ResultE<'i, Self> {
28        ensure_uniq_names(&selectors)?;
29
30        Ok(Self { selectors, from })
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37    use crate::*;
38
39    fn s(s: &str) -> Stmt<'_> {
40        parser::StmtParser::new().parse(s).unwrap()
41    }
42
43    fn e(s: &str) -> Error {
44        parser::StmtParser::new().parse(s).unwrap_err().into()
45    }
46
47    #[test]
48    fn test_stmt() {
49        assert_eq!(s("select avg(_)  from _=''").selectors.len(), 1);
50        assert_eq!(s("select avg(_), from _=''").selectors.len(), 1);
51
52        assert_eq!(
53            s("select avg(_) as s1 from _=''").selectors[0].alias,
54            Some(("s1", (17, 19)).into())
55        );
56
57        assert_eq!(
58            e("select avg(_) as s1, avg(_) as s1 from _=''"),
59            Error::DuplicatedSelectorName((31, 33))
60        );
61    }
62}