diff options
author | Sergei Golubchik <sergii@pisem.net> | 2014-03-29 11:33:25 +0100 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2014-03-29 11:33:25 +0100 |
commit | 0643d1f3191a387cf99e7c505dde7b829ce2b03d (patch) | |
tree | b2ac2af19b6f7c90feb0299b1df57ea81ebbdc6c /sql | |
parent | 73f48615754833e637ba05d2a0d92a0ea5c2d5cf (diff) | |
download | mariadb-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.cc | 3 | ||||
-rw-r--r-- | sql/sp_head.h | 2 | ||||
-rw-r--r-- | sql/sql_acl.cc | 12 | ||||
-rw-r--r-- | sql/sql_db.cc | 41 | ||||
-rw-r--r-- | sql/sql_parse.cc | 2 | ||||
-rw-r--r-- | sql/sql_show.cc | 3 |
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) |