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 ScalarSubquery {
76 query: Box<SelectStatement>,
77 },
78 InSubquery {
81 expr: Box<SqlExpression>,
82 subquery: Box<SelectStatement>,
83 },
84 NotInSubquery {
87 expr: Box<SqlExpression>,
88 subquery: Box<SelectStatement>,
89 },
90}
91
92#[derive(Debug, Clone)]
93pub struct WhenBranch {
94 pub condition: Box<SqlExpression>,
95 pub result: Box<SqlExpression>,
96}
97
98#[derive(Debug, Clone)]
101pub struct WhereClause {
102 pub conditions: Vec<Condition>,
103}
104
105#[derive(Debug, Clone)]
106pub struct Condition {
107 pub expr: SqlExpression,
108 pub connector: Option<LogicalOp>, }
110
111#[derive(Debug, Clone)]
112pub enum LogicalOp {
113 And,
114 Or,
115}
116
117#[derive(Debug, Clone, PartialEq)]
120pub enum SortDirection {
121 Asc,
122 Desc,
123}
124
125#[derive(Debug, Clone)]
126pub struct OrderByColumn {
127 pub column: String,
128 pub direction: SortDirection,
129}
130
131#[derive(Debug, Clone)]
134pub struct WindowSpec {
135 pub partition_by: Vec<String>,
136 pub order_by: Vec<OrderByColumn>,
137}
138
139#[derive(Debug, Clone)]
143pub enum SelectItem {
144 Column(String),
146 Expression { expr: SqlExpression, alias: String },
148 Star,
150}
151
152#[derive(Debug, Clone)]
153pub struct SelectStatement {
154 pub distinct: bool, pub columns: Vec<String>, pub select_items: Vec<SelectItem>, pub from_table: Option<String>,
158 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>,
163 pub order_by: Option<Vec<OrderByColumn>>,
164 pub group_by: Option<Vec<SqlExpression>>, pub having: Option<SqlExpression>, pub limit: Option<usize>,
167 pub offset: Option<usize>,
168 pub ctes: Vec<CTE>, }
170
171#[derive(Debug, Clone)]
175pub enum TableFunction {
176 Range {
177 start: SqlExpression,
178 end: SqlExpression,
179 step: Option<SqlExpression>,
180 },
181}
182
183#[derive(Debug, Clone)]
185pub struct CTE {
186 pub name: String,
187 pub column_list: Option<Vec<String>>, pub cte_type: CTEType,
189}
190
191#[derive(Debug, Clone)]
193pub enum CTEType {
194 Standard(SelectStatement),
195 Web(WebCTESpec),
196}
197
198#[derive(Debug, Clone)]
200pub struct WebCTESpec {
201 pub url: String,
202 pub format: Option<DataFormat>, pub headers: Vec<(String, String)>, pub cache_seconds: Option<u64>, }
206
207#[derive(Debug, Clone)]
209pub enum DataFormat {
210 CSV,
211 JSON,
212 Auto, }
214
215#[derive(Debug, Clone)]
217pub enum TableSource {
218 Table(String), DerivedTable {
220 query: Box<SelectStatement>,
222 alias: String, },
224}
225
226#[derive(Debug, Clone, PartialEq)]
228pub enum JoinType {
229 Inner,
230 Left,
231 Right,
232 Full,
233 Cross,
234}
235
236#[derive(Debug, Clone, PartialEq)]
238pub enum JoinOperator {
239 Equal,
240 NotEqual,
241 LessThan,
242 GreaterThan,
243 LessThanOrEqual,
244 GreaterThanOrEqual,
245}
246
247#[derive(Debug, Clone)]
249pub struct JoinCondition {
250 pub left_column: String, pub operator: JoinOperator, pub right_column: String, }
254
255#[derive(Debug, Clone)]
257pub struct JoinClause {
258 pub join_type: JoinType,
259 pub table: TableSource, pub alias: Option<String>, pub condition: JoinCondition, }