1
package GenTest::Simplifier::Test;
10
use GenTest::Simplifier::Tables;
12
use constant SIMPLIFIER_EXECUTORS => 0;
13
use constant SIMPLIFIER_QUERIES => 1;
14
use constant SIMPLIFIER_RESULTS => 2;
16
my @optimizer_variables = (
19
'engine_condition_pushdown',
28
my $simplifier = $class->SUPER::new({
29
executors => SIMPLIFIER_EXECUTORS,
30
results => SIMPLIFIER_RESULTS,
31
queries => SIMPLIFIER_QUERIES
38
my $simplifier = shift;
42
my $executors = $simplifier->executors();
43
my $results = $simplifier->results();
44
my $queries = $simplifier->queries();
46
# If we have two Executors determine the differences in Optimizer settings and print them as test comments
47
# If there is only one executor, dump its settings directly into the test as test queries
49
if (defined $executors->[1]) {
50
my $version1 = $executors->[0]->version();
51
my $version2 = $executors->[1]->version();
53
if ($version1 ne $version2) {
54
$test .= "# Server0: version = $version1\n";
55
$test .= "# Server1: version = $version2\n\n";
58
foreach my $optimizer_variable (@optimizer_variables) {
60
foreach my $i (0..1) {
61
my $optimizer_value = $executors->[$i]->dbh()->selectrow_array('SELECT @@'.$optimizer_variable);
62
$optimizer_value = 'ON' if $optimizer_value == 1 && $optimizer_variable eq 'engine_condition_pushdown';
63
$optimizer_values[$i] = $optimizer_value;
66
if ($optimizer_values[0] ne $optimizer_values[1]) {
67
$test .= "# The value of $optimizer_variable is distinct between the two servers:\n";
68
foreach my $i (0..1) {
69
if ($optimizer_values[$i] =~ m{^\d+$}) {
70
$test .= "# Server $i : SET SESSION $optimizer_variable = $optimizer_values[$i];\n";
72
$test .= "# Server $i : SET SESSION $optimizer_variable = '$optimizer_values[$i]';\n";
76
$test .= "# The value of $optimizer_variable is common between the two servers:\n";
77
$test .= "/*!50400 SET SESSION $optimizer_variable = $optimizer_values[0] */;\n";
83
} elsif (defined $executors->[0]) {
84
foreach my $optimizer_variable (@optimizer_variables) {
85
my $optimizer_value = $executors->[0]->dbh->selectrow_array('SELECT @@'.$optimizer_variable);
86
$optimizer_value = 'ON' if $optimizer_value == 1 && $optimizer_variable eq 'engine_condition_pushdown';
88
if ($optimizer_value =~ m{^\d+$}) {
89
$test .= "/*!50400 SET SESSION $optimizer_variable = $optimizer_value */;\n";
91
$test .= "/*!50400 SET SESSION $optimizer_variable = '$optimizer_value' */;\n";
97
my $query_count = defined $queries ? $#$queries : $#$results;
99
foreach my $query_id (0..$query_count) {
102
if (defined $queries) {
103
$query = $queries->[$query_id];
105
$query = $results->[$query_id]->[0]->query();
108
$test .= "# Begin test case for query $query_id\n\n";
110
my $simplified_database = 'query'.$query_id;
112
my $tables_simplifier = GenTest::Simplifier::Tables->new(
113
dsn => $executors->[0]->dsn(),
114
orig_database => 'test',
115
new_database => $simplified_database
118
my @participating_tables = $tables_simplifier->simplify($query);
120
if ($#participating_tables > -1) {
121
$test .= "--disable_warnings\n";
122
$test .= "DROP TABLE IF EXISTS ".join(', ', @participating_tables).";\n";
123
$test .= "--enable_warnings\n\n"
126
my $mysqldump_cmd = "mysqldump -uroot --no-set-names --compact --force --protocol=tcp --port=19306 $simplified_database ";
127
$mysqldump_cmd .= join(' ', @participating_tables) if $#participating_tables > -1;
128
open (MYSQLDUMP, "$mysqldump_cmd|");
129
while (<MYSQLDUMP>) {
130
next if $_=~ m{SET \@saved_cs_client}sio;
131
next if $_=~ m{SET character_set_client}sio;
138
$query =~ s{(SELECT|FROM|WHERE|GROUP\s+BY|ORDER\s+BY|HAVING|LIMIT)}{\n$1}sgio;
139
$test .= $query.";\n\n";
142
(defined $results) &&
143
(defined $results->[$query_id])
145
$test .= "# Diff:\n\n";
147
# Add comments to each line in the diff, since MTR has issues with /* */ comment blocks.
149
my $diff = GenTest::Comparator::dumpDiff(
150
$simplifier->results()->[$query_id]->[0],
151
$simplifier->results()->[$query_id]->[1]
154
$test .= "# ".join("\n# ", split("\n", $diff))."\n\n\n";
157
$test .= "DROP TABLE ".join(', ', @participating_tables).";\n\n" if $#participating_tables > -1;
159
$test .= "# End of test case for query $query_id\n\n";
166
return $_[0]->[SIMPLIFIER_EXECUTORS];
170
return $_[0]->[SIMPLIFIER_QUERIES];
174
return $_[0]->[SIMPLIFIER_RESULTS];