polardbxengine/mysql-test/suite/xengine/t/rpl_row_triggers.test

264 lines
7.4 KiB
Plaintext

-- source include/have_binlog_format_row.inc
-- source suite/xengine/include/have_rbr_triggers.inc
-- source suite/xengine/include/have_xengine.inc
-- source include/master-slave.inc
-- echo # Test of row replication with triggers on the slave side
connection master;
CREATE TABLE t1 (C1 CHAR(1) primary key, C2 CHAR(1));
SELECT * FROM t1;
sync_slave_with_master;
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= YES;
SELECT * FROM t1;
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_db before delete on t1 for each row
update t2 set cnt=cnt+1, o=old.C1, n=' ' where id = 'd0';
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;
connection master;
--echo # INSERT triggers test
insert into t1 values ('a','b');
sync_slave_with_master;
connection slave;
SELECT * FROM t2 order by id;
connection master;
--echo # UPDATE triggers test
update t1 set C1= 'd';
sync_slave_with_master;
connection slave;
SELECT * FROM t2 order by id;
connection master;
--echo # DELETE triggers test
delete from t1 where C1='d';
sync_slave_with_master;
connection slave;
SELECT * FROM t2 order by id;
--echo # INSERT triggers which cause also UPDATE test (insert duplicate row)
insert into t1 values ('0','1');
SELECT * FROM t2 order by id;
connection master;
insert into t1 values ('0','1');
sync_slave_with_master;
connection slave;
SELECT * FROM t2 order by id;
--echo # INSERT triggers which cause also DELETE test
--echo # (insert duplicate row in table referenced by foreign key)
insert into t1 values ('1','1');
connection master;
# Foreign key is not supported in MyX
#CREATE TABLE t3 (C1 CHAR(1) primary key, FOREIGN KEY (C1) REFERENCES t1(C1) );
#insert into t1 values ('1','1');
#sync_slave_with_master;
#connection slave;
#SELECT * FROM t2 order by id;
#connection master;
#drop table t3,t1;
drop table if exists t1;
sync_slave_with_master;
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;
--connection master
CREATE TABLE t1 (i INT);
CREATE TABLE t2 (i INT);
--sync_slave_with_master
SET @old_slave_run_triggers_for_rbr= @@global.slave_run_triggers_for_rbr;
SET GLOBAL slave_run_triggers_for_rbr=YES;
CREATE TRIGGER tr AFTER INSERT ON t1 FOR EACH ROW
INSERT INTO t2 VALUES (new.i);
--connection master
BEGIN;
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2);
COMMIT;
--sync_slave_with_master
select * from t2;
SET @@global.slave_run_triggers_for_rbr= @old_slave_run_triggers_for_rbr;
--connection master
drop tables t2,t1;
--sync_slave_with_master
-- echo # Triggers on slave do not work if master has some
connection master;
CREATE TABLE t1 (C1 CHAR(1) primary key, C2 CHAR(1));
SELECT * FROM t1;
create trigger t1_dummy before delete on t1 for each row
set @dummy= 1;
sync_slave_with_master;
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= YES;
SELECT * FROM t1;
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;
connection master;
--echo # INSERT triggers test
insert into t1 values ('a','b');
sync_slave_with_master;
connection slave;
SELECT * FROM t2 order by id;
connection master;
--echo # UPDATE triggers test
update t1 set C1= 'd';
sync_slave_with_master;
connection slave;
SELECT * FROM t2 order by id;
connection master;
--echo # DELETE triggers test
delete from t1 where C1='d';
sync_slave_with_master;
connection slave;
SELECT * FROM t2 order by id;
--echo # INSERT triggers which cause also UPDATE test (insert duplicate row)
insert into t1 values ('0','1');
SELECT * FROM t2 order by id;
connection master;
insert into t1 values ('0','1');
sync_slave_with_master;
connection slave;
SELECT * FROM t2 order by id;
--echo # INSERT triggers which cause also DELETE test
--echo # (insert duplicate row in table referenced by foreign key)
insert into t1 values ('1','1');
connection master;
# Foreign Key is not supported in MyX
#CREATE TABLE t3 (C1 CHAR(1) primary key, FOREIGN KEY (C1) REFERENCES t1(C1) );
#insert into t1 values ('1','1');
#sync_slave_with_master;
#connection slave;
#SELECT * FROM t2 order by id;
#connection master;
#drop table t3,t1;
drop table if exists t1;
sync_slave_with_master;
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;
--echo #
--echo # MDEV-5513: Trigger is applied to the rows after first one
--echo #
--connection master
create table t1 (a int, b int);
create table tlog (a int auto_increment primary key);
set sql_log_bin=0;
create trigger tr1 after insert on t1 for each row insert into tlog values (null);
set sql_log_bin=1;
sync_slave_with_master;
--connection slave
set @slave_run_triggers_for_rbr.saved = @@slave_run_triggers_for_rbr;
set global slave_run_triggers_for_rbr=1;
create trigger tr2 before insert on t1 for each row set new.b = new.a;
--connection master
insert into t1 values (1,10),(2,20),(3,30);
--sync_slave_with_master
select * from t1;
--echo #
--echo # Verify slave skips running triggers if master ran and logged the row events for triggers
--echo #
--connection master
create table t4(a int, b int);
delete from tlog;
create trigger tr4 before insert on t4 for each row insert into tlog values (null);
insert into t4 values (1, 10),(2, 20);
select * from tlog;
--sync_slave_with_master
select * from t4;
select * from tlog;
# Cleanup
set global slave_run_triggers_for_rbr = @slave_run_triggers_for_rbr.saved;
--connection master
drop table t1, tlog, t4;
sync_slave_with_master;
--source include/rpl_end.inc
--source suite/xengine/include/check_xengine_log_error.inc