In mysql-5.0.x tables `general_log` and `slow_log` don't have to exist. When we try to get dump of mysql database of mysql-5.0.x server using client mysql-5.1.x or newer, which expect these tables to exist, mysqldump will crash with the following error: mysqldump: Couldn't execute 'show create table `general_log`': Table 'mysql.general_log' doesn't exist (1146) This is reported at http://bugs.mysql.com/bug.php?id=65670 This patch adds checking if tables `general_log` and `slow_log` exist before reading their structure. diff -up mysql-5.1.66/client/mysqldump.c.logs mysql-5.1.66/client/mysqldump.c --- mysql-5.1.66/client/mysqldump.c.logs 2012-09-07 16:14:06.000000000 +0200 +++ mysql-5.1.66/client/mysqldump.c 2012-11-28 15:33:00.116328380 +0100 @@ -4269,6 +4269,31 @@ my_bool include_table(const uchar *hash_ } +/* Return 1 if table exists in db */ + +static my_bool get_table_exists(char *table, char *db) +{ + char query_buff[QUERY_LENGTH]; + MYSQL_RES *result; + MYSQL_ROW row; + my_bool return_value = 0; + + DBUG_ENTER("get_table_exists"); + my_snprintf(query_buff, sizeof(query_buff), + "SELECT COUNT(0) AS `Exists` " + "FROM `INFORMATION_SCHEMA`.`TABLES` WHERE " + "TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s'", + db, table); + + mysql_query_with_error_report(mysql, &result, query_buff); + if (row= mysql_fetch_row(result)) + return_value = (strcmp(row[0], "0") != 0); + + mysql_free_result(result); + DBUG_RETURN(return_value); +} + + static int dump_all_tables_in_db(char *database) { char *table; @@ -4292,17 +4317,24 @@ static int dump_all_tables_in_db(char *d char table_type[NAME_LEN]; char ignore_flag; uint num_fields; - num_fields= get_table_structure((char *) "general_log", - database, table_type, &ignore_flag); - if (num_fields == 0) - verbose_msg("-- Warning: get_table_structure() failed with some internal " - "error for 'general_log' table\n"); - num_fields= get_table_structure((char *) "slow_log", - database, table_type, &ignore_flag); - if (num_fields == 0) - verbose_msg("-- Warning: get_table_structure() failed with some internal " - "error for 'slow_log' table\n"); + if (get_table_exists((char *) "general_log", database)) + { + num_fields= get_table_structure((char *) "general_log", + database, table_type, &ignore_flag); + if (num_fields == 0) + verbose_msg("-- Warning: get_table_structure() failed with some internal " + "error for 'general_log' table\n"); + } + if (get_table_exists((char *) "slow_log", database)) + { + num_fields= get_table_structure((char *) "slow_log", + database, table_type, &ignore_flag); + if (num_fields == 0) + verbose_msg("-- Warning: get_table_structure() failed with some internal " + "error for 'slow_log' table\n"); + } } + if (lock_tables) { DYNAMIC_STRING query;