diff --git a/mysql-test/r/trigger.result b/mysql-test/r/trigger.result index 4a85097cfcea400b181a761d0059c13e7613d27d..cf0e0e8f56453d4600d63ac4b33bb2279157e417 100644 --- a/mysql-test/r/trigger.result +++ b/mysql-test/r/trigger.result @@ -1,5 +1,6 @@ drop table if exists t1, t2; drop view if exists v1; +drop database if exists mysqltest; create table t1 (i int); create trigger trg before insert on t1 for each row set @a:=1; set @a:=0; @@ -190,3 +191,18 @@ select @del_before, @del_after; drop trigger t1.trg1; drop trigger t1.trg2; drop table t1; +create table t1 (a int); +create trigger trg1 before insert on t1 for each row set new.a= 10; +drop table t1; +create table t1 (a int); +insert into t1 values (); +select * from t1; +a +NULL +drop table t1; +create database mysqltest; +use mysqltest; +create table t1 (i int); +create trigger trg1 before insert on t1 for each row set @a:= 1; +drop database mysqltest; +use test; diff --git a/mysql-test/t/trigger.test b/mysql-test/t/trigger.test index bf75f09d55333c5be1863b76f4e6727eb6736773..53144cf35919812b0cd62c2ec6a165fd44a38a7a 100644 --- a/mysql-test/t/trigger.test +++ b/mysql-test/t/trigger.test @@ -5,6 +5,7 @@ --disable_warnings drop table if exists t1, t2; drop view if exists v1; +drop database if exists mysqltest; --enable_warnings create table t1 (i int); @@ -229,3 +230,22 @@ select @del_before, @del_after; drop trigger t1.trg1; drop trigger t1.trg2; drop table t1; + +# Test for bug #5859 "DROP TABLE does not drop triggers". Trigger should not +# magically reappear when we recreate dropped table. +create table t1 (a int); +create trigger trg1 before insert on t1 for each row set new.a= 10; +drop table t1; +create table t1 (a int); +insert into t1 values (); +select * from t1; +drop table t1; + +# Test for bug #6559 "DROP DATABASE forgets to drop triggers". +create database mysqltest; +use mysqltest; +create table t1 (i int); +create trigger trg1 before insert on t1 for each row set @a:= 1; +# This should succeed +drop database mysqltest; +use test; diff --git a/sql/handler.cc b/sql/handler.cc index 143e56fdc7cceaccdc0c7c6233b0be800579e399..330ea83566cb09307ae1a97344aea1d0da5c1894 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -2367,6 +2367,7 @@ TYPELIB *ha_known_exts(void) known_extensions_id= mysys_usage_id; found_exts.push_back((char*) ".db"); + found_exts.push_back((char*) triggers_file_ext); for (types= sys_table_types; types->type; types++) { if (*types->value == SHOW_OPTION_YES) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 7e4c6675e45a7f7a563a42940c21e4343327cb42..2685da9780be118c76580cb8b15714c120274e1d 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -1044,6 +1044,7 @@ extern const char *first_keyword, *my_localhost, *delayed_user, *binary_keyword; extern const char **errmesg; /* Error messages */ extern const char *myisam_recover_options_str; extern const char *in_left_expr_name, *in_additional_cond; +extern const char * const triggers_file_ext; extern Eq_creator eq_creator; extern Ne_creator ne_creator; extern Gt_creator gt_creator; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index e2dcd71afb40adf76e4d9fd81b24a23687c07649..4105d63330a2191a3ddc00ecd9686d42033a4fe7 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -257,7 +257,19 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, /* Delete the table definition file */ strmov(end,reg_ext); if (!(new_error=my_delete(path,MYF(MY_WME)))) + { some_tables_deleted=1; + /* + Destroy triggers for this table if there are any. + + We won't need this as soon as we will have new .FRM format, + in which we will store trigger definitions in the same .FRM + files as table descriptions. + */ + strmov(end, triggers_file_ext); + if (!access(path, F_OK)) + new_error= my_delete(path, MYF(MY_WME)); + } error|= new_error; } } diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 110841e8fd428d82b54f4b1c72434b4764d741e2..5b6f12eab52c7d2b15505480a2f46e7d3602d0d1 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -4,7 +4,8 @@ #include "parse_file.h" static const LEX_STRING triggers_file_type= {(char *)"TRIGGERS", 8}; -static const char * const triggers_file_ext= ".TRG"; + +const char * const triggers_file_ext= ".TRG"; /* Table of .TRG file field descriptors.