From: Gleb Shchepa Date: May 6 2010 8:41pm Subject: bzr commit into mysql-5.1-bugteam branch (gshchepa:3371) Bug#53088 List-Archive: http://lists.mysql.com/commits/107691 X-Bug: 53088 Message-Id: <20100506205339.2583D2D1E4@t> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_7ClmbAppKRLDMzqBlmYvfg)" --Boundary_(ID_7ClmbAppKRLDMzqBlmYvfg) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///mnt/sda7/work/mysql-5.1-bugteam/ based on revid:joro@stripped 3371 Gleb Shchepa 2010-05-07 Bug #53088: mysqldump with -T & --default-character-set set truncates text/blob to 766 chars mysqldump and SELECT ... INTO OUTFILE truncated long BLOB/TEXT values to size of 766 bytes (MAX_FIELD_WIDTH or 255 * 3 + 1). The select_export::send_data method has been modified to reallocate a conversion buffer for long field data. @ mysql-test/r/mysqldump.result Test case for bug #53088. @ mysql-test/r/outfile_loaddata.result Test case for bug #53088. @ mysql-test/t/mysqldump.test Test case for bug #53088. @ mysql-test/t/outfile_loaddata.test Test case for bug #53088. @ sql/sql_class.cc Bug #53088: mysqldump with -T & --default-character-set set truncates text/blob to 766 chars The select_export::send_data method has been modified to reallocate a conversion buffer for long field data. modified: mysql-test/r/mysqldump.result mysql-test/r/outfile_loaddata.result mysql-test/t/mysqldump.test mysql-test/t/outfile_loaddata.test sql/sql_class.cc === modified file 'mysql-test/r/mysqldump.result' --- a/mysql-test/r/mysqldump.result 2009-07-31 17:14:52 +0000 +++ b/mysql-test/r/mysqldump.result 2010-05-06 20:41:37 +0000 @@ -4561,5 +4561,20 @@ a b c SET NAMES default; DROP TABLE t1, t2; # +# Bug #53088: mysqldump with -T & --default-character-set set +# truncates text/blob to 766 chars +# +# Also see outfile_loaddata.test +# +CREATE TABLE t1 (a BLOB) CHARSET latin1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t1 VALUES (REPEAT('.', 800)); +LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/t1.txt' INTO TABLE t2 CHARACTER SET latin1; +# should be 800 +SELECT LENGTH(a) FROM t2; +LENGTH(a) +800 +DROP TABLE t1, t2; +# # End of 5.1 tests # === modified file 'mysql-test/r/outfile_loaddata.result' --- a/mysql-test/r/outfile_loaddata.result 2009-07-31 17:14:52 +0000 +++ b/mysql-test/r/outfile_loaddata.result 2010-05-06 20:41:37 +0000 @@ -239,4 +239,24 @@ a b c 2 NULL NULL SET NAMES default; DROP TABLE t1, t2; +# +# Bug #53088: mysqldump with -T & --default-character-set set +# truncates text/blob to 766 chars +# +# Also see mysqldump.test +# +CREATE TABLE t1 (a BLOB) CHARSET latin1; +CREATE TABLE t2 LIKE t1; +INSERT INTO t1 VALUES (REPEAT('.', 800)); +SELECT * INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/bug53088.txt' CHARACTER SET latin1 FROM t1; +# should be greater than 800 +SELECT LENGTH(LOAD_FILE('MYSQLTEST_VARDIR/tmp/bug53088.txt')); +LENGTH(LOAD_FILE('MYSQLTEST_VARDIR/tmp/bug53088.txt')) +801 +LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug53088.txt' INTO TABLE t2; +# should be 800 +SELECT LENGTH(a) FROM t2; +LENGTH(a) +800 +DROP TABLE t1, t2; # End of 5.1 tests. === modified file 'mysql-test/t/mysqldump.test' --- a/mysql-test/t/mysqldump.test 2009-07-31 17:14:52 +0000 +++ b/mysql-test/t/mysqldump.test 2010-05-06 20:41:37 +0000 @@ -2132,6 +2132,35 @@ SELECT * FROM t1 UNION SELECT * FROM t2 SET NAMES default; DROP TABLE t1, t2; +########################################################################### + +--echo # +--echo # Bug #53088: mysqldump with -T & --default-character-set set +--echo # truncates text/blob to 766 chars +--echo # +--echo # Also see outfile_loaddata.test +--echo # + +CREATE TABLE t1 (a BLOB) CHARSET latin1; +CREATE TABLE t2 LIKE t1; + +let $table= t1; +let $dir= $MYSQLTEST_VARDIR/tmp; +let $file= $dir/$table.txt; +let $length= 800; + +--eval INSERT INTO t1 VALUES (REPEAT('.', $length)) + +--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --default-character-set=latin1 --tab=$dir/ test $table +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR + +--eval LOAD DATA INFILE '$file' INTO TABLE t2 CHARACTER SET latin1 +--remove_file $file + +--echo # should be $length +SELECT LENGTH(a) FROM t2; + +DROP TABLE t1, t2; ########################################################################### --echo # === modified file 'mysql-test/t/outfile_loaddata.test' --- a/mysql-test/t/outfile_loaddata.test 2009-07-31 17:14:52 +0000 +++ b/mysql-test/t/outfile_loaddata.test 2010-05-06 20:41:37 +0000 @@ -251,6 +251,40 @@ SELECT * FROM t1 UNION SELECT * FROM t2 SET NAMES default; DROP TABLE t1, t2; +########################################################################### + +--echo # +--echo # Bug #53088: mysqldump with -T & --default-character-set set +--echo # truncates text/blob to 766 chars +--echo # +--echo # Also see mysqldump.test +--echo # + +CREATE TABLE t1 (a BLOB) CHARSET latin1; +CREATE TABLE t2 LIKE t1; + +let $file= '$MYSQLTEST_VARDIR/tmp/bug53088.txt'; +let $length= 800; + +--eval INSERT INTO t1 VALUES (REPEAT('.', $length)) + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--eval SELECT * INTO OUTFILE $file CHARACTER SET latin1 FROM t1 + +--echo # should be greater than $length +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--eval SELECT LENGTH(LOAD_FILE($file)) + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--eval LOAD DATA INFILE $file INTO TABLE t2 + +--remove_file $MYSQLTEST_VARDIR/tmp/bug53088.txt + +--echo # should be $length +SELECT LENGTH(a) FROM t2; + +DROP TABLE t1, t2; + ########################################################################### --echo # End of 5.1 tests. === modified file 'sql/sql_class.cc' --- a/sql/sql_class.cc 2010-05-03 16:14:39 +0000 +++ b/sql/sql_class.cc 2010-05-06 20:41:37 +0000 @@ -1998,9 +1998,21 @@ bool select_export::send_data(List const char *from_end_pos; const char *error_pos; uint32 bytes; - bytes= well_formed_copy_nchars(write_cs, cvt_buff, sizeof(cvt_buff), + uint64 estimated_bytes= + ((uint64) res->length() / res->charset()->mbminlen + 1) * + write_cs->mbmaxlen + 1; + set_if_smaller(estimated_bytes, UINT_MAX32); + if (cvt_str.realloc((uint32) estimated_bytes)) + { + my_error(ER_OUTOFMEMORY, MYF(0), (uint32) estimated_bytes); + goto err; + } + + bytes= well_formed_copy_nchars(write_cs, (char *) cvt_str.ptr(), + cvt_str.alloced_length(), res->charset(), res->ptr(), res->length(), - sizeof(cvt_buff), + UINT_MAX32, // copy all input chars, + // i.e. ignore nchars parameter &well_formed_error_pos, &cannot_convert_error_pos, &from_end_pos); @@ -2018,6 +2030,15 @@ bool select_export::send_data(List "string", printable_buff, item->name, row_count); } + else if (from_end_pos < res->ptr() + res->length()) + { + /* + result is longer than UINT_MAX32 and doesn't fit into String + */ + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + WARN_DATA_TRUNCATED, ER(WARN_DATA_TRUNCATED), + item->full_name(), row_count); + } cvt_str.length(bytes); res= &cvt_str; } --Boundary_(ID_7ClmbAppKRLDMzqBlmYvfg) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/gshchepa@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/gshchepa@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: gshchepa@stripped # target_branch: file:///mnt/sda7/work/mysql-5.1-bugteam/ # testament_sha1: ab9dfc08ac64971cb384f6b39e82f055c028643f # timestamp: 2010-05-07 00:41:44 +0400 # source_branch: file:///work/mysql-5.0-bugteam/ # base_revision_id: joro@stripped # # Begin bundle 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 --Boundary_(ID_7ClmbAppKRLDMzqBlmYvfg)--