Bug #20633 INSERT DELAYED RAND() or @user_var does not replicate statement-based

Submitted: 22 Jun 2006 19:09 Modified: 4 Aug 2006 0:32
Reporter: Guilhem Bichot Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Replication Severity:S3 (Non-critical)
Version:5.1-bk OS:Linux (linux)
Assigned to: Guilhem Bichot CPU Architecture:Any

[22 Jun 2006 19:09] Guilhem Bichot
Description:
didn't test 5.0.
After running this test:
source include/master-slave.inc;
create table t1 (a int, b float);
insert delayed into t1 values(1,rand());
set @a=2.345;
insert delayed into t1 values(2,@a);
select * from t1;
sync_slave_with_master;
select * from t1;
connection master;
drop table t1;
sync_slave_with_master;
the content of t1 on master and slave differ (the random numbers differ, and the 2nd line of t1 on slave contains NULL in its second column)

How to repeat:
see testcase above
[3 Jul 2006 12:27] Guilhem Bichot
Here is a proposed patch which, if the server is in mixed mode, makes the delayed_insert system thread always use RBB. The comment is not very good.

sql/sql_insert.cc:

@@ -1259,6 +1259,15 @@
     thd.command=COM_DELAYED_INSERT;
     thd.lex->current_select= 0; 		// for my_message_sql
     thd.lex->sql_command= SQLCOM_INSERT;        // For innodb::store_lock()
+#ifdef HAVE_ROW_BASED_REPLICATION
+    /*
+      In mixed mode, using row-based for the delayed thread solves many
+      problems (otherwise we can have in the same bunch, some rows
+      statement-based and some rows row-based, and it's too late to generate
+      the table maps then).
+    */
+    thd.set_current_stmt_binlog_row_based_if_mixed();
+#endif
 
     bzero((char*) &thd.net, sizeof(thd.net));		// Safety
     bzero((char*) &table_list, sizeof(table_list));	// Safety
[3 Jul 2006 12:29] Guilhem Bichot
See also BUG#20649
[5 Jul 2006 18:54] Guilhem Bichot
will be fixed only in the mixed mode (INSERT DELAYED will then always use row-based), by fix of #20649. As #20649 is approved, so is this one; simply a testcase (like the one in this bug report) will be added.
[6 Jul 2006 20:27] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/8864
[11 Jul 2006 8:23] Guilhem Bichot
Will not be fixed in 5.0.
Pushed in replication team tree 5.1, will be in 5.1.12.
ChangeSet
  guilhem@gbichot3.local|ChangeSet|20060706155404|16502    2006/07/06 17:54:04+02:00 guilhem@gbichot3.local +4 -0
  Fix for BUG#20649 "mixed replication mode does not work with INSERT DELAYED".
  The bug was that if the server was running in mixed binlogging mode,
  and an INSERT DELAYED used some needing-row-based components like UUID(),
  the server didn't binlog this row-based but statement-based, which
  thus failed to insert correct data on the slave.
  This changeset implements that when a delayed_insert thread is created,
  if the server's global binlog mode is "mixed", that thread will use row-based.
  This also fixes BUG#20633 "INSERT DELAYED RAND() or @user_var does not
  replicate statement-based": we don't fix it in statement-based mode (would
  require bookeeping of rand seeds and user variables used by each row),
  but at least it will now work in mixed mode (as row-based will be used).
[11 Jul 2006 8:24] Guilhem Bichot
By the way, patch had been approved by email by Lars (but he's on vacation now).
[4 Aug 2006 0:32] Paul DuBois
Noted in 5.1.12 changelog.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.044 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.