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