From c82f3f1b041b877ac0a149e594756a61d1f6ef48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 14 Nov 2022 13:08:00 +0200 Subject: [PATCH] MDEV-29978 Corruption errors upon CHECK on temporary InnoDB table row_check_index(): Treat secondary indexes of temporary tables as if SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED is in effect. That is, only consider the delete-mark and nothing else. --- .../suite/innodb/r/temporary_table.result | 12 ++++++++++++ .../suite/innodb/t/temporary_table.test | 11 +++++++++++ storage/innobase/row/row0sel.cc | 19 +++++++++---------- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/mysql-test/suite/innodb/r/temporary_table.result b/mysql-test/suite/innodb/r/temporary_table.result index a8a073cb257..ffcee726f0d 100644 --- a/mysql-test/suite/innodb/r/temporary_table.result +++ b/mysql-test/suite/innodb/r/temporary_table.result @@ -789,4 +789,16 @@ CHECK TABLE t EXTENDED; Table Op Msg_type Msg_text test.t check status OK DROP TEMPORARY TABLE t; +# +# MDEV-29978 Corruption errors upon CHECK on temporary InnoDB table +# +CREATE TEMPORARY TABLE t (f INT UNIQUE) ENGINE=InnoDB; +INSERT INTO t (f) VALUES (1),(2); +CHECK TABLE t; +Table Op Msg_type Msg_text +test.t check status OK +CHECK TABLE t EXTENDED; +Table Op Msg_type Msg_text +test.t check status OK +DROP TEMPORARY TABLE t; # End of 10.6 tests diff --git a/mysql-test/suite/innodb/t/temporary_table.test b/mysql-test/suite/innodb/t/temporary_table.test index 0cc3b29feb1..5d7e5d51696 100644 --- a/mysql-test/suite/innodb/t/temporary_table.test +++ b/mysql-test/suite/innodb/t/temporary_table.test @@ -624,4 +624,15 @@ UPDATE t SET a=2; CHECK TABLE t; CHECK TABLE t EXTENDED; DROP TEMPORARY TABLE t; + +--echo # +--echo # MDEV-29978 Corruption errors upon CHECK on temporary InnoDB table +--echo # + +CREATE TEMPORARY TABLE t (f INT UNIQUE) ENGINE=InnoDB; +INSERT INTO t (f) VALUES (1),(2); +CHECK TABLE t; +CHECK TABLE t EXTENDED; +DROP TEMPORARY TABLE t; + --echo # End of 10.6 tests diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc index 82079cbd06b..f65b47c0af8 100644 --- a/storage/innobase/row/row0sel.cc +++ b/storage/innobase/row/row0sel.cc @@ -6300,14 +6300,16 @@ rec_loop: goto next_rec; } - if (index->is_clust()) + if (prebuilt->table->is_temporary()) + { + count_or_not: + if (rec_deleted) + goto next_rec; + } + else if (index->is_clust()) { if (prebuilt->trx->isolation_level == TRX_ISO_READ_UNCOMMITTED) - { - if (!rec_deleted) - goto count_row; - goto next_rec; - } + goto count_or_not; trx_id_t rec_trx_id= row_get_rec_trx_id(rec, index, offsets); @@ -6371,10 +6373,7 @@ rec_loop: ER_NOT_KEYFILE, "InnoDB: %s", w.m_oss.str().c_str()); } - if (!rec_deleted) - goto count_row; - - goto next_rec; + goto count_or_not; } else if (const trx_id_t page_trx_id= page_get_max_trx_id(page_align(rec))) {