List:Commits« Previous MessageNext Message »
From:Li-Bing.Song Date:September 20 2010 7:53am
Subject:bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3489) Bug#56226
View as plain text  
#At file:///home/anders/work/bzrwork1/wt2/mysql-5.1-bugteam/ based on revid:mattias.jonsson@stripped

 3489 Li-Bing.Song@stripped	2010-09-20
      Bug#56226  Table map set to 0 after altering MyISAM table
      
      A MyISAM table's table_map_id will always be reset to 0 after altered
      only its metadata. 0 is a valid value of table_map_id. But the problem will
      cause that more than one tables have the same table_map_id 0. If more than
      one tables which's table_map_id are 0 are updated in one statement, the update
      of these different tables will be write into only one rows event. It will
      cause slave server to crash. 
      
      After this patch, table_map_id always be refreshed as a correct value after
      altered only its metadata.
     @ mysql-test/suite/rpl/r/rpl_alter.result
        Add test for BUG#56226
     @ mysql-test/suite/rpl/t/rpl_alter.test
        Add test for BUG#56226

    modified:
      mysql-test/suite/rpl/r/rpl_alter.result
      mysql-test/suite/rpl/t/rpl_alter.test
      sql/sql_base.cc
=== modified file 'mysql-test/suite/rpl/r/rpl_alter.result'
--- a/mysql-test/suite/rpl/r/rpl_alter.result	2007-06-27 12:28:02 +0000
+++ b/mysql-test/suite/rpl/r/rpl_alter.result	2010-09-20 07:53:38 +0000
@@ -19,3 +19,23 @@ select * from mysqltest.t3;
 n
 45
 drop database mysqltest;
+
+# BUG#56226 Table map set to 0 after altering MyISAM table
+
+SET SESSION binlog_format='ROW';
+USE test;
+CREATE TABLE t1 (a INT, b INT) ENGINE MyISAM;
+CREATE TABLE t2 (a VARCHAR(255), b VARCHAR(255)) ENGINE MyISAM;
+CREATE TRIGGER trg_t1ai 
+AFTER INSERT ON t1 FOR EACH ROW 
+BEGIN
+INSERT INTO t2 (a) VALUES (NEW.a);
+END;//
+ALTER TABLE t1 CHANGE b c INT;
+ALTER TABLE t2 CHANGE b c VARCHAR(255);
+
+INSERT INTO t1 (a) VALUES(2);
+Comparing tables master:test.t1 and slave:test.t1
+Comparing tables master:test.t2 and slave:test.t2
+
+DROP TABLE t1, t2;

=== modified file 'mysql-test/suite/rpl/t/rpl_alter.test'
--- a/mysql-test/suite/rpl/t/rpl_alter.test	2007-06-27 12:28:02 +0000
+++ b/mysql-test/suite/rpl/t/rpl_alter.test	2010-09-20 07:53:38 +0000
@@ -10,15 +10,62 @@ insert into mysqltest.t1 values (1,2);
 create table mysqltest.t2 (n int);
 insert into mysqltest.t2 values (45);
 rename table mysqltest.t2 to mysqltest.t3, mysqltest.t1 to mysqltest.t2;
-save_master_pos;
-connection slave;
-sync_with_master;
+
+sync_slave_with_master;
 select * from mysqltest.t2;
 select * from mysqltest.t3;
+
 connection master;
 drop database mysqltest;
-save_master_pos;
-connection slave;
-sync_with_master;
+sync_slave_with_master;
+
+--echo
+--echo # BUG#56226 Table map set to 0 after altering MyISAM table
+--echo
+connection master;
+SET SESSION binlog_format='ROW';
+USE test;
+
+CREATE TABLE t1 (a INT, b INT) ENGINE MyISAM;
+CREATE TABLE t2 (a VARCHAR(255), b VARCHAR(255)) ENGINE MyISAM;
+
+--delimiter //
+CREATE TRIGGER trg_t1ai 
+  AFTER INSERT ON t1 FOR EACH ROW 
+BEGIN
+  INSERT INTO t2 (a) VALUES (NEW.a);
+END;//
+--delimiter ;
+
+ALTER TABLE t1 CHANGE b c INT;
+ALTER TABLE t2 CHANGE b c VARCHAR(255);
+let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1);
+let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
+
+--echo
+INSERT INTO t1 (a) VALUES(2);
+let _info= query_get_value(SHOW BINLOG EVENTS IN '$binlog_file' FROM $binlog_start, Info, 2);
+# Table map id should not be 0.
+if (`SELECT 'table_id: 0 (test.t1)' = '$_info'`)
+{
+  --echo test.t1's table map id is 0;
+  --die test.t1's table map id is 0;
+}
+let _info= query_get_value(SHOW BINLOG EVENTS IN '$binlog_file' FROM $binlog_start, Info, 3);
+if (`SELECT 'table_id: 0 (test.t2)' = '$_info'`)
+{
+  --echo test.t2's table map id is 0;
+  --die test.t2's table map id is 0;
+}
+
+let diff_table= test.t1;
+source include/rpl_diff_tables.inc;
+let diff_table= test.t2;
+source include/rpl_diff_tables.inc;
+
+--echo
+connection master;
+DROP TABLE t1, t2;
 
+source include/master-slave-end.inc;
 # End of 4.1 tests

=== modified file 'sql/sql_base.cc'
--- a/sql/sql_base.cc	2010-07-20 18:07:36 +0000
+++ b/sql/sql_base.cc	2010-09-20 07:53:38 +0000
@@ -3082,8 +3082,6 @@ bool reopen_table(TABLE *table)
   tmp.maybe_null=	table->maybe_null;
   tmp.status=		table->status;
 
-  tmp.s->table_map_id=  table->s->table_map_id;
-
   /* Get state */
   tmp.in_use=    	thd;
   tmp.reginfo.lock_type=table->reginfo.lock_type;


Attachment: [text/bzr-bundle] bzr/li-bing.song@sun.com-20100920075338-p5i1o8ic1mn3xpnv.bundle
Thread
bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3489) Bug#56226Li-Bing.Song20 Sep
  • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3489)Bug#56226Dmitry Lenev20 Sep