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