fix: preserve legacy time casts throughout index migrations

This commit is contained in:
Yvan
2026-11-06 01:44:57 +08:00
parent bf67626830
commit 7c8148a5e5
3 changed files with 65 additions and 5 deletions
@@ -221,6 +221,47 @@ func TestMySQLRegistrationIndexPreservesCastAndUsesRange(t *testing.T) {
}
}
func TestMySQLLaterRegistrationIndexesPreserveMalformedLegacyTimes(t *testing.T) {
db := openRehearsalMySQL(t)
for _, sql := range []string{
"CREATE TABLE tab_user(id INT,source_db VARCHAR(10),puid INT,promote_id INT,register_time VARCHAR(20),PRIMARY KEY(id,source_db))",
"INSERT INTO tab_user VALUES(1,'lx',0,10,''),(2,'lx',0,10,'bad'),(3,'lx',0,10,'1793635200 ')",
} {
if err := db.Exec(sql).Error; err != nil {
t.Fatal(err)
}
}
pool, _ := db.DB()
pool.SetMaxOpenConns(1)
var mode string
if err := db.Raw("SELECT @@session.sql_mode").Scan(&mode).Error; err != nil {
t.Fatal(err)
}
if err := migrateRegistrationIndex(db); err != nil {
t.Fatal(err)
}
indexes := []businessQueryIndex{{"tab_user", "idx_alert_user_window", []string{"source_db", "promote_id", "sw_register_time_unix", "puid"}}}
for i := 0; i < 2; i++ {
if err := migrateQueryIndexes(db, indexes); err != nil {
t.Fatal(err)
}
}
var after string
if err := db.Raw("SELECT @@session.sql_mode").Scan(&after).Error; err != nil || mode != after {
t.Fatalf("sql_mode changed: %v", err)
}
var values []string
if err := db.Table("tab_user").Order("id").Pluck("register_time", &values).Error; err != nil || strings.Join(values, "|") != "|bad|1793635200 " {
t.Fatalf("original strings changed: %q %v", values, err)
}
if err := migrateQueryIndexes(db, []businessQueryIndex{{"tab_user", "idx_invalid_column", []string{"missing_column"}}}); err == nil {
t.Fatal("invalid DDL unexpectedly succeeded")
}
if err := db.Raw("SELECT @@session.sql_mode").Scan(&after).Error; err != nil || mode != after {
t.Fatalf("failed DDL did not restore sql_mode: %v", err)
}
}
func TestMySQLChannelCreationSerializesAccount(t *testing.T) {
db := openRehearsalMySQL(t)
if err := db.AutoMigrate(&platformChannelPO{}, &channelSettlementPO{}); err != nil {