diff options
-rw-r--r-- | mysql-test/r/archive.result | 10 | ||||
-rw-r--r-- | mysql-test/t/archive.test | 10 | ||||
-rw-r--r-- | sql/handler.h | 11 | ||||
-rw-r--r-- | sql/sql_table.cc | 4 | ||||
-rw-r--r-- | storage/example/ha_example.cc | 6 |
5 files changed, 40 insertions, 1 deletions
diff --git a/mysql-test/r/archive.result b/mysql-test/r/archive.result index 6ba8191e2c3..f90577813f4 100644 --- a/mysql-test/r/archive.result +++ b/mysql-test/r/archive.result @@ -12666,3 +12666,13 @@ t6 CREATE TABLE `t6` ( KEY `a` (`a`) ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 DROP TABLE t1, t2, t4, t5, t6; +drop table t1, t2, t4; +create table t1 (i int) engine=archive; +insert into t1 values (1); +repair table t1 use_frm; +Table Op Msg_type Msg_text +test.t1 repair status OK +select * from t1; +i +1 +drop table t1; diff --git a/mysql-test/t/archive.test b/mysql-test/t/archive.test index b2e720cb900..b5ace75dbc4 100644 --- a/mysql-test/t/archive.test +++ b/mysql-test/t/archive.test @@ -1540,3 +1540,13 @@ SHOW CREATE TABLE t6; --disable_warnings DROP TABLE t1, t2, t4, t5, t6; --enable_warnings + +# +# BUG#26138 - REPAIR TABLE with option USE_FRM erases all records in ARCHIVE +# table +# +create table t1 (i int) engine=archive; +insert into t1 values (1); +repair table t1 use_frm; +select * from t1; +drop table t1; diff --git a/sql/handler.h b/sql/handler.h index 5c42dc670ee..cfa86358fa1 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1472,6 +1472,17 @@ public: virtual void free_foreign_key_create_info(char* str) {} /* The following can be called without an open handler */ virtual const char *table_type() const =0; + /* + If frm_error() is called then we will use this to find out what file + extentions exist for the storage engine. This is also used by the default + rename_table and delete_table method in handler.cc. + + For engines that have two file name extentions (separate meta/index file + and data file), the order of elements is relevant. First element of engine + file name extentions array should be meta/index file extention. Second + element - data file extention. This order is assumed by + prepare_for_repair() when REPAIR TABLE ... USE_FRM is issued. + */ virtual const char **bas_ext() const =0; virtual int get_default_no_partitions(HA_CREATE_INFO *info) { return 1;} diff --git a/sql/sql_table.cc b/sql/sql_table.cc index bb3f293941e..350a4754381 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3938,7 +3938,9 @@ static int prepare_for_repair(THD *thd, TABLE_LIST *table_list, /* Check if this is a table type that stores index and data separately, - like ISAM or MyISAM + like ISAM or MyISAM. We assume fixed order of engine file name + extentions array. First element of engine file name extentions array + is meta/index file extention. Second element - data file extention. */ ext= table->file->bas_ext(); if (!ext[0] || !ext[1]) diff --git a/storage/example/ha_example.cc b/storage/example/ha_example.cc index 999e36a4242..a4cdcafc6d0 100644 --- a/storage/example/ha_example.cc +++ b/storage/example/ha_example.cc @@ -247,6 +247,12 @@ ha_example::ha_example(handlerton *hton, TABLE_SHARE *table_arg) used by the default rename_table and delete_table method in handler.cc. + For engines that have two file name extentions (separate meta/index file + and data file), the order of elements is relevant. First element of engine + file name extentions array should be meta/index file extention. Second + element - data file extention. This order is assumed by + prepare_for_repair() when REPAIR TABLE ... USE_FRM is issued. + @see rename_table method in handler.cc and delete_table method in handler.cc |