Below is the list of changes that have just been committed into a local
5.0 repository of cmiller. When cmiller does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-03-07 11:40:04-05:00, cmiller@stripped +4 -0
Patch contributed by Jocelyn Fournier. CLA received 2007-02-27.
Bug#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 CREATE VIEW to test whether a "table" is a view
or not.
BitKeeper/etc/collapsed@stripped, 2007-03-07 11:18:21-05:00, cmiller@stripped +2 -0
client/mysqlcheck.c@stripped, 2007-03-07 11:40:02-05:00, cmiller@stripped +58 -11
Use SHOW CREATE VIEW to test better whether a name in the table
list is one of a view. Checking that the engine is NULL is
insufficient.
mysql-test/r/mysqlcheck.result@stripped, 2007-03-07 11:40:02-05:00, cmiller@stripped +11 -0
Verify that tables that have NULL/unreadable engine types are
processed and not interpreted as views.
mysql-test/t/mysqlcheck.test@stripped, 2007-03-07 11:40:02-05:00, cmiller@stripped +17 -0
Verify that tables that have NULL/unreadable engine types are
processed and not interpreted as views.
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: cmiller
# Host: zippy.cornsilk.net
# Root: /home/cmiller/work/mysql/mysql-5.0-comeng--bug25347
--- 1.26/BitKeeper/etc/collapsed 2007-03-07 11:40:09 -05:00
+++ 1.27/BitKeeper/etc/collapsed 2007-03-07 11:40:09 -05:00
@@ -57,3 +57,5 @@
45ddaf15_Ld7IAEpUUP3FJjJ-oSEFg
45ddc763DodLG1BqH_wRBJXMbCSB5A
45ddc8282KnaNGuijqCTphlXV_eeog
+45eedc83xPOs7LThqiF1rwmXkDwIWQ
+45eedf775gJhd_GXVE4kSj9hIvn_MA
--- 1.2/mysql-test/r/mysqlcheck.result 2007-03-07 11:40:09 -05:00
+++ 1.3/mysql-test/r/mysqlcheck.result 2007-03-07 11:40:09 -05:00
@@ -38,4 +38,15 @@ test.t1
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;
+d_bug25347.t_bug25347 OK
+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
--- 1.2/mysql-test/t/mysqlcheck.test 2007-03-07 11:40:09 -05:00
+++ 1.3/mysql-test/t/mysqlcheck.test 2007-03-07 11:40:09 -05:00
@@ -22,4 +22,21 @@ 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;
+--exec $MYSQL_CHECK --repair --databases d_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
--- 1.58/client/mysqlcheck.c 2007-03-07 11:40:09 -05:00
+++ 1.59/client/mysqlcheck.c 2007-03-07 11:40:09 -05:00
@@ -449,6 +449,53 @@ static char *fix_table_name(char *dest,
}
+/**
+ Take a "table name" and check to see if it's really a view.
+ Specifically, it checks that SHOW CREATE VIEW table_name doesn't
+ cause a SQL error.
+
+ @param table_name NUL-terminated, unquoted name of purported view
+ @returns TRUE if table_name is a view name, FALSE if not or unsure
+*/
+static my_bool is_view(char *table_name)
+{
+ MYSQL_RES *show_create_result;
+ my_bool ret;
+ char *query_view_check;
+
+ uint show_stmt_length= 19 + strlen(table_name) + 1; /* 19=SHOW... 1=\0 */
+ query_view_check= (char *) my_malloc(sizeof(char)*show_stmt_length, MYF(0));
+
+ sprintf(query_view_check, "SHOW CREATE VIEW `%s`", table_name);
+ if (mysql_query(sock, query_view_check) == 0)
+ {
+ ret= TRUE;
+
+ /* We asked for it. We must retreive it. */
+ if ((show_create_result= mysql_store_result(sock)) != NULL)
+ mysql_free_result(show_create_result);
+ }
+ else
+ {
+ /*
+ SHOW CREATE failed. It may fail for several reasons, but only
+ one is interesting: If the object we operated on is not a view,
+ then we should get ER_WRONG_OBJECT. If we get something else,
+ like a handler error (err < 1000), then it is a view that is
+ damaged.
+ */
+
+ if (mysql_errno(sock) == ER_WRONG_OBJECT)
+ ret= FALSE;
+ else
+ ret= TRUE;
+ }
+
+ my_free(query_view_check, MYF(0));
+ return(ret);
+}
+
+
static int process_all_tables_in_db(char *database)
{
MYSQL_RES *res;
@@ -483,12 +530,11 @@ static int process_all_tables_in_db(char
}
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 (is_view(row[0]))
+ continue;
+
+ end= fix_table_name(end, row[0]);
+ *end++= ',';
}
*--end = 0;
if (tot_length)
@@ -498,11 +544,12 @@ static int process_all_tables_in_db(char
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 (is_view(row[0]))
+ continue;
+
+ handle_request_for_tables(row[0], strlen(row[0]));
+ }
}
mysql_free_result(res);
return 0;
| Thread |
|---|
| • bk commit into 5.0 tree (cmiller:1.2421) BUG#25347 | Chad MILLER | 7 Mar |