List:Commits« Previous MessageNext Message »
From:Andrei Elkin Date:January 23 2006 4:03pm
Subject:bk commit into 5.0 tree (aelkin:1.2001) BUG#15699
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of elkin. When elkin does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2001 06/01/23 18:03:09 aelkin@stripped +4 -0
  BUG#15699, failure to apply ignore rule for unexisting table.
    
  Since replication rules execute after `mysql_multi_update_prepare' returns we
  delay to `break' in case this functions returns non-zero (some tables are not found) 
  for to examine if there is an ignore rule for a not-found table. By doing that
  it is guaranteed do/ignore replication rules logically preceed opening table routine.

  mysql-test/t/rpl_multi_update4.test
    1.1 06/01/23 18:03:04 aelkin@stripped +44 -0
    New BitKeeper file ``mysql-test/t/rpl_multi_update4.test''

  mysql-test/t/rpl_multi_update4-slave.opt
    1.1 06/01/23 18:03:04 aelkin@stripped +1 -0
    New BitKeeper file ``mysql-test/t/rpl_multi_update4-slave.opt''

  mysql-test/t/rpl_multi_update4.test
    1.0 06/01/23 18:03:04 aelkin@stripped +0 -0
    BitKeeper file /usr_rh9/home/elkin.rh9/MySQL/mysql-5.0-bug15699-pending/mysql-test/t/rpl_multi_update4.test

  mysql-test/t/rpl_multi_update4-slave.opt
    1.0 06/01/23 18:03:04 aelkin@stripped +0 -0
    BitKeeper file /usr_rh9/home/elkin.rh9/MySQL/mysql-5.0-bug15699-pending/mysql-test/t/rpl_multi_update4-slave.opt

  mysql-test/r/rpl_multi_update4.result
    1.1 06/01/23 18:03:03 aelkin@stripped +25 -0
    New BitKeeper file ``mysql-test/r/rpl_multi_update4.result''

  sql/sql_parse.cc
    1.523 06/01/23 18:03:03 aelkin@stripped +40 -25
    BUG#15699. We delay to `break' in case of unexisted tables for multi-update.
    First it is checked whether an ignore rule for such a table exists.
    
    More to the fix:
    if (opt_readonly && ...' in two places got be idented because it were
    enclosed explicitly into corresponding `else' groups. For that 
    the preceding lines with `else' were changed in to be 
    `else 
     {'.
    This grouping is necessary to avoid any inattentive
    insertion in between of `else' and belonging to the else 
    `if (opt_readonly && ...' statement.

  mysql-test/r/rpl_multi_update4.result
    1.0 06/01/23 18:03:03 aelkin@stripped +0 -0
    BitKeeper file /usr_rh9/home/elkin.rh9/MySQL/mysql-5.0-bug15699-pending/mysql-test/r/rpl_multi_update4.result

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	aelkin
# Host:	dsl-hkigw8-feb0de00-199.dhcp.inet.fi
# Root:	/usr_rh9/home/elkin.rh9/MySQL/mysql-5.0-bug15699-pending

--- 1.522/sql/sql_parse.cc	2006-01-16 19:08:41 +02:00
+++ 1.523/sql/sql_parse.cc	2006-01-23 18:03:03 +02:00
@@ -2415,23 +2415,26 @@
     }
   }
   else
-#endif /* HAVE_REPLICATION */
-
-  /*
-    When option readonly is set deny operations which change non-temporary
-    tables. Except for the replication thread and the 'super' users.
-  */
-  if (opt_readonly &&
-      !(thd->security_ctx->master_access & SUPER_ACL) &&
-      uc_update_queries[lex->sql_command] &&
-      !((lex->sql_command == SQLCOM_CREATE_TABLE) &&
-        (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) &&
-      ((lex->sql_command != SQLCOM_UPDATE_MULTI) &&
-       some_non_temp_table_to_be_updated(thd, all_tables)))
   {
-    my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only");
-    DBUG_RETURN(-1);
-  }
+#endif /* HAVE_REPLICATION */
+    /*
+      When option readonly is set deny operations which change non-temporary
+      tables. Except for the replication thread and the 'super' users.
+    */
+    if (opt_readonly &&
+	!(thd->security_ctx->master_access & SUPER_ACL) &&
+	uc_update_queries[lex->sql_command] &&
+	!((lex->sql_command == SQLCOM_CREATE_TABLE) &&
+	  (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) &&
+	((lex->sql_command != SQLCOM_UPDATE_MULTI) &&
+	 some_non_temp_table_to_be_updated(thd, all_tables)))
+    {
+      my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only");
+      DBUG_RETURN(-1);
+    }
+#ifdef HAVE_REPLICATION
+  } /* endif unlikely slave */
+#endif
   if(lex->orig_sql_command == SQLCOM_END)
     statistic_increment(thd->status_var.com_stat[lex->sql_command],
                         &LOCK_status);
@@ -3232,8 +3235,7 @@
     else
       res= 0;
 
-    if ((res= mysql_multi_update_prepare(thd)))
-      break;
+    res= mysql_multi_update_prepare(thd);
 
 #ifdef HAVE_REPLICATION
     /* Check slave filtering rules */
@@ -3241,20 +3243,33 @@
     {
       if (all_tables_not_ok(thd, all_tables))
       {
+        if (res!= 0)
+        {
+          res= 0;             /* don't care of prev failure  */
+          thd->clear_error(); /* filters are of highest prior */
+        }
         /* we warn the slave SQL thread */
         my_error(ER_SLAVE_IGNORED_TABLE, MYF(0));
         break;
       }
+      if (res)
+        break;
     }
     else
-#endif /* HAVE_REPLICATION */
-    if (opt_readonly &&
-        !(thd->security_ctx->master_access & SUPER_ACL) &&
-        some_non_temp_table_to_be_updated(thd, all_tables))
     {
-      my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only");
-      break;
-    }
+#endif /* HAVE_REPLICATION */
+      if (res)
+        break;
+      if (opt_readonly &&
+	  !(thd->security_ctx->master_access & SUPER_ACL) &&
+	  some_non_temp_table_to_be_updated(thd, all_tables))
+      {
+	my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only");
+	break;
+      }
+#ifdef HAVE_REPLICATION
+    }  /* unlikely */
+#endif
 
     res= mysql_multi_update(thd, all_tables,
                             &select_lex->item_list,
--- New file ---
+++ mysql-test/r/rpl_multi_update4.result	06/01/23 18:03:03
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
drop database if exists d1;
drop database if exists d2;
drop database if exists d2;
create database d1;
create table d1.t0 (id int);
create database d2;
use d2;
create table t1 (id int);
create table t2 (id int);
insert into t1 values (1), (2), (3), (4), (5);
insert into t2 select id + 3 from t1;
update t1 join t2 using (id) set t1.id = 0;
insert into d1.t0 values (0);
use d1;
select * from t0 where id=0;
id
0
drop database d1;
drop database d2;

--- New file ---
+++ mysql-test/t/rpl_multi_update4-slave.opt	06/01/23 18:03:04
--replicate-wild-do-table=d1.%

--- New file ---
+++ mysql-test/t/rpl_multi_update4.test	06/01/23 18:03:04
# Let's verify that multi-update is not always skipped by slave if
# some replicate-* rules exist.
# (BUG#15699)

source include/master-slave.inc;

### Clean-up

connection master;
--disable_warnings
drop database if exists d1;
drop database if exists d2;

connection slave;
drop database if exists d2;
--enable_warnings

### Test

connection master;
create database d1;      # accepted by slave
create table d1.t0 (id int);
create database d2;      # ignored  by slave
use d2;
create table t1 (id int);
create table t2 (id int);
insert into t1 values (1), (2), (3), (4), (5);
insert into t2 select id + 3 from t1;
# a problematic query which must be filter out by slave
update t1 join t2 using (id) set t1.id = 0;
insert into d1.t0 values (0); # replication works

sync_slave_with_master;
use d1;
#connection slave;
select * from t0 where id=0;  # must find

### Clean-up
connection master;
drop database d1;
drop database d2;


# End of test

Thread
bk commit into 5.0 tree (aelkin:1.2001) BUG#15699Andrei Elkin23 Jan