Description:
See "how to repeat" for details.
How to repeat:
Run the following statements with log-bin and run mysqlbinlog
mysql> create table t1 (id int unsigned primary key, value int) engine=innodb;
Query OK, 0 rows affected (0.16 sec)
mysql> insert into t1 values (1,1),(2,2),(3,3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
# out of range from int unsigned, not written to binlog
mysql> update t1 set value=value+1 where id=100000000000000;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
# max int unsigned, written to binlog
mysql> update t1 set value=value+1 where id=4294967295;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
# max int unsigned + 1, not written to binlog
mysql> update t1 set value=value+1 where id=4294967296;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
# null cond on not null column, not written to binlog
mysql> update t1 set value=1000 where id is null;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
# same as above, not written to binlog
mysql> delete from t1 where id is null;
Query OK, 0 rows affected (0.00 sec)
Suggested fix:
In mysql_update() function...
if (error || !limit ||
(select && select->check_quick(thd, safe_update, limit)))
...
DBUG_PRINT("info",("0 records updated"));
DBUG_RETURN(0);
}
When entering this if-block, writing to binlog logic is not called.
check_quick() may return 0 if save_value_and_handle_conversion() sets
(*tree)->type= SEL_ARG::IMPOSSIBLE. This is set if out of range
conditions are specified.