From: Alexander Barkov Date: March 3 2011 2:42pm Subject: bzr commit into mysql-5.1 branch (alexander.barkov:3609) List-Archive: http://lists.mysql.com/commits/132380 Message-Id: <201103031443.p23Eh1bv020406@bar.myoffice.izhnet.ru> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2385491836471034466==" --===============2385491836471034466== 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.1/ based on revid:alexander.barkov@stripped 3609 Alexander Barkov 2011-03-03 Bug 11766519 - 59648: MY_STRTOLL10_MB2: ASSERTION `(*ENDPTR - S) % 2 == 0' FAILED. Part 2. @ mysql-test/r/ctype_ucs.result @ mysql-test/t/ctype_ucs.test Adding tests @ sql/item_strfunc.cc Fixing Item_func_quote::val_str to be multi-byte safe. @ sql/item_strfunc.h Multiple size needed for quote characters to mbmaxlen modified: mysql-test/r/ctype_ucs.result mysql-test/t/ctype_ucs.test sql/item_strfunc.cc sql/item_strfunc.h === modified file 'mysql-test/r/ctype_ucs.result' --- a/mysql-test/r/ctype_ucs.result 2011-03-03 12:04:04 +0000 +++ b/mysql-test/r/ctype_ucs.result 2011-03-03 14:41:19 +0000 @@ -990,8 +990,8 @@ old_password(name) ???????? select quote(name) from bug20536; quote(name) -???????? -???????????????? +'test1' +'\'test\\_2\'' drop table bug20536; set names ucs2; ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2' @@ -1244,4 +1244,9 @@ DROP TABLE t1; SELECT HEX(CHAR(COALESCE(NULL, CHAR(COUNT('%s') USING ucs2), 1, @@global.license, NULL) USING cp850)); HEX(CHAR(COALESCE(NULL, CHAR(COUNT('%s') USING ucs2), 1, @@global.license, NULL) USING cp850)) 00 +SELECT CONVERT(QUOTE(CHAR(0xf5 using ucs2)), SIGNED); +CONVERT(QUOTE(CHAR(0xf5 using ucs2)), SIGNED) +0 +Warnings: +Warning 1292 Truncated incorrect INTEGER value: '' End of 5.0 tests === modified file 'mysql-test/t/ctype_ucs.test' --- a/mysql-test/t/ctype_ucs.test 2011-03-03 12:04:04 +0000 +++ b/mysql-test/t/ctype_ucs.test 2011-03-03 14:41:19 +0000 @@ -745,5 +745,6 @@ DROP TABLE t1; --echo # Bug#59648 my_strtoll10_mb2: Assertion `(*endptr - s) % 2 == 0' failed. --echo # SELECT HEX(CHAR(COALESCE(NULL, CHAR(COUNT('%s') USING ucs2), 1, @@global.license, NULL) USING cp850)); +SELECT CONVERT(QUOTE(CHAR(0xf5 using ucs2)), SIGNED); --echo End of 5.0 tests === modified file 'sql/item_strfunc.cc' --- a/sql/item_strfunc.cc 2011-03-03 12:04:04 +0000 +++ b/sql/item_strfunc.cc 2011-03-03 14:41:19 +0000 @@ -3214,14 +3214,68 @@ String *Item_func_quote::val_str(String } arg_length= arg->length(); - new_length= arg_length+2; /* for beginning and ending ' signs */ - for (from= (char*) arg->ptr(), end= from + arg_length; from < end; from++) - new_length+= get_esc_bit(escmask, (uchar) *from); + if (collation.collation->mbmaxlen == 1) + { + new_length= arg_length + 2; /* for beginning and ending ' signs */ + for (from= (char*) arg->ptr(), end= from + arg_length; from < end; from++) + new_length+= get_esc_bit(escmask, (uchar) *from); + } + else + { + new_length= (arg_length * 2) /* For string characters */ + + (2 * collation.collation->mbmaxlen) /* For quotes */; + } if (tmp_value.alloc(new_length)) goto null; + if (collation.collation->mbmaxlen > 1) + { + CHARSET_INFO *cs= collation.collation; + int mblen; + uchar *to_end; + to= (char*) tmp_value.ptr(); + to_end= (uchar*) to + new_length; + + /* Put leading quote */ + if ((mblen= cs->cset->wc_mb(cs, '\'', (uchar *) to, to_end)) <= 0) + goto null; + to+= mblen; + + for (start= (char*) arg->ptr(), end= start + arg_length; start < end; ) + { + my_wc_t wc; + bool escape; + if ((mblen= cs->cset->mb_wc(cs, &wc, (uchar*) start, (uchar*) end)) <= 0) + goto null; + start+= mblen; + switch (wc) { + case 0: escape= 1; wc= '0'; break; + case '\032': escape= 1; wc= 'Z'; break; + case '\'': escape= 1; break; + case '\\': escape= 1; break; + default: escape= 0; break; + } + if (escape) + { + if ((mblen= cs->cset->wc_mb(cs, '\\', (uchar*) to, to_end)) <= 0) + goto null; + to+= mblen; + } + if ((mblen= cs->cset->wc_mb(cs, wc, (uchar*) to, to_end)) <= 0) + goto null; + to+= mblen; + } + + /* Put trailing quote */ + if ((mblen= cs->cset->wc_mb(cs, '\'', (uchar *) to, to_end)) <= 0) + goto null; + to+= mblen; + new_length= to - tmp_value.ptr(); + goto ret; + } + /* We replace characters from the end to the beginning */ @@ -3253,6 +3307,8 @@ String *Item_func_quote::val_str(String } } *to= '\''; + +ret: tmp_value.length(new_length); tmp_value.set_charset(collation.collation); null_value= 0; === modified file 'sql/item_strfunc.h' --- a/sql/item_strfunc.h 2011-01-17 12:11:33 +0000 +++ b/sql/item_strfunc.h 2011-03-03 14:41:19 +0000 @@ -704,9 +704,10 @@ public: String *val_str(String *); void fix_length_and_dec() { - ulonglong max_result_length= (ulonglong) args[0]->max_length * 2 + 2; - max_length= (uint32) min(max_result_length, MAX_BLOB_WIDTH); collation.set(args[0]->collation); + ulonglong max_result_length= (ulonglong) args[0]->max_length * 2 + + 2 * collation.collation->mbmaxlen; + max_length= (uint32) min(max_result_length, MAX_BLOB_WIDTH); } }; --===============2385491836471034466== 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\ # z7ff02hb8hyh400g # target_branch: file:///home/bar/mysql-bzr/mysql-5.1/ # testament_sha1: 6a2a79778c5fc627ac99c03ace8f7cfb003f537b # timestamp: 2011-03-03 17:43:01 +0300 # base_revision_id: alexander.barkov@stripped\ # 7n48nyf81a0n9dvd # # Begin bundle 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 i3NyZzOG/+LuSKcKEhZHcO+A --===============2385491836471034466==--