Commit b5fe0626 authored by unknown's avatar unknown

Fixed a bug checksum table locks the InnoDB table and does not use a

consistent read (Bug #12669).


mysql-test/r/innodb.result:
  Added test results for a checksum test.
mysql-test/t/innodb.test:
  Added test case for a checksum bug #12669.
sql/ha_innodb.cc:
  Use consistent read for checksum table and convert MySQL lock type
  to the TL_READ because at the moment MySQL uses TL_READ_NO_INSERT.
parent c12bacd3
...@@ -1694,3 +1694,31 @@ select min(b) from t1 where a='8'; ...@@ -1694,3 +1694,31 @@ select min(b) from t1 where a='8';
min(b) min(b)
6 6
drop table t1; drop table t1;
create table test_checksum(a int not null) engine=innodb DEFAULT CHARSET=latin1;
insert into test_checksum values (1),(2);
set autocommit=0;
checksum table test_checksum;
Table Checksum
test.test_checksum 1531596814
insert into test_checksum values(3);
checksum table test_checksum;
Table Checksum
test.test_checksum 1531596814
commit;
checksum table test_checksum;
Table Checksum
test.test_checksum 2050879373
commit;
drop table test_checksum;
create table test_checksum(a int not null) engine=innodb DEFAULT CHARSET=latin1;
insert into test_checksum values (1),(2);
set autocommit=1;
checksum table test_checksum;
Table Checksum
test.test_checksum 1531596814
set autocommit=1;
insert into test_checksum values(3);
checksum table test_checksum;
Table Checksum
test.test_checksum 2050879373
drop table test_checksum;
...@@ -1239,4 +1239,45 @@ insert into t1 values ('8', '6'), ('4', '7'); ...@@ -1239,4 +1239,45 @@ insert into t1 values ('8', '6'), ('4', '7');
select min(a) from t1; select min(a) from t1;
select min(b) from t1 where a='8'; select min(b) from t1 where a='8';
drop table t1; drop table t1;
#
# Test that checksum table uses a consistent read Bug #12669
#
connect (a,localhost,root,,);
connect (b,localhost,root,,);
connection a;
create table test_checksum(a int not null) engine=innodb DEFAULT CHARSET=latin1;
insert into test_checksum values (1),(2);
set autocommit=0;
checksum table test_checksum;
connection b;
insert into test_checksum values(3);
connection a;
#
# Here checksum should not see insert
#
checksum table test_checksum;
connection a;
commit;
checksum table test_checksum;
commit;
drop table test_checksum;
#
# autocommit = 1
#
connection a;
create table test_checksum(a int not null) engine=innodb DEFAULT CHARSET=latin1;
insert into test_checksum values (1),(2);
set autocommit=1;
checksum table test_checksum;
connection b;
set autocommit=1;
insert into test_checksum values(3);
connection a;
#
# Here checksum sees insert
#
checksum table test_checksum;
drop table test_checksum;
# End of 4.1 tests # End of 4.1 tests
...@@ -5421,6 +5421,13 @@ ha_innobase::store_lock( ...@@ -5421,6 +5421,13 @@ ha_innobase::store_lock(
prebuilt->select_lock_type = LOCK_NONE; prebuilt->select_lock_type = LOCK_NONE;
prebuilt->stored_select_lock_type = LOCK_NONE; prebuilt->stored_select_lock_type = LOCK_NONE;
} else if (thd->lex->sql_command == SQLCOM_CHECKSUM) {
/* Use consistent read for checksum table and
convert lock type to the TL_READ */
prebuilt->select_lock_type = LOCK_NONE;
prebuilt->stored_select_lock_type = LOCK_NONE;
lock.type = TL_READ;
} else { } else {
prebuilt->select_lock_type = LOCK_S; prebuilt->select_lock_type = LOCK_S;
prebuilt->stored_select_lock_type = LOCK_S; prebuilt->stored_select_lock_type = LOCK_S;
......
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