diff --git a/bin/pt-upgrade b/bin/pt-upgrade index f2cf860a..5f4e250e 100755 --- a/bin/pt-upgrade +++ b/bin/pt-upgrade @@ -5271,7 +5271,7 @@ sub next { } if ( $self->read_only ) { - if ( $event->{arg} !~ m/(?:^SELECT|(?:\*\/\s*SELECT))/i ) { + if ( $event->{arg} !~ m{^(?:/\*[^!].*?\*/)?\s*(?:SELECT|SET)}i ) { PTDEBUG && _d('Skipping non-SELECT query'); $self->stats->{not_select}++; next EVENT; diff --git a/lib/QueryIterator.pm b/lib/QueryIterator.pm index 766fa323..2a5f79f5 100644 --- a/lib/QueryIterator.pm +++ b/lib/QueryIterator.pm @@ -215,7 +215,7 @@ sub next { } if ( $self->read_only ) { - if ( $event->{arg} !~ m/(?:^SELECT|(?:\*\/\s*SELECT))/i ) { + if ( $event->{arg} !~ m{^(?:/\*[^!].*?\*/)?\s*(?:SELECT|SET)}i ) { PTDEBUG && _d('Skipping non-SELECT query'); $self->stats->{not_select}++; next EVENT; diff --git a/t/lib/QueryIterator.t b/t/lib/QueryIterator.t index fea38f16..90148e37 100644 --- a/t/lib/QueryIterator.t +++ b/t/lib/QueryIterator.t @@ -10,39 +10,31 @@ use strict; use warnings FATAL => 'all'; use English qw(-no_match_vars); use Test::More; -use Data::Dumper; -use FileIterator; use QueryRewriter; +use FileIterator; use QueryIterator; -use SlowLogParser; +use RawLogParser; use PerconaTest; -my $parser = SlowLogParser->new(); -my $qr = QueryRewriter->new(); -my $file_iter = FileIterator->new(); +use constant PTDEBUG => $ENV{PTDEBUG} || 0; -my $oktorun = 1; -my $sample = "t/lib/samples/slowlogs"; +use Data::Dumper; +$Data::Dumper::Indent = 1; +$Data::Dumper::Sortkeys = 1; +$Data::Dumper::Quotekeys = 0; + +my $sample = "$trunk/t/lib/samples/"; + +my $file_iter = FileIterator->new(); +my $parser = RawLogParser->new(); +my $qr = QueryRewriter->new(); +my $query_iter; sub test_query_iter { my (%args) = @_; - - my $files = $file_iter->get_file_itr( - @{$args{files}} - ); - - my $query_iter = QueryIterator->new( - file_iter => $files, - parser => $args{parser} || $parser, - fingerprint => sub { return $qr->fingerprint(@_) }, - oktorun => sub { return $oktorun }, - # Optional args - default_database => $args{default_database}, - ($args{filter} ? (filter => $args{filter}) : ()), - ($args{read_only} ? (read_only => $args{read_only}) : ()), - ($args{read_timeout} ? (read_timeout => $args{read_timeout}) : ()), - ); + my $file = $args{file}; + my $name = $args{name}; my @events; while ( my $event = $query_iter->next() ) { @@ -56,74 +48,37 @@ sub test_query_iter { ) or diag(Dumper(\@events)); } -my $slow001_events = [ - { - Lock_time => '0', - Query_time => '2', - Rows_examined => '0', - Rows_sent => '1', - arg => 'select sleep(2) from n', - bytes => 22, - cmd => 'Query', - db => 'test', - fingerprint => 'select sleep(?) from n', - host => 'localhost', - ip => '', - pos_in_log => 0, - ts => '071015 21:43:52', - user => 'root', - }, - { - Lock_time => '0', - Query_time => '2', - Rows_examined => '0', - Rows_sent => '1', - arg => 'select sleep(2) from test.n', - bytes => 27, - cmd => 'Query', - db => 'sakila', - fingerprint => 'select sleep(?) from test.n', - host => 'localhost', - ip => '', - pos_in_log => 359, - ts => '071015 21:45:10', - user => 'root', - } -]; +my $files = $file_iter->get_file_itr( + "$sample/rawlogs/rawlog002.txt", +); -test_query_iter( - name => "slow001.txt, defaults", - files => [ - "$trunk/$sample/slow001.txt" - ], - expect => $slow001_events, +$query_iter = QueryIterator->new( + file_iter => $files, + parser => $parser, + fingerprint => sub { return $qr->fingerprint(@_) }, + oktorun => sub { return 1 }, + read_only => 1, ); test_query_iter( - name => "slow001.txt, read_timeout=5", - read_timeout => 5, - files => [ - "$trunk/$sample/slow001.txt" - ], - expect => $slow001_events, -); + name => "rawlog002.txt read-only", + expect => [ + { pos_in_log => 0, + arg => 'SELECT c FROM t WHERE id=1', + bytes => 26, + cmd => 'Query', + Query_time => 0, + fingerprint => 'select c from t where id=?', + }, + { pos_in_log => 27, + arg => '/* Hello, world! */ SELECT * FROM t2 LIMIT 1', + bytes => 44, + cmd => 'Query', + Query_time => 0, + fingerprint => 'select * from t? limit ?', + } -test_query_iter( - name => "slow001.txt, read_only", - read_only => 1, - files => [ - "$trunk/$sample/slow001.txt" ], - expect => $slow001_events, -); - -test_query_iter( - name => "slow001.txt, in-line filter", - filter => '$event->{db} eq "test"', - files => [ - "$trunk/$sample/slow001.txt" - ], - expect => [ $slow001_events->[0] ], ); # ############################################################################# diff --git a/t/lib/samples/rawlogs/rawlog002.txt b/t/lib/samples/rawlogs/rawlog002.txt new file mode 100644 index 00000000..a437b598 --- /dev/null +++ b/t/lib/samples/rawlogs/rawlog002.txt @@ -0,0 +1,4 @@ +SELECT c FROM t WHERE id=1 +/* Hello, world! */ SELECT * FROM t2 LIMIT 1 +INSERT INTO t (a, b) VALUES ('foo', 'bar') +INSERT INTO t SELECT * FROM monkeys