From 24540c9e233bdb98e9ab491c315710a5e7c4d0ed Mon Sep 17 00:00:00 2001 From: CyJaySong Date: Sat, 28 Oct 2023 09:49:51 +0800 Subject: [PATCH] Fix the issue of incorrect insertion of data in non UTC time zone zero for numeric types --- dialects/time.go | 4 ++-- internal/utils/zero.go | 4 ++-- tests/session_insert_test.go | 38 ++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/dialects/time.go b/dialects/time.go index cdc896be..a20b5950 100644 --- a/dialects/time.go +++ b/dialects/time.go @@ -7,17 +7,17 @@ package dialects import ( "strings" "time" + "xorm.io/xorm/internal/utils" "xorm.io/xorm/schemas" ) // FormatColumnTime format column time func FormatColumnTime(dialect Dialect, dbLocation *time.Location, col *schemas.Column, t time.Time) (interface{}, error) { - if t.IsZero() { + if utils.IsTimeZero(t) { if col.Nullable { return nil, nil } - if col.SQLType.IsNumeric() { return 0, nil } diff --git a/internal/utils/zero.go b/internal/utils/zero.go index 007e3c33..22c24071 100644 --- a/internal/utils/zero.go +++ b/internal/utils/zero.go @@ -146,6 +146,6 @@ const ( // IsTimeZero return true if a time is zero func IsTimeZero(t time.Time) bool { - return t.IsZero() || t.Format("2006-01-02 15:04:05") == ZeroTime0 || - t.Format("2006-01-02 15:04:05") == ZeroTime1 + return t.IsZero() || t.Format("2006-01-02 15:04:05.999999999") == ZeroTime0 || + t.Format("2006-01-02 15:04:05.999999999") == ZeroTime1 } diff --git a/tests/session_insert_test.go b/tests/session_insert_test.go index dd3e8405..e0dc73b8 100644 --- a/tests/session_insert_test.go +++ b/tests/session_insert_test.go @@ -1249,6 +1249,44 @@ func TestInsertNotDeleted(t *testing.T) { assert.Equal(t, v4.DeletedAt.In(testEngine.GetTZDatabase()).Format("2006-01-02 15:04:05"), zeroTime.Format("2006-01-02 15:04:05")) } +func TestInsertNotDeletedNum(t *testing.T) { + assert.NoError(t, PrepareEngine()) + type TestInsertNotDeletedStructNotRight struct { + ID uint64 `xorm:"'ID' pk autoincr"` + DeletedAt int64 `xorm:"'DELETED_AT' deleted notnull INT(11)"` + } + // notnull tag will be ignored + err := testEngine.Sync(new(TestInsertNotDeletedStructNotRight)) + assert.NoError(t, err) + + type TestInsertNotDeletedStruct struct { + ID uint64 `xorm:"'ID' pk autoincr"` + DeletedAt int64 `xorm:"'DELETED_AT' deleted INT(11)"` + } + + assert.NoError(t, testEngine.Sync(new(TestInsertNotDeletedStruct))) + + var v1 TestInsertNotDeletedStructNotRight + _, err = testEngine.Insert(&v1) + assert.NoError(t, err) + + var v2 TestInsertNotDeletedStructNotRight + has, err := testEngine.Get(&v2) + assert.NoError(t, err) + assert.True(t, has) + assert.Equal(t, v2.DeletedAt, int64(0)) + + var v3 TestInsertNotDeletedStruct + _, err = testEngine.Insert(&v3) + assert.NoError(t, err) + + var v4 TestInsertNotDeletedStruct + has, err = testEngine.Get(&v4) + assert.NoError(t, err) + assert.True(t, has) + assert.Equal(t, v4.DeletedAt, int64(0)) +} + type MyAutoTimeFields1 struct { Id int64 Dt time.Time `xorm:"created DATETIME"`