oak_sql/ast/
root_nodes.rs1use crate::ast::statements::{
2 ddl::{AlterStatement, CreateStatement, DropStatement},
3 dml::{DeleteStatement, InsertStatement, UpdateStatement},
4 query::SelectStatement,
5};
6use core::range::Range;
7use oak_core::source::{SourceBuffer, ToSource};
8use std::sync::Arc;
9
10#[derive(Debug, Clone, Default)]
12#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13pub struct SqlRoot {
14 pub statements: Vec<SqlStatement>,
16 #[serde(with = "oak_core::serde_range")]
18 pub span: Range<usize>,
19}
20
21impl ToSource for SqlRoot {
22 fn to_source(&self, buffer: &mut SourceBuffer) {
23 for (i, stmt) in self.statements.iter().enumerate() {
24 if i > 0 {
25 buffer.push(";");
26 }
27 stmt.to_source(buffer);
28 }
29 if !self.statements.is_empty() {
30 buffer.push(";");
31 }
32 }
33}
34
35#[derive(Debug, Clone)]
37#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
38pub enum SqlStatement {
39 Select(SelectStatement),
41 Insert(InsertStatement),
43 Update(UpdateStatement),
45 Delete(DeleteStatement),
47 Create(CreateStatement),
49 Drop(DropStatement),
51 Alter(AlterStatement),
53 Error {
55 message: Arc<str>,
57 #[serde(with = "oak_core::serde_range")]
59 span: Range<usize>,
60 },
61 Unknown {
63 #[serde(with = "oak_core::serde_range")]
65 span: Range<usize>,
66 },
67}
68
69impl ToSource for SqlStatement {
70 fn to_source(&self, buffer: &mut SourceBuffer) {
71 match self {
72 SqlStatement::Select(s) => s.to_source(buffer),
73 SqlStatement::Insert(s) => s.to_source(buffer),
74 SqlStatement::Update(s) => s.to_source(buffer),
75 SqlStatement::Delete(s) => s.to_source(buffer),
76 SqlStatement::Create(s) => s.to_source(buffer),
77 SqlStatement::Drop(s) => s.to_source(buffer),
78 SqlStatement::Alter(s) => s.to_source(buffer),
79 SqlStatement::Error { message, .. } => {
80 buffer.push("/* ERROR: ");
81 buffer.push(message);
82 buffer.push(" */");
83 }
84 SqlStatement::Unknown { .. } => {}
85 }
86 }
87}