summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <svoj@mysql.com/june.mysql.com>2007-03-30 13:00:21 +0500
committerunknown <svoj@mysql.com/june.mysql.com>2007-03-30 13:00:21 +0500
commit0da1a0cdecd77d98c4e849030a2efa9774c5f536 (patch)
tree5b389c352c3cde60ec4de181522882af5dd2b654
parent817a474c3d767cd9c91cfe2b4240e775a7aa33af (diff)
downloadmariadb-git-0da1a0cdecd77d98c4e849030a2efa9774c5f536.tar.gz
BUG#26138 - REPAIR TABLE with option USE_FRM erases all records in
ARCHIVE table ARCHIVE table was truncated by REPAIR TABLE ... USE_FRM statement. The table handler returned its file name extensions in a wrong order. REPAIR TABLE believed it has to use the meta file to create a new table from it. With the fixed order, REPAIR TABLE does now use the data file to create a new table. So REPAIR TABLE ... USE_FRM works well with ARCHIVE engine now. This issue affects 5.0 only, since in 5.1 ARCHIVE engine stores meta information and data in the same file. mysql-test/r/archive.result: A test case for bug#26138. mysql-test/t/archive.test: A test case for bug#26138. sql/examples/ha_example.cc: Added a comment. sql/ha_archive.cc: First element of engine file name extentions array should be meta/index file extention. Second element - data file extention. This is true for engines that have separate meta/index file and data file. Reoder ha_archive_exts elements to meet described above requirement. sql/handler.h: Added a comment. sql/sql_table.cc: Added a comment.
-rw-r--r--mysql-test/r/archive.result9
-rw-r--r--mysql-test/t/archive.test10
-rw-r--r--sql/examples/ha_example.cc6
-rw-r--r--sql/ha_archive.cc2
-rw-r--r--sql/handler.h11
-rw-r--r--sql/sql_table.cc4
6 files changed, 40 insertions, 2 deletions
diff --git a/mysql-test/r/archive.result b/mysql-test/r/archive.result
index f73a80dde65..d89cecedcdd 100644
--- a/mysql-test/r/archive.result
+++ b/mysql-test/r/archive.result
@@ -12355,3 +12355,12 @@ auto fld1 companynr fld3 fld4 fld5
4 011403 37 intercepted audiology tinily
4 011403 37 intercepted audiology tinily
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 80533f21311..0ffbfab3d4f 100644
--- a/mysql-test/t/archive.test
+++ b/mysql-test/t/archive.test
@@ -1364,3 +1364,13 @@ SELECT * from t2;
drop table t1, t2, t4;
+
+#
+# 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/examples/ha_example.cc b/sql/examples/ha_example.cc
index 19c686ee495..d59ada3b445 100644
--- a/sql/examples/ha_example.cc
+++ b/sql/examples/ha_example.cc
@@ -211,6 +211,12 @@ ha_example::ha_example(TABLE *table_arg)
If frm_error() is called then we will use this to 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.
*/
static const char *ha_example_exts[] = {
NullS
diff --git a/sql/ha_archive.cc b/sql/ha_archive.cc
index 2ee514f29c9..e2a2211259f 100644
--- a/sql/ha_archive.cc
+++ b/sql/ha_archive.cc
@@ -503,8 +503,8 @@ int ha_archive::init_archive_writer()
We just implement one additional file extension.
*/
static const char *ha_archive_exts[] = {
- ARZ,
ARM,
+ ARZ,
NullS
};
diff --git a/sql/handler.h b/sql/handler.h
index 9e381ca4482..9863d541b5f 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -780,6 +780,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 ulong table_flags(void) const =0;
virtual ulong index_flags(uint idx, uint part, bool all_parts) const =0;
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index c75aff7fab6..fb377971630 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -2068,7 +2068,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.
*/
if (!ext[0] || !ext[1])
goto end; // No data file