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 pub query: Box<super::Statement>,
51 pub span: Span,
52}
53
54pub const LITERAL_TABLE: &str = "__literal__";
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
57#[serde(tag = "variant")]
58pub enum SelectItem {
59 Wildcard {
60 span: Span,
61 },
62 QualifiedWildcard {
63 table: String,
64 span: Span,
65 },
66 Expr {
67 expr: Expr,
68 alias: Option<String>,
69 span: Span,
70 },
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
74#[serde(tag = "variant")]
75#[allow(clippy::large_enum_variant)]
76pub enum FromItem {
77 Table {
78 name: String,
79 alias: Option<String>,
80 span: Span,
81 },
82 Join {
83 left: Box<FromItem>,
84 right: Box<FromItem>,
85 join_type: JoinType,
86 condition: Option<Expr>,
87 using: Option<Vec<String>>,
88 #[serde(default)]
89 natural: bool,
90 span: Span,
91 },
92 Derived {
93 subquery: Box<super::Statement>,
94 alias: Option<String>,
95 span: Span,
96 },
97}
98
99#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
100pub enum JoinType {
101 Inner,
102 Left,
103 Right,
104 Full,
105 Cross,
106}
107
108#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct OrderByExpr {
110 pub expr: Expr,
111 pub asc: Option<bool>,
112 pub nulls_first: Option<bool>,
113 pub span: Span,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct Insert {
118 pub table: String,
119 pub columns: Option<Vec<String>>,
120 pub source: InsertSource,
121 pub span: Span,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize)]
126#[serde(tag = "variant")]
127pub enum InsertSource {
128 Values { values: Vec<Vec<Expr>> },
129 Select { select: Box<Select> },
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct Update {
134 pub table: String,
135 pub assignments: Vec<Assignment>,
136 pub selection: Option<Expr>,
137 pub span: Span,
138}
139
140#[derive(Debug, Clone, Serialize, Deserialize)]
141pub struct Assignment {
142 pub column: String,
143 pub value: Expr,
144 pub span: Span,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct Delete {
149 pub table: String,
150 pub selection: Option<Expr>,
151 pub span: Span,
152}
153
154impl Spanned for Select {
155 fn span(&self) -> Span {
156 self.span
157 }
158}
159
160impl Spanned for SetOperation {
161 fn span(&self) -> Span {
162 self.span
163 }
164}
165
166impl Spanned for SelectItem {
167 fn span(&self) -> Span {
168 match self {
169 SelectItem::Wildcard { span } | SelectItem::QualifiedWildcard { span, .. } => *span,
170 SelectItem::Expr { span, .. } => *span,
171 }
172 }
173}
174
175impl Spanned for FromItem {
176 fn span(&self) -> Span {
177 match self {
178 FromItem::Table { span, .. }
179 | FromItem::Join { span, .. }
180 | FromItem::Derived { span, .. } => *span,
181 }
182 }
183}
184
185impl Spanned for OrderByExpr {
186 fn span(&self) -> Span {
187 self.span
188 }
189}
190
191impl Spanned for Insert {
192 fn span(&self) -> Span {
193 self.span
194 }
195}
196
197impl Spanned for Update {
198 fn span(&self) -> Span {
199 self.span
200 }
201}
202
203impl Spanned for Assignment {
204 fn span(&self) -> Span {
205 self.span
206 }
207}
208
209impl Spanned for Delete {
210 fn span(&self) -> Span {
211 self.span
212 }
213}