1mod ddl;
2mod expr;
3mod projection;
4mod query;
5
6pub use {
7 ddl::AlterTableOperationPlan,
8 expr::{
9 AggregateExprPlan, AggregateFunctionPlan, CountArgExprPlan, ExprPlan, FunctionExprPlan,
10 plan_scalar_expr,
11 },
12 projection::{ProjectionPlan, SelectItemPlan},
13 query::{
14 AggregationInputPlan, AggregationPlan, DerivedSourcePlan, DictionarySourcePlan,
15 DistinctInputPlan, DistinctPlan, FilterInputPlan, FilterPlan, HashJoinInputPlan,
16 HashJoinPlan, HavingPlan, IndexPredicatePlan, InnerJoinInputPlan, InnerJoinPlan,
17 JoinConditionInputPlan, JoinConditionPlan, LeftOuterJoinInputPlan, LeftOuterJoinPlan,
18 LimitInputPlan, LimitPlan, NestedLoopJoinInputPlan, NestedLoopJoinPlan, OffsetInputPlan,
19 OffsetPlan, OrderByExprPlan, ProjectInputPlan, ProjectPlan, QueryPlan, SelectOrderByPlan,
20 SeriesSourcePlan, SourcePlan, TableAccessPlan, TableAliasPlan, TableSourcePlan,
21 ValuesOrderByPlan, ValuesPlan,
22 },
23};
24
25use {
26 crate::ast::{self, ForeignKey, Variable},
27 serde::{Deserialize, Serialize},
28};
29
30#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
31pub enum StatementPlan {
32 ShowColumns {
33 table_name: String,
34 },
35 Query(QueryPlan),
36 Insert {
37 table_name: String,
38 columns: Vec<String>,
39 source: QueryPlan,
40 },
41 Update {
42 table_name: String,
43 assignments: Vec<AssignmentPlan>,
44 selection: Option<ExprPlan>,
45 },
46 Delete {
47 table_name: String,
48 selection: Option<ExprPlan>,
49 },
50 CreateTable {
51 if_not_exists: bool,
52 name: String,
53 columns: Option<Vec<ast::ColumnDef>>,
54 source: Option<Box<QueryPlan>>,
55 engine: Option<String>,
56 foreign_keys: Vec<ForeignKey>,
57 comment: Option<String>,
58 },
59 CreateFunction {
60 or_replace: bool,
61 name: String,
62 args: Vec<ast::OperateFunctionArg>,
63 return_: ast::Expr,
64 },
65 AlterTable {
66 name: String,
67 operation: AlterTableOperationPlan,
68 },
69 DropTable {
70 if_exists: bool,
71 names: Vec<String>,
72 cascade: bool,
73 },
74 DropFunction {
75 if_exists: bool,
76 names: Vec<String>,
77 },
78 CreateIndex {
79 name: String,
80 table_name: String,
81 column: ast::OrderByExpr,
82 },
83 DropIndex {
84 name: String,
85 table_name: String,
86 },
87 StartTransaction,
88 Commit,
89 Rollback,
90 ShowVariable(Variable),
91 ShowIndexes(String),
92}
93
94#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
95pub struct AssignmentPlan {
96 pub id: String,
97 pub value: ExprPlan,
98}
99
100impl From<ast::Statement> for StatementPlan {
101 fn from(statement: ast::Statement) -> Self {
102 match statement {
103 ast::Statement::ShowColumns { table_name } => Self::ShowColumns { table_name },
104 ast::Statement::Query(query) => Self::Query(query.into()),
105 ast::Statement::Insert {
106 table_name,
107 columns,
108 source,
109 } => Self::Insert {
110 table_name,
111 columns,
112 source: source.into(),
113 },
114 ast::Statement::Update {
115 table_name,
116 assignments,
117 selection,
118 } => Self::Update {
119 table_name,
120 assignments: assignments.into_iter().map(Into::into).collect(),
121 selection: selection.map(Into::into),
122 },
123 ast::Statement::Delete {
124 table_name,
125 selection,
126 } => Self::Delete {
127 table_name,
128 selection: selection.map(Into::into),
129 },
130 ast::Statement::CreateTable {
131 if_not_exists,
132 name,
133 columns,
134 source,
135 engine,
136 foreign_keys,
137 comment,
138 } => Self::CreateTable {
139 if_not_exists,
140 name,
141 columns,
142 source: source.map(|query| Box::new((*query).into())),
143 engine,
144 foreign_keys,
145 comment,
146 },
147 ast::Statement::CreateFunction {
148 or_replace,
149 name,
150 args,
151 return_,
152 } => Self::CreateFunction {
153 or_replace,
154 name,
155 args,
156 return_,
157 },
158 ast::Statement::AlterTable { name, operation } => Self::AlterTable {
159 name,
160 operation: operation.into(),
161 },
162 ast::Statement::DropTable {
163 if_exists,
164 names,
165 cascade,
166 } => Self::DropTable {
167 if_exists,
168 names,
169 cascade,
170 },
171 ast::Statement::DropFunction { if_exists, names } => {
172 Self::DropFunction { if_exists, names }
173 }
174 ast::Statement::CreateIndex {
175 name,
176 table_name,
177 column,
178 } => Self::CreateIndex {
179 name,
180 table_name,
181 column,
182 },
183 ast::Statement::DropIndex { name, table_name } => Self::DropIndex { name, table_name },
184 ast::Statement::StartTransaction => Self::StartTransaction,
185 ast::Statement::Commit => Self::Commit,
186 ast::Statement::Rollback => Self::Rollback,
187 ast::Statement::ShowVariable(variable) => Self::ShowVariable(variable),
188 ast::Statement::ShowIndexes(table_name) => Self::ShowIndexes(table_name),
189 }
190 }
191}
192
193impl From<ast::Assignment> for AssignmentPlan {
194 fn from(assignment: ast::Assignment) -> Self {
195 let ast::Assignment { id, value } = assignment;
196
197 Self {
198 id,
199 value: value.into(),
200 }
201 }
202}