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