From bd1d152d05ba75bd1bdd2d9bc0358d8508df307a Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Tue, 8 May 2018 19:27:08 +0530 Subject: [PATCH] MDEV-16106 Record in index was not found on rollback, trying to insert: TUPLE During rollback of temporary table logs, secondary index should delete mark the index entry instead of removing it completely. --- mysql-test/suite/innodb/r/temporary_table.result | 12 ++++++++++++ mysql-test/suite/innodb/t/temporary_table.test | 11 +++++++++++ storage/innobase/row/row0umod.cc | 12 ++++-------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/mysql-test/suite/innodb/r/temporary_table.result b/mysql-test/suite/innodb/r/temporary_table.result index 310741b5798..64eb3270934 100644 --- a/mysql-test/suite/innodb/r/temporary_table.result +++ b/mysql-test/suite/innodb/r/temporary_table.result @@ -638,3 +638,15 @@ t1 CREATE TEMPORARY TABLE `t1` ( `j` int(11) DEFAULT NULL, PRIMARY KEY (`i`) KEY_BLOCK_SIZE=8 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC +DROP TABLE t1; +CREATE TEMPORARY TABLE t1(f1 INT, KEY(f1)) ENGINE=InnoDB; +INSERT INTO t1 VALUES(NULL); +UPDATE t1 SET f1 = 0; +START TRANSACTION; +UPDATE t1 SET f1 = 4; +UPDATE t1 SET f1 = 0; +ROLLBACK; +SELECT * FROM t1; +f1 +0 +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/temporary_table.test b/mysql-test/suite/innodb/t/temporary_table.test index 4184daaf064..9a640657c4d 100644 --- a/mysql-test/suite/innodb/t/temporary_table.test +++ b/mysql-test/suite/innodb/t/temporary_table.test @@ -464,3 +464,14 @@ ALTER TABLE t1 ROW_FORMAT = DYNAMIC; set innodb_strict_mode = ON; ALTER TABLE t1 ADD COLUMN j INT; SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TEMPORARY TABLE t1(f1 INT, KEY(f1)) ENGINE=InnoDB; +INSERT INTO t1 VALUES(NULL); +UPDATE t1 SET f1 = 0; +START TRANSACTION; +UPDATE t1 SET f1 = 4; +UPDATE t1 SET f1 = 0; +ROLLBACK; +SELECT * FROM t1; +DROP TABLE t1; diff --git a/storage/innobase/row/row0umod.cc b/storage/innobase/row/row0umod.cc index b30194f3562..6fc72f806e0 100644 --- a/storage/innobase/row/row0umod.cc +++ b/storage/innobase/row/row0umod.cc @@ -428,7 +428,6 @@ row_undo_mod_del_mark_or_remove_sec_low( btr_pcur_t pcur; btr_cur_t* btr_cur; ibool success; - ibool old_has = FALSE; dberr_t err = DB_SUCCESS; mtr_t mtr; mtr_t mtr_vers; @@ -507,13 +506,10 @@ row_undo_mod_del_mark_or_remove_sec_low( /* For temporary table, we can skip to check older version of clustered index entry. Because the purge won't process any no-redo rollback segment undo logs. */ - if (!dict_table_is_temporary(node->table)) { - old_has = row_vers_old_has_index_entry( - FALSE, btr_pcur_get_rec(&(node->pcur)), - &mtr_vers, index, entry, 0, 0); - } - - if (old_has) { + if (dict_table_is_temporary(node->table) + || row_vers_old_has_index_entry( + FALSE, btr_pcur_get_rec(&(node->pcur)), + &mtr_vers, index, entry, 0, 0)) { err = btr_cur_del_mark_set_sec_rec(BTR_NO_LOCKING_FLAG, btr_cur, TRUE, thr, &mtr); ut_ad(err == DB_SUCCESS);