From 589acfff865a1385877458c888fb97473d381966 Mon Sep 17 00:00:00 2001 From: tylerthail2019 Date: Tue, 2 Apr 2024 04:26:41 +0000 Subject: [PATCH] Add includeNil requiredField Check when custom struct field IsZero in Update method. (#2438) Add includeNil requiredField Check when custom struct field IsZero in Update method. Co-authored-by: tyler Co-authored-by: Lunny Xiao Reviewed-on: https://gitea.com/xorm/xorm/pulls/2438 Reviewed-by: Lunny Xiao Co-authored-by: tylerthail2019 Co-committed-by: tylerthail2019 --- internal/statements/update.go | 2 +- tests/types_test.go | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/internal/statements/update.go b/internal/statements/update.go index 34c6111a..dd490aef 100644 --- a/internal/statements/update.go +++ b/internal/statements/update.go @@ -126,7 +126,7 @@ func (statement *Statement) BuildUpdates(tableValue reflect.Value, if fieldValue.CanAddr() { if structConvert, ok := fieldValue.Addr().Interface().(convert.Conversion); ok { - if utils.IsZero(fieldValue.Interface()) { + if !includeNil && !requiredField && utils.IsZero(fieldValue.Interface()) { continue } data, err := structConvert.ToDB() diff --git a/tests/types_test.go b/tests/types_test.go index bb07aeaf..9079d34b 100644 --- a/tests/types_test.go +++ b/tests/types_test.go @@ -633,6 +633,9 @@ func (d *ZDecimal) FromDB(data []byte) error { } func (d ZDecimal) ToDB() ([]byte, error) { + if d.value == nil { + return []byte("0"), nil + } return []byte(fmt.Sprintf("%d", (d.value).Int64())), nil } @@ -688,6 +691,23 @@ func TestZDecimal(t *testing.T) { assert.NoError(t, err) assert.True(t, has) assert.Equal(t, "test2", "test2") - assert.False(t, m.Amount.IsZero()) - assert.Equal(t, "10000000000000000", m.Amount.String()) + assert.False(t, m2.Amount.IsZero()) + assert.Equal(t, "10000000000000000", m2.Amount.String()) + + _, err = testEngine.AllCols().Update(&ZMyMoney{ + Id: 1, + Account: "test3", + }) + assert.NoError(t, err) + + var m3 = ZMyMoney{ + Id: 1, + } + has, err = testEngine.Get(&m3) + + assert.NoError(t, err) + assert.True(t, has) + assert.Equal(t, "test3", "test3") + assert.True(t, m3.Amount.IsZero()) + assert.Equal(t, "0", m3.Amount.String()) }