Plan an UPDATE statement.
(stmt: &ast::Statement, catalog: &dyn SqlCatalog)
| 19 | |
| 20 | /// Plan an UPDATE statement. |
| 21 | pub fn plan_update(stmt: &ast::Statement, catalog: &dyn SqlCatalog) -> Result<Vec<SqlPlan>> { |
| 22 | let ast::Statement::Update(update) = stmt else { |
| 23 | return Err(SqlError::Parse { |
| 24 | detail: "expected UPDATE statement".into(), |
| 25 | }); |
| 26 | }; |
| 27 | |
| 28 | // Delegate to the UPDATE...FROM path when a FROM clause is present. |
| 29 | if update.from.is_some() { |
| 30 | return plan_update_from(update, catalog); |
| 31 | } |
| 32 | |
| 33 | let table_name = extract_table_name_from_table_with_joins(&update.table)?; |
| 34 | let info = catalog |
| 35 | .get_collection(DatabaseId::DEFAULT, &table_name)? |
| 36 | .ok_or_else(|| SqlError::UnknownTable { |
| 37 | name: table_name.clone(), |
| 38 | })?; |
| 39 | |
| 40 | let assigns = convert_assignments(&update.assignments)?; |
| 41 | |
| 42 | let filters = match &update.selection { |
| 43 | Some(expr) => super::super::select::convert_where_to_filters(expr)?, |
| 44 | None => Vec::new(), |
| 45 | }; |
| 46 | |
| 47 | let target_keys = extract_point_keys(update.selection.as_ref(), &info); |
| 48 | |
| 49 | let rules = engine_rules::resolve_engine_rules(info.engine); |
| 50 | rules.plan_update(UpdateParams { |
| 51 | collection: table_name, |
| 52 | assignments: assigns, |
| 53 | filters, |
| 54 | target_keys, |
| 55 | returning: update.returning.is_some(), |
| 56 | }) |
| 57 | } |
| 58 | |
| 59 | /// Plan `UPDATE target SET ... FROM src WHERE target.col = src.col ...`. |
| 60 | fn plan_update_from(update: &ast::Update, catalog: &dyn SqlCatalog) -> Result<Vec<SqlPlan>> { |
no test coverage detected