summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormkindahl@dl145h.mysql.com <>2007-11-16 15:55:22 +0100
committermkindahl@dl145h.mysql.com <>2007-11-16 15:55:22 +0100
commite0ae105055dd82623fcd34a875be963c6499d78a (patch)
treed5ee1dd616c0b74ef0c99eb5a0ee47d35d876ea3
parentd7f570c05696bcaaafaec8552bbcfa1d23139d7e (diff)
downloadmariadb-git-e0ae105055dd82623fcd34a875be963c6499d78a.tar.gz
Bug#32435:
DROP DATABASE statement writes changes to mysql.proc table under RBR When replicating a DROP DATABASE statement with a database holding stored procedures, the changes to the mysql.proc table was recorded in the binary log under row-based replication. With this patch, the thread uses statement-logging format for the duration of the DROP DATABASE statement. The logging format is (already) reset at the end of the statement, so no additional code for resetting the logging format is necessary.
-rw-r--r--mysql-test/extra/binlog_tests/database.test15
-rw-r--r--mysql-test/suite/binlog/r/binlog_database.result56
-rw-r--r--mysql-test/suite/binlog/t/binlog_database.test12
-rw-r--r--sql/sql_db.cc7
4 files changed, 90 insertions, 0 deletions
diff --git a/mysql-test/extra/binlog_tests/database.test b/mysql-test/extra/binlog_tests/database.test
new file mode 100644
index 00000000000..11a8f53a6d7
--- /dev/null
+++ b/mysql-test/extra/binlog_tests/database.test
@@ -0,0 +1,15 @@
+source include/have_log_bin.inc;
+source include/not_embedded.inc;
+
+# Checking that the drop of a database does not replicate anything in
+# addition to the drop of the database
+
+reset master;
+create database testing_1;
+use testing_1;
+create table t1 (a int);
+create function sf1 (a int) returns int return a+1;
+create trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a);
+create procedure sp1 (a int) insert into t1 values(a);
+drop database testing_1;
+source include/show_binlog_events.inc;
diff --git a/mysql-test/suite/binlog/r/binlog_database.result b/mysql-test/suite/binlog/r/binlog_database.result
new file mode 100644
index 00000000000..7deffb86244
--- /dev/null
+++ b/mysql-test/suite/binlog/r/binlog_database.result
@@ -0,0 +1,56 @@
+set binlog_format=statement;
+reset master;
+create database testing_1;
+use testing_1;
+create table t1 (a int);
+create function sf1 (a int) returns int return a+1;
+create trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a);
+create procedure sp1 (a int) insert into t1 values(a);
+drop database testing_1;
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # create database testing_1
+master-bin.000001 # Query # # use `testing_1`; create table t1 (a int)
+master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` function sf1 (a int) returns int return a+1
+master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a)
+master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` procedure sp1 (a int) insert into t1 values(a)
+master-bin.000001 # Query # # drop database testing_1
+set binlog_format=mixed;
+reset master;
+create database testing_1;
+use testing_1;
+create table t1 (a int);
+create function sf1 (a int) returns int return a+1;
+create trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a);
+create procedure sp1 (a int) insert into t1 values(a);
+drop database testing_1;
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # create database testing_1
+master-bin.000001 # Query # # use `testing_1`; create table t1 (a int)
+master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` function sf1 (a int) returns int return a+1
+master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a)
+master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` procedure sp1 (a int) insert into t1 values(a)
+master-bin.000001 # Query # # drop database testing_1
+set binlog_format=row;
+reset master;
+create database testing_1;
+use testing_1;
+create table t1 (a int);
+create function sf1 (a int) returns int return a+1;
+create trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a);
+create procedure sp1 (a int) insert into t1 values(a);
+drop database testing_1;
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # create database testing_1
+master-bin.000001 # Query # # use `testing_1`; create table t1 (a int)
+master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` function sf1 (a int) returns int return a+1
+master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a)
+master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` procedure sp1 (a int) insert into t1 values(a)
+master-bin.000001 # Query # # drop database testing_1
+show databases;
+Database
+information_schema
+mysql
+test
diff --git a/mysql-test/suite/binlog/t/binlog_database.test b/mysql-test/suite/binlog/t/binlog_database.test
new file mode 100644
index 00000000000..ee236b4e5ea
--- /dev/null
+++ b/mysql-test/suite/binlog/t/binlog_database.test
@@ -0,0 +1,12 @@
+# A wrapper to test that dropping a database is binlogged
+# correctly. We test all three modes in the same file to avoid
+# unecessary server restarts.
+
+set binlog_format=statement;
+source extra/binlog_tests/database.test;
+set binlog_format=mixed;
+source extra/binlog_tests/database.test;
+set binlog_format=row;
+source extra/binlog_tests/database.test;
+
+show databases;
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index abbf2131957..ad4e0d803eb 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -883,6 +883,13 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
VOID(pthread_mutex_lock(&LOCK_mysql_create_db));
+ /*
+ 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();
+
length= build_table_filename(path, sizeof(path), db, "", "", 0);
strmov(path+length, MY_DB_OPT_FILE); // Append db option file name
del_dbopt(path); // Remove dboption hash entry