mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-21 19:34:52 +00:00
Add fingerprint_md5 and preserve_embedded_numbers flags to QueryRewriter, used in fingerprint() to handle customer's requirements.
This commit is contained in:
@@ -175,10 +175,30 @@ sub fingerprint {
|
|||||||
$query =~ s/\\["']//g; # quoted strings
|
$query =~ s/\\["']//g; # quoted strings
|
||||||
$query =~ s/".*?"/?/sg; # quoted strings
|
$query =~ s/".*?"/?/sg; # quoted strings
|
||||||
$query =~ s/'.*?'/?/sg; # quoted strings
|
$query =~ s/'.*?'/?/sg; # quoted strings
|
||||||
# This regex is extremely broad in its definition of what looks like a
|
|
||||||
# number. That is for speed.
|
# MD5 checksums which are always 32 hex chars
|
||||||
$query =~ s/[0-9+-][0-9a-f.xb+-]*/?/g;# Anything vaguely resembling numbers
|
if ( $self->{fingerprint_md5} ) {
|
||||||
$query =~ s/[xb.+-]\?/?/g; # Clean up leftovers
|
$query =~ s/([._-])[a-f0-9]{32}/$1?/g;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Things resembling numbers/hex.
|
||||||
|
if ( !$self->{preserve_embedded_numbers} ) {
|
||||||
|
# For speed, this regex is extremely broad in its definition
|
||||||
|
# of what looks like a number.
|
||||||
|
$query =~ s/[0-9+-][0-9a-f.xb+-]*/?/g;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$query =~ s/\b[0-9+-][0-9a-f.xb+-]*/?/g;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Clean up leftovers
|
||||||
|
if ( $self->{fingerprint_md5} ) {
|
||||||
|
$query =~ s/[xb+-]\?/?/g;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$query =~ s/[xb.+-]\?/?/g;
|
||||||
|
}
|
||||||
|
|
||||||
$query =~ s/\A\s+//; # Chop off leading whitespace
|
$query =~ s/\A\s+//; # Chop off leading whitespace
|
||||||
chomp $query; # Kill trailing whitespace
|
chomp $query; # Kill trailing whitespace
|
||||||
$query =~ tr[ \n\t\r\f][ ]s; # Collapse whitespace
|
$query =~ tr[ \n\t\r\f][ ]s; # Collapse whitespace
|
||||||
|
@@ -10,7 +10,7 @@ BEGIN {
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings FATAL => 'all';
|
use warnings FATAL => 'all';
|
||||||
use English qw(-no_match_vars);
|
use English qw(-no_match_vars);
|
||||||
use Test::More tests => 266;
|
use Test::More tests => 271;
|
||||||
|
|
||||||
use QueryRewriter;
|
use QueryRewriter;
|
||||||
use QueryParser;
|
use QueryParser;
|
||||||
@@ -349,6 +349,64 @@ is(
|
|||||||
"Fingerprint LOAD DATA INFILE"
|
"Fingerprint LOAD DATA INFILE"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
# fingerprint MD5 checksums, 32 char hex strings. This is a
|
||||||
|
# special feature used by pt-fingerprint.
|
||||||
|
$qr = new QueryRewriter(
|
||||||
|
QueryParser => $qp,
|
||||||
|
fingerprint_md5 => 1,
|
||||||
|
);
|
||||||
|
|
||||||
|
is(
|
||||||
|
$qr->fingerprint(
|
||||||
|
"SELECT * FROM db.fbc5e685a5d3d45aa1d0347fdb7c4d35_temp where id=1"
|
||||||
|
),
|
||||||
|
"select * from db.?_temp where id=?",
|
||||||
|
"Fingerprint db.MD5_tbl"
|
||||||
|
);
|
||||||
|
|
||||||
|
is(
|
||||||
|
$qr->fingerprint(
|
||||||
|
"SELECT * FROM db.temp_fbc5e685a5d3d45aa1d0347fdb7c4d35 where id=1"
|
||||||
|
),
|
||||||
|
"select * from db.temp_? where id=?",
|
||||||
|
"Fingerprint db.tbl_MD5"
|
||||||
|
);
|
||||||
|
|
||||||
|
$qr = new QueryRewriter(
|
||||||
|
QueryParser => $qp,
|
||||||
|
fingerprint_md5 => 1,
|
||||||
|
preserve_embedded_numbers => 1,
|
||||||
|
);
|
||||||
|
|
||||||
|
is(
|
||||||
|
$qr->fingerprint(
|
||||||
|
"SELECT * FROM db.fbc5e685a5d3d45aa1d0347fdb7c4d35_temp where id=1"
|
||||||
|
),
|
||||||
|
"select * from db.?_temp where id=?",
|
||||||
|
"Fingerprint db.MD5_tbl (with preserve_embedded_numbers)"
|
||||||
|
);
|
||||||
|
|
||||||
|
is(
|
||||||
|
$qr->fingerprint(
|
||||||
|
"SELECT * FROM db.temp_fbc5e685a5d3d45aa1d0347fdb7c4d35 where id=1"
|
||||||
|
),
|
||||||
|
"select * from db.temp_? where id=?",
|
||||||
|
"Fingerprint db.tbl_MD5 (with preserve_embedded_numbers)"
|
||||||
|
);
|
||||||
|
|
||||||
|
$qr = new QueryRewriter(
|
||||||
|
QueryParser => $qp,
|
||||||
|
preserve_embedded_numbers => 1,
|
||||||
|
);
|
||||||
|
|
||||||
|
is(
|
||||||
|
$qr->fingerprint(
|
||||||
|
"SELECT * FROM prices.rt_5min where id=1"
|
||||||
|
),
|
||||||
|
"select * from prices.rt_5min where id=?",
|
||||||
|
"Fingerprint db.tbl<number>name (preserve number)"
|
||||||
|
);
|
||||||
|
|
||||||
# #############################################################################
|
# #############################################################################
|
||||||
# convert_to_select()
|
# convert_to_select()
|
||||||
# #############################################################################
|
# #############################################################################
|
||||||
|
Reference in New Issue
Block a user