summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/archive.result10
-rw-r--r--mysql-test/t/archive.test10
-rw-r--r--sql/handler.h11
-rw-r--r--sql/sql_table.cc4
-rw-r--r--storage/example/ha_example.cc6
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