Skip to main content

nodedb_sql/parser/
statement.rs

1//! SQL parsing via sqlparser-rs.
2
3use sqlparser::ast::Statement;
4use sqlparser::dialect::PostgreSqlDialect;
5use sqlparser::parser::Parser;
6
7use crate::error::{Result, SqlError};
8
9/// Parse a SQL string into one or more statements.
10pub fn parse_sql(sql: &str) -> Result<Vec<Statement>> {
11    let dialect = PostgreSqlDialect {};
12    let statements = Parser::parse_sql(&dialect, sql)?;
13    if statements.is_empty() {
14        return Err(SqlError::Parse {
15            detail: "empty SQL statement".into(),
16        });
17    }
18    Ok(statements)
19}
20
21/// Classify a parsed statement for routing.
22#[derive(Debug)]
23pub enum StatementKind<'a> {
24    Select(&'a sqlparser::ast::Query),
25    Insert(&'a sqlparser::ast::Insert),
26    Update(&'a sqlparser::ast::Statement),
27    Delete(&'a sqlparser::ast::Statement),
28    Truncate(&'a sqlparser::ast::Statement),
29    Other,
30}
31
32/// Classify a parsed statement.
33pub fn classify(stmt: &Statement) -> StatementKind<'_> {
34    match stmt {
35        Statement::Query(q) => StatementKind::Select(q),
36        Statement::Insert(ins) => StatementKind::Insert(ins),
37        Statement::Update(_) => StatementKind::Update(stmt),
38        Statement::Delete(_) => StatementKind::Delete(stmt),
39        Statement::Truncate(_) => StatementKind::Truncate(stmt),
40        _ => StatementKind::Other,
41    }
42}