Skip to main content

oak_sql/ast/
root_nodes.rs

1use 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/// SQL root node representing a collection of SQL statements.
11#[derive(Debug, Clone, Default)]
12#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13pub struct SqlRoot {
14    /// The list of SQL statements in the script.
15    pub statements: Vec<SqlStatement>,
16    /// The full span of the SQL script.
17    #[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/// Represents a single SQL statement.
36#[derive(Debug, Clone)]
37#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
38pub enum SqlStatement {
39    /// A SELECT statement.
40    Select(SelectStatement),
41    /// An INSERT statement.
42    Insert(InsertStatement),
43    /// An UPDATE statement.
44    Update(UpdateStatement),
45    /// A DELETE statement.
46    Delete(DeleteStatement),
47    /// A CREATE statement.
48    Create(CreateStatement),
49    /// A DROP statement.
50    Drop(DropStatement),
51    /// An ALTER statement.
52    Alter(AlterStatement),
53    /// An error occurred during parsing or building.
54    Error {
55        /// The error message.
56        message: Arc<str>,
57        /// The span where the error occurred.
58        #[serde(with = "oak_core::serde_range")]
59        span: Range<usize>,
60    },
61    /// An unknown or unparsed statement.
62    Unknown {
63        /// The span of the unknown statement.
64        #[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}