diff --git a/lib/RowChecksum.pm b/lib/RowChecksum.pm index 3d6e814a..1833437a 100644 --- a/lib/RowChecksum.pm +++ b/lib/RowChecksum.pm @@ -224,6 +224,9 @@ sub get_checksum_columns { elsif ( $trim && $type =~ m/varchar/ ) { $result = "TRIM($result)"; } + elsif ( $type =~ m/blob|text|binary/ ) { + $result = "CRC32($result)"; + } $result; } grep { diff --git a/sandbox/servers/5.6/my.sandbox.cnf b/sandbox/servers/5.6/my.sandbox.cnf index f47ab48d..24bfa584 100644 --- a/sandbox/servers/5.6/my.sandbox.cnf +++ b/sandbox/servers/5.6/my.sandbox.cnf @@ -15,7 +15,7 @@ innodb_buffer_pool_size = 16M innodb_data_home_dir = /tmp/PORT/data innodb_log_group_home_dir = /tmp/PORT/data innodb_data_file_path = ibdata1:10M:autoextend -innodb_log_file_size = 5M +innodb_log_file_size = 64M log-bin = mysql-bin relay_log = mysql-relay-bin log_slave_updates diff --git a/t/pt-table-checksum/issue_1592608.t b/t/pt-table-checksum/issue_1592608.t new file mode 100644 index 00000000..788fac8e --- /dev/null +++ b/t/pt-table-checksum/issue_1592608.t @@ -0,0 +1,64 @@ +#!/usr/bin/env perl + +BEGIN { + die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n" + unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH}; + unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib"; +}; + +use strict; +use warnings FATAL => 'all'; +use English qw(-no_match_vars); +use Test::More; + +use PerconaTest; +use Sandbox; +use SqlModes; +require "$trunk/bin/pt-table-checksum"; + +my $dp = new DSNParser(opts=>$dsn_opts); +my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); +my $dbh = $sb->get_dbh_for('master'); + +if ( !$dbh ) { + plan skip_all => 'Cannot connect to sandbox master'; +} +else { + plan tests => 2; +} + +# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic +# so we need to specify --set-vars innodb_lock_wait_timeout=3 else the tool will die. +# And --max-load "" prevents waiting for status variables. +my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox,D=bug_1592608'; +my @args = ($master_dsn, qw(--set-vars innodb_lock_wait_timeout=3), '--max-load', ''); +my $output; + +# We test that checksum works with invalid dates, +# but for that we need to turn off MySQL's NO_ZERO_IN_DATE mode +my $modes = new SqlModes($dbh, global=>1); +$modes->del('NO_ZERO_IN_DATE'); +$sb->load_file('master', 't/pt-table-checksum/samples/issue_1592608.sql'); +# ############################################################################# +# Issue 602: mk-table-checksum issue with invalid dates +# ############################################################################# + +#sub { pt_table_checksum::main(@args, qw(-t issue_1592608.t --tables t )) }, +$output = output( + sub { pt_table_checksum::main(@args, qw(-t t)) }, + stderr => 1, +); + +is( + PerconaTest::count_checksum_results($output, 'rows'), + 1, + "Large BLOB/TEXT/BINARY Checksum" +); + +$modes->restore_original_modes(); +# ############################################################################# +# Done. +# ############################################################################# +$sb->wipe_clean($dbh); +ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); +exit; diff --git a/t/pt-table-checksum/samples/issue_1592608.sql b/t/pt-table-checksum/samples/issue_1592608.sql new file mode 100644 index 00000000..4e5445a8 --- /dev/null +++ b/t/pt-table-checksum/samples/issue_1592608.sql @@ -0,0 +1,11 @@ +CREATE SCHEMA IF NOT EXISTS bug_1592608; +USE bug_1592608; +DROP TABLE IF EXISTS t; +CREATE TABLE t ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + a MEDIUMTEXT, + b MEDIUMBLOB +)engine=innodb; + +INSERT INTO t (a, b) VALUES (REPEAT('a', 2097152*2), CAST(REPEAT('a', 2097152*2) AS BINARY)); +