Bug #86485 InnoDB: tried to purge non-delete-marked record
Description:
affects debug/release builds of 5.7, 8.0.
Debug build asserts. Release build prints out:
InnoDB: tried to purge non-delete-marked record in index `c` of table
InnoDB: tried to purge non-delete-marked record in index `c` of table
Version: '5.7.19-debug' (Built on 2017/05/25)
[ERROR] InnoDB: tried to purge non-delete-marked record in index `c` of
InnoDB: Assertion failure in thread 8344 in file row0purge.cc line 499
InnoDB: Failing assertion: 0
mysqld-debug.exe!my_sigabrt_handler()[my_thr_init.c:449]
ucrtbased.dll!raise()
ucrtbased.dll!abort()
mysqld-debug.exe!ut_dbg_assertion_failed()[ut0dbg.cc:68]
mysqld-debug.exe!row_purge_remove_sec_if_poss_leaf()[row0purge.cc:499]
mysqld-debug.exe!row_purge_remove_sec_if_poss()[row0purge.cc:588]
mysqld-debug.exe!row_purge_del_mark()[row0purge.cc:659]
mysqld-debug.exe!row_purge_record_func()[row0purge.cc:990]
mysqld-debug.exe!row_purge()[row0purge.cc:1046]
mysqld-debug.exe!row_purge_step()[row0purge.cc:1127]
mysqld-debug.exe!que_thr_step()[que0que.cc:1056]
mysqld-debug.exe!que_run_threads_low()[que0que.cc:1118]
mysqld-debug.exe!que_run_threads()[que0que.cc:1160]
mysqld-debug.exe!srv_task_execute()[srv0srv.cc:2464]
mysqld-debug.exe!srv_worker_thread()[srv0srv.cc:2512]
How to repeat:
set sql_mode="";
drop table if exists t;
create table t (
`a` int,
`b` int not null,
`c` char(2) generated always as ('aa') virtual,
unique key(`b`),
unique key(`c`(1))
) engine=innodb default charset=utf8 row_format=compact;
drop procedure if exists p;
delimiter $
create procedure p()
begin
declare continue handler for sqlexception begin end;
repeat
if rand()>0.5 then insert into t(a,b) values(floor(rand()*10),floor(rand()*10)); end if;
if rand()>0.5 then delete from t where a<floor(rand()*10); end if;
if rand()>0.5 then update t set b=concat(a,a); end if;
if rand()>0.5 then replace into t(a,b) values(floor(rand()*10),floor(rand()*10)); end if;
until 1=2 end repeat;
end $
delimiter ;
call p();
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.050 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: affects debug/release builds of 5.7, 8.0. Debug build asserts. Release build prints out: InnoDB: tried to purge non-delete-marked record in index `c` of table InnoDB: tried to purge non-delete-marked record in index `c` of table Version: '5.7.19-debug' (Built on 2017/05/25) [ERROR] InnoDB: tried to purge non-delete-marked record in index `c` of InnoDB: Assertion failure in thread 8344 in file row0purge.cc line 499 InnoDB: Failing assertion: 0 mysqld-debug.exe!my_sigabrt_handler()[my_thr_init.c:449] ucrtbased.dll!raise() ucrtbased.dll!abort() mysqld-debug.exe!ut_dbg_assertion_failed()[ut0dbg.cc:68] mysqld-debug.exe!row_purge_remove_sec_if_poss_leaf()[row0purge.cc:499] mysqld-debug.exe!row_purge_remove_sec_if_poss()[row0purge.cc:588] mysqld-debug.exe!row_purge_del_mark()[row0purge.cc:659] mysqld-debug.exe!row_purge_record_func()[row0purge.cc:990] mysqld-debug.exe!row_purge()[row0purge.cc:1046] mysqld-debug.exe!row_purge_step()[row0purge.cc:1127] mysqld-debug.exe!que_thr_step()[que0que.cc:1056] mysqld-debug.exe!que_run_threads_low()[que0que.cc:1118] mysqld-debug.exe!que_run_threads()[que0que.cc:1160] mysqld-debug.exe!srv_task_execute()[srv0srv.cc:2464] mysqld-debug.exe!srv_worker_thread()[srv0srv.cc:2512] How to repeat: set sql_mode=""; drop table if exists t; create table t ( `a` int, `b` int not null, `c` char(2) generated always as ('aa') virtual, unique key(`b`), unique key(`c`(1)) ) engine=innodb default charset=utf8 row_format=compact; drop procedure if exists p; delimiter $ create procedure p() begin declare continue handler for sqlexception begin end; repeat if rand()>0.5 then insert into t(a,b) values(floor(rand()*10),floor(rand()*10)); end if; if rand()>0.5 then delete from t where a<floor(rand()*10); end if; if rand()>0.5 then update t set b=concat(a,a); end if; if rand()>0.5 then replace into t(a,b) values(floor(rand()*10),floor(rand()*10)); end if; until 1=2 end repeat; end $ delimiter ; call p();