From: Date: February 26 2009 9:34am Subject: bzr commit into mysql-5.0-bugteam branch (ramil:2765) Bug#19829 List-Archive: http://lists.mysql.com/commits/67644 X-Bug: 19829 Message-Id: <0KFN0015SZTS6V80@fe-emea-09.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_vFUXuMPM22kTupQh4f5umg)" --Boundary_(ID_vFUXuMPM22kTupQh4f5umg) MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/ram/mysql/b19829-5.0-bugteam/ based on revid:bernt.johnsen@stripped 2765 Ramil Kalimullin 2009-02-26 Fix for bug#19829:make test Failed in mysql_client_test *with --with-charset=utf8* Problem: wrong LONG TEXT field length is sent to a client when multibyte server character set used. Fix: always limit field length sent to a client to 2^32, as we store it in 4 byte slot. Note: mysql_client_test changed accordingly. @ sql/protocol.cc Fix for bug#19829:make test Failed in mysql_client_test *with --with-charset=utf8* - limit field length sent to client to UINT_MAX32 as it may exceeds 32 bit slot for LONG TEXT fields if thd_charset->mbmaxlen > 1. @ tests/mysql_client_test.c Fix for bug#19829:make test Failed in mysql_client_test *with --with-charset=utf8* - checking field members have in mind that field length is limited to UINT_MAX32. modified: sql/protocol.cc tests/mysql_client_test.c === modified file 'sql/protocol.cc' --- a/sql/protocol.cc 2007-12-01 12:09:16 +0000 +++ b/sql/protocol.cc 2009-02-26 08:34:15 +0000 @@ -616,7 +616,8 @@ bool Protocol::send_fields(List *l else { /* With conversion */ - uint max_char_len; + ulonglong max_length; + uint32 field_length; int2store(pos, thd_charset->number); /* For TEXT/BLOB columns, field_length describes the maximum data @@ -627,12 +628,21 @@ bool Protocol::send_fields(List *l char_count * mbmaxlen, where character count is taken from the definition of the column. In other words, the maximum number of characters here is limited by the column definition. + + When one has a LONG TEXT column with a single-byte + character set, and the connection character set is multi-byte, the + client may get fields longer than UINT_MAX32, due to + -> conversion. + In that case column max length does not fit into the 4 bytes + reserved for it in the protocol. */ - max_char_len= (field.type >= (int) MYSQL_TYPE_TINY_BLOB && - field.type <= (int) MYSQL_TYPE_BLOB) ? - field.length / item->collation.collation->mbminlen : - field.length / item->collation.collation->mbmaxlen; - int4store(pos+2, max_char_len * thd_charset->mbmaxlen); + max_length= (field.type >= MYSQL_TYPE_TINY_BLOB && + field.type <= MYSQL_TYPE_BLOB) ? + field.length / item->collation.collation->mbminlen : + field.length / item->collation.collation->mbmaxlen; + max_length*= thd_charset->mbmaxlen; + field_length= (max_length > UINT_MAX32) ? UINT_MAX32 : max_length; + int4store(pos + 2, field_length); } pos[6]= field.type; int2store(pos+7,field.flags); === modified file 'tests/mysql_client_test.c' --- a/tests/mysql_client_test.c 2009-02-19 08:49:35 +0000 +++ b/tests/mysql_client_test.c 2009-02-26 08:34:15 +0000 @@ -714,6 +714,7 @@ static void do_verify_prepare_field(MYSQ { MYSQL_FIELD *field; CHARSET_INFO *cs; + ulonglong expected_field_length; if (!(field= mysql_fetch_field_direct(result, no))) { @@ -722,6 +723,8 @@ static void do_verify_prepare_field(MYSQ } cs= get_charset(field->charsetnr, 0); DIE_UNLESS(cs); + if ((expected_field_length= length * cs->mbmaxlen) > UINT_MAX32) + expected_field_length= UINT_MAX32; if (!opt_silent) { fprintf(stdout, "\n field[%d]:", no); @@ -736,8 +739,8 @@ static void do_verify_prepare_field(MYSQ fprintf(stdout, "\n org_table:`%s`\t(expected: `%s`)", field->org_table, org_table); fprintf(stdout, "\n database :`%s`\t(expected: `%s`)", field->db, db); - fprintf(stdout, "\n length :`%lu`\t(expected: `%lu`)", - field->length, length * cs->mbmaxlen); + fprintf(stdout, "\n length :`%lu`\t(expected: `%llu`)", + field->length, expected_field_length); fprintf(stdout, "\n maxlength:`%ld`", field->max_length); fprintf(stdout, "\n charsetnr:`%d`", field->charsetnr); fprintf(stdout, "\n default :`%s`\t(expected: `%s`)", @@ -773,11 +776,11 @@ static void do_verify_prepare_field(MYSQ as utf8. Field length is calculated as number of characters * maximum number of bytes a character can occupy. */ - if (length && field->length != length * cs->mbmaxlen) + if (length && (field->length != expected_field_length)) { - fprintf(stderr, "Expected field length: %d, got length: %d\n", - (int) (length * cs->mbmaxlen), (int) field->length); - DIE_UNLESS(field->length == length * cs->mbmaxlen); + fprintf(stderr, "Expected field length: %llu, got length: %lu\n", + expected_field_length, field->length); + DIE_UNLESS(field->length == expected_field_length); } if (def) DIE_UNLESS(strcmp(field->def, def) == 0); --Boundary_(ID_vFUXuMPM22kTupQh4f5umg) MIME-version: 1.0 Content-type: text/bzr-bundle; name="bzr/ramil@stripped"; charset=us-ascii Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/ramil@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: ramil@stripped # target_branch: file:///home/ram/mysql/b19829-5.0-bugteam/ # testament_sha1: 87d5d31ce98883f3e0a5b1348d3bebcb4625fb92 # timestamp: 2009-02-26 12:34:26 +0400 # base_revision_id: bernt.johnsen@stripped\ # 9lc3her2mbqfxh9y # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWXq4oEoAA53/gEVQIAB7f/// 96/+5f////BgCI+Tc3GJ0iXvPveu+zQXm9F7B6DvIZFMRMRoTeqn5U9poyTCR5IGI0GgNGaj1P1T ENAkoU2RppT9DUTFMhhDTTNQeoNAAAABhBJI00kxTxU8pjSekAaaBkaNDI0AAAABAogAPUADQAAZ DQaAAAAABtU1NKeU2p6aamT0IMTRkaAAAAaAAAAkiEaCYIaJo0DTSYFPKCHqHqemppoMIw0ExQgk UjEMFFOetqKhei76h/euR0MebrvdTjCjZLr+odtY1+HTmV8T8zC1bFFMGhtvJm0Iq5hBX39022y5 e8tsaho3CFqwHQhTF+DCDlYhe6g5mekKDm2eeiDytsHL0Go7hhCIgCIDJWRPXwOvVqyiE7LFvsks x3BdQIsIlZAgyJSggSBCy6lyp8j35UgUYjbu391I5zq8MomVtmOAn+Mm/QktJgWu14FuX3wg5t/D O7nxazNCLDF1RhVVC0adlWffqkaq7JIix5KRDYPr+AjK+QVt2GOXp0UIejBTEwHe+ZrMdZimI9Ea bpogHsux19M3grYOy0NfEzK58Gunhn0cQTRta4YOJWzaZyWTZp8LUQACoraibAp7epzd7X/4wZcD Dlz0+kLuxElU/qn6yj9OOBCka6kiy507KGkF5+nqHQpyPYHsr1D9FnDbgmWhdUoKPCw0uBvUNGV3 rr9kzCkKepM8x2BgPjfFRnYGtHu1sFVFEx9BfzTK1GTIKMO27HDOVGiiZTVZIUzOUTp5zWoEycG/ JI2iFbdDgZiyYKNtSLlmUipMcc0GpjBKjKBjNYrWTEb5cPMupd0MnwzlB1frK9cCpi8Cw3sYTeyp 8ndje2V29a/cuumc8VzoOcBrljmG1gg1OhAXSTbRwWWxdJKwuYVZPQtKlm4FqY67TnYrURvYNJlF XtqkJWOsBy3iDvyQvafxhkNIfFMxvtAnllkqIKbGYzZg4162UFM3qJOGLGOVIoDWgNOT6CgtujOk B7abuJmrDquLPW1SxJnLwM0UnR7pEhtAKQyj5zUF1zqspkyRNBYUWjI/KqK59RFkVhv2AUNJYpV3 DZsUEzG9NjeOlG6vIF1xA55Lsrrcy2K5NlLDYeUWAQVe2NV5W2LO752jxmywrx9R8/g4UHMuxdG2 6xjkTPZuhqCGlIY1FpEkaGzA1lIw7w2E1UCgNIrO4CiKooS5iKdyJiuBTYXZnX70LDaqdPaG4GL6 Jw1MB5UxOfXhgixs1STMZ6RFEAKAoQaMpGA4SFoCqR6Lp4lnAvnQLHHTMhehATeceP2HRyQRLAkQ riCwK1zQiACAbSB3wnj3k2iiMIiIid4+/lZb8j2C3BfOXnEXYbf2THoibyBT3DASo4DFeSUlQX4m wqd0Crc5SJCmDA03wGITqwopOjr15Y4wbAbidImS3nQuI4HtiDMmTKCj2eMO1gWfTiOF48XyA6Ms H8fGi85CI3YDIj/Lvqzl9ltdA5rEFMXoc+DIwAZEG4/C6AxI3B80Ygvq88/eevv+koW9z3h9WMS0 B4fYelpD+k/SAx1RGcKqo7GQce5ChoFJw4iYxU9hmqjPuWz3dsuxsx9JI4O6Op3xtaU9WKoqmiSt OgoToTBc1SCtDH1gdadLMV47h8B3DWUG3YVF7jn+SDjVhOqkIPECwdKQhlVcy5hnMerYKjWdekAP dLdFDGTCIbFcMPxkZCJpTZpc1bgVB/k+B292mPpQbDeeJZs00ngGgjLwV6IomapWj7EFhRLPhUob YOBUrYXtr2QN3QIVqqLMmMBloTJJUA6rHQXJxdqeaKr9Vajwrd1JqdIpErrS2y4JAmYoIMg0qSDf h9rr82+qFSPOy1bYnclzhuI6hjzczKVzG9VrZmsRYDZfFQ8osmb4sOehx8jtIh7M8+UMAGQOmOQ/ g6IQIzqBs2EBnCUEvjOk37tTgMkNpleAWoTQW1GkF5yrDkJpkMyRIyddGRQ+f9xhqmOX7F/LBOkH WIoGrXqVxCoQjAIiVUqluyYEKJI3qkmiaUudGPQ+62VnD10lfHjbC6xhmGBmDsgdaCQ0xycMOJ7z Ok3kCJm1rQsVHfNkCWoDpKWpdNb0T1MrC1S6uCYRiGtRQQFkHouwS+dgUjsZIp7+LLl5p9MMCGmA MDszOMBnpQoJ72yDgfqYrEpiajyqgNSzTVddUEKs2tHxXFaMe1xswcp/LSHgUQqifXh2ioRVFy3N zDZWqu1Y7tlpbzoGhrn0ZYJluBk7sm90pw9EZBhLtuSUNJMF4U4brWZFDcOBQIDNFmdxppJReBPX vlX4KaTqY6QwQdOwvJ1VcvbXIBr6uCino89q/JdgCtAMeWdaJJ0q67UOiLDrsdNrp1N9eVawnPuE cgGnBc3V0ivkth5ILhfJ4rdd3yuqzLrkxfwfdPDD1Vy36kBhRPSudfMrAdutxbvlcUERR44GIMXx W2gD3a/4Zk2ULCnIqWUeTap/ObFcuEBomIQxoChRVrV606lRyN0yBiBEpAZfgsl10uK12DtUVgpW yYCBYETkWbUu7ndigdhWIDgQRT3xPII5LDJ0zSHvH1jp3eTMiHjqcJUokusD+Scn4rxsKlIZcQdB UsgnZKrdFgGGRsnTtWpMLPTAL6DJd9qLUwMwJliOIpX0MjTVi3KRMZgzcb4pXTTakmWTOMVMFzh9 B01AXcdGrdOKYaVrz6qOcVrAMwDMX5f0tMU7PmgmMjPMEpar4SmSvNLNh9iGuTDVzjyidkzCmWAi IEsL0lZHCoLZDQ7OXDRFDkIhTQrcgWLHYAtCuPfBOXXsX1XdDFwHbX/F3JFOFCQerigSgA== --Boundary_(ID_vFUXuMPM22kTupQh4f5umg)--