feat: ADR-0036 Phase 2 — validate advanced-mode UPDATE SET literals + retain the value
Mirror Phase 1's capture-at-parse technique on the UPDATE SET assignment list. build_sql_update calls the new capture_set_literals (data.rs), which walks the matched tokens (no reparse, no grammar change) and classifies each top-level `SET col = <rhs>` as a literal (Some, incl. signed numbers) or an expression (None), using paren depth so a comma inside a function call or a `where` inside a scalar subquery is not mistaken for a boundary, and the trailing top-level WHERE is excluded. Command::SqlUpdate gains set_literals; do_sql_update validates the literals against their column types via the shared impl_value_for before the still verbatim update; user_value_for_column reads them so a constraint error names the offending value. WHERE stays unvalidated; execution and command identity are unchanged. Also corrects the stale data.rs header comment (DSL typed slots are wired, not "deferred") and flips ADR-0036 + README to Phases 1–2 implemented. Tests: 1934 passing (+4), 0 failed, 0 skipped, 1 ignored; clippy clean.
This commit is contained in:
@@ -442,6 +442,16 @@ pub enum Command {
|
||||
/// Whether a `RETURNING` clause matched (ADR-0033 §5,
|
||||
/// sub-phase 3g).
|
||||
returning: bool,
|
||||
/// Captured literal RHS of each top-level `SET col = <literal>`
|
||||
/// assignment (ADR-0036 Phase 2). `(col, Some(v))` for a bare
|
||||
/// literal (incl. a signed number); `(col, None)` for an
|
||||
/// expression RHS (arithmetic, function call, scalar subquery,
|
||||
/// column ref — nothing static to validate). The worker validates
|
||||
/// the `Some` values against their column types before the (still
|
||||
/// verbatim) update; the error enricher reads them to name the
|
||||
/// offending value. Execution itself is unchanged — these are
|
||||
/// *not* bound. `WHERE` is deliberately excluded (ADR-0036 §2).
|
||||
set_literals: Vec<(String, Option<Value>)>,
|
||||
},
|
||||
/// A SQL `DELETE` validated by the walker (ADR-0033 §1/§7,
|
||||
/// advanced mode). Grammar-as-text: the worker executes `sql`,
|
||||
|
||||
Reference in New Issue
Block a user