Skip to content

Commit 9096927

Browse files
authored
Merge pull request #71 from dev-five-git/fix-upper-case
Fix uppercase issue
2 parents 3c439d9 + 545ea18 commit 9096927

7 files changed

Lines changed: 107 additions & 16 deletions
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"changes":{"crates/vespertide-naming/Cargo.toml":"Patch","crates/vespertide-query/Cargo.toml":"Patch","crates/vespertide-loader/Cargo.toml":"Patch","crates/vespertide-config/Cargo.toml":"Patch","crates/vespertide-core/Cargo.toml":"Patch","crates/vespertide-exporter/Cargo.toml":"Patch","crates/vespertide-cli/Cargo.toml":"Patch","crates/vespertide-planner/Cargo.toml":"Patch","crates/vespertide-macro/Cargo.toml":"Patch","crates/vespertide/Cargo.toml":"Patch"},"note":"Fix upper issue","date":"2026-01-15T13:48:47.690192600Z"}

Cargo.lock

Lines changed: 10 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,4 +657,64 @@ mod tests {
657657
assert_snapshot!(sql);
658658
});
659659
}
660+
661+
/// Test creating a table with timestamp column and NOW() default
662+
/// SQLite should convert NOW() to CURRENT_TIMESTAMP
663+
#[rstest]
664+
#[case::timestamp_now_default_postgres(DatabaseBackend::Postgres)]
665+
#[case::timestamp_now_default_mysql(DatabaseBackend::MySql)]
666+
#[case::timestamp_now_default_sqlite(DatabaseBackend::Sqlite)]
667+
fn test_create_table_with_timestamp_now_default(#[case] backend: DatabaseBackend) {
668+
let columns = vec![
669+
ColumnDef {
670+
name: "id".into(),
671+
r#type: ColumnType::Simple(SimpleColumnType::BigInt),
672+
nullable: false,
673+
default: None,
674+
comment: None,
675+
primary_key: None,
676+
unique: None,
677+
index: None,
678+
foreign_key: None,
679+
},
680+
ColumnDef {
681+
name: "created_at".into(),
682+
r#type: ColumnType::Simple(SimpleColumnType::Timestamptz),
683+
nullable: false,
684+
default: Some("NOW()".into()), // uppercase NOW()
685+
comment: None,
686+
primary_key: None,
687+
unique: None,
688+
index: None,
689+
foreign_key: None,
690+
},
691+
];
692+
693+
let result = build_create_table(&backend, "events", &columns, &[]);
694+
assert!(result.is_ok(), "build_create_table failed: {:?}", result);
695+
let queries = result.unwrap();
696+
let sql = queries
697+
.iter()
698+
.map(|q| q.build(backend))
699+
.collect::<Vec<String>>()
700+
.join("\n");
701+
702+
// SQLite should NOT have NOW() - it should be converted to CURRENT_TIMESTAMP
703+
if matches!(backend, DatabaseBackend::Sqlite) {
704+
assert!(
705+
!sql.contains("NOW()"),
706+
"SQLite should not contain NOW(), got: {}",
707+
sql
708+
);
709+
assert!(
710+
sql.contains("CURRENT_TIMESTAMP"),
711+
"SQLite should use CURRENT_TIMESTAMP, got: {}",
712+
sql
713+
);
714+
}
715+
716+
with_settings!({ snapshot_suffix => format!("create_table_with_timestamp_now_default_{:?}", backend) }, {
717+
assert_snapshot!(sql);
718+
});
719+
}
660720
}

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,19 +167,31 @@ pub fn reference_action_sql(action: &ReferenceAction) -> &'static str {
167167

168168
/// Convert a default value string to the appropriate backend-specific expression
169169
pub fn convert_default_for_backend(default: &str, backend: &DatabaseBackend) -> String {
170-
match default {
171-
"gen_random_uuid()" | "UUID()" | "lower(hex(randomblob(16)))" => match backend {
170+
let lower = default.to_lowercase();
171+
172+
// UUID generation functions
173+
if lower == "gen_random_uuid()" || lower == "uuid()" || lower == "lower(hex(randomblob(16)))" {
174+
return match backend {
172175
DatabaseBackend::Postgres => "gen_random_uuid()".to_string(),
173176
DatabaseBackend::MySql => "(UUID())".to_string(),
174177
DatabaseBackend::Sqlite => "lower(hex(randomblob(16)))".to_string(),
175-
},
176-
"current_timestamp()" | "now()" | "CURRENT_TIMESTAMP" => match backend {
178+
};
179+
}
180+
181+
// Timestamp functions (case-insensitive)
182+
if lower == "current_timestamp()"
183+
|| lower == "now()"
184+
|| lower == "current_timestamp"
185+
|| lower == "getdate()"
186+
{
187+
return match backend {
177188
DatabaseBackend::Postgres => "CURRENT_TIMESTAMP".to_string(),
178189
DatabaseBackend::MySql => "CURRENT_TIMESTAMP".to_string(),
179190
DatabaseBackend::Sqlite => "CURRENT_TIMESTAMP".to_string(),
180-
},
181-
other => other.to_string(),
191+
};
182192
}
193+
194+
default.to_string()
183195
}
184196

185197
/// Check if the column type is an enum type
@@ -492,6 +504,9 @@ mod tests {
492504
#[case::now_postgres("now()", DatabaseBackend::Postgres, "CURRENT_TIMESTAMP")]
493505
#[case::now_mysql("now()", DatabaseBackend::MySql, "CURRENT_TIMESTAMP")]
494506
#[case::now_sqlite("now()", DatabaseBackend::Sqlite, "CURRENT_TIMESTAMP")]
507+
#[case::now_upper_postgres("NOW()", DatabaseBackend::Postgres, "CURRENT_TIMESTAMP")]
508+
#[case::now_upper_mysql("NOW()", DatabaseBackend::MySql, "CURRENT_TIMESTAMP")]
509+
#[case::now_upper_sqlite("NOW()", DatabaseBackend::Sqlite, "CURRENT_TIMESTAMP")]
495510
#[case::current_timestamp_upper_postgres(
496511
"CURRENT_TIMESTAMP",
497512
DatabaseBackend::Postgres,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: crates/vespertide-query/src/sql/create_table.rs
3+
expression: sql
4+
---
5+
CREATE TABLE `events` ( `id` bigint NOT NULL, `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/create_table.rs
3+
expression: sql
4+
---
5+
CREATE TABLE "events" ( "id" bigint NOT NULL, "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/create_table.rs
3+
expression: sql
4+
---
5+
CREATE TABLE "events" ( "id" bigint NOT NULL, "created_at" timestamp_with_timezone_text NOT NULL DEFAULT CURRENT_TIMESTAMP )

0 commit comments

Comments
 (0)