diff --git a/mysql-test/suite/innodb/r/import_bugs.result b/mysql-test/suite/innodb/r/import_bugs.result new file mode 100644 index 00000000000..a52fe6abbd6 --- /dev/null +++ b/mysql-test/suite/innodb/r/import_bugs.result @@ -0,0 +1,12 @@ +call mtr.add_suppression("Index for table 'imp_t1' is corrupt; try to repair it"); +SET @save_innodb_checksum_algorithm=@@GLOBAL.innodb_checksum_algorithm; +SET GLOBAL innodb_checksum_algorithm=full_crc32; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +CREATE TABLE imp_t1 (a INT PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +ALTER TABLE imp_t1 DISCARD TABLESPACE ; +FLUSH TABLES t1 FOR EXPORT; +UNLOCK TABLES; +ALTER TABLE imp_t1 IMPORT TABLESPACE; +ERROR HY000: Schema mismatch (ROW_FORMAT mismatch) +DROP TABLE imp_t1, t1; +SET GLOBAL innodb_checksum_algorithm=@save_innodb_checksum_algorithm; diff --git a/mysql-test/suite/innodb/t/import_bugs.test b/mysql-test/suite/innodb/t/import_bugs.test new file mode 100644 index 00000000000..42bb5d90ef9 --- /dev/null +++ b/mysql-test/suite/innodb/t/import_bugs.test @@ -0,0 +1,19 @@ +--source include/have_innodb.inc + +call mtr.add_suppression("Index for table 'imp_t1' is corrupt; try to repair it"); + +SET @save_innodb_checksum_algorithm=@@GLOBAL.innodb_checksum_algorithm; +SET GLOBAL innodb_checksum_algorithm=full_crc32; + +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +CREATE TABLE imp_t1 (a INT PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +ALTER TABLE imp_t1 DISCARD TABLESPACE ; +FLUSH TABLES t1 FOR EXPORT; +let $datadir=`select @@datadir`; +--copy_file $datadir/test/t1.ibd $datadir/test/imp_t1.ibd +UNLOCK TABLES; +--error ER_TABLE_SCHEMA_MISMATCH +ALTER TABLE imp_t1 IMPORT TABLESPACE; +DROP TABLE imp_t1, t1; + +SET GLOBAL innodb_checksum_algorithm=@save_innodb_checksum_algorithm; diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index 7c56713a6c1..59d9272fda6 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -680,6 +680,14 @@ dberr_t FetchIndexRootPages::operator()(buf_block_t* block) UNIV_NOTHROW return(DB_CORRUPTION); } } + + if (!page_is_comp(block->frame) != + !dict_table_is_comp(m_table)) { + ib_errf(m_trx->mysql_thd, IB_LOG_LEVEL_ERROR, + ER_TABLE_SCHEMA_MISMATCH, + "ROW_FORMAT mismatch"); + return DB_CORRUPTION; + } } return DB_SUCCESS;