1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

MDEV-21833 Make slave_run_triggers_for_rbr enforce triggers to run on slave, even when there are triggers on the master

A bit changed patch of Anders Karlsson with examples added.

New parameters "ENFORCE" to slave-run-triggers-for-rbr added.
This commit is contained in:
Oleksandr Byelkin
2020-02-03 16:02:05 +01:00
committed by Andrei Elkin
parent 1f5a8e1f77
commit 980108ceeb
8 changed files with 278 additions and 23 deletions

View File

@@ -338,4 +338,136 @@ connection master;
set binlog_row_image = @binlog_row_image.saved;
drop table t1;
connection slave;
#
# enterprise 10.4 tests start
#
#
# MENT-607 : Make slave_run_triggers_for_rbr enforce triggers to run
# on slave, even when there are triggers on the master
#
# Triggers on slave WILL work (with ENFORCE) if master has some
connection master;
CREATE TABLE t1 (C1 CHAR(1) primary key, C2 CHAR(1)) engine=innodb;
SELECT * FROM t1;
C1 C2
create trigger t1_dummy before delete on t1 for each row
set @dummy= 1;
connection slave;
connection slave;
SET @old_slave_exec_mode= @@global.slave_exec_mode;
SET @old_slave_run_triggers_for_rbr= @@global.slave_run_triggers_for_rbr;
SET @@global.slave_exec_mode= IDEMPOTENT;
SET @@global.slave_run_triggers_for_rbr= ENFORCE;
SELECT * FROM t1;
C1 C2
create table t2 (id char(2) primary key, cnt int, o char(1), n char(1));
insert into t2 values
('u0', 0, ' ', ' '),('u1', 0, ' ', ' '),
('d0', 0, ' ', ' '),('d1', 0, ' ', ' '),
('i0', 0, ' ', ' '),('i1', 0, ' ', ' ');
create trigger t1_cnt_b before update on t1 for each row
update t2 set cnt=cnt+1, o=old.C1, n=new.C1 where id = 'u0';
create trigger t1_cnt_ib before insert on t1 for each row
update t2 set cnt=cnt+1, n=new.C1, o=' ' where id = 'i0';
create trigger t1_cnt_a after update on t1 for each row
update t2 set cnt=cnt+1, o=old.C1, n=new.C1 where id = 'u1';
create trigger t1_cnt_da after delete on t1 for each row
update t2 set cnt=cnt+1, o=old.C1, n=' ' where id = 'd1';
create trigger t1_cnt_ia after insert on t1 for each row
update t2 set cnt=cnt+1, n=new.C1, o=' ' where id = 'i1';
SELECT * FROM t2 order by id;
id cnt o n
d0 0
d1 0
i0 0
i1 0
u0 0
u1 0
connection master;
# INSERT triggers test
insert into t1 values ('a','b');
connection slave;
connection slave;
SELECT * FROM t2 order by id;
id cnt o n
d0 0
d1 0
i0 1 a
i1 1 a
u0 0
u1 0
connection master;
# UPDATE triggers test
update t1 set C1= 'd';
connection slave;
connection slave;
SELECT * FROM t2 order by id;
id cnt o n
d0 0
d1 0
i0 1 a
i1 1 a
u0 1 a d
u1 1 a d
connection master;
# DELETE triggers test
delete from t1 where C1='d';
connection slave;
connection slave;
SELECT * FROM t2 order by id;
id cnt o n
d0 0
d1 1 d
i0 1 a
i1 1 a
u0 1 a d
u1 1 a d
# INSERT triggers which cause also UPDATE test (insert duplicate row)
insert into t1 values ('0','1');
SELECT * FROM t2 order by id;
id cnt o n
d0 0
d1 1 d
i0 2 0
i1 2 0
u0 1 a d
u1 1 a d
connection master;
insert into t1 values ('0','1');
connection slave;
connection slave;
SELECT * FROM t2 order by id;
id cnt o n
d0 0
d1 2 0
i0 3 0
i1 3 0
u0 1 a d
u1 1 a d
# INSERT triggers which cause also DELETE test
# (insert duplicate row in table referenced by foreign key)
insert into t1 values ('1','1');
connection master;
CREATE TABLE t3 (C1 CHAR(1) primary key, FOREIGN KEY (C1) REFERENCES t1(C1) ) engine=innodb;
insert into t1 values ('1','1');
connection slave;
connection slave;
SELECT * FROM t2 order by id;
id cnt o n
d0 0
d1 3 1
i0 5 1
i1 5 1
u0 1 a d
u1 1 a d
connection master;
drop table t3,t1;
connection slave;
connection slave;
SET @@global.slave_exec_mode= @old_slave_exec_mode;
SET @@global.slave_run_triggers_for_rbr= @old_slave_run_triggers_for_rbr;
drop table t2;
#
# enterprise 10.4 tests end
#
include/rpl_end.inc