mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-01 18:25:59 +00:00
232 lines
4.7 KiB
Perl
232 lines
4.7 KiB
Perl
#!/usr/bin/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 => 15;
|
|
|
|
use Data::Dumper;
|
|
$Data::Dumper::Indent = 1;
|
|
$Data::Dumper::Sortkeys = 1;
|
|
$Data::Dumper::Quotekeys = 0;
|
|
|
|
use PerconaTest;
|
|
use Quoter;
|
|
use TableParser;
|
|
use FileIterator;
|
|
use SchemaIterator;
|
|
use Schema;
|
|
use OptionParser;
|
|
use DSNParser;
|
|
|
|
my $in = "$trunk/t/lib/samples/mysqldump-no-data/";
|
|
|
|
my $q = new Quoter;
|
|
my $tp = new TableParser(Quoter => $q);
|
|
my $fi = new FileIterator();
|
|
|
|
my $o = new OptionParser(description => 'SchemaIterator');
|
|
@ARGV = qw();
|
|
$o->get_specs("$trunk/bin/pt-table-checksum");
|
|
$o->get_opts();
|
|
|
|
my $file_itr = $fi->get_file_itr("$in/dump001.txt");
|
|
my $sq = new Schema();
|
|
my $si = new SchemaIterator (
|
|
file_itr => $file_itr,
|
|
OptionParser => $o,
|
|
Quoter => $q,
|
|
TableParser => $tp,
|
|
Schema => $sq,
|
|
);
|
|
|
|
# Init the schema (SchemaIterator calls Schema::add_schema_object()).
|
|
1 while(defined $si->next());
|
|
|
|
#ok(
|
|
# $sq->is_duplicate_column('c1')
|
|
# && $sq->is_duplicate_column('c2'),
|
|
# "Duplicate columns in dump001.txt"
|
|
#);
|
|
|
|
#ok(
|
|
# $sq->is_duplicate_table('a'),
|
|
# "Duplicate tables in dump001.txt"
|
|
#);
|
|
|
|
|
|
# ############################################################################
|
|
# Test find columns in the schema.
|
|
# ############################################################################
|
|
|
|
sub test_find_col {
|
|
my ($got, $expect, $test_name) = @_;
|
|
|
|
my @got_tbls;
|
|
foreach my $tbl ( @$got ) {
|
|
push @got_tbls, [$tbl->{db}, $tbl->{tbl}];
|
|
}
|
|
|
|
is_deeply(
|
|
\@got_tbls,
|
|
$expect,
|
|
$test_name,
|
|
) or print Dumper(\@got_tbls);
|
|
}
|
|
|
|
# First by column name, what would be parsed from a query.
|
|
|
|
test_find_col(
|
|
$sq->find_column(col_name => 'c3'),
|
|
[['test','b']],
|
|
"Find column c3"
|
|
);
|
|
|
|
test_find_col(
|
|
$sq->find_column(col_name => 'b.c3'),
|
|
[['test','b']],
|
|
"Find column b.c3"
|
|
);
|
|
|
|
test_find_col(
|
|
$sq->find_column(col_name => 'test.b.c3'),
|
|
[['test','b']],
|
|
"Find column test.b.c3"
|
|
);
|
|
|
|
test_find_col(
|
|
$sq->find_column(col_name => 'c1'),
|
|
[
|
|
['test', 'b'],
|
|
['test', 'a'],
|
|
['test2', 'a'],
|
|
],
|
|
"Find duplicate column c1"
|
|
);
|
|
|
|
test_find_col(
|
|
$sq->find_column(col_name => 'a.c1'),
|
|
[
|
|
['test', 'a'],
|
|
['test2', 'a'],
|
|
],
|
|
"Find duplicate table.column a.c1"
|
|
);
|
|
|
|
test_find_col(
|
|
$sq->find_column(col_name => 'xyz'),
|
|
[],
|
|
"Cannot find nonexistent column name"
|
|
);
|
|
|
|
# Then by a tbl struct, what's used by Schema.
|
|
|
|
test_find_col(
|
|
$sq->find_column(col => 'c3'),
|
|
[['test','b']],
|
|
"Find column c3 (struct)"
|
|
);
|
|
|
|
test_find_col(
|
|
$sq->find_column(tbl => 'b', col => 'c3'),
|
|
[['test','b']],
|
|
"Find column b.c3 (struct)"
|
|
);
|
|
|
|
test_find_col(
|
|
$sq->find_column(db => 'test', tbl => 'b', col => 'c3'),
|
|
[['test','b']],
|
|
"Find column test.b.c3 (struct)"
|
|
);
|
|
|
|
test_find_col(
|
|
$sq->find_column(col => 'c1'),
|
|
[
|
|
['test', 'b'],
|
|
['test', 'a'],
|
|
['test2', 'a'],
|
|
],
|
|
"Find duplicate column c1 (struct)"
|
|
);
|
|
|
|
test_find_col(
|
|
$sq->find_column(tbl => 'a', col => 'c1'),
|
|
[
|
|
['test', 'a'],
|
|
['test2', 'a'],
|
|
],
|
|
"Find duplicate table.column a.c1 (struct)"
|
|
);
|
|
|
|
test_find_col(
|
|
$sq->find_column(col => 'xyz'),
|
|
[],
|
|
"Cannot find nonexistent column name (struct)"
|
|
);
|
|
|
|
# ############################################################################
|
|
# Test find tables in the schema.
|
|
# ############################################################################
|
|
|
|
sub test_find_tbl {
|
|
my ($got, $expect, $test_name) = @_;
|
|
|
|
my @got_dbs;
|
|
foreach my $db ( @$got ) {
|
|
push @got_dbs, $db;
|
|
}
|
|
|
|
is_deeply(
|
|
\@got_dbs,
|
|
$expect,
|
|
$test_name,
|
|
) or print Dumper(\@got_dbs);
|
|
}
|
|
|
|
test_find_tbl(
|
|
$sq->find_table(tbl => 'a'),
|
|
['test', 'test2'],
|
|
"Find table a"
|
|
);
|
|
|
|
# ############################################################################
|
|
# Test ignore.
|
|
# ############################################################################
|
|
test_find_col(
|
|
$sq->find_column(
|
|
col => 'c1',
|
|
ignore => [
|
|
{ db => 'test', tbl => 'a' },
|
|
{ db => 'test2', tbl => 'a' },
|
|
],
|
|
),
|
|
[
|
|
#['test', 'a'], # IGNORED
|
|
['test', 'b'],
|
|
#['test2', 'a'], # IGNORED
|
|
],
|
|
"Ignore tables"
|
|
);
|
|
|
|
# #############################################################################
|
|
# Done.
|
|
# #############################################################################
|
|
my $output = '';
|
|
{
|
|
local *STDERR;
|
|
open STDERR, '>', \$output;
|
|
$sq->_d('Complete test coverage');
|
|
}
|
|
like(
|
|
$output,
|
|
qr/Complete test coverage/,
|
|
'_d() works'
|
|
);
|
|
exit;
|