Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AfterUpdate hooks fails for nil uuid pointer #7090

Open
neiledgar opened this issue Jun 28, 2024 · 4 comments · May be fixed by #7099
Open

AfterUpdate hooks fails for nil uuid pointer #7090

neiledgar opened this issue Jun 28, 2024 · 4 comments · May be fixed by #7099
Assignees
Labels
type:with reproduction steps with reproduction steps

Comments

@neiledgar
Copy link

GORM Playground Link

go-gorm/playground#747

Description

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 updated 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 a 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
  1. 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
  1. when nil interface is used
DB.Model(&p).Updates(map[string]interface{}{"unique_id": nil}).Error
@github-actions github-actions bot added the type:with reproduction steps with reproduction steps label Jun 28, 2024
omkar-foss added a commit to omkar-foss/gorm that referenced this issue Jul 5, 2024
This PR adds the case to handle the assignment of a nil Ptr value
to a uuid.UUID (resolved as an Array), so that the model object
reflects the correct value after Updates() has completed.
@omkar-foss
Copy link
Contributor

Hey @neiledgar so I checked this out, and upon digging deeper I found that the issue here is that after the completion of Updates(), the model object (&p in your case above) doesn't reflect the new nil value of the *uuid.UUID field, which is why you're unable to see the new nil value in AfterUpdates as well.

So the root cause of this issue is the inconsistency of the model object and not just AfterUpdates. The reason why this is happening is because this condition gets satisfied which simply returns without assigning the nil value, thus leaving the model object with the old value.

I've raised this PR to fix this issue, along with few test cases around the Updates() with map and uuid.UUID. Hope this will be helpful. Thanks.

@neiledgar
Copy link
Author

Hey @omkar-foss. Thank you for the pr/fix. This has fixed the my issue and the playground test now works. I will integrate and test with our system.

@neiledgar
Copy link
Author

Hey @omkar-foss. I can confirm can confirm this fixes my issue having pulled the PR into our system.

Thanks again

@omkar-foss
Copy link
Contributor

@neiledgar Thank you so much for your confirmation that the fix is working well.

The PR is in review now (thanks to @a631807682) and when all concerns are resolved, it may get merged to master soon.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type:with reproduction steps with reproduction steps
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants