oak_sql/ast/statements/
dml_nodes.rs1use crate::ast::expr::{Expression, Identifier, TableName};
2use core::range::Range;
3use oak_core::source::{SourceBuffer, ToSource};
4
5#[derive(Debug, Clone)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct InsertStatement {
9 pub table_name: TableName,
11 pub columns: Vec<Identifier>,
13 pub values: Vec<Expression>,
15 #[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#[derive(Debug, Clone)]
49#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
50pub struct UpdateStatement {
51 pub table_name: TableName,
53 pub assignments: Vec<Assignment>,
55 pub selection: Option<Expression>, #[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#[derive(Debug, Clone)]
82#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
83pub struct Assignment {
84 pub column: Identifier,
86 pub value: Expression,
88 #[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#[derive(Debug, Clone)]
103#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
104pub struct DeleteStatement {
105 pub table_name: TableName,
107 pub selection: Option<Expression>, #[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}