1
0
mirror of https://github.com/MariaDB/server.git synced 2025-05-28 13:01:41 +03:00
mariadb/mysql-test/extra/rpl_tests/rpl_autoinc_func_invokes_trigger.test
5903c1e94c Bug #45677 Slave stops with Duplicate entry for key PRIMARY when using trigger
The problem is that there is only one autoinc value associated with 
the query when binlogging. If more than one autoinc values are used 
in the query, the autoinc values after the first one can be inserted 
wrongly on slave. So these autoinc values can become inconsistent on 
master and slave.

The problem is resolved by marking all the statements that invoke 
a trigger or call a function that updated autoinc fields as unsafe, 
and will switch to row-format in Mixed mode. Actually, the statement 
is safe if just one autoinc value is used in sub-statement, but it's 
impossible to check how many autoinc values are used in sub-statement.)
2009-10-01 07:19:36 +08:00

58 lines
1.8 KiB
Plaintext

#
# This test verifies if concurrent transactions that call a
# function which invokes a 'after/before insert action' trigger
# that inserts more than one values into a table with autoinc
# column will make the autoinc values become inconsistent on
# master and slave.
#
connection master;
create table t1(a int) engine=innodb;
create table t2(i1 int not null auto_increment, a int, primary key(i1)) engine=innodb;
create table t3(i1 int not null auto_increment, a int, primary key(i1)) engine=innodb;
delimiter |;
CREATE FUNCTION f1_two_inserts_trigger() RETURNS INTEGER
BEGIN
INSERT INTO t2(a) values(2),(3);
INSERT INTO t2(a) values(2),(3);
RETURN 1;
END |
eval create trigger tr11 $insert_action on t2 for each row begin
insert into t3(a) values(new.a);
insert into t3(a) values(new.a);
end |
delimiter ;|
begin;
let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
insert into t1(a) values(f1_two_inserts_trigger());
connection master1;
#The default autocommit is set to 1, so the statement is auto committed
insert into t2(a) values(4),(5);
connection master;
commit;
insert into t1(a) values(f1_two_inserts_trigger());
--echo # To verify if insert/update in an autoinc column causes statement to be logged in row format
source include/show_binlog_events.inc;
commit;
connection master;
sync_slave_with_master;
--echo #Test if the results are consistent on master and slave
--echo #for 'CALLS A FUNCTION which INVOKES A TRIGGER with $insert_action action'
let $diff_table_1=master:test.t2;
let $diff_table_2=slave:test.t2;
source include/diff_tables.inc;
let $diff_table_1=master:test.t3;
let $diff_table_2=slave:test.t3;
source include/diff_tables.inc;
connection master;
drop table t1;
drop table t2;
drop table t3;
drop function f1_two_inserts_trigger;
sync_slave_with_master;