Merge abarkov@bk-internal.mysql.com:/home/bk/mysql-5.0-rpl
into mysql.com:/home/bar/mysql-5.0.b24478
This commit is contained in:
commit
75177d9cf8
@ -41,3 +41,37 @@ select * from t1;
|
|||||||
ts
|
ts
|
||||||
2005-08-12 00:00:00
|
2005-08-12 00:00:00
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
*** master ***
|
||||||
|
create table t1 (a int, b int);
|
||||||
|
create trigger trg1 before insert on t1 for each row set new.b=2;
|
||||||
|
create table t2 (a int, b int);
|
||||||
|
create trigger trg2 before insert on t2 for each row set new.b=2;
|
||||||
|
show tables;
|
||||||
|
Tables_in_test
|
||||||
|
t1
|
||||||
|
t2
|
||||||
|
show triggers;
|
||||||
|
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||||
|
trg1 INSERT t1 set new.b=2 BEFORE NULL root@localhost
|
||||||
|
trg2 INSERT t2 set new.b=2 BEFORE NULL root@localhost
|
||||||
|
*** slave ***
|
||||||
|
show tables;
|
||||||
|
Tables_in_test
|
||||||
|
t1
|
||||||
|
show triggers;
|
||||||
|
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||||
|
trg1 INSERT t1 set new.b=2 BEFORE NULL root@localhost
|
||||||
|
*** master ***
|
||||||
|
drop trigger trg1;
|
||||||
|
drop trigger trg2;
|
||||||
|
show triggers;
|
||||||
|
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||||
|
*** slave ***
|
||||||
|
show tables;
|
||||||
|
Tables_in_test
|
||||||
|
t1
|
||||||
|
show triggers;
|
||||||
|
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||||
|
*** master ***
|
||||||
|
drop table t1;
|
||||||
|
drop table t2;
|
||||||
|
@ -59,3 +59,35 @@ drop table t1;
|
|||||||
sync_slave_with_master;
|
sync_slave_with_master;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#24478 DROP TRIGGER is not caught by replicate-*-table filters
|
||||||
|
#
|
||||||
|
--echo *** master ***
|
||||||
|
connection master;
|
||||||
|
create table t1 (a int, b int);
|
||||||
|
create trigger trg1 before insert on t1 for each row set new.b=2;
|
||||||
|
create table t2 (a int, b int);
|
||||||
|
create trigger trg2 before insert on t2 for each row set new.b=2;
|
||||||
|
show tables;
|
||||||
|
show triggers;
|
||||||
|
sync_slave_with_master;
|
||||||
|
--echo *** slave ***
|
||||||
|
connection slave;
|
||||||
|
show tables;
|
||||||
|
show triggers;
|
||||||
|
--echo *** master ***
|
||||||
|
connection master;
|
||||||
|
drop trigger trg1;
|
||||||
|
drop trigger trg2;
|
||||||
|
show triggers;
|
||||||
|
sync_slave_with_master;
|
||||||
|
--echo *** slave ***
|
||||||
|
connection slave;
|
||||||
|
show tables;
|
||||||
|
show triggers;
|
||||||
|
--echo *** master ***
|
||||||
|
connection master;
|
||||||
|
drop table t1;
|
||||||
|
drop table t2;
|
||||||
|
sync_slave_with_master;
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "sp_head.h"
|
#include "sp_head.h"
|
||||||
#include "sp.h"
|
#include "sp.h"
|
||||||
#include "sp_cache.h"
|
#include "sp_cache.h"
|
||||||
|
#include "sql_trigger.h"
|
||||||
|
|
||||||
#ifdef HAVE_OPENSSL
|
#ifdef HAVE_OPENSSL
|
||||||
/*
|
/*
|
||||||
@ -2491,6 +2492,30 @@ mysql_execute_command(THD *thd)
|
|||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
if (unlikely(thd->slave_thread))
|
if (unlikely(thd->slave_thread))
|
||||||
{
|
{
|
||||||
|
if (lex->sql_command == SQLCOM_DROP_TRIGGER)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
When dropping a trigger, we need to load its table name
|
||||||
|
before checking slave filter rules.
|
||||||
|
*/
|
||||||
|
add_table_for_trigger(thd, thd->lex->spname, 1, &all_tables);
|
||||||
|
|
||||||
|
if (!all_tables)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
If table name cannot be loaded,
|
||||||
|
it means the trigger does not exists possibly because
|
||||||
|
CREATE TRIGGER was previously skipped for this trigger
|
||||||
|
according to slave filtering rules.
|
||||||
|
Returning success without producing any errors in this case.
|
||||||
|
*/
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// force searching in slave.cc:tables_ok()
|
||||||
|
all_tables->updating= 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Check if statment should be skipped because of slave filtering
|
Check if statment should be skipped because of slave filtering
|
||||||
rules
|
rules
|
||||||
|
@ -106,10 +106,6 @@ const LEX_STRING trg_event_type_names[]=
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
add_table_for_trigger(THD *thd, sp_name *trig, bool if_exists,
|
|
||||||
TABLE_LIST ** table);
|
|
||||||
|
|
||||||
class Handle_old_incorrect_sql_modes_hook: public Unknown_key_hook
|
class Handle_old_incorrect_sql_modes_hook: public Unknown_key_hook
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -1182,7 +1178,7 @@ bool Table_triggers_list::get_trigger_info(THD *thd, trg_event_type event,
|
|||||||
1 Error
|
1 Error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
int
|
||||||
add_table_for_trigger(THD *thd, sp_name *trig, bool if_exists,
|
add_table_for_trigger(THD *thd, sp_name *trig, bool if_exists,
|
||||||
TABLE_LIST **table)
|
TABLE_LIST **table)
|
||||||
{
|
{
|
||||||
|
@ -139,3 +139,7 @@ private:
|
|||||||
|
|
||||||
extern const LEX_STRING trg_action_time_type_names[];
|
extern const LEX_STRING trg_action_time_type_names[];
|
||||||
extern const LEX_STRING trg_event_type_names[];
|
extern const LEX_STRING trg_event_type_names[];
|
||||||
|
|
||||||
|
int
|
||||||
|
add_table_for_trigger(THD *thd, sp_name *trig, bool if_exists,
|
||||||
|
TABLE_LIST **table);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user