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