mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Bug#18997: DATE_ADD and DATE_SUB perform year2K autoconversion magic on 4-digit year value
if input year for date_add() / date_sub() with INTERVAL is low enough for calc_daynr() to possibly return incorrect results (calc_daynr() has no information on whether the year is low because it was a two-digit year ('77) or because it was a really low four-digit year (0077) and will indiscriminately try to turn the value into a four-digit year by adding 1900 or 2000 respectively), the functions will now throw NULL.
This commit is contained in:
@ -736,31 +736,6 @@ select last_day('2005-00-00');
|
||||
last_day('2005-00-00')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect datetime value: '2005-00-00'
|
||||
select last_day('2005-00-01');
|
||||
last_day('2005-00-01')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect datetime value: '2005-00-01'
|
||||
select last_day('2005-01-00');
|
||||
last_day('2005-01-00')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect datetime value: '2005-01-00'
|
||||
select monthname(str_to_date(null, '%m')), monthname(str_to_date(null, '%m')),
|
||||
monthname(str_to_date(1, '%m')), monthname(str_to_date(0, '%m'));
|
||||
monthname(str_to_date(null, '%m')) monthname(str_to_date(null, '%m')) monthname(str_to_date(1, '%m')) monthname(str_to_date(0, '%m'))
|
||||
NULL NULL January NULL
|
||||
explain extended select timestampdiff(SQL_TSI_WEEK, '2001-02-01', '2001-05-01') as a1,
|
||||
timestampdiff(SQL_TSI_FRAC_SECOND, '2001-02-01 12:59:59.120000', '2001-05-01 12:58:58.119999') as a2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select timestampdiff(WEEK,_latin1'2001-02-01',_latin1'2001-05-01') AS `a1`,timestampdiff(SECOND_FRAC,_latin1'2001-02-01 12:59:59.120000',_latin1'2001-05-01 12:58:58.119999') AS `a2`
|
||||
select last_day('2005-00-00');
|
||||
last_day('2005-00-00')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '2005-00-00'
|
||||
select last_day('2005-00-01');
|
||||
last_day('2005-00-01')
|
||||
@ -772,6 +747,17 @@ last_day('2005-01-00')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '2005-01-00'
|
||||
select monthname(str_to_date(null, '%m')), monthname(str_to_date(null, '%m')),
|
||||
monthname(str_to_date(1, '%m')), monthname(str_to_date(0, '%m'));
|
||||
monthname(str_to_date(null, '%m')) monthname(str_to_date(null, '%m')) monthname(str_to_date(1, '%m')) monthname(str_to_date(0, '%m'))
|
||||
NULL NULL January NULL
|
||||
End of 4.1 tests
|
||||
explain extended select timestampdiff(SQL_TSI_WEEK, '2001-02-01', '2001-05-01') as a1,
|
||||
timestampdiff(SQL_TSI_FRAC_SECOND, '2001-02-01 12:59:59.120000', '2001-05-01 12:58:58.119999') as a2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select timestampdiff(WEEK,_latin1'2001-02-01',_latin1'2001-05-01') AS `a1`,timestampdiff(SECOND_FRAC,_latin1'2001-02-01 12:59:59.120000',_latin1'2001-05-01 12:58:58.119999') AS `a2`
|
||||
select time_format('100:00:00', '%H %k %h %I %l');
|
||||
time_format('100:00:00', '%H %k %h %I %l')
|
||||
100 100 04 04 4
|
||||
@ -891,3 +877,38 @@ id day id day
|
||||
1 2005-06-01 3 2005-07-15
|
||||
3 2005-07-01 3 2005-07-15
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.0 tests
|
||||
select date_sub("0050-01-01 00:00:01",INTERVAL 2 SECOND);
|
||||
date_sub("0050-01-01 00:00:01",INTERVAL 2 SECOND)
|
||||
NULL
|
||||
select date_sub("0199-01-01 00:00:01",INTERVAL 2 SECOND);
|
||||
date_sub("0199-01-01 00:00:01",INTERVAL 2 SECOND)
|
||||
NULL
|
||||
select date_add("0199-12-31 23:59:59",INTERVAL 2 SECOND);
|
||||
date_add("0199-12-31 23:59:59",INTERVAL 2 SECOND)
|
||||
NULL
|
||||
select date_sub("0200-01-01 00:00:01",INTERVAL 2 SECOND);
|
||||
date_sub("0200-01-01 00:00:01",INTERVAL 2 SECOND)
|
||||
0199-12-31 23:59:59
|
||||
select date_sub("0200-01-01 00:00:01",INTERVAL 1 SECOND);
|
||||
date_sub("0200-01-01 00:00:01",INTERVAL 1 SECOND)
|
||||
0200-01-01 00:00:00
|
||||
select date_sub("0200-01-01 00:00:01",INTERVAL 2 SECOND);
|
||||
date_sub("0200-01-01 00:00:01",INTERVAL 2 SECOND)
|
||||
0199-12-31 23:59:59
|
||||
select date_add("2001-01-01 23:59:59",INTERVAL -2000 YEAR);
|
||||
date_add("2001-01-01 23:59:59",INTERVAL -2000 YEAR)
|
||||
0001-01-01 23:59:59
|
||||
select date_sub("50-01-01 00:00:01",INTERVAL 2 SECOND);
|
||||
date_sub("50-01-01 00:00:01",INTERVAL 2 SECOND)
|
||||
2049-12-31 23:59:59
|
||||
select date_sub("90-01-01 00:00:01",INTERVAL 2 SECOND);
|
||||
date_sub("90-01-01 00:00:01",INTERVAL 2 SECOND)
|
||||
1989-12-31 23:59:59
|
||||
select date_sub("0069-01-01 00:00:01",INTERVAL 2 SECOND);
|
||||
date_sub("0069-01-01 00:00:01",INTERVAL 2 SECOND)
|
||||
NULL
|
||||
select date_sub("0169-01-01 00:00:01",INTERVAL 2 SECOND);
|
||||
date_sub("0169-01-01 00:00:01",INTERVAL 2 SECOND)
|
||||
NULL
|
||||
End of 5.1 tests
|
||||
|
Reference in New Issue
Block a user