@@ -1163,7 +1163,7 @@ func convertToUint64(t NumberTypeImpl_, v interface{}) (uint64, sql.ConvertInRan
11631163 return uint64 (math .Round (v )), sql .InRange , nil
11641164 case decimal.Decimal :
11651165 if v .GreaterThan (dec_uint64_max ) {
1166- return math .MaxUint64 , sql .InRange , nil
1166+ return math .MaxUint64 , sql .OutOfRange , nil
11671167 } else if v .LessThan (dec_zero ) {
11681168 ret , _ := dec_uint64_max .Sub (v ).Float64 ()
11691169 return uint64 (math .Round (ret )), sql .OutOfRange , nil
@@ -1181,6 +1181,9 @@ func convertToUint64(t NumberTypeImpl_, v interface{}) (uint64, sql.ConvertInRan
11811181 v = strings .Trim (v , intCutSet )
11821182 if i , err := strconv .ParseUint (v , 10 , 64 ); err == nil {
11831183 return i , sql .InRange , nil
1184+ } else if err == strconv .ErrRange {
1185+ // Number is too large for uint64, return max value and OutOfRange
1186+ return math .MaxUint64 , sql .OutOfRange , nil
11841187 }
11851188 if f , err := strconv .ParseFloat (v , 64 ); err == nil {
11861189 if val , inRange , err := convertToUint64 (t , f ); err == nil && inRange {
@@ -1238,15 +1241,15 @@ func convertToUint32(t NumberTypeImpl_, v interface{}) (uint32, sql.ConvertInRan
12381241 }
12391242 return uint32 (v ), sql .InRange , nil
12401243 case uint :
1241- return uint32 ( v ), sql . InRange , nil
1244+ return convertUintToUint32 ( uint64 ( v ))
12421245 case uint8 :
12431246 return uint32 (v ), sql .InRange , nil
12441247 case uint16 :
12451248 return uint32 (v ), sql .InRange , nil
12461249 case uint32 :
12471250 return v , sql .InRange , nil
12481251 case uint64 :
1249- return uint32 (v ), sql . InRange , nil
1252+ return convertUintToUint32 (v )
12501253 case float64 :
12511254 if float32 (v ) > float32 (math .MaxInt32 ) {
12521255 return math .MaxUint32 , sql .OutOfRange , nil
@@ -1334,13 +1337,13 @@ func convertToUint16(t NumberTypeImpl_, v interface{}) (uint16, sql.ConvertInRan
13341337 }
13351338 return uint16 (v ), sql .InRange , nil
13361339 case uint :
1337- return uint16 ( v ), sql . InRange , nil
1340+ return convertUintToUint16 ( uint64 ( v ))
13381341 case uint8 :
13391342 return uint16 (v ), sql .InRange , nil
13401343 case uint64 :
1341- return uint16 (v ), sql . InRange , nil
1344+ return convertUintToUint16 (v )
13421345 case uint32 :
1343- return uint16 ( v ), sql . InRange , nil
1346+ return convertUintToUint16 ( uint64 ( v ))
13441347 case uint16 :
13451348 return v , sql .InRange , nil
13461349 case float32 :
@@ -1434,13 +1437,13 @@ func convertToUint8(t NumberTypeImpl_, v interface{}) (uint8, sql.ConvertInRange
14341437 }
14351438 return uint8 (v ), sql .InRange , nil
14361439 case uint :
1437- return uint8 ( v ), sql . InRange , nil
1440+ return convertUintToUint8 ( uint64 ( v ))
14381441 case uint16 :
1439- return uint8 ( v ), sql . InRange , nil
1442+ return convertUintToUint8 ( uint64 ( v ))
14401443 case uint64 :
1441- return uint8 (v ), sql . InRange , nil
1444+ return convertUintToUint8 (v )
14421445 case uint32 :
1443- return uint8 ( v ), sql . InRange , nil
1446+ return convertUintToUint8 ( uint64 ( v ))
14441447 case uint8 :
14451448 return v , sql .InRange , nil
14461449 case float32 :
@@ -1719,3 +1722,30 @@ func CoalesceInt(val interface{}) (int, bool) {
17191722 return 0 , false
17201723 }
17211724}
1725+
1726+ // convertUintToUint8 converts a uint64 value to uint8 with overflow checking.
1727+ // Returns the converted value, range status, and any error.
1728+ func convertUintToUint8 (v uint64 ) (uint8 , sql.ConvertInRange , error ) {
1729+ if v > math .MaxUint8 {
1730+ return uint8 (math .MaxUint8 ), sql .OutOfRange , nil
1731+ }
1732+ return uint8 (v ), sql .InRange , nil
1733+ }
1734+
1735+ // convertUintToUint16 converts a uint64 value to uint16 with overflow checking.
1736+ // Returns the converted value, range status, and any error.
1737+ func convertUintToUint16 (v uint64 ) (uint16 , sql.ConvertInRange , error ) {
1738+ if v > math .MaxUint16 {
1739+ return uint16 (math .MaxUint16 ), sql .OutOfRange , nil
1740+ }
1741+ return uint16 (v ), sql .InRange , nil
1742+ }
1743+
1744+ // convertUintToUint32 converts a uint64 value to uint32 with overflow checking.
1745+ // Returns the converted value, range status, and any error.
1746+ func convertUintToUint32 (v uint64 ) (uint32 , sql.ConvertInRange , error ) {
1747+ if v > math .MaxUint32 {
1748+ return uint32 (math .MaxUint32 ), sql .OutOfRange , nil
1749+ }
1750+ return uint32 (v ), sql .InRange , nil
1751+ }
0 commit comments