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}