use strict;
use warnings;
sub usage
{
print "Usage: smartmatch.pl <expected-filename> <result-filename> <smartmatch-expected-filename>\n";
return;
}
my $EXPECTED;
my $RESULT;
my $NEW_EXPECTED;
my $expected;
my $result;
my $re;
my $insideuo;
my $bFirstLine;
my $iuo;
my $seenspecialinuo;
my $smartmatch;
my $rc = 0;
my @earr = ( [], [] );
my @rarr = ( [], [] );
my @searr = ( [], [] );
my @srarr = ( [], [] );
if( @ARGV != 3 )
{
usage();
exit(2);
}
open $EXPECTED , "<", $ARGV[0] or die $!;
open $RESULT , "<", $ARGV[1] or die $!;
open $NEW_EXPECTED , ">", $ARGV[2] or die $!;
$insideuo = 0;
$iuo = 0;
$smartmatch = 0;
$bFirstLine = 1;
while( 1 )
{
undef $!;
my $matched = 1;
$expected = <$EXPECTED>;
undef $!;
$result = <$RESULT>;
if( ( !defined( $expected ) || !defined( $result ) )
&& ( defined( $expected ) || defined( $result ) ) )
{
$rc = 2;
if( defined( $expected ) )
{
if( $bFirstLine )
{
print $NEW_EXPECTED "$expected";
$bFirstLine = 0;
}
else
{
print $NEW_EXPECTED "\n$expected";
}
}
last;
}
if( !defined( $expected ) && !defined( $result ) )
{
last;
}
chomp( $expected );
chomp( $result );
if( $expected =~ /^--\?.*/ )
{
$smartmatch=1;
$re = substr $expected, 3;
if( $re eq 'unordered: start' )
{
if( $insideuo )
{
if( $bFirstLine )
{
print $NEW_EXPECTED "Nesting of 'unordered: start' blocks is not allowed";
$bFirstLine = 0;
}
else
{
print $NEW_EXPECTED "\nNesting of 'unordered: start' blocks is not allowed";
}
exit( 2 );
}
$iuo = 0;
$insideuo = 1;
$seenspecialinuo = 0;
if( $bFirstLine )
{
print $NEW_EXPECTED "$expected";
$bFirstLine = 0;
}
else
{
print $NEW_EXPECTED "\n$expected";
}
next;
}
if( $re eq 'unordered: end' )
{
if( !$insideuo )
{
print $NEW_EXPECTED "'unordered: end' line found without a matching 'unordered: start' line\n";
exit( 2 );
}
$insideuo = 0;
if( $seenspecialinuo )
{
foreach my $eelemref ( @earr )
{
my $i = 0;
my $eelem = $eelemref->[0];
foreach my $relemref ( @rarr )
{
my $relem = $relemref->[0];
$matched = 1;
if( $eelem =~ /^--\?.*/ )
{
my $tmpre = substr $eelem, 3;
if( $relem !~ /^$tmpre$/ )
{
$matched = 0;
}
else
{
if( $bFirstLine )
{
print $NEW_EXPECTED "$relem";
$bFirstLine = 0;
}
else
{
print $NEW_EXPECTED "\n$relem";
}
last;
}
}
elsif( $eelem ne $relem )
{
$matched = 0;
}
else
{
if( $bFirstLine )
{
print $NEW_EXPECTED "$relem";
$bFirstLine = 0;
}
else
{
print $NEW_EXPECTED "\n$relem";
}
last;
}
++$i;
}
if( !$matched )
{
$rc = 2;
if( $bFirstLine )
{
print $NEW_EXPECTED "$eelem";
$bFirstLine = 0;
}
else
{
print $NEW_EXPECTED "\n$eelem";
}
}
else
{
splice @rarr, $i, 0;
}
}
}
else
{
@searr = sort { $a->[0] cmp $b->[0] } @earr;
@srarr = sort { $a->[0] cmp $b->[0] } @rarr;
my $min_len = (scalar(@searr) <= scalar(@srarr) ? scalar(@searr) : scalar(@srarr) );
my $i;
$matched = 1;
for( $i = 0; $i < $min_len; ++$i )
{
my $eelem = $searr[$i][0];
my $relem = $srarr[$i][0];
if( $eelem =~ /^--\?.*/ )
{
my $tmpre = substr $eelem, 3;
if( $relem !~ /^$tmpre$/ )
{
$matched = 0;
}
}
elsif( $eelem ne $relem )
{
$matched = 0;
}
}
if ((scalar(@searr) > $i) || (scalar(@srarr) > $i))
{
$matched = 0;
}
if ( !$matched )
{
$rc = 2;
for( my $i = 0; $i < scalar(@earr); ++$i )
{
if( $bFirstLine )
{
print $NEW_EXPECTED "$earr[$i][0]";
$bFirstLine = 0;
}
else
{
print $NEW_EXPECTED "\n$earr[$i][0]";
}
}
}
else
{
for( my $i = 0; $i < scalar(@rarr); ++$i )
{
if( $bFirstLine )
{
print $NEW_EXPECTED "$rarr[$i][0]";
$bFirstLine = 0;
}
else
{
print $NEW_EXPECTED "\n$rarr[$i][0]";
}
}
}
$matched = 0;
}
if( $bFirstLine )
{
$bFirstLine = 0;
print $NEW_EXPECTED "$expected";
}
else
{
print $NEW_EXPECTED "\n$expected";
}
@searr = @srarr = ();
@earr = @rarr = ();
next;
}
else
{
my $re_1;
if ($result !~ /^$re/)
{
if ($re =~ /(.*)datanode.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)\(cost=.*/ )
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)\(actual time=.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)\(CPU:.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)\(RoughCheck CU:.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)Buffers:.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)<Actual-Total-Time>.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /[.*]/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)<Actual-Startup-Time>.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)<Actual-Min-Startup-Time>.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)<Actual-Max-Startup-Time>.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)<Actual-Min-Total-Time>.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)<Actual-Max-Total-Time>.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)<Exclusive-Cycles\/Row>.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)<Exclusive-Cycles>.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /(.*)<Inclusive-Cycles>.*/)
{
$re_1 = quotemeta($1);
if ($result !~ /$re_1.*/)
{
$matched = 0;
}
}
elsif ($re =~ /^\s*Sort\s+Method.*/)
{
if ($result !~ /^\s*Sort\s+Method.*/)
{
$matched = 0;
}
}
elsif ($re =~ /Total runtime:.*/)
{
if ($result !~ /^\s*Total runtime:.*/)
{
$matched = 0;
}
}
elsif ($re =~ /^\s*QUERY PLAN\s*$/)
{
if ($result !~ /^\s*QUERY PLAN\s*$/)
{
$matched = 0;
}
}
elsif ($re =~ /^\-+$/)
{
if ($result !~ /^\-+$/)
{
$matched = 0;
}
}
else
{
$matched = 0;
}
}
}
}
elsif( $expected ne $result )
{
$matched = 0;
}
if( !$matched || $insideuo )
{
if( $insideuo )
{
$earr[$iuo][0] = $expected;
$rarr[$iuo][0] = $result;
if( !$seenspecialinuo && $expected =~ /^--\?.*/ )
{
$seenspecialinuo = 1;
}
++$iuo;
}
else
{
$rc = 2;
if( $bFirstLine )
{
$bFirstLine = 0;
print $NEW_EXPECTED "$expected";
}
else
{
print $NEW_EXPECTED "\n$expected";
}
}
}
else
{
if( $bFirstLine )
{
$bFirstLine = 0;
print $NEW_EXPECTED "$result";
}
else
{
print $NEW_EXPECTED "\n$result";
}
}
}
close $EXPECTED;
close $RESULT;
close $NEW_EXPECTED;
exit( $rc + $smartmatch );