From c45ac6489bdb3dd665f5c9585d851155285521c6 Mon Sep 17 00:00:00 2001 From: black Date: Mon, 13 Feb 2023 09:05:37 +0800 Subject: [PATCH] fix: raise an error if the value is not addressable --- callbacks/callmethod.go | 4 ++++ tests/hooks_test.go | 20 ++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/callbacks/callmethod.go b/callbacks/callmethod.go index 900f0fcb..0f911d66 100644 --- a/callbacks/callmethod.go +++ b/callbacks/callmethod.go @@ -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) } } } diff --git a/tests/hooks_test.go b/tests/hooks_test.go index 13c54dab..0753dd0b 100644 --- a/tests/hooks_test.go +++ b/tests/hooks_test.go @@ -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") }