Commit e95a62a7 authored by unknown's avatar unknown

Merge mysql.com:/nfsdisk1/lars/bk/mysql-5.0-rpl

into  mysql.com:/nfsdisk1/lars/bk/mysql-5.1-new-rpl


mysql-test/r/mysqlbinlog.result:
  Auto merged
mysql-test/r/rpl_replicate_do.result:
  Auto merged
mysql-test/t/mysqlbinlog.test:
  Auto merged
mysql-test/t/rpl_replicate_do.test:
  Auto merged
sql/mysql_priv.h:
  Auto merged
sql/mysqld.cc:
  Auto merged
sql/sql_repl.cc:
  Auto merged
sql/sql_trigger.cc:
  Auto merged
sql/sql_trigger.h:
  Auto merged
sql/slave.cc:
  Manual merge
sql/sql_insert.cc:
  Manual merge
sql/sql_parse.cc:
  Manual merge
sql/sql_yacc.yy:
  Manual merge
parents 683c1e6a 92e7cf15
...@@ -41,3 +41,37 @@ select * from t1; ...@@ -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;
...@@ -58,3 +58,35 @@ drop table t1; ...@@ -58,3 +58,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;
...@@ -99,7 +99,7 @@ void net_set_read_timeout(NET *net, uint timeout); ...@@ -99,7 +99,7 @@ void net_set_read_timeout(NET *net, uint timeout);
#define WARN_DEPRECATED(Thd,Ver,Old,New) \ #define WARN_DEPRECATED(Thd,Ver,Old,New) \
do { \ do { \
DBUG_ASSERT(strncmp(Ver, MYSQL_SERVER_VERSION, sizeof(Ver)-1) > 0); \ DBUG_ASSERT(strncmp(Ver, MYSQL_SERVER_VERSION, sizeof(Ver)-1) > 0); \
if (Thd != NULL) \ if (((gptr)Thd) != NULL) \
push_warning_printf(((THD *)Thd), MYSQL_ERROR::WARN_LEVEL_WARN, \ push_warning_printf(((THD *)Thd), MYSQL_ERROR::WARN_LEVEL_WARN, \
ER_WARN_DEPRECATED_SYNTAX, ER(ER_WARN_DEPRECATED_SYNTAX), \ ER_WARN_DEPRECATED_SYNTAX, ER(ER_WARN_DEPRECATED_SYNTAX), \
(Old), (Ver), (New)); \ (Old), (Ver), (New)); \
......
...@@ -7632,7 +7632,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -7632,7 +7632,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
if (!slave_warning_issued) //only show the warning once if (!slave_warning_issued) //only show the warning once
{ {
slave_warning_issued = true; slave_warning_issued = true;
WARN_DEPRECATED(0, "5.2", "for replication startup options", WARN_DEPRECATED(NULL, "5.2", "for replication startup options",
"'CHANGE MASTER'"); "'CHANGE MASTER'");
} }
break; break;
......
...@@ -53,6 +53,10 @@ ulonglong relay_log_space_limit = 0; ...@@ -53,6 +53,10 @@ ulonglong relay_log_space_limit = 0;
*/ */
int disconnect_slave_event_count = 0, abort_slave_event_count = 0; int disconnect_slave_event_count = 0, abort_slave_event_count = 0;
int events_till_abort = -1;
#ifndef DBUG_OFF
static int events_till_disconnect = -1;
#endif
typedef enum { SLAVE_THD_IO, SLAVE_THD_SQL} SLAVE_THD_TYPE; typedef enum { SLAVE_THD_IO, SLAVE_THD_SQL} SLAVE_THD_TYPE;
......
...@@ -362,6 +362,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -362,6 +362,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
List_item *values; List_item *values;
Name_resolution_context *context; Name_resolution_context *context;
Name_resolution_context_state ctx_state; Name_resolution_context_state ctx_state;
#ifndef EMBEDDED_LIBRARY
char *query= thd->query; char *query= thd->query;
/* /*
log_on is about delayed inserts only. log_on is about delayed inserts only.
...@@ -370,6 +371,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -370,6 +371,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
*/ */
bool log_on= ((thd->options & OPTION_BIN_LOG) || bool log_on= ((thd->options & OPTION_BIN_LOG) ||
(!(thd->security_ctx->master_access & SUPER_ACL))); (!(thd->security_ctx->master_access & SUPER_ACL)));
#endif
thr_lock_type lock_type = table_list->lock_type; thr_lock_type lock_type = table_list->lock_type;
Item *unused_conds= 0; Item *unused_conds= 0;
DBUG_ENTER("mysql_insert"); DBUG_ENTER("mysql_insert");
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "sp_cache.h" #include "sp_cache.h"
#include "events.h" #include "events.h"
#include "event_data_objects.h" #include "event_data_objects.h"
#include "sql_trigger.h"
/* Used in error handling only */ /* Used in error handling only */
#define SP_TYPE_STRING(LP) \ #define SP_TYPE_STRING(LP) \
...@@ -1596,6 +1597,30 @@ mysql_execute_command(THD *thd) ...@@ -1596,6 +1597,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[]= ...@@ -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:
...@@ -1180,7 +1176,7 @@ bool Table_triggers_list::get_trigger_info(THD *thd, trg_event_type event, ...@@ -1180,7 +1176,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)
{ {
......
...@@ -137,3 +137,7 @@ class Table_triggers_list: public Sql_alloc ...@@ -137,3 +137,7 @@ class Table_triggers_list: public Sql_alloc
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);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment