Files
percona-toolkit/t/pt-table-usage/basics.t
2012-05-25 11:23:38 -06:00

187 lines
4.8 KiB
Perl

#!/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 tests => 16;
use PerconaTest;
require "$trunk/bin/pt-table-usage";
my @args = qw();
my $in = "$trunk/t/pt-table-usage/samples/in";
my $out = "t/pt-table-usage/samples/out";
my $output = '';
# ############################################################################
# Basic queries that parse without problems.
# ############################################################################
ok(
no_diff(
sub { pt_table_usage::main(@args, "$in/slow001.txt") },
"$out/slow001.txt",
),
'Analysis for slow001.txt'
);
ok(
no_diff(
sub { pt_table_usage::main(@args, "$in/slow002.txt") },
"$out/slow002.txt",
),
'Analysis for slow002.txt (issue 1237)'
);
ok(
no_diff(
sub { pt_table_usage::main(@args, '--query',
'DROP TABLE IF EXISTS t') },
"$out/drop-table-if-exists.txt",
),
'DROP TABLE IF EXISTS'
);
ok(
no_diff(
sub { pt_table_usage::main(@args, '--query',
"create table temp.5 (
datetime DATETIME,
posted DATETIME,
PRIMARY KEY(datetime)
)
SELECT c FROM t WHERE id=1")
},
"$out/create001.txt",
),
'CREATE..SELECT'
);
ok(
no_diff(
sub { pt_table_usage::main(@args, '--query',
"select a.dt,a.hr,a.count
from temp.temp6 a left join n.type b using (dt,hr)
where b.type is null OR b.type=0")
},
"$out/query001.txt",
),
'Multi-column USING'
);
ok(
no_diff(
sub { pt_table_usage::main(@args, '--query',
"SELECT dt.datetime, MAX(re.pd) AS pd FROM d1.t1 t1a INNER JOIN d2.t2 t2a ON CONCAT(t1.a, ' ', t2.a) = t1.datetime INNER JOIN d3.t3 t3a ON t1a.c = t3a.c GROUP BY t1.datetime");
},
"$out/query002.txt",
),
'Function in JOIN clause'
);
# ############################################################################
# --id-attribute
# ############################################################################
ok(
no_diff(
sub { pt_table_usage::main(@args, "$in/slow003.txt",
qw(--id-attribute ts)) },
"$out/slow003-003.txt",
),
'Analysis for slow003.txt with --id-attribute'
);
# ############################################################################
# --constant-data-value
# ############################################################################
$output = output(
sub { pt_table_usage::main('--query', 'INSERT INTO t VALUES (42)',
qw(--constant-data-value <const>)) },
);
like(
$output,
qr/SELECT <const>/,
"--constant-data-value"
);
$output = output(
sub { pt_table_usage::main('--query', 'INSERT INTO t VALUES (42)',
qw(--constant-data-value), "") },
);
like(
$output,
qr/^SELECT\s+$/m,
'--constant-data-value ""'
);
# ############################################################################
# Queries with tables that can't be resolved.
# ############################################################################
# The tables in the WHERE can't be resolved so there's no WHERE access listed.
ok(
no_diff(
sub { pt_table_usage::main(@args, "$in/slow003.txt") },
"$out/slow003-001.txt",
),
'Analysis for slow003.txt'
);
# #############################################################################
# Process fingerprints.
# #############################################################################
my @queries = (
# [ original query, its fingerprint ],
[
"select * from t",
"select * from t",
],
[
"select * from t1, t2 as x, t3 y, z",
"select * from t1, t2 as x, t3 y, z",
],
[
"insert into t values (1, 2, 3)",
"insert into t values(?+)",
],
[
"delete from t where id < 1000",
"delete from t where id < ?",
],
[
"select * from a as t1, b as t2 where t1.id=t2.id",
"select * from a as t1, b as t2 where t1.id=t2.id",
],
[
"replace into t set foo='bar'",
"replace into t set foo=?",
],
);
foreach my $in ( @queries ) {
my $expected = output(
sub { pt_table_usage::main(qw(--query), $in->[0]) },
stderr => 1,
);
my $got = output(
sub { pt_table_usage::main(qw(--query), $in->[1]) },
stderr => 1,
);
is(
$got,
$expected,
"Fingerprint " . (length $in->[1] > 70 ? substr($in->[1], 0, 70)
: $in->[1])
);
}
# #############################################################################
# Done.
# #############################################################################
exit;