feat: bring simple-mode insert arity diagnostics to parity with advanced
A wrong-count simple-mode insert now shows the friendly per-column arity message at typing time (instead of a bare "expected `,`/`)`") and is blocked from dispatch at submit — unifying simple and advanced mode onto the one ADR-0027 model (structural parse + ERROR diagnostic), where they had diverged. Grammar: a simple-mode-only arity gate (dsl_insert_value_list) routes a wrong-count DSL insert tuple to the type-blind fallback so it matches structurally and the per-tuple arity diagnostic fires. The gate is gated to simple mode, so advanced behaviour is unchanged. count_tuple_values and the target-column selection (insert_target_columns) are now shared by both grammars. Diagnostic: dml_insert_arity_diagnostics is mode-aware — advanced Form B expects all columns; simple Form B/C expects the user-fillable columns (serial/shortid auto-fill). It counts the DSL Form A role and scans the keyword-less Form C tuple. New catalog keys name the fillable/auto split and the all-auto-table case. Submit: a wrong-count DSL insert now parses Ok + carries the ERROR diagnostic, so a unified Ok-arm pre-flight (dsl_insert_count_mismatch_notes) blocks dispatch and teaches; the previous Err-arm note retires. advanced_alternative_note's gate now reads the validity verdict so it still fires for the parse-Ok-with-error shape. Docs: ADR-0036 Amendment 2 (+ README index) and requirements.md H1a.
This commit is contained in:
@@ -51,6 +51,15 @@ pub const KEYS_AND_PLACEHOLDERS: &[(&str, &[&str])] = &[
|
||||
"diagnostic.insert_arity_mismatch_form_b",
|
||||
&["expected", "actual"],
|
||||
),
|
||||
// ADR-0036 Amendment 1 / issue #17: simple-mode Form B variants.
|
||||
(
|
||||
"diagnostic.insert_arity_mismatch_form_b_simple",
|
||||
&["expected", "columns", "skipped", "actual"],
|
||||
),
|
||||
(
|
||||
"diagnostic.insert_arity_mismatch_all_auto",
|
||||
&["table", "actual"],
|
||||
),
|
||||
("diagnostic.not_null_missing", &["column"]),
|
||||
("diagnostic.like_numeric", &["column", "type"]),
|
||||
("diagnostic.projection_alias_misplaced", &["alias", "clause"]),
|
||||
|
||||
@@ -577,8 +577,16 @@ diagnostic:
|
||||
# ADR-0033 §8 — Phase-3 DML diagnostic keys.
|
||||
auto_column_overridden: "column `{column}` is auto-generated (`{type}`); providing an explicit value bypasses the auto-counter and may collide with later auto-generated values"
|
||||
insert_arity_mismatch: "the column list names {expected} column(s) but {actual} value(s) are given"
|
||||
# ADR-0033 §8.1 / Amendment 5: Form B (no column list) variant.
|
||||
# ADR-0033 §8.1 / Amendment 5: Form B (no column list) variant
|
||||
# (advanced mode — auto-fills nothing, so every column needs a value).
|
||||
insert_arity_mismatch_form_b: "with no column list, all {expected} column(s) need a value but {actual} value(s) are given"
|
||||
# ADR-0036 Amendment 1 / issue #17: simple-mode Form B. The DSL
|
||||
# auto-fills serial/shortid columns, so only the user-fillable columns
|
||||
# take values — name both sets so the learner understands the skip.
|
||||
insert_arity_mismatch_form_b_simple: "without a column list, supply {expected} value(s) for {columns} — {skipped} auto-generated; {actual} given"
|
||||
# ADR-0036 Amendment 1 / issue #17: simple-mode Form B where every
|
||||
# column is auto-generated, so the values list takes nothing.
|
||||
insert_arity_mismatch_all_auto: "every column of `{table}` is auto-generated, so no values are needed, but {actual} value(s) are given"
|
||||
not_null_missing: "column `{column}` is required (`NOT NULL`, no default); the statement will fail when run"
|
||||
|
||||
# Engine-error translations: an engine-rejected SQL statement
|
||||
|
||||
Reference in New Issue
Block a user