MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Dao-Gang.Qu Date:November 29 2010 3:19am
Subject:bzr push into mysql-trunk-bugfixing branch (Dao-Gang.Qu:3405 to 3406)
Bug#57666
View as plain text  
 3406 Dao-Gang.Qu@stripped	2010-11-29 [merge]
      Bug #57666  Unclear warning with broken text in error log on INSERT DELAYED
      
      It is not necessary to support INSERT DELAYED for a single value insert,
      while we do not support that for multi-values insert when binlog is
      enabled in SBR.
      
      The lock_type is upgrade to TL_WRITE from TL_WRITE_DELAYED for
      INSERT DELAYED for single value insert as multi-values insert
      did when binlog is enabled. Then it's safe. And binlog it as
      INSERT without DELAYED.
     @ mysql-test/extra/binlog_tests/binlog_insert_delayed.test
        Added test for bug#57666
     @ mysql-test/suite/binlog/r/binlog_row_binlog.result
        Updated for bug#57666
     @ mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result
        Updated for bug#57666
     @ mysql-test/suite/binlog/r/binlog_stm_binlog.result
        Updated for bug#57666
     @ mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result
        Updated for bug#57666
     @ sql/sql_insert.cc
        Updated code for the following things:
        1. Upgrade the lock_type to TL_WRITE from TL_WRITE_DELAYED
        for INSERT DELAYED for single value insert as multi-values
        insert did when binlog is enabled.
        2. Clear code to not binlog INSERT DELAYED STMT in SBR.
        3. Get rid of privilege check for log_on.

    modified:
      mysql-test/extra/binlog_tests/binlog_insert_delayed.test
      mysql-test/suite/binlog/r/binlog_row_binlog.result
      mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result
      mysql-test/suite/binlog/r/binlog_stm_binlog.result
      mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result
      sql/sql_insert.cc
 3405 Li-Bing.Song@stripped	2010-11-28 [merge]
      Manual merge

    modified:
      mysql-test/extra/binlog_tests/binlog.test
      mysql-test/suite/binlog/r/binlog_row_binlog.result
      mysql-test/suite/binlog/r/binlog_stm_binlog.result
      sql/sql_binlog.cc
=== modified file 'mysql-test/extra/binlog_tests/binlog_insert_delayed.test'
--- a/mysql-test/extra/binlog_tests/binlog_insert_delayed.test	2010-08-30 06:03:28 +0000
+++ b/mysql-test/extra/binlog_tests/binlog_insert_delayed.test	2010-11-29 03:04:16 +0000
@@ -34,11 +34,11 @@ create table t1 (a int not null auto_inc
 let $table=t1;
 let $count=0;
 
-insert delayed into t1 values (207);
+insert /* before delayed */ delayed /* after delayed */ into t1 values (207);
 inc $count;
 --source include/wait_until_rows_count.inc
 
-insert delayed into t1 values (null);
+insert /*! delayed */ into t1 values (null);
 inc $count;
 --source include/wait_until_rows_count.inc
 

=== modified file 'mysql-test/suite/binlog/r/binlog_row_binlog.result'
--- a/mysql-test/suite/binlog/r/binlog_row_binlog.result	2010-11-28 10:39:14 +0000
+++ b/mysql-test/suite/binlog/r/binlog_row_binlog.result	2010-11-29 03:17:40 +0000
@@ -1240,8 +1240,8 @@ master-bin.000001	#	Delete_rows	#	#	tabl
 master-bin.000001	#	Query	#	#	COMMIT
 drop table t1,t2,t3,tt1;
 create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
-insert delayed into t1 values (207);
-insert delayed into t1 values (null);
+insert /* before delayed */ delayed /* after delayed */ into t1 values (207);
+insert /*! delayed */ into t1 values (null);
 insert delayed into t1 values (300);
 FLUSH TABLES;
 show binlog events from <binlog_start>;

=== modified file 'mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result'
--- a/mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result	2010-08-30 06:03:28 +0000
+++ b/mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result	2010-11-29 03:04:16 +0000
@@ -1,6 +1,6 @@
 create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
-insert delayed into t1 values (207);
-insert delayed into t1 values (null);
+insert /* before delayed */ delayed /* after delayed */ into t1 values (207);
+insert /*! delayed */ into t1 values (null);
 insert delayed into t1 values (300);
 FLUSH TABLES;
 show binlog events from <binlog_start>;
@@ -10,14 +10,14 @@ master-bin.000001	#	Query	#	#	use `mtr`;
 master-bin.000001	#	Query	#	#	COMMIT
 master-bin.000001	#	Query	#	#	use `test`; create table t1 (a int not null auto_increment, primary key (a)) engine=myisam
 master-bin.000001	#	Query	#	#	BEGIN
-master-bin.000001	#	Query	#	#	use `test`; insert delayed into t1 values (207)
+master-bin.000001	#	Query	#	#	use `test`; insert /* before delayed */  /* after delayed */ into t1 values (207)
 master-bin.000001	#	Query	#	#	COMMIT
 master-bin.000001	#	Query	#	#	BEGIN
 master-bin.000001	#	Intvar	#	#	INSERT_ID=208
-master-bin.000001	#	Query	#	#	use `test`; insert delayed into t1 values (null)
+master-bin.000001	#	Query	#	#	use `test`; insert /*!  */ into t1 values (null)
 master-bin.000001	#	Query	#	#	COMMIT
 master-bin.000001	#	Query	#	#	BEGIN
-master-bin.000001	#	Query	#	#	use `test`; insert delayed into t1 values (300)
+master-bin.000001	#	Query	#	#	use `test`; insert  into t1 values (300)
 master-bin.000001	#	Query	#	#	COMMIT
 master-bin.000001	#	Query	#	#	use `test`; FLUSH TABLES
 RESET MASTER;

=== modified file 'mysql-test/suite/binlog/r/binlog_stm_binlog.result'
--- a/mysql-test/suite/binlog/r/binlog_stm_binlog.result	2010-11-28 10:39:14 +0000
+++ b/mysql-test/suite/binlog/r/binlog_stm_binlog.result	2010-11-29 03:17:40 +0000
@@ -717,8 +717,8 @@ master-bin.000001	#	Query	#	#	use `mysql
 master-bin.000001	#	Query	#	#	COMMIT
 drop table t1,t2,t3,tt1;
 create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
-insert delayed into t1 values (207);
-insert delayed into t1 values (null);
+insert /* before delayed */ delayed /* after delayed */ into t1 values (207);
+insert /*! delayed */ into t1 values (null);
 insert delayed into t1 values (300);
 FLUSH TABLES;
 show binlog events from <binlog_start>;

=== modified file 'mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result'
--- a/mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result	2010-06-19 09:24:34 +0000
+++ b/mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result	2010-11-29 03:17:40 +0000
@@ -51,8 +51,8 @@ CREATE TABLE t1(a int, UNIQUE(a));
 INSERT DELAYED IGNORE INTO t1 VALUES(1);
 INSERT DELAYED IGNORE INTO t1 VALUES(1);
 flush table t1;
-use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
-use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
+use `test`; INSERT  IGNORE INTO t1 VALUES(1)
+use `test`; INSERT  IGNORE INTO t1 VALUES(1)
 select * from t1;
 a
 1
@@ -60,10 +60,10 @@ On slave
 show binlog events in 'slave-bin.000002' from <binlog_start> limit 1,6;
 Log_name	Pos	Event_type	Server_id	End_log_pos	Info
 slave-bin.000002	#	Query	#	#	BEGIN
-slave-bin.000002	#	Query	#	#	use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
+slave-bin.000002	#	Query	#	#	use `test`; INSERT  IGNORE INTO t1 VALUES(1)
 slave-bin.000002	#	Query	#	#	COMMIT
 slave-bin.000002	#	Query	#	#	BEGIN
-slave-bin.000002	#	Query	#	#	use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
+slave-bin.000002	#	Query	#	#	use `test`; INSERT  IGNORE INTO t1 VALUES(1)
 slave-bin.000002	#	Query	#	#	COMMIT
 select * from t1;
 a

=== modified file 'sql/sql_insert.cc'
--- a/sql/sql_insert.cc	2010-11-18 16:34:56 +0000
+++ b/sql/sql_insert.cc	2010-11-29 03:17:40 +0000
@@ -420,8 +420,7 @@ void prepare_triggers_for_insert_stmt(TA
 
 static
 void upgrade_lock_type(THD *thd, thr_lock_type *lock_type,
-                       enum_duplicates duplic,
-                       bool is_multi_insert)
+                       enum_duplicates duplic)
 {
   if (duplic == DUP_UPDATE ||
       (duplic == DUP_REPLACE && *lock_type == TL_WRITE_CONCURRENT_INSERT))
@@ -470,10 +469,9 @@ void upgrade_lock_type(THD *thd, thr_loc
       return;
     }
 
-    bool log_on= (thd->variables.option_bits & OPTION_BIN_LOG ||
-                  ! (thd->security_ctx->master_access & SUPER_ACL));
+    bool log_on= (thd->variables.option_bits & OPTION_BIN_LOG);
     if (global_system_variables.binlog_format == BINLOG_FORMAT_STMT &&
-        log_on && mysql_bin_log.is_open() && is_multi_insert)
+        log_on && mysql_bin_log.is_open())
     {
       /*
         Statement-based binary logging does not work in this case, because:
@@ -677,8 +675,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *t
     By default, both logs are enabled (this won't cause problems if the server
     runs without --log-bin).
   */
-  bool log_on= ((thd->variables.option_bits & OPTION_BIN_LOG) ||
-                (!(thd->security_ctx->master_access & SUPER_ACL)));
+  bool log_on= (thd->variables.option_bits & OPTION_BIN_LOG);
 #endif
   thr_lock_type lock_type;
   Item *unused_conds= 0;
@@ -688,8 +685,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *t
     Upgrade lock type if the requested lock is incompatible with
     the current connection mode or table operation.
   */
-  upgrade_lock_type(thd, &table_list->lock_type, duplic,
-                    values_list.elements > 1);
+  upgrade_lock_type(thd, &table_list->lock_type, duplic);
 
   /*
     We can't write-delayed into a table locked with LOCK TABLES:
@@ -1022,7 +1018,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *t
 	DBUG_ASSERT(thd->killed != THD::KILL_BAD_DATA || error > 0);
         if (was_insert_delayed && table_list->lock_type ==  TL_WRITE)
         {
-          /* Binlog multi INSERT DELAYED as INSERT without DELAYED. */
+          /* Binlog INSERT DELAYED as INSERT without DELAYED. */
           String log_query;
           if (create_insert_stmt_from_insert_delayed(thd, &log_query))
           {
@@ -1907,22 +1903,7 @@ public:
     thd.set_command(COM_DELAYED_INSERT);
     thd.lex->current_select= 0; 		// for my_message_sql
     thd.lex->sql_command= SQLCOM_INSERT;        // For innodb::store_lock()
-    /*
-      Statement-based replication of INSERT DELAYED has problems with
-      RAND() and user variables, so in mixed mode we go to row-based.
-      For normal commands, the unsafe flag is set at parse time.
-      However, since the flag is a member of the THD object, of which
-      the delayed_insert thread has its own copy, we must set the
-      statement to unsafe here and explicitly set row logging mode.
-
-      @todo set_current_stmt_binlog_format_row_if_mixed should not be
-      called by anything else than thd->decide_logging_format().  When
-      we call set_current_blah here, none of the checks in
-      decide_logging_format is made.  We should probably call
-      thd->decide_logging_format() directly instead.  /Sven
-    */
-    thd.lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_INSERT_DELAYED);
-    thd.set_current_stmt_binlog_format_row_if_mixed();
+
     /*
       Prevent changes to global.lock_wait_timeout from affecting
       delayed insert threads as any timeouts in delayed inserts
@@ -2665,11 +2646,11 @@ pthread_handler_t handle_delayed_insert(
     }
 
     thd->lex->sql_command= SQLCOM_INSERT;        // For innodb::store_lock()
+
     /*
-      Statement-based replication of INSERT DELAYED has problems with RAND()
-      and user vars, so in mixed mode we go to row-based.
+      INSERT DELAYED has to go to row-based format because the time
+      at which rows are inserted cannot be determined in mixed mode.
     */
-    thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_INSERT_DELAYED);
     thd->set_current_stmt_binlog_format_row_if_mixed();
 
     /*
@@ -2946,11 +2927,21 @@ bool Delayed_insert::handle_inserts(void
                            (ulong) row->query.length));
     if (log_query)
     {
-      if (thd.is_current_stmt_binlog_format_row())
+      /*
+        Guaranteed that the INSERT DELAYED STMT will not be here
+        in SBR when mysql binlog is enabled.
+      */
+      DBUG_ASSERT(!(mysql_bin_log.is_open() &&
+                  !thd.is_current_stmt_binlog_format_row()));
+
+      if (mysql_bin_log.is_open())
       {
         /* Flush rows of previous statement*/
         if (thd.binlog_flush_pending_rows_event(TRUE, FALSE))
+        {
+          delete row;
           goto err;
+        }
         /* Set query for Rows_query_log event in RBR*/
         thd.set_query(row->query.str, row->query.length);
         thd.variables.binlog_rows_query_log_events= row->binlog_rows_query_log_events;
@@ -3023,36 +3014,6 @@ bool Delayed_insert::handle_inserts(void
       table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
     }
 
-    if (log_query && mysql_bin_log.is_open() &&
-        !thd.is_current_stmt_binlog_format_row())
-    {
-      bool backup_time_zone_used = thd.time_zone_used;
-      Time_zone *backup_time_zone = thd.variables.time_zone;
-      if (row->time_zone != NULL)
-      {
-        thd.time_zone_used = true;
-        thd.variables.time_zone = row->time_zone;
-      }
-
-      /* if the delayed insert was killed, the killed status is
-         ignored while binlogging */
-      int errcode= 0;
-      if (thd.killed == THD::NOT_KILLED)
-        errcode= query_error_code(&thd, TRUE);
-
-      /*
-        In SBR, only the query which has one single value
-        will be binlogged here.
-      */
-      if (thd.binlog_query(THD::STMT_QUERY_TYPE,
-                           row->query.str, row->query.length,
-                           FALSE, FALSE, FALSE, errcode))
-        goto err;
-
-      thd.time_zone_used = backup_time_zone_used;
-      thd.variables.time_zone = backup_time_zone;
-    }
-
     if (table->s->blob_fields)
       free_delayed_insert_blobs(table);
     thread_safe_decrement(delayed_rows_in_use,&LOCK_delayed_status);
@@ -3065,7 +3026,7 @@ bool Delayed_insert::handle_inserts(void
     */
     table->auto_increment_field_not_null= FALSE;
 
-    if (log_query && thd.is_current_stmt_binlog_format_row())
+    if (log_query && mysql_bin_log.is_open())
       thd.set_query(NULL, 0);
     delete row;
     /*
@@ -3127,7 +3088,7 @@ bool Delayed_insert::handle_inserts(void
   */
   has_trans= thd.lex->sql_command == SQLCOM_CREATE_TABLE ||
               table->file->has_transactions();
-  if (thd.is_current_stmt_binlog_format_row() &&
+  if (mysql_bin_log.is_open() &&
       thd.binlog_flush_pending_rows_event(TRUE, has_trans))
     goto err;
 

No bundle (reason: useless for push emails).
Thread
bzr push into mysql-trunk-bugfixing branch (Dao-Gang.Qu:3405 to 3406)Bug#57666Dao-Gang.Qu29 Nov