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-16 19:50:17+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.
mysql-test/extra/binlog_tests/binlog.test@stripped, 2007-02-16 19:50:08+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-16 19:50:08+01:00, mats@romeo.(none)
+17 -0
Result change.
mysql-test/r/binlog_stm_binlog.result@stripped, 2007-02-16 19:50:09+01:00, mats@romeo.(none)
+11 -0
Result change.
sql/handler.cc@stripped, 2007-02-16 19:50:09+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-16 19:50:09+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-16 19:50:09+01:00, mats@romeo.(none) +21 -0
Turning row-based replication off for statements that change metadata.
sql/sql_acl.cc@stripped, 2007-02-16 19:50:10+01:00, mats@romeo.(none) +56 -0
Turning row-based replication off for statements that change metadata.
sql/table.h@stripped, 2007-02-16 19:50:10+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-16 19:50:26 +01:00
+++ 1.291/sql/handler.cc 2007-02-16 19:50:26 +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-16 19:50:26 +01:00
+++ 1.254/sql/log.cc 2007-02-16 19:50:26 +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-16 19:50:26 +01:00
+++ 1.229/sql/sql_acl.cc 2007-02-16 19:50:26 +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-16 19:50:26 +01:00
+++ 1.158/sql/table.h 2007-02-16 19:50:26 +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-16 19:50:26 +01:00
+++ 1.11/mysql-test/r/binlog_row_binlog.result 2007-02-16 19:50:26 +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-16 19:50:26 +01:00
+++ 1.137/sql/sp.cc 2007-02-16 19:50:26 +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-16 19:50:26 +01:00
+++ 1.18/mysql-test/r/binlog_stm_binlog.result 2007-02-16 19:50:26 +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-16 19:50:26 +01:00
+++ 1.16/mysql-test/extra/binlog_tests/binlog.test 2007-02-16 19:50:26 +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#25091 | Mats Kindahl | 16 Feb |