# 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
