test+docs: 3k Phase-3 verification sweep — e2e DML + filled cross-cut matrix
Sub-phase 3k of ADR-0033. Adds the Tier-3 end-to-end DML suite (tests/sql_dml_e2e.rs) and the cross-cut gap-fill tests, fills the verification matrix (every row a verified file::function), and produces the phase-exit report. - tests/sql_dml_e2e.rs: INSERT…SELECT cross-table, all-ten-type multi-row INSERT + RETURNING type recovery, UPDATE-with-subquery-in-SET, cascade DELETE, UPSERT round-trip, RETURNING x3, history.log replay, OOS rejections (full §13 table), validity-indicator-from-SQL-DML. - walker/mod.rs, highlight.rs, completion.rs, input_render.rs: inherited-diagnostic, DML-keyword highlight, INSERT INTO completion, and advanced-mode DML hint-panel cross-cuts. - Matrix correction (user-confirmed): predicate warnings fire on row-scoped DML slots; INSERT VALUES has no row scope (ADR-0033 §8.4). - Auto-snapshot row marked N/A (user-confirmed): ADR-0006 unimplemented for both paths; deferred. /runda round: added an advanced-mode DML hint-panel test (A6 was attributed to simple-mode prose under the §8 advanced heading); extended OOS coverage to the full ADR-0033 §13 table (OOS-5 INDEXED BY / OOS-6 multi-statement) + a trailing-semicolon guard. 1645 passing / 0 failing / 0 skipped / 1 ignored. Clippy clean.
This commit is contained in:
@@ -1290,101 +1290,159 @@ input" (handoff-29 §4.4 pin).
|
||||
| Claim source | Claim | Test location | Status |
|
||||
|------------------------|--------------------------------------------------------------------------------|---------------|--------|
|
||||
| **Statement shapes (§1)** | | | |
|
||||
| ADR-0033 §1 | Single-row VALUES INSERT runs end-to-end | TBD (3b) | ⏳ |
|
||||
| ADR-0033 §1 | Multi-row VALUES INSERT runs end-to-end | TBD (3b) | ⏳ |
|
||||
| ADR-0033 §1 | INSERT with `(column_name_list)` runs | TBD (3b) | ⏳ |
|
||||
| ADR-0033 §1 | INSERT without column list (full table arity) runs | TBD (3b) | ⏳ |
|
||||
| ADR-0033 §4 | `INSERT … SELECT` runs | TBD (3c) | ⏳ |
|
||||
| ADR-0033 §4 / R4 | `INSERT … WITH … SELECT` row source runs (Amendment-2 carry-through) | TBD (3c) | ⏳ |
|
||||
| ADR-0033 §1 | UPDATE with WHERE runs | TBD (3e) | ⏳ |
|
||||
| ADR-0033 §1 / §12 | UPDATE without WHERE runs (no `--all-rows` rail) | TBD (3e) | ⏳ |
|
||||
| ADR-0033 §1 | UPDATE with multi-column SET | TBD (3e) | ⏳ |
|
||||
| ADR-0033 §1 | UPDATE with sql_expr in SET (function call, subquery, CASE) | TBD (3e) | ⏳ |
|
||||
| ADR-0033 §1 | DELETE with WHERE runs | TBD (3f) | ⏳ |
|
||||
| ADR-0033 §1 / §12 | DELETE without WHERE runs (no `--all-rows` rail) | TBD (3f) | ⏳ |
|
||||
| ADR-0033 §1 | Single-row VALUES INSERT runs end-to-end | `ins::single_row_insert_persists_and_counts` | ✅ |
|
||||
| ADR-0033 §1 | Multi-row VALUES INSERT runs end-to-end | `ins::multi_row_insert_persists_both_rows` | ✅ |
|
||||
| ADR-0033 §1 | INSERT with `(column_name_list)` runs | `ins::single_row_insert_persists_and_counts` | ✅ |
|
||||
| ADR-0033 §1 | INSERT without column list (full table arity) runs | `ins::no_column_list_full_arity_insert_persists` | ✅ |
|
||||
| ADR-0033 §4 | `INSERT … SELECT` runs | `ins::insert_select_copies_rows_and_persists`, `e2e::e2e_insert_select_cross_table_copies_rows_and_persists_both` | ✅ |
|
||||
| ADR-0033 §4 / R4 | `INSERT … WITH … SELECT` row source runs (Amendment-2 carry-through) | `ins::with_prefixed_insert_select_runs_and_persists` | ✅ |
|
||||
| ADR-0033 §1 | UPDATE with WHERE runs | `upd::single_column_update_with_where_persists` | ✅ |
|
||||
| ADR-0033 §1 / §12 | UPDATE without WHERE runs (no `--all-rows` rail) | `upd::update_without_where_runs_across_all_rows` | ✅ |
|
||||
| ADR-0033 §1 | UPDATE with multi-column SET | `upd::multi_column_update_persists` | ✅ |
|
||||
| ADR-0033 §1 | UPDATE with sql_expr in SET (function call, subquery, CASE) | `upd::update_with_sql_expr_in_set`, `e2e::e2e_update_with_subquery_in_set` | ✅ |
|
||||
| ADR-0033 §1 | DELETE with WHERE runs | `del::delete_with_where_persists` | ✅ |
|
||||
| ADR-0033 §1 / §12 | DELETE without WHERE runs (no `--all-rows` rail) | `del::delete_without_where_runs_across_all_rows` | ✅ |
|
||||
| **Dispatch (§2)** | | | |
|
||||
| ADR-0033 §2 / 3a | Guard fires BEFORE Seq commits (R1 invariant on synthetic markers) | TBD (3a) | ⏳ |
|
||||
| ADR-0033 §2 | Simple mode + DSL INSERT → DSL branch | TBD (3j) | ⏳ |
|
||||
| ADR-0033 §2 | Simple mode + SQL INSERT (RETURNING) → ValidationFailed `advanced_mode.sql_in_simple` | TBD (3j) | ⏳ |
|
||||
| ADR-0033 §2 | Advanced + structurally-ambiguous (`delete from t where id = 1`) → SQL branch | TBD (3j) | ⏳ |
|
||||
| ADR-0033 §2 | Advanced + DSL-only (`--all-rows`) → DSL branch (Choice falls through) | TBD (3j) | ⏳ |
|
||||
| ADR-0033 §2 | Same for UPDATE shared entry word | TBD (3j) | ⏳ |
|
||||
| ADR-0033 §2 | Same for INSERT shared entry word | TBD (3j) | ⏳ |
|
||||
| ADR-0033 §2 / 3a | Guard fires BEFORE Seq commits (R1 invariant on synthetic markers) [a] | `walker::advanced_mode_dsl_input_falls_back_to_dsl` | ✅ |
|
||||
| ADR-0033 §2 | Simple mode + DSL shared word → DSL branch | `parser::simple_dsl_delete_stays_dsl` | ✅ |
|
||||
| ADR-0033 §2 [b] | Simple mode + shared word w/ SQL-only construct → DSL parse error + combined pointer | `parser::simple_shared_word_with_sql_construct_is_a_dsl_parse_error`, `input_render::ambient_hint_combines_dsl_error_with_advanced_sql_pointer`, `app::simple_mode_submit_of_sql_construct_appends_advanced_pointer`; SQL-only *entry* word → `parser::simple_sql_only_entry_word_points_at_advanced_mode` | ✅ |
|
||||
| ADR-0033 §2 | Advanced + structurally-ambiguous (`delete from t where id = 1`) → SQL branch | `parser::advanced_ambiguous_delete_routes_to_sql` | ✅ |
|
||||
| ADR-0033 §2 | Advanced + DSL-only (`--all-rows`) → DSL branch (falls through) | `parser::advanced_dsl_only_delete_falls_back_to_dsl` | ✅ |
|
||||
| ADR-0033 §2 | Same for UPDATE shared entry word (+ `--all-rows` SQL-absorb counter-example) | `parser::advanced_ambiguous_update_routes_to_sql`, `e2e::e2e_update_all_rows_in_advanced_does_not_fall_back_to_dsl` | ✅ |
|
||||
| ADR-0033 §2 | Same for INSERT shared entry word | `parser::advanced_ambiguous_insert_routes_to_sql` | ✅ |
|
||||
| **RETURNING (§5 / §12)** | | | |
|
||||
| ADR-0033 §5 | INSERT … RETURNING * surfaces DataResult | TBD (3g) | ⏳ |
|
||||
| ADR-0033 §5 | UPDATE … RETURNING cols surfaces DataResult | TBD (3g) | ⏳ |
|
||||
| ADR-0033 §5 | DELETE … RETURNING * surfaces DataResult (pre-DELETE row) | TBD (3g) | ⏳ |
|
||||
| ADR-0033 §5 | DELETE … RETURNING preserves cascade summary alongside result set | TBD (3g) | ⏳ |
|
||||
| ADR-0033 §12 | Result-column type recovery for each of ten playground types via RETURNING | TBD (3g) | ⏳ |
|
||||
| ADR-0033 §12 | Computed expression in RETURNING stays typeless | TBD (3g) | ⏳ |
|
||||
| ADR-0033 §5 / R3 | Multi-row INSERT … RETURNING: column-origin same for all rows | TBD (3g) | ⏳ |
|
||||
| ADR-0033 §5 | INSERT … RETURNING * surfaces DataResult | `ins::insert_returning_star_returns_inserted_row`, `e2e::e2e_returning_on_insert_update_delete` | ✅ |
|
||||
| ADR-0033 §5 | UPDATE … RETURNING cols surfaces DataResult | `upd::update_returning_yields_modified_columns`, `e2e::e2e_returning_on_insert_update_delete` | ✅ |
|
||||
| ADR-0033 §5 | DELETE … RETURNING * surfaces DataResult (pre-DELETE row) | `del::delete_returning_yields_predelete_row`, `e2e::e2e_returning_on_insert_update_delete` | ✅ |
|
||||
| ADR-0033 §5 | DELETE … RETURNING preserves cascade summary alongside result set | `del::delete_returning_with_cascade_surfaces_both` | ✅ |
|
||||
| ADR-0033 §12 | Result-column type recovery for each of ten playground types via RETURNING | `e2e::e2e_multirow_insert_all_ten_types_roundtrips_and_returning_recovers_each_type` (all 10), `ins::insert_returning_recovers_multiple_bare_column_types` (5) | ✅ |
|
||||
| ADR-0033 §12 | Computed expression in RETURNING stays typeless | `ins::insert_returning_computed_expression_is_typeless` | ✅ |
|
||||
| ADR-0033 §5 / R3 | Multi-row INSERT … RETURNING: column-origin same for all rows | `ins::multirow_autofill_returning_yields_distinct_generated_ids`, `e2e::e2e_multirow_insert_all_ten_types_…` | ✅ |
|
||||
| **shortid auto-fill (§6)** | | | |
|
||||
| ADR-0033 §6 | Single-row VALUES auto-fills omitted shortid PK | TBD (3d) | ⏳ |
|
||||
| ADR-0033 §6 | Multi-row VALUES yields DISTINCT shortids per row | TBD (3d) | ⏳ |
|
||||
| ADR-0033 §6 | INSERT … SELECT auto-fills shortids per yielded row | TBD (3d) | ⏳ |
|
||||
| ADR-0033 §6 | Explicit value for shortid column respected (override; warning in §8.2) | TBD (3d) | ⏳ |
|
||||
| ADR-0033 §6 | serial + shortid combo: no double-fill collision | TBD (3d) | ⏳ |
|
||||
| ADR-0033 §6 | Single-row VALUES auto-fills omitted shortid PK | `ins::values_autofills_omitted_shortid_pk` | ✅ |
|
||||
| ADR-0033 §6 | Multi-row VALUES yields DISTINCT shortids per row | `ins::values_multirow_autofills_distinct_shortids` | ✅ |
|
||||
| ADR-0033 §6 | INSERT … SELECT auto-fills shortids per yielded row | `ins::insert_select_autofills_distinct_shortids` | ✅ |
|
||||
| ADR-0033 §6 | Explicit value for shortid column respected (override; warning in §8.2) | `ins::explicit_shortid_value_is_respected` | ✅ |
|
||||
| ADR-0033 §6 | serial + shortid combo: no double-fill collision | `ins::combined_serial_and_shortid_autofill` | ✅ |
|
||||
| **Cascade summary (§7)** | | | |
|
||||
| ADR-0033 §7 | DSL parity: same schema/data, SQL DELETE produces same per-relationship summary | TBD (3f) | ⏳ |
|
||||
| ADR-0033 §7 / R2 | WHERE-with-subquery: cascade pre-count uses correct byte range | TBD (3f) | ⏳ |
|
||||
| ADR-0033 §7 | Pre-count runs BEFORE execute | TBD (3f) | ⏳ |
|
||||
| ADR-0033 §7 | Cascade-affected child tables re-persisted | TBD (3f) | ⏳ |
|
||||
| ADR-0033 §7 | Cascade-summary formatter shared (one function, two callers) | TBD (3f) | ⏳ |
|
||||
| ADR-0033 §7 | DSL parity: same schema/data, SQL DELETE produces same per-relationship summary | `del::cascade_parity_with_dsl` | ✅ |
|
||||
| ADR-0033 §7 / R2 [c] | WHERE-with-subquery: cascade correct (count-diff, R2 withdrawn) | `del::r2_where_with_subquery` | ✅ |
|
||||
| ADR-0033 §7 [c] | Cascade detection by count-diff in a transaction (before/after) | `del::cascade_delete_reports_summary_and_repersists_child` | ✅ |
|
||||
| ADR-0033 §7 | Cascade-affected child tables re-persisted | `del::cascade_delete_reports_summary_and_repersists_child`, `e2e::e2e_delete_with_cascade_reports_summary_and_repersists_children` | ✅ |
|
||||
| ADR-0033 §7 | Cascade-summary formatter shared (one render path, DSL + SQL) | `del::cascade_parity_with_dsl` | ✅ |
|
||||
| **Diagnostics (§8)** | | | |
|
||||
| ADR-0033 §8.1 | `insert_arity_mismatch` positive (single-row) | TBD (3i) | ⏳ |
|
||||
| ADR-0033 §8.1 | `insert_arity_mismatch` negative (matched arity) | TBD (3i) | ⏳ |
|
||||
| ADR-0033 §8.1 | `insert_arity_mismatch` per-row (multi-row VALUES) | TBD (3i) | ⏳ |
|
||||
| ADR-0033 §8.1 | `insert_arity_mismatch` on INSERT…SELECT (projection arity) | TBD (3i) | ⏳ |
|
||||
| ADR-0033 §8.2 | `auto_column_overridden` positive (serial) | TBD (3i) | ⏳ |
|
||||
| ADR-0033 §8.2 | `auto_column_overridden` positive (shortid) | TBD (3i) | ⏳ |
|
||||
| ADR-0033 §8.2 | `auto_column_overridden` negative (omitted) | TBD (3i) | ⏳ |
|
||||
| ADR-0033 §8.3 | `not_null_missing` positive | TBD (3i) | ⏳ |
|
||||
| ADR-0033 §8.3 | `not_null_missing` negative | TBD (3i) | ⏳ |
|
||||
| ADR-0033 §8.3 | `not_null_missing` does NOT fire for NOT-NULL-with-default | TBD (3i) | ⏳ |
|
||||
| ADR-0033 §8.1 | `insert_arity_mismatch` positive (single-row) | `walker::insert_arity_mismatch_single_row_fires` | ✅ |
|
||||
| ADR-0033 §8.1 | `insert_arity_mismatch` negative (matched arity) | `walker::insert_arity_match_is_silent` | ✅ |
|
||||
| ADR-0033 §8.1 | `insert_arity_mismatch` per-row (multi-row VALUES) | `walker::insert_arity_mismatch_emits_per_row` | ✅ |
|
||||
| ADR-0033 §8.1 | `insert_arity_mismatch` on INSERT…SELECT (projection arity) | `walker::insert_select_arity_mismatch_fires` | ✅ |
|
||||
| ADR-0033 §8.2 | `auto_column_overridden` positive (serial) | `walker::auto_column_overridden_fires_on_explicit_serial` | ✅ |
|
||||
| ADR-0033 §8.2 | `auto_column_overridden` positive (shortid) | `walker::auto_column_overridden_fires_on_explicit_shortid` | ✅ |
|
||||
| ADR-0033 §8.2 | `auto_column_overridden` negative (omitted) | `walker::auto_column_overridden_silent_when_omitted` | ✅ |
|
||||
| ADR-0033 §8.3 | `not_null_missing` positive | `walker::not_null_missing_fires_when_required_column_omitted` | ✅ |
|
||||
| ADR-0033 §8.3 | `not_null_missing` negative | `walker::not_null_missing_silent_when_included` | ✅ |
|
||||
| ADR-0033 §8.3 | `not_null_missing` does NOT fire for NOT-NULL-with-default | `walker::not_null_missing_silent_when_column_has_default` | ✅ |
|
||||
| **UPSERT (§9)** | | | |
|
||||
| ADR-0033 §9 | ON CONFLICT (col) DO NOTHING runs; no-ops on conflict | TBD (3h) | ⏳ |
|
||||
| ADR-0033 §9 | ON CONFLICT (col) DO UPDATE SET … = excluded.… runs; row updated | TBD (3h) | ⏳ |
|
||||
| ADR-0033 §9 | ON CONFLICT DO NOTHING (no target spec) accepts any conflict | TBD (3h) | ⏳ |
|
||||
| ADR-0033 §9 | `excluded.col` completes to target table's columns inside DO UPDATE | TBD (3h) | ⏳ |
|
||||
| ADR-0033 §9 | `excluded` rejected outside DO UPDATE (scoping) | TBD (3h) | ⏳ |
|
||||
| ADR-0033 §9 | ON CONFLICT (col) DO NOTHING runs; no-ops on conflict | `ins::on_conflict_do_nothing_keeps_existing_row`, `e2e::e2e_upsert_round_trip_do_update_then_do_nothing` | ✅ |
|
||||
| ADR-0033 §9 | ON CONFLICT (col) DO UPDATE SET … = excluded.… runs; row updated | `ins::on_conflict_do_update_applies_excluded`, `e2e::e2e_upsert_round_trip_…` | ✅ |
|
||||
| ADR-0033 §9 | ON CONFLICT DO NOTHING (no target spec) accepts any conflict | `ins::on_conflict_do_nothing_without_target` | ✅ |
|
||||
| ADR-0033 §9 | `excluded.col` completes to target table's columns inside DO UPDATE | `completion::excluded_prefix_completes_to_target_columns` | ✅ |
|
||||
| ADR-0033 §9 | `excluded` rejected outside DO UPDATE (scoping) | `walker::excluded_outside_do_update_is_unknown_qualifier`, `walker::excluded_in_values_flagged_even_when_do_update_present` | ✅ |
|
||||
| **Inherited Phase-2 diagnostics on DML slots (§8.4)** | | | |
|
||||
| ADR-0032 §11 | `schema_existence` fires on INSERT VALUES column | TBD (3i) | ⏳ |
|
||||
| ADR-0032 §11 | `schema_existence` fires on UPDATE SET | TBD (3i) | ⏳ |
|
||||
| ADR-0032 §11 | `schema_existence` fires on UPDATE / DELETE WHERE | TBD (3i) | ⏳ |
|
||||
| ADR-0032 §11 | `schema_existence` fires on RETURNING projection | TBD (3i / 3g) | ⏳ |
|
||||
| ADR-0032 §11.6 | Predicate warning `eq_null` fires on UPDATE WHERE | TBD (3i) | ⏳ |
|
||||
| ADR-0032 §11.6 | Predicate warning `like_numeric` fires on DELETE WHERE | TBD (3i) | ⏳ |
|
||||
| ADR-0032 §11.6 | Predicate warning fires inside INSERT VALUES sql_expr (e.g., `=` with NULL) | TBD (3i) | ⏳ |
|
||||
| ADR-0032 §11 | `schema_existence` fires on INSERT VALUES / col-list column | `walker::insert_column_list_unknown_column_is_flagged` | ✅ |
|
||||
| ADR-0032 §11 | `schema_existence` fires on UPDATE SET | `walker::sql_update_unknown_set_column_is_error` | ✅ |
|
||||
| ADR-0032 §11 | `schema_existence` fires on UPDATE / DELETE WHERE | `walker::sql_update_where_unknown_column_is_error`, `walker::sql_delete_where_unknown_column_is_error` | ✅ |
|
||||
| ADR-0032 §11 | `schema_existence` fires on RETURNING projection | `walker::returning_ref_unknown_column_is_flagged`, `walker::returning_ref_in_plain_insert_validated_against_target` | ✅ |
|
||||
| ADR-0032 §11.6 | Predicate warning `eq_null` fires on UPDATE WHERE | `walker::sql_update_eq_null_in_where_warns` | ✅ |
|
||||
| ADR-0032 §11.6 | Predicate warning `like_numeric` fires on DELETE WHERE | `walker::sql_delete_where_like_numeric_warns` | ✅ |
|
||||
| ADR-0032 §11.6 [d] | Predicate warning fires on row-scoped DML sql_expr slots (UPDATE SET CASE, INSERT…SELECT WHERE) — VALUES has no row scope | `walker::sql_update_set_case_predicate_warns`, `walker::insert_select_where_predicate_warns` | ✅ |
|
||||
| **Ambient assistance (§§ from ADR-0030 §8)** | | | |
|
||||
| ADR-0030 §8 | Syntax highlighting works for SQL DML keywords (INSERT, UPDATE, DELETE, INTO, VALUES, SET, RETURNING, ON, CONFLICT) | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §8 | Tab completion works for SQL DML entry keywords in Advanced mode | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §8 | Tab completion works for target table after `INSERT INTO ` | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §8 | Tab completion works for column names inside `(column_list)` | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §8 | Tab completion works for column names in UPDATE SET / WHERE | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §8 | Hint-panel prose appears at representative DML slots | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §8 | `[ERR]`/`[WRN]` validity indicator fires for SQL DML diagnostics | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §8 | Per-command parse-error usage fires for SQL DML | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §8 | Syntax highlighting works for SQL DML keywords (INSERT, UPDATE, DELETE, INTO, VALUES, SET, RETURNING, ON, CONFLICT) | `highlight::sql_dml_keywords_classified` | ✅ |
|
||||
| ADR-0030 §8 | Tab completion works for SQL DML entry keywords | `completion::empty_input_offers_all_command_entry_keywords` | ✅ |
|
||||
| ADR-0030 §8 | Tab completion works for target table after `INSERT INTO ` | `completion::insert_into_offers_table_names_at_target_slot` | ✅ |
|
||||
| ADR-0030 §8 | Tab completion works for column names inside `(column_list)` | `completion::insert_into_open_paren_offers_current_table_columns` | ✅ |
|
||||
| ADR-0030 §8 | Tab completion works for column names in UPDATE SET / WHERE | `completion::update_set_offers_only_current_table_columns`, `completion::update_where_offers_only_current_table_columns` | ✅ |
|
||||
| ADR-0030 §8 [f] | Hint-panel assistance appears at representative DML slots | `input_render::advanced_mode_ambient_offers_dml_slot_candidates` (advanced SQL), `input_render::ambient_hint_at_insert_first_value_shows_int_prose` / `…at_update_set_shows_per_column_prose` / `…at_where_mentions_column_name` (simple DSL prose) | ✅ |
|
||||
| ADR-0030 §8 | `[ERR]`/`[WRN]` validity indicator fires for SQL DML diagnostics | `e2e::e2e_validity_indicator_fires_for_sql_dml_diagnostic`, `walker::input_verdict_eq_null_is_warning`, `walking_skeleton::validity_indicator_renders_err_and_wrn_labels` | ✅ |
|
||||
| ADR-0030 §8 | Per-command parse-error usage fires for SQL DML shared words | `parse_error_pedagogy::insert_partial_renders_insert_usage_template`, `…update_partial_renders_update_usage_template` | ✅ |
|
||||
| **Engine-neutrality + safety** | | | |
|
||||
| ADR-0030 §6 / ADR-0033 §1 | `__rdbms_*` rejection at INSERT target slot | TBD (3b) | ⏳ |
|
||||
| ADR-0030 §6 / ADR-0033 §1 | `__rdbms_*` rejection at UPDATE target slot | TBD (3e) | ⏳ |
|
||||
| ADR-0030 §6 / ADR-0033 §1 | `__rdbms_*` rejection at DELETE target slot | TBD (3f) | ⏳ |
|
||||
| ADR-0030 §6 / ADR-0033 §1 | `__rdbms_*` rejection in INSERT…SELECT row source's FROM | TBD (3c) | ⏳ |
|
||||
| ADR-0030 §7 / ADR-0033 §11 | Engine UNIQUE constraint failure surfaces via friendly layer (engine-neutral) | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §7 / ADR-0033 §11 | Engine NOT NULL constraint failure surfaces via friendly layer | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §7 / ADR-0033 §11 | Engine FK constraint failure on DELETE-without-cascade surfaces | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §6 / ADR-0033 §1 | `__rdbms_*` rejection at INSERT target slot | `ins::parse_path_rejects_internal_target_table` | ✅ |
|
||||
| ADR-0030 §6 / ADR-0033 §1 | `__rdbms_*` rejection at UPDATE target slot | `sql_update.rs::internal_target_table_rejected` | ✅ |
|
||||
| ADR-0030 §6 / ADR-0033 §1 | `__rdbms_*` rejection at DELETE target slot | `del::internal_target_table_rejected_at_parse` | ✅ |
|
||||
| ADR-0030 §6 / ADR-0033 §1 | `__rdbms_*` rejection in INSERT…SELECT row source's FROM | `sql_insert.rs::select_row_source_rejects_internal_from_table` | ✅ |
|
||||
| ADR-0030 §7 / ADR-0033 §11 | Engine UNIQUE constraint failure surfaces via friendly layer (engine-neutral) | `friendly::enrich_unique_insert_resolves_table_column_value_and_pinpoint`, `ins::failed_insert_rolls_back_and_does_not_repersist` | ✅ |
|
||||
| ADR-0030 §7 / ADR-0033 §11 | Engine NOT NULL constraint failure surfaces via friendly layer | `friendly::enrich_not_null_resolves_table_and_column` | ✅ |
|
||||
| ADR-0030 §7 / ADR-0033 §11 | Engine FK constraint failure on DELETE-without-cascade surfaces | `del::delete_violating_fk_fails_and_persists_nothing` | ✅ |
|
||||
| **Persistence + history (§10–§11)** | | | |
|
||||
| ADR-0030 §11 | INSERT writes history.log + re-persists target CSV | TBD (3b) | ⏳ |
|
||||
| ADR-0030 §11 | UPDATE writes history.log + re-persists target CSV | TBD (3e) | ⏳ |
|
||||
| ADR-0030 §11 | DELETE writes history.log + re-persists target + cascade-affected CSVs | TBD (3f) | ⏳ |
|
||||
| ADR-0030 §11 | Every Phase-3 statement form replays from history.log faithfully | TBD (3k) | ⏳ |
|
||||
| ADR-0033 §10 | INSERT failure does NOT re-persist CSV | TBD (3b) | ⏳ |
|
||||
| ADR-0006 / ADR-0033 §10 | Auto-snapshot fires for SQL DML the same way it does for DSL DML | TBD (3k) | ⏳ |
|
||||
| ADR-0030 §11 | INSERT writes history.log + re-persists target CSV | `ins::insert_appends_literal_line_to_history` | ✅ |
|
||||
| ADR-0030 §11 | UPDATE writes history.log + re-persists target CSV | `upd::update_appends_literal_line_to_history` | ✅ |
|
||||
| ADR-0030 §11 | DELETE writes history.log + re-persists target + cascade-affected CSVs | `del::delete_appends_literal_line_to_history`, `e2e::e2e_delete_with_cascade_…` | ✅ |
|
||||
| ADR-0030 §11 | Every Phase-3 statement form replays from history.log faithfully | `e2e::e2e_replay_phase3_dml_forms_from_a_script` | ✅ |
|
||||
| ADR-0033 §10 | INSERT failure does NOT re-persist CSV | `ins::failed_insert_rolls_back_and_does_not_repersist` | ✅ |
|
||||
| ADR-0006 / ADR-0033 §10 [e] | Auto-snapshot fires for SQL DML the same way it does for DSL DML | — (ADR-0006 unimplemented for BOTH paths; deferred) | N/A |
|
||||
| **OOS rejections (§13)** | | | |
|
||||
| ADR-0033 §13 OOS-1 | `INSERT INTO t DEFAULT VALUES` parse-rejects | TBD (3b) | ⏳ |
|
||||
| ADR-0033 §13 OOS-2 | `INSERT OR REPLACE` parse-rejects | TBD (3b) | ⏳ |
|
||||
| ADR-0033 §13 OOS-3 | `UPDATE … FROM other_table` parse-rejects | TBD (3e) | ⏳ |
|
||||
| ADR-0033 §13 OOS-4 | `WITH x AS (…) UPDATE …` parse-rejects | TBD (3e) | ⏳ |
|
||||
| ADR-0033 §13 OOS-4 | `WITH x AS (…) DELETE …` parse-rejects | TBD (3f) | ⏳ |
|
||||
| ADR-0033 §13 OOS-1 | `INSERT INTO t DEFAULT VALUES` parse-rejects | `e2e::e2e_out_of_scope_dml_forms_parse_reject` | ✅ |
|
||||
| ADR-0033 §13 OOS-2 | `INSERT OR REPLACE` / `OR IGNORE` parse-rejects | `e2e::e2e_out_of_scope_dml_forms_parse_reject` | ✅ |
|
||||
| ADR-0033 §13 OOS-3 | `UPDATE … FROM other_table` parse-rejects | `e2e::e2e_out_of_scope_dml_forms_parse_reject` | ✅ |
|
||||
| ADR-0033 §13 OOS-4 | `WITH x AS (…) UPDATE …` parse-rejects | `e2e::e2e_out_of_scope_dml_forms_parse_reject` | ✅ |
|
||||
| ADR-0033 §13 OOS-4 | `WITH x AS (…) DELETE …` parse-rejects | `e2e::e2e_out_of_scope_dml_forms_parse_reject` | ✅ |
|
||||
| ADR-0033 §13 OOS-5 | `INDEXED BY` / `NOT INDEXED` table modifiers parse-reject | `e2e::e2e_out_of_scope_dml_forms_parse_reject` | ✅ |
|
||||
| ADR-0033 §13 OOS-6 | Multi-statement batch (`…; …`) parse-rejects (single `;`-tail still parses) | `e2e::e2e_out_of_scope_dml_forms_parse_reject`, `e2e::e2e_single_dml_statement_with_trailing_semicolon_parses` | ✅ |
|
||||
|
||||
**Test-location legend.** `ins::` = `tests/sql_insert.rs`, `upd::` =
|
||||
`tests/sql_update.rs`, `del::` = `tests/sql_delete.rs`, `e2e::` =
|
||||
`tests/sql_dml_e2e.rs` (new in 3k), `walker::` =
|
||||
`src/dsl/walker/mod.rs::tests`, `highlight::` =
|
||||
`src/dsl/walker/highlight.rs::tests`, `completion::` =
|
||||
`src/completion.rs::tests`, `parser::` = `src/dsl/parser.rs::tests`,
|
||||
`input_render::` = `src/input_render.rs::tests`, `app::` =
|
||||
`src/app.rs::tests`, `friendly::` = `tests/friendly_enrichment.rs`,
|
||||
`parse_error_pedagogy::` = `tests/parse_error_pedagogy.rs`,
|
||||
`walking_skeleton::` = `tests/walking_skeleton.rs`,
|
||||
`sql_update.rs` / `sql_insert.rs` (bare) = the `#[cfg(test)]` module
|
||||
inside `src/dsl/grammar/sql_update.rs` / `sql_insert.rs`.
|
||||
|
||||
**Footnotes (resolutions surfaced during 3k).**
|
||||
|
||||
- **[a]** ADR-0033 **Amendment 1** replaced `Node::Guard` with
|
||||
category-grouped, mode-aware dispatch in `walker::walk`; the R1
|
||||
invariant ("the SQL branch failing must not strand the DSL
|
||||
candidate") is now the Advanced-mode fall-through, proven on the
|
||||
dispatch smoke registry by `advanced_mode_dsl_input_falls_back_to_dsl`
|
||||
and on real DML by `parser::advanced_dsl_only_delete_falls_back_to_dsl`.
|
||||
- **[b]** ADR-0033 **Amendment 3** supersedes the original
|
||||
"bare `ValidationFailed`" expectation for shared words: a shared
|
||||
entry word in Simple mode commits the **DSL candidate** and surfaces
|
||||
the real DSL parse error, with the `advanced_mode.also_valid_sql`
|
||||
pointer combined at the render layer. The bare
|
||||
`advanced_mode.sql_in_simple` hint is reserved for SQL-only *entry
|
||||
words* (`select` / `with`).
|
||||
- **[c]** ADR-0033 **Amendment 2** withdrew R2: the cascade summary is
|
||||
produced by before/after **count-diff in a transaction** (DSL
|
||||
parity), not WHERE-byte pre-count injection. The subquery-in-WHERE
|
||||
case is correct by construction.
|
||||
- **[d]** **Matrix claim corrected (user-confirmed, 3k).** Predicate
|
||||
warnings fire on every DML `sql_expr` slot that carries **row scope**
|
||||
(UPDATE/DELETE WHERE, UPDATE SET incl. CASE, INSERT…SELECT
|
||||
projection & WHERE). Plain `INSERT … VALUES` has no row scope, so a
|
||||
bare-column predicate is inapplicable there — consistent with
|
||||
ADR-0033 §8.4 ("WHERE and CASE expressions"). The original example
|
||||
("inside INSERT VALUES") was an over-statement of the §8.4 claim.
|
||||
- **[e]** **N/A — deferred (user-confirmed, 3k).** ADR-0006
|
||||
auto-snapshot / undo is unimplemented for **both** the DSL and SQL
|
||||
DML paths (the U-series, per `CLAUDE.md` "Things deliberately
|
||||
deferred"). The "same way as DSL" parity therefore holds vacuously
|
||||
and Phase 3 introduces no regression. ADR-0033 §10's auto-snapshot
|
||||
consequence is contingent on the deferred ADR-0006 work; this row is
|
||||
N/A, not red, and does not block the phase exit.
|
||||
- **[f]** **Attribution corrected (`/runda` round).** The ambient
|
||||
hint-panel claim sits under the §8 *advanced* surface, but the
|
||||
hint-prose tests run via `ambient_hint` (which defaults to
|
||||
`Mode::Simple` — the DSL value-slot prose). 3k's `/runda` round added
|
||||
`advanced_mode_ambient_offers_dml_slot_candidates` so the row has a
|
||||
genuine **advanced-mode** DML hint-panel attribution (column
|
||||
candidates at an `UPDATE … SET` LHS and inside an `INSERT … (` column
|
||||
list); the simple-mode DSL prose tests remain as the DSL-surface
|
||||
complement.
|
||||
|
||||
The implementer fills in `Test location` and `Status`
|
||||
(✅ / ❌) as 3k proceeds. A row marked red blocks the
|
||||
|
||||
Reference in New Issue
Block a user