Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit acb2bc0

Browse files
Modify convertInt so it returns the smallest representation allowed
Signed-off-by: Alejandro García Montoro <[email protected]>
1 parent f513e20 commit acb2bc0

File tree

1 file changed

+41
-16
lines changed

1 file changed

+41
-16
lines changed

sql/parse/parse.go

+41-16
Original file line numberDiff line numberDiff line change
@@ -938,22 +938,51 @@ func isAggregateFunc(v *sqlparser.FuncExpr) bool {
938938
return v.IsAggregate()
939939
}
940940

941+
// Convert an integer, represented by the specified string in the specified
942+
// base, to its smallest representation possible, out of:
943+
// int8, uint8, int16, uint16, int32, uint32, int64 and uint64
944+
func convertInt(value string, base int) (sql.Expression, error) {
945+
i8, err := strconv.ParseInt(value, base, 8)
946+
if err != nil {
947+
ui8, err := strconv.ParseUint(value, base, 8)
948+
if err != nil {
949+
i16, err := strconv.ParseInt(value, base, 16)
950+
if err != nil {
951+
ui16, err := strconv.ParseUint(value, base, 16)
952+
if err != nil {
953+
i32, err := strconv.ParseInt(value, base, 32)
954+
if err != nil {
955+
ui32, err := strconv.ParseUint(value, base, 32)
956+
if err != nil {
957+
i64, err := strconv.ParseInt(value, base, 64)
958+
if err != nil {
959+
ui64, err := strconv.ParseUint(value, base, 64)
960+
if err != nil {
961+
return nil, err
962+
}
963+
return expression.NewLiteral(uint64(ui64), sql.Uint64), nil
964+
}
965+
return expression.NewLiteral(int64(i64), sql.Int64), nil
966+
}
967+
return expression.NewLiteral(uint32(ui32), sql.Uint32), nil
968+
}
969+
return expression.NewLiteral(int32(i32), sql.Int32), nil
970+
}
971+
return expression.NewLiteral(uint16(ui16), sql.Uint16), nil
972+
}
973+
return expression.NewLiteral(int16(i16), sql.Int16), nil
974+
}
975+
return expression.NewLiteral(uint8(ui8), sql.Uint16), nil
976+
}
977+
return expression.NewLiteral(int8(i8), sql.Int8), nil
978+
}
979+
941980
func convertVal(v *sqlparser.SQLVal) (sql.Expression, error) {
942981
switch v.Type {
943982
case sqlparser.StrVal:
944983
return expression.NewLiteral(string(v.Val), sql.Text), nil
945984
case sqlparser.IntVal:
946-
//TODO: Use smallest integer representation and widen later.
947-
val, err := strconv.ParseInt(string(v.Val), 10, 64)
948-
if err != nil {
949-
// Might be a uint64 value that is greater than int64 max
950-
val, checkErr := strconv.ParseUint(string(v.Val), 10, 64)
951-
if checkErr != nil {
952-
return nil, err
953-
}
954-
return expression.NewLiteral(val, sql.Uint64), nil
955-
}
956-
return expression.NewLiteral(val, sql.Int64), nil
985+
return convertInt(string(v.Val), 10)
957986
case sqlparser.FloatVal:
958987
val, err := strconv.ParseFloat(string(v.Val), 64)
959988
if err != nil {
@@ -968,11 +997,7 @@ func convertVal(v *sqlparser.SQLVal) (sql.Expression, error) {
968997
v = strings.Trim(v[1:], "'")
969998
}
970999

971-
val, err := strconv.ParseInt(v, 16, 64)
972-
if err != nil {
973-
return nil, err
974-
}
975-
return expression.NewLiteral(val, sql.Int64), nil
1000+
return convertInt(v, 16)
9761001
case sqlparser.HexVal:
9771002
val, err := v.HexDecode()
9781003
if err != nil {

0 commit comments

Comments
 (0)