Skip to content

Commit dc3ce13

Browse files
committed
Add default issue
1 parent 51bd8c5 commit dc3ce13

5 files changed

Lines changed: 73 additions & 0 deletions

crates/vespertide-query/src/sql/helpers.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,17 @@ pub fn build_sea_column_def_with_table(
264264
converted
265265
};
266266

267+
// SQLite requires DEFAULT (expr) for expressions containing function calls.
268+
// Wrapping in parentheses is always safe for all backends.
269+
let final_default = if *backend == DatabaseBackend::Sqlite
270+
&& final_default.contains('(')
271+
&& !final_default.starts_with('(')
272+
{
273+
format!("({})", final_default)
274+
} else {
275+
final_default
276+
};
277+
267278
col.default(Into::<SimpleExpr>::into(sea_query::Expr::cust(
268279
final_default,
269280
)));

crates/vespertide-query/src/sql/mod.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,6 +1389,53 @@ mod tests {
13891389
});
13901390
}
13911391

1392+
#[rstest]
1393+
#[case::create_table_func_default_postgres(DatabaseBackend::Postgres)]
1394+
#[case::create_table_func_default_mysql(DatabaseBackend::MySql)]
1395+
#[case::create_table_func_default_sqlite(DatabaseBackend::Sqlite)]
1396+
fn test_create_table_with_function_default(#[case] backend: DatabaseBackend) {
1397+
// SQLite requires DEFAULT (expr) for function-call defaults.
1398+
// This test ensures parentheses are added for SQLite.
1399+
let action = MigrationAction::CreateTable {
1400+
table: "users".into(),
1401+
columns: vec![
1402+
ColumnDef {
1403+
name: "id".into(),
1404+
r#type: ColumnType::Simple(SimpleColumnType::Uuid),
1405+
nullable: false,
1406+
default: Some("gen_random_uuid()".into()),
1407+
comment: None,
1408+
primary_key: None,
1409+
unique: None,
1410+
index: None,
1411+
foreign_key: None,
1412+
},
1413+
ColumnDef {
1414+
name: "created_at".into(),
1415+
r#type: ColumnType::Simple(SimpleColumnType::Timestamptz),
1416+
nullable: false,
1417+
default: Some("now()".into()),
1418+
comment: None,
1419+
primary_key: None,
1420+
unique: None,
1421+
index: None,
1422+
foreign_key: None,
1423+
},
1424+
],
1425+
constraints: vec![],
1426+
};
1427+
let result = build_action_queries(&backend, &action, &[]).unwrap();
1428+
let sql = result
1429+
.iter()
1430+
.map(|q| q.build(backend))
1431+
.collect::<Vec<_>>()
1432+
.join(";\n");
1433+
1434+
with_settings!({ snapshot_suffix => format!("create_table_func_default_{:?}", backend) }, {
1435+
assert_snapshot!(sql);
1436+
});
1437+
}
1438+
13921439
#[rstest]
13931440
#[case::delete_enum_column_postgres(DatabaseBackend::Postgres)]
13941441
#[case::delete_enum_column_mysql(DatabaseBackend::MySql)]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: crates/vespertide-query/src/sql/mod.rs
3+
expression: sql
4+
---
5+
CREATE TABLE `users` ( `id` binary(16) NOT NULL DEFAULT (UUID()), `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP )
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: crates/vespertide-query/src/sql/mod.rs
3+
expression: sql
4+
---
5+
CREATE TABLE "users" ( "id" uuid NOT NULL DEFAULT gen_random_uuid(), "created_at" timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP )
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: crates/vespertide-query/src/sql/mod.rs
3+
expression: sql
4+
---
5+
CREATE TABLE "users" ( "id" uuid_text NOT NULL DEFAULT (lower(hex(randomblob(16)))), "created_at" timestamp_with_timezone_text NOT NULL DEFAULT CURRENT_TIMESTAMP )

0 commit comments

Comments
 (0)