diff --git a/mysql-test/r/information_schema_db.result b/mysql-test/r/information_schema_db.result new file mode 100644 index 00000000000..0ccb22be22a --- /dev/null +++ b/mysql-test/r/information_schema_db.result @@ -0,0 +1,28 @@ +use INFORMATION_SCHEMA; +show tables; +Tables_in_INFORMATION_SCHEMA +SCHEMATA +TABLES +COLUMNS +CHARACTER_SETS +COLLATIONS +COLLATION_CHARACTER_SET_APPLICABILITY +ROUTINES +STATISTICS +VIEWS +USER_PRIVILEGES +SCHEMA_PRIVILEGES +TABLE_PRIVILEGES +COLUMN_PRIVILEGES +TABLE_CONSTRAINTS +KEY_COLUMN_USAGE +show tables from INFORMATION_SCHEMA like 'T%'; +Tables_in_INFORMATION_SCHEMA (T%) +TABLES +TABLE_PRIVILEGES +TABLE_CONSTRAINTS +create database `inf%`; +use `inf%`; +show tables; +Tables_in_inf% +drop database `inf%`; diff --git a/mysql-test/t/information_schema_db.test b/mysql-test/t/information_schema_db.test new file mode 100644 index 00000000000..f88d04c2783 --- /dev/null +++ b/mysql-test/t/information_schema_db.test @@ -0,0 +1,9 @@ +-- source include/testdb_only.inc + +use INFORMATION_SCHEMA; +show tables; +show tables from INFORMATION_SCHEMA like 'T%'; +create database `inf%`; +use `inf%`; +show tables; +drop database `inf%`; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 9e3f82f9fd6..dfdff8ae914 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1779,32 +1779,77 @@ enum enum_schema_tables get_schema_table_idx(ST_SCHEMA_TABLE *schema_table) /* - Add 'information_schema' name to db_names list + Create db names list. Information schema name always is first in list SYNOPSIS - schema_db_add() + make_db_list() thd thread handler files list of db names wild wild string + idx_field_vals idx_field_vals->db_name contains db name or + wild string with_i_schema returns 1 if we added 'IS' name to list otherwise returns 0 + is_wild_value if value is 1 then idx_field_vals->db_name is + wild string otherwise it's db name; RETURN 1 error 0 success */ -int schema_db_add(THD *thd, List *files, - const char *wild, bool *with_i_schema) +int make_db_list(THD *thd, List *files, + INDEX_FIELD_VALUES *idx_field_vals, + bool *with_i_schema, bool is_wild_value) { + LEX *lex= thd->lex; *with_i_schema= 0; - if (!wild || !wild_compare(information_schema_name.str, wild, 0)) + get_index_field_values(lex, idx_field_vals); + if (is_wild_value) { - *with_i_schema= 1; - if (files->push_back(thd->strdup(information_schema_name.str))) - return 1; + /* + This part of code is only for SHOW DATABASES command. + idx_field_vals->db_value can be 0 when we don't use + LIKE clause (see also get_index_field_values() function) + */ + if (!idx_field_vals->db_value || + !wild_case_compare(system_charset_info, + information_schema_name.str, + idx_field_vals->db_value)) + { + *with_i_schema= 1; + if (files->push_back(thd->strdup(information_schema_name.str))) + return 1; + } + return mysql_find_files(thd, files, NullS, mysql_data_home, + idx_field_vals->db_value, 1); } - return 0; + + /* + This part of code is for SHOW TABLES, SHOW TABLE STATUS commands. + idx_field_vals->db_value can't be 0 (see get_index_field_values() + function). lex->orig_sql_command can be not equal to SQLCOM_END + only in case of executing of SHOW commands. + */ + if (lex->orig_sql_command != SQLCOM_END) + { + if (!my_strcasecmp(system_charset_info, information_schema_name.str, + idx_field_vals->db_value)) + { + *with_i_schema= 1; + return files->push_back(thd->strdup(information_schema_name.str)); + } + return files->push_back(thd->strdup(idx_field_vals->db_value)); + } + + /* + Create list of existing databases. It is used in case + of select from information schema table + */ + if (files->push_back(thd->strdup(information_schema_name.str))) + return 1; + *with_i_schema= 1; + return mysql_find_files(thd, files, NullS, mysql_data_home, NullS, 1); } @@ -1882,14 +1927,9 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) if (schema_table_idx == SCH_TABLES) lock_type= TL_READ; - get_index_field_values(lex, &idx_field_vals); - /* information schema name always is first in list */ - if (schema_db_add(thd, &bases, idx_field_vals.db_value, &with_i_schema)) - goto err; - - if (mysql_find_files(thd, &bases, NullS, mysql_data_home, - idx_field_vals.db_value, 1)) + if (make_db_list(thd, &bases, &idx_field_vals, + &with_i_schema, 0)) goto err; partial_cond= make_cond_for_info_schema(cond, tables); @@ -2025,13 +2065,10 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond) TABLE *table= tables->table; DBUG_ENTER("fill_schema_shemata"); - get_index_field_values(thd->lex, &idx_field_vals); - /* information schema name always is first in list */ - if (schema_db_add(thd, &files, idx_field_vals.db_value, &with_i_schema)) - DBUG_RETURN(1); - if (mysql_find_files(thd, &files, NullS, mysql_data_home, - idx_field_vals.db_value, 1)) + if (make_db_list(thd, &files, &idx_field_vals, + &with_i_schema, 1)) DBUG_RETURN(1); + List_iterator_fast it(files); while ((file_name=it++)) {