Skip to content
This repository was archived by the owner on Oct 20, 2025. It is now read-only.

Commit 544db2a

Browse files
authored
Optimize with reflect.TypeFor (#563)
1 parent 2964589 commit 544db2a

File tree

4 files changed

+39
-38
lines changed

4 files changed

+39
-38
lines changed

types.go

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,30 @@ import (
2121

2222
// Pre-computed reflect type values to avoid repeated allocations.
2323
var (
24-
reflectTypeBool = reflect.TypeOf(true)
25-
reflectTypeInt8 = reflect.TypeOf(int8(0))
26-
reflectTypeInt16 = reflect.TypeOf(int16(0))
27-
reflectTypeInt32 = reflect.TypeOf(int32(0))
28-
reflectTypeInt64 = reflect.TypeOf(int64(0))
29-
reflectTypeUint8 = reflect.TypeOf(uint8(0))
30-
reflectTypeUint16 = reflect.TypeOf(uint16(0))
31-
reflectTypeUint32 = reflect.TypeOf(uint32(0))
32-
reflectTypeUint64 = reflect.TypeOf(uint64(0))
33-
reflectTypeFloat32 = reflect.TypeOf(float32(0))
34-
reflectTypeFloat64 = reflect.TypeOf(float64(0))
35-
reflectTypeTime = reflect.TypeOf(time.Time{})
36-
reflectTypeInterval = reflect.TypeOf(Interval{})
37-
reflectTypeBigInt = reflect.TypeOf(big.NewInt(0))
38-
reflectTypeString = reflect.TypeOf("")
39-
reflectTypeBytes = reflect.TypeOf([]byte{})
40-
reflectTypeDecimal = reflect.TypeOf(Decimal{})
41-
reflectTypeSliceAny = reflect.TypeOf([]any{})
42-
reflectTypeMapString = reflect.TypeOf(map[string]any{})
43-
reflectTypeMap = reflect.TypeOf(Map{})
44-
reflectTypeUnion = reflect.TypeOf(Union{})
24+
reflectTypeBool = reflect.TypeFor[bool]()
25+
reflectTypeInt8 = reflect.TypeFor[int8]()
26+
reflectTypeInt16 = reflect.TypeFor[int16]()
27+
reflectTypeInt32 = reflect.TypeFor[int32]()
28+
reflectTypeInt64 = reflect.TypeFor[int64]()
29+
reflectTypeUint8 = reflect.TypeFor[uint8]()
30+
reflectTypeUint16 = reflect.TypeFor[uint16]()
31+
reflectTypeUint32 = reflect.TypeFor[uint32]()
32+
reflectTypeUint64 = reflect.TypeFor[uint64]()
33+
reflectTypeFloat32 = reflect.TypeFor[float32]()
34+
reflectTypeFloat64 = reflect.TypeFor[float64]()
35+
reflectTypeTime = reflect.TypeFor[time.Time]()
36+
reflectTypeInterval = reflect.TypeFor[Interval]()
37+
reflectTypeBigInt = reflect.TypeFor[*big.Int]()
38+
reflectTypeString = reflect.TypeFor[string]()
39+
reflectTypeBytes = reflect.TypeFor[[]byte]()
40+
reflectTypeDecimal = reflect.TypeFor[Decimal]()
41+
reflectTypeSliceAny = reflect.TypeFor[[]any]()
42+
reflectTypeMapString = reflect.TypeFor[map[string]any]()
43+
reflectTypeMap = reflect.TypeFor[Map]()
44+
reflectTypeUnion = reflect.TypeFor[Union]()
4545
reflectTypeAny = reflect.TypeFor[any]()
46+
reflectTypeUUID = reflect.TypeFor[UUID]()
47+
reflectTypeHugeInt = reflect.TypeFor[mapping.HugeInt]()
4648
)
4749

4850
type numericType interface {
@@ -104,13 +106,13 @@ func inferUUID(val any) (mapping.HugeInt, error) {
104106
id = *v
105107
case []uint8:
106108
if len(v) != uuidLength {
107-
return mapping.HugeInt{}, castError(reflect.TypeOf(val).String(), reflect.TypeOf(id).String())
109+
return mapping.HugeInt{}, castError(reflect.TypeOf(val).String(), reflectTypeUUID.String())
108110
}
109111
for i := range uuidLength {
110112
id[i] = v[i]
111113
}
112114
default:
113-
return mapping.HugeInt{}, castError(reflect.TypeOf(val).String(), reflect.TypeOf(id).String())
115+
return mapping.HugeInt{}, castError(reflect.TypeOf(val).String(), reflectTypeUUID.String())
114116
}
115117
hi := uuidToHugeInt(id)
116118
return hi, nil
@@ -200,20 +202,20 @@ func inferHugeInt(val any) (mapping.HugeInt, error) {
200202
}
201203
case *big.Int:
202204
if v == nil {
203-
return mapping.HugeInt{}, castError(reflect.TypeOf(val).String(), reflect.TypeOf(hi).String())
205+
return mapping.HugeInt{}, castError(reflect.TypeOf(val).String(), reflectTypeHugeInt.String())
204206
}
205207
if hi, err = hugeIntFromNative(v); err != nil {
206208
return mapping.HugeInt{}, err
207209
}
208210
case Decimal:
209211
if v.Value == nil {
210-
return mapping.HugeInt{}, castError(reflect.TypeOf(val).String(), reflect.TypeOf(hi).String())
212+
return mapping.HugeInt{}, castError(reflect.TypeOf(val).String(), reflectTypeHugeInt.String())
211213
}
212214
if hi, err = hugeIntFromNative(v.Value); err != nil {
213215
return mapping.HugeInt{}, err
214216
}
215217
default:
216-
return mapping.HugeInt{}, castError(reflect.TypeOf(val).String(), reflect.TypeOf(hi).String())
218+
return mapping.HugeInt{}, castError(reflect.TypeOf(val).String(), reflectTypeHugeInt.String())
217219
}
218220

219221
return hi, nil
@@ -251,7 +253,7 @@ func inferInterval(val any) (mapping.Interval, error) {
251253
case Interval:
252254
i = v
253255
default:
254-
return mapping.Interval{}, castError(reflect.TypeOf(val).String(), reflect.TypeOf(i).String())
256+
return mapping.Interval{}, castError(reflect.TypeOf(val).String(), reflectTypeInterval.String())
255257
}
256258
return mapping.NewInterval(i.Months, i.Days, i.Micros), nil
257259
}
@@ -327,7 +329,7 @@ func castToTime(val any) (time.Time, error) {
327329
case time.Time:
328330
ti = v
329331
default:
330-
return ti, castError(reflect.TypeOf(val).String(), reflect.TypeOf(ti).String())
332+
return ti, castError(reflect.TypeOf(val).String(), reflectTypeTime.String())
331333
}
332334
return ti.UTC(), nil
333335
}

types_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"database/sql"
77
"fmt"
88
"math/big"
9-
"reflect"
109
"strconv"
1110
"testing"
1211
"time"
@@ -1010,8 +1009,8 @@ func TestJSONColType(t *testing.T) {
10101009
require.Len(t, columnTypes, 2)
10111010
require.Equal(t, aliasJSON, columnTypes[0].DatabaseTypeName())
10121011
require.Equal(t, typeToStringMap[TYPE_BIGINT], columnTypes[1].DatabaseTypeName())
1013-
require.Equal(t, reflect.TypeOf((*any)(nil)).Elem(), columnTypes[0].ScanType())
1014-
require.Equal(t, reflect.TypeOf(int64(0)), columnTypes[1].ScanType())
1012+
require.Equal(t, reflectTypeAny, columnTypes[0].ScanType())
1013+
require.Equal(t, reflectTypeInt64, columnTypes[1].ScanType())
10151014
}
10161015

10171016
func TestUnionTypes(t *testing.T) {

value.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ func createSliceValue[T any](lt mapping.LogicalType, t Type, val T) (mapping.Val
451451
func createStructValue(lt mapping.LogicalType, val any) (mapping.Value, error) {
452452
m, ok := val.(map[string]any)
453453
if !ok {
454-
return mapping.Value{}, castError(reflect.TypeOf(val).Name(), reflect.TypeOf(map[string]any{}).Name())
454+
return mapping.Value{}, castError(reflect.TypeOf(val).Name(), reflectTypeMapString.Name())
455455
}
456456

457457
var values []mapping.Value
@@ -502,7 +502,7 @@ func extractSlice[S any](val S) ([]any, error) {
502502
default:
503503
kind := reflect.TypeOf(val).Kind()
504504
if kind != reflect.Array && kind != reflect.Slice {
505-
return nil, castError(reflect.TypeOf(val).String(), reflect.TypeOf(s).String())
505+
return nil, castError(reflect.TypeOf(val).String(), reflectTypeSliceAny.String())
506506
}
507507

508508
// Insert the values into the slice.

vector_setters.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func setBool[S any](vec *vector, rowIdx mapping.IdxT, val S) error {
8080
case bool:
8181
b = v
8282
default:
83-
return castError(reflect.TypeOf(val).String(), reflect.TypeOf(b).String())
83+
return castError(reflect.TypeOf(val).String(), reflectTypeBool.String())
8484
}
8585
setPrimitive(vec, rowIdx, b)
8686
return nil
@@ -204,7 +204,7 @@ func setEnum[S any](vec *vector, rowIdx mapping.IdxT, val S) error {
204204
case string:
205205
str = v
206206
default:
207-
return castError(reflect.TypeOf(val).String(), reflect.TypeOf(str).String())
207+
return castError(reflect.TypeOf(val).String(), reflectTypeString.String())
208208
}
209209

210210
if v, ok := vec.namesDict[str]; ok {
@@ -219,7 +219,7 @@ func setEnum[S any](vec *vector, rowIdx mapping.IdxT, val S) error {
219219
return setNumeric[uint32, int64](vec, rowIdx, v)
220220
}
221221
} else {
222-
return castError(reflect.TypeOf(val).String(), reflect.TypeOf(str).String())
222+
return castError(reflect.TypeOf(val).String(), reflectTypeString.String())
223223
}
224224
return nil
225225
}
@@ -250,7 +250,7 @@ func setStruct[S any](vec *vector, rowIdx mapping.IdxT, val S) error {
250250

251251
// Catch mismatching types.
252252
goType := reflect.TypeOf(val)
253-
if reflect.TypeOf(val).Kind() != reflect.Struct {
253+
if goType.Kind() != reflect.Struct {
254254
return castError(goType.String(), reflect.Struct.String())
255255
}
256256

@@ -294,7 +294,7 @@ func setMap[S any](vec *vector, rowIdx mapping.IdxT, val S) error {
294294
case Map:
295295
m = v
296296
default:
297-
return castError(reflect.TypeOf(val).String(), reflect.TypeOf(m).String())
297+
return castError(reflect.TypeOf(val).String(), reflectTypeMap.String())
298298
}
299299

300300
// Create a LIST of STRUCT values.

0 commit comments

Comments
 (0)