From ae154449f1617585e8c6237331fa8a3db4e674bb Mon Sep 17 00:00:00 2001 From: Tor Didriksen Date: Thu, 28 Apr 2011 09:03:56 +0200 Subject: [PATCH] Bug#12340997 - DATE_ADD/DATE_SUB WITH INTERVAL CRASHES IN GET_INTERVAL_VALUE() get_interval_value() was trying to parse the input string, looking for leading '-' while skipping whitespace. The macro my_isspace() does not work for utf16 character set, since my_charset_utf16_general_ci.ctype == NULL. Solution: convert input to ASCII before parsing. mysql-test/r/ctype_utf16.result: New test case. mysql-test/t/ctype_utf16.test: New test case. sql/item_timefunc.cc: Use val_string_ascii() rather than val_string() so that we can safely use my_isspace() for skipping whitespace. --- mysql-test/r/ctype_utf16.result | 9 +++++++++ mysql-test/t/ctype_utf16.test | 7 +++++++ sql/item_timefunc.cc | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/ctype_utf16.result b/mysql-test/r/ctype_utf16.result index ebb1bd443a2..dfffd8142de 100644 --- a/mysql-test/r/ctype_utf16.result +++ b/mysql-test/r/ctype_utf16.result @@ -1117,5 +1117,14 @@ CASE s1 WHEN 'a' THEN 'b' ELSE 'c' END b DROP TABLE t1; # +# Bug#12340997 +# DATE_ADD/DATE_SUB WITH INTERVAL CRASHES IN GET_INTERVAL_VALUE() +# +SELECT space(date_add(101, INTERVAL CHAR('1' USING utf16) hour_second)); +space(date_add(101, INTERVAL CHAR('1' USING utf16) hour_second)) +NULL +Warnings: +Warning 1301 Result of repeat() was larger than max_allowed_packet (1048576) - truncated +# # End of 5.5 tests # diff --git a/mysql-test/t/ctype_utf16.test b/mysql-test/t/ctype_utf16.test index 2f1651d0f40..4ac47a4ac53 100644 --- a/mysql-test/t/ctype_utf16.test +++ b/mysql-test/t/ctype_utf16.test @@ -755,6 +755,13 @@ INSERT INTO t1 VALUES ('a'); SELECT CASE s1 WHEN 'a' THEN 'b' ELSE 'c' END FROM t1; DROP TABLE t1; +--echo # +--echo # Bug#12340997 +--echo # DATE_ADD/DATE_SUB WITH INTERVAL CRASHES IN GET_INTERVAL_VALUE() +--echo # + +SELECT space(date_add(101, INTERVAL CHAR('1' USING utf16) hour_second)); + # ## TODO: add tests for all engines # diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 19e7b3f52ef..36b85f2411f 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -1430,7 +1430,7 @@ bool get_interval_value(Item *args,interval_type int_type, else { String *res; - if (!(res=args->val_str(str_value))) + if (!(res= args->val_str_ascii(str_value))) return (1); /* record negative intervalls in interval->neg */