mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Fixes a number of problems with time/datetime <-> string conversion functions:
- bug #11655 "Wrong time is returning from nested selects - maximum time exists - input and output TIME values were not validated properly in several conversion functions - bug #20927 "sec_to_time treats big unsigned as signed" - integer overflows were not checked in several functions. As a result, input values like 2^32 or 3600*2^32 were treated as 0 - BIGINT UNSIGNED values were treated as SIGNED in several functions - in cases where both input string truncation and out-of-range TIME value occur, only 'truncated incorrect time value' warning was produced include/my_time.h: Added defines for the TIME limits Added defines for the warning flags set by str_to_time() and check_time_range() Added check_time_range() declaration mysql-test/r/func_sapdb.result: Fixed testcases which relied on incorrect TIMEDIFF() behaviour mysql-test/r/func_time.result: Fixed testcase which relied on incorrect behaviour Added testcases for out-of-range values in SEC_TO_TIME(), TIME_TO_SEC(), ADDTIME(), SUBTIME() and EXTRACT() mysql-test/t/func_time.test: Added testcases for out-of-range values in SEC_TO_TIME(), TIME_TO_SEC(), ADDTIME(), SUBTIME() and EXTRACT() sql-common/my_time.c: Added check_time_range() to be used from str_to_time() and item_timefunc.cc Added new out-of-range flag to str_to_time() warnings Use '%u' instead of '%d' in my_*_to_str() because the arguments are unsigned sql/field.cc: Replaced out-of-range checks with checks for flags returned by str_to_time() sql/item_timefunc.cc: Added wrappers over make_datetime() and make_time() which perform out-of-range checks on input values Moved common code in Item_func_sec_to_time::val_str() and Item_func_sec_to_time::val_int() into a separate function sec_to_time() Replaced calls to make_datetime() with make_datetime_with_warn() in Item_func_add_time and Item_func_timediff Checks for 'unsigned int' overflows in Item_func_maketime Use make_time_with_warn() instead of make_time() in Item_func_maketime Fixed incorrect sizeof() in Item_func_str_to_date::get_time() sql/time.cc: Check for return value of str_to_time() along with warning flags
This commit is contained in:
@ -97,7 +97,9 @@ subtime("02:01:01.999999", "01:01:01.999999")
|
||||
01:00:00.000000
|
||||
select timediff("1997-01-01 23:59:59.000001","1995-12-31 23:59:59.000002");
|
||||
timediff("1997-01-01 23:59:59.000001","1995-12-31 23:59:59.000002")
|
||||
8807:59:59.999999
|
||||
838:59:59
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect time value: '8807:59:59.999999'
|
||||
select timediff("1997-12-31 23:59:59.000001","1997-12-30 01:01:01.000002");
|
||||
timediff("1997-12-31 23:59:59.000001","1997-12-30 01:01:01.000002")
|
||||
46:58:57.999999
|
||||
@ -208,13 +210,16 @@ NULL NULL
|
||||
SELECT TIMEDIFF(t1,t4) As ttt, TIMEDIFF(t2, t3) As qqq from test;
|
||||
ttt qqq
|
||||
-744:00:00 NULL
|
||||
26305:01:02 22:58:58
|
||||
-26305:01:02 -22:58:58
|
||||
838:59:59 22:58:58
|
||||
-838:59:59 -22:58:58
|
||||
NULL 26:02:02
|
||||
00:00:00 -26:02:02
|
||||
NULL NULL
|
||||
NULL NULL
|
||||
00:00:00 -24:00:00
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect time value: '26305:01:02'
|
||||
Warning 1292 Truncated incorrect time value: '-26305:01:02'
|
||||
drop table t1, test;
|
||||
select addtime("-01:01:01.01", "-23:59:59.1") as a;
|
||||
a
|
||||
@ -224,7 +229,9 @@ a
|
||||
10000
|
||||
select microsecond(19971231235959.01) as a;
|
||||
a
|
||||
10000
|
||||
0
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect time value: '19971231235959.01'
|
||||
select date_add("1997-12-31",INTERVAL "10.09" SECOND_MICROSECOND) as a;
|
||||
a
|
||||
1997-12-31 00:00:10.090000
|
||||
|
Reference in New Issue
Block a user