diff --git a/mysql-test/r/old-mode.result b/mysql-test/r/old-mode.result index 0b10067c19b..b7e1ee26391 100644 --- a/mysql-test/r/old-mode.result +++ b/mysql-test/r/old-mode.result @@ -22,6 +22,7 @@ Id User Host db Command Time State Info # # MDEV-5372 Make "CAST(time_expr AS DATETIME)" compatible with the SQL Standard) # +set @@old_mode=zero_date_time_cast; SELECT CAST(TIME'-10:30:30' AS DATETIME); CAST(TIME'-10:30:30' AS DATETIME) NULL diff --git a/mysql-test/suite/sys_vars/r/old_mode_basic.result b/mysql-test/suite/sys_vars/r/old_mode_basic.result index c9a650e7b15..052221d796e 100644 --- a/mysql-test/suite/sys_vars/r/old_mode_basic.result +++ b/mysql-test/suite/sys_vars/r/old_mode_basic.result @@ -111,10 +111,14 @@ SELECT @@global.old_mode; @@global.old_mode NO_PROGRESS_INFO SET @@global.old_mode = 4; -ERROR 42000: Variable 'old_mode' can't be set to the value of '4' SELECT @@global.old_mode; @@global.old_mode -NO_PROGRESS_INFO +ZERO_DATE_TIME_CAST +SET @@global.old_mode = 8; +ERROR 42000: Variable 'old_mode' can't be set to the value of '8' +SELECT @@global.old_mode; +@@global.old_mode +ZERO_DATE_TIME_CAST SET @@global.old_mode = 0.4; ERROR 42000: Incorrect argument type to variable 'old_mode' '#---------------------FN_DYNVARS_152_08----------------------#' diff --git a/mysql-test/suite/sys_vars/t/old_mode_basic.test b/mysql-test/suite/sys_vars/t/old_mode_basic.test index 6770219887d..93a93960836 100644 --- a/mysql-test/suite/sys_vars/t/old_mode_basic.test +++ b/mysql-test/suite/sys_vars/t/old_mode_basic.test @@ -168,10 +168,13 @@ SELECT @@global.old_mode; SET @@global.old_mode = 2; SELECT @@global.old_mode; ---Error ER_WRONG_VALUE_FOR_VAR SET @@global.old_mode = 4; SELECT @@global.old_mode; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.old_mode = 8; +SELECT @@global.old_mode; + # use of decimal values --Error ER_WRONG_TYPE_FOR_VAR diff --git a/mysql-test/t/old-mode.test b/mysql-test/t/old-mode.test index 56916aefd77..483549886db 100644 --- a/mysql-test/t/old-mode.test +++ b/mysql-test/t/old-mode.test @@ -29,7 +29,7 @@ SHOW PROCESSLIST; --echo # --echo # MDEV-5372 Make "CAST(time_expr AS DATETIME)" compatible with the SQL Standard) --echo # -# Checking that "mysqld --old" exposes the 5.5 conversion behaviour +set @@old_mode=zero_date_time_cast; SELECT CAST(TIME'-10:30:30' AS DATETIME); SELECT CAST(TIME'10:20:30' AS DATETIME); SELECT CAST(TIME'830:20:30' AS DATETIME); @@ -53,12 +53,12 @@ SELECT a, CAST(a AS DATETIME), TO_DAYS(a) FROM t1; DROP TABLE t1; # Note, it was actually a bug that TO_DAYS('830:20:30') returned NULL # for a column, while 3 for an expression. We won't fix this, -# it's "mysqld --old" anyway. +# it's "old_mode" anyway. SELECT TO_DAYS(TIME'-10:20:30'); SELECT TO_DAYS(TIME'10:20:30'); SELECT TO_DAYS(TIME'830:20:30'); -# This is to cover Item_temporal_hybrid_func::fix_temporal_type in --old mode: +# This is to cover Item_temporal_hybrid_func::fix_temporal_type in old_mode: CREATE TABLE t1 (a DATETIME, b TIME); INSERT INTO t1 VALUES (NULL, '00:20:12'); INSERT INTO t1 VALUES (NULL, '-00:20:12'); diff --git a/sql/item.cc b/sql/item.cc index 1c81fda9c63..0fbd58567ef 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -248,7 +248,8 @@ bool Item::get_date_with_conversion(MYSQL_TIME *ltime, ulonglong fuzzydate) and leave it to get_date() to check date. */ ulonglong time_flag= (field_type() == MYSQL_TYPE_TIME && - !current_thd->variables.old_mode) ? TIME_TIME_ONLY : 0; + !(current_thd->variables.old_behavior & OLD_MODE_ZERO_DATE_TIME_CAST)) ? + TIME_TIME_ONLY : 0; if (get_date(ltime, fuzzydate | time_flag)) return true; if (ltime->time_type == MYSQL_TIMESTAMP_TIME && diff --git a/sql/sql_class.h b/sql/sql_class.h index ef28d860b04..140fe934b44 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -121,8 +121,9 @@ enum enum_filetype { FILETYPE_CSV, FILETYPE_XML }; #define MODE_PAD_CHAR_TO_FULL_LENGTH (1ULL << 31) /* Bits for different old style modes */ -#define OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE 1 -#define OLD_MODE_NO_PROGRESS_INFO 2 +#define OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE (1 << 0) +#define OLD_MODE_NO_PROGRESS_INFO (1 << 1) +#define OLD_MODE_ZERO_DATE_TIME_CAST (1 << 2) extern char internal_table_name[2]; extern char empty_c_string[1]; diff --git a/sql/sql_time.cc b/sql/sql_time.cc index 06098094505..2c4998fdf5e 100644 --- a/sql/sql_time.cc +++ b/sql/sql_time.cc @@ -1243,7 +1243,7 @@ time_to_datetime_old(THD *thd, const MYSQL_TIME *from, MYSQL_TIME *to) bool time_to_datetime(THD *thd, const MYSQL_TIME *from, MYSQL_TIME *to) { - if (thd->variables.old_mode) + if (thd->variables.old_behavior & OLD_MODE_ZERO_DATE_TIME_CAST) return time_to_datetime_old(thd, from, to); set_current_date(thd, to); mix_date_and_time(to, from); @@ -1266,7 +1266,8 @@ time_to_datetime_with_warn(THD *thd, only in the old mode. */ if (time_to_datetime(thd, from, to) || - (thd->variables.old_mode && check_date(to, fuzzydate, &warn))) + ((thd->variables.old_behavior && OLD_MODE_ZERO_DATE_TIME_CAST) && + check_date(to, fuzzydate, &warn))) { ErrConvTime str(from); make_truncated_value_warning(thd, Sql_condition::WARN_LEVEL_WARN, @@ -1274,4 +1275,4 @@ time_to_datetime_with_warn(THD *thd, return true; } return false; -} \ No newline at end of file +} diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 20784ce9301..0324da0ae55 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -2876,7 +2876,9 @@ static Sys_var_set Sys_sql_mode( static const char *old_mode_names[]= { - "NO_DUP_KEY_WARNINGS_WITH_IGNORE", "NO_PROGRESS_INFO", + "NO_DUP_KEY_WARNINGS_WITH_IGNORE", + "NO_PROGRESS_INFO", + "ZERO_DATE_TIME_CAST", 0 };