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