summaryrefslogtreecommitdiff
path: root/sql/sql_parse.cc
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2012-12-17 20:47:23 +0100
committerSergei Golubchik <sergii@pisem.net>2012-12-17 20:47:23 +0100
commit1d2b11b291e2ac797ffae59b13f0c94967c052c6 (patch)
treebac461df8a83eeccb0b2be3cef7590d5bfcaa146 /sql/sql_parse.cc
parentcb7f5948ecedaaaf68de5bdbfab78f1c2e934453 (diff)
downloadmariadb-git-1d2b11b291e2ac797ffae59b13f0c94967c052c6.tar.gz
MDEV-438 Microseconds: Precision is ignored in CURRENT_TIMESTAMP(N) when it is given as a default column value
For MySQL 5.6 compatibility, support precision specification in CURRENT_TIMESTAMP in a default clause, when it's not less than the column's precision.
Diffstat (limited to 'sql/sql_parse.cc')
-rw-r--r--sql/sql_parse.cc10
1 files changed, 7 insertions, 3 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 7bc4f8f1833..3cab8e17533 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -5955,6 +5955,7 @@ bool add_field_to_list(THD *thd, LEX_STRING *field_name, enum_field_types type,
{
register Create_field *new_field;
LEX *lex= thd->lex;
+ uint8 datetime_precision= length ? atoi(length) : 0;
DBUG_ENTER("add_field_to_list");
if (check_string_char_length(field_name, "", NAME_CHAR_LEN,
@@ -5994,8 +5995,10 @@ bool add_field_to_list(THD *thd, LEX_STRING *field_name, enum_field_types type,
NOW() as default for TIMESTAMP and DATETIME type.
*/
if (default_value->type() == Item::FUNC_ITEM &&
- !(((Item_func*)default_value)->functype() == Item_func::NOW_FUNC &&
- (type == MYSQL_TYPE_TIMESTAMP || type == MYSQL_TYPE_DATETIME)))
+ (static_cast<Item_func*>(default_value)->functype() !=
+ Item_func::NOW_FUNC ||
+ (mysql_type_to_time_type(type) != MYSQL_TIMESTAMP_DATETIME) ||
+ default_value->decimals < datetime_precision))
{
my_error(ER_INVALID_DEFAULT, MYF(0), field_name->str);
DBUG_RETURN(1);
@@ -6018,7 +6021,8 @@ bool add_field_to_list(THD *thd, LEX_STRING *field_name, enum_field_types type,
}
if (on_update_value &&
- !(type == MYSQL_TYPE_TIMESTAMP || type == MYSQL_TYPE_DATETIME))
+ (mysql_type_to_time_type(type) != MYSQL_TIMESTAMP_DATETIME ||
+ on_update_value->decimals < datetime_precision))
{
my_error(ER_INVALID_ON_UPDATE, MYF(0), field_name->str);
DBUG_RETURN(1);