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}