Skip to main content

nodedb_sql/parser/
statement.rs

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