1# ==== Purpose ====
2#
3# Test verifies that there are no duplicate entries in binlog (i.e a safe
4# statement which follows an unsafe statement gets logged in both row format
5# and statement format resulting in duplicate entry) when binlog-format=MIXED
6# and LOCK TABLES are enabled.
7#
8# ==== Implementation ====
9#
10# Steps:
11#    1 - Create three tables t1,t2 and t3 with AUTO_INCREMENT on.
12#    2 - Create a trigger on table t3, so that trigger execution results in
13#        unsafe statement. Note query that modifies autoinc column in
14#        sub-statement can make the master and slave inconsistent. Hence they
15#        are logged in row format.
16#    3 - Lock tables t1,t2 and t3.
17#    4 - Execute an unsafe update which modifies tables t1 and t3. But since t2
18#        table is also locked its table map event also gets written into the
19#        binary log during the execution of update.
20#    5 - Execute a safe DML operation using table 't2' and verify that master
21#        doesn't report any assert.
22#    6 - Ensure that slave is in sync with master and data is consistent.
23#
24# ==== References ====
25#
26# MDEV-19158: MariaDB 10.2.22 is writing duplicate entries into binary log
27
28--source include/have_binlog_format_mixed.inc
29--source include/master-slave.inc
30
31CREATE TABLE t1 (id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, someLabel varchar(30) NOT NULL, flag tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (id)) Engine=MyISAM;
32CREATE TABLE t2 (id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, data varchar(30) NOT NULL, status tinyint(1) NOT NULL,   PRIMARY KEY (id)) Engine=MyISAM;
33CREATE TABLE t3 (id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, t1id mediumint(8) unsigned NOT NULL, flag tinyint(1) NOT NULL DEFAULT 0, status tinyint(1) NOT NULL DEFAULT 0,  PRIMARY KEY (id)) Engine=MyISAM;
34
35INSERT INTO t1 ( id, someLabel, flag ) VALUES ( 1, 'ABC', 0 );
36
37DELIMITER |;
38
39CREATE OR REPLACE TRIGGER doNothing
40BEFORE UPDATE ON t1
41FOR EACH ROW
42 BEGIN
43     IF
44         new.someLabel != old.someLabel
45     THEN
46         UPDATE t3 SET t3.flag = 0;
47     END IF;
48 END|
49
50DELIMITER ;|
51
52FLUSH LOGS;
53
54LOCK TABLES   t1 WRITE,  t2 WRITE;
55INSERT INTO t2 (data, status) VALUES ('1', 4);
56UPDATE t1 SET flag = 1 WHERE id = 1;
57INSERT INTO t2 (data, status) VALUES ('2', 4);
58UNLOCK TABLES;
59
60sync_slave_with_master;
61
62let $diff_tables= master:t1, slave:t1;
63--source include/diff_tables.inc
64let $diff_tables= master:t2, slave:t2;
65--source include/diff_tables.inc
66let $diff_tables= master:t3, slave:t3;
67--source include/diff_tables.inc
68
69--connection master
70DROP TABLE t1, t2, t3;
71
72--source include/rpl_end.inc
73