List:Commits« Previous MessageNext Message »
From:Mats Kindahl Date:February 26 2007 9:19am
Subject:bk commit into 5.1 tree (mats:1.2411) BUG#25091
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of mats. When mats does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-02-26 10:19:08+01:00, mats@romeo.(none) +8 -0
  BUG#25091 (A DELETE statement to mysql database is not logged in ROW format):
  With this patch, statements that change metadata (in the mysql database)
  is logged as statements, while normal changes (e.g., using INSERT, DELETE,
  and/or UPDATE) is logged according to the format in effect.
  
  The log tables (i.e., general_log and slow_log) are not replicated at all.
  
  With this patch, the following statements are replicated as statements:
  GRANT, REVOKE (ALL), CREATE USER, DROP USER, and RENAME USER.

  mysql-test/extra/binlog_tests/binlog.test@stripped, 2007-02-26 10:19:04+01:00, mats@romeo.(none) +13 -0
    Added test to check that normal INSERT, DELETE, and UPDATE to a table in
    the mysql database is replicated both under row-based and statement-based
    replication.

  mysql-test/r/binlog_row_binlog.result@stripped, 2007-02-26 10:19:04+01:00, mats@romeo.(none) +17 -0
    Result change.

  mysql-test/r/binlog_stm_binlog.result@stripped, 2007-02-26 10:19:04+01:00, mats@romeo.(none) +11 -0
    Result change.

  sql/handler.cc@stripped, 2007-02-26 10:19:04+01:00, mats@romeo.(none) +1 -1
    Removed hardcoded check for mysql database.
    Added table-specific flag for non-replication (used by log tables).

  sql/log.cc@stripped, 2007-02-26 10:19:04+01:00, mats@romeo.(none) +1 -0
    Adding flag that a table shall not be replicated and set it for log
    tables.

  sql/sp.cc@stripped, 2007-02-26 10:19:05+01:00, mats@romeo.(none) +21 -0
    Turning row-based replication off for statements that change metadata.

  sql/sql_acl.cc@stripped, 2007-02-26 10:19:05+01:00, mats@romeo.(none) +56 -0
    Turning row-based replication off for statements that change metadata.

  sql/table.h@stripped, 2007-02-26 10:19:05+01:00, mats@romeo.(none) +5 -0
    Adding flag that a table shall not be replicated.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	mats
# Host:	romeo.(none)
# Root:	/home/bk/b25091-mysql-5.1-new-rpl

--- 1.290/sql/handler.cc	2007-02-26 10:19:17 +01:00
+++ 1.291/sql/handler.cc	2007-02-26 10:19:17 +01:00
@@ -3481,7 +3481,7 @@
     {
       int const check(table->s->tmp_table == NO_TMP_TABLE &&
                       binlog_filter->db_ok(table->s->db.str) &&
-                      strcmp("mysql", table->s->db.str) != 0);
+                      !table->no_replicate);
       table->s->cached_row_logging_check= check;
     }
 

--- 1.253/sql/log.cc	2007-02-26 10:19:17 +01:00
+++ 1.254/sql/log.cc	2007-02-26 10:19:17 +01:00
@@ -312,6 +312,7 @@
   {
     table->table->use_all_columns();
     table->table->locked_by_logger= TRUE;
+    table->table->no_replicate= TRUE;
   }
   /* restore thread settings */
   if (curr)

--- 1.228/sql/sql_acl.cc	2007-02-26 10:19:17 +01:00
+++ 1.229/sql/sql_acl.cc	2007-02-26 10:19:17 +01:00
@@ -3001,6 +3001,13 @@
   tables[0].lock_type=tables[1].lock_type=tables[2].lock_type=TL_WRITE;
   tables[0].db=tables[1].db=tables[2].db=(char*) "mysql";
 
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
+
 #ifdef HAVE_REPLICATION
   /*
     GRANT and REVOKE are applied the slave in/exclusion rules as they are
@@ -3218,6 +3225,13 @@
   tables[0].lock_type=tables[1].lock_type=TL_WRITE;
   tables[0].db=tables[1].db=(char*) "mysql";
 
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
+
 #ifdef HAVE_REPLICATION
   /*
     GRANT and REVOKE are applied the slave in/exclusion rules as they are
@@ -3357,6 +3371,13 @@
   tables[0].lock_type=tables[1].lock_type=TL_WRITE;
   tables[0].db=tables[1].db=(char*) "mysql";
 
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
+
 #ifdef HAVE_REPLICATION
   /*
     GRANT and REVOKE are applied the slave in/exclusion rules as they are
@@ -5399,6 +5420,13 @@
   TABLE_LIST tables[GRANT_TABLES];
   DBUG_ENTER("mysql_create_user");
 
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
+
   /* CREATE USER may be skipped on replication client. */
   if ((result= open_grant_tables(thd, tables)))
     DBUG_RETURN(result != 1);
@@ -5471,6 +5499,13 @@
   TABLE_LIST tables[GRANT_TABLES];
   DBUG_ENTER("mysql_drop_user");
 
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
+
   /* DROP USER may be skipped on replication client. */
   if ((result= open_grant_tables(thd, tables)))
     DBUG_RETURN(result != 1);
@@ -5535,6 +5570,13 @@
   TABLE_LIST tables[GRANT_TABLES];
   DBUG_ENTER("mysql_rename_user");
 
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
+
   /* RENAME USER may be skipped on replication client. */
   if ((result= open_grant_tables(thd, tables)))
     DBUG_RETURN(result != 1);
@@ -5610,6 +5652,13 @@
   TABLE_LIST tables[GRANT_TABLES];
   DBUG_ENTER("mysql_revoke_all");
 
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
+
   if ((result= open_grant_tables(thd, tables)))
     DBUG_RETURN(result != 1);
 
@@ -5799,6 +5848,13 @@
 
   rw_wrlock(&LOCK_grant);
   VOID(pthread_mutex_lock(&acl_cache->lock));
+
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
 
   /* Remove procedure access */
   do

--- 1.157/sql/table.h	2007-02-26 10:19:17 +01:00
+++ 1.158/sql/table.h	2007-02-26 10:19:17 +01:00
@@ -389,6 +389,10 @@
   /*
     If true, the current table row is considered to have all columns set to 
     NULL, including columns declared as "not null" (see maybe_null).
+
+    TODO: Each of these flags take up 8 bits. They can just as easily
+    be put into one single unsigned long and instead of taking up 18
+    bytes, it would take up 4.
   */
   my_bool null_row;
   my_bool force_index;
@@ -396,6 +400,7 @@
   my_bool key_read, no_keyread;
   my_bool locked_by_flush;
   my_bool locked_by_logger;
+  my_bool no_replicate;
   my_bool locked_by_name;
   my_bool fulltext_searched;
   my_bool no_cache;

--- 1.10/mysql-test/r/binlog_row_binlog.result	2007-02-26 10:19:17 +01:00
+++ 1.11/mysql-test/r/binlog_row_binlog.result	2007-02-26 10:19:17 +01:00
@@ -249,6 +249,11 @@
 create table if not exists t2 select * from t1;
 create temporary table tt1 (a int);
 create table if not exists t3 like tt1;
+USE mysql;
+INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test');
+UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@';
+DELETE FROM user WHERE host='localhost' AND user='@#@';
+use test;
 show binlog events from 102;
 Log_name	Pos	Event_type	Server_id	End_log_pos	Info
 master-bin.000001	#	Query	1	#	use `test`; create table t1 (id tinyint auto_increment primary key)
@@ -262,6 +267,12 @@
 master-bin.000001	#	Query	1	#	use `test`; CREATE TABLE IF NOT EXISTS `t3` (
   `a` int(11) DEFAULT NULL
 )
+master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
+master-bin.000001	#	Write_rows	1	#	table_id: # flags: STMT_END_F
+master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
+master-bin.000001	#	Update_rows	1	#	table_id: # flags: STMT_END_F
+master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
+master-bin.000001	#	Delete_rows	1	#	table_id: # flags: STMT_END_F
 drop table t1,t2,t3,tt1;
 create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
 set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
@@ -281,6 +292,12 @@
 master-bin.000001	#	Query	1	#	use `test`; CREATE TABLE IF NOT EXISTS `t3` (
   `a` int(11) DEFAULT NULL
 )
+master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
+master-bin.000001	#	Write_rows	1	#	table_id: # flags: STMT_END_F
+master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
+master-bin.000001	#	Update_rows	1	#	table_id: # flags: STMT_END_F
+master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
+master-bin.000001	#	Delete_rows	1	#	table_id: # flags: STMT_END_F
 master-bin.000001	#	Query	1	#	use `test`; DROP TABLE `t1`,`t2`,`t3` /* generated by server */
 master-bin.000001	#	Query	1	#	use `test`; create table t1 (a int not null auto_increment, primary key (a)) engine=myisam
 master-bin.000001	#	Table_map	1	#	table_id: # (test.t1)

--- 1.136/sql/sp.cc	2007-02-26 10:19:17 +01:00
+++ 1.137/sql/sp.cc	2007-02-26 10:19:17 +01:00
@@ -500,6 +500,13 @@
   DBUG_PRINT("enter", ("type: %d name: %.*s",type,sp->m_name.length,
                        sp->m_name.str));
 
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
+
   if (!(table= open_proc_table_for_update(thd)))
     ret= SP_OPEN_TABLE_FAILED;
   else
@@ -636,6 +643,13 @@
   DBUG_PRINT("enter", ("type: %d name: %.*s",
 		       type, name->m_name.length, name->m_name.str));
 
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
+
   if (!(table= open_proc_table_for_update(thd)))
     DBUG_RETURN(SP_OPEN_TABLE_FAILED);
   if ((ret= db_find_routine_aux(thd, type, name, table)) == SP_OK)
@@ -667,6 +681,13 @@
   DBUG_ENTER("db_update_routine");
   DBUG_PRINT("enter", ("type: %d name: %.*s",
 		       type, name->m_name.length, name->m_name.str));
+
+  /*
+    This statement will be replicated as a statement, even when using
+    row-based replication.  The flag will be reset at the end of the
+    statement.
+  */
+  thd->clear_current_stmt_binlog_row_based();
 
   if (!(table= open_proc_table_for_update(thd)))
     DBUG_RETURN(SP_OPEN_TABLE_FAILED);

--- 1.17/mysql-test/r/binlog_stm_binlog.result	2007-02-26 10:19:17 +01:00
+++ 1.18/mysql-test/r/binlog_stm_binlog.result	2007-02-26 10:19:17 +01:00
@@ -159,6 +159,11 @@
 create table if not exists t2 select * from t1;
 create temporary table tt1 (a int);
 create table if not exists t3 like tt1;
+USE mysql;
+INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test');
+UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@';
+DELETE FROM user WHERE host='localhost' AND user='@#@';
+use test;
 show binlog events from 102;
 Log_name	Pos	Event_type	Server_id	End_log_pos	Info
 master-bin.000001	#	Query	1	#	use `test`; create table t1 (id tinyint auto_increment primary key)
@@ -169,6 +174,9 @@
 master-bin.000001	#	Query	1	#	use `test`; create table if not exists t2 select * from t1
 master-bin.000001	#	Query	1	#	use `test`; create temporary table tt1 (a int)
 master-bin.000001	#	Query	1	#	use `test`; create table if not exists t3 like tt1
+master-bin.000001	#	Query	1	#	use `mysql`; INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test')
+master-bin.000001	#	Query	1	#	use `mysql`; UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@'
+master-bin.000001	#	Query	1	#	use `mysql`; DELETE FROM user WHERE host='localhost' AND user='@#@'
 drop table t1,t2,t3,tt1;
 create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
 set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
@@ -185,6 +193,9 @@
 master-bin.000001	#	Query	1	#	use `test`; create table if not exists t2 select * from t1
 master-bin.000001	#	Query	1	#	use `test`; create temporary table tt1 (a int)
 master-bin.000001	#	Query	1	#	use `test`; create table if not exists t3 like tt1
+master-bin.000001	#	Query	1	#	use `mysql`; INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test')
+master-bin.000001	#	Query	1	#	use `mysql`; UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@'
+master-bin.000001	#	Query	1	#	use `mysql`; DELETE FROM user WHERE host='localhost' AND user='@#@'
 master-bin.000001	#	Query	1	#	use `test`; drop table t1,t2,t3,tt1
 master-bin.000001	#	Query	1	#	use `test`; create table t1 (a int not null auto_increment, primary key (a)) engine=myisam
 master-bin.000001	#	Table_map	1	#	table_id: # (test.t1)

--- 1.15/mysql-test/extra/binlog_tests/binlog.test	2007-02-26 10:19:17 +01:00
+++ 1.16/mysql-test/extra/binlog_tests/binlog.test	2007-02-26 10:19:17 +01:00
@@ -67,6 +67,19 @@
 create temporary table tt1 (a int);
 create table if not exists t3 like tt1;
 
+# BUG#25091 (A DELETE statement to mysql database is not logged with
+# ROW mode format): Checking that some basic operations on tables in
+# the mysql database is replicated even when the current database is
+# 'mysql'.
+
+--disable_warnings
+USE mysql;
+INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test');
+UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@';
+DELETE FROM user WHERE host='localhost' AND user='@#@';
+--enable_warnings
+
+use test;
 --replace_column 2 # 5 #
 --replace_regex /table_id: [0-9]+/table_id: #/ /\/\* xid=.* \*\//\/* xid= *\//
 show binlog events from 102;
Thread
bk commit into 5.1 tree (mats:1.2411) BUG#25091Mats Kindahl26 Feb