diff options
author | jimw@rama.(none) <> | 2006-09-01 10:39:48 -0700 |
---|---|---|
committer | jimw@rama.(none) <> | 2006-09-01 10:39:48 -0700 |
commit | bfb06f15fd119772f79939dd2624d513b402f693 (patch) | |
tree | 227afaf6e33755616cbe37415b217a4d67a062c1 | |
parent | ebf482c4474b8e7ce7c33a9d0db79a05cc7678d4 (diff) | |
download | mariadb-git-bfb06f15fd119772f79939dd2624d513b402f693.tar.gz |
Bug #19874: SHOW COLUMNS and SHOW KEYS handle identifiers containing \ incorrectly
Identifiers with embedded escape characters were not handled correctly by
some SHOW statements due to some old code that was doing some extra unescaping.
-rw-r--r-- | mysql-test/r/show_check.result | 15 | ||||
-rw-r--r-- | mysql-test/t/show_check.test | 13 | ||||
-rw-r--r-- | sql/sql_parse.cc | 36 |
3 files changed, 28 insertions, 36 deletions
diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 7759a6f1f7f..b473bbac923 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -695,4 +695,19 @@ Level Code Message Warning 1541 The syntax 'SHOW PLUGIN' is deprecated and will be removed in MySQL 5.2. Please use 'SHOW PLUGINS' instead show plugin; show plugins; +create database `mysqlttest\1`; +create table `mysqlttest\1`.`a\b` (a int); +show tables from `mysqlttest\1`; +Tables_in_mysqlttest\1 +a\b +show fields from `mysqlttest\1`.`a\b`; +Field Type Null Key Default Extra +a int(11) YES NULL +show columns from `a\b` from `mysqlttest\1`; +Field Type Null Key Default Extra +a int(11) YES NULL +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`; End of 5.1 tests diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index e99387bf695..553b3d9059b 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -539,4 +539,17 @@ show plugin; show plugins; --enable_result_log +# +# Bug #19874: SHOW COLUMNS and SHOW KEYS handle identifiers containing +# \ incorrectly +# +create database `mysqlttest\1`; +create table `mysqlttest\1`.`a\b` (a int); +show tables from `mysqlttest\1`; +show fields from `mysqlttest\1`.`a\b`; +show columns from `a\b` from `mysqlttest\1`; +show keys from `mysqlttest\1`.`a\b`; +drop table `mysqlttest\1`.`a\b`; +drop database `mysqlttest\1`; + --echo End of 5.1 tests diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 63de7bb1930..70e2051cab8 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -67,7 +67,6 @@ static int check_for_max_user_connections(THD *thd, USER_CONN *uc); static void decrease_user_connections(USER_CONN *uc); #endif /* NO_EMBEDDED_ACCESS_CHECKS */ static bool check_multi_update_lock(THD *thd); -static void remove_escape(char *name); static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables); const char *any_db="*any*"; // Special symbol for check_access @@ -1442,7 +1441,6 @@ int mysql_table_dump(THD* thd, char* db, char* tbl_name) } if (lower_case_table_names) my_casedn_str(files_charset_info, tbl_name); - remove_escape(table_list->table_name); if (!(table=open_ltable(thd, table_list, TL_READ_NO_INSERT))) DBUG_RETURN(1); @@ -1909,7 +1907,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd, general_log_print(thd, command, "%s %s", table_list.table_name, fields); if (lower_case_table_names) my_casedn_str(files_charset_info, table_list.table_name); - remove_escape(table_list.table_name); // This can't have wildcards if (check_access(thd,SELECT_ACL,table_list.db,&table_list.grant.privilege, 0, 0, test(table_list.schema_table))) @@ -2299,7 +2296,6 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident, DBUG_RETURN(1); } db= lex->select_lex.db; - remove_escape(db); // Fix escaped '_' if (check_db_name(db)) { my_error(ER_WRONG_DB_NAME, MYF(0), db); @@ -2338,8 +2334,6 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident, lex->query_tables_last= query_tables_last; TABLE_LIST *table_list= (TABLE_LIST*) sel->table_list.first; char *db= table_list->db; - remove_escape(db); // Fix escaped '_' - remove_escape(table_list->table_name); if (check_access(thd,SELECT_ACL | EXTRA_ACL,db, &table_list->grant.privilege, 0, 0, test(table_list->schema_table))) @@ -6274,36 +6268,6 @@ add_proc_to_list(THD* thd, Item *item) } -/* Fix escaping of _, % and \ in database and table names (for ODBC) */ - -static void remove_escape(char *name) -{ - if (!*name) // For empty DB names - return; - char *to; -#ifdef USE_MB - char *strend=name+(uint) strlen(name); -#endif - for (to=name; *name ; name++) - { -#ifdef USE_MB - int l; - if (use_mb(system_charset_info) && - (l = my_ismbchar(system_charset_info, name, strend))) - { - while (l--) - *to++ = *name++; - name--; - continue; - } -#endif - if (*name == '\\' && name[1]) - name++; // Skip '\\' - *to++= *name; - } - *to=0; -} - /**************************************************************************** ** save order by and tables in own lists ****************************************************************************/ |