Commit 8cc642d7 authored by unknown's avatar unknown

Quick backport of the following bugfix from MySQL 4.0.14.

DO NOT COPY THIS CODE TO 4.0. The bugfix is better in 4.0,
but here in 3.23 we don't want to add a new error code so
we just use ER_EMPTY_QUERY. Bug was:
"If a query was ignored on the slave (because of
@code{replicate-ignore-table} and other similar rules), the slave
still checked if the query got the same error code (0, no error) as on
the master. So if the master had an error on the query (for example,
``Duplicate entry'' in a multiple-row insert), then the slave stopped
and warned that the error codes didn't match. (Bug #797)"


sql/slave.cc:
  Ignore ER_EMPTY_QUERY as it is also a marker for "query was ignored because 
  of replicate-*-table rules".
sql/sql_parse.cc:
  In a slave thread, mark an ignored query (because of replicate-*-table rules)
  as empty. The caller, exec_event(), will understand this error code as "ignorable
  query, don't compare the error codes on master and slave".
parent 2a5e1057
...@@ -923,7 +923,8 @@ point. If you are sure that your master is ok, run this query manually on the\ ...@@ -923,7 +923,8 @@ point. If you are sure that your master is ok, run this query manually on the\
inline int ignored_error_code(int err_code) inline int ignored_error_code(int err_code)
{ {
return use_slave_mask && bitmap_is_set(&slave_error_mask, err_code); return ((err_code == ER_EMPTY_QUERY) ||
(use_slave_mask && bitmap_is_set(&slave_error_mask, err_code)));
} }
static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
......
...@@ -1085,7 +1085,19 @@ mysql_execute_command(void) ...@@ -1085,7 +1085,19 @@ mysql_execute_command(void)
// rules have been given and the table list says the query should not be // rules have been given and the table list says the query should not be
// replicated // replicated
if(table_rules_on && tables && !tables_ok(thd,tables)) if(table_rules_on && tables && !tables_ok(thd,tables))
{
/*
We consider the query as empty and warn the slave thread which will
consider ER_EMPTY_QUERY as an ignorable error. Note that this has a
drawback: if the event is corrupted it could contain an empty query;
then the slave thread will silently ignore it instead of warning. But
such corruption is unlikely enough.
In MySQL 4.0 we do it more properly using a new error code
(ER_SLAVE_IGNORED_TABLE).
*/
my_error(ER_EMPTY_QUERY, MYF(0));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
}
// this is a workaround to deal with the shortcoming // this is a workaround to deal with the shortcoming
// in 3.23.44-3.23.46 masters // in 3.23.44-3.23.46 masters
// in RELEASE_LOCK() logging. We re-write SELECT RELEASE_LOCK() as // in RELEASE_LOCK() logging. We re-write SELECT RELEASE_LOCK() as
......
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