MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Dao-Gang.Qu Date:December 29 2010 5:23am
Subject:bzr commit into mysql-5.5-bugteam branch (Dao-Gang.Qu:3228) Bug#50914
View as plain text  
#At file:///home/daogang/bzrwork/bug50914/mysql-5.5-bugteam/ based on revid:kent.boortz@stripped

 3228 Dao-Gang.Qu@stripped	2010-12-29 [merge]
      Bug #50914    mysqlbinlog not handling drop of current default database
            
      mysqlbinlog only prints "use $database" statements to its output stream
      when the active default database changes between events. This will cause
      "No Database Selected" error when dropping and recreating that database.
            
      To fix the problem, we clear print_event_info->db when printing an event
      of CREATE/DROP/ALTER database statements, so that the Query_log_event
      after such statements will be printed with the use 'db' anyway except
      transaction keywords.
     @ mysql-test/r/mysqlbinlog.result
        Test result for Bug#50914.
     @ mysql-test/t/mysqlbinlog.test
        Added test to verify if the approach of the mysqlbinlog prints
        "use $database" statements to its output stream will cause
        "No Database Selected" error when dropping and recreating
        that database.
     @ sql/log_event.cc
        Updated code to clear print_event_info->db when printing an event
        of CREATE/DROP/ALTER database statements, so that the Query_log_event
        after such statements will be printed with the use 'db' anyway except
        transaction keywords.

    modified:
      mysql-test/r/mysqlbinlog.result
      mysql-test/t/mysqlbinlog.test
      sql/log_event.cc
=== modified file 'mysql-test/r/mysqlbinlog.result'
--- a/mysql-test/r/mysqlbinlog.result	2010-10-29 14:56:58 +0000
+++ b/mysql-test/r/mysqlbinlog.result	2010-12-29 05:22:52 +0000
@@ -883,3 +883,23 @@ End of 5.1 tests
 WARNING: The --base64-output=always flag and the --base64-output flag (with '=MODE' omitted), are deprecated. The output generated when these flags are used cannot be parsed by mysql 5.6.0 and later. The flags will be removed in a future version. Please use --base64-output=auto instead.
 # Expect deprecation warning again.
 WARNING: The --base64-output=always flag and the --base64-output flag (with '=MODE' omitted), are deprecated. The output generated when these flags are used cannot be parsed by mysql 5.6.0 and later. The flags will be removed in a future version. Please use --base64-output=auto instead.
+RESET MASTER;
+CREATE DATABASE test1;
+USE test1;
+CREATE TABLE t1(id int);
+DROP DATABASE test1;
+CREATE DATABASE test1;
+USE test1;
+CREATE TABLE t1(id int);
+DROP TABLE t1;
+DROP DATABASE test1;
+FLUSH LOGS;
+show binlog events in 'master-bin.000002' from <binlog_start>;
+Log_name	Pos	Event_type	Server_id	End_log_pos	Info
+master-bin.000002	#	Query	#	#	CREATE DATABASE test1
+master-bin.000002	#	Query	#	#	use `test1`; CREATE TABLE t1(id int)
+master-bin.000002	#	Query	#	#	DROP DATABASE test1
+master-bin.000002	#	Query	#	#	CREATE DATABASE test1
+master-bin.000002	#	Query	#	#	use `test1`; CREATE TABLE t1(id int)
+master-bin.000002	#	Query	#	#	use `test1`; DROP TABLE `t1` /* generated by server */
+master-bin.000002	#	Query	#	#	DROP DATABASE test1

=== modified file 'mysql-test/t/mysqlbinlog.test'
--- a/mysql-test/t/mysqlbinlog.test	2010-10-29 14:56:58 +0000
+++ b/mysql-test/t/mysqlbinlog.test	2010-12-29 05:22:52 +0000
@@ -491,7 +491,6 @@ remove_file $MYSQLTEST_VARDIR/tmp/mysqlb
 #
 # WL#5625: Deprecate mysqlbinlog options --base64-output=always and --base64-output
 #
-
 --echo # Expect deprecation warning.
 --exec $MYSQL_BINLOG --base64-output=always std_data/master-bin.000001 > /dev/null 2> $MYSQLTEST_VARDIR/tmp/mysqlbinlog.warn
 --cat_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog.warn
@@ -502,3 +501,29 @@ remove_file $MYSQLTEST_VARDIR/tmp/mysqlb
 
 # Clean up this part of the test.
 --remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog.warn
+
+# BUG#50914
+# This test verifies if the approach of the mysqlbinlog prints
+# "use $database" statements to its output stream will cause
+# "No Database Selected" error when dropping and recreating
+# that database.
+#
+RESET MASTER;
+CREATE DATABASE test1;
+USE test1;
+CREATE TABLE t1(id int);
+DROP DATABASE test1;
+CREATE DATABASE test1;
+USE test1;
+CREATE TABLE t1(id int);
+DROP TABLE t1;
+DROP DATABASE test1;
+let $master_binlog= query_get_value(SHOW MASTER STATUS, File, 1);
+FLUSH LOGS;
+
+let $MYSQLD_DATADIR= `SELECT @@datadir`;
+exec $MYSQL_BINLOG $MYSQLD_DATADIR/$master_binlog | $MYSQL test 2>&1;
+
+let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1);
+source include/show_binlog_events.inc;
+

=== modified file 'sql/log_event.cc'
--- a/sql/log_event.cc	2010-12-21 10:23:20 +0000
+++ b/sql/log_event.cc	2010-12-29 05:22:52 +0000
@@ -2969,7 +2969,12 @@ void Query_log_event::print_query_header
                 error_code);
   }
 
-  if (!(flags & LOG_EVENT_SUPPRESS_USE_F) && db)
+  if ((flags & LOG_EVENT_SUPPRESS_USE_F))
+  {
+    if (!is_trans_keyword())
+      print_event_info->db[0]= '\0';
+  }
+  else if (db)
   {
     different_db= memcmp(print_event_info->db, db, db_len + 1);
     if (different_db)

No bundle (reason: revision is a merge).
Thread
bzr commit into mysql-5.5-bugteam branch (Dao-Gang.Qu:3228) Bug#50914Dao-Gang.Qu29 Dec