From c13d726f5d73de5e08e30982742b84c2e94a5efd Mon Sep 17 00:00:00 2001 From: "cmiller@zippy.cornsilk.net" <> Date: Wed, 23 Jan 2008 11:34:08 -0500 Subject: [PATCH 1/2] Bug#27427: resolveip fails on hostnames with a leading digit Patch by Kasper Dupont. No CLA required for this size of patch. "resolveip" program produces incorrect result if given a hostname starting with a digit. Someone seems to have thought that names can not have digits at the beginning. Instead, use the resolver library to work out the rules of hostnames, as it will undoubtedly be better at it than we are. --- configure.in | 2 ++ extra/resolveip.c | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/configure.in b/configure.in index 63d3976aa3c..cf75aaa38f3 100644 --- a/configure.in +++ b/configure.in @@ -838,6 +838,8 @@ AC_CHECK_FUNC(p2open, , AC_CHECK_LIB(gen, p2open)) AC_CHECK_FUNC(bind, , AC_CHECK_LIB(bind, bind)) # Check if crypt() exists in libc or libcrypt, sets LIBS if needed AC_SEARCH_LIBS(crypt, crypt, AC_DEFINE(HAVE_CRYPT, 1, [crypt])) +# See if we need a library for address lookup. +AC_SEARCH_LIBS(inet_aton, [socket nsl resolv]) # For the sched_yield() function on Solaris AC_CHECK_FUNC(sched_yield, , AC_CHECK_LIB(posix4, sched_yield)) diff --git a/extra/resolveip.c b/extra/resolveip.c index 1061cafe380..c613f6a8cb6 100644 --- a/extra/resolveip.c +++ b/extra/resolveip.c @@ -116,11 +116,13 @@ int main(int argc, char **argv) while (argc--) { + struct in_addr addr; ip = *argv++; - if (my_isdigit(&my_charset_latin1,ip[0])) + /* Not compatible with IPv6! Probably should use getnameinfo(). */ + if (inet_aton(ip, &addr) != 0) { - taddr = inet_addr(ip); + taddr= addr.s_addr; if (taddr == htonl(INADDR_BROADCAST)) { puts("Broadcast"); From 71316696a1f23cdc6565a0752aeb6ae63b342bcc Mon Sep 17 00:00:00 2001 From: "cmiller@zippy.cornsilk.net" <> Date: Wed, 23 Jan 2008 11:37:46 -0500 Subject: [PATCH 2/2] 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 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 | 19 ++++++++++++------- mysql-test/r/mysqlcheck.result | 10 ++++++++++ mysql-test/t/mysqlcheck.test | 16 ++++++++++++++++ 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index 3b504eb50b0..473e172adf9 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -483,14 +483,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) { /* @@ -513,12 +516,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) @@ -531,6 +533,9 @@ static int process_all_tables_in_db(char *database) /* Skip tables with an engine of NULL (probably a view). */ if (row[1]) { + if ((num_columns == 2) && (strcmp(row[1], "VIEW") == 0)) + continue; + handle_request_for_tables(row[0], fixed_name_length(row[0])); } } diff --git a/mysql-test/r/mysqlcheck.result b/mysql-test/r/mysqlcheck.result index f8a28009c42..7c72cfeb889 100644 --- a/mysql-test/r/mysqlcheck.result +++ b/mysql-test/r/mysqlcheck.result @@ -46,4 +46,14 @@ create table `t 1`(a int); test.t 1 OK test.t`1 OK drop table `t``1`, `t 1`; +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 diff --git a/mysql-test/t/mysqlcheck.test b/mysql-test/t/mysqlcheck.test index 04e7b6b4bdb..532e34d1980 100644 --- a/mysql-test/t/mysqlcheck.test +++ b/mysql-test/t/mysqlcheck.test @@ -40,4 +40,20 @@ create table `t 1`(a int); --exec $MYSQL_CHECK --databases test drop table `t``1`, `t 1`; +# +# 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