summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/lib/mtr_report.pl5
-rw-r--r--mysql-test/std_data/corrupt_t1#P#p1.MYIbin0 -> 1024 bytes
-rw-r--r--mysql-test/std_data/corrupt_t1.MYIbin0 -> 1024 bytes
-rw-r--r--mysql-test/suite/parts/r/partition_repair_myisam.result56
-rw-r--r--mysql-test/suite/parts/t/partition_repair_myisam-master.opt1
-rw-r--r--mysql-test/suite/parts/t/partition_repair_myisam.test30
-rw-r--r--sql/ha_partition.cc64
-rw-r--r--sql/ha_partition.h6
8 files changed, 158 insertions, 4 deletions
diff --git a/mysql-test/lib/mtr_report.pl b/mysql-test/lib/mtr_report.pl
index b83f40626aa..bee03e82e24 100644
--- a/mysql-test/lib/mtr_report.pl
+++ b/mysql-test/lib/mtr_report.pl
@@ -402,7 +402,10 @@ sub mtr_report_stats ($) {
)) or
# Test case for Bug#31590 produces the following error:
- /Out of sort memory; increase server sort buffer size/
+ /Out of sort memory; increase server sort buffer size/ or
+
+ # Bug#35161, test of auto repair --myisam-recover
+ /able.*_will_crash/
)
{
next; # Skip these lines
diff --git a/mysql-test/std_data/corrupt_t1#P#p1.MYI b/mysql-test/std_data/corrupt_t1#P#p1.MYI
new file mode 100644
index 00000000000..27a37c710b4
--- /dev/null
+++ b/mysql-test/std_data/corrupt_t1#P#p1.MYI
Binary files differ
diff --git a/mysql-test/std_data/corrupt_t1.MYI b/mysql-test/std_data/corrupt_t1.MYI
new file mode 100644
index 00000000000..10df2e8c3e1
--- /dev/null
+++ b/mysql-test/std_data/corrupt_t1.MYI
Binary files differ
diff --git a/mysql-test/suite/parts/r/partition_repair_myisam.result b/mysql-test/suite/parts/r/partition_repair_myisam.result
new file mode 100644
index 00000000000..df737ec2853
--- /dev/null
+++ b/mysql-test/suite/parts/r/partition_repair_myisam.result
@@ -0,0 +1,56 @@
+CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM;
+INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
+FLUSH TABLES;
+# replacing t1.MYI with a corrupt + unclosed one created by doing:
+# 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI
+SELECT * FROM t1_will_crash;
+a
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+Warnings:
+Error 145 Table './test/t1_will_crash' is marked as crashed and should be repaired
+Error 1194 Table 't1_will_crash' is marked as crashed and should be repaired
+Error 1034 1 client is using or hasn't closed the table properly
+Error 1034 Size of indexfile is: 1024 Should be: 2048
+Error 1034 Size of datafile is: 77 Should be: 7
+Error 1034 Number of rows changed from 1 to 11
+DROP TABLE t1_will_crash;
+CREATE TABLE t1_will_crash (a INT, KEY (a))
+ENGINE=MyISAM
+PARTITION BY HASH(a)
+PARTITIONS 3;
+INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
+FLUSH TABLES;
+# replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing:
+# 'create table t1 (a int key(a)) partition by hash (a) partitions 3'
+# head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI
+SELECT * FROM t1_will_crash;
+a
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+Warnings:
+Error 145 Table './test/t1_will_crash#P#p1' is marked as crashed and should be repaired
+Error 1194 Table 't1_will_crash' is marked as crashed and should be repaired
+Error 1034 1 client is using or hasn't closed the table properly
+Error 1034 Size of indexfile is: 1024 Should be: 2048
+Error 1034 Size of datafile is: 28 Should be: 7
+Error 1034 Number of rows changed from 1 to 4
+DROP TABLE t1_will_crash;
diff --git a/mysql-test/suite/parts/t/partition_repair_myisam-master.opt b/mysql-test/suite/parts/t/partition_repair_myisam-master.opt
new file mode 100644
index 00000000000..787371a854a
--- /dev/null
+++ b/mysql-test/suite/parts/t/partition_repair_myisam-master.opt
@@ -0,0 +1 @@
+--myisam-recover
diff --git a/mysql-test/suite/parts/t/partition_repair_myisam.test b/mysql-test/suite/parts/t/partition_repair_myisam.test
new file mode 100644
index 00000000000..551d344f60e
--- /dev/null
+++ b/mysql-test/suite/parts/t/partition_repair_myisam.test
@@ -0,0 +1,30 @@
+--source include/have_partition.inc
+--disable_warnings
+--disable_query_log
+drop table if exists t1_will_crash;
+--enable_query_log
+--enable_warnings
+
+
+CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM;
+INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
+FLUSH TABLES;
+--echo # replacing t1.MYI with a corrupt + unclosed one created by doing:
+--echo # 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI
+--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash.MYI
+--copy_file std_data/corrupt_t1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash.MYI
+SELECT * FROM t1_will_crash;
+DROP TABLE t1_will_crash;
+CREATE TABLE t1_will_crash (a INT, KEY (a))
+ENGINE=MyISAM
+PARTITION BY HASH(a)
+PARTITIONS 3;
+INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
+FLUSH TABLES;
+--echo # replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing:
+--echo # 'create table t1 (a int key(a)) partition by hash (a) partitions 3'
+--echo # head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI
+--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI
+--copy_file std_data/corrupt_t1#P#p1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI
+SELECT * FROM t1_will_crash;
+DROP TABLE t1_will_crash;
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index 2e0bb090ad2..0959d6db974 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -1129,6 +1129,70 @@ int ha_partition::handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
#endif
}
+
+/**
+ @brief Check and repair the table if neccesary
+
+ @param thd Thread object
+
+ @retval TRUE Error/Not supported
+ @retval FALSE Success
+*/
+
+bool ha_partition::check_and_repair(THD *thd)
+{
+ handler **file= m_file;
+ DBUG_ENTER("ha_partition::check_and_repair");
+
+ do
+ {
+ if ((*file)->ha_check_and_repair(thd))
+ DBUG_RETURN(TRUE);
+ } while (*(++file));
+ DBUG_RETURN(FALSE);
+}
+
+
+/**
+ @breif Check if the table can be automatically repaired
+
+ @retval TRUE Can be auto repaired
+ @retval FALSE Cannot be auto repaired
+*/
+
+bool ha_partition::auto_repair() const
+{
+ DBUG_ENTER("ha_partition::auto_repair");
+
+ /*
+ As long as we only support one storage engine per table,
+ we can use the first partition for this function.
+ */
+ DBUG_RETURN(m_file[0]->auto_repair());
+}
+
+
+/**
+ @breif Check if the table is crashed
+
+ @retval TRUE Crashed
+ @retval FALSE Not crashed
+*/
+
+bool ha_partition::is_crashed() const
+{
+ handler **file= m_file;
+ DBUG_ENTER("ha_partition::is_crashed");
+
+ do
+ {
+ if ((*file)->is_crashed())
+ DBUG_RETURN(TRUE);
+ } while (*(++file));
+ DBUG_RETURN(FALSE);
+}
+
+
/*
Prepare by creating a new partition
diff --git a/sql/ha_partition.h b/sql/ha_partition.h
index ac00581fae0..e758dd1eeee 100644
--- a/sql/ha_partition.h
+++ b/sql/ha_partition.h
@@ -935,6 +935,9 @@ public:
virtual int analyze_partitions(THD *thd);
virtual int check_partitions(THD *thd);
virtual int repair_partitions(THD *thd);
+ virtual bool check_and_repair(THD *thd);
+ virtual bool auto_repair() const;
+ virtual bool is_crashed() const;
private:
int handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
@@ -950,12 +953,9 @@ public:
virtual int restore(THD* thd, HA_CHECK_OPT *check_opt);
virtual int assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt);
virtual int preload_keys(THD *thd, HA_CHECK_OPT *check_opt);
- virtual bool check_and_repair(THD *thd);
virtual int dump(THD* thd, int fd = -1);
virtual int net_read_dump(NET* net);
virtual uint checksum() const;
- virtual bool is_crashed() const;
- virtual bool auto_repair() const;
*/
/*