mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Dec. 31st, 9999 is still a valid date, only starting with Jan 1st 10000 things become invalid (Bug #12356)
mysql-test/r/func_sapdb.result: test cases for date range edge cases added mysql-test/r/func_time.result: test cases for date range edge cases added mysql-test/t/func_sapdb.test: test cases for date range edge cases added mysql-test/t/func_time.test: test cases for date range edge cases added
This commit is contained in:
@ -71,6 +71,12 @@ makedate(1997,1)
|
|||||||
select makedate(1997,0);
|
select makedate(1997,0);
|
||||||
makedate(1997,0)
|
makedate(1997,0)
|
||||||
NULL
|
NULL
|
||||||
|
select makedate(9999,365);
|
||||||
|
makedate(9999,365)
|
||||||
|
9999-12-31
|
||||||
|
select makedate(9999,366);
|
||||||
|
makedate(9999,366)
|
||||||
|
NULL
|
||||||
select addtime("1997-12-31 23:59:59.999999", "1 1:1:1.000002");
|
select addtime("1997-12-31 23:59:59.999999", "1 1:1:1.000002");
|
||||||
addtime("1997-12-31 23:59:59.999999", "1 1:1:1.000002")
|
addtime("1997-12-31 23:59:59.999999", "1 1:1:1.000002")
|
||||||
1998-01-02 01:01:01.000001
|
1998-01-02 01:01:01.000001
|
||||||
|
@ -352,6 +352,12 @@ extract(SECOND FROM "1999-01-02 10:11:12")
|
|||||||
select extract(MONTH FROM "2001-02-00");
|
select extract(MONTH FROM "2001-02-00");
|
||||||
extract(MONTH FROM "2001-02-00")
|
extract(MONTH FROM "2001-02-00")
|
||||||
2
|
2
|
||||||
|
SELECT DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
|
||||||
|
DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE)
|
||||||
|
9999-12-31 00:00:00
|
||||||
|
SELECT DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
|
||||||
|
DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE)
|
||||||
|
9999-12-31 00:00:00
|
||||||
SELECT "1900-01-01 00:00:00" + INTERVAL 2147483648 SECOND;
|
SELECT "1900-01-01 00:00:00" + INTERVAL 2147483648 SECOND;
|
||||||
"1900-01-01 00:00:00" + INTERVAL 2147483648 SECOND
|
"1900-01-01 00:00:00" + INTERVAL 2147483648 SECOND
|
||||||
1968-01-20 03:14:08
|
1968-01-20 03:14:08
|
||||||
|
@ -37,6 +37,8 @@ select weekofyear("1997-11-31 23:59:59.000001");
|
|||||||
|
|
||||||
select makedate(1997,1);
|
select makedate(1997,1);
|
||||||
select makedate(1997,0);
|
select makedate(1997,0);
|
||||||
|
select makedate(9999,365);
|
||||||
|
select makedate(9999,366);
|
||||||
|
|
||||||
#Time functions
|
#Time functions
|
||||||
|
|
||||||
|
@ -139,6 +139,12 @@ select extract(MINUTE_SECOND FROM "10:11:12");
|
|||||||
select extract(SECOND FROM "1999-01-02 10:11:12");
|
select extract(SECOND FROM "1999-01-02 10:11:12");
|
||||||
select extract(MONTH FROM "2001-02-00");
|
select extract(MONTH FROM "2001-02-00");
|
||||||
|
|
||||||
|
#
|
||||||
|
# MySQL Bugs: #12356: DATE_SUB or DATE_ADD incorrectly returns null
|
||||||
|
#
|
||||||
|
SELECT DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
|
||||||
|
SELECT DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test big intervals (Bug #3498)
|
# Test big intervals (Bug #3498)
|
||||||
#
|
#
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
/* TODO: Move month and days to language files */
|
/* TODO: Move month and days to language files */
|
||||||
|
|
||||||
|
/* Day number for Dec 31st, 9999 */
|
||||||
#define MAX_DAY_NUMBER 3652424L
|
#define MAX_DAY_NUMBER 3652424L
|
||||||
|
|
||||||
static const char *month_names[]=
|
static const char *month_names[]=
|
||||||
@ -401,7 +402,7 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
|
|||||||
if (yearday > 0)
|
if (yearday > 0)
|
||||||
{
|
{
|
||||||
uint days= calc_daynr(l_time->year,1,1) + yearday - 1;
|
uint days= calc_daynr(l_time->year,1,1) + yearday - 1;
|
||||||
if (days <= 0 || days >= MAX_DAY_NUMBER)
|
if (days <= 0 || days > MAX_DAY_NUMBER)
|
||||||
goto err;
|
goto err;
|
||||||
get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
|
get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
|
||||||
}
|
}
|
||||||
@ -447,7 +448,7 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
|
|||||||
(weekday - 1);
|
(weekday - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (days <= 0 || days >= MAX_DAY_NUMBER)
|
if (days <= 0 || days > MAX_DAY_NUMBER)
|
||||||
goto err;
|
goto err;
|
||||||
get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
|
get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
|
||||||
}
|
}
|
||||||
@ -1931,7 +1932,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
|
|||||||
ltime->hour= (uint) (sec/3600);
|
ltime->hour= (uint) (sec/3600);
|
||||||
daynr= calc_daynr(ltime->year,ltime->month,1) + days;
|
daynr= calc_daynr(ltime->year,ltime->month,1) + days;
|
||||||
/* Day number from year 0 to 9999-12-31 */
|
/* Day number from year 0 to 9999-12-31 */
|
||||||
if ((ulonglong) daynr >= MAX_DAY_NUMBER)
|
if ((ulonglong) daynr > MAX_DAY_NUMBER)
|
||||||
goto null_date;
|
goto null_date;
|
||||||
get_date_from_daynr((long) daynr, <ime->year, <ime->month,
|
get_date_from_daynr((long) daynr, <ime->year, <ime->month,
|
||||||
<ime->day);
|
<ime->day);
|
||||||
@ -1941,7 +1942,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
|
|||||||
period= (calc_daynr(ltime->year,ltime->month,ltime->day) +
|
period= (calc_daynr(ltime->year,ltime->month,ltime->day) +
|
||||||
sign * (long) interval.day);
|
sign * (long) interval.day);
|
||||||
/* Daynumber from year 0 to 9999-12-31 */
|
/* Daynumber from year 0 to 9999-12-31 */
|
||||||
if ((ulong) period >= MAX_DAY_NUMBER)
|
if ((ulong) period > MAX_DAY_NUMBER)
|
||||||
goto null_date;
|
goto null_date;
|
||||||
get_date_from_daynr((long) period,<ime->year,<ime->month,<ime->day);
|
get_date_from_daynr((long) period,<ime->year,<ime->month,<ime->day);
|
||||||
break;
|
break;
|
||||||
@ -2412,7 +2413,7 @@ String *Item_func_makedate::val_str(String *str)
|
|||||||
|
|
||||||
days= calc_daynr(yearnr,1,1) + daynr - 1;
|
days= calc_daynr(yearnr,1,1) + daynr - 1;
|
||||||
/* Day number from year 0 to 9999-12-31 */
|
/* Day number from year 0 to 9999-12-31 */
|
||||||
if (days >= 0 && days < MAX_DAY_NUMBER)
|
if (days >= 0 && days <= MAX_DAY_NUMBER)
|
||||||
{
|
{
|
||||||
null_value=0;
|
null_value=0;
|
||||||
get_date_from_daynr(days,&l_time.year,&l_time.month,&l_time.day);
|
get_date_from_daynr(days,&l_time.year,&l_time.month,&l_time.day);
|
||||||
|
Reference in New Issue
Block a user