Commit 02fe5e27 authored by gkodinov/kgeorge@magare.gmz's avatar gkodinov/kgeorge@magare.gmz
Browse files

Bug #29571: INSERT DELAYED IGNORE written to binary log on

 the master but on the slave

MySQL can decide to "downgrade" a INSERT DELAYED statement
to normal insert in certain situations.
One such situation is when the slave is replaying a 
replication feed.
However INSERT DELAYED is logged even if there're no updates
whereas the NORMAL INSERT is not logged in such cases.

Fixed by always logging a "downgraded" INSERT DELAYED: even 
if there were no updates.
parent fd1a43b0
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -29,3 +29,23 @@ id name
10	my name
20	is Bond
drop table t1;
CREATE TABLE t1(a int, UNIQUE(a));
INSERT DELAYED IGNORE INTO t1 VALUES(1);
INSERT DELAYED IGNORE INTO t1 VALUES(1);
show binlog events limit 11,100;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
x	x	x	x	x	use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
x	x	x	x	x	use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
select * from t1;
a
1
On slave
show binlog events limit 12,100;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
x	x	x	x	x	use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
x	x	x	x	x	use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
select * from t1;
a
1
drop table t1;
End of 5.0 tests
+29 −0
Original line number Diff line number Diff line
@@ -65,3 +65,32 @@ connection master;
drop table t1;
sync_slave_with_master;
connection master;

#
# Bug #29571: INSERT DELAYED IGNORE written to binary log on the master but
# on the slave
#
CREATE TABLE t1(a int, UNIQUE(a));
INSERT DELAYED IGNORE INTO t1 VALUES(1);
INSERT DELAYED IGNORE INTO t1 VALUES(1);

#must show two INSERT DELAYED
--replace_column 1 x 2 x 3 x 4 x 5 x
show binlog events limit 11,100;
select * from t1;

sync_slave_with_master;
echo On slave;
#must show two INSERT DELAYED
--replace_column 1 x 2 x 3 x 4 x 5 x
show binlog events limit 12,100;
select * from t1;


# clean up
connection master;
drop table t1;
sync_slave_with_master;
connection master;

--echo End of 5.0 tests
+6 −3
Original line number Diff line number Diff line
@@ -560,6 +560,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
  int error, res;
  bool transactional_table, joins_freed= FALSE;
  bool changed;
  bool was_insert_delayed= (table_list->lock_type ==  TL_WRITE_DELAYED);
  uint value_count;
  ulong counter = 1;
  ulonglong id;
@@ -859,13 +860,15 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,

    transactional_table= table->file->has_transactions();

    if ((changed= (info.copied || info.deleted || info.updated)))
    if ((changed= (info.copied || info.deleted || info.updated)) ||
        was_insert_delayed)
    {
      /*
        Invalidate the table in the query cache if something changed.
        For the transactional algorithm to work the invalidation must be
        before binlog writing and ha_autocommit_or_rollback
      */
      if (changed)
        query_cache_invalidate3(thd, table_list, 1);
      if (error <= 0 || !transactional_table)
      {
@@ -904,7 +907,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
          if (mysql_bin_log.write(&qinfo) && transactional_table)
            error=1;
        }
        if (!transactional_table)
        if (!transactional_table && changed)
          thd->no_trans_update.all= TRUE;
      }
    }