From 6a7933cd848c004744fab34be214733396460404 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 23 Jan 2007 14:32:10 +0400 Subject: [PATCH] Bug#25081 SHOW FULL TABLES on table with latin chars in name fails Problem: The Table_type column of "SHOW FULL TABLES" displayed "ERROR" instead of "BASE TABLE" for tables having non-ascii characters in their names. Reason: tablename to filename encoding was missing, so mysql_frm_type() tried to open a wrong file name. Fix: adding tablename to filename encoding mysql-test/r/show_check.result: Adding test case mysql-test/t/show_check.test: Adding test case sql/sql_show.cc: Adding tablename to filename encoding. Removing variable "end" with is not used anymore. --- mysql-test/r/show_check.result | 8 ++++++++ mysql-test/t/show_check.test | 12 ++++++++++++ sql/sql_show.cc | 8 ++++---- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 73450c9a773..a8f524e07dd 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -730,4 +730,12 @@ show keys from `mysqlttest\1`.`a\b`; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment drop table `mysqlttest\1`.`a\b`; drop database `mysqlttest\1`; +set names utf8; +drop table if exists `été`; +create table `été` (field1 int); +show full tables; +Tables_in_test Table_type +été BASE TABLE +drop table `été`; +set names latin1; End of 5.1 tests diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index be803a74c7b..fb21b5ecaa0 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -563,4 +563,16 @@ show keys from `mysqlttest\1`.`a\b`; drop table `mysqlttest\1`.`a\b`; drop database `mysqlttest\1`; +# +# Bug#25081 SHOW FULL TABLES on table with latin chars in name fails +# +set names utf8; +--disable_warnings +drop table if exists `été`; +--enable_warnings +create table `été` (field1 int); +show full tables; +drop table `été`; +set names latin1; + --echo End of 5.1 tests diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 0ebccba43ca..29a8aa28da2 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2490,7 +2490,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) ST_SCHEMA_TABLE *schema_table= tables->schema_table; SELECT_LEX sel; INDEX_FIELD_VALUES idx_field_vals; - char path[FN_REFLEN], *end, *base_name, *orig_base_name, *file_name; + char path[FN_REFLEN], *base_name, *orig_base_name, *file_name; uint len; bool with_i_schema; enum enum_schema_tables schema_table_idx; @@ -2507,7 +2507,6 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) lex->view_prepare_mode= TRUE; DBUG_ENTER("get_all_tables"); - LINT_INIT(end); LINT_INIT(len); lex->reset_n_backup_query_tables_list(&query_tables_list_backup); @@ -2598,7 +2597,6 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) else { len= build_table_filename(path, sizeof(path), base_name, "", "", 0); - end= path + len; len= FN_LEN - len; find_files_result res= find_files(thd, &files, base_name, path, idx_field_vals.table_value, 0); @@ -2648,7 +2646,9 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) } else { - my_snprintf(end, len, "/%s%s", file_name, reg_ext); + build_table_filename(path, sizeof(path), + base_name, file_name, reg_ext, 0); + switch (mysql_frm_type(thd, path, ¬_used)) { case FRMTYPE_ERROR: table->field[3]->store(STRING_WITH_LEN("ERROR"),