diff options
author | unknown <knielsen@knielsen-hq.org> | 2011-01-13 13:28:36 +0100 |
---|---|---|
committer | unknown <knielsen@knielsen-hq.org> | 2011-01-13 13:28:36 +0100 |
commit | 108e9ee84ead6a8665c7faca7c63aa168414a8d9 (patch) | |
tree | c144e1f5f649c5c067241db8d5316d7510a4ee2a | |
parent | acb3095386a3721be045bb94f98ae922baad07a9 (diff) | |
download | mariadb-git-108e9ee84ead6a8665c7faca7c63aa168414a8d9.tar.gz |
MBug#702303: Spurious `use` statements in output from mysqlbinlog --rewrite-db="a->b"
-rw-r--r-- | client/mysqlbinlog.cc | 15 | ||||
-rw-r--r-- | mysql-test/r/mysqlbinlog-innodb.result | 85 | ||||
-rw-r--r-- | mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result | 2 | ||||
-rw-r--r-- | mysql-test/t/mysqlbinlog-innodb.test | 31 |
4 files changed, 126 insertions, 7 deletions
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 420042e6055..266160890f6 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -636,11 +636,16 @@ static bool shall_skip_database(const char *log_dbname) producing USE statements by corresponding log event print-functions. */ -void print_use_stmt(PRINT_EVENT_INFO* pinfo, const char* db, size_t db_len) +static void +print_use_stmt(PRINT_EVENT_INFO* pinfo, const Query_log_event *ev) { + const char* db= ev->db; + const size_t db_len= ev->db_len; + // pinfo->db is the current db. // If current db is the same as required db, do nothing. - if (!db || !memcmp(pinfo->db, db, db_len + 1)) + if ((ev->flags & LOG_EVENT_SUPPRESS_USE_F) || !db || + !memcmp(pinfo->db, db, db_len + 1)) return; // Current db and required db are different. @@ -779,7 +784,7 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, Query_log_event *qe= (Query_log_event*)ev; if (!qe->is_trans_keyword() && shall_skip_database(qe->db)) goto end; - print_use_stmt(print_event_info, qe->db, qe->db_len); + print_use_stmt(print_event_info, qe); if (opt_base64_output_mode == BASE64_OUTPUT_ALWAYS) { if ((retval= write_event_header_and_base64(ev, result_file, @@ -912,7 +917,7 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, if (!shall_skip_database(exlq->db)) { - print_use_stmt(print_event_info, exlq->db, exlq->db_len); + print_use_stmt(print_event_info, exlq); if (fname) { convert_path_to_forward_slashes(fname); @@ -1491,7 +1496,7 @@ static int parse_args(int *argc, char*** argv) */ static Exit_status safe_connect() { - /* Close and old connections to MySQL */ + /* Close any old connections to MySQL */ if (mysql) mysql_close(mysql); diff --git a/mysql-test/r/mysqlbinlog-innodb.result b/mysql-test/r/mysqlbinlog-innodb.result new file mode 100644 index 00000000000..d9f83fb89f0 --- /dev/null +++ b/mysql-test/r/mysqlbinlog-innodb.result @@ -0,0 +1,85 @@ +SET TIMESTAMP=1000000000; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=innodb; +CREATE DATABASE test2; +RESET MASTER; +USE test2; +BEGIN; +USE test; +INSERT INTO t1 VALUES (1); +USE test2; +COMMIT; +BEGIN; +USE test; +INSERT INTO t1 VALUES (2); +USE test2; +COMMIT; +USE test; +SELECT * FROM t1 ORDER BY a; +a +1 +2 +FLUSH LOGS; +/*!40019 SET @@session.max_insert_delayed_threads=0*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +SET TIMESTAMP=1000000000/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=0/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C latin1 *//*!*/; +SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use test/*!*/; +SET TIMESTAMP=1000000000/*!*/; +INSERT INTO t1 VALUES (1) +/*!*/; +COMMIT/*!*/; +SET TIMESTAMP=1000000000/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1000000000/*!*/; +INSERT INTO t1 VALUES (2) +/*!*/; +COMMIT/*!*/; +DELIMITER ; +# End of log file +ROLLBACK /* added by mysqlbinlog */; +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!40019 SET @@session.max_insert_delayed_threads=0*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +SET TIMESTAMP=1000000000/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=0/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C latin1 *//*!*/; +SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use foo/*!*/; +SET TIMESTAMP=1000000000/*!*/; +INSERT INTO t1 VALUES (1) +/*!*/; +COMMIT/*!*/; +SET TIMESTAMP=1000000000/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1000000000/*!*/; +INSERT INTO t1 VALUES (2) +/*!*/; +COMMIT/*!*/; +DELIMITER ; +# End of log file +ROLLBACK /* added by mysqlbinlog */; +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +DROP DATABASE test2; +DROP TABLE t1; diff --git a/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result b/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result index 5a6fbc953b4..5e48f13932d 100644 --- a/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result +++ b/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result @@ -159,7 +159,6 @@ SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; # at # -use new_test1/*!*/; #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 SET TIMESTAMP=1000000000/*!*/; BEGIN @@ -354,7 +353,6 @@ SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; # at # -use new_test1/*!*/; #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 SET TIMESTAMP=1000000000/*!*/; BEGIN diff --git a/mysql-test/t/mysqlbinlog-innodb.test b/mysql-test/t/mysqlbinlog-innodb.test new file mode 100644 index 00000000000..49702e8db38 --- /dev/null +++ b/mysql-test/t/mysqlbinlog-innodb.test @@ -0,0 +1,31 @@ +-- source include/have_binlog_format_statement.inc +-- source include/have_log_bin.inc +-- source include/have_innodb.inc + +# +# MBug#702303: Spurious `use` statements in output from mysqlbinlog --rewrite-db="a->b" +# +let $MYSQLD_DATADIR= `select @@datadir`; +SET TIMESTAMP=1000000000; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=innodb; +CREATE DATABASE test2; + +RESET MASTER; +USE test2; +BEGIN; +USE test; +INSERT INTO t1 VALUES (1); +USE test2; +COMMIT; +BEGIN; +USE test; +INSERT INTO t1 VALUES (2); +USE test2; +COMMIT; +USE test; +SELECT * FROM t1 ORDER BY a; +FLUSH LOGS; +--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --short-form +--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --short-form --rewrite-db="test->foo" --rewrite-db="test2->bar" +DROP DATABASE test2; +DROP TABLE t1; |