From ed93e55bac577ba9c442b4576132a13bbe126bff Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 22 Apr 2014 11:23:35 +0400 Subject: [PATCH] MDEV-5975 Prepared statements with DATE literals do not honor NO_ZERO_IN_DATE --- mysql-test/r/temporal_literal.result | 28 ++++++++++++++++++++++++++++ mysql-test/t/temporal_literal.test | 18 ++++++++++++++++++ sql/item.cc | 2 ++ 3 files changed, 48 insertions(+) diff --git a/mysql-test/r/temporal_literal.result b/mysql-test/r/temporal_literal.result index 6b7ee2d61c7..e317eba37f0 100644 --- a/mysql-test/r/temporal_literal.result +++ b/mysql-test/r/temporal_literal.result @@ -613,3 +613,31 @@ t1 CREATE TABLE `t1` ( `TIMESTAMP'2001-01-00 00:00:00'` datetime DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1; +# +# MDEV-5975 Prepared statements with DATE literals do not honor NO_ZERO_IN_DATE +# +SET sql_mode=DEFAULT; +PREPARE stmt FROM "SELECT (SELECT DATE'2001-00-00') AS c"; +EXECUTE stmt; +c +2001-00-00 +SET sql_mode='no_zero_in_date'; +EXECUTE stmt; +c +NULL +Warnings: +Warning 1292 Incorrect datetime value: '2001-00-00' +DEALLOCATE PREPARE stmt; +SET sql_mode=DEFAULT; +PREPARE stmt FROM "SELECT (SELECT TIMESTAMP'2001-00-00 10:20:30') AS c"; +EXECUTE stmt; +c +2001-00-00 10:20:30 +SET sql_mode='no_zero_in_date'; +EXECUTE stmt; +c +NULL +Warnings: +Warning 1292 Incorrect datetime value: '2001-00-00 10:20:30' +DEALLOCATE PREPARE stmt; +SET sql_mode=DEFAULT; diff --git a/mysql-test/t/temporal_literal.test b/mysql-test/t/temporal_literal.test index 177aab0daa8..6783b19a7d4 100644 --- a/mysql-test/t/temporal_literal.test +++ b/mysql-test/t/temporal_literal.test @@ -326,3 +326,21 @@ CREATE TABLE t1 AS SELECT TIMESTAMP'2001-01-00 00:00:00'; SHOW CREATE TABLE t1; DROP TABLE t1; + +--echo # +--echo # MDEV-5975 Prepared statements with DATE literals do not honor NO_ZERO_IN_DATE +--echo # +SET sql_mode=DEFAULT; +PREPARE stmt FROM "SELECT (SELECT DATE'2001-00-00') AS c"; +EXECUTE stmt; +SET sql_mode='no_zero_in_date'; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET sql_mode=DEFAULT; +PREPARE stmt FROM "SELECT (SELECT TIMESTAMP'2001-00-00 10:20:30') AS c"; +EXECUTE stmt; +SET sql_mode='no_zero_in_date'; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; +SET sql_mode=DEFAULT; diff --git a/sql/item.cc b/sql/item.cc index 9b27f730e80..58131e1eaea 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -6509,6 +6509,7 @@ void Item_date_literal::print(String *str, enum_query_type query_type) bool Item_date_literal::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date) { DBUG_ASSERT(fixed); + fuzzy_date |= sql_mode_for_dates(current_thd); *ltime= cached_time; return (null_value= check_date_with_warn(ltime, fuzzy_date, MYSQL_TIMESTAMP_ERROR)); @@ -6528,6 +6529,7 @@ void Item_datetime_literal::print(String *str, enum_query_type query_type) bool Item_datetime_literal::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date) { DBUG_ASSERT(fixed); + fuzzy_date |= sql_mode_for_dates(current_thd); *ltime= cached_time; return (null_value= check_date_with_warn(ltime, fuzzy_date, MYSQL_TIMESTAMP_ERROR));