From: Alexander Barkov Date: February 28 2011 11:34am Subject: bzr commit into mysql-5.5 branch (alexander.barkov:3357) Bug#44793 Bug#11753363 List-Archive: http://lists.mysql.com/commits/132102 X-Bug: 44793,11753363 Message-Id: <201102281134.p1SBYhgU001685@bar.myoffice.izhnet.ru> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5906797665429391139==" --===============5906797665429391139== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/bar/mysql-bzr/mysql-5.5.b44793/ based on revid:tor.didriksen@stripped 3357 Alexander Barkov 2011-02-28 Bug#11753363 (bug#44793) CHARACTER SETS: CASE CLAUSE, UCS2 OR UTF32, FAILURE Problem: in case of string CASE/WHEN arguments with different character sets, Item_func_case::find_item() called comparator cmp_items[x] on mixed character set Items, so a 8-bit value could be errouneously referenced to as being utf16/utf32 value, which led to crash on DBUG_ASSERT() because of wrong value length. This was wrong, as string comparator expects arguments in the same character set. Fix: modify Item_func_case's argument list after calling agg_arg_charsets_for_comparison() - put the Items in "agg" array back to "args", because some of the Items in the "agg" array might have been changed to character set converters: - to Item_func_conv_charset for non-constant items - to Item_string for constant items In other words, perform the same substitution which is done in all other operations string comparison or string result operations: Replace CASE latin1_item WHEN utf16_item THEN ... END to CASE CONVERT(latin1_item USING utf16) WHEN utf16_item THEN ... END Replace CASE utf16_item WHEN latin1_item THEN ... END to CASE utf16_item WHEN CONVERT(latin1_item USING utf16) THEN ... END @ mysql-test/r/ctype_utf16.result @ mysql-test/r/ctype_utf32.result @ mysql-test/t/ctype_utf16.test @ mysql-test/t/ctype_utf32.test Adding tests @ sql/item_cmpfunc.cc Put "agg" back to "args". @ sql/sql_string.cc Backporting a fix for String::set_or_copy_aligned() from 5.6, for better test coverage: "SELECT _utf16 0x61" should expand the string to 0x0061 rather than to 0x000061. This fix was made in 5.6 under terms of "WL#4616 Implement UTF16-LE". modified: mysql-test/r/ctype_utf16.result mysql-test/r/ctype_utf32.result mysql-test/t/ctype_utf16.test mysql-test/t/ctype_utf32.test sql/item_cmpfunc.cc sql/sql_string.cc === modified file 'mysql-test/r/ctype_utf16.result' --- a/mysql-test/r/ctype_utf16.result 2010-11-24 14:52:57 +0000 +++ b/mysql-test/r/ctype_utf16.result 2011-02-28 11:34:29 +0000 @@ -30,13 +30,13 @@ binary 'a a' > 'a' binary 'a \0' > 'a' 1 1 1 select hex(_utf16 0x44); hex(_utf16 0x44) -00000044 +0044 select hex(_utf16 0x3344); hex(_utf16 0x3344) 3344 select hex(_utf16 0x113344); hex(_utf16 0x113344) -000000113344 +00113344 CREATE TABLE t1 (word VARCHAR(64), word2 CHAR(64)) CHARACTER SET utf16; INSERT INTO t1 VALUES (_koi8r 0xF2, _koi8r 0xF2), (X'2004',X'2004'); SELECT hex(word) FROM t1 ORDER BY word; @@ -434,10 +434,10 @@ aardvarz DROP TABLE t1; SELECT hex(cast(0xAA as char character set utf16)); hex(cast(0xAA as char character set utf16)) -000000AA +00AA SELECT hex(convert(0xAA using utf16)); hex(convert(0xAA using utf16)) -000000AA +00AA CREATE TABLE t1 (a char(10) character set utf16); INSERT INTO t1 VALUES (0x1),(0x11),(0x111),(0x1111),(0x11111); SELECT HEX(a) FROM t1; @@ -1102,5 +1102,20 @@ t2 CREATE TABLE `t2` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1, t2; # +# Bug#11753363 (Bug#44793) Character sets: case clause, ucs2 or utf32, failure +# +SELECT CASE _latin1'a' WHEN _utf16'a' THEN 'A' END; +CASE _latin1'a' WHEN _utf16'a' THEN 'A' END +A +SELECT CASE _utf16'a' WHEN _latin1'a' THEN 'A' END; +CASE _utf16'a' WHEN _latin1'a' THEN 'A' END +A +CREATE TABLE t1 (s1 CHAR(5) CHARACTER SET utf16); +INSERT INTO t1 VALUES ('a'); +SELECT CASE s1 WHEN 'a' THEN 'b' ELSE 'c' END FROM t1; +CASE s1 WHEN 'a' THEN 'b' ELSE 'c' END +b +DROP TABLE t1; +# # End of 5.5 tests # === modified file 'mysql-test/r/ctype_utf32.result' --- a/mysql-test/r/ctype_utf32.result 2010-09-28 15:15:58 +0000 +++ b/mysql-test/r/ctype_utf32.result 2011-02-28 11:34:29 +0000 @@ -1152,5 +1152,20 @@ d f DROP TABLE t1; # +# Bug#11753363 (Bug#44793) Character sets: case clause, ucs2 or utf32, failure +# +SELECT CASE _latin1'a' WHEN _utf32'a' THEN 'A' END; +CASE _latin1'a' WHEN _utf32'a' THEN 'A' END +A +SELECT CASE _utf32'a' WHEN _latin1'a' THEN 'A' END; +CASE _utf32'a' WHEN _latin1'a' THEN 'A' END +A +CREATE TABLE t1 (s1 CHAR(5) CHARACTER SET utf32); +INSERT INTO t1 VALUES ('a'); +SELECT CASE s1 WHEN 'a' THEN 'b' ELSE 'c' END FROM t1; +CASE s1 WHEN 'a' THEN 'b' ELSE 'c' END +b +DROP TABLE t1; +# # End of 5.5 tests # === modified file 'mysql-test/t/ctype_utf16.test' --- a/mysql-test/t/ctype_utf16.test 2010-09-28 15:15:58 +0000 +++ b/mysql-test/t/ctype_utf16.test 2011-02-28 11:34:29 +0000 @@ -745,6 +745,15 @@ CREATE TABLE t2 AS SELECT CONCAT(s1) FRO SHOW CREATE TABLE t2; DROP TABLE t1, t2; +--echo # +--echo # Bug#11753363 (Bug#44793) Character sets: case clause, ucs2 or utf32, failure +--echo # +SELECT CASE _latin1'a' WHEN _utf16'a' THEN 'A' END; +SELECT CASE _utf16'a' WHEN _latin1'a' THEN 'A' END; +CREATE TABLE t1 (s1 CHAR(5) CHARACTER SET utf16); +INSERT INTO t1 VALUES ('a'); +SELECT CASE s1 WHEN 'a' THEN 'b' ELSE 'c' END FROM t1; +DROP TABLE t1; # ## TODO: add tests for all engines === modified file 'mysql-test/t/ctype_utf32.test' --- a/mysql-test/t/ctype_utf32.test 2010-09-28 15:15:58 +0000 +++ b/mysql-test/t/ctype_utf32.test 2011-02-28 11:34:29 +0000 @@ -831,5 +831,15 @@ SELECT * FROM t1 WHERE b BETWEEN 'a' AND DROP TABLE t1; --echo # +--echo # Bug#11753363 (Bug#44793) Character sets: case clause, ucs2 or utf32, failure +--echo # +SELECT CASE _latin1'a' WHEN _utf32'a' THEN 'A' END; +SELECT CASE _utf32'a' WHEN _latin1'a' THEN 'A' END; +CREATE TABLE t1 (s1 CHAR(5) CHARACTER SET utf32); +INSERT INTO t1 VALUES ('a'); +SELECT CASE s1 WHEN 'a' THEN 'b' ELSE 'c' END FROM t1; +DROP TABLE t1; + +--echo # --echo # End of 5.5 tests --echo # === modified file 'sql/item_cmpfunc.cc' --- a/sql/item_cmpfunc.cc 2011-02-18 07:32:40 +0000 +++ b/sql/item_cmpfunc.cc 2011-02-28 11:34:29 +0000 @@ -3059,15 +3059,23 @@ void Item_func_case::fix_length_and_dec( nagg++; if (!(found_types= collect_cmp_types(agg, nagg))) return; - + if (found_types & (1 << STRING_RESULT)) + { + if (agg_arg_charsets_for_comparison(cmp_collation, agg, nagg)) + return; + /* + Copy all CASE and WHEN items back to args[] arrray. + Some of the items might have been changed to Item_func_conv_charset. + */ + args[first_expr_num]= agg[0]; + for (nagg= 0; nagg < ncases / 2; nagg++) + args[nagg * 2]= agg[nagg + 1]; + } for (i= 0; i <= (uint)DECIMAL_RESULT; i++) { if (found_types & (1 << i) && !cmp_items[i]) { DBUG_ASSERT((Item_result)i != ROW_RESULT); - if ((Item_result)i == STRING_RESULT && - agg_arg_charsets_for_comparison(cmp_collation, agg, nagg)) - return; if (!(cmp_items[i]= cmp_item::get_comparator((Item_result)i, cmp_collation.collation))) === modified file 'sql/sql_string.cc' --- a/sql/sql_string.cc 2011-01-13 08:07:21 +0000 +++ b/sql/sql_string.cc 2011-02-28 11:34:29 +0000 @@ -252,8 +252,8 @@ bool String::copy_aligned(const char *st CHARSET_INFO *cs) { /* How many bytes are in incomplete character */ - offset= cs->mbmaxlen - offset; /* How many zeros we should prepend */ - DBUG_ASSERT(offset && offset != cs->mbmaxlen); + offset= cs->mbminlen - offset; /* How many zeros we should prepend */ + DBUG_ASSERT(offset && offset != cs->mbminlen); uint32 aligned_length= arg_length + offset; if (alloc(aligned_length)) --===============5906797665429391139== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/alexander.barkov@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alexander.barkov@stripped\ # 96ihkkj6v54b9lre # target_branch: file:///home/bar/mysql-bzr/mysql-5.5.b44793/ # testament_sha1: 79b5206568a3e9073367a128463837530d6248ed # timestamp: 2011-02-28 14:34:43 +0300 # base_revision_id: tor.didriksen@stripped\ # qmhcbs7oyzdgiyyy # # Begin bundle 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 EfMCEaA= --===============5906797665429391139==--