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.
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.