diff --git a/bin/pt-query-digest b/bin/pt-query-digest index 206774d3..b104aaa8 100755 --- a/bin/pt-query-digest +++ b/bin/pt-query-digest @@ -13045,7 +13045,7 @@ sub main { # ####################################################################### my $q = new Quoter(); my $qp = new QueryParser(); - my $qr = new QueryRewriter(QueryParser=>$qp); + my $qr = new QueryRewriter(QueryParser=>$qp, match_embedded_numbers => $o->get('preserve-embedded-numbers') ? 1 : 0); my %common_modules = ( OptionParser => $o, DSNParser => $dp, @@ -15863,6 +15863,14 @@ short form: -P; type: int Port number to use for connection. +=item --preserve-embedded-numbers + +Preserve numbers in database/table names when fingerprinting queries. +The standar fingeprint method replaces numbers in db/tables names, making +a query like 'SELECT * FROM db1.table2' to be figerprinted as 'SELECT * FROM db?.table?'. +This option changes that behaviour and the fingerprint will become +'SELECT * FROM db1.table2'. + =item --processlist type: DSN diff --git a/t/lib/QueryRewriter.t b/t/lib/QueryRewriter.t index 1fa43762..5c567662 100644 --- a/t/lib/QueryRewriter.t +++ b/t/lib/QueryRewriter.t @@ -1465,6 +1465,18 @@ is( ); +$qr = new QueryRewriter( + QueryParser => $qp, + match_embedded_numbers => 1, +); + +is( + $qr->fingerprint( + "SELECT * FROM prices2.t1 where id=1" + ), + "select * from prices2.t1 where id=?", + "Fingerprint db.tblname (preserve number)" +); # ############################################################################# # Done. diff --git a/t/pt-query-digest/explain.t b/t/pt-query-digest/explain.t index 76b251c7..06f540aa 100644 --- a/t/pt-query-digest/explain.t +++ b/t/pt-query-digest/explain.t @@ -107,6 +107,23 @@ ok( "--explain sparkline uses event db and doesn't crash ea (issue 1196)" ); +$sb->load_file('master', "t/pt-query-digest/samples/issue_1604834.sql"); +# +warn "$trunk/t/pt-query-digest/samples/issue_1196.log"; +ok( + no_diff( + sub { pt_query_digest::main(@args, + '--report-format', 'profile,query_report', "--preserve-embedded-numbers", + "$trunk/t/pt-query-digest/samples/issue_1196.log",) + }, + ( $sandbox_version ge '5.7' ? "$sample/issue_1196-output-5.7.txt" + : $sandbox_version ge '5.6' ? "$sample/issue_1196-output-5.6.txt" + : $sandbox_version ge '5.1' ? "$sample/issue_1196-output.txt" + : "$sample/issue_1196-output-5.0.txt"), + ), + "--preserve-embedded-numbers" +); + # ############################################################################# # Done. # ############################################################################# diff --git a/t/pt-query-digest/samples/issue_1604834.sql b/t/pt-query-digest/samples/issue_1604834.sql new file mode 100644 index 00000000..b27a19a2 --- /dev/null +++ b/t/pt-query-digest/samples/issue_1604834.sql @@ -0,0 +1,5 @@ +drop database if exists issue_1196; +create database issue_1196; +use issue_1196; +create table t (a int); +insert into t values (1),(2),(4),(5),(20),(20900),(228),(33),(89),(22828),(9292),(3939),(1111),(0);