diff options
author | unknown <dlenev@mysql.com> | 2006-02-24 23:50:36 +0300 |
---|---|---|
committer | unknown <dlenev@mysql.com> | 2006-02-24 23:50:36 +0300 |
commit | f8386dfa4821b79b6f88f8d9950ed370ba22e508 (patch) | |
tree | cd355e9fb3c3537be6b3aae48e6d5eb5276fe04c /sql/sql_table.cc | |
parent | b479c27f440cefd679498286d9c904efd647805c (diff) | |
download | mariadb-git-f8386dfa4821b79b6f88f8d9950ed370ba22e508.tar.gz |
Fix for bug #13525 "Rename table does not keep info of triggers".
Let us transfer triggers associated with table when we rename it (but only if
we are not changing database to which table belongs, in the latter case we will
emit error).
mysql-test/r/trigger.result:
Added test for bug #13525 "Rename table does not keep info of triggers".
mysql-test/t/trigger.test:
Added test for bug #13525 "Rename table does not keep info of triggers".
sql/sql_rename.cc:
rename_tables():
Now after renaming table's .FRM file and updating handler data we call
Table_triggers_list::change_table_name() which is reponsible for
updating .TRG and .TRN files.
sql/sql_table.cc:
mysql_alter_table():
Now in case when ALTER should rename table we call
Table_triggers_list::change_table_name() which is responsible
for updating .TRG and .TRN files after renaming table.
sql/sql_trigger.cc:
Added Table_triggers_list::change_table_name() method and
change_table_name_in_triggers()/trignames() methods responsible for updating
.TRG and .TRN files for table during its renaming.
Two small cleanups - removed versioning for .TRG files (since it was not working
before anyway) and emphasized that type of lock specified in tables list is
unimportant for DROP TABLE (since this statement uses name-locking).
sql/sql_trigger.h:
Table_triggers_list:
Added on_table_names_list member to store pointers and lenghts of
"ON table_name" parts in triggers' definitions to be able easily
change them during RENAME TABLE.
Added change_table_name() method and change_table_name_in_trignames/triggers()
helper methods responsible for updating .TRG and .TRN files.
sql/sql_yacc.yy:
trigger_tail:
To be able properly update triggers' definitions with new table names
when renaming tables we need to know where in CREATE TRIGGER statement
"ON db_name.table_name" part resides.
Small cleanup - let us emphasize that for CREATE TRIGGER statement
lock type which is specified in table list is unimportant since
name-locking is used.
Diffstat (limited to 'sql/sql_table.cc')
-rw-r--r-- | sql/sql_table.cc | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/sql/sql_table.cc b/sql/sql_table.cc index ba4a606537f..b3fc24f3a4d 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3258,6 +3258,13 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, close_cached_table(thd, table); if (mysql_rename_table(old_db_type,db,table_name,new_db,new_alias)) error= -1; + else if (Table_triggers_list::change_table_name(thd, db, table_name, + new_db, new_alias)) + { + VOID(mysql_rename_table(old_db_type, new_db, new_alias, db, + table_name)); + error= -1; + } } VOID(pthread_mutex_unlock(&LOCK_open)); } @@ -3806,7 +3813,11 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, VOID(quick_rm_table(new_db_type,new_db,tmp_name)); } else if (mysql_rename_table(new_db_type,new_db,tmp_name,new_db, - new_alias)) + new_alias) || + (new_name != table_name || new_db != db) && // we also do rename + Table_triggers_list::change_table_name(thd, db, table_name, + new_db, new_alias)) + { // Try to get everything back error=1; VOID(quick_rm_table(new_db_type,new_db,new_alias)); |