Merge lp:~percona-toolkit-dev/percona-toolkit/fix-i26211-1058285-821722-implicit-ansi_quotes into lp:percona-toolkit/2.1

Proposed by Daniel Nichter
Status: Merged
Approved by: Brian Fraser
Approved revision: 415
Merged at revision: 446
Proposed branch: lp:~percona-toolkit-dev/percona-toolkit/fix-i26211-1058285-821722-implicit-ansi_quotes
Merge into: lp:percona-toolkit/2.1
Prerequisite: lp:~percona-toolkit-dev/percona-toolkit/portable-test-suite
Diff against target: 692 lines (+402/-91)
18 files modified
bin/pt-archiver (+7/-6)
bin/pt-duplicate-key-checker (+7/-6)
bin/pt-find (+7/-6)
bin/pt-heartbeat (+7/-6)
bin/pt-index-usage (+7/-6)
bin/pt-kill (+7/-6)
bin/pt-online-schema-change (+10/-10)
bin/pt-query-advisor (+7/-6)
bin/pt-query-digest (+7/-6)
bin/pt-table-checksum (+7/-6)
bin/pt-table-sync (+7/-6)
bin/pt-table-usage (+7/-6)
bin/pt-upgrade (+7/-6)
lib/TableParser.pm (+13/-8)
t/pt-online-schema-change/ansi_quotes.t (+144/-0)
t/pt-online-schema-change/bugs.t (+0/-1)
t/pt-online-schema-change/samples/issue-26211.sql (+118/-0)
t/pt-online-schema-change/samples/sql-mode-bug-1058285.sql (+33/-0)
To merge this branch: bzr merge lp:~percona-toolkit-dev/percona-toolkit/fix-i26211-1058285-821722-implicit-ansi_quotes
Reviewer Review Type Date Requested Status
Brian Fraser (community) Approve
Daniel Nichter Approve
Review via email: mp+132602@code.launchpad.net

This proposal supersedes a proposal from 2012-10-04.

To post a comment you must log in.
Revision history for this message
Brian Fraser (fraserbn) : Posted in a previous version of this proposal
review: Approve
Revision history for this message
Daniel Nichter (daniel-nichter) wrote : Posted in a previous version of this proposal

I think the customer's particular issue was already fixed in 2.1.4. I've asked someone to verify this.

414. By Daniel Nichter

Test that SQL_MODE isn't changed.

Revision history for this message
Daniel Nichter (daniel-nichter) wrote :

Passes tests.

review: Approve
415. By Brian Fraser

Added a test for the second bug in customer issue 26211

Revision history for this message
Brian Fraser (fraserbn) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/pt-archiver'
2--- bin/pt-archiver 2012-10-31 01:12:57 +0000
3+++ bin/pt-archiver 2012-11-01 20:30:30 +0000
4@@ -1564,13 +1564,14 @@
5 my $q = $self->{Quoter};
6
7 my $new_sql_mode
8- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
9- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
10- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
11- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
12+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
13+ . q{@@SQL_MODE := '', }
14+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
15+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
16
17- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
18- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
19+ my $old_sql_mode
20+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
21+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
22
23 PTDEBUG && _d($new_sql_mode);
24 eval { $dbh->do($new_sql_mode); };
25
26=== modified file 'bin/pt-duplicate-key-checker'
27--- bin/pt-duplicate-key-checker 2012-10-31 09:18:34 +0000
28+++ bin/pt-duplicate-key-checker 2012-11-01 20:30:30 +0000
29@@ -206,13 +206,14 @@
30 my $q = $self->{Quoter};
31
32 my $new_sql_mode
33- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
34- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
35- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
36- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
37+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
38+ . q{@@SQL_MODE := '', }
39+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
40+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
41
42- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
43- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
44+ my $old_sql_mode
45+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
46+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
47
48 PTDEBUG && _d($new_sql_mode);
49 eval { $dbh->do($new_sql_mode); };
50
51=== modified file 'bin/pt-find'
52--- bin/pt-find 2012-10-31 09:18:34 +0000
53+++ bin/pt-find 2012-11-01 20:30:30 +0000
54@@ -1607,13 +1607,14 @@
55 my $q = $self->{Quoter};
56
57 my $new_sql_mode
58- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
59- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
60- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
61- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
62+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
63+ . q{@@SQL_MODE := '', }
64+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
65+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
66
67- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
68- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
69+ my $old_sql_mode
70+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
71+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
72
73 PTDEBUG && _d($new_sql_mode);
74 eval { $dbh->do($new_sql_mode); };
75
76=== modified file 'bin/pt-heartbeat'
77--- bin/pt-heartbeat 2012-10-31 09:18:34 +0000
78+++ bin/pt-heartbeat 2012-11-01 20:30:30 +0000
79@@ -2545,13 +2545,14 @@
80 my $q = $self->{Quoter};
81
82 my $new_sql_mode
83- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
84- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
85- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
86- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
87+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
88+ . q{@@SQL_MODE := '', }
89+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
90+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
91
92- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
93- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
94+ my $old_sql_mode
95+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
96+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
97
98 PTDEBUG && _d($new_sql_mode);
99 eval { $dbh->do($new_sql_mode); };
100
101=== modified file 'bin/pt-index-usage'
102--- bin/pt-index-usage 2012-10-31 09:18:34 +0000
103+++ bin/pt-index-usage 2012-11-01 20:30:30 +0000
104@@ -2805,13 +2805,14 @@
105 my $q = $self->{Quoter};
106
107 my $new_sql_mode
108- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
109- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
110- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
111- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
112+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
113+ . q{@@SQL_MODE := '', }
114+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
115+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
116
117- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
118- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
119+ my $old_sql_mode
120+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
121+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
122
123 PTDEBUG && _d($new_sql_mode);
124 eval { $dbh->do($new_sql_mode); };
125
126=== modified file 'bin/pt-kill'
127--- bin/pt-kill 2012-10-31 09:18:34 +0000
128+++ bin/pt-kill 2012-11-01 20:30:30 +0000
129@@ -2495,13 +2495,14 @@
130 my $q = $self->{Quoter};
131
132 my $new_sql_mode
133- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
134- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
135- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
136- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
137+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
138+ . q{@@SQL_MODE := '', }
139+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
140+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
141
142- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
143- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
144+ my $old_sql_mode
145+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
146+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
147
148 PTDEBUG && _d($new_sql_mode);
149 eval { $dbh->do($new_sql_mode); };
150
151=== modified file 'bin/pt-online-schema-change'
152--- bin/pt-online-schema-change 2012-10-31 09:18:34 +0000
153+++ bin/pt-online-schema-change 2012-11-01 20:30:30 +0000
154@@ -2729,13 +2729,14 @@
155 my $q = $self->{Quoter};
156
157 my $new_sql_mode
158- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
159- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
160- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
161- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
162+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
163+ . q{@@SQL_MODE := '', }
164+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
165+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
166
167- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
168- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
169+ my $old_sql_mode
170+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
171+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
172
173 PTDEBUG && _d($new_sql_mode);
174 eval { $dbh->do($new_sql_mode); };
175@@ -8232,10 +8233,9 @@
176 # the user specified --chunk-size=N on the cmd line, in which
177 # case the max child table size is their specified chunk size
178 # times the fudge factor.
179- my $max_rows
180- = $o->get('dry-run') ? $o->get('chunk-size') * $limit
181- : $chunk_time ? $avg_rate * $chunk_time * $limit
182- : $o->get('chunk-size') * $limit;
183+ my $max_rows = $o->get('dry-run') ? $o->get('chunk-size') * $limit
184+ : $chunk_time && $avg_rate ? $avg_rate * $chunk_time * $limit
185+ : $o->get('chunk-size') * $limit;
186 PTDEBUG && _d('Max allowed child table size:', $max_rows);
187
188 $alter_fk_method = determine_alter_fk_method(
189
190=== modified file 'bin/pt-query-advisor'
191--- bin/pt-query-advisor 2012-10-31 09:18:34 +0000
192+++ bin/pt-query-advisor 2012-11-01 20:30:30 +0000
193@@ -5307,13 +5307,14 @@
194 my $q = $self->{Quoter};
195
196 my $new_sql_mode
197- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
198- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
199- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
200- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
201+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
202+ . q{@@SQL_MODE := '', }
203+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
204+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
205
206- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
207- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
208+ my $old_sql_mode
209+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
210+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
211
212 PTDEBUG && _d($new_sql_mode);
213 eval { $dbh->do($new_sql_mode); };
214
215=== modified file 'bin/pt-query-digest'
216--- bin/pt-query-digest 2012-10-31 09:18:34 +0000
217+++ bin/pt-query-digest 2012-11-01 20:30:30 +0000
218@@ -8124,13 +8124,14 @@
219 my $q = $self->{Quoter};
220
221 my $new_sql_mode
222- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
223- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
224- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
225- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
226+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
227+ . q{@@SQL_MODE := '', }
228+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
229+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
230
231- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
232- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
233+ my $old_sql_mode
234+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
235+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
236
237 PTDEBUG && _d($new_sql_mode);
238 eval { $dbh->do($new_sql_mode); };
239
240=== modified file 'bin/pt-table-checksum'
241--- bin/pt-table-checksum 2012-10-31 18:20:54 +0000
242+++ bin/pt-table-checksum 2012-11-01 20:30:30 +0000
243@@ -3709,13 +3709,14 @@
244 my $q = $self->{Quoter};
245
246 my $new_sql_mode
247- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
248- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
249- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
250- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
251+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
252+ . q{@@SQL_MODE := '', }
253+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
254+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
255
256- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
257- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
258+ my $old_sql_mode
259+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
260+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
261
262 PTDEBUG && _d($new_sql_mode);
263 eval { $dbh->do($new_sql_mode); };
264
265=== modified file 'bin/pt-table-sync'
266--- bin/pt-table-sync 2012-10-30 23:04:22 +0000
267+++ bin/pt-table-sync 2012-11-01 20:30:30 +0000
268@@ -2383,13 +2383,14 @@
269 my $q = $self->{Quoter};
270
271 my $new_sql_mode
272- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
273- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
274- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
275- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
276+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
277+ . q{@@SQL_MODE := '', }
278+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
279+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
280
281- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
282- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
283+ my $old_sql_mode
284+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
285+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
286
287 PTDEBUG && _d($new_sql_mode);
288 eval { $dbh->do($new_sql_mode); };
289
290=== modified file 'bin/pt-table-usage'
291--- bin/pt-table-usage 2012-10-30 23:04:22 +0000
292+++ bin/pt-table-usage 2012-11-01 20:30:30 +0000
293@@ -5655,13 +5655,14 @@
294 my $q = $self->{Quoter};
295
296 my $new_sql_mode
297- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
298- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
299- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
300- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
301+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
302+ . q{@@SQL_MODE := '', }
303+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
304+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
305
306- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
307- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
308+ my $old_sql_mode
309+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
310+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
311
312 PTDEBUG && _d($new_sql_mode);
313 eval { $dbh->do($new_sql_mode); };
314
315=== modified file 'bin/pt-upgrade'
316--- bin/pt-upgrade 2012-10-31 01:12:57 +0000
317+++ bin/pt-upgrade 2012-11-01 20:30:30 +0000
318@@ -482,13 +482,14 @@
319 my $q = $self->{Quoter};
320
321 my $new_sql_mode
322- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
323- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
324- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
325- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
326+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
327+ . q{@@SQL_MODE := '', }
328+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
329+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
330
331- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
332- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
333+ my $old_sql_mode
334+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
335+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
336
337 PTDEBUG && _d($new_sql_mode);
338 eval { $dbh->do($new_sql_mode); };
339
340=== modified file 'lib/TableParser.pm'
341--- lib/TableParser.pm 2012-10-19 23:14:07 +0000
342+++ lib/TableParser.pm 2012-11-01 20:30:30 +0000
343@@ -56,16 +56,21 @@
344 my $q = $self->{Quoter};
345
346 # To ensure a consistent output, we save the current (old) SQL mode,
347- # then set it to the new SQL mode that what we need. When done, even
348- # if an error occurs, we restore the old SQL mode.
349+ # then set it to the new SQL mode that what we need, which is the
350+ # default sql_mode=''. When done, even if an error occurs, we restore
351+ # the old SQL mode. The main thing is that we do not want ANSI_QUOTES
352+ # because there's code all throughout the tools that expect backtick `
353+ # quoted idents, not double-quote " quoted idents. For example:
354+ # https://bugs.launchpad.net/percona-toolkit/+bug/1058285
355 my $new_sql_mode
356- = '/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, '
357- . q{@@SQL_MODE := REPLACE(REPLACE(@@SQL_MODE, 'ANSI_QUOTES', ''), ',,', ','), }
358- . '@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, '
359- . '@@SQL_QUOTE_SHOW_CREATE := 1 */';
360+ = q{/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, }
361+ . q{@@SQL_MODE := '', }
362+ . q{@OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, }
363+ . q{@@SQL_QUOTE_SHOW_CREATE := 1 */};
364
365- my $old_sql_mode = '/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, '
366- . '@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */';
367+ my $old_sql_mode
368+ = q{/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, }
369+ . q{@@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */};
370
371 # Set new SQL mode.
372 PTDEBUG && _d($new_sql_mode);
373
374=== added file 't/pt-online-schema-change/ansi_quotes.t'
375--- t/pt-online-schema-change/ansi_quotes.t 1970-01-01 00:00:00 +0000
376+++ t/pt-online-schema-change/ansi_quotes.t 2012-11-01 20:30:30 +0000
377@@ -0,0 +1,144 @@
378+#!/usr/bin/env perl
379+
380+BEGIN {
381+ die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
382+ unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
383+ unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
384+};
385+
386+use strict;
387+use warnings FATAL => 'all';
388+use English qw(-no_match_vars);
389+use Test::More;
390+
391+use Data::Dumper;
392+use PerconaTest;
393+use Sandbox;
394+
395+require "$trunk/bin/pt-online-schema-change";
396+
397+diag(`$trunk/sandbox/stop-sandbox 12348 >/dev/null`);
398+diag(`MODE_ANSI=1 $trunk/sandbox/start-sandbox master 12348 >/dev/null`);
399+
400+my $dp = new DSNParser(opts=>$dsn_opts);
401+my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
402+my $dbh = $sb->get_dbh_for('master1');
403+
404+if ( !$dbh ) {
405+ plan skip_all => 'Cannot connect to sandbox master 12348';
406+}
407+
408+# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
409+# so we need to specify --lock-wait-timeout=3 else the tool will die.
410+my $master_dsn = 'h=127.1,P=12348,u=msandbox,p=msandbox';
411+my @args = (qw(--lock-wait-timeout 3));
412+my $output;
413+my $exit_status;
414+my $sample = "t/pt-online-schema-change/samples/";
415+
416+# ############################################################################
417+# pt-online-schema-change doesn't work with ANSI_QUOTES + some other sql_modes
418+# https://bugs.launchpad.net/percona-toolkit/+bug/1058285
419+# ############################################################################
420+$sb->load_file('master1', "$sample/sql-mode-bug-1058285.sql");
421+
422+my ($orig_sql_mode) = $dbh->selectrow_array(q{SELECT @@SQL_MODE});
423+is(
424+ $orig_sql_mode,
425+ "REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI,NO_AUTO_VALUE_ON_ZERO",
426+ "SQL_MODE set"
427+);
428+
429+($output, $exit_status) = full_output(
430+ sub { pt_online_schema_change::main(@args,
431+ "$master_dsn,D=issue26211,t=process_model_inst",
432+ "--alter", "ADD COLUMN foo int",
433+ qw(--dry-run --print --alter-foreign-keys-method auto)) },
434+);
435+
436+is(
437+ $exit_status,
438+ 0,
439+ "--dry-run exit 0 (bug 1058285)"
440+);
441+
442+unlike(
443+ $output,
444+ qr/errno: 121/,
445+ "No error 121 (bug 1058285)"
446+);
447+
448+my ($sql_mode) = $dbh->selectrow_array(q{SELECT @@SQL_MODE});
449+is(
450+ $sql_mode,
451+ $orig_sql_mode,
452+ "--dry-run SQL_MODE not changed"
453+);
454+
455+($output, $exit_status) = full_output(
456+ sub { pt_online_schema_change::main(@args,
457+ "$master_dsn,D=issue26211,t=process_model_inst",
458+ "--alter", "ADD COLUMN foo int",
459+ qw(--execute --alter-foreign-keys-method auto)) },
460+);
461+
462+is(
463+ $exit_status,
464+ 0,
465+ "--execute exit 0 (bug 1058285)"
466+);
467+
468+unlike(
469+ $output,
470+ qr/\QI need a max_rows argument/,
471+ "No 'I need a max_rows' error message (bug 1073996)"
472+);
473+
474+# ANSI_QUOTES are on, so it's "foo" not `foo`.
475+my $rows = $dbh->selectrow_arrayref("SHOW CREATE TABLE issue26211.process_model_inst");
476+like(
477+ $rows->[1],
478+ qr/"foo"\s+int/i,
479+ "--alter actually worked (bug 1058285)"
480+);
481+
482+($sql_mode) = $dbh->selectrow_array(q{SELECT @@SQL_MODE});
483+is(
484+ $sql_mode,
485+ $orig_sql_mode,
486+ "--execute SQL_MODE not changed"
487+);
488+
489+# ############################################################################
490+# pt-online-schema-change foreign key error
491+# Customer issue 26211
492+# ############################################################################
493+$sb->load_file('master1', "$sample/issue-26211.sql");
494+
495+my $retval;
496+($output, $retval) = full_output(sub { pt_online_schema_change::main(@args,
497+ '--alter-foreign-keys-method', 'auto',
498+ '--no-check-replication-filters',
499+ '--alter', "ENGINE=InnoDB",
500+ '--execute', "$master_dsn,D=bug_26211,t=prm_inst")});
501+
502+is(
503+ $retval,
504+ 0,
505+ "Issue 26211: Lives ok"
506+) or diag($output);
507+
508+unlike(
509+ $output,
510+ qr/\QI need a max_rows argument/,
511+ "Issue 26211: No error message"
512+);
513+
514+$dbh->do(q{DROP DATABASE IF EXISTS `bug_26211`});
515+
516+# #############################################################################
517+# Done.
518+# #############################################################################
519+diag(`$trunk/sandbox/stop-sandbox 12348 >/dev/null`);
520+ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
521+done_testing;
522
523=== modified file 't/pt-online-schema-change/bugs.t'
524--- t/pt-online-schema-change/bugs.t 2012-10-11 21:20:53 +0000
525+++ t/pt-online-schema-change/bugs.t 2012-11-01 20:30:30 +0000
526@@ -240,5 +240,4 @@
527 # #############################################################################
528 $sb->wipe_clean($master_dbh);
529 ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
530-
531 done_testing;
532
533=== added file 't/pt-online-schema-change/samples/issue-26211.sql'
534--- t/pt-online-schema-change/samples/issue-26211.sql 1970-01-01 00:00:00 +0000
535+++ t/pt-online-schema-change/samples/issue-26211.sql 2012-11-01 20:30:30 +0000
536@@ -0,0 +1,118 @@
537+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
538+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
539+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
540+/*!40101 SET NAMES utf8 */;
541+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
542+/*!40103 SET TIME_ZONE='+00:00' */;
543+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
544+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
545+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
546+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
547+
548+
549+DROP DATABASE IF EXISTS `bug_26211`;
550+CREATE DATABASE `bug_26211`;
551+USE `bug_26211`;
552+
553+DROP TABLE IF EXISTS `mref`;
554+/*!40101 SET @saved_cs_client = @@character_set_client */;
555+/*!40101 SET character_set_client = utf8 */;
556+CREATE TABLE `mref` (
557+ `M_ID` decimal(10,0) NOT NULL ,
558+ `PR_M_INST_ID` decimal(10,0) NOT NULL ,
559+ KEY `I_M_ID` (`M_ID`),
560+ KEY `I_PR_M_` (`PR_M_INST_ID`),
561+ CONSTRAINT `FK_MREF_REF_PM` FOREIGN KEY (`M_ID`) REFERENCES `pm` (`M_ID`) ON DELETE CASCADE,
562+ CONSTRAINT `FK_MREF_REF_PRMI` FOREIGN KEY (`PR_M_INST_ID`) REFERENCES `prm_inst` (`PR_M_INST_ID`) ON DELETE CASCADE
563+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
564+/*!40101 SET character_set_client = @saved_cs_client */;
565+
566+DROP TABLE IF EXISTS `pm`;
567+/*!40101 SET @saved_cs_client = @@character_set_client */;
568+/*!40101 SET character_set_client = utf8 */;
569+CREATE TABLE `pm` (
570+ `M_ID` decimal(10,0) NOT NULL ,
571+ `P_MR_NUM` varchar(64) NOT NULL ,
572+ `P_NUM` varchar(50) NOT NULL ,
573+ `TYPE` varchar(50) DEFAULT NULL ,
574+ `VERSION` decimal(10,0) NOT NULL ,
575+ `XML` longtext NOT NULL ,
576+ PRIMARY KEY (`M_ID`),
577+ UNIQUE KEY `UK_PM` (`P_MR_NUM`,`P_NUM`),
578+ KEY `I_PM_P_NUM` (`P_NUM`),
579+ CONSTRAINT `FK_PM_REF_P` FOREIGN KEY (`P_NUM`) REFERENCES `p` (`P_NUM`)
580+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
581+/*!40101 SET character_set_client = @saved_cs_client */;
582+
583+DROP TABLE IF EXISTS `p`;
584+/*!40101 SET @saved_cs_client = @@character_set_client */;
585+/*!40101 SET character_set_client = utf8 */;
586+CREATE TABLE `p` (
587+ `P_NUM` varchar(50) NOT NULL ,
588+ `VERSION` decimal(10,0) NOT NULL ,
589+ `TYPE` varchar(32) NOT NULL ,
590+ `PROTECTED` decimal(1,0) NOT NULL ,
591+ `DESCRIPTIONS` varchar(4000) DEFAULT NULL ,
592+ PRIMARY KEY (`P_NUM`)
593+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
594+/*!40101 SET character_set_client = @saved_cs_client */;
595+
596+
597+DROP TABLE IF EXISTS `pr`;
598+/*!40101 SET @saved_cs_client = @@character_set_client */;
599+/*!40101 SET character_set_client = utf8 */;
600+CREATE TABLE `pr` (
601+ `PR_ID` decimal(10,0) NOT NULL ,
602+ `NUM` varchar(64) NOT NULL ,
603+ `HUB_RQD` decimal(1,0) NOT NULL ,
604+ `TP_RQD` decimal(1,0) NOT NULL ,
605+ `TRANS_TYPE_RQD` decimal(1,0) NOT NULL ,
606+ `HUB_LABEL` varchar(255) DEFAULT NULL ,
607+ `TP_LABEL` varchar(255) DEFAULT NULL ,
608+ `TRANS_TYPE_LABEL` varchar(255) DEFAULT NULL ,
609+ `TYPE` varchar(32) NOT NULL ,
610+ `PR_M_FLAG` decimal(1,0) NOT NULL ,
611+ `USER_DEFINED` decimal(1,0) NOT NULL ,
612+ `DESCRIPTIONS` varchar(4000) DEFAULT NULL ,
613+ `SIGNATURE` longtext ,
614+ PRIMARY KEY (`PR_ID`),
615+ KEY `pr_num_index` (`NUM`)
616+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
617+/*!40101 SET character_set_client = @saved_cs_client */;
618+
619+DROP TABLE IF EXISTS `prm`;
620+/*!40101 SET @saved_cs_client = @@character_set_client */;
621+/*!40101 SET character_set_client = utf8 */;
622+CREATE TABLE `prm` (
623+ `PR_M_ID` decimal(10,0) NOT NULL ,
624+ `M_ID` decimal(10,0) NOT NULL ,
625+ `PR_ID` decimal(10,0) DEFAULT NULL ,
626+ `ACTIVE_VERSION` decimal(10,0) DEFAULT NULL ,
627+ `CURRENT_VERSION` decimal(10,0) DEFAULT NULL ,
628+ `ENABLED` decimal(1,0) NOT NULL ,
629+ `NUM` varchar(64) NOT NULL ,
630+ PRIMARY KEY (`PR_M_ID`),
631+ KEY `I_PRM_M_ID` (`M_ID`),
632+ KEY `I_PRM_PR_ID` (`PR_ID`),
633+ KEY `prm_num_indx` (`NUM`),
634+ CONSTRAINT `FK_PMOD_REF_PR` FOREIGN KEY (`PR_ID`) REFERENCES `pr` (`PR_ID`),
635+ CONSTRAINT `FK_PRM_REF_PM` FOREIGN KEY (`M_ID`) REFERENCES `pm` (`M_ID`) ON DELETE CASCADE
636+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
637+/*!40101 SET character_set_client = @saved_cs_client */;
638+
639+DROP TABLE IF EXISTS `prm_inst`;
640+/*!40101 SET @saved_cs_client = @@character_set_client */;
641+/*!40101 SET character_set_client = utf8 */;
642+CREATE TABLE `prm_inst` (
643+ `PR_M_INST_ID` decimal(10,0) NOT NULL,
644+ `VERSION` decimal(10,0) NOT NULL,
645+ `PR_M_ID` decimal(10,0) NOT NULL,
646+ PRIMARY KEY (`PR_M_INST_ID`),
647+ UNIQUE KEY `UK_PRM_INST` (`VERSION`,`PR_M_ID`),
648+ KEY `I_PRM_INST_PR_MODE` (`PR_M_ID`),
649+ CONSTRAINT `FK_PRMI_REF_PRM` FOREIGN KEY (`PR_M_ID`) REFERENCES `prm` (`PR_M_ID`) ON DELETE CASCADE
650+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
651+/*!40101 SET character_set_client = @saved_cs_client */;
652+
653+
654+
655
656=== added file 't/pt-online-schema-change/samples/sql-mode-bug-1058285.sql'
657--- t/pt-online-schema-change/samples/sql-mode-bug-1058285.sql 1970-01-01 00:00:00 +0000
658+++ t/pt-online-schema-change/samples/sql-mode-bug-1058285.sql 2012-11-01 20:30:30 +0000
659@@ -0,0 +1,33 @@
660+DROP DATABASE IF EXISTS `issue26211`;
661+CREATE DATABASE `issue26211`;
662+USE `issue26211`;
663+
664+CREATE TABLE `process_model` (
665+ `PROC_MODEL_ID` decimal(10,0) NOT NULL,
666+ `PKG_MEM_ID` decimal(10,0) NOT NULL,
667+ `PROC_ID` decimal(10,0) DEFAULT NULL,
668+ `ACTIVE_VERSION` decimal(10,0) DEFAULT NULL,
669+ `CURRENT_VERSION` decimal(10,0) DEFAULT NULL,
670+ `ENABLED` decimal(1,0) NOT NULL,
671+ `NAME` varchar(64) NOT NULL,
672+ `COMMENTS` varchar(4000) DEFAULT NULL,
673+ PRIMARY KEY (`PROC_MODEL_ID`),
674+ KEY `I_PROCESS_MODEL_PKG_MEM_ID` (`PKG_MEM_ID`),
675+ KEY `I_PROCESS_MODEL_PROC_ID` (`PROC_ID`),
676+ KEY `procmodel_name_indx` (`NAME`)
677+) ENGINE=InnoDB;
678+
679+CREATE TABLE `process_model_inst` (
680+ `PROC_MODEL_INST_ID` decimal(10,0) NOT NULL,
681+ `VERSION` decimal(10,0) NOT NULL,
682+ `PROC_MODEL_ID` decimal(10,0) NOT NULL,
683+ `DATE_CREATED` datetime NOT NULL,
684+ `CHANGE_NOTE` varchar(4000) DEFAULT NULL,
685+ `XML` longtext NOT NULL,
686+ `AUTHOR` varchar(50) DEFAULT NULL,
687+ `CHECKSUM` varchar(64) DEFAULT NULL,
688+ PRIMARY KEY (`PROC_MODEL_INST_ID`),
689+ UNIQUE KEY `UK_PROCMODEL_INST` (`VERSION`,`PROC_MODEL_ID`),
690+ KEY `I_PROCESS_MODEL_INST_PROC_MODE` (`PROC_MODEL_ID`),
691+ CONSTRAINT `FK_PROCMODINST_REF_PROCMOD` FOREIGN KEY (`PROC_MODEL_ID`) REFERENCES `process_model` (`PROC_MODEL_ID`) ON DELETE CASCADE
692+) ENGINE=InnoDB;

Subscribers

People subscribed via source and target branches