fix: raise an error if the value is not addressable

This commit is contained in:
black 2023-02-13 09:05:37 +08:00
parent 85f2d9d546
commit c45ac6489b
2 changed files with 20 additions and 4 deletions

View File

@ -15,12 +15,16 @@ func callMethod(db *gorm.DB, fc func(value interface{}, tx *gorm.DB) bool) {
for i := 0; i < db.Statement.ReflectValue.Len(); i++ {
if value := reflect.Indirect(db.Statement.ReflectValue.Index(i)); value.CanAddr() {
fc(value.Addr().Interface(), tx)
} else {
db.AddError(gorm.ErrInvalidValue)
}
db.Statement.CurDestIndex++
}
case reflect.Struct:
if db.Statement.ReflectValue.CanAddr() {
fc(db.Statement.ReflectValue.Addr().Interface(), tx)
} else {
db.AddError(gorm.ErrInvalidValue)
}
}
}

View File

@ -534,22 +534,34 @@ func TestUpdateCallbacks(t *testing.T) {
p := Product5{Name: "unique_code"}
DB.Model(&Product5{}).Create(&p)
DB.Model(&Product5{}).Where("id", p.ID).Update("name", "update_name_1")
err := DB.Model(&Product5{}).Where("id", p.ID).Update("name", "update_name_1").Error
if err != nil {
t.Fatalf("should update success, but got err %v", err)
}
if beforeUpdateCall != 1 {
t.Fatalf("before update should be called")
}
DB.Model(Product5{}).Where("id", p.ID).Update("name", "update_name_2")
err = DB.Model(Product5{}).Where("id", p.ID).Update("name", "update_name_2").Error
if !errors.Is(err, gorm.ErrInvalidValue) {
t.Fatalf("should got RecordNotFound, but got %v", err)
}
if beforeUpdateCall != 1 {
t.Fatalf("before update should not be called")
}
DB.Model([1]*Product5{&p}).Update("name", "update_name_3")
err = DB.Model([1]*Product5{&p}).Update("name", "update_name_3").Error
if err != nil {
t.Fatalf("should update success, but got err %v", err)
}
if beforeUpdateCall != 2 {
t.Fatalf("before update should be called")
}
DB.Model([1]Product5{p}).Update("name", "update_name_4")
err = DB.Model([1]Product5{p}).Update("name", "update_name_4").Error
if !errors.Is(err, gorm.ErrInvalidValue) {
t.Fatalf("should got RecordNotFound, but got %v", err)
}
if beforeUpdateCall != 2 {
t.Fatalf("before update should not be called")
}