summaryrefslogtreecommitdiff
path: root/sql/item_timefunc.cc
diff options
context:
space:
mode:
authorSreeharsha Ramanavarapu <sreeharsha.ramanavarapu@oracle.com>2015-12-31 07:31:12 +0530
committerSreeharsha Ramanavarapu <sreeharsha.ramanavarapu@oracle.com>2015-12-31 07:31:12 +0530
commitcb15cce746db6c32cb62c70bd356b2db61267fd9 (patch)
treea2d122afa60bd1c2c7923edf7a540439e3cdb4a2 /sql/item_timefunc.cc
parent1ec594dd60aa3b58e7d1c686016695b5b0bc1aa1 (diff)
downloadmariadb-git-cb15cce746db6c32cb62c70bd356b2db61267fd9.tar.gz
Bug #21564557: INCONSISTENT OUTPUT FROM 5.5 AND 5.6
UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%M" Issue: ----- When an invalid date is supplied to the UNIX_TIMESTAMP function from STR_TO_DATE, no check is performed before converting it to a timestamp value. SOLUTION: --------- Add the check_date function and only if it succeeds, proceed to the timestamp conversion. No warning will be returned for dates having zero in month/date, since partial dates are allowed. UNIX_TIMESTAMP will return only a zero for such values. The problem has been handled in 5.6+ with WL#946.
Diffstat (limited to 'sql/item_timefunc.cc')
-rw-r--r--sql/item_timefunc.cc13
1 files changed, 9 insertions, 4 deletions
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc
index 840c8e55efe..00145540e6d 100644
--- a/sql/item_timefunc.cc
+++ b/sql/item_timefunc.cc
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -1378,7 +1378,7 @@ longlong Item_func_year::val_int_endpoint(bool left_endp, bool *incl_endp)
longlong Item_func_unix_timestamp::val_int()
{
MYSQL_TIME ltime;
- my_bool not_used;
+ my_bool not_used= 0;
DBUG_ASSERT(fixed == 1);
if (arg_count == 0)
@@ -1390,7 +1390,7 @@ longlong Item_func_unix_timestamp::val_int()
return ((Field_timestamp*) field)->get_timestamp(&null_value);
}
- if (get_arg0_date(&ltime, 0))
+ if (get_arg0_date(&ltime, TIME_FUZZY_DATE))
{
/*
We have to set null_value again because get_arg0_date will also set it
@@ -1400,7 +1400,11 @@ longlong Item_func_unix_timestamp::val_int()
null_value= args[0]->null_value;
return 0;
}
-
+
+ int dummy= 0;
+ if (check_date(&ltime, non_zero_date(&ltime), TIME_NO_ZERO_IN_DATE, &dummy))
+ return 0;
+
return (longlong) TIME_to_timestamp(current_thd, &ltime, &not_used);
}
@@ -3482,6 +3486,7 @@ bool Item_func_str_to_date::get_date(MYSQL_TIME *ltime, uint fuzzy_date)
String val_string(val_buff, sizeof(val_buff), &my_charset_bin), *val;
String format_str(format_buff, sizeof(format_buff), &my_charset_bin), *format;
+ fuzzy_date|= sql_mode;
val= args[0]->val_str(&val_string);
format= args[1]->val_str(&format_str);
if (args[0]->null_value || args[1]->null_value)