From 5745b67e02dbadf089c698fda2f6113e0e466a89 Mon Sep 17 00:00:00 2001 From: Sujatha Sivakumar Date: Wed, 27 Mar 2013 11:53:01 +0530 Subject: [PATCH] Bug#11829838: ALTER TABLE NOT BINLOGGED WITH --BINLOG-IGNORE-DB AND FULLY QUALIFIED TABLE Problem: ======= An ALTER TABLE statement is not written to binlog if server started with "--binlog-ignore-db some database" and 'fully qualified' table names are used in the ALTER TABLE statement altering table different from current database context. Analysis: ======== The above mentioned problem not only affects "ALTER TABLE" statements but also to all kind of statements. Once the current default database becomes "NULL" none of the statements will be binlogged. The current behaviour is such that if the user has specified restrictions on which database needs to be replicated and the default db is not specified, then do not replicate. This means that "NULL" is considered to be equivalent to everything (default db = null implied ignore don't log the statement). Fix: === "NULL" should not be considered as equivalent to everything. Since the filtering criteria is not equal to "NULL" the statement should be logged into binlog. --- mysql-test/suite/rpl/r/rpl_loaddata_m.result | 2 +- mysql-test/suite/rpl/t/rpl_loaddata_m.test | 2 +- sql/rpl_filter.cc | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/mysql-test/suite/rpl/r/rpl_loaddata_m.result b/mysql-test/suite/rpl/r/rpl_loaddata_m.result index ad9fb6e0896..58339811a1a 100644 --- a/mysql-test/suite/rpl/r/rpl_loaddata_m.result +++ b/mysql-test/suite/rpl/r/rpl_loaddata_m.result @@ -32,5 +32,5 @@ SELECT COUNT(*) FROM mysqltest.t1; COUNT(*) 2 DROP DATABASE mysqltest; -DROP TABLE test.t1; +DROP TABLE IF EXISTS test.t1; include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_loaddata_m.test b/mysql-test/suite/rpl/t/rpl_loaddata_m.test index bbe11bbb887..034fefa95f5 100644 --- a/mysql-test/suite/rpl/t/rpl_loaddata_m.test +++ b/mysql-test/suite/rpl/t/rpl_loaddata_m.test @@ -46,7 +46,7 @@ SELECT COUNT(*) FROM mysqltest.t1; # Cleanup connection master; DROP DATABASE mysqltest; -DROP TABLE test.t1; +DROP TABLE IF EXISTS test.t1; sync_slave_with_master; # End of test diff --git a/sql/rpl_filter.cc b/sql/rpl_filter.cc index 3d38c243a0a..cee518ebf0f 100644 --- a/sql/rpl_filter.cc +++ b/sql/rpl_filter.cc @@ -154,11 +154,14 @@ Rpl_filter::db_ok(const char* db) DBUG_RETURN(1); // Ok to replicate if the user puts no constraints /* - If the user has specified restrictions on which databases to replicate - and db was not selected, do not replicate. + Previous behaviour "if the user has specified restrictions on which + databases to replicate and db was not selected, do not replicate" has + been replaced with "do replicate". + Since the filtering criteria is not equal to "NULL" the statement should + be logged into binlog. */ if (!db) - DBUG_RETURN(0); + DBUG_RETURN(1); if (!do_db.is_empty()) // if the do's are not empty {