From 17ecf7eb0a66ab60acd93ec2155976ed0933dbd5 Mon Sep 17 00:00:00 2001 From: Carlos Salguero Date: Thu, 23 Nov 2017 17:26:16 -0300 Subject: [PATCH] PT-225 pt-table-cheksum ignores generated columns --- Changelog | 4 ++ bin/pt-table-checksum | 2 +- t/pt-table-checksum/pt-225.t | 75 ++++++++++++++++++++++++++ t/pt-table-checksum/samples/pt-225.sql | 42 +++++++++++++++ 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 t/pt-table-checksum/pt-225.t create mode 100644 t/pt-table-checksum/samples/pt-225.sql diff --git a/Changelog b/Changelog index 221c52d6..4ee286d9 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,9 @@ Changelog for Percona Toolkit +v3.0.6 + + * Fixed bug PT-225: pt-table-checksum ignores generated cols + v3.0.5 released 2017-11-20 * Improvement PMM-1590: Improve MongoDB Profiler for PMM and PT diff --git a/bin/pt-table-checksum b/bin/pt-table-checksum index 6f8052d8..08ecb737 100755 --- a/bin/pt-table-checksum +++ b/bin/pt-table-checksum @@ -10705,7 +10705,7 @@ sub main { # TODO: this now happens in 3 places, search for 'columns'. my $tbl_struct = $tbl->{tbl_struct}; my $ignore_col = $o->get('ignore-columns') || {}; - my $all_cols = $o->get('columns') || $tbl_struct->{cols}; + my $all_cols = $o->get('columns') || $tbl_struct->{non_generated_cols}; my @cols = map { lc $_ } grep { !$ignore_col->{$_} } @$all_cols; diff --git a/t/pt-table-checksum/pt-225.t b/t/pt-table-checksum/pt-225.t new file mode 100644 index 00000000..f869189d --- /dev/null +++ b/t/pt-table-checksum/pt-225.t @@ -0,0 +1,75 @@ +#!/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 => 3; +} + +diag("loading samples"); + +$sb->load_file('master', 't/pt-table-checksum/samples/pt-225.sql'); + +# 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 = $sb->dsn_for('master'); +diag("setting up the slaves"); +my $slave_dbh = $sb->get_dbh_for('slave1'); +# Create differences + +$slave_dbh->do('DELETE FROM `test`.`sbtest1` WHERE id > 15'); +$slave_dbh->do('FLUSH TABLES'); + +my @args = ($master_dsn, "--set-vars", "innodb_lock_wait_timeout=50", + "--ignore-databases", "mysql,sys,sakila,percona_test", + "--nocheck-replication-filters"); +my $output; +my $exit_status; + +# Test #1 +$output = output( + sub { $exit_status = pt_table_checksum::main(@args) }, + stderr => 1, +); + +isnt( + $exit_status, + 0, + "PT-225 virtual/generated columns are ignored - exit status", +); + +like( + $output, + qr/1\s+\d+\s+\d+\s+\d+\s+.*test.sbtest1/, + "PT-225 virtual/generated columns were ignored", +); + + +# ############################################################################# +# 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/pt-225.sql b/t/pt-table-checksum/samples/pt-225.sql new file mode 100644 index 00000000..1edd918d --- /dev/null +++ b/t/pt-table-checksum/samples/pt-225.sql @@ -0,0 +1,42 @@ +DROP DATABASE IF EXISTS test; +CREATE DATABASE test; + +USE test; + +CREATE TABLE `sbtest1` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `k` int(11) NOT NULL DEFAULT '0', + `c` char(120) NOT NULL DEFAULT '', + `pad` char(60) NOT NULL DEFAULT '', + `json_test_v` json GENERATED ALWAYS AS (json_array(`k`,`c`,`pad`)) VIRTUAL, + `json_test_s` json GENERATED ALWAYS AS (json_array(`k`,`c`,`pad`)) STORED, + `json_test_index` varchar(255) GENERATED ALWAYS AS (json_array(`k`,`c`,`pad`)) STORED, + PRIMARY KEY (`id`), + KEY `k_1` (`k`), + KEY `json_test_index` (`json_test_index`) +) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=latin1 COMPRESSION='lz4'; + + +/*!40000 ALTER TABLE `sbtest1` DISABLE KEYS */; +INSERT INTO `sbtest1` (`id`, `k`, `c`, `pad`) VALUES +(01,583532949,'at non eaque sint velit enim facilis quisquam nam quaerat.','impedit quae hic possimus ullam est eos totam qui.'), +(02,583532949,'eos exercitationem quisquam saepe totam dolore consequatur.','sit commodi consequatur neque qui.'), +(03,1342458479,'et quia sunt eum eveniet non eum nobis quia est mollitia.','corrupti minima et quibusdam.'), +(04,280366509,'ab minima laudantium!','est sed autem quia nobis suscipit pariatur modi!'), +(05,1801160058,'perspiciatis tenetur minima accusantium consequatur in et.','rerum quo molestiae voluptates harum aspernatur sunt.'), +(06,914091476,'quas aut nostrum a.','harum tempora adipisci et et.'), +(07,1022430181,'qui voluptates inventore voluptatem voluptas numquam blanditiis corporis illum doloremque aut!','dicta neque laboriosam voluptatibus.'), +(08,165910161,'voluptas molestiae harum quis quod.','voluptatem deleniti dolor blanditiis est earum.'), +(09,1255569388,'consequuntur nihil non veniam et possimus sunt.','est est possimus recusandae ab.'), +(10,1375471152,'doloribus quasi quasi eum hic et laborum autem laudantium saepe veritatis.','enim earum et placeat animi ut.'), +(11,1705409249,'eveniet recusandae expedita est consectetur ut laudantium temporibus.','et asperiores porro id sunt totam maiores eum quidem.'), +(12,2003588754,'debitis molestias voluptatibus quia.','sint est voluptatem nihil et.'), +(13,1714682759,'voluptas officiis culpa quaerat sit quis.','vitae omnis repellat rerum consectetur ex.'), +(14,1898674299,'et est quibusdam!','aut est labore.'), +(15,1698116023,'similique nisi quisquam pariatur minus repudiandae ducimus.','eveniet rem nihil voluptatibus voluptatem non.'), +(16,1310715836,'expedita ipsum aut veniam!','incidunt at officia nisi.'), +(17,472875023,'numquam et quaerat voluptatibus.','commodi natus consequatur reiciendis adipisci ut.'), +(18,1153628287,'aut quam quia vel molestiae qui.','eos voluptas quod doloremque!'), +(19,525456967,'dignissimos quibusdam aut et.','laborum reprehenderit eius consequatur qui.'), +(20,1396416465,'aperiam sint et.','fugiat neque impedit cumque soluta.'), +(21,1640670520,'nisi repellendus et velit ab.','incidunt quo eligendi.');