diff --git a/sql/sql_update.cc b/sql/sql_update.cc index cc6332c8d8d0c1f59ef02d353a91630141965f9e..963cfced66084d9becd8c425f3d7f22c08ecba36 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -552,6 +552,8 @@ bool Sql_cmd_update::update_single_table(THD *thd) { const bool using_filesort = order && need_sort; + DBUG_EXECUTE_IF("mark_third_bit_in_read_set", + bitmap_set_bit(table->read_set, 2);); table->mark_columns_per_binlog_row_image(thd); if (prepare_partial_update(trace, select_lex->fields, *update_value_list)) diff --git a/mysql-test/t/isolation_level.test b/mysql-test/t/isolation_level.test new file mode 100644 index 0000000000000000000000000000000000000000..30dab189bae331b853a62f6b5d31384d02a93f4f --- /dev/null +++ b/mysql-test/t/isolation_level.test @@ -0,0 +1,118 @@ +--connect(c0, 127.0.0.1,root,,test,$MASTER_MYPORT,) +--connection c0 +SELECT @@log_bin, @@version, @@binlog_format; + +--echo +--let $value = `SELECT @@log_bin` +--let $assert_text = Binlog enabled +--let $assert_cond = "$value" = "0" +--source include/assert.inc + +CREATE TABLE `t1` ( + `id` int(11) PRIMARY KEY, + `type` int DEFAULT NULL, + `name` varchar(20) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +--connect(c1, 127.0.0.1,root,,test,$MASTER_MYPORT,) +--connect(c2, 127.0.0.1,root,,test,$MASTER_MYPORT,) + +--echo +--echo 1) UPDATING THE SAME RECORD WITH THE SAME VALUE AND UPDATE COLUMN BIT SET +--echo ------------------------------------------------------------------------- + +INSERT INTO t1 VALUES (1,100,'abc'); + +--connection c1 +--echo [connection c1] +BEGIN; +SELECT * FROM t1; + +--connection c2 +--echo [connection c2] +BEGIN; +SELECT * FROM t1; + +--connection c1 +--echo [connection c1] +UPDATE t1 SET name = 'xyz' WHERE id = 1; +SELECT ROW_COUNT(); +SELECT * FROM t1; +COMMIT; + +--connection c2 +--echo [connection c2] + +--echo +--let $value = `SELECT name FROM t1 WHERE id = 1 AND name = 'abc' AND type = 100` +--let $assert_text = SEEING OLD VALUE +--let $assert_cond = "$value" = "abc" +--source include/assert.inc +--echo + +SET SESSION debug='+d,mark_third_bit_in_read_set'; +UPDATE t1 SET name = 'xyz' WHERE id = 1; +SELECT ROW_COUNT(); +SELECT * FROM t1; +--echo +--let $value = `SELECT name FROM t1 WHERE id = 1` +--let $assert_text = SEEING OLD VALUE +--let $assert_cond = "$value" = "abc" +--source include/assert.inc +--echo +COMMIT; + +SELECT * FROM t1; +SET SESSION debug='-d,mark_third_bit_in_read_set'; + +--echo +--echo 2) UPDATING THE SAME RECORD WITH OTHER VALUE AND UPDATE COLUMN BIT SET +--echo ---------------------------------------------------------------------- + +TRUNCATE t1; +INSERT INTO t1 VALUES (1,100,'abc'); + +--connection c1 +--echo [connection c1] +BEGIN; +SELECT * FROM t1; + +--connection c2 +--echo [connection c2] +BEGIN; +SELECT * FROM t1; + +--connection c1 +--echo [connection c1] +UPDATE t1 SET name = 'xyz' WHERE id = 1; +SELECT ROW_COUNT(); +SELECT * FROM t1; +COMMIT; + +--connection c2 +--echo [connection c2] + +--echo +--let $value = `SELECT name FROM t1 WHERE id = 1 AND name = 'abc' AND type = 100` +--let $assert_text = SEEING OLD VALUE +--let $assert_cond = "$value" = "abc" +--source include/assert.inc +--echo + +SET SESSION debug='+d,mark_third_bit_in_read_set'; +UPDATE t1 SET name = 'pqr' WHERE id = 1; +SELECT ROW_COUNT(); +SELECT * FROM t1; +--echo +--let $value = `SELECT name FROM t1 WHERE id = 1` +--let $assert_text = SEEING NEW VALUE +--let $assert_cond = "$value" = "pqr" +--source include/assert.inc +--echo +COMMIT; + +SELECT * FROM t1; +SET SESSION debug='-d,mark_third_bit_in_read_set'; + +--disconnect c1 +--disconnect c2