Skip to content

Commit 40b20cd

Browse files
committed
fix: only handle pointer-based driver.Valuer implementations
1 parent 0c29af6 commit 40b20cd

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

model_table_has_many.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ func modelKey(key []interface{}, strct reflect.Value, fields []*schema.Field) []
149149
return key
150150
}
151151

152+
var driverValuerType = reflect.TypeFor[driver.Valuer]()
153+
152154
// indirectAsKey return the field value dereferencing the pointer if necessary.
153155
// The value is then used as a map key.
154156
func indirectAsKey(field reflect.Value) interface{} {
@@ -173,9 +175,13 @@ func indirectAsKey(field reflect.Value) interface{} {
173175
return nil
174176
}
175177

176-
if valuer, ok := field.Interface().(driver.Valuer); ok {
177-
v, _ := valuer.Value() // No need to record logs, will panic later
178-
return v
178+
// Only handle pointer-based driver.Valuer implementations
179+
// compatible *ULID, see https://github.com/uptrace/bun/issues/1107
180+
if !field.Type().Elem().Implements(driverValuerType) {
181+
if valuer, ok := field.Interface().(driver.Valuer); ok {
182+
v, _ := valuer.Value() // No need to record logs, will panic later
183+
return v
184+
}
179185
}
180186

181187
return field.Elem().Interface()

0 commit comments

Comments
 (0)