Commit 061ea692 authored by unknown's avatar unknown

Merge bk-internal.mysql.com:/home/bk/mysql-5.1-runtime

into  mockturtle.local:/home/dlenev/src/mysql-5.1-bg20390

parents ce3a483d 54df7b90
...@@ -87,11 +87,27 @@ x y z ...@@ -87,11 +87,27 @@ x y z
rollback; rollback;
commit; commit;
begin; 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; select * from t1 where y = 'one' or y = 'three' order by x for update;
x y z x y z
1 one 1 1 one 1
3 three 3 3 three 3
begin; begin;
select * from t1 where x = 2 for update;
x y z
2 two 2
select * from t1 where x = 1 for update; select * from t1 where x = 1 for update;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction ERROR HY000: Lock wait timeout exceeded; try restarting transaction
rollback; rollback;
...@@ -124,6 +140,22 @@ ERROR HY000: Lock wait timeout exceeded; try restarting transaction ...@@ -124,6 +140,22 @@ ERROR HY000: Lock wait timeout exceeded; try restarting transaction
rollback; rollback;
commit; commit;
begin; 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; select * from t1 where y = 'one' or y = 'three' order by x lock in share mode;
x y z x y z
1 one 1 1 one 1
...@@ -132,6 +164,9 @@ begin; ...@@ -132,6 +164,9 @@ begin;
select * from t1 where y = 'one' lock in share mode; select * from t1 where y = 'one' lock in share mode;
x y z x y z
1 one 1 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; select * from t1 where x = 1 for update;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction ERROR HY000: Lock wait timeout exceeded; try restarting transaction
rollback; rollback;
......
...@@ -102,16 +102,36 @@ connection con1; ...@@ -102,16 +102,36 @@ connection con1;
commit; commit;
# table scan # 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; connection con1;
begin; 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; connection con2;
begin; begin;
# Have to check with pk access here since scans take locks on # Have to check with pk access here since scans take locks on
# all rows and then release them in chunks # 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 --error 1205
select * from t1 where x = 1 for update; select * from t1 where x = 1 for update;
rollback; rollback;
...@@ -157,15 +177,32 @@ commit; ...@@ -157,15 +177,32 @@ commit;
# table scan # table scan
connection con1; connection con1;
begin; 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; connection con2;
begin; begin;
select * from t1 where y = 'one' lock in share mode; select * from t1 where y = 'one' lock in share mode;
# Have to check with pk access here since scans take locks on # Have to check with pk access here since scans take locks on
# all rows and then release them in chunks # 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 --error 1205
select * from t1 where x = 1 for update; select * from t1 where x = 1 for update;
rollback; rollback;
......
...@@ -10646,6 +10646,7 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab, ...@@ -10646,6 +10646,7 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
*/ */
join->examined_rows++; join->examined_rows++;
join->thd->row_count++; join->thd->row_count++;
join_tab->read_record.file->unlock_row();
} }
return NESTED_LOOP_OK; return NESTED_LOOP_OK;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment