1use super::expr::Expr;
2use super::span::{Span, Spanned};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct Select {
7 #[serde(default)]
8 pub with: Option<WithClause>,
9 pub distinct: bool,
10 pub projection: Vec<SelectItem>,
11 pub from: Vec<FromItem>,
12 pub selection: Option<Expr>,
13 pub group_by: Option<Vec<Expr>>,
14 pub having: Option<Expr>,
15 #[serde(default)]
16 pub set_operations: Vec<SetOperation>,
17 pub order_by: Vec<OrderByExpr>,
18 pub limit: Option<Expr>,
19 pub offset: Option<Expr>,
20 #[serde(default)]
21 pub span: Span,
22}
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
25pub enum SetOperator {
26 Union,
27 Intersect,
28 Except,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct SetOperation {
33 pub operator: SetOperator,
34 pub all: bool,
35 pub right: Box<Select>,
36 #[serde(default)]
37 pub span: Span,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct WithClause {
42 pub recursive: bool,
43 pub ctes: Vec<CommonTableExpr>,
44 pub span: Span,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct CommonTableExpr {
49 pub name: String,
50 #[serde(default)]
51 pub columns: Vec<String>,
52 pub query: Box<super::Statement>,
53 pub span: Span,
54}
55
56pub const LITERAL_TABLE: &str = "__literal__";
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
59#[serde(tag = "variant")]
60pub enum SelectItem {
61 Wildcard {
62 span: Span,
63 },
64 QualifiedWildcard {
65 table: String,
66 span: Span,
67 },
68 Expr {
69 expr: Expr,
70 alias: Option<String>,
71 span: Span,
72 },
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76#[serde(tag = "variant")]
77#[allow(clippy::large_enum_variant)]
78pub enum FromItem {
79 Table {
80 name: String,
81 alias: Option<String>,
82 span: Span,
83 },
84 Join {
85 left: Box<FromItem>,
86 right: Box<FromItem>,
87 join_type: JoinType,
88 condition: Option<Expr>,
89 using: Option<Vec<String>>,
90 #[serde(default)]
91 natural: bool,
92 span: Span,
93 },
94 Derived {
95 subquery: Box<super::Statement>,
96 alias: Option<String>,
97 span: Span,
98 },
99}
100
101#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
102pub enum JoinType {
103 Inner,
104 Left,
105 Right,
106 Full,
107 Cross,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct OrderByExpr {
112 pub expr: Expr,
113 pub asc: Option<bool>,
114 pub nulls_first: Option<bool>,
115 pub span: Span,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct Insert {
120 pub table: String,
121 pub columns: Option<Vec<String>>,
122 pub source: InsertSource,
123 pub span: Span,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
128#[serde(tag = "variant")]
129pub enum InsertSource {
130 Values { values: Vec<Vec<Expr>> },
131 Select { select: Box<Select> },
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize)]
135pub struct Update {
136 pub table: String,
137 pub assignments: Vec<Assignment>,
138 pub selection: Option<Expr>,
139 pub span: Span,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize)]
143pub struct Assignment {
144 pub column: String,
145 pub value: Expr,
146 pub span: Span,
147}
148
149#[derive(Debug, Clone, Serialize, Deserialize)]
150pub struct Delete {
151 pub table: String,
152 pub selection: Option<Expr>,
153 pub span: Span,
154}
155
156impl Spanned for Select {
157 fn span(&self) -> Span {
158 self.span
159 }
160}
161
162impl Spanned for SetOperation {
163 fn span(&self) -> Span {
164 self.span
165 }
166}
167
168impl Spanned for SelectItem {
169 fn span(&self) -> Span {
170 match self {
171 SelectItem::Wildcard { span } | SelectItem::QualifiedWildcard { span, .. } => *span,
172 SelectItem::Expr { span, .. } => *span,
173 }
174 }
175}
176
177impl Spanned for FromItem {
178 fn span(&self) -> Span {
179 match self {
180 FromItem::Table { span, .. }
181 | FromItem::Join { span, .. }
182 | FromItem::Derived { span, .. } => *span,
183 }
184 }
185}
186
187impl Spanned for OrderByExpr {
188 fn span(&self) -> Span {
189 self.span
190 }
191}
192
193impl Spanned for Insert {
194 fn span(&self) -> Span {
195 self.span
196 }
197}
198
199impl Spanned for Update {
200 fn span(&self) -> Span {
201 self.span
202 }
203}
204
205impl Spanned for Assignment {
206 fn span(&self) -> Span {
207 self.span
208 }
209}
210
211impl Spanned for Delete {
212 fn span(&self) -> Span {
213 self.span
214 }
215}