go-gorm / playground

GORM Playground (Please Create PR for this project to report issues)
MIT License
88 stars 666 forks source link

demonstrate gorm AfterUpdate hook failure #747

Open neiledgar opened 4 weeks ago

neiledgar commented 4 weeks ago

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

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

  1. when a string pointer is used

    var stringPtr *string = nil
    DB.Model(&p).Updates(map[string]interface{}{"name": stringPtr}).Error
  2. 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


3.  when nil interface is used

DB.Model(&p).Updates(map[string]interface{}{"unique_id": nil}).Error