mod expression;
mod lowering;
mod operand;
#[cfg(test)]
mod tests;
use crate::db::{
predicate::Predicate,
sql_shared::{SqlParseError, SqlTokenCursor, tokenize_sql},
};
pub(in crate::db) use crate::db::predicate::parser::expression::parse_predicate_from_cursor;
pub(crate) fn parse_sql_predicate(sql: &str) -> Result<Predicate, SqlParseError> {
let tokens = tokenize_sql(sql)?;
let mut cursor = SqlTokenCursor::new(tokens);
let predicate = parse_predicate_from_cursor(&mut cursor)?;
if cursor.eat_semicolon() && !cursor.is_eof() {
return Err(SqlParseError::unsupported_feature(
"multi-statement SQL input",
));
}
if !cursor.is_eof() {
if let Some(feature) = cursor.peek_unsupported_feature() {
return Err(SqlParseError::unsupported_feature(feature));
}
return Err(SqlParseError::expected_end_of_input(cursor.peek_kind()));
}
Ok(predicate)
}