Commit 9d83bfb4 authored by Kristofer Pettersson's avatar Kristofer Pettersson
Browse files

merge 5.1->5.1-bugteam

parents de4d31f2 91d19a1b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -693,6 +693,7 @@ extern char * fn_format(char * to,const char *name,const char *dir,
			   const char *form, uint flag);
extern size_t strlength(const char *str);
extern void pack_dirname(char * to,const char *from);
extern size_t normalize_dirname(char * to, const char *from);
extern size_t unpack_dirname(char * to,const char *from);
extern size_t cleanup_dirname(char * to,const char *from);
extern size_t system_filename(char * to,const char *from);
+148 −1
Original line number Diff line number Diff line
@@ -259,7 +259,7 @@ DELETE FROM t1;
query_vertical SELECT COUNT(*) FROM t1 ORDER BY c1,c2;
sync_slave_with_master;
set @@global.slave_exec_mode= default;
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
disable_query_log;
eval SELECT "$last_error" AS Last_SQL_Error;
enable_query_log;
@@ -288,3 +288,150 @@ SELECT * FROM t1;
connection master;
DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t7,t8;
sync_slave_with_master;

#
# BUG#37426: RBR breaks for CHAR() UTF8 fields > 85 chars
#

# We have 4 combinations to test with respect to the field length
# (i.e., the number of bytes) of the CHAR fields:
#
# 1. Replicating from CHAR<256 to CHAR<256 
# 2. Replicating from CHAR<256 to CHAR>255
# 3. Replicating from CHAR>255 to CHAR<256
# 4. Replicating from CHAR>255 to CHAR>255

# We also make a special case of using the max size of a field on the
# master, i.e. CHAR(255) in UTF-8, giving another three cases.
#
# 5. Replicating UTF-8 CHAR(255) to CHAR(<256)
# 6. Replicating UTF-8 CHAR(255) to CHAR(>255)
# 7. Replicating UTF-8 CHAR(255) to CHAR(255) UTF-8

connection master;
CREATE TABLE t1 (i INT NOT NULL,
                 c CHAR(16) CHARACTER SET utf8 NOT NULL,
                 j INT NOT NULL);

CREATE TABLE t2 (i INT NOT NULL,
                 c CHAR(16) CHARACTER SET utf8 NOT NULL,
                 j INT NOT NULL);

sync_slave_with_master;
ALTER TABLE t2 MODIFY c CHAR(128) CHARACTER SET utf8 NOT NULL;

connection master;
CREATE TABLE t3 (i INT NOT NULL,
                 c CHAR(128) CHARACTER SET utf8 NOT NULL,
                 j INT NOT NULL);
sync_slave_with_master;
ALTER TABLE t3 MODIFY c CHAR(16) CHARACTER SET utf8 NOT NULL;

connection master;
CREATE TABLE t4 (i INT NOT NULL,
                 c CHAR(128) CHARACTER SET utf8 NOT NULL,
                 j INT NOT NULL);

CREATE TABLE t5 (i INT NOT NULL,
                 c CHAR(255) CHARACTER SET utf8 NOT NULL,
                 j INT NOT NULL);
sync_slave_with_master;
ALTER TABLE t5 MODIFY c CHAR(16) CHARACTER SET utf8 NOT NULL;

connection master;
CREATE TABLE t6 (i INT NOT NULL,
                 c CHAR(255) CHARACTER SET utf8 NOT NULL,
                 j INT NOT NULL);
sync_slave_with_master;
ALTER TABLE t6 MODIFY c CHAR(128) CHARACTER SET utf8 NOT NULL;

connection master;
CREATE TABLE t7 (i INT NOT NULL,
                 c CHAR(255) CHARACTER SET utf8 NOT NULL,
                 j INT NOT NULL);

--echo [expecting slave to replicate correctly]
connection master;
INSERT INTO t1 VALUES (1, "", 1);
INSERT INTO t1 VALUES (2, repeat(_utf8'a', 16), 2);

let $diff_table_1=master:test.t1;
let $diff_table_2=slave:test.t1;
source include/diff_tables.inc;

--echo [expecting slave to replicate correctly]
connection master;
INSERT INTO t2 VALUES (1, "", 1);
INSERT INTO t2 VALUES (2, repeat(_utf8'a', 16), 2);

let $diff_table_1=master:test.t2;
let $diff_table_2=slave:test.t2;
source include/diff_tables.inc;

--echo [expecting slave to stop]
connection master;
INSERT INTO t3 VALUES (1, "", 1);
INSERT INTO t3 VALUES (2, repeat(_utf8'a', 128), 2);

connection slave;
source include/wait_for_slave_sql_to_stop.inc;
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
disable_query_log;
eval SELECT "$last_error" AS Last_SQL_Error;
enable_query_log;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=8;
START SLAVE;
source include/wait_for_slave_to_start.inc;

--echo [expecting slave to replicate correctly]
connection master;
INSERT INTO t4 VALUES (1, "", 1);
INSERT INTO t4 VALUES (2, repeat(_utf8'a', 128), 2);

let $diff_table_1=master:test.t4;
let $diff_table_2=slave:test.t4;
source include/diff_tables.inc;

--echo [expecting slave to stop]
connection master;
INSERT INTO t5 VALUES (1, "", 1);
INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2);

connection slave;
source include/wait_for_slave_sql_to_stop.inc;
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
disable_query_log;
eval SELECT "$last_error" AS Last_SQL_Error;
enable_query_log;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=8;
START SLAVE;
source include/wait_for_slave_to_start.inc;

--echo [expecting slave to stop]
connection master;
INSERT INTO t6 VALUES (1, "", 1);
INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2);

connection slave;
source include/wait_for_slave_sql_to_stop.inc;
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
disable_query_log;
eval SELECT "$last_error" AS Last_SQL_Error;
enable_query_log;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=8;
START SLAVE;
source include/wait_for_slave_to_start.inc;

--echo [expecting slave to replicate correctly]
connection master;
INSERT INTO t7 VALUES (1, "", 1);
INSERT INTO t7 VALUES (2, repeat(_utf8'a', 255), 2);

let $diff_table_1=master:test.t7;
let $diff_table_2=slave:test.t7;
source include/diff_tables.inc;

connection master;
drop table t1, t2, t3, t4, t5, t6, t7;
sync_slave_with_master;
+7 −4
Original line number Diff line number Diff line
@@ -251,7 +251,7 @@ our $opt_sleep;
our $opt_testcase_timeout;
our $opt_suite_timeout;
my  $default_testcase_timeout=     15; # 15 min max
my  $default_suite_timeout=       180; # 3 hours max
my  $default_suite_timeout=       300; # 5 hours max

our $opt_start_and_exit;
our $opt_start_dirty;
@@ -1579,13 +1579,15 @@ sub executable_setup_ndb () {

  $exe_ndbd=
    mtr_exe_maybe_exists("$ndb_path/src/kernel/ndbd",
			 "$ndb_path/ndbd");
			 "$ndb_path/ndbd",
			 "$glob_basedir/libexec/ndbd");
  $exe_ndb_mgm=
    mtr_exe_maybe_exists("$ndb_path/src/mgmclient/ndb_mgm",
			 "$ndb_path/ndb_mgm");
  $exe_ndb_mgmd=
    mtr_exe_maybe_exists("$ndb_path/src/mgmsrv/ndb_mgmd",
			 "$ndb_path/ndb_mgmd");
			 "$ndb_path/ndb_mgmd",
			 "$glob_basedir/libexec/ndb_mgmd");
  $exe_ndb_waiter=
    mtr_exe_maybe_exists("$ndb_path/tools/ndb_waiter",
			 "$ndb_path/ndb_waiter");
@@ -1682,7 +1684,8 @@ sub executable_setup () {
    # Look for mysql_fix_privilege_tables.sql script
    $file_mysql_fix_privilege_tables=
      mtr_file_exists("$glob_basedir/scripts/mysql_fix_privilege_tables.sql",
  		    "$glob_basedir/share/mysql_fix_privilege_tables.sql");
  		    "$glob_basedir/share/mysql_fix_privilege_tables.sql",
  		    "$glob_basedir/share/mysql/mysql_fix_privilege_tables.sql");

    if ( ! $opt_skip_ndbcluster and executable_setup_ndb())
    {
+25 −1
Original line number Diff line number Diff line
@@ -66,4 +66,28 @@ a
1
1
3
drop table t1;
CREATE TABLE char128_utf8 ( 
i1 INT NOT NULL, 
c CHAR(128) CHARACTER SET utf8 NOT NULL, 
i2 INT NOT NULL);
CREATE TABLE char63_utf8 (
i1 INT NOT NULL,
c CHAR(63) CHARACTER SET utf8 NOT NULL,
i2 INT NOT NULL);
BINLOG '
MuNkSA8BAAAAZgAAAGoAAAAAAAQANS4xLjI1LXJjLWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAy42RIEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
';
BINLOG '
3u9kSBMBAAAANgAAAJYBAAAAABAAAAAAAAAABHRlc3QAC2NoYXI2M191dGY4AAMD/gMC/r0A
3u9kSBcBAAAAKgAAAMABAAAQABAAAAAAAAEAA//4AQAAAAMxMjMBAAAA
';
SELECT * FROM char63_utf8;
i1	c	i2
1	123	1
BINLOG '
iONkSBMBAAAANwAAAJkBAAAAABAAAAAAAAAABHRlc3QADGNoYXIxMjhfdXRmOAADA/4DAv6AAA==
iONkSBcBAAAAKwAAAMQBAAAQABAAAAAAAAEAA//4AQAAAAMAMTIzAQAAAA==
';
ERROR HY000: master may suffer from http://bugs.mysql.com/bug.php?id=37426 so slave stops; check error log on slave for more info
drop table t1, char63_utf8, char128_utf8;
+45 −2
Original line number Diff line number Diff line
@@ -104,6 +104,49 @@ Dl1YRxcBAAAAIgAAAFYBAAAQABAAAAAAAAEAAf/+BQAAAA==
# the above line should fail and 5 should not be in the binlog.
select * from t1;

# Test that BUG#37426 is triggered.

# clean up
drop table t1;
CREATE TABLE char128_utf8 ( 
    i1 INT NOT NULL, 
    c CHAR(128) CHARACTER SET utf8 NOT NULL, 
    i2 INT NOT NULL);
CREATE TABLE char63_utf8 (
      i1 INT NOT NULL,
      c CHAR(63) CHARACTER SET utf8 NOT NULL,
      i2 INT NOT NULL);

#
# This is the format description log event
#

BINLOG '
MuNkSA8BAAAAZgAAAGoAAAAAAAQANS4xLjI1LXJjLWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAy42RIEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
';

# ... this event corresponding to
#
#    INSERT INTO char63_utf8 VALUES ( 1, "123", 1 )
#
# The binlog event below shall not trigger the bug check

BINLOG '
3u9kSBMBAAAANgAAAJYBAAAAABAAAAAAAAAABHRlc3QAC2NoYXI2M191dGY4AAMD/gMC/r0A
3u9kSBcBAAAAKgAAAMABAAAQABAAAAAAAAEAA//4AQAAAAMxMjMBAAAA
';
SELECT * FROM char63_utf8;

# ... and this is an event corresponding to
#
#    INSERT INTO char128_utf8 VALUES ( 1, "123", 1 )
#
# The binlog event below shall trigger the bug check and produce an error
#

error ER_UNKNOWN_ERROR;
BINLOG '
iONkSBMBAAAANwAAAJkBAAAAABAAAAAAAAAABHRlc3QADGNoYXIxMjhfdXRmOAADA/4DAv6AAA==
iONkSBcBAAAAKwAAAMQBAAAQABAAAAAAAAEAA//4AQAAAAMAMTIzAQAAAA==
';

drop table t1, char63_utf8, char128_utf8;
Loading