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