use crate::SyntaxKind;
use crate::parser::{Parser, syntax_codes as sc};
use super::{CLAUSE_START, clause};
pub(crate) fn statement(p: &mut Parser<'_>) {
let m = p.start();
single_query(p);
while p.at(SyntaxKind::UNION_KW) {
union_tail(p);
}
m.complete(p, SyntaxKind::STATEMENT);
}
fn union_tail(p: &mut Parser<'_>) {
debug_assert!(p.at(SyntaxKind::UNION_KW));
let m = p.start();
p.bump(SyntaxKind::UNION_KW);
p.eat(SyntaxKind::ALL_KW);
single_query(p);
m.complete(p, SyntaxKind::UNION_TAIL);
}
fn single_query(p: &mut Parser<'_>) {
let mut parsed_any = false;
loop {
if p.current() == SyntaxKind::EOF || p.at(SyntaxKind::SEMI) || p.at(SyntaxKind::UNION_KW) {
break;
}
if !p.at_ts(CLAUSE_START) {
if parsed_any {
break;
}
p.error_code(
sc::EXPECTED_CLAUSE,
"expected a clause (MATCH/WITH/RETURN/...)",
);
return;
}
clause::clause(p);
parsed_any = true;
}
}