--source include/have_binlog_format_row.inc

let $SERVER_VERSION=`select version()`;

#This test case is not written for NDB, the result files 
#will not match when NDB is the default engine
-- source include/not_ndb_default.inc

--source include/master-slave.inc

# Bug#15942 (RBR ignores --binlog_ignore_db and tries to map to table
# on slave for writes)

CREATE DATABASE test_ignore;      # --binlog_ignore_db=mysqltest_ignore

--echo **** On Master ****
SHOW DATABASES;
USE test;
CREATE TABLE t1 (a INT, b INT);
SHOW TABLES;
INSERT INTO t1 VALUES (1,1), (2,2);
USE test_ignore;
CREATE TABLE t2 (a INT, b INT);
SHOW TABLES;
INSERT INTO t2 VALUES (3,3), (4,4);
source include/show_binlog_events.inc;
sync_slave_with_master;
--echo **** On Slave ****
SHOW DATABASES;
USE test;
SHOW TABLES;
--error 1049
USE test_ignore;

connection master;
DROP DATABASE test_ignore;
sync_slave_with_master;

# Bug#19995: Extreneous table maps generated for statements that does
# not generate rows
--disable_query_log
--source include/master-slave-reset.inc
--enable_query_log

connection master;
CREATE TABLE t1 (a INT);
DELETE FROM t1;
INSERT INTO t1 VALUES (1),(2);
DELETE FROM t1 WHERE a = 0;
UPDATE t1 SET a=99 WHERE a = 0;
source include/show_binlog_events.inc;

DROP TABLE t1;

# BUG#17620: Replicate (Row Based) Fails when Query Cache enabled on
# slave
--echo ================ Test for BUG#17620 ================
--disable_query_log
--source include/master-slave-reset.inc
--enable_query_log

--echo **** On Slave **** 
connection slave;
SET GLOBAL QUERY_CACHE_SIZE=0;

--echo **** On Master **** 
connection master;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2),(3);

--echo **** On Slave **** 
sync_slave_with_master;
SET GLOBAL QUERY_CACHE_SIZE=16*1024*1024;

--echo **** On Master **** 
connection master;
INSERT INTO t1 VALUES (4),(5),(6);

--echo **** On Slave **** 
sync_slave_with_master;
SELECT * FROM t1;

--echo **** On Master **** 
connection master;
INSERT INTO t1 VALUES (7),(8),(9);

--echo **** On Slave **** 
sync_slave_with_master;
SELECT * FROM t1;

SET GLOBAL QUERY_CACHE_SIZE=0;

# Bug#22550: Replication of BIT columns failing
--echo ================ Test for BUG#22550 ================
--disable_query_log
--source include/master-slave-reset.inc
--enable_query_log

connection master;
CREATE TABLE t1 (a BIT(1), b INT) ENGINE=MYISAM;
sync_slave_with_master;

connection master;
INSERT INTO t1 VALUES(1,2);
SELECT HEX(a),b FROM t1;
sync_slave_with_master;
SELECT HEX(a),b FROM t1;

connection master;
UPDATE t1 SET a=0 WHERE b=2;
SELECT HEX(a),b FROM t1;
sync_slave_with_master;
SELECT HEX(a),b FROM t1;

connection master;
DROP TABLE IF EXISTS t1;
sync_slave_with_master;

# BUG#22583: RBR between MyISAM and non-MyISAM tables containing a BIT
# field does not work

--echo ================ Test for BUG#22583 ================
--disable_query_log
--source include/master-slave-reset.inc
--enable_query_log

# disabling warnings temporarily for ENGINE=INNODB to work without InnoDB
--disable_warnings
--echo **** On Master **** 
connection master;
CREATE TABLE t1_myisam (k INT, a BIT(1), b BIT(9)) ENGINE=MYISAM;
CREATE TABLE t1_innodb (k INT, a BIT(1), b BIT(9)) ENGINE=INNODB;
CREATE TABLE t2_myisam (k INT, a BIT(1) NOT NULL, b BIT(4) NOT NULL) ENGINE=MYISAM;
CREATE TABLE t2_innodb (k INT, a BIT(1) NOT NULL, b BIT(4) NOT NULL) ENGINE=INNODB;
--echo **** On Slave **** 
sync_slave_with_master;
ALTER TABLE t1_myisam ENGINE=INNODB;
ALTER TABLE t1_innodb ENGINE=MYISAM;
ALTER TABLE t2_myisam ENGINE=INNODB;
ALTER TABLE t2_innodb ENGINE=MYISAM;
--enable_warnings

--echo **** On Master **** 
connection master;
INSERT INTO t1_myisam VALUES(1, b'0', 257);
INSERT INTO t1_myisam VALUES(2, b'1', 256);
INSERT INTO t1_innodb VALUES(1, b'0', 257);
INSERT INTO t1_innodb VALUES(2, b'1', 256);
SELECT k, HEX(a),HEX(b) FROM t1_myisam;
SELECT k, HEX(a),HEX(b) FROM t1_innodb;
INSERT INTO t2_myisam VALUES(1, b'0', 9);
INSERT INTO t2_myisam VALUES(2, b'1', 8);
INSERT INTO t2_innodb VALUES(1, b'0', 9);
INSERT INTO t2_innodb VALUES(2, b'1', 8);
SELECT k, HEX(a),HEX(b) FROM t2_myisam;
SELECT k, HEX(a),HEX(b) FROM t2_innodb;
--echo **** On Slave **** 
sync_slave_with_master;
SELECT k, HEX(a),HEX(b) FROM t1_myisam;
SELECT k, HEX(a),HEX(b) FROM t1_innodb;
SELECT k, HEX(a),HEX(b) FROM t2_myisam;
SELECT k, HEX(a),HEX(b) FROM t2_innodb;

--echo **** On Master **** 
connection master;
UPDATE t1_myisam SET a=0 WHERE k=2;
SELECT k, HEX(a),HEX(b) FROM t1_myisam;
UPDATE t1_innodb SET a=0 WHERE k=2;
SELECT k, HEX(a),HEX(b) FROM t1_innodb;
UPDATE t2_myisam SET a=0 WHERE k=2;
SELECT k, HEX(a),HEX(b) FROM t2_myisam;
UPDATE t2_innodb SET a=0 WHERE k=2;
SELECT k, HEX(a),HEX(b) FROM t2_innodb;
--echo **** On Slave **** 
sync_slave_with_master;
SELECT k, HEX(a),HEX(b) FROM t1_myisam;
SELECT k, HEX(a),HEX(b) FROM t1_innodb;
SELECT k, HEX(a),HEX(b) FROM t2_myisam;
SELECT k, HEX(a),HEX(b) FROM t2_innodb;

--echo **** On Master **** 
connection master;
DROP TABLE IF EXISTS t1_myisam, t1_innodb, t2_myisam, t2_innodb;
sync_slave_with_master;

#
# Bug#27716  	multi-update did partially and has not binlogged
#

connection master;

--disable_warnings
drop table if exists t1, t2;
--enable_warnings
CREATE TABLE `t1` (
  `a` int(11) NOT NULL auto_increment,
  `b` int(11) default NULL,
  PRIMARY KEY  (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;

CREATE TABLE `t2` (
  `a` int(11) NOT NULL auto_increment,
  `b` int(11) default NULL,
  PRIMARY KEY  (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;

# testing multi_update::send_error() effective update
insert into t1 values (1,1),(2,2);
insert into t2 values (1,1),(4,4);

connection master;
error ER_DUP_ENTRY;
UPDATE t2,t1 SET t2.a=t1.a+2;
select * from t2 /* must be (3,1), (4,4) */;
sync_slave_with_master;

connection slave;
select * from t2 /* must be (3,1), (4,4) */;

connection master;
drop table t1,t2;

sync_slave_with_master;

#
# BUG#31702: Missing row on slave causes assertion failure under
# row-based replication 
#

disable_query_log;
source include/master-slave-reset.inc;
enable_query_log;

--echo **** On Master ****
connection master;
SET SESSION BINLOG_FORMAT=ROW;
CREATE TABLE t1 (a INT PRIMARY KEY, b SET('master','slave'));
INSERT INTO t1 VALUES (1,'master,slave'), (2,'master,slave');
--echo **** On Slave ****
sync_slave_with_master;
UPDATE t1 SET a = 5, b = 'slave' WHERE a = 1;
SELECT * FROM t1 ORDER BY a;
# since bug#31552/31609 idempotency is not default any longer. In
# order the preceeding test UPDATE t1 to pass the mode is switched
# temprorarily
set @@global.slave_exec_mode= 'IDEMPOTENT';
--echo **** On Master ****
connection master;
UPDATE t1 SET a = 5, b = 'master' WHERE a = 1;
SELECT * FROM t1 ORDER BY a;
--echo **** On Slave ****
sync_slave_with_master;
set @@global.slave_exec_mode= default;
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
disable_query_log;
eval SELECT "$last_error" AS Last_SQL_Error;
enable_query_log;
SELECT * FROM t1 ORDER BY a;
DROP TABLE t1;

--echo **** On Master ****
connection master;
DROP TABLE t1;
