Fix bug of ToDB when update on a nil pointer #1786

Merged
lunny merged 6 commits from lunny/fix_todb_upate into master 2020-09-08 15:40:29 +00:00
2 changed files with 42 additions and 1 deletions
Showing only changes of commit 4b9d2d6974 - Show all commits

View File

@ -1350,3 +1350,44 @@ func TestUpdateMultiplePK(t *testing.T) {
_, err = testEngine.ID(&MySlice{test.Id, test.Name}).Update(test)
assert.NoError(t, err)
}
type TestFieldType1 struct {
cb []byte
}
func (a *TestFieldType1) FromDB(src []byte) error {
a.cb = src
return nil
}
func (a TestFieldType1) ToDB() ([]byte, error) {
return a.cb, nil
}
type TestTable1 struct {
Id int64
Field1 *TestFieldType1 `xorm:"text"`
UpdateTime time.Time
}
func TestNilFromDB(t *testing.T) {
assert.NoError(t, PrepareEngine())
assertSync(t, new(TestTable1))
cnt, err := testEngine.Insert(&TestTable1{
Field1: &TestFieldType1{
cb: []byte("string"),
},
UpdateTime: time.Now(),
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
cnt, err = testEngine.Update(TestTable1{
UpdateTime: time.Now(),
}, TestTable1{
Id: 1,
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
}

View File

@ -130,7 +130,7 @@ func (statement *Statement) BuildUpdates(tableValue reflect.Value,
}
}
if structConvert, ok := fieldValue.Interface().(convert.Conversion); ok {
if structConvert, ok := fieldValue.Interface().(convert.Conversion); ok && !fieldValue.IsNil() {
data, err := structConvert.ToDB()
if err != nil {
return nil, nil, err