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