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.
This commit is contained in:
Marko Mäkelä 2022-11-14 13:08:00 +02:00
parent 704c74cd99
commit c82f3f1b04
3 changed files with 32 additions and 10 deletions

View file

@ -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

View file

@ -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

View file

@ -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)))
{