@ -784,7 +784,7 @@ exit:
bool mysql_rm_db ( THD * thd , char * db , bool if_exists , bool silent )
{
ulong deleted_tables = 0 ;
bool error = true ;
bool error = true , rm_mysql_schema ;
char path [ FN_REFLEN + 16 ] ;
MY_DIR * dirp ;
uint length ;
@ -809,6 +809,18 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
length = build_table_filename ( path , sizeof ( path ) - 1 , db , " " , " " , 0 ) ;
strmov ( path + length , MY_DB_OPT_FILE ) ; // Append db option file name
del_dbopt ( path ) ; // Remove dboption hash entry
/*
Now remove the db . opt file .
The ' find_db_tables_and_rm_known_files ' doesn ' t remove this file
if there exists a table with the name ' db ' , so let ' s just do it
separately . We know this file exists and needs to be deleted anyway .
*/
if ( my_delete_with_symlink ( path , MYF ( 0 ) ) & & my_errno ! = ENOENT )
{
my_error ( EE_DELETE , MYF ( 0 ) , path , my_errno ) ;
DBUG_RETURN ( true ) ;
}
path [ length ] = ' \0 ' ; // Remove file name
/* See if the directory exists */
@ -835,7 +847,8 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
Disable drop of enabled log tables , must be done before name locking .
This check is only needed if we are dropping the " mysql " database .
*/
if ( ( my_strcasecmp ( system_charset_info , MYSQL_SCHEMA_NAME . str , db ) = = 0 ) )
if ( ( rm_mysql_schema =
( my_strcasecmp ( system_charset_info , MYSQL_SCHEMA_NAME . str , db ) = = 0 ) ) )
{
for ( table = tables ; table ; table = table - > next_local )
if ( check_if_log_table ( table , TRUE , " DROP " ) )
@ -848,7 +861,7 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
lock_db_routines ( thd , dbnorm ) )
goto exit ;
if ( ! in_bootstrap )
if ( ! in_bootstrap & & ! rm_mysql_schema )
{
for ( table = tables ; table ; table = table - > next_local )
{
@ -893,10 +906,13 @@ 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 , dbnorm ) ;
( void ) sp_drop_db_routines ( thd , dbnorm ) ; /* @todo Do not ignore errors */
if ( ! rm_mysql_schema )
{
( void ) sp_drop_db_routines ( thd , dbnorm ) ; /* @todo Do not ignore errors */
# ifdef HAVE_EVENT_SCHEDULER
Events : : drop_schema_events ( thd , dbnorm ) ;
Events : : drop_schema_events ( thd , dbnorm ) ;
# endif
}
reenable_binlog ( thd ) ;
/*