diff options
author | georg@lmy002.wdf.sap.corp <> | 2005-09-16 17:13:21 +0200 |
---|---|---|
committer | georg@lmy002.wdf.sap.corp <> | 2005-09-16 17:13:21 +0200 |
commit | afe8dcf2e79a77f955150312b79ba704bb20c8c7 (patch) | |
tree | 42699dfbd0ad93df462e371d7a4a287bd38af876 /sql/sql_rename.cc | |
parent | ff4a6e139e2a0b8d382dfadeff2cdc06b19c72a7 (diff) | |
download | mariadb-git-afe8dcf2e79a77f955150312b79ba704bb20c8c7.tar.gz |
Fix for bug#5508 after Sanja's review
Diffstat (limited to 'sql/sql_rename.cc')
-rw-r--r-- | sql/sql_rename.cc | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/sql/sql_rename.cc b/sql/sql_rename.cc index 3880aa428b9..b848809ccc9 100644 --- a/sql/sql_rename.cc +++ b/sql/sql_rename.cc @@ -133,6 +133,7 @@ static TABLE_LIST * rename_tables(THD *thd, TABLE_LIST *table_list, bool skip_error) { TABLE_LIST *ren_table,*new_table; + frm_type_enum frm_type; DBUG_ENTER("rename_tables"); for (ren_table= table_list; ren_table; ren_table= new_table->next_local) @@ -164,18 +165,35 @@ rename_tables(THD *thd, TABLE_LIST *table_list, bool skip_error) ren_table->db, old_alias, reg_ext); unpack_filename(name, name); - if ((table_type=get_table_type(thd, name)) == DB_TYPE_UNKNOWN) + if ((frm_type= mysql_frm_type(name)) == FRMTYPE_TABLE && + (table_type= get_table_type(thd, name)) == DB_TYPE_UNKNOWN) { my_error(ER_FILE_NOT_FOUND, MYF(0), name, my_errno); if (!skip_error) - DBUG_RETURN(ren_table); + DBUG_RETURN(ren_table); } - else if (mysql_rename_table(table_type, - ren_table->db, old_alias, - new_table->db, new_alias)) - { - if (!skip_error) - DBUG_RETURN(ren_table); + else { + int rc= 1; + switch (frm_type) + { + case FRMTYPE_TABLE: + rc= mysql_rename_table(table_type, ren_table->db, old_alias, + new_table->db, new_alias); + break; + case FRMTYPE_VIEW: + /* change of schema is not allowed */ + if (strcmp(ren_table->db, new_table->db)) + my_error(ER_FORBID_SCHEMA_CHANGE, MYF(0), ren_table->db, + new_table->db); + else + rc= mysql_rename_view(thd, new_alias, ren_table); + break; + case FRMTYPE_ERROR: + default: + my_error(ER_FILE_NOT_FOUND, MYF(0), name, my_errno); + } + if (rc && !skip_error) + DBUG_RETURN(ren_table); } } DBUG_RETURN(0); |