summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2014-03-29 11:33:25 +0100
committerSergei Golubchik <sergii@pisem.net>2014-03-29 11:33:25 +0100
commit0643d1f3191a387cf99e7c505dde7b829ce2b03d (patch)
treeb2ac2af19b6f7c90feb0299b1df57ea81ebbdc6c /sql
parent73f48615754833e637ba05d2a0d92a0ea5c2d5cf (diff)
downloadmariadb-git-0643d1f3191a387cf99e7c505dde7b829ce2b03d.tar.gz
another post-fix patch for MDEV-5850: MySQL Bug#21317: SHOW CREATE DATABASE does not obey to lower_case_table_names
(for case-insensitive filesystems) sql/events.cc: for "SHOW EVENTS IN db_name" sql/sp_head.h: for "CREATE EVENT", and everything SP-related sql/sql_acl.cc: privilege check for mysql_change_db() sql/sql_db.cc: for metadata locking of db names sql/sql_parse.cc: any_db is a constant, it is not writable sql/sql_show.cc: for SHOW CREATE TRIGGER and other trigger-related statements
Diffstat (limited to 'sql')
-rw-r--r--sql/events.cc3
-rw-r--r--sql/sp_head.h2
-rw-r--r--sql/sql_acl.cc12
-rw-r--r--sql/sql_db.cc41
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_show.cc3
6 files changed, 45 insertions, 18 deletions
diff --git a/sql/events.cc b/sql/events.cc
index 505710b3ccd..0c0fb0d5a38 100644
--- a/sql/events.cc
+++ b/sql/events.cc
@@ -764,6 +764,9 @@ Events::fill_schema_events(THD *thd, TABLE_LIST *tables, COND * /* cond */)
NULL, NULL, 0, 0))
DBUG_RETURN(1);
db= thd->lex->select_lex.db;
+
+ if (lower_case_table_names)
+ my_casedn_str(system_charset_info, db);
}
ret= db_repository->fill_schema_events(thd, tables, db);
diff --git a/sql/sp_head.h b/sql/sp_head.h
index c1fb455e103..cc598186d08 100644
--- a/sql/sp_head.h
+++ b/sql/sp_head.h
@@ -122,6 +122,8 @@ public:
sp_name(LEX_STRING db, LEX_STRING name, bool use_explicit_name)
: m_db(db), m_name(name), m_explicit_name(use_explicit_name)
{
+ if (lower_case_table_names && m_db.str)
+ m_db.length= my_casedn_str(files_charset_info, m_db.str);
m_qname.str= 0;
m_qname.length= 0;
}
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 4b139405671..130113c17f1 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -7118,16 +7118,22 @@ bool check_grant_db(THD *thd, const char *db)
{
Security_context *sctx= thd->security_ctx;
char helping [SAFE_NAME_LEN + USERNAME_LENGTH+2], *end;
- char helping2 [SAFE_NAME_LEN + USERNAME_LENGTH+2];
+ char helping2 [SAFE_NAME_LEN + USERNAME_LENGTH+2], *tmp_db;
uint len, UNINIT_VAR(len2);
bool error= TRUE;
- end= strmov(helping, sctx->priv_user) + 1;
- end= strnmov(end, db, helping + sizeof(helping) - end);
+ tmp_db= strmov(helping, sctx->priv_user) + 1;
+ end= strnmov(tmp_db, db, helping + sizeof(helping) - tmp_db);
if (end >= helping + sizeof(helping)) // db name was truncated
return 1; // no privileges for an invalid db name
+ if (lower_case_table_names)
+ {
+ end = tmp_db + my_casedn_str(files_charset_info, tmp_db);
+ db=tmp_db;
+ }
+
len= (uint) (end - helping) + 1;
/*
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 6c823e0480c..063b90a6780 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -579,7 +579,17 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info,
DBUG_RETURN(-1);
}
- if (lock_schema_name(thd, db))
+ char db_tmp[SAFE_NAME_LEN], *dbnorm;
+ if (lower_case_table_names)
+ {
+ strmake_buf(db_tmp, db);
+ my_casedn_str(system_charset_info, db_tmp);
+ dbnorm= db_tmp;
+ }
+ else
+ dbnorm= db;
+
+ if (lock_schema_name(thd, dbnorm))
DBUG_RETURN(-1);
/* Check directory */
@@ -783,7 +793,17 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
Drop_table_error_handler err_handler;
DBUG_ENTER("mysql_rm_db");
- if (lock_schema_name(thd, db))
+ char db_tmp[SAFE_NAME_LEN], *dbnorm;
+ if (lower_case_table_names)
+ {
+ strmake_buf(db_tmp, db);
+ my_casedn_str(system_charset_info, db_tmp);
+ dbnorm= db_tmp;
+ }
+ else
+ dbnorm= db;
+
+ if (lock_schema_name(thd, dbnorm))
DBUG_RETURN(true);
length= build_table_filename(path, sizeof(path) - 1, db, "", "", 0);
@@ -808,7 +828,7 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
}
}
- if (find_db_tables_and_rm_known_files(thd, dirp, db, path, &tables))
+ if (find_db_tables_and_rm_known_files(thd, dirp, dbnorm, path, &tables))
goto exit;
/*
@@ -825,7 +845,7 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
/* Lock all tables and stored routines about to be dropped. */
if (lock_table_names(thd, tables, NULL, thd->variables.lock_wait_timeout,
0) ||
- lock_db_routines(thd, db))
+ lock_db_routines(thd, dbnorm))
goto exit;
if (!in_bootstrap)
@@ -872,10 +892,10 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
ha_drop_database(path);
tmp_disable_binlog(thd);
- query_cache_invalidate1(thd, db);
- (void) sp_drop_db_routines(thd, db); /* @todo Do not ignore errors */
+ query_cache_invalidate1(thd, dbnorm);
+ (void) sp_drop_db_routines(thd, dbnorm); /* @todo Do not ignore errors */
#ifdef HAVE_EVENT_SCHEDULER
- Events::drop_schema_events(thd, db);
+ Events::drop_schema_events(thd, dbnorm);
#endif
reenable_binlog(thd);
@@ -1013,13 +1033,6 @@ static bool find_db_tables_and_rm_known_files(THD *thd, MY_DIR *dirp,
/* Now put the tables in the list */
tot_list_next_local= tot_list_next_global= &tot_list;
- if (lower_case_table_names)
- {
- /* Change database name to lower case for comparision */
- db.str= thd->strmake(db.str, db.length);
- db.length= my_casedn_str(files_charset_info, db.str);
- }
-
for (size_t idx=0; idx < files.elements(); idx++)
{
LEX_STRING *table= files.at(idx);
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 6a5073be3a7..055317f0445 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -6758,7 +6758,7 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
{
if (table->table.length)
table->table.length= my_casedn_str(files_charset_info, table->table.str);
- if (ptr->db_length)
+ if (ptr->db_length && ptr->db != any_db)
ptr->db_length= my_casedn_str(files_charset_info, ptr->db);
}
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 43a5d1ffec7..15d353c087a 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -9381,6 +9381,9 @@ TABLE_LIST *get_trigger_table(THD *thd, const sp_name *trg_name)
db= trg_name->m_db;
db.str= thd->strmake(db.str, db.length);
+ if (lower_case_table_names)
+ db.length= my_casedn_str(files_charset_info, db.str);
+
tbl_name.str= thd->strmake(tbl_name.str, tbl_name.length);
if (db.str == NULL || tbl_name.str == NULL)