diff --git a/mysql-test/suite/innodb/r/truncate_foreign.result b/mysql-test/suite/innodb/r/truncate_foreign.result index 12a41860708..f9a7bcf562c 100644 --- a/mysql-test/suite/innodb/r/truncate_foreign.result +++ b/mysql-test/suite/innodb/r/truncate_foreign.result @@ -68,3 +68,21 @@ TRUNCATE TABLE t1; ALTER TABLE t1 ADD c INT; UNLOCK TABLES; DROP TABLE t1; +# +# MDEV-26052 Assertion prebuilt->trx_id < table->def_trx_id failed +# +call mtr.add_suppression("InnoDB: In ALTER TABLE `test`\\.`t1` has or is"); +CREATE TABLE t1 (pk INT, a INT, PRIMARY KEY (pk), KEY (a)) ENGINE=InnoDB; +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t1 (a), ALGORITHM=COPY; +INSERT INTO t1 VALUES (1,1); +LOCK TABLES t1 WRITE; +TRUNCATE t1; +ERROR HY000: Cannot add foreign key constraint for `t1` +INSERT INTO t1 VALUES (2,2); +SELECT * FROM t1; +pk a +1 1 +2 2 +DROP TABLE t1; +# End of 10.6 tests diff --git a/mysql-test/suite/innodb/t/truncate_foreign.test b/mysql-test/suite/innodb/t/truncate_foreign.test index 1c150e5db40..7a0bc57d5cd 100644 --- a/mysql-test/suite/innodb/t/truncate_foreign.test +++ b/mysql-test/suite/innodb/t/truncate_foreign.test @@ -80,3 +80,22 @@ TRUNCATE TABLE t1; ALTER TABLE t1 ADD c INT; UNLOCK TABLES; DROP TABLE t1; + +--echo # +--echo # MDEV-26052 Assertion prebuilt->trx_id < table->def_trx_id failed +--echo # + +call mtr.add_suppression("InnoDB: In ALTER TABLE `test`\\.`t1` has or is"); + +CREATE TABLE t1 (pk INT, a INT, PRIMARY KEY (pk), KEY (a)) ENGINE=InnoDB; +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t1 (a), ALGORITHM=COPY; +INSERT INTO t1 VALUES (1,1); +LOCK TABLES t1 WRITE; +--error ER_CANNOT_ADD_FOREIGN +TRUNCATE t1; +INSERT INTO t1 VALUES (2,2); +SELECT * FROM t1; +DROP TABLE t1; + +--echo # End of 10.6 tests diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 63a679c0317..2a91106ba22 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -13707,6 +13707,7 @@ int ha_innobase::truncate() } else { const auto update_time = ib_table->update_time; const auto stored_lock = m_prebuilt->stored_select_lock_type; + const auto def_trx_id = ib_table->def_trx_id; ib_table->release(); m_prebuilt->table = nullptr; @@ -13721,6 +13722,7 @@ int ha_innobase::truncate() reload: m_prebuilt->table = dict_table_open_on_name( name, false, false, DICT_ERR_IGNORE_NONE); + m_prebuilt->table->def_trx_id = def_trx_id; } else { row_prebuilt_t* prebuilt = m_prebuilt; uchar* upd_buf = m_upd_buf;