Commit 5203d9bb authored by Mayank Prasad's avatar Mayank Prasad

BUG#12427262 : 60961: SHOW TABLES VERY SLOW WHEN NOT IN SYSTEM DISK CACHE

Reason:
 This is a regression happened because of changes done in code refactoring 
 in 5.1 from 5.0.

Issue: 
 While doing "Show tables" lex->verbose was being checked to avoid opening
 FRM files to get table type. In case of "Show full table", lex->verbose
 is true to indicate table type is required. In 5.0, this check was
 present which got missing in >=5.5.

Fix:
 Added the required check to avoid opening FRM files unnecessarily in case
 of "Show tables".
parent adb352ca
...@@ -3198,39 +3198,44 @@ end: ...@@ -3198,39 +3198,44 @@ end:
static int fill_schema_table_names(THD *thd, TABLE *table, static int fill_schema_table_names(THD *thd, TABLE *table,
LEX_STRING *db_name, LEX_STRING *table_name, LEX_STRING *db_name, LEX_STRING *table_name,
bool with_i_schema) bool with_i_schema,
bool need_table_type)
{ {
if (with_i_schema) /* Avoid opening FRM files if table type is not needed. */
if (need_table_type)
{ {
table->field[3]->store(STRING_WITH_LEN("SYSTEM VIEW"), if (with_i_schema)
system_charset_info); {
} table->field[3]->store(STRING_WITH_LEN("SYSTEM VIEW"),
else
{
enum legacy_db_type not_used;
char path[FN_REFLEN + 1];
(void) build_table_filename(path, sizeof(path) - 1, db_name->str,
table_name->str, reg_ext, 0);
switch (mysql_frm_type(thd, path, &not_used)) {
case FRMTYPE_ERROR:
table->field[3]->store(STRING_WITH_LEN("ERROR"),
system_charset_info);
break;
case FRMTYPE_TABLE:
table->field[3]->store(STRING_WITH_LEN("BASE TABLE"),
system_charset_info);
break;
case FRMTYPE_VIEW:
table->field[3]->store(STRING_WITH_LEN("VIEW"),
system_charset_info); system_charset_info);
break;
default:
DBUG_ASSERT(0);
} }
if (thd->is_error() && thd->main_da.sql_errno() == ER_NO_SUCH_TABLE) else
{ {
thd->clear_error(); enum legacy_db_type not_used;
return 0; char path[FN_REFLEN + 1];
(void) build_table_filename(path, sizeof(path) - 1, db_name->str,
table_name->str, reg_ext, 0);
switch (mysql_frm_type(thd, path, &not_used)) {
case FRMTYPE_ERROR:
table->field[3]->store(STRING_WITH_LEN("ERROR"),
system_charset_info);
break;
case FRMTYPE_TABLE:
table->field[3]->store(STRING_WITH_LEN("BASE TABLE"),
system_charset_info);
break;
case FRMTYPE_VIEW:
table->field[3]->store(STRING_WITH_LEN("VIEW"),
system_charset_info);
break;
default:
DBUG_ASSERT(0);
}
if (thd->is_error() && thd->main_da.sql_errno() == ER_NO_SUCH_TABLE)
{
thd->clear_error();
return 0;
}
} }
} }
if (schema_table_store_record(thd, table)) if (schema_table_store_record(thd, table))
...@@ -3551,7 +3556,8 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) ...@@ -3551,7 +3556,8 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
if (schema_table_idx == SCH_TABLE_NAMES) if (schema_table_idx == SCH_TABLE_NAMES)
{ {
if (fill_schema_table_names(thd, tables->table, db_name, if (fill_schema_table_names(thd, tables->table, db_name,
table_name, with_i_schema)) table_name, with_i_schema,
lex->verbose))
continue; continue;
} }
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment