Commit e0d5a6c1 authored by Ramil Kalimullin's avatar Ramil Kalimullin
Browse files

Fix for bug#37527: mysqlcheck fails to report entire database

when InnoDB frm file corruption

Problem: mysqlcheck runs 'SHOW FULL TABLE' queries to get table lists.
The query may fail for some reasons (e.g. null .frm file) then
mysqlcheck doesn't process the database tables.

Fix: try to run 'SHOW TABLES' if 'SHOW FULL TABLES' failed.
parent f88fd3fe
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -488,9 +488,14 @@ static int process_all_tables_in_db(char *database)
  LINT_INIT(res);
  if (use_db(database))
    return 1;
  if (mysql_query(sock, "SHOW /*!50002 FULL*/ TABLES") ||
	!((res= mysql_store_result(sock))))
  if ((mysql_query(sock, "SHOW /*!50002 FULL*/ TABLES") &&
       mysql_query(sock, "SHOW TABLES")) ||
      !(res= mysql_store_result(sock)))
  {
    my_printf_error(0, "Error: Couldn't get table list for database %s: %s",
		    MYF(0), database, mysql_error(sock));
    return 1;
  }

  num_columns= mysql_num_fields(res);

+7 −0
Original line number Diff line number Diff line
@@ -63,4 +63,11 @@ Table Op Msg_type Msg_text
test.v1	check	status	OK
information_schema.routines	check	note	The storage engine for the table doesn't support check
drop view v1;
CREATE TABLE t1(a INT);
CREATE TABLE t2(a INT);
test.t1
Error    : Incorrect information in file: './test/t1.frm'
error    : Corrupt
test.t2                                            OK
DROP TABLE t1, t2;
End of 5.0 tests
+20 −0
Original line number Diff line number Diff line
@@ -65,4 +65,24 @@ create view v1 as select * from information_schema.routines;
check table v1, information_schema.routines;
drop view v1;


#
# Bug#37527: mysqlcheck fails to report entire database 
# when frm file corruption
#
CREATE TABLE t1(a INT);
CREATE TABLE t2(a INT);
# backup then null t1.frm
--copy_file $MYSQLTEST_VARDIR/master-data/test/t1.frm $MYSQLTEST_VARDIR/master-data/test/t1.frm.bak
--remove_file $MYSQLTEST_VARDIR/master-data/test/t1.frm
--write_file $MYSQLTEST_VARDIR/master-data/test/t1.frm
EOF
--exec $MYSQL_CHECK test
# restore t1.frm
--remove_file $MYSQLTEST_VARDIR/master-data/test/t1.frm
--copy_file $MYSQLTEST_VARDIR/master-data/test/t1.frm.bak $MYSQLTEST_VARDIR/master-data/test/t1.frm
--remove_file $MYSQLTEST_VARDIR/master-data/test/t1.frm.bak
DROP TABLE t1, t2;


--echo End of 5.0 tests