@@ -938,22 +938,51 @@ func isAggregateFunc(v *sqlparser.FuncExpr) bool {
938
938
return v .IsAggregate ()
939
939
}
940
940
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
+
941
980
func convertVal (v * sqlparser.SQLVal ) (sql.Expression , error ) {
942
981
switch v .Type {
943
982
case sqlparser .StrVal :
944
983
return expression .NewLiteral (string (v .Val ), sql .Text ), nil
945
984
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 )
957
986
case sqlparser .FloatVal :
958
987
val , err := strconv .ParseFloat (string (v .Val ), 64 )
959
988
if err != nil {
@@ -968,11 +997,7 @@ func convertVal(v *sqlparser.SQLVal) (sql.Expression, error) {
968
997
v = strings .Trim (v [1 :], "'" )
969
998
}
970
999
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 )
976
1001
case sqlparser .HexVal :
977
1002
val , err := v .HexDecode ()
978
1003
if err != nil {
0 commit comments