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    Expr {
29        expr: Expr,
30        alias: Option<String>,
31        span: Span,
32    },
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
36#[serde(tag = "variant")]
37#[allow(clippy::large_enum_variant)]
38pub enum FromItem {
39    Table {
40        name: String,
41        alias: Option<String>,
42        span: Span,
43    },
44    Join {
45        left: Box<FromItem>,
46        right: Box<FromItem>,
47        join_type: JoinType,
48        condition: Option<Expr>,
49        using: Option<Vec<String>>,
50        span: Span,
51    },
52    Derived {
53        subquery: Box<super::Statement>,
54        alias: Option<String>,
55        span: Span,
56    },
57}
58
59#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
60pub enum JoinType {
61    Inner,
62    Left,
63    Right,
64    Full,
65    Cross,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct OrderByExpr {
70    pub expr: Expr,
71    pub asc: Option<bool>,
72    pub nulls_first: Option<bool>,
73    pub span: Span,
74}
75
76#[derive(Debug, Clone, Serialize, Deserialize)]
77pub struct Insert {
78    pub table: String,
79    pub columns: Option<Vec<String>>,
80    pub values: Vec<Vec<Expr>>,
81    pub span: Span,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct Update {
86    pub table: String,
87    pub assignments: Vec<Assignment>,
88    pub selection: Option<Expr>,
89    pub span: Span,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct Assignment {
94    pub column: String,
95    pub value: Expr,
96    pub span: Span,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct Delete {
101    pub table: String,
102    pub selection: Option<Expr>,
103    pub span: Span,
104}
105
106impl Spanned for Select {
107    fn span(&self) -> Span {
108        self.span
109    }
110}
111
112impl Spanned for SelectItem {
113    fn span(&self) -> Span {
114        match self {
115            SelectItem::Wildcard { span } => *span,
116            SelectItem::Expr { span, .. } => *span,
117        }
118    }
119}
120
121impl Spanned for FromItem {
122    fn span(&self) -> Span {
123        match self {
124            FromItem::Table { span, .. }
125            | FromItem::Join { span, .. }
126            | FromItem::Derived { span, .. } => *span,
127        }
128    }
129}
130
131impl Spanned for OrderByExpr {
132    fn span(&self) -> Span {
133        self.span
134    }
135}
136
137impl Spanned for Insert {
138    fn span(&self) -> Span {
139        self.span
140    }
141}
142
143impl Spanned for Update {
144    fn span(&self) -> Span {
145        self.span
146    }
147}
148
149impl Spanned for Assignment {
150    fn span(&self) -> Span {
151        self.span
152    }
153}
154
155impl Spanned for Delete {
156    fn span(&self) -> Span {
157        self.span
158    }
159}