Skip to main content

alopex_sql/ast/
dml.rs

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/// The row source for an INSERT statement.
127#[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}