diff --git a/client/mysqldump.cc b/client/mysqldump.cc index 77b60d93f1f..65c93c97494 100644 --- a/client/mysqldump.cc +++ b/client/mysqldump.cc @@ -4018,9 +4018,10 @@ static void dump_table(char *table, char *db) { plus 2 bytes for '0x' prefix. - In non-HEX mode we need up to 2 bytes per character, plus 2 bytes for leading and trailing '\'' characters. + Also we need to reserve 8 bytes for "_binary ". Also we need to reserve 1 byte for terminating '\0'. */ - dynstr_realloc_checked(&extended_row, length * 2 + 2 + 1); + dynstr_realloc_checked(&extended_row, length * 2 + 2 + 8 + 1); if (opt_hex_blob && is_blob) { dynstr_append_checked(&extended_row, "0x"); extended_row.length += mysql_hex_string( diff --git a/mysql-test/r/mysqldump-binary.result b/mysql-test/r/mysqldump-binary.result index 1be1b2a653d..8dece10e3ec 100644 --- a/mysql-test/r/mysqldump-binary.result +++ b/mysql-test/r/mysqldump-binary.result @@ -79,3 +79,15 @@ ST_AsText(g) FROM t1; u='basic' HEX(b)='EE0C6D03C34C11E5B1640026B977EB17' HEX(blo)='EE0C6D03C34C11E5B1640026B977EB17' HEX(g)='000000000101000000000000000000F03F000000000000F03F' HEX(bi)='EE0C6D03C34C11E5' ST_AsText(g) 1 1 1 1 1 POINT(1 1) DROP TABLE t1; +CREATE TABLE t1 (pk INT, v1 VARCHAR(255), v2 VARCHAR(255), v3 VARCHAR(255), v4 VARCHAR(128), v5 VARCHAR(64), v6 VARCHAR(16), v7 VARCHAR(16), v8 VARCHAR (8), v9 VARBINARY(32), v10 VARBINARY(32)); +SELECT '12345678901234567890123456789012345678901234567890' INTO @s; +SELECT CONCAT(@s, @s, @s, @s, @s) INTO @s1; +INSERT INTO t1 VALUES (1, @s1, @s1, @s1, SUBSTRING(@s1, 1, 128), SUBSTRING(@s1, 1, 64), SUBSTRING(@s1, 1, 16), SUBSTRING(@s1, 1, 16), SUBSTRING(@s1, 1, 8), '', 'NULL'); +CHECKSUM TABLE t1; +Table Checksum +test.t1 869635727 +DROP TABLE t1; +CHECKSUM TABLE t1; +Table Checksum +test.t1 869635727 +DROP TABLE t1; diff --git a/mysql-test/t/mysqldump-binary.test b/mysql-test/t/mysqldump-binary.test index 9ac18f50557..9ddfe518368 100644 --- a/mysql-test/t/mysqldump-binary.test +++ b/mysql-test/t/mysqldump-binary.test @@ -72,3 +72,16 @@ ST_AsText(g) FROM t1; DROP TABLE t1; --remove_file $MYSQLTEST_VARDIR/tmp/bug22601255.sql + +# Verify mysqldump's memory buffer accounts for "_binary " properly +CREATE TABLE t1 (pk INT, v1 VARCHAR(255), v2 VARCHAR(255), v3 VARCHAR(255), v4 VARCHAR(128), v5 VARCHAR(64), v6 VARCHAR(16), v7 VARCHAR(16), v8 VARCHAR (8), v9 VARBINARY(32), v10 VARBINARY(32)); +SELECT '12345678901234567890123456789012345678901234567890' INTO @s; +SELECT CONCAT(@s, @s, @s, @s, @s) INTO @s1; +INSERT INTO t1 VALUES (1, @s1, @s1, @s1, SUBSTRING(@s1, 1, 128), SUBSTRING(@s1, 1, 64), SUBSTRING(@s1, 1, 16), SUBSTRING(@s1, 1, 16), SUBSTRING(@s1, 1, 8), '', 'NULL'); +CHECKSUM TABLE t1; +--exec $MYSQL_DUMP test t1 > $MYSQLTEST_VARDIR/tmp/bug96053.sql +DROP TABLE t1; +--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/bug96053.sql +CHECKSUM TABLE t1; +DROP TABLE t1; +--remove_file $MYSQLTEST_VARDIR/tmp/bug96053.sql