summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <gluh@mysql.com>2005-05-10 18:35:11 +0000
committerunknown <gluh@mysql.com>2005-05-10 18:35:11 +0000
commit525f584781646608a54dd2243772695f05c1550d (patch)
treea83ce6a5d07d8590dda250f4192d84ee3753dc63
parent68768185734824a9dffeea5656f2fb5280d1f3a1 (diff)
parent4653d7e16c945ce4a2785f0258c2fa4f14a33ef7 (diff)
downloadmariadb-git-525f584781646608a54dd2243772695f05c1550d.tar.gz
Merge sgluhov@bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/gluh/MySQL/Devel/mysql-5.0 sql/sql_show.cc: Auto merged
-rw-r--r--mysql-test/r/information_schema_db.result28
-rw-r--r--mysql-test/t/information_schema_db.test9
-rw-r--r--sql/sql_show.cc81
3 files changed, 96 insertions, 22 deletions
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<char> *files,
- const char *wild, bool *with_i_schema)
+int make_db_list(THD *thd, List<char> *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<char> it(files);
while ((file_name=it++))
{