From 162350a804661dda56b60f8b415f5be71f731738 Mon Sep 17 00:00:00 2001 From: Frank Cizmich Date: Mon, 30 Mar 2015 16:20:18 -0300 Subject: [PATCH] pt-upgrade failed on SELECT..INTO statements --- bin/pt-upgrade | 12 +++-- lib/ResultWriter.pm | 4 +- t/pt-upgrade/issue_1421781.t | 66 ++++++++++++++++++++++++++++ t/pt-upgrade/samples/select_into.log | 4 ++ 4 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 t/pt-upgrade/issue_1421781.t create mode 100644 t/pt-upgrade/samples/select_into.log diff --git a/bin/pt-upgrade b/bin/pt-upgrade index fb9441bd..ecf5150a 100755 --- a/bin/pt-upgrade +++ b/bin/pt-upgrade @@ -6304,7 +6304,11 @@ sub save { else { my $rows; if ( my $sth = $results->{sth} ) { - if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i ) { + # Only fetch rows of select statements + # *except* when they are directed INTO + # a file or a variable. (issue lp:1421781) + if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i + && $event->{arg} !~ /INTO\s*(?:OUTFILE|DUMPFILE|@)/ ) { $rows = $sth->fetchall_arrayref(); } eval { @@ -10120,9 +10124,11 @@ sub save_and_report_results { ignore_warnings => $ignore_warnings, ); - # Only SELECT statements return rows. + # Only SELECT statements return rows, *except* when they are directed + # INTO a file or a variable. my $row_diffs; - if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i ) { + if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i + && $event->{arg} !~ m/INTO\s*(?:OUTFILE|DUMPFILE|@)/i ) { $row_diffs = diff_rows( sth1 => $results1->{sth}, sth2 => $results2->{sth}, diff --git a/lib/ResultWriter.pm b/lib/ResultWriter.pm index 34f60b8a..f33f4c22 100644 --- a/lib/ResultWriter.pm +++ b/lib/ResultWriter.pm @@ -128,9 +128,11 @@ sub save { } else { # Save rows, if any (i.e. if it's a SELECT statement). + # *except* if it's a SELECT...INTO (issue lp:1421781) my $rows; if ( my $sth = $results->{sth} ) { - if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i ) { + if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i + && $event->{arg} !~ /INTO\s*(?:OUTFILE|DUMPFILE|@)/ ) { $rows = $sth->fetchall_arrayref(); } eval { diff --git a/t/pt-upgrade/issue_1421781.t b/t/pt-upgrade/issue_1421781.t new file mode 100644 index 00000000..3ebbf2a3 --- /dev/null +++ b/t/pt-upgrade/issue_1421781.t @@ -0,0 +1,66 @@ +#!/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 File::Basename; +use File::Temp qw(tempdir); + +$ENV{PERCONA_TOOLKIT_TEST_USE_DSN_NAMES} = 1; +$ENV{PRETTY_RESULTS} = 1; + +use PerconaTest; +use Sandbox; +require "$trunk/bin/pt-upgrade"; + +my $dp = new DSNParser(opts=>$dsn_opts); +my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); +my $dbh1 = $sb->get_dbh_for('host1'); + + +if ( !$dbh1 ) { + plan skip_all => 'Cannot connect to sandbox host1'; +} + +my $host1_dsn = $sb->dsn_for('host1'); +my $tmpdir = tempdir("/tmp/pt-upgrade.$PID.XXXXXX", CLEANUP => 1); +my $samples = "$trunk/t/pt-upgrade/samples"; +my $lib_samples = "$trunk/t/lib/samples"; +my $exit_status = 0; +my $output; + +# ############################################################################# +# genlog +# ############################################################################# + +`rm -f /tmp/test_select_into_*.log`; + +$output = output( + sub { + $exit_status = pt_upgrade::main($host1_dsn, '--save-results', $tmpdir, + qw(--type rawlog), + "$samples/select_into.log", + )}, + stderr => 1, +); + +is( + $exit_status, + 0, + "Does not fail on SELECT...INTO statements" +); + + +# ############################################################################# +# Done. +# ############################################################################# +$sb->wipe_clean($dbh1); +ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); +done_testing; diff --git a/t/pt-upgrade/samples/select_into.log b/t/pt-upgrade/samples/select_into.log new file mode 100644 index 00000000..8e23ef53 --- /dev/null +++ b/t/pt-upgrade/samples/select_into.log @@ -0,0 +1,4 @@ +SELECT 1 INTO @foo; +SELECT * FROM sakila.actor INTO OUTFILE '/tmp/test_select_into_1.log'; +SELECT actor_id,first_name FROM sakila.actor INTO DUMPFILE '/tmp/test_select_into_2.log'; +