diff --git a/bin/pt-table-checksum b/bin/pt-table-checksum index 66b5f7ce..d29f57e1 100755 --- a/bin/pt-table-checksum +++ b/bin/pt-table-checksum @@ -3778,7 +3778,7 @@ sub set_nibble_number { sub nibble_index { my ($self) = @_; - return lc($self->{index}); + return $self->{index}; } sub statements { @@ -6400,7 +6400,8 @@ sub main { sth => $sth->{explain_upper_boundary}, vals => [ @{$boundary->{lower}}, $nibble_iter->chunk_size() ], ); - if ( lc($expl->{key} || '') ne $nibble_iter->nibble_index() ) { + if ( lc($expl->{key} || '') + ne lc($nibble_iter->nibble_index() || '') ) { PTDEBUG && _d('Cannot nibble next chunk, aborting table'); if ( $o->get('quiet') < 2 ) { my $msg @@ -6468,7 +6469,8 @@ sub main { : 0; # Ensure that MySQL is using the chunk index. - if ( lc($expl->{key} || '') ne $nibble_iter->nibble_index() ) { + if ( lc($expl->{key} || '') + ne lc($nibble_iter->nibble_index() || '') ) { PTDEBUG && _d('Chunk', $args{nibbleno}, 'of table', "$tbl->{db}.$tbl->{tbl} not using chunk index, skipping"); return 0; # next boundary @@ -7267,7 +7269,7 @@ sub have_more_chunks { # The previous chunk index must match the current chunk index, # else we don't know what to do. - my $chunk_index = $nibble_iter->nibble_index() || ''; + my $chunk_index = lc($nibble_iter->nibble_index() || ''); if (lc($last_chunk->{chunk_index} || '') ne $chunk_index) { warn ts("Cannot resume from table $tbl->{db}.$tbl->{tbl} chunk " . "$last_chunk->{chunk} because the chunk indexes are different: " diff --git a/lib/NibbleIterator.pm b/lib/NibbleIterator.pm index fd8a9ad4..93f9a28c 100644 --- a/lib/NibbleIterator.pm +++ b/lib/NibbleIterator.pm @@ -347,7 +347,7 @@ sub set_nibble_number { sub nibble_index { my ($self) = @_; - return lc($self->{index}); + return $self->{index}; } sub statements { diff --git a/t/pt-table-checksum/samples/no-recheck.txt b/t/pt-table-checksum/samples/no-recheck.txt index bc1eae68..e03c1a8c 100644 --- a/t/pt-table-checksum/samples/no-recheck.txt +++ b/t/pt-table-checksum/samples/no-recheck.txt @@ -1,10 +1,10 @@ Differences on h=127.0.0.1,P=12346 TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY -sakila.city 1 0 1 primary 1 100 -sakila.city 6 0 1 primary 501 600 +sakila.city 1 0 1 PRIMARY 1 100 +sakila.city 6 0 1 PRIMARY 501 600 Differences on h=127.0.0.1,P=12347 TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY -sakila.city 1 0 1 primary 1 100 -sakila.city 6 0 1 primary 501 600 +sakila.city 1 0 1 PRIMARY 1 100 +sakila.city 6 0 1 PRIMARY 501 600 diff --git a/t/pt-table-sync/basics.t b/t/pt-table-sync/basics.t index 09020277..e132b02c 100644 --- a/t/pt-table-sync/basics.t +++ b/t/pt-table-sync/basics.t @@ -28,7 +28,7 @@ elsif ( !$slave_dbh ) { plan skip_all => 'Cannot connect to sandbox slave'; } else { - plan tests => 19; + plan tests => 21; } $sb->wipe_clean($master_dbh); @@ -198,6 +198,41 @@ is( "Synced diff (bug 911996)" ); +# Fix bug 927771. +$sb->load_file('master', 't/pt-table-sync/samples/bug_927771.sql'); +PerconaTest::wait_for_table($slave_dbh, "test.t", "c='j'"); + +$slave_dbh->do("update test.t set c='z' where id>8"); + +`$trunk/bin/pt-table-checksum h=127.1,P=12345,u=msandbox,p=msandbox --max-load '' --lock-wait 3 --chunk-size 2 -t test.t --quiet`; + +PerconaTest::wait_for_table($slave_dbh, "percona.checksums", "db='test' and tbl='t' and chunk=4"); + +$output = output( + sub { + pt_table_sync::main('h=127.1,P=12345,u=msandbox,p=msandbox', + qw(--print --execute --replicate percona.checksums), + qw(--no-foreign-key-checks)) + }, + stderr => 1, +); + +like( + $output, + qr/REPLACE INTO `test`.`t`\(`id`, `c`\) VALUES \('9', 'i'\)/, + "--replicate with uc index (bug 927771)" +); + +my $rows = $slave_dbh->selectall_arrayref("select id, c from test.t where id>8 order by id"); +is_deeply( + $rows, + [ + [9, 'i'], + [10, 'j'], + ], + "Synced slaved (bug 927771)" +); + # ############################################################################# # Done. # ############################################################################# diff --git a/t/pt-table-sync/samples/bug_927771.sql b/t/pt-table-sync/samples/bug_927771.sql new file mode 100644 index 00000000..928ca429 --- /dev/null +++ b/t/pt-table-sync/samples/bug_927771.sql @@ -0,0 +1,18 @@ +drop database if exists test; +create database test; +use test; +create table t ( + id int auto_increment not null primary key, + c varchar(8) not null +) engine=innodb; +insert into test.t values + (null, 'a'), + (null, 'b'), + (null, 'c'), + (null, 'd'), + (null, 'e'), + (null, 'f'), + (null, 'g'), + (null, 'h'), + (null, 'i'), + (null, 'j');