1mod ast_literal;
2mod data_type;
3mod ddl;
4mod expr;
5mod function;
6mod operator;
7mod query;
8
9pub use {
10 ast_literal::{AstLiteral, DateTimeField, TrimWhereField},
11 data_type::DataType,
12 ddl::*,
13 expr::Expr,
14 function::{Aggregate, AggregateFunction, CountArgExpr, Function},
15 operator::*,
16 query::*,
17};
18
19use {
20 serde::{Deserialize, Serialize},
21 strum_macros::Display,
22};
23
24pub trait ToSql {
25 fn to_sql(&self) -> String;
26}
27
28pub trait ToSqlUnquoted {
29 fn to_sql_unquoted(&self) -> String;
30}
31
32#[derive(PartialEq, Debug, Clone, Eq, Hash, Serialize, Deserialize)]
33pub struct ForeignKey {
34 pub name: String,
35 pub referencing_column_name: String,
36 pub referenced_table_name: String,
37 pub referenced_column_name: String,
38 pub on_delete: ReferentialAction,
39 pub on_update: ReferentialAction,
40}
41
42#[derive(PartialEq, Debug, Clone, Eq, Hash, Serialize, Deserialize, Display)]
43pub enum ReferentialAction {
44 #[strum(to_string = "NO ACTION")]
45 NoAction,
46}
47
48#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
49pub enum Statement {
50 ShowColumns {
51 table_name: String,
52 },
53 Query(Query),
55 Insert {
57 table_name: String,
59 columns: Vec<String>,
61 source: Query,
63 },
64 Update {
66 table_name: String,
68 assignments: Vec<Assignment>,
70 selection: Option<Expr>,
72 },
73 Delete {
75 table_name: String,
77 selection: Option<Expr>,
79 },
80 CreateTable {
82 if_not_exists: bool,
83 name: String,
85 columns: Option<Vec<ColumnDef>>,
87 source: Option<Box<Query>>,
88 engine: Option<String>,
89 foreign_keys: Vec<ForeignKey>,
90 comment: Option<String>,
91 },
92 CreateFunction {
94 or_replace: bool,
95 name: String,
96 args: Vec<OperateFunctionArg>,
98 return_: Expr,
99 },
100 AlterTable {
102 name: String,
104 operation: AlterTableOperation,
105 },
106 DropTable {
108 if_exists: bool,
110 names: Vec<String>,
112 cascade: bool,
114 },
115 DropFunction {
117 if_exists: bool,
119 names: Vec<String>,
121 },
122 CreateIndex {
124 name: String,
125 table_name: String,
126 column: OrderByExpr,
127 },
128 DropIndex {
130 name: String,
131 table_name: String,
132 },
133 StartTransaction,
135 Commit,
137 Rollback,
139 ShowVariable(Variable),
141 ShowIndexes(String),
142}
143
144#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
145pub struct Assignment {
146 pub id: String,
147 pub value: Expr,
148}
149
150#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
151pub enum Variable {
152 Tables,
153 Functions,
154 Version,
155}
156
157impl ToSql for ForeignKey {
158 fn to_sql(&self) -> String {
159 let ForeignKey {
160 referencing_column_name,
161 referenced_table_name,
162 referenced_column_name,
163 name,
164 on_delete,
165 on_update,
166 } = self;
167
168 format!(
169 r#"CONSTRAINT "{name}" FOREIGN KEY ("{referencing_column_name}") REFERENCES "{referenced_table_name}" ("{referenced_column_name}") ON DELETE {on_delete} ON UPDATE {on_update}"#
170 )
171 }
172}
173
174#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
175pub struct Array {
176 pub elem: Vec<Expr>,
177 pub named: bool,
178}