@@ -32,13 +32,14 @@ import (
3232
3333// Portable analogs of some common call errors.
3434var (
35- ErrInvalidTimeFormat = terror .ClassTypes .New (mysql .ErrTruncatedWrongValue , "invalid time format: '%v'" )
36- ErrInvalidWeekModeFormat = terror .ClassTypes .New (mysql .ErrTruncatedWrongValue , "invalid week mode format: '%v'" )
37- ErrInvalidYearFormat = errors .New ("invalid year format" )
38- ErrInvalidYear = errors .New ("invalid year" )
39- ErrZeroDate = errors .New ("datetime zero in date" )
40- ErrIncorrectDatetimeValue = terror .ClassTypes .New (mysql .ErrTruncatedWrongValue , "Incorrect datetime value: '%s'" )
41- ErrTruncatedWrongValue = terror .ClassTypes .New (mysql .ErrTruncatedWrongValue , mysql .MySQLErrName [mysql .ErrTruncatedWrongValue ])
35+ ErrInvalidTimeFormat = terror .ClassTypes .New (mysql .ErrTruncatedWrongValue , "invalid time format: '%v'" )
36+ ErrInvalidWeekModeFormat = terror .ClassTypes .New (mysql .ErrTruncatedWrongValue , "invalid week mode format: '%v'" )
37+ ErrInvalidYearFormat = errors .New ("invalid year format" )
38+ ErrInvalidYear = errors .New ("invalid year" )
39+ ErrZeroDate = errors .New ("datetime zero in date" )
40+ ErrIncorrectDatetimeValue = terror .ClassTypes .New (mysql .ErrTruncatedWrongValue , "Incorrect datetime value: '%s'" )
41+ ErrDatetimeFunctionOverflow = terror .ClassTypes .New (mysql .ErrDatetimeFunctionOverflow , mysql .MySQLErrName [mysql .ErrDatetimeFunctionOverflow ])
42+ ErrTruncatedWrongValue = terror .ClassTypes .New (mysql .ErrTruncatedWrongValue , mysql .MySQLErrName [mysql .ErrTruncatedWrongValue ])
4243)
4344
4445// Time format without fractional seconds precision.
@@ -2450,3 +2451,49 @@ func DateFSP(date string) (fsp int) {
24502451 }
24512452 return
24522453}
2454+
2455+ // DateTimeIsOverflow return if this date is overflow.
2456+ // See: https://dev.mysql.com/doc/refman/8.0/en/datetime.html
2457+ func DateTimeIsOverflow (sc * stmtctx.StatementContext , date Time ) (bool , error ) {
2458+ tz := sc .TimeZone
2459+ if tz == nil {
2460+ tz = gotime .Local
2461+ }
2462+
2463+ var err error
2464+ var b , e , t gotime.Time
2465+ switch date .Type {
2466+ case mysql .TypeDate , mysql .TypeDatetime :
2467+ if b , err = MinDatetime .GoTime (tz ); err != nil {
2468+ return false , err
2469+ }
2470+ if e , err = MaxDatetime .GoTime (tz ); err != nil {
2471+ return false , err
2472+ }
2473+ case mysql .TypeTimestamp :
2474+ minTS , maxTS := MinTimestamp , MaxTimestamp
2475+ if tz != gotime .UTC {
2476+ if err = minTS .ConvertTimeZone (gotime .UTC , tz ); err != nil {
2477+ return false , err
2478+ }
2479+ if err = maxTS .ConvertTimeZone (gotime .UTC , tz ); err != nil {
2480+ return false , err
2481+ }
2482+ }
2483+ if b , err = minTS .Time .GoTime (tz ); err != nil {
2484+ return false , err
2485+ }
2486+ if e , err = maxTS .Time .GoTime (tz ); err != nil {
2487+ return false , err
2488+ }
2489+ default :
2490+ return false , nil
2491+ }
2492+
2493+ if t , err = date .Time .GoTime (tz ); err != nil {
2494+ return false , err
2495+ }
2496+
2497+ inRange := (t .After (b ) || t .Equal (b )) && (t .Before (e ) || t .Equal (e ))
2498+ return ! inRange , nil
2499+ }
0 commit comments