Hi Luis,
Nice work, approved!
Luis Soares wrote:
> #At file:///home/lsoares/Workspace/mysql-server/bugfix/b42851/5.1-bt/ based on
> revid:zhenxing.he@stripped
>
> 2917 Luis Soares 2009-06-05
> BUG#42851: Spurious "Statement is not safe to log in statement
> format." warnings
>
> Despite the fact that a statement would be filtered out from binlog, a
> warning would still be thrown if it was issued with the LIMIT.
>
> This patch addresses this issue by checking the filtering rules before
> printing out the warning.
> @ mysql-test/suite/binlog/t/limit_warning-master.opt
> Parameter to filter out database: "b42851".
> @ mysql-test/suite/binlog/t/limit_warning.test
> Added a new test case.
> @ sql/sql_class.cc
> Added filtering rules check to condition used to decide whether to
> printout warning or not.
>
> added:
> mysql-test/suite/binlog/r/limit_warning.result
> mysql-test/suite/binlog/t/limit_warning-master.opt
> mysql-test/suite/binlog/t/limit_warning.test
> modified:
> sql/sql_class.cc
> === added file 'mysql-test/suite/binlog/r/limit_warning.result'
> --- a/mysql-test/suite/binlog/r/limit_warning.result 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/binlog/r/limit_warning.result 2009-06-05 09:09:59 +0000
> @@ -0,0 +1,30 @@
> +### NOT filtered database => assertion: warnings ARE shown
> +DROP TABLE IF EXISTS t1;
> +CREATE TABLE t1 (a int, b int, primary key (a));
> +INSERT INTO t1 VALUES (1,2), (2,3);
> +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1;
> +Warnings:
> +Note 1592 Statement may not be safe to log in statement format.
> +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1;
> +Warnings:
> +Note 1592 Statement may not be safe to log in statement format.
> +DROP TABLE t1;
> +### NOT filtered database => assertion: binlog disabled and warnings ARE NOT
> shown
> +SET SQL_LOG_BIN= 0;
> +DROP TABLE IF EXISTS t1;
> +CREATE TABLE t1 (a int, b int, primary key (a));
> +INSERT INTO t1 VALUES (1,2), (2,3);
> +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1;
> +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1;
> +DROP TABLE t1;
> +SET SQL_LOG_BIN= 1;
> +### FILTERED database => assertion: warnings ARE NOT shown
> +CREATE DATABASE b42851;
> +USE b42851;
> +DROP TABLE IF EXISTS t1;
> +CREATE TABLE t1 (a int, b int, primary key (a));
> +INSERT INTO t1 VALUES (1,2), (2,3);
> +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1;
> +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1;
> +DROP TABLE t1;
> +DROP DATABASE b42851;
>
> === added file 'mysql-test/suite/binlog/t/limit_warning-master.opt'
> --- a/mysql-test/suite/binlog/t/limit_warning-master.opt 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/binlog/t/limit_warning-master.opt 2009-06-05 09:09:59 +0000
> @@ -0,0 +1 @@
> +--binlog-ignore-db=b42851
>
> === added file 'mysql-test/suite/binlog/t/limit_warning.test'
> --- a/mysql-test/suite/binlog/t/limit_warning.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/binlog/t/limit_warning.test 2009-06-05 09:09:59 +0000
> @@ -0,0 +1,73 @@
> +# BUG#42851: Spurious "Statement is not safe to log in statement
> +# format." warnings
> +#
> +# WHY
> +# ===
> +#
> +# This test aims at checking that the fix that removes spurious
> +# entries in the error log when the statement is filtered out from
> +# binlog, is working.
> +#
> +# HOW
> +# ===
> +#
> +# The test case is split into three assertions when issuing statements
> +# containing LIMIT and ORDER BY:
> +#
> +# i) issue statements in database that is not filtered => check
> +# that warnings ARE shown;
> +#
> +# ii) issue statements in database that is not filtered, but with
> +# binlog disabled => check that warnings ARE NOT shown;
> +#
> +# iii) issue statements in database that is filtered => check that
> +# warnings ARE NOT shown.
> +
> +-- source include/have_log_bin.inc
> +-- source include/have_binlog_format_statement.inc
> +
> +-- echo ### NOT filtered database => assertion: warnings ARE shown
> +
> +-- disable_warnings
> +DROP TABLE IF EXISTS t1;
> +-- enable_warnings
> +
> +CREATE TABLE t1 (a int, b int, primary key (a));
> +INSERT INTO t1 VALUES (1,2), (2,3);
> +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1;
> +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1;
> +DROP TABLE t1;
> +
> +-- echo ### NOT filtered database => assertion: binlog disabled and warnings ARE
> NOT shown
> +
> +SET SQL_LOG_BIN= 0;
> +
> +-- disable_warnings
> +DROP TABLE IF EXISTS t1;
> +-- enable_warnings
> +
> +CREATE TABLE t1 (a int, b int, primary key (a));
> +INSERT INTO t1 VALUES (1,2), (2,3);
> +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1;
> +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1;
> +DROP TABLE t1;
> +
> +SET SQL_LOG_BIN= 1;
> +
> +-- echo ### FILTERED database => assertion: warnings ARE NOT shown
> +
> +CREATE DATABASE b42851;
> +USE b42851;
> +
> +-- disable_warnings
> +DROP TABLE IF EXISTS t1;
> +-- enable_warnings
> +
> +CREATE TABLE t1 (a int, b int, primary key (a));
> +INSERT INTO t1 VALUES (1,2), (2,3);
> +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1;
> +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1;
> +DROP TABLE t1;
> +
> +# clean up
> +DROP DATABASE b42851;
>
> === modified file 'sql/sql_class.cc'
> --- a/sql/sql_class.cc 2009-05-30 13:32:28 +0000
> +++ b/sql/sql_class.cc 2009-06-05 09:09:59 +0000
> @@ -27,6 +27,7 @@
>
> #include "mysql_priv.h"
> #include "rpl_rli.h"
> +#include "rpl_filter.h"
> #include "rpl_record.h"
> #include "slave.h"
> #include <my_bitmap.h>
> @@ -3683,7 +3684,8 @@ int THD::binlog_query(THD::enum_binlog_q
> we should print a warning.
> */
> if (sql_log_bin_toplevel && lex->is_stmt_unsafe() &&
> - variables.binlog_format == BINLOG_FORMAT_STMT)
> + variables.binlog_format == BINLOG_FORMAT_STMT &&
> + binlog_filter->db_ok(this->db))
> {
> /*
> A warning can be elevated a error when STRICT sql mode.
>