Loading mysql-test/r/ndb_lock.result +35 −0 Original line number Diff line number Diff line Loading @@ -87,11 +87,27 @@ x y z rollback; commit; begin; select * from t1 where y = 'one' or y = 'three' for update; x y z # # # # # # begin; select * from t1 where x = 2 for update; x y z 2 two 2 select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; commit; begin; select * from t1 where y = 'one' or y = 'three' order by x for update; x y z 1 one 1 3 three 3 begin; select * from t1 where x = 2 for update; x y z 2 two 2 select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; Loading Loading @@ -124,6 +140,22 @@ ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; commit; begin; select * from t1 where y = 'one' or y = 'three' lock in share mode; x y z # # # # # # begin; select * from t1 where y = 'one' lock in share mode; x y z 1 one 1 select * from t1 where x = 2 for update; x y z 2 two 2 select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; commit; begin; select * from t1 where y = 'one' or y = 'three' order by x lock in share mode; x y z 1 one 1 Loading @@ -132,6 +164,9 @@ begin; select * from t1 where y = 'one' lock in share mode; x y z 1 one 1 select * from t1 where x = 2 for update; x y z 2 two 2 select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; Loading mysql-test/t/ndb_lock.test +43 −6 Original line number Diff line number Diff line Loading @@ -102,16 +102,36 @@ connection con1; commit; # table scan # # Note that there are two distinct execution paths in which we unlock # non-matching rows inspected during table scan - one that is used in # case of filesort and one that used in rest of cases. Below we cover # the latter (Bug #20390 "SELECT FOR UPDATE does not release locks of # untouched rows in full table scans"). connection con1; begin; select * from t1 where y = 'one' or y = 'three' order by x for update; # We can't use "order by x" here as it will cause filesort --replace_column 1 # 2 # 3 # select * from t1 where y = 'one' or y = 'three' for update; connection con2; begin; # Have to check with pk access here since scans take locks on # all rows and then release them in chunks # Bug #20390 SELECT FOR UPDATE does not release locks of untouched rows in full table scans #select * from t1 where x = 2 for update; select * from t1 where x = 2 for update; --error 1205 select * from t1 where x = 1 for update; rollback; connection con1; commit; # And now the test for case with filesort begin; select * from t1 where y = 'one' or y = 'three' order by x for update; connection con2; begin; select * from t1 where x = 2 for update; --error 1205 select * from t1 where x = 1 for update; rollback; Loading Loading @@ -157,15 +177,32 @@ commit; # table scan connection con1; begin; select * from t1 where y = 'one' or y = 'three' order by x lock in share mode; # We can't use "order by x" here as it will cause filesort --replace_column 1 # 2 # 3 # select * from t1 where y = 'one' or y = 'three' lock in share mode; connection con2; begin; select * from t1 where y = 'one' lock in share mode; # Have to check with pk access here since scans take locks on # all rows and then release them in chunks # Bug #20390 SELECT FOR UPDATE does not release locks of untouched rows in full table scans #select * from t1 where x = 2 for update; select * from t1 where x = 2 for update; --error 1205 select * from t1 where x = 1 for update; rollback; connection con1; commit; # And the same test for case with filesort connection con1; begin; select * from t1 where y = 'one' or y = 'three' order by x lock in share mode; connection con2; begin; select * from t1 where y = 'one' lock in share mode; select * from t1 where x = 2 for update; --error 1205 select * from t1 where x = 1 for update; rollback; Loading sql/sql_select.cc +1 −0 Original line number Diff line number Diff line Loading @@ -10434,6 +10434,7 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab, */ join->examined_rows++; join->thd->row_count++; join_tab->read_record.file->unlock_row(); } return NESTED_LOOP_OK; } Loading Loading
mysql-test/r/ndb_lock.result +35 −0 Original line number Diff line number Diff line Loading @@ -87,11 +87,27 @@ x y z rollback; commit; begin; select * from t1 where y = 'one' or y = 'three' for update; x y z # # # # # # begin; select * from t1 where x = 2 for update; x y z 2 two 2 select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; commit; begin; select * from t1 where y = 'one' or y = 'three' order by x for update; x y z 1 one 1 3 three 3 begin; select * from t1 where x = 2 for update; x y z 2 two 2 select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; Loading Loading @@ -124,6 +140,22 @@ ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; commit; begin; select * from t1 where y = 'one' or y = 'three' lock in share mode; x y z # # # # # # begin; select * from t1 where y = 'one' lock in share mode; x y z 1 one 1 select * from t1 where x = 2 for update; x y z 2 two 2 select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; commit; begin; select * from t1 where y = 'one' or y = 'three' order by x lock in share mode; x y z 1 one 1 Loading @@ -132,6 +164,9 @@ begin; select * from t1 where y = 'one' lock in share mode; x y z 1 one 1 select * from t1 where x = 2 for update; x y z 2 two 2 select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; Loading
mysql-test/t/ndb_lock.test +43 −6 Original line number Diff line number Diff line Loading @@ -102,16 +102,36 @@ connection con1; commit; # table scan # # Note that there are two distinct execution paths in which we unlock # non-matching rows inspected during table scan - one that is used in # case of filesort and one that used in rest of cases. Below we cover # the latter (Bug #20390 "SELECT FOR UPDATE does not release locks of # untouched rows in full table scans"). connection con1; begin; select * from t1 where y = 'one' or y = 'three' order by x for update; # We can't use "order by x" here as it will cause filesort --replace_column 1 # 2 # 3 # select * from t1 where y = 'one' or y = 'three' for update; connection con2; begin; # Have to check with pk access here since scans take locks on # all rows and then release them in chunks # Bug #20390 SELECT FOR UPDATE does not release locks of untouched rows in full table scans #select * from t1 where x = 2 for update; select * from t1 where x = 2 for update; --error 1205 select * from t1 where x = 1 for update; rollback; connection con1; commit; # And now the test for case with filesort begin; select * from t1 where y = 'one' or y = 'three' order by x for update; connection con2; begin; select * from t1 where x = 2 for update; --error 1205 select * from t1 where x = 1 for update; rollback; Loading Loading @@ -157,15 +177,32 @@ commit; # table scan connection con1; begin; select * from t1 where y = 'one' or y = 'three' order by x lock in share mode; # We can't use "order by x" here as it will cause filesort --replace_column 1 # 2 # 3 # select * from t1 where y = 'one' or y = 'three' lock in share mode; connection con2; begin; select * from t1 where y = 'one' lock in share mode; # Have to check with pk access here since scans take locks on # all rows and then release them in chunks # Bug #20390 SELECT FOR UPDATE does not release locks of untouched rows in full table scans #select * from t1 where x = 2 for update; select * from t1 where x = 2 for update; --error 1205 select * from t1 where x = 1 for update; rollback; connection con1; commit; # And the same test for case with filesort connection con1; begin; select * from t1 where y = 'one' or y = 'three' order by x lock in share mode; connection con2; begin; select * from t1 where y = 'one' lock in share mode; select * from t1 where x = 2 for update; --error 1205 select * from t1 where x = 1 for update; rollback; Loading
sql/sql_select.cc +1 −0 Original line number Diff line number Diff line Loading @@ -10434,6 +10434,7 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab, */ join->examined_rows++; join->thd->row_count++; join_tab->read_record.file->unlock_row(); } return NESTED_LOOP_OK; } Loading