Skip to main content

alopex_sql/ast/
dml.rs

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}