diff options
author | Alexander Barkov <bar@mariadb.org> | 2013-07-10 12:12:27 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2013-07-10 12:12:27 +0400 |
commit | d98584f56a5ec46d6258bba6250c6c797a678afd (patch) | |
tree | 7608b63b2a1e8bf9b6f9e74f9a0dd6a5848fbdbb /sql/item_create.cc | |
parent | 17f3ae267f3b8c189be1671f86902f24ae79cdeb (diff) | |
download | mariadb-git-d98584f56a5ec46d6258bba6250c6c797a678afd.tar.gz |
Adding support for the SQL-standard temporal literals.
added:
mysql-test/r/temporal_literal.result
mysql-test/t/temporal_literal.test
modified:
client/mysqlbinlog.cc
include/my_time.h
mysql-test/r/cast.result
mysql-test/r/partition_innodb.result
mysql-test/t/cast.test
mysql-test/t/partition_innodb.test
sql-common/my_time.c
sql/field.cc
sql/item.cc
sql/item.h
sql/item_cmpfunc.cc
sql/item_create.cc
sql/item_create.h
sql/item_strfunc.cc
sql/item_timefunc.cc
sql/item_timefunc.h
sql/sql_select.cc
sql/sql_time.cc
sql/sql_time.h
sql/sql_yacc.yy
storage/spider/spd_db_mysql.cc
Diffstat (limited to 'sql/item_create.cc')
-rw-r--r-- | sql/item_create.cc | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/sql/item_create.cc b/sql/item_create.cc index ce4dc7ced8f..c6d0f09907b 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -32,6 +32,7 @@ #include "set_var.h" #include "sp_head.h" #include "sp.h" +#include "sql_time.h" /* ============================================================================= @@ -5821,6 +5822,70 @@ create_func_cast(THD *thd, Item *a, Cast_target cast_type, } +/** + Builder for datetime literals: + TIME'00:00:00', DATE'2001-01-01', TIMESTAMP'2001-01-01 00:00:00'. + @param thd The current thread + @param str Character literal + @param length Length of str + @param type Type of literal (TIME, DATE or DATETIME) + @param send_error Whether to generate an error on failure +*/ + +Item *create_temporal_literal(THD *thd, + const char *str, uint length, + CHARSET_INFO *cs, + enum_field_types type, + bool send_error) +{ + MYSQL_TIME_STATUS status; + MYSQL_TIME ltime; + Item *item= NULL; + ulonglong datetime_flags= thd->variables.sql_mode & + (MODE_NO_ZERO_IN_DATE | + MODE_NO_ZERO_DATE | + MODE_INVALID_DATES); + ulonglong flags= TIME_FUZZY_DATE | datetime_flags; + + switch(type) + { + case MYSQL_TYPE_DATE: + case MYSQL_TYPE_NEWDATE: + if (!str_to_datetime(cs, str, length, <ime, flags, &status) && + ltime.time_type == MYSQL_TIMESTAMP_DATE && !status.warnings) + item= new (thd->mem_root) Item_date_literal(<ime); + break; + case MYSQL_TYPE_DATETIME: + if (!str_to_datetime(cs, str, length, <ime, flags, &status) && + ltime.time_type == MYSQL_TIMESTAMP_DATETIME && !status.warnings) + item= new (thd->mem_root) Item_datetime_literal(<ime, + status.precision); + break; + case MYSQL_TYPE_TIME: + if (!str_to_time(cs, str, length, <ime, 0, &status) && + ltime.time_type == MYSQL_TIMESTAMP_TIME && !status.warnings) + item= new (thd->mem_root) Item_time_literal(<ime, + status.precision); + break; + default: + DBUG_ASSERT(0); + } + + if (item) + return item; + + if (send_error) + { + const char *typestr= + (type == MYSQL_TYPE_DATE) ? "DATE" : + (type == MYSQL_TYPE_TIME) ? "TIME" : "DATETIME"; + ErrConvString err(str, length, thd->variables.character_set_client); + my_error(ER_WRONG_VALUE, MYF(0), typestr, err.ptr()); + } + return NULL; +} + + static List<Item> *create_func_dyncol_prepare(THD *thd, DYNCALL_CREATE_DEF **dfs, List<DYNCALL_CREATE_DEF> &list) |