1-- source include/have_binlog_format_row.inc 2-- source include/have_innodb.inc 3-- source include/master-slave.inc 4 5-- echo # Test of row replication with triggers on the slave side 6 7connection master; 8CREATE TABLE t1 (C1 CHAR(1) primary key, C2 CHAR(1)) engine=innodb; 9SELECT * FROM t1; 10 11sync_slave_with_master; 12 13connection slave; 14SET @old_slave_exec_mode= @@global.slave_exec_mode; 15SET @old_slave_run_triggers_for_rbr= @@global.slave_run_triggers_for_rbr; 16SET @@global.slave_exec_mode= IDEMPOTENT; 17SET @@global.slave_run_triggers_for_rbr= YES; 18SELECT * FROM t1; 19create table t2 (id char(2) primary key, cnt int, o char(1), n char(1)); 20insert into t2 values 21 ('u0', 0, ' ', ' '),('u1', 0, ' ', ' '), 22 ('d0', 0, ' ', ' '),('d1', 0, ' ', ' '), 23 ('i0', 0, ' ', ' '),('i1', 0, ' ', ' '); 24create trigger t1_cnt_b before update on t1 for each row 25 update t2 set cnt=cnt+1, o=old.C1, n=new.C1 where id = 'u0'; 26create trigger t1_cnt_db before delete on t1 for each row 27 update t2 set cnt=cnt+1, o=old.C1, n=' ' where id = 'd0'; 28create trigger t1_cnt_ib before insert on t1 for each row 29 update t2 set cnt=cnt+1, n=new.C1, o=' ' where id = 'i0'; 30create trigger t1_cnt_a after update on t1 for each row 31 update t2 set cnt=cnt+1, o=old.C1, n=new.C1 where id = 'u1'; 32create trigger t1_cnt_da after delete on t1 for each row 33 update t2 set cnt=cnt+1, o=old.C1, n=' ' where id = 'd1'; 34create trigger t1_cnt_ia after insert on t1 for each row 35 update t2 set cnt=cnt+1, n=new.C1, o=' ' where id = 'i1'; 36SELECT * FROM t2 order by id; 37 38connection master; 39--echo # INSERT triggers test 40insert into t1 values ('a','b'); 41 42sync_slave_with_master; 43 44connection slave; 45SELECT * FROM t2 order by id; 46 47connection master; 48 49--echo # UPDATE triggers test 50update t1 set C1= 'd'; 51 52sync_slave_with_master; 53 54connection slave; 55SELECT * FROM t2 order by id; 56 57connection master; 58--echo # DELETE triggers test 59delete from t1 where C1='d'; 60 61sync_slave_with_master; 62 63connection slave; 64SELECT * FROM t2 order by id; 65 66--echo # INSERT triggers causing DELETE + INSERT (on unique key conflict) 67insert into t1 values ('0','1'); 68 69SELECT * FROM t2 order by id; 70 71connection master; 72 73insert into t1 values ('0','1'); 74 75sync_slave_with_master; 76 77connection slave; 78SELECT * FROM t2 order by id; 79 80 81--echo # INSERT triggers which cause also DELETE test 82--echo # (insert duplicate row in table referenced by foreign key) 83insert into t1 values ('1','1'); 84 85connection master; 86 87CREATE TABLE t3 (C1 CHAR(1) primary key, FOREIGN KEY (C1) REFERENCES t1(C1) ) engine=innodb; 88 89insert into t1 values ('1','1'); 90 91sync_slave_with_master; 92 93connection slave; 94SELECT * FROM t2 order by id; 95 96connection master; 97 98drop table t3,t1; 99 100sync_slave_with_master; 101 102connection slave; 103SET @@global.slave_exec_mode= @old_slave_exec_mode; 104SET @@global.slave_run_triggers_for_rbr= @old_slave_run_triggers_for_rbr; 105drop table t2; 106 107--connection master 108 109CREATE TABLE t1 (i INT) ENGINE=InnoDB; 110CREATE TABLE t2 (i INT) ENGINE=InnoDB; 111 112--sync_slave_with_master 113 114SET @old_slave_run_triggers_for_rbr= @@global.slave_run_triggers_for_rbr; 115SET GLOBAL slave_run_triggers_for_rbr=YES; 116 117CREATE TRIGGER tr AFTER INSERT ON t1 FOR EACH ROW 118 INSERT INTO t2 VALUES (new.i); 119 120--connection master 121 122BEGIN; 123INSERT INTO t1 VALUES (1); 124INSERT INTO t1 VALUES (2); 125COMMIT; 126 127--sync_slave_with_master 128select * from t2; 129SET @@global.slave_run_triggers_for_rbr= @old_slave_run_triggers_for_rbr; 130 131--connection master 132drop tables t2,t1; 133 134--sync_slave_with_master 135 136-- echo # Triggers on slave do not work if master has some 137 138connection master; 139CREATE TABLE t1 (C1 CHAR(1) primary key, C2 CHAR(1)) engine=innodb; 140SELECT * FROM t1; 141 142create trigger t1_dummy before delete on t1 for each row 143 set @dummy= 1; 144 145sync_slave_with_master; 146 147connection slave; 148SET @old_slave_exec_mode= @@global.slave_exec_mode; 149SET @old_slave_run_triggers_for_rbr= @@global.slave_run_triggers_for_rbr; 150SET @@global.slave_exec_mode= IDEMPOTENT; 151SET @@global.slave_run_triggers_for_rbr= YES; 152SELECT * FROM t1; 153create table t2 (id char(2) primary key, cnt int, o char(1), n char(1)); 154insert into t2 values 155 ('u0', 0, ' ', ' '),('u1', 0, ' ', ' '), 156 ('d0', 0, ' ', ' '),('d1', 0, ' ', ' '), 157 ('i0', 0, ' ', ' '),('i1', 0, ' ', ' '); 158create trigger t1_cnt_b before update on t1 for each row 159 update t2 set cnt=cnt+1, o=old.C1, n=new.C1 where id = 'u0'; 160create trigger t1_cnt_ib before insert on t1 for each row 161 update t2 set cnt=cnt+1, n=new.C1, o=' ' where id = 'i0'; 162create trigger t1_cnt_a after update on t1 for each row 163 update t2 set cnt=cnt+1, o=old.C1, n=new.C1 where id = 'u1'; 164create trigger t1_cnt_da after delete on t1 for each row 165 update t2 set cnt=cnt+1, o=old.C1, n=' ' where id = 'd1'; 166create trigger t1_cnt_ia after insert on t1 for each row 167 update t2 set cnt=cnt+1, n=new.C1, o=' ' where id = 'i1'; 168SELECT * FROM t2 order by id; 169 170connection master; 171--echo # INSERT triggers test 172insert into t1 values ('a','b'); 173 174sync_slave_with_master; 175 176connection slave; 177SELECT * FROM t2 order by id; 178 179connection master; 180 181--echo # UPDATE triggers test 182update t1 set C1= 'd'; 183 184sync_slave_with_master; 185 186connection slave; 187SELECT * FROM t2 order by id; 188 189connection master; 190--echo # DELETE triggers test 191delete from t1 where C1='d'; 192 193sync_slave_with_master; 194 195connection slave; 196SELECT * FROM t2 order by id; 197 198--echo # INSERT triggers which cause also UPDATE test (insert duplicate row) 199insert into t1 values ('0','1'); 200 201SELECT * FROM t2 order by id; 202 203connection master; 204 205insert into t1 values ('0','1'); 206 207sync_slave_with_master; 208 209connection slave; 210SELECT * FROM t2 order by id; 211 212 213--echo # INSERT triggers which cause also DELETE test 214--echo # (insert duplicate row in table referenced by foreign key) 215insert into t1 values ('1','1'); 216 217connection master; 218 219CREATE TABLE t3 (C1 CHAR(1) primary key, FOREIGN KEY (C1) REFERENCES t1(C1) ) engine=innodb; 220 221insert into t1 values ('1','1'); 222 223sync_slave_with_master; 224 225connection slave; 226SELECT * FROM t2 order by id; 227 228connection master; 229 230drop table t3,t1; 231 232sync_slave_with_master; 233 234connection slave; 235SET @@global.slave_exec_mode= @old_slave_exec_mode; 236SET @@global.slave_run_triggers_for_rbr= @old_slave_run_triggers_for_rbr; 237drop table t2; 238 239--echo # 240--echo # MDEV-5513: Trigger is applied to the rows after first one 241--echo # 242 243--connection master 244 245create table t1 (a int, b int); 246create table tlog (a int); 247 248set sql_log_bin=0; 249create trigger tr1 after insert on t1 for each row insert into tlog values (1); 250set sql_log_bin=1; 251 252sync_slave_with_master; 253--connection slave 254 255set @slave_run_triggers_for_rbr.saved = @@slave_run_triggers_for_rbr; 256set global slave_run_triggers_for_rbr=1; 257create trigger tr2 before insert on t1 for each row set new.b = new.a; 258 259--connection master 260 261insert into t1 values (1,10),(2,20),(3,30); 262 263--sync_slave_with_master 264 265select * from t1; 266 267# Cleanup 268 269set global slave_run_triggers_for_rbr = @slave_run_triggers_for_rbr.saved; 270 271--connection master 272 273drop table t1, tlog; 274 275sync_slave_with_master; 276 277 278--echo # 279--echo # MDEV-8411 Assertion `is_stat_field || !table || (!table->write_set || 280--echo # bitmap_is_set(table->write_set, field_index) || 281--echo # bitmap_is_set(table->vcol_set, field_index))' 282--echo # failed in Field_timestamp::store_TIME_with_warning 283--echo # 284--echo # 285--echo # Create table on master, replicate it on slave. 286--echo # 287--connection master 288set @binlog_row_image.saved = @@binlog_row_image; 289set binlog_row_image = MINIMAL; 290create table t1 (pk int primary key, f int); 291 292--sync_slave_with_master 293--echo # 294--echo # Create a trigger on the slave. 295--echo # 296create trigger tr before update on t1 for each row set new.f = 1000; 297set @old_slave_run_triggers_for_rbr = @@global.slave_run_triggers_for_rbr; 298set global slave_run_triggers_for_rbr = YES; 299 300--connection master 301--echo # 302--echo # Update the table to have the trigger fire on the slave., 303--echo # 304insert into t1 values (1,1),(2,2); 305update t1 set pk=pk+10; 306select * from t1; 307 308--sync_slave_with_master 309--echo # 310--echo # Check to see if slave has the table updated. 311--echo # 312select * from t1; 313 314--echo # 315--echo # Cleanup 316--echo # 317 318set global slave_run_triggers_for_rbr = @old_slave_run_triggers_for_rbr; 319 320--connection master 321set binlog_row_image = @binlog_row_image.saved; 322drop table t1; 323 324--sync_slave_with_master 325 326--source include/rpl_end.inc 327