summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjimw@rama.(none) <>2006-09-01 10:39:48 -0700
committerjimw@rama.(none) <>2006-09-01 10:39:48 -0700
commitbfb06f15fd119772f79939dd2624d513b402f693 (patch)
tree227afaf6e33755616cbe37415b217a4d67a062c1
parentebf482c4474b8e7ce7c33a9d0db79a05cc7678d4 (diff)
downloadmariadb-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.result15
-rw-r--r--mysql-test/t/show_check.test13
-rw-r--r--sql/sql_parse.cc36
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
****************************************************************************/