Commit 7f6ce96d authored by unknown's avatar unknown

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.
parents be6c3fd8 22639a06
...@@ -883,3 +883,23 @@ End of 5.1 tests ...@@ -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. 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. # 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. 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
...@@ -491,7 +491,6 @@ remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog.warn; ...@@ -491,7 +491,6 @@ remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog.warn;
# #
# WL#5625: Deprecate mysqlbinlog options --base64-output=always and --base64-output # WL#5625: Deprecate mysqlbinlog options --base64-output=always and --base64-output
# #
--echo # Expect deprecation warning. --echo # Expect deprecation warning.
--exec $MYSQL_BINLOG --base64-output=always std_data/master-bin.000001 > /dev/null 2> $MYSQLTEST_VARDIR/tmp/mysqlbinlog.warn --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 --cat_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog.warn
...@@ -502,3 +501,29 @@ remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog.warn; ...@@ -502,3 +501,29 @@ remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog.warn;
# Clean up this part of the test. # Clean up this part of the test.
--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog.warn --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;
...@@ -2969,7 +2969,12 @@ void Query_log_event::print_query_header(IO_CACHE* file, ...@@ -2969,7 +2969,12 @@ void Query_log_event::print_query_header(IO_CACHE* file,
error_code); 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); different_db= memcmp(print_event_info->db, db, db_len + 1);
if (different_db) if (different_db)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment