constraints: CHECK — check (<expr>) at create table & add column (ADR-0029)
The fourth constraint. `check ( <expr> )` reuses the ADR-0026 WHERE-expression grammar via `Subgrammar`, so a check is written in the same language as a `where` filter. - Grammar: a `CHECK_CONSTRAINT` arm joins the shared constraint-suffix Choice; `consume_check_expr` extracts the parenthesised expression (paren-depth aware) into `ColumnSpec.check` / `Command::AddColumn.check`. - Storage: the parsed `Expr` is compiled once to inline SQL (`compile_check_sql` — `compile_expr` + ADR-0028's param-inliner) and stored in that form everywhere — a new `check_expr` column in `__rdbms_playground_columns`, `project.yaml`'s `ColumnSchema.check`, and the column DDL emitted by `do_create_table` / `schema_to_ddl`. - `add column … check` routes through the rebuild primitive (SQLite's `ALTER … ADD COLUMN` cannot carry it); a CHECK on a serial/shortid column is create-table-only and refused at add-column with a friendly message. - `describe` surfaces the CHECK. ADR-0029 §7/§8 updated to the SQL-form decision — double-quoted identifiers, consistent with ADR-0028's `explain` display SQL. 1201 tests pass (+8); clippy clean.
This commit is contained in:
@@ -369,6 +369,9 @@ fn constraints_display(c: &ColumnDescription) -> String {
|
||||
if let Some(default) = &c.default {
|
||||
parts.push(format!("DEFAULT {default}"));
|
||||
}
|
||||
if let Some(check) = &c.check {
|
||||
parts.push(format!("CHECK ({check})"));
|
||||
}
|
||||
parts.join(", ")
|
||||
}
|
||||
|
||||
@@ -521,6 +524,7 @@ mod tests {
|
||||
primary_key: pk,
|
||||
unique: false,
|
||||
default: None,
|
||||
check: None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -990,6 +994,7 @@ mod tests {
|
||||
primary_key: false,
|
||||
unique: false,
|
||||
default: None,
|
||||
check: None,
|
||||
}],
|
||||
outbound_relationships: Vec::new(),
|
||||
inbound_relationships: Vec::new(),
|
||||
|
||||
Reference in New Issue
Block a user