(ins: &ast::Insert)
| 31 | } |
| 32 | |
| 33 | fn classify_on_conflict(ins: &ast::Insert) -> Result<OnConflict> { |
| 34 | let Some(on) = ins.on.as_ref() else { |
| 35 | return Ok(OnConflict::None); |
| 36 | }; |
| 37 | let ast::OnInsert::OnConflict(oc) = on else { |
| 38 | return Ok(OnConflict::None); |
| 39 | }; |
| 40 | match &oc.action { |
| 41 | ast::OnConflictAction::DoNothing => Ok(OnConflict::DoNothing), |
| 42 | ast::OnConflictAction::DoUpdate(do_update) => { |
| 43 | let mut pairs = Vec::with_capacity(do_update.assignments.len()); |
| 44 | for a in &do_update.assignments { |
| 45 | let name = match &a.target { |
| 46 | ast::AssignmentTarget::ColumnName(obj) => normalize_object_name_checked(obj)?, |
| 47 | _ => { |
| 48 | return Err(SqlError::Unsupported { |
| 49 | detail: "ON CONFLICT DO UPDATE SET target must be a column name".into(), |
| 50 | }); |
| 51 | } |
| 52 | }; |
| 53 | let expr = convert_expr(&a.value)?; |
| 54 | pairs.push((name, expr)); |
| 55 | } |
| 56 | Ok(OnConflict::DoUpdate(pairs)) |
| 57 | } |
| 58 | } |
| 59 | } |
| 60 | |
| 61 | /// Plan an INSERT statement. |
| 62 | pub fn plan_insert(ins: &ast::Insert, catalog: &dyn SqlCatalog) -> Result<Vec<SqlPlan>> { |
no test coverage detected