~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to lib/GenTest/Simplifier/Test.pm

initial import from internal tree

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package GenTest::Simplifier::Test;
 
2
 
 
3
require Exporter;
 
4
use GenTest;
 
5
@ISA = qw(GenTest);
 
6
 
 
7
use strict;
 
8
 
 
9
use lib 'lib';
 
10
use GenTest::Simplifier::Tables;
 
11
 
 
12
use constant SIMPLIFIER_EXECUTORS       => 0;
 
13
use constant SIMPLIFIER_QUERIES         => 1;
 
14
use constant SIMPLIFIER_RESULTS         => 2;
 
15
 
 
16
my @optimizer_variables = (
 
17
        'optimizer_switch',
 
18
        'optimizer_use_mrr',
 
19
        'engine_condition_pushdown',
 
20
        'join_cache_level'
 
21
);
 
22
 
 
23
1;
 
24
 
 
25
sub new {
 
26
        my $class = shift;
 
27
 
 
28
        my $simplifier = $class->SUPER::new({
 
29
                executors       => SIMPLIFIER_EXECUTORS,
 
30
                results         => SIMPLIFIER_RESULTS,
 
31
                queries         => SIMPLIFIER_QUERIES
 
32
        }, @_);
 
33
 
 
34
        return $simplifier;
 
35
}
 
36
 
 
37
sub simplify {
 
38
        my $simplifier = shift;
 
39
 
 
40
        my $test;
 
41
 
 
42
        my $executors = $simplifier->executors();
 
43
        my $results = $simplifier->results();
 
44
        my $queries = $simplifier->queries();
 
45
 
 
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
 
48
 
 
49
        if (defined $executors->[1]) {
 
50
                my $version1 = $executors->[0]->version();
 
51
                my $version2 = $executors->[1]->version();
 
52
 
 
53
                if ($version1 ne $version2) {
 
54
                        $test .= "# Server0: version = $version1\n";
 
55
                        $test .= "# Server1: version = $version2\n\n";
 
56
                }
 
57
 
 
58
                foreach my $optimizer_variable (@optimizer_variables) {
 
59
                        my @optimizer_values;
 
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;
 
64
                        }
 
65
 
 
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";
 
71
                                        } else {
 
72
                                                $test .= "# Server $i : SET SESSION $optimizer_variable = '$optimizer_values[$i]';\n";
 
73
                                        }
 
74
                                }
 
75
                        } else {
 
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";
 
78
                        }
 
79
 
 
80
                        $test .= "\n";
 
81
                }
 
82
                $test .= "\n\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';
 
87
 
 
88
                        if ($optimizer_value =~ m{^\d+$}) {
 
89
                                $test .= "/*!50400 SET SESSION $optimizer_variable = $optimizer_value */;\n";
 
90
                        } else {
 
91
                                $test .= "/*!50400 SET SESSION $optimizer_variable = '$optimizer_value' */;\n";
 
92
                        }
 
93
                }
 
94
                $test .= "\n\n";
 
95
        }
 
96
 
 
97
        my $query_count = defined $queries ? $#$queries : $#$results;
 
98
 
 
99
        foreach my $query_id (0..$query_count) {
 
100
 
 
101
                my $query;
 
102
                if (defined $queries) {
 
103
                        $query = $queries->[$query_id];
 
104
                } else {
 
105
                        $query = $results->[$query_id]->[0]->query();
 
106
                }
 
107
 
 
108
                $test .= "# Begin test case for query $query_id\n\n";
 
109
 
 
110
                my $simplified_database = 'query'.$query_id;
 
111
 
 
112
                my $tables_simplifier = GenTest::Simplifier::Tables->new(
 
113
                        dsn             => $executors->[0]->dsn(),
 
114
                        orig_database   => 'test',
 
115
                        new_database    => $simplified_database
 
116
                );
 
117
 
 
118
                my @participating_tables = $tables_simplifier->simplify($query);
 
119
                
 
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"
 
124
                }
 
125
                        
 
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;
 
132
                        $test .= $_;
 
133
                }
 
134
                close (MYSQLDUMP);
 
135
 
 
136
                $test .= "\n\n";
 
137
 
 
138
                $query =~ s{(SELECT|FROM|WHERE|GROUP\s+BY|ORDER\s+BY|HAVING|LIMIT)}{\n$1}sgio;
 
139
                $test .= $query.";\n\n";
 
140
 
 
141
                if (
 
142
                        (defined $results) &&
 
143
                        (defined $results->[$query_id])
 
144
                ) {
 
145
                        $test .= "# Diff:\n\n";
 
146
 
 
147
                        # Add comments to each line in the diff, since MTR has issues with /* */ comment blocks.
 
148
 
 
149
                        my $diff = GenTest::Comparator::dumpDiff(
 
150
                                $simplifier->results()->[$query_id]->[0],
 
151
                                $simplifier->results()->[$query_id]->[1]
 
152
                        );
 
153
 
 
154
                        $test .= "# ".join("\n# ", split("\n", $diff))."\n\n\n";
 
155
                }
 
156
 
 
157
                $test .= "DROP TABLE ".join(', ', @participating_tables).";\n\n" if $#participating_tables > -1;
 
158
        
 
159
                $test .= "# End of test case for query $query_id\n\n";
 
160
        }
 
161
 
 
162
        return $test;
 
163
}
 
164
 
 
165
sub executors {
 
166
        return $_[0]->[SIMPLIFIER_EXECUTORS];
 
167
}
 
168
 
 
169
sub queries {
 
170
        return $_[0]->[SIMPLIFIER_QUERIES];
 
171
}
 
172
 
 
173
sub results {
 
174
        return $_[0]->[SIMPLIFIER_RESULTS];
 
175
}
 
176
 
 
177
1;