1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MDEV-8203 Assert in Query_log_event::do_apply_event()

This happens because the master writes a table_map event to the binary log, but no row event.
The slave has a check that there should always be a row event if there was a table_map event, which
causes a crash.

Fixed by remembering in the cache what kind of events are logged
and ignore cached statements which is just a table map event.
This commit is contained in:
Monty
2017-04-07 10:19:10 +03:00
committed by Alexander Barkov
parent ed305c0fd5
commit 546e7aa96f
8 changed files with 209 additions and 28 deletions

View File

@@ -0,0 +1,44 @@
include/master-slave.inc
[connection master]
create or replace table t1(id int)engine=innodb;
create or replace table t3(id int)engine=myisam;
create or replace function t99 (a int)
returns int(10)
MODIFIES SQL DATA
begin
if (a > 100)
then
insert into t3 values (a);
end if;
return a;
end//
begin;
insert into t1 values(t99(1));
insert into t1 values(t99(101));
commit;
select * from t1;
id
1
101
select * from t3;
id
101
insert into t1 values(t99(1));
drop function t99;
drop table t1,t3;
connection slave;
connection master;
CREATE TABLE t1 (i INT) ENGINE=InnoDB;
CREATE TABLE t2 (j INT) ENGINE=MyISAM;
CREATE TRIGGER tr AFTER INSERT ON t1 FOR EACH ROW
BEGIN
SET @a = unknown_column_just_to_raise_an_error;
INSERT INTO t2 VALUES (NULL) ;
END||
INSERT INTO t1 VALUES (1);
ERROR 42S22: Unknown column 'unknown_column_just_to_raise_an_error' in 'field list'
connection slave;
connection master;
drop trigger tr;
drop table t1,t2;
include/rpl_end.inc

View File

@@ -0,0 +1,72 @@
#
# Test mixing transactional and non transactional tables
#
--source include/master-slave.inc
--source include/have_innodb.inc
--source include/have_binlog_format_row.inc
#
# Test updating conditionally a non transactinal table in a function
# This verifies that we don't write only a table map for a non transactional,
# without any row events
# The original bug caused a crash on the slave when doing a sync_slave
#
create or replace table t1(id int)engine=innodb;
create or replace table t3(id int)engine=myisam;
delimiter //;
create or replace function t99 (a int)
returns int(10)
MODIFIES SQL DATA
begin
if (a > 100)
then
insert into t3 values (a);
end if;
return a;
end//
delimiter ;//
begin;
insert into t1 values(t99(1));
insert into t1 values(t99(101));
commit;
select * from t1;
select * from t3;
insert into t1 values(t99(1));
drop function t99;
drop table t1,t3;
sync_slave_with_master;
connection master;
#
# MDEV-8203
# Assertion `!current_stmt_is_commit || !rgi->tables_to_lock' failed in
# Query_log_event::do_apply_event(rpl_group_info*, const char*, uint32)
#
CREATE TABLE t1 (i INT) ENGINE=InnoDB;
CREATE TABLE t2 (j INT) ENGINE=MyISAM;
--delimiter ||
CREATE TRIGGER tr AFTER INSERT ON t1 FOR EACH ROW
BEGIN
SET @a = unknown_column_just_to_raise_an_error;
INSERT INTO t2 VALUES (NULL) ;
END||
--delimiter ;
--error ER_BAD_FIELD_ERROR
INSERT INTO t1 VALUES (1);
--sync_slave_with_master
connection master;
drop trigger tr;
drop table t1,t2;
# End of 4.1 tests
--source include/rpl_end.inc