1use super::expr::Expr;
2use super::span::{Span, Spanned};
3
4#[derive(Debug, Clone)]
5pub struct Select {
6 pub distinct: bool,
7 pub projection: Vec<SelectItem>,
8 pub from: TableRef,
9 pub selection: Option<Expr>,
10 pub group_by: Option<Vec<Expr>>,
11 pub having: Option<Expr>,
12 pub order_by: Vec<OrderByExpr>,
13 pub limit: Option<Expr>,
14 pub offset: Option<Expr>,
15 pub span: Span,
16}
17
18pub const LITERAL_TABLE: &str = "__literal__";
19
20#[derive(Debug, Clone)]
21pub enum SelectItem {
22 Wildcard {
23 span: Span,
24 },
25 Expr {
26 expr: Expr,
27 alias: Option<String>,
28 span: Span,
29 },
30}
31
32#[derive(Debug, Clone)]
33pub struct TableRef {
34 pub name: String,
35 pub alias: Option<String>,
36 pub span: Span,
37}
38
39#[derive(Debug, Clone)]
40pub struct OrderByExpr {
41 pub expr: Expr,
42 pub asc: Option<bool>,
43 pub nulls_first: Option<bool>,
44 pub span: Span,
45}
46
47#[derive(Debug, Clone)]
48pub struct Insert {
49 pub table: String,
50 pub columns: Option<Vec<String>>,
51 pub values: Vec<Vec<Expr>>,
52 pub span: Span,
53}
54
55#[derive(Debug, Clone)]
56pub struct Update {
57 pub table: String,
58 pub assignments: Vec<Assignment>,
59 pub selection: Option<Expr>,
60 pub span: Span,
61}
62
63#[derive(Debug, Clone)]
64pub struct Assignment {
65 pub column: String,
66 pub value: Expr,
67 pub span: Span,
68}
69
70#[derive(Debug, Clone)]
71pub struct Delete {
72 pub table: String,
73 pub selection: Option<Expr>,
74 pub span: Span,
75}
76
77impl Spanned for Select {
78 fn span(&self) -> Span {
79 self.span
80 }
81}
82
83impl Spanned for SelectItem {
84 fn span(&self) -> Span {
85 match self {
86 SelectItem::Wildcard { span } => *span,
87 SelectItem::Expr { span, .. } => *span,
88 }
89 }
90}
91
92impl Spanned for TableRef {
93 fn span(&self) -> Span {
94 self.span
95 }
96}
97
98impl Spanned for OrderByExpr {
99 fn span(&self) -> Span {
100 self.span
101 }
102}
103
104impl Spanned for Insert {
105 fn span(&self) -> Span {
106 self.span
107 }
108}
109
110impl Spanned for Update {
111 fn span(&self) -> Span {
112 self.span
113 }
114}
115
116impl Spanned for Assignment {
117 fn span(&self) -> Span {
118 self.span
119 }
120}
121
122impl Spanned for Delete {
123 fn span(&self) -> Span {
124 self.span
125 }
126}