We use gorm hooks but we are seeing a problem when a field with type *uuid.UUID is updated with a nil. We expect the value passed to the AfterUpdate() hook to be nil but it is still populated with the original value. Note the database is update with NULL as expected it is the go struct in the AfterUpdate() hook that is incorrect.
This was working with gorm version v1.25.1 but is broken in gorm version 1.25.2. Specifically the breakage occurs with the commit 63534145fda9a2ac9ba703650b1a44da6a03e45e
The problem happens using Updates() with pointer to uuid.UUID
var uuidPtr *uuid.UUID = nil
DB.Model(&p).Updates(map[string]interface{}{"unique_id": uuidPtr}).Error
The problem does not happen in the following scenarios
when a string pointer is used
var stringPtr *string = nil
DB.Model(&p).Updates(map[string]interface{}{"name": stringPtr}).Error
when the uuid.UUID pointer is a structure field
type Product6 struct {
ID uint `gorm:"primarykey"`
Name *string
UniqueId *uuid.UUID
}
p = Product6{ID: p.ID, UniqueId: nil}
DB.Model(&p).Updates(map[string]interface{}{"unique_id": p.UniqueId}).Error
Explain your user case and expected results
We use gorm hooks but we are seeing a problem when a field with type *uuid.UUID is updated with a nil. We expect the value passed to the AfterUpdate() hook to be nil but it is still populated with the original value. Note the database is update with NULL as expected it is the go struct in the AfterUpdate() hook that is incorrect.
This was working with gorm version v1.25.1 but is broken in gorm version 1.25.2. Specifically the breakage occurs with the commit 63534145fda9a2ac9ba703650b1a44da6a03e45e
The problem happens using Updates() with pointer to uuid.UUID
The problem does not happen in the following scenarios
when a string pointer is used
when the uuid.UUID pointer is a structure field
p = Product6{ID: p.ID, UniqueId: nil} DB.Model(&p).Updates(map[string]interface{}{"unique_id": p.UniqueId}).Error
DB.Model(&p).Updates(map[string]interface{}{"unique_id": nil}).Error