List:Commits« Previous MessageNext Message »
From:marko.makela Date:April 26 2010 10:27am
Subject:bzr commit into mysql-5.1-innodb branch (marko.makela:3417) Bug#52663
View as plain text  
#At file:///home/marko/innobase/dev/mysql/5.1-innodb/ based on revid:marko.makela@strippeddrl9fdlapx

 3417 Marko Mäkelä	2010-04-26
      row_search_for_mysql(): Never try semi-consistent read in unique searches.
      They are only useful in table scans. (Bug #52663)

    added:
      mysql-test/suite/innodb/r/innodb_bug52663.result
      mysql-test/suite/innodb/t/innodb_bug52663-master.opt
      mysql-test/suite/innodb/t/innodb_bug52663.test
      mysql-test/suite/innodb_plugin/r/innodb_bug52663.result
      mysql-test/suite/innodb_plugin/t/innodb_bug52663.test
    modified:
      storage/innobase/row/row0sel.c
      storage/innodb_plugin/ChangeLog
      storage/innodb_plugin/row/row0sel.c
=== added file 'mysql-test/suite/innodb/r/innodb_bug52663.result'
--- a/mysql-test/suite/innodb/r/innodb_bug52663.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb/r/innodb_bug52663.result	2010-04-26 10:27:25 +0000
@@ -0,0 +1,26 @@
+set session transaction isolation level read committed;
+create table innodb_bug52663 (what varchar(5), id integer, count integer, primary key
+(what, id)) engine=innodb;
+insert into innodb_bug52663 values ('total', 0, 0);
+begin;
+set session transaction isolation level read committed;
+begin;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+what	id	count
+total	0	1
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+select * from innodb_bug52663;
+what	id	count
+total	0	0
+commit;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+commit;
+select * from innodb_bug52663;
+what	id	count
+total	0	2
+select * from innodb_bug52663;
+what	id	count
+total	0	2
+drop table innodb_bug52663;

=== added file 'mysql-test/suite/innodb/t/innodb_bug52663-master.opt'
--- a/mysql-test/suite/innodb/t/innodb_bug52663-master.opt	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb/t/innodb_bug52663-master.opt	2010-04-26 10:27:25 +0000
@@ -0,0 +1 @@
+--innodb_lock_wait_timeout=1

=== added file 'mysql-test/suite/innodb/t/innodb_bug52663.test'
--- a/mysql-test/suite/innodb/t/innodb_bug52663.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb/t/innodb_bug52663.test	2010-04-26 10:27:25 +0000
@@ -0,0 +1,34 @@
+--source include/have_innodb.inc
+
+set session transaction isolation level read committed;
+
+create table innodb_bug52663 (what varchar(5), id integer, count integer, primary key
+(what, id)) engine=innodb;
+insert into innodb_bug52663 values ('total', 0, 0);
+begin;
+
+connect (addconroot, localhost, root,,);
+connection addconroot;
+set session transaction isolation level read committed;
+begin;
+
+connection default;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+
+connection addconroot;
+--error ER_LOCK_WAIT_TIMEOUT
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+
+connection default;
+commit;
+
+connection addconroot;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+commit;
+select * from innodb_bug52663;
+
+connection default;
+select * from innodb_bug52663;
+drop table innodb_bug52663;

=== added file 'mysql-test/suite/innodb_plugin/r/innodb_bug52663.result'
--- a/mysql-test/suite/innodb_plugin/r/innodb_bug52663.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb_plugin/r/innodb_bug52663.result	2010-04-26 10:27:25 +0000
@@ -0,0 +1,26 @@
+set session transaction isolation level read committed;
+create table innodb_bug52663 (what varchar(5), id integer, count integer, primary key
+(what, id)) engine=innodb;
+insert into innodb_bug52663 values ('total', 0, 0);
+begin;
+set session transaction isolation level read committed;
+begin;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+what	id	count
+total	0	1
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+select * from innodb_bug52663;
+what	id	count
+total	0	0
+commit;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+commit;
+select * from innodb_bug52663;
+what	id	count
+total	0	2
+select * from innodb_bug52663;
+what	id	count
+total	0	2
+drop table innodb_bug52663;

=== added file 'mysql-test/suite/innodb_plugin/t/innodb_bug52663.test'
--- a/mysql-test/suite/innodb_plugin/t/innodb_bug52663.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb_plugin/t/innodb_bug52663.test	2010-04-26 10:27:25 +0000
@@ -0,0 +1,34 @@
+--source include/have_innodb_plugin.inc
+
+set session transaction isolation level read committed;
+
+create table innodb_bug52663 (what varchar(5), id integer, count integer, primary key
+(what, id)) engine=innodb;
+insert into innodb_bug52663 values ('total', 0, 0);
+begin;
+
+connect (addconroot, localhost, root,,);
+connection addconroot;
+set session transaction isolation level read committed;
+begin;
+
+connection default;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+
+connection addconroot;
+--error ER_LOCK_WAIT_TIMEOUT
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+
+connection default;
+commit;
+
+connection addconroot;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+commit;
+select * from innodb_bug52663;
+
+connection default;
+select * from innodb_bug52663;
+drop table innodb_bug52663;

=== modified file 'storage/innobase/row/row0sel.c'
--- a/storage/innobase/row/row0sel.c	2010-03-15 08:17:31 +0000
+++ b/storage/innobase/row/row0sel.c	2010-04-26 10:27:25 +0000
@@ -3956,6 +3956,7 @@ no_gap_lock:
 		case DB_LOCK_WAIT:
 			if (UNIV_LIKELY(prebuilt->row_read_type
 					!= ROW_READ_TRY_SEMI_CONSISTENT)
+			    || unique_search
 			    || index != clust_index) {
 
 				goto lock_wait_or_error;

=== modified file 'storage/innodb_plugin/ChangeLog'
--- a/storage/innodb_plugin/ChangeLog	2010-04-22 09:33:42 +0000
+++ b/storage/innodb_plugin/ChangeLog	2010-04-26 10:27:25 +0000
@@ -1,3 +1,9 @@
+2010-04-26	The InnoDB Team
+
+	* row/row0sel.c:
+	Fix Bug#52663 Lost update incrementing column value under
+	READ COMMITTED isolation level
+
 2010-04-22	The InnoDB Team
 
 	* include/dict0boot.h, dict/dict0boot.c:

=== modified file 'storage/innodb_plugin/row/row0sel.c'
--- a/storage/innodb_plugin/row/row0sel.c	2010-03-31 07:49:08 +0000
+++ b/storage/innodb_plugin/row/row0sel.c	2010-04-26 10:27:25 +0000
@@ -4027,6 +4027,7 @@ no_gap_lock:
 		case DB_LOCK_WAIT:
 			if (UNIV_LIKELY(prebuilt->row_read_type
 					!= ROW_READ_TRY_SEMI_CONSISTENT)
+			    || unique_search
 			    || index != clust_index) {
 
 				goto lock_wait_or_error;

Attachment: [text/bzr-bundle] bzr/marko.makela@oracle.com-20100426102725-as2vc44ddykg1786.bundle
Thread
bzr commit into mysql-5.1-innodb branch (marko.makela:3417) Bug#52663marko.makela26 Apr