use crate::db::{
predicate::Predicate,
sql_shared::{Keyword, SqlParseError, SqlTokenCursor},
};
pub(in crate::db::predicate::parser::expression) fn parse_or_predicate(
cursor: &mut SqlTokenCursor,
) -> Result<Predicate, SqlParseError> {
let mut left = parse_and_predicate(cursor)?;
while cursor.eat_keyword(Keyword::Or) {
let right = parse_and_predicate(cursor)?;
left = Predicate::Or(vec![left, right]);
}
Ok(left)
}
fn parse_and_predicate(cursor: &mut SqlTokenCursor) -> Result<Predicate, SqlParseError> {
let mut left = parse_not_predicate(cursor)?;
while cursor.eat_keyword(Keyword::And) {
let right = parse_not_predicate(cursor)?;
left = Predicate::And(vec![left, right]);
}
Ok(left)
}
fn parse_not_predicate(cursor: &mut SqlTokenCursor) -> Result<Predicate, SqlParseError> {
if cursor.eat_keyword(Keyword::Not) {
return Ok(Predicate::Not(Box::new(parse_not_predicate(cursor)?)));
}
crate::db::predicate::parser::expression::atom::parse_predicate_primary(cursor)
}