1#[derive(Debug, Clone)]
9pub enum SqlExpression {
10 Column(String),
11 StringLiteral(String),
12 NumberLiteral(String),
13 BooleanLiteral(bool),
14 Null, DateTimeConstructor {
16 year: i32,
17 month: u32,
18 day: u32,
19 hour: Option<u32>,
20 minute: Option<u32>,
21 second: Option<u32>,
22 },
23 DateTimeToday {
24 hour: Option<u32>,
25 minute: Option<u32>,
26 second: Option<u32>,
27 },
28 MethodCall {
29 object: String,
30 method: String,
31 args: Vec<SqlExpression>,
32 },
33 ChainedMethodCall {
34 base: Box<SqlExpression>,
35 method: String,
36 args: Vec<SqlExpression>,
37 },
38 FunctionCall {
39 name: String,
40 args: Vec<SqlExpression>,
41 distinct: bool, },
43 WindowFunction {
44 name: String,
45 args: Vec<SqlExpression>,
46 window_spec: WindowSpec,
47 },
48 BinaryOp {
49 left: Box<SqlExpression>,
50 op: String,
51 right: Box<SqlExpression>,
52 },
53 InList {
54 expr: Box<SqlExpression>,
55 values: Vec<SqlExpression>,
56 },
57 NotInList {
58 expr: Box<SqlExpression>,
59 values: Vec<SqlExpression>,
60 },
61 Between {
62 expr: Box<SqlExpression>,
63 lower: Box<SqlExpression>,
64 upper: Box<SqlExpression>,
65 },
66 Not {
67 expr: Box<SqlExpression>,
68 },
69 CaseExpression {
70 when_branches: Vec<WhenBranch>,
71 else_branch: Option<Box<SqlExpression>>,
72 },
73 SimpleCaseExpression {
74 expr: Box<SqlExpression>,
75 when_branches: Vec<SimpleWhenBranch>,
76 else_branch: Option<Box<SqlExpression>>,
77 },
78 ScalarSubquery {
81 query: Box<SelectStatement>,
82 },
83 InSubquery {
86 expr: Box<SqlExpression>,
87 subquery: Box<SelectStatement>,
88 },
89 NotInSubquery {
92 expr: Box<SqlExpression>,
93 subquery: Box<SelectStatement>,
94 },
95}
96
97#[derive(Debug, Clone)]
98pub struct WhenBranch {
99 pub condition: Box<SqlExpression>,
100 pub result: Box<SqlExpression>,
101}
102
103#[derive(Debug, Clone)]
104pub struct SimpleWhenBranch {
105 pub value: Box<SqlExpression>,
106 pub result: Box<SqlExpression>,
107}
108
109#[derive(Debug, Clone)]
112pub struct WhereClause {
113 pub conditions: Vec<Condition>,
114}
115
116#[derive(Debug, Clone)]
117pub struct Condition {
118 pub expr: SqlExpression,
119 pub connector: Option<LogicalOp>, }
121
122#[derive(Debug, Clone)]
123pub enum LogicalOp {
124 And,
125 Or,
126}
127
128#[derive(Debug, Clone, PartialEq)]
131pub enum SortDirection {
132 Asc,
133 Desc,
134}
135
136#[derive(Debug, Clone)]
137pub struct OrderByColumn {
138 pub column: String,
139 pub direction: SortDirection,
140}
141
142#[derive(Debug, Clone, PartialEq)]
146pub enum FrameBound {
147 UnboundedPreceding,
148 CurrentRow,
149 Preceding(i64),
150 Following(i64),
151 UnboundedFollowing,
152}
153
154#[derive(Debug, Clone, PartialEq)]
156pub enum FrameUnit {
157 Rows,
158 Range,
159}
160
161#[derive(Debug, Clone)]
163pub struct WindowFrame {
164 pub unit: FrameUnit,
165 pub start: FrameBound,
166 pub end: Option<FrameBound>, }
168
169#[derive(Debug, Clone)]
170pub struct WindowSpec {
171 pub partition_by: Vec<String>,
172 pub order_by: Vec<OrderByColumn>,
173 pub frame: Option<WindowFrame>, }
175
176#[derive(Debug, Clone)]
180pub enum SelectItem {
181 Column(String),
183 Expression { expr: SqlExpression, alias: String },
185 Star,
187}
188
189#[derive(Debug, Clone)]
190pub struct SelectStatement {
191 pub distinct: bool, pub columns: Vec<String>, pub select_items: Vec<SelectItem>, pub from_table: Option<String>,
195 pub from_subquery: Option<Box<SelectStatement>>, pub from_function: Option<TableFunction>, pub from_alias: Option<String>, pub joins: Vec<JoinClause>, pub where_clause: Option<WhereClause>,
200 pub order_by: Option<Vec<OrderByColumn>>,
201 pub group_by: Option<Vec<SqlExpression>>, pub having: Option<SqlExpression>, pub limit: Option<usize>,
204 pub offset: Option<usize>,
205 pub ctes: Vec<CTE>, }
207
208#[derive(Debug, Clone)]
212pub enum TableFunction {
213 Range {
214 start: SqlExpression,
215 end: SqlExpression,
216 step: Option<SqlExpression>,
217 },
218 Split {
219 text: SqlExpression,
220 delimiter: Option<SqlExpression>,
221 },
222 Generator {
223 name: String,
224 args: Vec<SqlExpression>,
225 },
226}
227
228#[derive(Debug, Clone)]
230pub struct CTE {
231 pub name: String,
232 pub column_list: Option<Vec<String>>, pub cte_type: CTEType,
234}
235
236#[derive(Debug, Clone)]
238pub enum CTEType {
239 Standard(SelectStatement),
240 Web(WebCTESpec),
241}
242
243#[derive(Debug, Clone)]
245pub struct WebCTESpec {
246 pub url: String,
247 pub format: Option<DataFormat>, pub headers: Vec<(String, String)>, pub cache_seconds: Option<u64>, }
251
252#[derive(Debug, Clone)]
254pub enum DataFormat {
255 CSV,
256 JSON,
257 Auto, }
259
260#[derive(Debug, Clone)]
262pub enum TableSource {
263 Table(String), DerivedTable {
265 query: Box<SelectStatement>,
267 alias: String, },
269}
270
271#[derive(Debug, Clone, PartialEq)]
273pub enum JoinType {
274 Inner,
275 Left,
276 Right,
277 Full,
278 Cross,
279}
280
281#[derive(Debug, Clone, PartialEq)]
283pub enum JoinOperator {
284 Equal,
285 NotEqual,
286 LessThan,
287 GreaterThan,
288 LessThanOrEqual,
289 GreaterThanOrEqual,
290}
291
292#[derive(Debug, Clone)]
294pub struct JoinCondition {
295 pub left_column: String, pub operator: JoinOperator, pub right_column: String, }
299
300#[derive(Debug, Clone)]
302pub struct JoinClause {
303 pub join_type: JoinType,
304 pub table: TableSource, pub alias: Option<String>, pub condition: JoinCondition, }