openpql_pql_parser/ast/
stmt.rs1use 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}