Skip to content

Commit 6cfb28f

Browse files
authored
feat: lmpl DropView (#245)
* feat: lmpl `DropView` * chore: codefmt
1 parent 720710c commit 6cfb28f

File tree

14 files changed

+168
-35
lines changed

14 files changed

+168
-35
lines changed

src/binder/drop_view.rs

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use crate::binder::{lower_case_name, Binder};
2+
use crate::errors::DatabaseError;
3+
use crate::planner::operator::drop_view::DropViewOperator;
4+
use crate::planner::operator::Operator;
5+
use crate::planner::LogicalPlan;
6+
use crate::storage::Transaction;
7+
use sqlparser::ast::ObjectName;
8+
use std::sync::Arc;
9+
10+
impl<T: Transaction> Binder<'_, '_, T> {
11+
pub(crate) fn bind_drop_view(
12+
&mut self,
13+
name: &ObjectName,
14+
if_exists: &bool,
15+
) -> Result<LogicalPlan, DatabaseError> {
16+
let view_name = Arc::new(lower_case_name(name)?);
17+
18+
Ok(LogicalPlan::new(
19+
Operator::DropView(DropViewOperator {
20+
view_name,
21+
if_exists: *if_exists,
22+
}),
23+
vec![],
24+
))
25+
}
26+
}

src/binder/mod.rs

+12-20
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ mod delete;
99
mod describe;
1010
mod distinct;
1111
mod drop_table;
12+
mod drop_view;
1213
mod explain;
1314
pub mod expr;
1415
mod insert;
@@ -226,17 +227,11 @@ impl<'a, T: Transaction> BinderContext<'a, T> {
226227

227228
pub fn view(&self, view_name: TableName) -> Result<Option<&View>, DatabaseError> {
228229
if let Some(real_name) = self.table_aliases.get(view_name.as_ref()) {
229-
self.transaction.view(
230-
self.view_cache,
231-
real_name.clone(),
232-
(self.transaction, self.table_cache),
233-
)
230+
self.transaction
231+
.view(self.table_cache, self.view_cache, real_name.clone())
234232
} else {
235-
self.transaction.view(
236-
self.view_cache,
237-
view_name.clone(),
238-
(self.transaction, self.table_cache),
239-
)
233+
self.transaction
234+
.view(self.table_cache, self.view_cache, view_name.clone())
240235
}
241236
}
242237

@@ -259,17 +254,11 @@ impl<'a, T: Transaction> BinderContext<'a, T> {
259254

260255
if source.is_none() && !only_table {
261256
source = if let Some(real_name) = self.table_aliases.get(table_name.as_ref()) {
262-
self.transaction.view(
263-
self.view_cache,
264-
real_name.clone(),
265-
(self.transaction, self.table_cache),
266-
)
257+
self.transaction
258+
.view(self.table_cache, self.view_cache, real_name.clone())
267259
} else {
268-
self.transaction.view(
269-
self.view_cache,
270-
table_name.clone(),
271-
(self.transaction, self.table_cache),
272-
)
260+
self.transaction
261+
.view(self.table_cache, self.view_cache, table_name.clone())
273262
}?
274263
.map(Source::View);
275264
}
@@ -361,7 +350,10 @@ impl<'a, 'b, T: Transaction> Binder<'a, 'b, T> {
361350
if_exists,
362351
..
363352
} => match object_type {
353+
// todo handle all names
364354
ObjectType::Table => self.bind_drop_table(&names[0], if_exists)?,
355+
// todo handle all names
356+
ObjectType::View => self.bind_drop_view(&names[0], if_exists)?,
365357
_ => todo!(),
366358
},
367359
Statement::Insert {

src/errors.rs

+2
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,6 @@ pub enum DatabaseError {
163163
ValuesLenMismatch(usize, usize),
164164
#[error("the view already exists")]
165165
ViewExists,
166+
#[error("the view not found")]
167+
ViewNotFound,
166168
}

src/execution/ddl/drop_view.rs

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use crate::execution::{Executor, WriteExecutor};
2+
use crate::planner::operator::drop_view::DropViewOperator;
3+
use crate::storage::{StatisticsMetaCache, TableCache, Transaction, ViewCache};
4+
use crate::throw;
5+
use crate::types::tuple_builder::TupleBuilder;
6+
7+
pub struct DropView {
8+
op: DropViewOperator,
9+
}
10+
11+
impl From<DropViewOperator> for DropView {
12+
fn from(op: DropViewOperator) -> Self {
13+
DropView { op }
14+
}
15+
}
16+
17+
impl<'a, T: Transaction + 'a> WriteExecutor<'a, T> for DropView {
18+
fn execute_mut(
19+
self,
20+
(table_cache, view_cache, _): (&'a TableCache, &'a ViewCache, &'a StatisticsMetaCache),
21+
transaction: &'a mut T,
22+
) -> Executor<'a> {
23+
Box::new(
24+
#[coroutine]
25+
move || {
26+
let DropViewOperator {
27+
view_name,
28+
if_exists,
29+
} = self.op;
30+
31+
throw!(transaction.drop_view(
32+
view_cache,
33+
table_cache,
34+
view_name.clone(),
35+
if_exists
36+
));
37+
38+
yield Ok(TupleBuilder::build_result(format!("{}", view_name)));
39+
},
40+
)
41+
}
42+
}

src/execution/ddl/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ pub mod add_column;
22
pub(crate) mod create_index;
33
pub(crate) mod create_table;
44
pub(crate) mod create_view;
5-
pub mod drop_column;
5+
pub(crate) mod drop_column;
66
pub(crate) mod drop_table;
7+
pub(crate) mod drop_view;
78
pub(crate) mod truncate;

src/execution/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use crate::execution::ddl::create_table::CreateTable;
1111
use crate::execution::ddl::create_view::CreateView;
1212
use crate::execution::ddl::drop_column::DropColumn;
1313
use crate::execution::ddl::drop_table::DropTable;
14+
use crate::execution::ddl::drop_view::DropView;
1415
use crate::execution::ddl::truncate::Truncate;
1516
use crate::execution::dml::analyze::Analyze;
1617
use crate::execution::dml::copy_from_file::CopyFromFile;
@@ -192,6 +193,7 @@ pub fn build_write<'a, T: Transaction + 'a>(
192193
}
193194
Operator::CreateView(op) => CreateView::from(op).execute_mut(cache, transaction),
194195
Operator::DropTable(op) => DropTable::from(op).execute_mut(cache, transaction),
196+
Operator::DropView(op) => DropView::from(op).execute_mut(cache, transaction),
195197
Operator::Truncate(op) => Truncate::from(op).execute_mut(cache, transaction),
196198
Operator::CopyFromFile(op) => CopyFromFile::from(op).execute_mut(cache, transaction),
197199
#[warn(unused_assignments)]

src/optimizer/rule/normalization/column_pruning.rs

+1
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ impl ColumnPruning {
147147
| Operator::CreateIndex(_)
148148
| Operator::CreateView(_)
149149
| Operator::DropTable(_)
150+
| Operator::DropView(_)
150151
| Operator::Truncate(_)
151152
| Operator::Show
152153
| Operator::CopyFromFile(_)

src/optimizer/rule/normalization/compilation_in_advance.rs

+2
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ impl ExpressionRemapper {
102102
| Operator::CreateIndex(_)
103103
| Operator::CreateView(_)
104104
| Operator::DropTable(_)
105+
| Operator::DropView(_)
105106
| Operator::Truncate(_)
106107
| Operator::CopyFromFile(_)
107108
| Operator::CopyToFile(_)
@@ -208,6 +209,7 @@ impl EvaluatorBind {
208209
| Operator::CreateIndex(_)
209210
| Operator::CreateView(_)
210211
| Operator::DropTable(_)
212+
| Operator::DropView(_)
211213
| Operator::Truncate(_)
212214
| Operator::CopyFromFile(_)
213215
| Operator::CopyToFile(_)

src/planner/mod.rs

+3
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ impl LogicalPlan {
156156
Operator::DropTable(_) => SchemaOutput::Schema(vec![ColumnRef::from(
157157
ColumnCatalog::new_dummy("DROP TABLE SUCCESS".to_string()),
158158
)]),
159+
Operator::DropView(_) => SchemaOutput::Schema(vec![ColumnRef::from(
160+
ColumnCatalog::new_dummy("DROP VIEW SUCCESS".to_string()),
161+
)]),
159162
Operator::Truncate(_) => SchemaOutput::Schema(vec![ColumnRef::from(
160163
ColumnCatalog::new_dummy("TRUNCATE TABLE SUCCESS".to_string()),
161164
)]),

src/planner/operator/drop_view.rs

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use crate::catalog::TableName;
2+
use fnck_sql_serde_macros::ReferenceSerialization;
3+
use std::fmt;
4+
use std::fmt::Formatter;
5+
6+
#[derive(Debug, PartialEq, Eq, Clone, Hash, ReferenceSerialization)]
7+
pub struct DropViewOperator {
8+
/// Table name to insert to
9+
pub view_name: TableName,
10+
pub if_exists: bool,
11+
}
12+
13+
impl fmt::Display for DropViewOperator {
14+
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
15+
write!(
16+
f,
17+
"Drop View {}, If Exists: {}",
18+
self.view_name, self.if_exists
19+
)?;
20+
21+
Ok(())
22+
}
23+
}

src/planner/operator/mod.rs

+6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ pub mod create_view;
99
pub mod delete;
1010
pub mod describe;
1111
pub mod drop_table;
12+
pub mod drop_view;
1213
pub mod filter;
1314
pub mod function_scan;
1415
pub mod insert;
@@ -39,6 +40,7 @@ use crate::planner::operator::create_view::CreateViewOperator;
3940
use crate::planner::operator::delete::DeleteOperator;
4041
use crate::planner::operator::describe::DescribeOperator;
4142
use crate::planner::operator::drop_table::DropTableOperator;
43+
use crate::planner::operator::drop_view::DropViewOperator;
4244
use crate::planner::operator::function_scan::FunctionScanOperator;
4345
use crate::planner::operator::insert::InsertOperator;
4446
use crate::planner::operator::join::JoinCondition;
@@ -81,6 +83,7 @@ pub enum Operator {
8183
CreateIndex(CreateIndexOperator),
8284
CreateView(CreateViewOperator),
8385
DropTable(DropTableOperator),
86+
DropView(DropViewOperator),
8487
Truncate(TruncateOperator),
8588
// Copy
8689
CopyFromFile(CopyFromFileOperator),
@@ -169,6 +172,7 @@ impl Operator {
169172
| Operator::CreateIndex(_)
170173
| Operator::CreateView(_)
171174
| Operator::DropTable(_)
175+
| Operator::DropView(_)
172176
| Operator::Truncate(_)
173177
| Operator::CopyFromFile(_)
174178
| Operator::CopyToFile(_) => None,
@@ -246,6 +250,7 @@ impl Operator {
246250
| Operator::CreateIndex(_)
247251
| Operator::CreateView(_)
248252
| Operator::DropTable(_)
253+
| Operator::DropView(_)
249254
| Operator::Truncate(_)
250255
| Operator::CopyFromFile(_)
251256
| Operator::CopyToFile(_) => vec![],
@@ -279,6 +284,7 @@ impl fmt::Display for Operator {
279284
Operator::CreateIndex(op) => write!(f, "{}", op),
280285
Operator::CreateView(op) => write!(f, "{}", op),
281286
Operator::DropTable(op) => write!(f, "{}", op),
287+
Operator::DropView(op) => write!(f, "{}", op),
282288
Operator::Truncate(op) => write!(f, "{}", op),
283289
Operator::CopyFromFile(op) => write!(f, "{}", op),
284290
Operator::CopyToFile(_) => todo!(),

src/storage/mod.rs

+43-8
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,30 @@ pub trait Transaction: Sized {
345345
Ok(table_name)
346346
}
347347

348+
fn drop_view(
349+
&mut self,
350+
view_cache: &ViewCache,
351+
table_cache: &TableCache,
352+
view_name: TableName,
353+
if_exists: bool,
354+
) -> Result<(), DatabaseError> {
355+
if self
356+
.view(table_cache, view_cache, view_name.clone())?
357+
.is_none()
358+
{
359+
if if_exists {
360+
return Ok(());
361+
} else {
362+
return Err(DatabaseError::ViewNotFound);
363+
}
364+
}
365+
366+
self.remove(&TableCodec::encode_view_key(view_name.as_str()))?;
367+
view_cache.remove(&view_name);
368+
369+
Ok(())
370+
}
371+
348372
fn drop_table(
349373
&mut self,
350374
table_cache: &TableCache,
@@ -387,9 +411,9 @@ pub trait Transaction: Sized {
387411

388412
fn view<'a>(
389413
&'a self,
414+
table_cache: &'a TableCache,
390415
view_cache: &'a ViewCache,
391416
view_name: TableName,
392-
drive: (&Self, &TableCache),
393417
) -> Result<Option<&'a View>, DatabaseError> {
394418
if let Some(view) = view_cache.get(&view_name) {
395419
return Ok(Some(view));
@@ -398,7 +422,7 @@ pub trait Transaction: Sized {
398422
return Ok(None);
399423
};
400424
Ok(Some(view_cache.get_or_insert(view_name.clone(), |_| {
401-
TableCodec::decode_view(&bytes, drive)
425+
TableCodec::decode_view(&bytes, (self, table_cache))
402426
})?))
403427
}
404428

@@ -1623,27 +1647,38 @@ mod test {
16231647
&view,
16241648
transaction
16251649
.view(
1650+
&table_state.table_cache,
16261651
&table_state.view_cache,
16271652
view_name.clone(),
1628-
(&transaction, &table_state.table_cache)
16291653
)?
16301654
.unwrap()
16311655
);
16321656
assert_eq!(
16331657
&view,
16341658
transaction
16351659
.view(
1660+
&Arc::new(SharedLruCache::new(4, 1, RandomState::new())?),
16361661
&table_state.view_cache,
16371662
view_name.clone(),
1638-
(
1639-
&transaction,
1640-
&Arc::new(SharedLruCache::new(4, 1, RandomState::new())?)
1641-
)
16421663
)?
16431664
.unwrap()
16441665
);
16451666

1646-
// TODO: Drop View
1667+
transaction.drop_view(
1668+
&table_state.view_cache,
1669+
&table_state.table_cache,
1670+
view_name.clone(),
1671+
false,
1672+
)?;
1673+
transaction.drop_view(
1674+
&table_state.view_cache,
1675+
&table_state.table_cache,
1676+
view_name.clone(),
1677+
true,
1678+
)?;
1679+
assert!(transaction
1680+
.view(&table_state.table_cache, &table_state.view_cache, view_name)?
1681+
.is_none());
16471682

16481683
Ok(())
16491684
}

tests/slt/crdb/delete.slt

+2-3
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@ SELECT * FROM kv
2424
5 6
2525
7 8
2626

27-
# TODO: Drop View
28-
# statement ok
29-
# drop view if exists kview
27+
statement ok
28+
drop view if exists kview
3029

3130
statement ok
3231
CREATE VIEW kview AS SELECT k,v FROM kv

tests/slt/sql_2016/F031_16.slt

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
# F031-16: DROP VIEW statement: RESTRICT clause
22

3-
# TODO: Support `DROP VIEW`
4-
53
statement ok
64
CREATE TABLE TABLE_F031_16_01_01 ( ID INT PRIMARY KEY, A INTEGER );
75

86
statement ok
97
CREATE VIEW VIEW_F031_16_01_01 AS SELECT A FROM TABLE_F031_16_01_01;
108

11-
# DROP VIEW VIEW_F031_16_01_01
9+
statement ok
10+
DROP VIEW VIEW_F031_16_01_01

0 commit comments

Comments
 (0)