mirror of
https://github.com/MariaDB/server.git
synced 2025-01-23 07:14:17 +01:00
e1c43705b9
If using statement based replication (SBR), repeatedly calling statements which are unsafe for SBR will cause a warning message to be written to the error for each statement. This might lead to filling up the error log and there is no way to disable this behavior. The solution is to only log these message (about statements unsafe for statement based replication) if the log_warnings option is set. For example: SET GLOBAL LOG_WARNINGS = 0; INSERT INTO t1 VALUES(UUID()); SET GLOBAL LOG_WARNINGS = 1; INSERT INTO t1 VALUES(UUID()); In this case the message will be printed only once: [Warning] Statement may not be safe to log in statement format. Statement: INSERT INTO t1 VALUES(UUID())
108 lines
2.7 KiB
Text
108 lines
2.7 KiB
Text
# 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
|
|
|
|
let $old_db= `SELECT DATABASE()`;
|
|
|
|
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;
|
|
|
|
eval USE $old_db;
|
|
|
|
--echo #
|
|
--echo # Bug#46265: Can not disable warning about unsafe statements for binary logging
|
|
--echo #
|
|
|
|
SET @old_log_warnings = @@log_warnings;
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
CREATE TABLE t1 (a VARCHAR(36), b VARCHAR(10));
|
|
SET GLOBAL LOG_WARNINGS = 0;
|
|
INSERT INTO t1 VALUES(UUID(), 'Bug#46265');
|
|
SET GLOBAL LOG_WARNINGS = 1;
|
|
INSERT INTO t1 VALUES(UUID(), 'Bug#46265');
|
|
DROP TABLE t1;
|
|
|
|
SET GLOBAL log_warnings = @old_log_warnings;
|
|
|
|
let LOG_ERROR= `SELECT @@GLOBAL.log_error`;
|
|
|
|
--echo # Count the number of times the "Unsafe" message was printed
|
|
--echo # to the error log.
|
|
|
|
perl;
|
|
$log_error= $ENV{'LOG_ERROR'};
|
|
open(FILE, "$log_error") or die("Unable to open $log_error: $!\n");
|
|
$count = () = grep(/Bug#46265/g,<FILE>);
|
|
print "Occurrences: $count\n";
|
|
close(FILE);
|
|
EOF
|