# name : log_warnings_suppress.patch # introduced : 11 or before # maintainer : Oleg # #!!! notice !!! # Any small change to this file in the main branch # should be done or reviewed by the maintainer! --- /dev/null +++ b/patch_info/log_warnings_suppress.patch @@ -0,0 +1,9 @@ +File=log_warnings_suppress.patch +Name=Disable log warnings for enumerated warnings (old name:suppress_log_warning_1592.patch) +Version=1.0 +Author=Percona +License=GPL +Comment= +Changelog +2011-01-05 rename patch suppress_log_warning_1592.patch to log_warnings_silence.patch. Also remove boolean system variable "suppress_log_warning_1592" and add set varbile "log_warnings_silence" (possible values: 1592) +2011-02-21 rename patch log_warning_silence.patch to log_warnings_suppress.patch. Also rename variable "log_warning_silence" to "log_warning_suppress". --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -632,6 +632,8 @@ SHOW_COMP_OPTION have_crypt, have_compress; SHOW_COMP_OPTION have_profiling; +ulonglong opt_log_warnings_suppress= 0; + /* Thread specific variables */ pthread_key(MEM_ROOT**,THR_MALLOC); --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -229,6 +229,8 @@ extern TYPELIB thread_handling_typelib; extern my_decimal decimal_zero; +extern ulonglong opt_log_warnings_suppress; + /* THR_MALLOC is a key which will be used to set/get MEM_ROOT** for a thread, using my_pthread_setspecific_ptr()/my_thread_getspecific_ptr(). --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -5029,7 +5029,7 @@ ER_BINLOG_UNSAFE_STATEMENT, ER(ER_BINLOG_UNSAFE_STATEMENT), ER(LEX::binlog_stmt_unsafe_errcode[unsafe_type])); - if (global_system_variables.log_warnings) + if (global_system_variables.log_warnings && ((opt_log_warnings_suppress & (ULL(1) << log_warnings_suppress_1592)) == 0)) { char buf[MYSQL_ERRMSG_SIZE * 2]; sprintf(buf, ER(ER_BINLOG_UNSAFE_STATEMENT), --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -87,6 +87,7 @@ SLOG_F_TMP_TABLE, SLOG_F_TMP_DISK, SLOG_F_FILESORT, SLOG_F_FILESORT_DISK }; +enum enum_log_warnings_suppress { log_warnings_suppress_1592 }; enum enum_slave_exec_mode { SLAVE_EXEC_MODE_STRICT, SLAVE_EXEC_MODE_IDEMPOTENT, SLAVE_EXEC_MODE_LAST_BIT}; --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -1572,6 +1572,15 @@ READ_ONLY GLOBAL_VAR(mysqld_port), CMD_LINE(REQUIRED_ARG, 'P'), VALID_RANGE(0, UINT_MAX32), DEFAULT(0), BLOCK_SIZE(1)); +const char *log_warnings_suppress_name[]= { "1592" }; +static Sys_var_set Sys_log_warnings_suppress( + "log_warnings_suppress", + "disable logging of enumerated warnings: " + "1592: unsafe statements for binary logging; " + "possible values : [1592]", + GLOBAL_VAR(opt_log_warnings_suppress), CMD_LINE(REQUIRED_ARG), + log_warnings_suppress_name, DEFAULT(0)); + static Sys_var_ulong Sys_preload_buff_size( "preload_buffer_size", "The size of the buffer that is allocated when preloading indexes", --- /dev/null +++ b/mysql-test/r/percona_log_warnings_suppress.result @@ -0,0 +1,31 @@ +SET @old_log_warnings = @@log_warnings; +SET @old_log_warnings_suppress = @@log_warnings_suppress; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a VARCHAR(36), b VARCHAR(20)); +SET GLOBAL log_warnings_suppress=''; +SET GLOBAL LOG_WARNINGS=0; +SHOW GLOBAL VARIABLES LIKE 'log_warnings_suppress'; +Variable_name Value +log_warnings_suppress +INSERT INTO t1 VALUES(UUID(), 'suppress_1592'); +Warnings: +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave. +SET GLOBAL LOG_WARNINGS=1; +INSERT INTO t1 VALUES(UUID(), 'suppress_1592'); +Warnings: +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave. +SET GLOBAL log_warnings_suppress='1592'; +SET GLOBAL LOG_WARNINGS=0; +INSERT INTO t1 VALUES(UUID(), 'suppress_1592'); +Warnings: +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave. +SET GLOBAL LOG_WARNINGS=1; +INSERT INTO t1 VALUES(UUID(), 'suppress_1592'); +Warnings: +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave. +DROP TABLE t1; +SET GLOBAL log_warnings = @old_log_warnings; +SET GLOBAL log_warnings_suppress = @old_log_warnings_suppress; +# Count the number of times the "Unsafe" message was printed +# to the error log. +Occurrences: 1 --- /dev/null +++ b/mysql-test/t/percona_log_warnings_suppress-master.opt @@ -0,0 +1 @@ +--log-error --- /dev/null +++ b/mysql-test/t/percona_log_warnings_suppress.test @@ -0,0 +1,47 @@ +-- source include/have_log_bin.inc +-- source include/have_binlog_format_statement.inc + +SET @old_log_warnings = @@log_warnings; +SET @old_log_warnings_suppress = @@log_warnings_suppress; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (a VARCHAR(36), b VARCHAR(20)); +SET GLOBAL log_warnings_suppress=''; +SET GLOBAL LOG_WARNINGS=0; +SHOW GLOBAL VARIABLES LIKE 'log_warnings_suppress'; +INSERT INTO t1 VALUES(UUID(), 'suppress_1592'); +SET GLOBAL LOG_WARNINGS=1; +INSERT INTO t1 VALUES(UUID(), 'suppress_1592'); +SET GLOBAL log_warnings_suppress='1592'; +SET GLOBAL LOG_WARNINGS=0; +INSERT INTO t1 VALUES(UUID(), 'suppress_1592'); +SET GLOBAL LOG_WARNINGS=1; +INSERT INTO t1 VALUES(UUID(), 'suppress_1592'); +DROP TABLE t1; + +SET GLOBAL log_warnings = @old_log_warnings; +SET GLOBAL log_warnings_suppress = @old_log_warnings_suppress; + +let $log_error_= `SELECT @@GLOBAL.log_error`; +if(!`select LENGTH('$log_error_')`) +{ + # MySQL Server on windows is started with --console and thus + # does not know the location of its .err log, use default location + let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.1.err; +} +# Assign env variable LOG_ERROR +let LOG_ERROR=$log_error_; + +--echo # Count the number of times the "Unsafe" message was printed +--echo # to the error log. + +perl; + use strict; + my $log_error= $ENV{'LOG_ERROR'} or die "LOG_ERROR not set"; + open(FILE, "$log_error") or die("Unable to open $log_error: $!\n"); + my $count = () = grep(/suppress_1592/g,); + print "Occurrences: $count\n"; + close(FILE); +EOF --- a/mysql-test/r/mysqld--help-notwin.result +++ b/mysql-test/r/mysqld--help-notwin.result @@ -281,6 +281,9 @@ --log-tc-size=# Size of transaction coordinator log. -W, --log-warnings[=#] Log some not critical warnings to the log file + --log-warnings-suppress=name + disable logging of enumerated warnings: 1592: unsafe + statements for binary logging; possible values : [1592] --long-query-time=# Log all queries that have taken more than long_query_time seconds to execute to file. The argument will be treated as a decimal value with microsecond precision @@ -865,6 +868,7 @@ log-tc tc.log log-tc-size 24576 log-warnings 1 +log-warnings-suppress long-query-time 10 low-priority-updates FALSE lower-case-table-names 1