Skip to content

Commit 7d13e26

Browse files
committed
fixed
1 parent c3277cb commit 7d13e26

File tree

2 files changed

+69
-9
lines changed

2 files changed

+69
-9
lines changed

internal/bind/params.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,6 @@ func toType(v interface{}) (_ types.Type, err error) { //nolint:funlen
164164
//nolint:gocyclo,funlen
165165
func toValue(v interface{}) (_ value.Value, err error) {
166166
if x, ok := asUUID(v); ok {
167-
if x == nil {
168-
return value.NullValue(types.UUID), nil
169-
}
170-
171167
return x, nil
172168
}
173169

internal/bind/params_test.go

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package bind
33
import (
44
"database/sql"
55
"database/sql/driver"
6+
"reflect"
67
"testing"
78
"time"
89

@@ -783,19 +784,82 @@ func TestAsUUID(t *testing.T) {
783784
})
784785
}
785786

786-
func BenchmarkNoCastUUID(b *testing.B) {
787+
func asUUIDForceTypeCast(v interface{}) (value.Value, bool) {
788+
return value.Uuid(v.(uuid.UUID)), true
789+
}
790+
791+
func BenchmarkAsUUIDForceTypeCast(b *testing.B) {
787792
b.ReportAllocs()
788793
for i := 0; i < b.N; i++ {
789-
v := &uuid.UUID{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
790-
require.Equal(b, &uuid.UUID{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, v)
794+
v, ok := asUUIDForceTypeCast(srcUUID)
795+
require.True(b, ok)
796+
require.Equal(b, expUUIDValue, v)
791797
}
792798
}
793799

794800
func BenchmarkAsUUID(b *testing.B) {
795801
b.ReportAllocs()
796802
for i := 0; i < b.N; i++ {
797-
v, ok := asUUID(uuid.UUID{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16})
803+
v, ok := asUUID(srcUUID)
804+
require.True(b, ok)
805+
require.Equal(b, expUUIDValue, v)
806+
}
807+
}
808+
809+
var (
810+
uuidType = reflect.TypeOf(uuid.UUID{})
811+
uuidPtrType = reflect.TypeOf(&uuid.UUID{})
812+
srcUUID = uuid.UUID{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
813+
expUUIDValue = value.Uuid(uuid.UUID{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16})
814+
)
815+
816+
func asUUIDUsingReflect(v interface{}) (value.Value, bool) {
817+
switch reflect.TypeOf(v) {
818+
case uuidType:
819+
return value.Uuid(v.(uuid.UUID)), true
820+
case uuidPtrType:
821+
if v == nil {
822+
return value.NullValue(types.TypeUUID), false
823+
}
824+
825+
return value.OptionalValue(value.Uuid(*(v.(*uuid.UUID)))), true
826+
}
827+
828+
return nil, false
829+
}
830+
831+
func TestAsUUIDUsingReflect(t *testing.T) {
832+
t.Run("Valid", func(t *testing.T) {
833+
t.Run("uuid.UUID", func(t *testing.T) {
834+
v, ok := asUUIDUsingReflect(srcUUID)
835+
require.True(t, ok)
836+
require.Equal(t, expUUIDValue, v)
837+
})
838+
t.Run("*uuid.UUID", func(t *testing.T) {
839+
v, ok := asUUIDUsingReflect(&srcUUID)
840+
require.True(t, ok)
841+
require.Equal(t, value.OptionalValue(expUUIDValue), v)
842+
})
843+
})
844+
t.Run("Invalid", func(t *testing.T) {
845+
t.Run("[16]byte", func(t *testing.T) {
846+
v, ok := asUUIDUsingReflect(([16]byte)(srcUUID))
847+
require.False(t, ok)
848+
require.Nil(t, v)
849+
})
850+
t.Run("*[16]byte", func(t *testing.T) {
851+
v, ok := asUUIDUsingReflect((*[16]byte)(&srcUUID))
852+
require.False(t, ok)
853+
require.Nil(t, v)
854+
})
855+
})
856+
}
857+
858+
func BenchmarkAsUUIDUsingReflect(b *testing.B) {
859+
b.ReportAllocs()
860+
for i := 0; i < b.N; i++ {
861+
v, ok := asUUIDUsingReflect(srcUUID)
798862
require.True(b, ok)
799-
require.Equal(b, &uuid.UUID{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, v)
863+
require.Equal(b, expUUIDValue, v)
800864
}
801865
}

0 commit comments

Comments
 (0)