Commit 7d883c0d authored by unknown's avatar unknown
Browse files

Bug#24478 DROP TRIGGER is not caught by replicate-*-table filters

Problem: DROP TRIGGER was not properly handled in combination
with slave filters, which made replication stop
Fix: loading table name before checking slave filters when
dropping a trigger.


mysql-test/r/rpl_replicate_do.result:
  Adding test case
mysql-test/t/rpl_replicate_do.test:
  Adding test case
sql/sql_parse.cc:
  Loading table name when dropping a trigger
  before checking slave filtering rules.
sql/sql_trigger.cc:
  Making add_table_for_trigger() public
sql/sql_trigger.h:
  Making add_table_for_trigger() public
parent 3a05847a
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -41,3 +41,37 @@ select * from t1;
ts
2005-08-12 00:00:00
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;
+32 −0
Original line number Diff line number Diff line
@@ -59,3 +59,35 @@ drop table t1;
sync_slave_with_master;

# 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;
+25 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include "sp_head.h"
#include "sp.h"
#include "sp_cache.h"
#include "sql_trigger.h"

#ifdef HAVE_OPENSSL
/*
@@ -2485,6 +2486,30 @@ mysql_execute_command(THD *thd)
#ifdef HAVE_REPLICATION
  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
      rules
+1 −5
Original line number Diff line number Diff line
@@ -107,10 +107,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
{
private:
@@ -1183,7 +1179,7 @@ bool Table_triggers_list::get_trigger_info(THD *thd, trg_event_type event,
    1 Error
*/

static int
int
add_table_for_trigger(THD *thd, sp_name *trig, bool if_exists,
                      TABLE_LIST **table)
{
+4 −0
Original line number Diff line number Diff line
@@ -139,3 +139,7 @@ class Table_triggers_list: public Sql_alloc

extern const LEX_STRING trg_action_time_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);