Plan a DELETE statement.
(stmt: &ast::Statement, catalog: &dyn SqlCatalog)
| 298 | |
| 299 | /// Plan a DELETE statement. |
| 300 | pub fn plan_delete(stmt: &ast::Statement, catalog: &dyn SqlCatalog) -> Result<Vec<SqlPlan>> { |
| 301 | let ast::Statement::Delete(delete) = stmt else { |
| 302 | return Err(SqlError::Parse { |
| 303 | detail: "expected DELETE statement".into(), |
| 304 | }); |
| 305 | }; |
| 306 | |
| 307 | let from_tables = match &delete.from { |
| 308 | ast::FromTable::WithFromKeyword(tables) | ast::FromTable::WithoutKeyword(tables) => tables, |
| 309 | }; |
| 310 | let table_name = |
| 311 | extract_table_name_from_table_with_joins(from_tables.first().ok_or_else(|| { |
| 312 | SqlError::Parse { |
| 313 | detail: "DELETE requires a FROM table".into(), |
| 314 | } |
| 315 | })?)?; |
| 316 | let info = catalog |
| 317 | .get_collection(DatabaseId::DEFAULT, &table_name)? |
| 318 | .ok_or_else(|| SqlError::UnknownTable { |
| 319 | name: table_name.clone(), |
| 320 | })?; |
| 321 | |
| 322 | let filters = match &delete.selection { |
| 323 | Some(expr) => super::super::select::convert_where_to_filters(expr)?, |
| 324 | None => Vec::new(), |
| 325 | }; |
| 326 | |
| 327 | let target_keys = extract_point_keys(delete.selection.as_ref(), &info); |
| 328 | |
| 329 | let rules = engine_rules::resolve_engine_rules(info.engine); |
| 330 | rules.plan_delete(DeleteParams { |
| 331 | collection: table_name, |
| 332 | filters, |
| 333 | target_keys, |
| 334 | }) |
| 335 | } |
| 336 | |
| 337 | /// Plan a TRUNCATE statement. |
| 338 | pub fn plan_truncate_stmt(stmt: &ast::Statement) -> Result<Vec<SqlPlan>> { |
no test coverage detected