diff --git a/core/translate/delete.rs b/core/translate/delete.rs index 135c9d76d..38256d4c1 100644 --- a/core/translate/delete.rs +++ b/core/translate/delete.rs @@ -1,6 +1,7 @@ use crate::translate::emitter::emit_program; use crate::translate::optimizer::optimize_plan; -use crate::translate::planner::prepare_delete_plan; +use crate::translate::plan::{BTreeTableReference, DeletePlan, Plan, SourceOperator}; +use crate::translate::planner::{parse_limit, parse_where}; use crate::{schema::Schema, storage::sqlite3_ondisk::DatabaseHeader, vdbe::Program}; use crate::{Connection, Result}; use sqlite3_parser::ast::{Expr, Limit, QualifiedName}; @@ -19,3 +20,46 @@ pub fn translate_delete( let optimized_plan = optimize_plan(delete_plan)?; emit_program(database_header, optimized_plan, connection) } + +pub fn prepare_delete_plan( + schema: &Schema, + tbl_name: &QualifiedName, + where_clause: Option, + limit: Option, +) -> Result { + let table = match schema.get_table(tbl_name.name.0.as_str()) { + Some(table) => table, + None => crate::bail_corrupt_error!("Parse error: no such table: {}", tbl_name), + }; + + let table_ref = BTreeTableReference { + table: table.clone(), + table_identifier: table.name.clone(), + table_index: 0, + }; + let referenced_tables = vec![table_ref.clone()]; + + // Parse the WHERE clause + let resolved_where_clauses = parse_where(where_clause, &[table_ref.clone()])?; + + // Parse the LIMIT clause + let resolved_limit = limit.and_then(parse_limit); + + let plan = DeletePlan { + source: SourceOperator::Scan { + id: 0, + table_reference: table_ref.clone(), + predicates: resolved_where_clauses.clone(), + iter_dir: None, + }, + result_columns: vec![], + where_clause: resolved_where_clauses, + order_by: None, + limit: resolved_limit, + referenced_tables, + available_indexes: vec![], + contains_constant_false_condition: false, + }; + + Ok(Plan::Delete(plan)) +} diff --git a/core/translate/planner.rs b/core/translate/planner.rs index 5cde1ce1c..a8fb34b14 100644 --- a/core/translate/planner.rs +++ b/core/translate/planner.rs @@ -1,11 +1,11 @@ -use super::plan::{Aggregate, BTreeTableReference, DeletePlan, Plan, SourceOperator}; +use super::plan::{Aggregate, BTreeTableReference, SourceOperator}; use crate::{ function::Func, schema::Schema, util::{exprs_are_equivalent, normalize_ident}, Result, }; -use sqlite3_parser::ast::{self, Expr, FromClause, JoinType, Limit, QualifiedName}; +use sqlite3_parser::ast::{self, Expr, FromClause, JoinType, Limit}; pub struct OperatorIdCounter { id: usize, @@ -253,49 +253,6 @@ pub fn bind_column_references( } } -pub fn prepare_delete_plan( - schema: &Schema, - tbl_name: &QualifiedName, - where_clause: Option, - limit: Option, -) -> Result { - let table = match schema.get_table(tbl_name.name.0.as_str()) { - Some(table) => table, - None => crate::bail_corrupt_error!("Parse error: no such table: {}", tbl_name), - }; - - let table_ref = BTreeTableReference { - table: table.clone(), - table_identifier: table.name.clone(), - table_index: 0, - }; - let referenced_tables = vec![table_ref.clone()]; - - // Parse the WHERE clause - let resolved_where_clauses = parse_where(where_clause, &[table_ref.clone()])?; - - // Parse the LIMIT clause - let resolved_limit = limit.and_then(parse_limit); - - let plan = DeletePlan { - source: SourceOperator::Scan { - id: 0, - table_reference: table_ref.clone(), - predicates: resolved_where_clauses.clone(), - iter_dir: None, - }, - result_columns: vec![], - where_clause: resolved_where_clauses, - order_by: None, - limit: resolved_limit, - referenced_tables, - available_indexes: vec![], - contains_constant_false_condition: false, - }; - - Ok(Plan::Delete(plan)) -} - pub fn parse_from( schema: &Schema, from: Option,