Loading mysql-test/r/innodb_mysql.result +18 −0 Original line number Diff line number Diff line Loading @@ -1047,4 +1047,22 @@ t1 CREATE TABLE `t1` ( KEY `a` (`a`(255)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 drop table t1; CREATE TABLE t1 ( a INT, b INT, KEY (b) ) ENGINE=InnoDB; INSERT INTO t1 VALUES (1,10), (2,10), (2,20), (3,30); START TRANSACTION; SELECT * FROM t1 WHERE b=20 FOR UPDATE; a b 2 20 START TRANSACTION; SELECT * FROM t1 WHERE b=10 ORDER BY A FOR UPDATE; a b 1 10 2 10 ROLLBACK; ROLLBACK; DROP TABLE t1; End of 5.0 tests mysql-test/t/innodb_mysql.test +28 −0 Original line number Diff line number Diff line Loading @@ -881,5 +881,33 @@ insert into t1 values('aaa'); alter table t1 add index(a(1024)); show create table t1; drop table t1; # Bug #28570: handler::index_read() is called with different find_flag when # ORDER BY is used # CREATE TABLE t1 ( a INT, b INT, KEY (b) ) ENGINE=InnoDB; INSERT INTO t1 VALUES (1,10), (2,10), (2,20), (3,30); START TRANSACTION; SELECT * FROM t1 WHERE b=20 FOR UPDATE; --connect (conn2, localhost, root,,test) # This statement gives a "failed: 1205: Lock wait timeout exceeded; try # restarting transaction" message when the bug is present. START TRANSACTION; SELECT * FROM t1 WHERE b=10 ORDER BY A FOR UPDATE; ROLLBACK; --disconnect conn2 --connection default ROLLBACK; DROP TABLE t1; --echo End of 5.0 tests sql/handler.cc +2 −1 Original line number Diff line number Diff line Loading @@ -2610,7 +2610,8 @@ int handler::read_multi_range_next(KEY_MULTI_RANGE **found_range_p) read_range_first() start_key Start key. Is 0 if no min range end_key End key. Is 0 if no max range eq_range_arg Set to 1 if start_key == end_key eq_range_arg Set to 1 if start_key == end_key and the range endpoints will not change during query execution. sorted Set to 1 if result should be sorted per key NOTES Loading sql/opt_range.cc +1 −2 Original line number Diff line number Diff line Loading @@ -6369,8 +6369,7 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, range->min_key=range->max_key=(char*) ref->key_buff; range->min_length=range->max_length=ref->key_length; range->flag= ((ref->key_length == key_info->key_length && (key_info->flags & (HA_NOSAME | HA_END_SPACE_KEY)) == HA_NOSAME) ? EQ_RANGE : 0); (key_info->flags & HA_END_SPACE_KEY) == 0) ? EQ_RANGE : 0); if (!(quick->key_parts=key_part=(KEY_PART *) alloc_root(&quick->alloc,sizeof(KEY_PART)*ref->key_parts))) Loading Loading
mysql-test/r/innodb_mysql.result +18 −0 Original line number Diff line number Diff line Loading @@ -1047,4 +1047,22 @@ t1 CREATE TABLE `t1` ( KEY `a` (`a`(255)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 drop table t1; CREATE TABLE t1 ( a INT, b INT, KEY (b) ) ENGINE=InnoDB; INSERT INTO t1 VALUES (1,10), (2,10), (2,20), (3,30); START TRANSACTION; SELECT * FROM t1 WHERE b=20 FOR UPDATE; a b 2 20 START TRANSACTION; SELECT * FROM t1 WHERE b=10 ORDER BY A FOR UPDATE; a b 1 10 2 10 ROLLBACK; ROLLBACK; DROP TABLE t1; End of 5.0 tests
mysql-test/t/innodb_mysql.test +28 −0 Original line number Diff line number Diff line Loading @@ -881,5 +881,33 @@ insert into t1 values('aaa'); alter table t1 add index(a(1024)); show create table t1; drop table t1; # Bug #28570: handler::index_read() is called with different find_flag when # ORDER BY is used # CREATE TABLE t1 ( a INT, b INT, KEY (b) ) ENGINE=InnoDB; INSERT INTO t1 VALUES (1,10), (2,10), (2,20), (3,30); START TRANSACTION; SELECT * FROM t1 WHERE b=20 FOR UPDATE; --connect (conn2, localhost, root,,test) # This statement gives a "failed: 1205: Lock wait timeout exceeded; try # restarting transaction" message when the bug is present. START TRANSACTION; SELECT * FROM t1 WHERE b=10 ORDER BY A FOR UPDATE; ROLLBACK; --disconnect conn2 --connection default ROLLBACK; DROP TABLE t1; --echo End of 5.0 tests
sql/handler.cc +2 −1 Original line number Diff line number Diff line Loading @@ -2610,7 +2610,8 @@ int handler::read_multi_range_next(KEY_MULTI_RANGE **found_range_p) read_range_first() start_key Start key. Is 0 if no min range end_key End key. Is 0 if no max range eq_range_arg Set to 1 if start_key == end_key eq_range_arg Set to 1 if start_key == end_key and the range endpoints will not change during query execution. sorted Set to 1 if result should be sorted per key NOTES Loading
sql/opt_range.cc +1 −2 Original line number Diff line number Diff line Loading @@ -6369,8 +6369,7 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, range->min_key=range->max_key=(char*) ref->key_buff; range->min_length=range->max_length=ref->key_length; range->flag= ((ref->key_length == key_info->key_length && (key_info->flags & (HA_NOSAME | HA_END_SPACE_KEY)) == HA_NOSAME) ? EQ_RANGE : 0); (key_info->flags & HA_END_SPACE_KEY) == 0) ? EQ_RANGE : 0); if (!(quick->key_parts=key_part=(KEY_PART *) alloc_root(&quick->alloc,sizeof(KEY_PART)*ref->key_parts))) Loading