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 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}