nodedb_sql/parser/
statement.rs1use sqlparser::ast::Statement;
4use sqlparser::dialect::PostgreSqlDialect;
5use sqlparser::parser::Parser;
6
7use crate::error::{Result, SqlError};
8
9pub 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#[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
32pub 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}