1- use crate :: binder:: { lower_case_name, Binder } ;
1+ use crate :: binder:: { lower_case_name, Binder , Source } ;
22use crate :: errors:: DatabaseError ;
33use crate :: planner:: operator:: delete:: DeleteOperator ;
44use crate :: planner:: operator:: table_scan:: TableScanOperator ;
@@ -8,7 +8,7 @@ use crate::storage::Transaction;
88use sqlparser:: ast:: { Expr , TableAlias , TableFactor , TableWithJoins } ;
99use std:: sync:: Arc ;
1010
11- impl < ' a , ' b , T : Transaction > Binder < ' a , ' b , T > {
11+ impl < T : Transaction > Binder < ' _ , ' _ , T > {
1212 pub ( crate ) fn bind_delete (
1313 & mut self ,
1414 from : & TableWithJoins ,
@@ -23,15 +23,20 @@ impl<'a, 'b, T: Transaction> Binder<'a, 'b, T> {
2323 table_alias = Some ( Arc :: new ( name. value . to_lowercase ( ) ) ) ;
2424 alias_idents = Some ( columns) ;
2525 }
26- let table_catalog =
27- self . context
28- . table_and_bind ( table_name. clone ( ) , table_alias. clone ( ) , None ) ?;
29- let primary_key_column = table_catalog
30- . columns ( )
26+ let source = self
27+ . context
28+ . source_and_bind ( table_name. clone ( ) , table_alias. as_ref ( ) , None , false ) ?
29+ . ok_or ( DatabaseError :: SourceNotFound ) ?;
30+ let schema_buf = self . table_schema_buf . entry ( table_name. clone ( ) ) . or_default ( ) ;
31+ let primary_key_column = source
32+ . columns ( schema_buf)
3133 . find ( |column| column. desc ( ) . is_primary )
3234 . cloned ( )
3335 . unwrap ( ) ;
34- let mut plan = TableScanOperator :: build ( table_name. clone ( ) , table_catalog) ;
36+ let mut plan = match source {
37+ Source :: Table ( table) => TableScanOperator :: build ( table_name. clone ( ) , table) ,
38+ Source :: View ( view) => LogicalPlan :: clone ( & view. plan ) ,
39+ } ;
3540
3641 if let Some ( alias_idents) = alias_idents {
3742 plan =
0 commit comments