-
Notifications
You must be signed in to change notification settings - Fork 338
/
implicit_conversion.go
92 lines (77 loc) · 2.21 KB
/
implicit_conversion.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
Copyright 2022 Codenotary Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package sql
// mayApplyImplicitConversion may do an implicit type conversion
// implicit conversion is currently done in a subset of possible explicit conversions i.e. CAST
func mayApplyImplicitConversion(val interface{}, requiredColumnType SQLValueType) (interface{}, error) {
if val == nil {
return nil, nil
}
var converter converterFunc
var typedVal TypedValue
var err error
switch requiredColumnType {
case Float64Type:
switch value := val.(type) {
case float64:
return val, nil
case int:
converter, err = getConverter(IntegerType, Float64Type)
if err != nil {
return nil, err
}
typedVal = &Integer{val: int64(value)}
case int64:
converter, err = getConverter(IntegerType, Float64Type)
if err != nil {
return nil, err
}
typedVal = &Integer{val: value}
case string:
converter, err = getConverter(VarcharType, Float64Type)
if err != nil {
return nil, err
}
typedVal = &Varchar{val: value}
}
case IntegerType:
switch value := val.(type) {
case int64:
return val, nil
case float64:
converter, err = getConverter(Float64Type, IntegerType)
if err != nil {
return nil, err
}
typedVal = &Float64{val: value}
case string:
converter, err = getConverter(VarcharType, IntegerType)
if err != nil {
return nil, err
}
typedVal = &Varchar{val: value}
}
default:
// No implicit conversion rule found, do not convert at all
return val, nil
}
if typedVal == nil {
// No implicit conversion rule found, do not convert at all
return val, nil
}
convVal, err := converter(typedVal)
if err != nil {
return nil, err
}
return convVal.RawValue(), nil
}