Skip to main content

oak_sql/ast/statements/
dml_nodes.rs

1use crate::ast::expr::{Expression, Identifier, TableName};
2use core::range::Range;
3use oak_core::source::{SourceBuffer, ToSource};
4
5/// Represents an INSERT statement.
6#[derive(Debug, Clone)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct InsertStatement {
9    /// The table to insert into.
10    pub table_name: TableName,
11    /// The columns to insert into.
12    pub columns: Vec<Identifier>,
13    /// The values to insert.
14    pub values: Vec<Expression>,
15    /// The span of the INSERT statement.
16    #[serde(with = "oak_core::serde_range")]
17    pub span: Range<usize>,
18}
19
20impl ToSource for InsertStatement {
21    fn to_source(&self, buffer: &mut SourceBuffer) {
22        buffer.push("INSERT");
23        buffer.push("INTO");
24        self.table_name.to_source(buffer);
25        if !self.columns.is_empty() {
26            buffer.push("(");
27            for (i, col) in self.columns.iter().enumerate() {
28                if i > 0 {
29                    buffer.push(",");
30                }
31                col.to_source(buffer);
32            }
33            buffer.push(")");
34        }
35        buffer.push("VALUES");
36        buffer.push("(");
37        for (i, val) in self.values.iter().enumerate() {
38            if i > 0 {
39                buffer.push(",");
40            }
41            val.to_source(buffer);
42        }
43        buffer.push(")");
44    }
45}
46
47/// Represents an UPDATE statement.
48#[derive(Debug, Clone)]
49#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
50pub struct UpdateStatement {
51    /// The table to update.
52    pub table_name: TableName,
53    /// The assignments to perform.
54    pub assignments: Vec<Assignment>,
55    /// The WHERE clause selection expression.
56    pub selection: Option<Expression>, // WHERE clause
57    /// The span of the UPDATE statement.
58    #[serde(with = "oak_core::serde_range")]
59    pub span: Range<usize>,
60}
61
62impl ToSource for UpdateStatement {
63    fn to_source(&self, buffer: &mut SourceBuffer) {
64        buffer.push("UPDATE");
65        self.table_name.to_source(buffer);
66        buffer.push("SET");
67        for (i, assignment) in self.assignments.iter().enumerate() {
68            if i > 0 {
69                buffer.push(",");
70            }
71            assignment.to_source(buffer);
72        }
73        if let Some(selection) = &self.selection {
74            buffer.push("WHERE");
75            selection.to_source(buffer);
76        }
77    }
78}
79
80/// Represents an assignment in an UPDATE statement.
81#[derive(Debug, Clone)]
82#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
83pub struct Assignment {
84    /// The column to assign to.
85    pub column: Identifier,
86    /// The expression to assign.
87    pub value: Expression,
88    /// The span of the assignment.
89    #[serde(with = "oak_core::serde_range")]
90    pub span: Range<usize>,
91}
92
93impl ToSource for Assignment {
94    fn to_source(&self, buffer: &mut SourceBuffer) {
95        self.column.to_source(buffer);
96        buffer.push("=");
97        self.value.to_source(buffer);
98    }
99}
100
101/// Represents a DELETE statement.
102#[derive(Debug, Clone)]
103#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
104pub struct DeleteStatement {
105    /// The table to delete from.
106    pub table_name: TableName,
107    /// The WHERE clause selection expression.
108    pub selection: Option<Expression>, // WHERE clause
109    /// The span of the DELETE statement.
110    #[serde(with = "oak_core::serde_range")]
111    pub span: Range<usize>,
112}
113
114impl ToSource for DeleteStatement {
115    fn to_source(&self, buffer: &mut SourceBuffer) {
116        buffer.push("DELETE");
117        buffer.push("FROM");
118        self.table_name.to_source(buffer);
119        if let Some(selection) = &self.selection {
120            buffer.push("WHERE");
121            selection.to_source(buffer);
122        }
123    }
124}