@@ -260,41 +260,80 @@ func (t NumberTypeImpl_) Convert(ctx context.Context, v interface{}) (interface{
260260 }
261261 }
262262
263+ // Check if we're in strict mode for error handling
264+ strictMode := false
265+ if sqlCtx , ok := ctx .(* sql.Context ); ok {
266+ strictMode = sql .ValidateStrictMode (sqlCtx )
267+ }
268+
269+
263270 switch t .baseType {
264271 case sqltypes .Int8 :
265272 num , _ , err := convertToInt64 (t , v )
266273 if err != nil {
267274 return nil , sql .OutOfRange , err
268275 }
269276 if num > math .MaxInt8 {
277+ if strictMode {
278+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
279+ }
270280 return int8 (math .MaxInt8 ), sql .OutOfRange , nil
271281 } else if num < math .MinInt8 {
282+ if strictMode {
283+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
284+ }
272285 return int8 (math .MinInt8 ), sql .OutOfRange , nil
273286 }
274287 return int8 (num ), sql .InRange , nil
275288 case sqltypes .Uint8 :
276- return convertToUint8 (t , v )
289+ val , inRange , err := convertToUint8 (t , v )
290+ if err != nil {
291+ return nil , sql .OutOfRange , err
292+ }
293+ if inRange == sql .OutOfRange && strictMode {
294+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
295+ }
296+ return val , inRange , nil
277297 case sqltypes .Int16 :
278298 num , _ , err := convertToInt64 (t , v )
279299 if err != nil {
280300 return nil , sql .OutOfRange , err
281301 }
282302 if num > math .MaxInt16 {
303+ if strictMode {
304+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
305+ }
283306 return int16 (math .MaxInt16 ), sql .OutOfRange , nil
284307 } else if num < math .MinInt16 {
308+ if strictMode {
309+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
310+ }
285311 return int16 (math .MinInt16 ), sql .OutOfRange , nil
286312 }
287313 return int16 (num ), sql .InRange , nil
288314 case sqltypes .Uint16 :
289- return convertToUint16 (t , v )
315+ val , inRange , err := convertToUint16 (t , v )
316+ if err != nil {
317+ return nil , sql .OutOfRange , err
318+ }
319+ if inRange == sql .OutOfRange && strictMode {
320+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
321+ }
322+ return val , inRange , nil
290323 case sqltypes .Int24 :
291324 num , _ , err := convertToInt64 (t , v )
292325 if err != nil {
293326 return nil , sql .OutOfRange , err
294327 }
295328 if num > (1 << 23 - 1 ) {
329+ if strictMode {
330+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
331+ }
296332 return int32 (1 << 23 - 1 ), sql .OutOfRange , nil
297333 } else if num < (- 1 << 23 ) {
334+ if strictMode {
335+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
336+ }
298337 return int32 (- 1 << 23 ), sql .OutOfRange , nil
299338 }
300339 return int32 (num ), sql .InRange , nil
@@ -304,8 +343,14 @@ func (t NumberTypeImpl_) Convert(ctx context.Context, v interface{}) (interface{
304343 return nil , sql .OutOfRange , err
305344 }
306345 if num >= (1 << 24 ) {
346+ if strictMode {
347+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
348+ }
307349 return uint32 (1 << 24 - 1 ), sql .OutOfRange , nil
308350 } else if num < 0 {
351+ if strictMode {
352+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
353+ }
309354 return uint32 (1 << 24 - int32 (- num )), sql .OutOfRange , nil
310355 }
311356 return uint32 (num ), sql .InRange , nil
@@ -315,17 +360,44 @@ func (t NumberTypeImpl_) Convert(ctx context.Context, v interface{}) (interface{
315360 return nil , sql .OutOfRange , err
316361 }
317362 if num > math .MaxInt32 {
363+ if strictMode {
364+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
365+ }
318366 return int32 (math .MaxInt32 ), sql .OutOfRange , nil
319367 } else if num < math .MinInt32 {
368+ if strictMode {
369+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
370+ }
320371 return int32 (math .MinInt32 ), sql .OutOfRange , nil
321372 }
322373 return int32 (num ), sql .InRange , nil
323374 case sqltypes .Uint32 :
324- return convertToUint32 (t , v )
375+ val , inRange , err := convertToUint32 (t , v )
376+ if err != nil {
377+ return nil , sql .OutOfRange , err
378+ }
379+ if inRange == sql .OutOfRange && strictMode {
380+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
381+ }
382+ return val , inRange , nil
325383 case sqltypes .Int64 :
326- return convertToInt64 (t , v )
384+ val , inRange , err := convertToInt64 (t , v )
385+ if err != nil {
386+ return nil , sql .OutOfRange , err
387+ }
388+ if inRange == sql .OutOfRange && strictMode {
389+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
390+ }
391+ return val , inRange , nil
327392 case sqltypes .Uint64 :
328- return convertToUint64 (t , v )
393+ val , inRange , err := convertToUint64 (t , v )
394+ if err != nil {
395+ return nil , sql .OutOfRange , err
396+ }
397+ if inRange == sql .OutOfRange && strictMode {
398+ return nil , sql .OutOfRange , sql .ErrValueOutOfRange .New (v , t .String ())
399+ }
400+ return val , inRange , nil
329401 case sqltypes .Float32 :
330402 num , err := convertToFloat64 (t , v )
331403 if err != nil {
@@ -1163,7 +1235,7 @@ func convertToUint64(t NumberTypeImpl_, v interface{}) (uint64, sql.ConvertInRan
11631235 return uint64 (math .Round (v )), sql .InRange , nil
11641236 case decimal.Decimal :
11651237 if v .GreaterThan (dec_uint64_max ) {
1166- return math .MaxUint64 , sql .InRange , nil
1238+ return math .MaxUint64 , sql .OutOfRange , nil
11671239 } else if v .LessThan (dec_zero ) {
11681240 ret , _ := dec_uint64_max .Sub (v ).Float64 ()
11691241 return uint64 (math .Round (ret )), sql .OutOfRange , nil
0 commit comments