mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
Backport:
Patch contributed by Jocelyn Fournier. CLA received 2007-02-27. B-g#25347: mysqlcheck -A -r doesn't repair table marked as crashed mysqlcheck tests nullness of the engine type to know whether the "table" is a view or not. That also falsely catches tables that are severly damaged. Instead, use SHOW FULL TABLES to test whether a "table" is a view or not. (Don't add new function. Instead, get original data a smarter way.) Make it safe for use against databases before when views appeared. client/mysqlcheck.c: Use SHOW FULL TABLES to test better whether a name in the table list is one of a view. Checking that the engine is NULL is insufficient. Implemented suggestion from jimw that involved removing most of original patch and getting data a better way mysql-test/r/mysqlcheck.result: Verify that tables that have NULL/unreadable engine types are processed and not interpreted as views. mysql-test/t/mysqlcheck.test: Verify that tables that have NULL/unreadable engine types are processed and not interpreted as views.
This commit is contained in:
parent
698d98bea0
commit
34a102d909
3 changed files with 41 additions and 12 deletions
|
@ -453,14 +453,17 @@ static int process_all_tables_in_db(char *database)
|
|||
{
|
||||
MYSQL_RES *res;
|
||||
MYSQL_ROW row;
|
||||
uint num_columns;
|
||||
|
||||
LINT_INIT(res);
|
||||
if (use_db(database))
|
||||
return 1;
|
||||
if (mysql_query(sock, "SHOW TABLE STATUS") ||
|
||||
if (mysql_query(sock, "SHOW /*!50002 FULL*/ TABLES") ||
|
||||
!((res= mysql_store_result(sock))))
|
||||
return 1;
|
||||
|
||||
num_columns= mysql_num_fields(res);
|
||||
|
||||
if (opt_all_in_1)
|
||||
{
|
||||
/*
|
||||
|
@ -483,12 +486,11 @@ static int process_all_tables_in_db(char *database)
|
|||
}
|
||||
for (end = tables + 1; (row = mysql_fetch_row(res)) ;)
|
||||
{
|
||||
/* Skip tables with an engine of NULL (probably a view). */
|
||||
if (row[1])
|
||||
{
|
||||
end= fix_table_name(end, row[0]);
|
||||
*end++= ',';
|
||||
}
|
||||
if ((num_columns == 2) && (strcmp(row[1], "VIEW") == 0))
|
||||
continue;
|
||||
|
||||
end= fix_table_name(end, row[0]);
|
||||
*end++= ',';
|
||||
}
|
||||
*--end = 0;
|
||||
if (tot_length)
|
||||
|
@ -498,11 +500,12 @@ static int process_all_tables_in_db(char *database)
|
|||
else
|
||||
{
|
||||
while ((row = mysql_fetch_row(res)))
|
||||
/* Skip tables with an engine of NULL (probably a view). */
|
||||
if (row[1])
|
||||
{
|
||||
handle_request_for_tables(row[0], strlen(row[0]));
|
||||
}
|
||||
{
|
||||
if ((num_columns == 2) && (strcmp(row[1], "VIEW") == 0))
|
||||
continue;
|
||||
|
||||
handle_request_for_tables(row[0], strlen(row[0]));
|
||||
}
|
||||
}
|
||||
mysql_free_result(res);
|
||||
return 0;
|
||||
|
|
|
@ -41,4 +41,14 @@ test.t1 OK
|
|||
test.t1 OK
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
create database d_bug25347;
|
||||
use d_bug25347;
|
||||
create table t_bug25347 (a int);
|
||||
create view v_bug25347 as select * from t_bug25347;
|
||||
removing and creating
|
||||
d_bug25347.t_bug25347 OK
|
||||
drop view v_bug25347;
|
||||
drop table t_bug25347;
|
||||
drop database d_bug25347;
|
||||
use test;
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -31,4 +31,20 @@ create view v1 as select * from t1;
|
|||
drop view v1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#25347: mysqlcheck -A -r doesn't repair table marked as crashed
|
||||
#
|
||||
create database d_bug25347;
|
||||
use d_bug25347;
|
||||
create table t_bug25347 (a int);
|
||||
create view v_bug25347 as select * from t_bug25347;
|
||||
--echo removing and creating
|
||||
--exec rm $MYSQLTEST_VARDIR/master-data/d_bug25347/t_bug25347.MYI;
|
||||
--exec touch $MYSQLTEST_VARDIR/master-data/d_bug25347/t_bug25347.MYI;
|
||||
--exec $MYSQL_CHECK --repair --databases d_bug25347
|
||||
drop view v_bug25347;
|
||||
drop table t_bug25347;
|
||||
drop database d_bug25347;
|
||||
use test;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
|
Loading…
Add table
Reference in a new issue