refactor: ColumnSpec / AddColumn carry constraint fields (ADR-0029 scaffolding)
Expand ColumnSpec and Command::AddColumn with the four ADR-0029 constraint slots (not_null, unique, default, check), all defaulting off; `Database::add_column` now takes a ColumnSpec. No behaviour change — the grammar to set the fields and the DDL to enforce them land in the following commits. Isolated here so those commits stay readable. Adds ColumnSpec::new for the unconstrained case; 110 call sites updated. 1172 tests pass; clippy clean.
This commit is contained in:
@@ -446,8 +446,7 @@ enum Request {
|
||||
},
|
||||
AddColumn {
|
||||
table: String,
|
||||
column: String,
|
||||
ty: Type,
|
||||
column: ColumnSpec,
|
||||
source: Option<String>,
|
||||
reply: oneshot::Sender<Result<AddColumnResult, DbError>>,
|
||||
},
|
||||
@@ -670,15 +669,13 @@ impl Database {
|
||||
pub async fn add_column(
|
||||
&self,
|
||||
table: String,
|
||||
column: String,
|
||||
ty: Type,
|
||||
column: ColumnSpec,
|
||||
source: Option<String>,
|
||||
) -> Result<AddColumnResult, DbError> {
|
||||
let (reply, recv) = oneshot::channel();
|
||||
self.send(Request::AddColumn {
|
||||
table,
|
||||
column,
|
||||
ty,
|
||||
source,
|
||||
reply,
|
||||
})
|
||||
@@ -1142,7 +1139,6 @@ fn handle_request(conn: &Connection, persistence: Option<&Persistence>, req: Req
|
||||
Request::AddColumn {
|
||||
table,
|
||||
column,
|
||||
ty,
|
||||
source,
|
||||
reply,
|
||||
} => {
|
||||
@@ -1152,7 +1148,6 @@ fn handle_request(conn: &Connection, persistence: Option<&Persistence>, req: Req
|
||||
source.as_deref(),
|
||||
&table,
|
||||
&column,
|
||||
ty,
|
||||
));
|
||||
}
|
||||
Request::DropColumn {
|
||||
@@ -1932,14 +1927,13 @@ fn do_add_column(
|
||||
persistence: Option<&Persistence>,
|
||||
source: Option<&str>,
|
||||
table: &str,
|
||||
column: &str,
|
||||
ty: Type,
|
||||
column: &ColumnSpec,
|
||||
) -> Result<AddColumnResult, DbError> {
|
||||
let auto_generated = matches!(ty, Type::Serial | Type::ShortId);
|
||||
let auto_generated = matches!(column.ty, Type::Serial | Type::ShortId);
|
||||
if !auto_generated {
|
||||
return do_add_plain_column(conn, persistence, source, table, column, ty);
|
||||
return do_add_plain_column(conn, persistence, source, table, column);
|
||||
}
|
||||
do_add_auto_generated_column(conn, persistence, source, table, column, ty)
|
||||
do_add_auto_generated_column(conn, persistence, source, table, column)
|
||||
}
|
||||
|
||||
/// Plain ALTER-TABLE path for non-auto-generated types.
|
||||
@@ -1948,9 +1942,12 @@ fn do_add_plain_column(
|
||||
persistence: Option<&Persistence>,
|
||||
source: Option<&str>,
|
||||
table: &str,
|
||||
column: &str,
|
||||
ty: Type,
|
||||
spec: &ColumnSpec,
|
||||
) -> Result<AddColumnResult, DbError> {
|
||||
// ADR-0029: the constraint DDL suffix is emitted here once
|
||||
// the constraint grammar lands; for now name + type only.
|
||||
let ty = spec.ty;
|
||||
let column = spec.name.as_str();
|
||||
let ddl = format!(
|
||||
"ALTER TABLE {tbl} ADD COLUMN {col} {sqlite_type};",
|
||||
tbl = quote_ident(table),
|
||||
@@ -1994,11 +1991,12 @@ fn do_add_auto_generated_column(
|
||||
persistence: Option<&Persistence>,
|
||||
source: Option<&str>,
|
||||
table: &str,
|
||||
column: &str,
|
||||
ty: Type,
|
||||
spec: &ColumnSpec,
|
||||
) -> Result<AddColumnResult, DbError> {
|
||||
use rusqlite::types::Value as RV;
|
||||
|
||||
let ty = spec.ty;
|
||||
let column = spec.name.as_str();
|
||||
let old_schema = read_schema(conn, table)?;
|
||||
if old_schema.columns.iter().any(|c| c.name == column) {
|
||||
return Err(DbError::Unsupported(format!(
|
||||
@@ -5473,10 +5471,7 @@ mod tests {
|
||||
}
|
||||
|
||||
fn col(name: &str, ty: Type) -> ColumnSpec {
|
||||
ColumnSpec {
|
||||
name: name.to_string(),
|
||||
ty,
|
||||
}
|
||||
ColumnSpec::new(name, ty)
|
||||
}
|
||||
|
||||
/// Convenience: a `serial`-PK table with a single `id` column.
|
||||
@@ -5589,7 +5584,7 @@ mod tests {
|
||||
let db = db();
|
||||
make_id_table(&db, "Customers").await;
|
||||
let result = db
|
||||
.add_column("Customers".to_string(), "Name".to_string(), Type::Text, None)
|
||||
.add_column("Customers".to_string(), ColumnSpec::new("Name".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let desc = &result.description;
|
||||
@@ -5609,7 +5604,7 @@ mod tests {
|
||||
// datetime, decimal — all backed by TEXT).
|
||||
make_id_table(&db, "T").await;
|
||||
for ty in [Type::Date, Type::DateTime, Type::Decimal, Type::ShortId] {
|
||||
db.add_column("T".to_string(), format!("c_{ty}"), ty, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new(format!("c_{ty}"), ty), None)
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
@@ -5671,7 +5666,7 @@ mod tests {
|
||||
make_id_table(&db, "T").await;
|
||||
for ty in [Type::Text, Type::Int, Type::Real, Type::Bool, Type::ShortId] {
|
||||
let col_name = format!("c_{ty}");
|
||||
db.add_column("T".to_string(), col_name.clone(), ty, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new(col_name.clone(), ty), None)
|
||||
.await
|
||||
.unwrap_or_else(|e| panic!("type {ty} failed: {e}"));
|
||||
}
|
||||
@@ -5688,7 +5683,7 @@ mod tests {
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
let result = db
|
||||
.add_column("T".to_string(), "code".to_string(), Type::Serial, None)
|
||||
.add_column("T".to_string(), ColumnSpec::new("code".to_string(), Type::Serial), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let code = result
|
||||
@@ -5712,7 +5707,7 @@ mod tests {
|
||||
/// (text) and insert N rows, populating just `Name`.
|
||||
async fn make_table_with_n_rows(db: &Database, table: &str, count: usize) {
|
||||
make_id_table(db, table).await;
|
||||
db.add_column(table.to_string(), "Name".to_string(), Type::Text, None)
|
||||
db.add_column(table.to_string(), ColumnSpec::new("Name".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
for i in 0..count {
|
||||
@@ -5732,7 +5727,7 @@ mod tests {
|
||||
let db = db();
|
||||
make_table_with_n_rows(&db, "T", 3).await;
|
||||
let result = db
|
||||
.add_column("T".to_string(), "seq".to_string(), Type::Serial, None)
|
||||
.add_column("T".to_string(), ColumnSpec::new("seq".to_string(), Type::Serial), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let seq = result
|
||||
@@ -5765,7 +5760,7 @@ mod tests {
|
||||
let db = db();
|
||||
make_table_with_n_rows(&db, "T", 3).await;
|
||||
let result = db
|
||||
.add_column("T".to_string(), "tag".to_string(), Type::ShortId, None)
|
||||
.add_column("T".to_string(), ColumnSpec::new("tag".to_string(), Type::ShortId), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let tag = result
|
||||
@@ -5800,7 +5795,7 @@ mod tests {
|
||||
// columns continue to use SQLite's rowid alias.
|
||||
let db = db();
|
||||
make_table_with_n_rows(&db, "T", 0).await;
|
||||
db.add_column("T".to_string(), "seq".to_string(), Type::Serial, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("seq".to_string(), Type::Serial), None)
|
||||
.await
|
||||
.unwrap();
|
||||
// Insert three rows providing only `Name`. The seq
|
||||
@@ -5833,7 +5828,7 @@ mod tests {
|
||||
// accepted (ADR-0018 Resolution 2).
|
||||
let db = db();
|
||||
make_table_with_n_rows(&db, "T", 0).await;
|
||||
db.add_column("T".to_string(), "seq".to_string(), Type::Serial, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("seq".to_string(), Type::Serial), None)
|
||||
.await
|
||||
.unwrap();
|
||||
// Insert with explicit seq=100.
|
||||
@@ -5872,7 +5867,7 @@ mod tests {
|
||||
// confirming the engine refuses.
|
||||
let db = db();
|
||||
make_table_with_n_rows(&db, "T", 2).await;
|
||||
db.add_column("T".to_string(), "seq".to_string(), Type::Serial, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("seq".to_string(), Type::Serial), None)
|
||||
.await
|
||||
.unwrap();
|
||||
// Attempt to UPDATE one row to have the same `seq` value
|
||||
@@ -5928,7 +5923,7 @@ mod tests {
|
||||
async fn add_column_to_missing_table_returns_no_such_table() {
|
||||
let db = db();
|
||||
let err = db
|
||||
.add_column("Ghost".to_string(), "x".to_string(), Type::Text, None)
|
||||
.add_column("Ghost".to_string(), ColumnSpec::new("x".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap_err();
|
||||
match err {
|
||||
@@ -5943,7 +5938,7 @@ mod tests {
|
||||
async fn drop_column_removes_column_and_data() {
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Score".to_string(), Type::Int, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Score".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.insert(
|
||||
@@ -5993,12 +5988,7 @@ mod tests {
|
||||
// Customers(id PK) ← Orders(cust_id FK)
|
||||
make_id_table(&db, "Customers").await;
|
||||
make_id_table(&db, "Orders").await;
|
||||
db.add_column(
|
||||
"Orders".to_string(),
|
||||
"cust_id".to_string(),
|
||||
Type::Int,
|
||||
None,
|
||||
)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("cust_id".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_relationship(
|
||||
@@ -6043,7 +6033,7 @@ mod tests {
|
||||
/// something indexable.
|
||||
async fn make_indexable_table(db: &Database, name: &str) {
|
||||
make_id_table(db, name).await;
|
||||
db.add_column(name.to_string(), "Email".to_string(), Type::Text, None)
|
||||
db.add_column(name.to_string(), ColumnSpec::new("Email".to_string(), Type::Text), None)
|
||||
.await
|
||||
.expect("add Email column");
|
||||
}
|
||||
@@ -6081,10 +6071,10 @@ mod tests {
|
||||
async fn add_index_composite_auto_name_joins_columns() {
|
||||
let db = db();
|
||||
make_id_table(&db, "Orders").await;
|
||||
db.add_column("Orders".to_string(), "CustId".to_string(), Type::Int, None)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("CustId".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_column("Orders".to_string(), "Day".to_string(), Type::Date, None)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("Day".to_string(), Type::Date), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let desc = db
|
||||
@@ -6107,7 +6097,7 @@ mod tests {
|
||||
async fn add_index_rejects_duplicate_name() {
|
||||
let db = db();
|
||||
make_indexable_table(&db, "Customers").await;
|
||||
db.add_column("Customers".to_string(), "Nick".to_string(), Type::Text, None)
|
||||
db.add_column("Customers".to_string(), ColumnSpec::new("Nick".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_index(
|
||||
@@ -6306,7 +6296,7 @@ mod tests {
|
||||
// unrelated column must survive the rebuild (ADR-0025).
|
||||
let db = db();
|
||||
make_indexable_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Score".to_string(), Type::Int, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Score".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_index(
|
||||
@@ -6339,7 +6329,7 @@ mod tests {
|
||||
async fn rename_column_updates_schema_and_metadata() {
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Old".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Old".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let desc = db
|
||||
@@ -6358,12 +6348,7 @@ mod tests {
|
||||
let db = db();
|
||||
make_id_table(&db, "Customers").await;
|
||||
make_id_table(&db, "Orders").await;
|
||||
db.add_column(
|
||||
"Orders".to_string(),
|
||||
"cust_id".to_string(),
|
||||
Type::Int,
|
||||
None,
|
||||
)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("cust_id".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_relationship(
|
||||
@@ -6423,10 +6408,10 @@ mod tests {
|
||||
async fn rename_column_refuses_collision() {
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "A".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("A".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_column("T".to_string(), "B".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("B".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let err = db
|
||||
@@ -6440,7 +6425,7 @@ mod tests {
|
||||
async fn rename_column_refuses_identity_rename() {
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "A".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("A".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let err = db
|
||||
@@ -6454,7 +6439,7 @@ mod tests {
|
||||
async fn change_column_type_works_for_compatible_data() {
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Score".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Score".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
// Insert numeric-looking strings.
|
||||
@@ -6523,12 +6508,7 @@ mod tests {
|
||||
let db = db();
|
||||
make_id_table(&db, "Customers").await;
|
||||
make_id_table(&db, "Orders").await;
|
||||
db.add_column(
|
||||
"Orders".to_string(),
|
||||
"cust_id".to_string(),
|
||||
Type::Int,
|
||||
None,
|
||||
)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("cust_id".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_relationship(
|
||||
@@ -6572,12 +6552,7 @@ mod tests {
|
||||
let db = db();
|
||||
make_id_table(&db, "Customers").await;
|
||||
make_id_table(&db, "Orders").await;
|
||||
db.add_column(
|
||||
"Orders".to_string(),
|
||||
"cust_id".to_string(),
|
||||
Type::Int,
|
||||
None,
|
||||
)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("cust_id".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_relationship(
|
||||
@@ -6613,7 +6588,7 @@ mod tests {
|
||||
// table.
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Score".to_string(), Type::Real, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Score".to_string(), Type::Real), None)
|
||||
.await
|
||||
.unwrap();
|
||||
for v in ["3.14", "2.71"] {
|
||||
@@ -6664,7 +6639,7 @@ mod tests {
|
||||
// the lossy count.
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Score".to_string(), Type::Real, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Score".to_string(), Type::Real), None)
|
||||
.await
|
||||
.unwrap();
|
||||
for v in ["3.14", "2.71", "5.0"] {
|
||||
@@ -6699,7 +6674,7 @@ mod tests {
|
||||
// does NOT help (per ADR-0017 §5 / §2 step 3).
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Note".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Note".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
for v in ["abc", "123", "xyz"] {
|
||||
@@ -6748,7 +6723,7 @@ mod tests {
|
||||
// [client-side] note is expected.
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Flag".to_string(), Type::Int, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Flag".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
for v in ["0", "1", "0"] {
|
||||
@@ -6796,7 +6771,7 @@ mod tests {
|
||||
// help (incompatible is not lossy).
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Flag".to_string(), Type::Int, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Flag".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
for v in ["0", "1", "2"] {
|
||||
@@ -6848,7 +6823,7 @@ mod tests {
|
||||
// engine coercion; the note is suppressed.
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Score".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Score".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
for v in ["1", "2", "3"] {
|
||||
@@ -6933,7 +6908,7 @@ mod tests {
|
||||
async fn change_column_type_blob_target_refused_statically() {
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Note".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Note".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let err = db
|
||||
@@ -6956,12 +6931,7 @@ mod tests {
|
||||
let db = db();
|
||||
make_id_table(&db, "Customers").await;
|
||||
make_id_table(&db, "Orders").await;
|
||||
db.add_column(
|
||||
"Orders".to_string(),
|
||||
"cust_id".to_string(),
|
||||
Type::Int,
|
||||
None,
|
||||
)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("cust_id".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_relationship(
|
||||
@@ -7004,7 +6974,7 @@ mod tests {
|
||||
// note, and the structural change goes through.
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "Note".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("Note".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = db
|
||||
@@ -7037,7 +7007,7 @@ mod tests {
|
||||
// existing values are preserved.
|
||||
let db = db();
|
||||
make_table_with_n_rows(&db, "T", 0).await;
|
||||
db.add_column("T".to_string(), "code".to_string(), Type::Int, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("code".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
// Insert a few rows with explicit code values.
|
||||
@@ -7087,7 +7057,7 @@ mod tests {
|
||||
// uniqueness-collision diagnostic.
|
||||
let db = db();
|
||||
make_table_with_n_rows(&db, "T", 0).await;
|
||||
db.add_column("T".to_string(), "code".to_string(), Type::Int, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("code".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
// Two rows with the same code.
|
||||
@@ -7129,7 +7099,7 @@ mod tests {
|
||||
// to route through int.
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "A".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("A".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let err = db
|
||||
@@ -7160,7 +7130,7 @@ mod tests {
|
||||
// [client-side] note reports the auto-fill count.
|
||||
let db = db();
|
||||
make_table_with_n_rows(&db, "T", 0).await;
|
||||
db.add_column("T".to_string(), "code".to_string(), Type::Int, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("code".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
// Three rows: one with code=5, two with NULL.
|
||||
@@ -7216,7 +7186,7 @@ mod tests {
|
||||
// text column get fresh shortids (ADR-0018 §3).
|
||||
let db = db();
|
||||
make_table_with_n_rows(&db, "T", 0).await;
|
||||
db.add_column("T".to_string(), "tag".to_string(), Type::Text, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("tag".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
// One row with a valid shortid value, two with NULL.
|
||||
@@ -7270,12 +7240,7 @@ mod tests {
|
||||
let db = db();
|
||||
make_id_table(&db, "Customers").await;
|
||||
make_id_table(&db, "Orders").await;
|
||||
db.add_column(
|
||||
"Orders".to_string(),
|
||||
"cust_id".to_string(),
|
||||
Type::Int,
|
||||
None,
|
||||
)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("cust_id".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_relationship(
|
||||
@@ -7308,7 +7273,7 @@ mod tests {
|
||||
async fn change_column_type_no_op_to_same_type_errors() {
|
||||
let db = db();
|
||||
make_id_table(&db, "T").await;
|
||||
db.add_column("T".to_string(), "A".to_string(), Type::Int, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("A".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let err = db
|
||||
@@ -7345,7 +7310,7 @@ mod tests {
|
||||
None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_column("Orders".to_string(), "CustId".to_string(), Type::Int, None)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("CustId".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
@@ -7517,7 +7482,7 @@ mod tests {
|
||||
.await
|
||||
.unwrap();
|
||||
// Wrong type — text instead of int.
|
||||
db.add_column("Orders".to_string(), "CustId".to_string(), Type::Text, None)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("CustId".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
@@ -7561,7 +7526,7 @@ mod tests {
|
||||
None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_column("Orders".to_string(), "CustName".to_string(), Type::Text, None)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("CustName".to_string(), Type::Text), None)
|
||||
.await
|
||||
.unwrap();
|
||||
let err = db
|
||||
@@ -7690,7 +7655,7 @@ mod tests {
|
||||
async fn add_relationship_with_duplicate_name_errors() {
|
||||
let db = db();
|
||||
customers_orders_setup(&db).await;
|
||||
db.add_column("Orders".to_string(), "OtherCust".to_string(), Type::Int, None)
|
||||
db.add_column("Orders".to_string(), ColumnSpec::new("OtherCust".to_string(), Type::Int), None)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_relationship(
|
||||
@@ -8604,7 +8569,7 @@ mod tests {
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_column("T".to_string(), "seq".to_string(), Type::Serial, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("seq".to_string(), Type::Serial), None)
|
||||
.await
|
||||
.unwrap();
|
||||
// Read the persisted YAML straight from disk.
|
||||
@@ -8647,7 +8612,7 @@ mod tests {
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_column("T".to_string(), "seq".to_string(), Type::Serial, None)
|
||||
db.add_column("T".to_string(), ColumnSpec::new("seq".to_string(), Type::Serial), None)
|
||||
.await
|
||||
.unwrap();
|
||||
// Tear down the .db file and rebuild from yaml + csvs.
|
||||
|
||||
Reference in New Issue
Block a user