Commit 7ff5b7a9 authored by Sergey Glukhov's avatar Sergey Glukhov

Bug#43385 Cannot ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME when Views exist(addon)

mysql_rename_view can not rename view if database is not the same.
The fix is to add new argument 'new_db' to mysql_rename_view() and
allow rename with different databases
(only for ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME).
parent 6c08e3c2
...@@ -116,6 +116,8 @@ show databases like '%a-b-c%'; ...@@ -116,6 +116,8 @@ show databases like '%a-b-c%';
ALTER DATABASE `#mysql50#a-b-c` UPGRADE DATA DIRECTORY NAME; ALTER DATABASE `#mysql50#a-b-c` UPGRADE DATA DIRECTORY NAME;
show databases like '%a-b-c%'; show databases like '%a-b-c%';
show create view `a-b-c`.v1; show create view `a-b-c`.v1;
--disable_ps_protocol
select * from `a-b-c`.v1; select * from `a-b-c`.v1;
--enable_ps_protocol
drop database `a-b-c`; drop database `a-b-c`;
use test; use test;
...@@ -302,6 +302,7 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, ...@@ -302,6 +302,7 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
@thd thread handler @thd thread handler
@param schema name of given schema @param schema name of given schema
@param old_name original file name @param old_name original file name
@param new_db new schema
@param new_name new file name @param new_name new file name
@retval @retval
...@@ -311,14 +312,14 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, ...@@ -311,14 +312,14 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
*/ */
my_bool rename_in_schema_file(THD *thd, my_bool rename_in_schema_file(THD *thd,
const char *schema, const char *old_name, const char *schema, const char *old_name,
const char *new_name) const char *new_db, const char *new_name)
{ {
char old_path[FN_REFLEN], new_path[FN_REFLEN], arc_path[FN_REFLEN]; char old_path[FN_REFLEN], new_path[FN_REFLEN], arc_path[FN_REFLEN];
build_table_filename(old_path, sizeof(old_path) - 1, build_table_filename(old_path, sizeof(old_path) - 1,
schema, old_name, reg_ext, 0); schema, old_name, reg_ext, 0);
build_table_filename(new_path, sizeof(new_path) - 1, build_table_filename(new_path, sizeof(new_path) - 1,
schema, new_name, reg_ext, 0); new_db, new_name, reg_ext, 0);
if (my_rename(old_path, new_path, MYF(MY_WME))) if (my_rename(old_path, new_path, MYF(MY_WME)))
return 1; return 1;
......
...@@ -83,7 +83,7 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, ...@@ -83,7 +83,7 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
uchar* base, File_option *parameters); uchar* base, File_option *parameters);
my_bool rename_in_schema_file(THD *thd, my_bool rename_in_schema_file(THD *thd,
const char *schema, const char *old_name, const char *schema, const char *old_name,
const char *new_name); const char *new_db, const char *new_name);
class File_parser: public Sql_alloc class File_parser: public Sql_alloc
{ {
......
...@@ -311,7 +311,7 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name, ...@@ -311,7 +311,7 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name,
my_error(ER_FORBID_SCHEMA_CHANGE, MYF(0), ren_table->db, my_error(ER_FORBID_SCHEMA_CHANGE, MYF(0), ren_table->db,
new_db); new_db);
else else
rc= mysql_rename_view(thd, new_alias, ren_table); rc= mysql_rename_view(thd, new_db, new_alias, ren_table);
break; break;
default: default:
DBUG_ASSERT(0); // should never happen DBUG_ASSERT(0); // should never happen
......
...@@ -1912,6 +1912,7 @@ int view_checksum(THD *thd, TABLE_LIST *view) ...@@ -1912,6 +1912,7 @@ int view_checksum(THD *thd, TABLE_LIST *view)
Parameters: Parameters:
thd thread handler thd thread handler
new_db new name of database
new_name new name of view new_name new name of view
view view view view
...@@ -1921,6 +1922,7 @@ int view_checksum(THD *thd, TABLE_LIST *view) ...@@ -1921,6 +1922,7 @@ int view_checksum(THD *thd, TABLE_LIST *view)
*/ */
bool bool
mysql_rename_view(THD *thd, mysql_rename_view(THD *thd,
const char *new_db,
const char *new_name, const char *new_name,
TABLE_LIST *view) TABLE_LIST *view)
{ {
...@@ -1959,16 +1961,16 @@ mysql_rename_view(THD *thd, ...@@ -1959,16 +1961,16 @@ mysql_rename_view(THD *thd,
goto err; goto err;
/* rename view and it's backups */ /* rename view and it's backups */
if (rename_in_schema_file(thd, view->db, view->table_name, new_name)) if (rename_in_schema_file(thd, view->db, view->table_name, new_db, new_name))
goto err; goto err;
dir.str= dir_buff; dir.str= dir_buff;
dir.length= build_table_filename(dir_buff, sizeof(dir_buff) - 1, dir.length= build_table_filename(dir_buff, sizeof(dir_buff) - 1,
view->db, "", "", 0); new_db, "", "", 0);
pathstr.str= path_buff; pathstr.str= path_buff;
pathstr.length= build_table_filename(path_buff, sizeof(path_buff) - 1, pathstr.length= build_table_filename(path_buff, sizeof(path_buff) - 1,
view->db, new_name, reg_ext, 0); new_db, new_name, reg_ext, 0);
file.str= pathstr.str + dir.length; file.str= pathstr.str + dir.length;
file.length= pathstr.length - dir.length; file.length= pathstr.length - dir.length;
...@@ -1977,7 +1979,7 @@ mysql_rename_view(THD *thd, ...@@ -1977,7 +1979,7 @@ mysql_rename_view(THD *thd,
(uchar*)&view_def, view_parameters)) (uchar*)&view_def, view_parameters))
{ {
/* restore renamed view in case of error */ /* restore renamed view in case of error */
rename_in_schema_file(thd, view->db, new_name, view->table_name); rename_in_schema_file(thd, new_db, new_name, view->db, view->table_name);
goto err; goto err;
} }
} else } else
......
...@@ -37,7 +37,8 @@ int view_checksum(THD *thd, TABLE_LIST *view); ...@@ -37,7 +37,8 @@ int view_checksum(THD *thd, TABLE_LIST *view);
extern TYPELIB updatable_views_with_limit_typelib; extern TYPELIB updatable_views_with_limit_typelib;
bool check_duplicate_names(List<Item>& item_list, bool gen_unique_view_names); bool check_duplicate_names(List<Item>& item_list, bool gen_unique_view_names);
bool mysql_rename_view(THD *thd, const char *new_name, TABLE_LIST *view); bool mysql_rename_view(THD *thd, const char *new_db, const char *new_name,
TABLE_LIST *view);
#define VIEW_ANY_ACL (SELECT_ACL | UPDATE_ACL | INSERT_ACL | DELETE_ACL) #define VIEW_ANY_ACL (SELECT_ACL | UPDATE_ACL | INSERT_ACL | DELETE_ACL)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment