Merge lp:~percona-toolkit-dev/percona-toolkit/fix-deep-recursion-bug-1136559-2.1 into lp:percona-toolkit/2.1
- fix-deep-recursion-bug-1136559-2.1
- Merge into 2.1
Proposed by
Daniel Nichter
Status: | Merged |
---|---|
Merged at revision: | 532 |
Proposed branch: | lp:~percona-toolkit-dev/percona-toolkit/fix-deep-recursion-bug-1136559-2.1 |
Merge into: | lp:percona-toolkit/2.1 |
Diff against target: |
854 lines (+510/-268) 8 files modified
bin/pt-duplicate-key-checker (+57/-52) bin/pt-index-usage (+57/-52) bin/pt-table-checksum (+57/-52) bin/pt-table-sync (+57/-52) lib/SchemaIterator.pm (+61/-58) t/lib/SchemaIterator.t (+16/-2) t/lib/samples/100-dbs-drop.sql (+100/-0) t/lib/samples/100-dbs.sql (+105/-0) |
To merge this branch: | bzr merge lp:~percona-toolkit-dev/percona-toolkit/fix-deep-recursion-bug-1136559-2.1 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Daniel Nichter | Approve | ||
Review via email: mp+171436@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Daniel Nichter (daniel-nichter) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'bin/pt-duplicate-key-checker' | |||
2 | --- bin/pt-duplicate-key-checker 2013-02-11 17:31:15 +0000 | |||
3 | +++ bin/pt-duplicate-key-checker 2013-06-25 23:43:28 +0000 | |||
4 | @@ -3142,58 +3142,63 @@ | |||
5 | 3142 | $self->{dbs} = \@dbs; | 3142 | $self->{dbs} = \@dbs; |
6 | 3143 | } | 3143 | } |
7 | 3144 | 3144 | ||
60 | 3145 | if ( !$self->{db} ) { | 3145 | DATABASE: |
61 | 3146 | $self->{db} = shift @{$self->{dbs}}; | 3146 | while ( $self->{db} || defined(my $db = shift @{$self->{dbs}}) ) { |
62 | 3147 | PTDEBUG && _d('Next database:', $self->{db}); | 3147 | if ( !$self->{db} ) { |
63 | 3148 | return unless $self->{db}; | 3148 | PTDEBUG && _d('Next database:', $db); |
64 | 3149 | } | 3149 | $self->{db} = $db; |
65 | 3150 | 3150 | } | |
66 | 3151 | if ( !defined $self->{tbls} ) { | 3151 | |
67 | 3152 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); | 3152 | if ( !$self->{tbls} ) { |
68 | 3153 | PTDEBUG && _d($sql); | 3153 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); |
69 | 3154 | my @tbls = map { | 3154 | PTDEBUG && _d($sql); |
70 | 3155 | $_->[0]; # (tbl, type) | 3155 | my @tbls = map { |
71 | 3156 | } | 3156 | $_->[0]; # (tbl, type) |
72 | 3157 | grep { | 3157 | } |
73 | 3158 | my ($tbl, $type) = @$_; | 3158 | grep { |
74 | 3159 | (!$type || ($type ne 'VIEW')) | 3159 | my ($tbl, $type) = @$_; |
75 | 3160 | && $self->_resume_from_table($tbl) | 3160 | (!$type || ($type ne 'VIEW')) |
76 | 3161 | && $self->table_is_allowed($self->{db}, $tbl); | 3161 | && $self->_resume_from_table($tbl) |
77 | 3162 | } | 3162 | && $self->table_is_allowed($self->{db}, $tbl); |
78 | 3163 | @{$dbh->selectall_arrayref($sql)}; | 3163 | } |
79 | 3164 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db}); | 3164 | @{$dbh->selectall_arrayref($sql)}; |
80 | 3165 | $self->{tbls} = \@tbls; | 3165 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database',$self->{db}); |
81 | 3166 | } | 3166 | $self->{tbls} = \@tbls; |
82 | 3167 | 3167 | } | |
83 | 3168 | while ( my $tbl = shift @{$self->{tbls}} ) { | 3168 | |
84 | 3169 | my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) }; | 3169 | TABLE: |
85 | 3170 | if ( my $e = $EVAL_ERROR ) { | 3170 | while ( my $tbl = shift @{$self->{tbls}} ) { |
86 | 3171 | my $table_name = "$self->{db}.$tbl"; | 3171 | my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) }; |
87 | 3172 | if ( $e =~ /\QTable '$table_name' doesn't exist/ ) { | 3172 | if ( my $e = $EVAL_ERROR ) { |
88 | 3173 | PTDEBUG && _d("Skipping $table_name because it no longer exists"); | 3173 | my $table_name = "$self->{db}.$tbl"; |
89 | 3174 | } | 3174 | if ( $e =~ /\QTable '$table_name' doesn't exist/ ) { |
90 | 3175 | else { | 3175 | PTDEBUG && _d("$table_name no longer exists"); |
91 | 3176 | warn "Skipping $table_name because SHOW CREATE TABLE failed: $e"; | 3176 | } |
92 | 3177 | } | 3177 | else { |
93 | 3178 | next; | 3178 | warn "Skipping $table_name because SHOW CREATE TABLE failed: $e"; |
94 | 3179 | } | 3179 | } |
95 | 3180 | my $tbl_struct = $tp->parse($ddl); | 3180 | next TABLE; |
96 | 3181 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { | 3181 | } |
97 | 3182 | return { | 3182 | |
98 | 3183 | db => $self->{db}, | 3183 | my $tbl_struct = $tp->parse($ddl); |
99 | 3184 | tbl => $tbl, | 3184 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { |
100 | 3185 | name => $q->quote($self->{db}, $tbl), | 3185 | return { |
101 | 3186 | ddl => $ddl, | 3186 | db => $self->{db}, |
102 | 3187 | tbl_struct => $tbl_struct, | 3187 | tbl => $tbl, |
103 | 3188 | }; | 3188 | name => $q->quote($self->{db}, $tbl), |
104 | 3189 | } | 3189 | ddl => $ddl, |
105 | 3190 | } | 3190 | tbl_struct => $tbl_struct, |
106 | 3191 | 3191 | }; | |
107 | 3192 | PTDEBUG && _d('No more tables in database', $self->{db}); | 3192 | } |
108 | 3193 | $self->{db} = undef; | 3193 | } |
109 | 3194 | $self->{tbls} = undef; | 3194 | |
110 | 3195 | 3195 | PTDEBUG && _d('No more tables in database', $self->{db}); | |
111 | 3196 | return $self->_iterate_dbh(); | 3196 | $self->{db} = undef; |
112 | 3197 | $self->{tbls} = undef; | ||
113 | 3198 | } # DATABASE | ||
114 | 3199 | |||
115 | 3200 | PTDEBUG && _d('No more databases'); | ||
116 | 3201 | return; | ||
117 | 3197 | } | 3202 | } |
118 | 3198 | 3203 | ||
119 | 3199 | sub database_is_allowed { | 3204 | sub database_is_allowed { |
120 | 3200 | 3205 | ||
121 | === modified file 'bin/pt-index-usage' | |||
122 | --- bin/pt-index-usage 2013-02-11 17:31:15 +0000 | |||
123 | +++ bin/pt-index-usage 2013-06-25 23:43:28 +0000 | |||
124 | @@ -3974,58 +3974,63 @@ | |||
125 | 3974 | $self->{dbs} = \@dbs; | 3974 | $self->{dbs} = \@dbs; |
126 | 3975 | } | 3975 | } |
127 | 3976 | 3976 | ||
180 | 3977 | if ( !$self->{db} ) { | 3977 | DATABASE: |
181 | 3978 | $self->{db} = shift @{$self->{dbs}}; | 3978 | while ( $self->{db} || defined(my $db = shift @{$self->{dbs}}) ) { |
182 | 3979 | PTDEBUG && _d('Next database:', $self->{db}); | 3979 | if ( !$self->{db} ) { |
183 | 3980 | return unless $self->{db}; | 3980 | PTDEBUG && _d('Next database:', $db); |
184 | 3981 | } | 3981 | $self->{db} = $db; |
185 | 3982 | 3982 | } | |
186 | 3983 | if ( !defined $self->{tbls} ) { | 3983 | |
187 | 3984 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); | 3984 | if ( !$self->{tbls} ) { |
188 | 3985 | PTDEBUG && _d($sql); | 3985 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); |
189 | 3986 | my @tbls = map { | 3986 | PTDEBUG && _d($sql); |
190 | 3987 | $_->[0]; # (tbl, type) | 3987 | my @tbls = map { |
191 | 3988 | } | 3988 | $_->[0]; # (tbl, type) |
192 | 3989 | grep { | 3989 | } |
193 | 3990 | my ($tbl, $type) = @$_; | 3990 | grep { |
194 | 3991 | (!$type || ($type ne 'VIEW')) | 3991 | my ($tbl, $type) = @$_; |
195 | 3992 | && $self->_resume_from_table($tbl) | 3992 | (!$type || ($type ne 'VIEW')) |
196 | 3993 | && $self->table_is_allowed($self->{db}, $tbl); | 3993 | && $self->_resume_from_table($tbl) |
197 | 3994 | } | 3994 | && $self->table_is_allowed($self->{db}, $tbl); |
198 | 3995 | @{$dbh->selectall_arrayref($sql)}; | 3995 | } |
199 | 3996 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db}); | 3996 | @{$dbh->selectall_arrayref($sql)}; |
200 | 3997 | $self->{tbls} = \@tbls; | 3997 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database',$self->{db}); |
201 | 3998 | } | 3998 | $self->{tbls} = \@tbls; |
202 | 3999 | 3999 | } | |
203 | 4000 | while ( my $tbl = shift @{$self->{tbls}} ) { | 4000 | |
204 | 4001 | my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) }; | 4001 | TABLE: |
205 | 4002 | if ( my $e = $EVAL_ERROR ) { | 4002 | while ( my $tbl = shift @{$self->{tbls}} ) { |
206 | 4003 | my $table_name = "$self->{db}.$tbl"; | 4003 | my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) }; |
207 | 4004 | if ( $e =~ /\QTable '$table_name' doesn't exist/ ) { | 4004 | if ( my $e = $EVAL_ERROR ) { |
208 | 4005 | PTDEBUG && _d("Skipping $table_name because it no longer exists"); | 4005 | my $table_name = "$self->{db}.$tbl"; |
209 | 4006 | } | 4006 | if ( $e =~ /\QTable '$table_name' doesn't exist/ ) { |
210 | 4007 | else { | 4007 | PTDEBUG && _d("$table_name no longer exists"); |
211 | 4008 | warn "Skipping $table_name because SHOW CREATE TABLE failed: $e"; | 4008 | } |
212 | 4009 | } | 4009 | else { |
213 | 4010 | next; | 4010 | warn "Skipping $table_name because SHOW CREATE TABLE failed: $e"; |
214 | 4011 | } | 4011 | } |
215 | 4012 | my $tbl_struct = $tp->parse($ddl); | 4012 | next TABLE; |
216 | 4013 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { | 4013 | } |
217 | 4014 | return { | 4014 | |
218 | 4015 | db => $self->{db}, | 4015 | my $tbl_struct = $tp->parse($ddl); |
219 | 4016 | tbl => $tbl, | 4016 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { |
220 | 4017 | name => $q->quote($self->{db}, $tbl), | 4017 | return { |
221 | 4018 | ddl => $ddl, | 4018 | db => $self->{db}, |
222 | 4019 | tbl_struct => $tbl_struct, | 4019 | tbl => $tbl, |
223 | 4020 | }; | 4020 | name => $q->quote($self->{db}, $tbl), |
224 | 4021 | } | 4021 | ddl => $ddl, |
225 | 4022 | } | 4022 | tbl_struct => $tbl_struct, |
226 | 4023 | 4023 | }; | |
227 | 4024 | PTDEBUG && _d('No more tables in database', $self->{db}); | 4024 | } |
228 | 4025 | $self->{db} = undef; | 4025 | } |
229 | 4026 | $self->{tbls} = undef; | 4026 | |
230 | 4027 | 4027 | PTDEBUG && _d('No more tables in database', $self->{db}); | |
231 | 4028 | return $self->_iterate_dbh(); | 4028 | $self->{db} = undef; |
232 | 4029 | $self->{tbls} = undef; | ||
233 | 4030 | } # DATABASE | ||
234 | 4031 | |||
235 | 4032 | PTDEBUG && _d('No more databases'); | ||
236 | 4033 | return; | ||
237 | 4029 | } | 4034 | } |
238 | 4030 | 4035 | ||
239 | 4031 | sub database_is_allowed { | 4036 | sub database_is_allowed { |
240 | 4032 | 4037 | ||
241 | === modified file 'bin/pt-table-checksum' | |||
242 | --- bin/pt-table-checksum 2013-04-04 21:44:42 +0000 | |||
243 | +++ bin/pt-table-checksum 2013-06-25 23:43:28 +0000 | |||
244 | @@ -6883,58 +6883,63 @@ | |||
245 | 6883 | $self->{dbs} = \@dbs; | 6883 | $self->{dbs} = \@dbs; |
246 | 6884 | } | 6884 | } |
247 | 6885 | 6885 | ||
300 | 6886 | if ( !$self->{db} ) { | 6886 | DATABASE: |
301 | 6887 | $self->{db} = shift @{$self->{dbs}}; | 6887 | while ( $self->{db} || defined(my $db = shift @{$self->{dbs}}) ) { |
302 | 6888 | PTDEBUG && _d('Next database:', $self->{db}); | 6888 | if ( !$self->{db} ) { |
303 | 6889 | return unless $self->{db}; | 6889 | PTDEBUG && _d('Next database:', $db); |
304 | 6890 | } | 6890 | $self->{db} = $db; |
305 | 6891 | 6891 | } | |
306 | 6892 | if ( !defined $self->{tbls} ) { | 6892 | |
307 | 6893 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); | 6893 | if ( !$self->{tbls} ) { |
308 | 6894 | PTDEBUG && _d($sql); | 6894 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); |
309 | 6895 | my @tbls = map { | 6895 | PTDEBUG && _d($sql); |
310 | 6896 | $_->[0]; # (tbl, type) | 6896 | my @tbls = map { |
311 | 6897 | } | 6897 | $_->[0]; # (tbl, type) |
312 | 6898 | grep { | 6898 | } |
313 | 6899 | my ($tbl, $type) = @$_; | 6899 | grep { |
314 | 6900 | (!$type || ($type ne 'VIEW')) | 6900 | my ($tbl, $type) = @$_; |
315 | 6901 | && $self->_resume_from_table($tbl) | 6901 | (!$type || ($type ne 'VIEW')) |
316 | 6902 | && $self->table_is_allowed($self->{db}, $tbl); | 6902 | && $self->_resume_from_table($tbl) |
317 | 6903 | } | 6903 | && $self->table_is_allowed($self->{db}, $tbl); |
318 | 6904 | @{$dbh->selectall_arrayref($sql)}; | 6904 | } |
319 | 6905 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db}); | 6905 | @{$dbh->selectall_arrayref($sql)}; |
320 | 6906 | $self->{tbls} = \@tbls; | 6906 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database',$self->{db}); |
321 | 6907 | } | 6907 | $self->{tbls} = \@tbls; |
322 | 6908 | 6908 | } | |
323 | 6909 | while ( my $tbl = shift @{$self->{tbls}} ) { | 6909 | |
324 | 6910 | my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) }; | 6910 | TABLE: |
325 | 6911 | if ( my $e = $EVAL_ERROR ) { | 6911 | while ( my $tbl = shift @{$self->{tbls}} ) { |
326 | 6912 | my $table_name = "$self->{db}.$tbl"; | 6912 | my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) }; |
327 | 6913 | if ( $e =~ /\QTable '$table_name' doesn't exist/ ) { | 6913 | if ( my $e = $EVAL_ERROR ) { |
328 | 6914 | PTDEBUG && _d("Skipping $table_name because it no longer exists"); | 6914 | my $table_name = "$self->{db}.$tbl"; |
329 | 6915 | } | 6915 | if ( $e =~ /\QTable '$table_name' doesn't exist/ ) { |
330 | 6916 | else { | 6916 | PTDEBUG && _d("$table_name no longer exists"); |
331 | 6917 | warn "Skipping $table_name because SHOW CREATE TABLE failed: $e"; | 6917 | } |
332 | 6918 | } | 6918 | else { |
333 | 6919 | next; | 6919 | warn "Skipping $table_name because SHOW CREATE TABLE failed: $e"; |
334 | 6920 | } | 6920 | } |
335 | 6921 | my $tbl_struct = $tp->parse($ddl); | 6921 | next TABLE; |
336 | 6922 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { | 6922 | } |
337 | 6923 | return { | 6923 | |
338 | 6924 | db => $self->{db}, | 6924 | my $tbl_struct = $tp->parse($ddl); |
339 | 6925 | tbl => $tbl, | 6925 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { |
340 | 6926 | name => $q->quote($self->{db}, $tbl), | 6926 | return { |
341 | 6927 | ddl => $ddl, | 6927 | db => $self->{db}, |
342 | 6928 | tbl_struct => $tbl_struct, | 6928 | tbl => $tbl, |
343 | 6929 | }; | 6929 | name => $q->quote($self->{db}, $tbl), |
344 | 6930 | } | 6930 | ddl => $ddl, |
345 | 6931 | } | 6931 | tbl_struct => $tbl_struct, |
346 | 6932 | 6932 | }; | |
347 | 6933 | PTDEBUG && _d('No more tables in database', $self->{db}); | 6933 | } |
348 | 6934 | $self->{db} = undef; | 6934 | } |
349 | 6935 | $self->{tbls} = undef; | 6935 | |
350 | 6936 | 6936 | PTDEBUG && _d('No more tables in database', $self->{db}); | |
351 | 6937 | return $self->_iterate_dbh(); | 6937 | $self->{db} = undef; |
352 | 6938 | $self->{tbls} = undef; | ||
353 | 6939 | } # DATABASE | ||
354 | 6940 | |||
355 | 6941 | PTDEBUG && _d('No more databases'); | ||
356 | 6942 | return; | ||
357 | 6938 | } | 6943 | } |
358 | 6939 | 6944 | ||
359 | 6940 | sub database_is_allowed { | 6945 | sub database_is_allowed { |
360 | 6941 | 6946 | ||
361 | === modified file 'bin/pt-table-sync' | |||
362 | --- bin/pt-table-sync 2013-02-11 17:31:15 +0000 | |||
363 | +++ bin/pt-table-sync 2013-06-25 23:43:28 +0000 | |||
364 | @@ -7637,58 +7637,63 @@ | |||
365 | 7637 | $self->{dbs} = \@dbs; | 7637 | $self->{dbs} = \@dbs; |
366 | 7638 | } | 7638 | } |
367 | 7639 | 7639 | ||
420 | 7640 | if ( !$self->{db} ) { | 7640 | DATABASE: |
421 | 7641 | $self->{db} = shift @{$self->{dbs}}; | 7641 | while ( $self->{db} || defined(my $db = shift @{$self->{dbs}}) ) { |
422 | 7642 | PTDEBUG && _d('Next database:', $self->{db}); | 7642 | if ( !$self->{db} ) { |
423 | 7643 | return unless $self->{db}; | 7643 | PTDEBUG && _d('Next database:', $db); |
424 | 7644 | } | 7644 | $self->{db} = $db; |
425 | 7645 | 7645 | } | |
426 | 7646 | if ( !defined $self->{tbls} ) { | 7646 | |
427 | 7647 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); | 7647 | if ( !$self->{tbls} ) { |
428 | 7648 | PTDEBUG && _d($sql); | 7648 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); |
429 | 7649 | my @tbls = map { | 7649 | PTDEBUG && _d($sql); |
430 | 7650 | $_->[0]; # (tbl, type) | 7650 | my @tbls = map { |
431 | 7651 | } | 7651 | $_->[0]; # (tbl, type) |
432 | 7652 | grep { | 7652 | } |
433 | 7653 | my ($tbl, $type) = @$_; | 7653 | grep { |
434 | 7654 | (!$type || ($type ne 'VIEW')) | 7654 | my ($tbl, $type) = @$_; |
435 | 7655 | && $self->_resume_from_table($tbl) | 7655 | (!$type || ($type ne 'VIEW')) |
436 | 7656 | && $self->table_is_allowed($self->{db}, $tbl); | 7656 | && $self->_resume_from_table($tbl) |
437 | 7657 | } | 7657 | && $self->table_is_allowed($self->{db}, $tbl); |
438 | 7658 | @{$dbh->selectall_arrayref($sql)}; | 7658 | } |
439 | 7659 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db}); | 7659 | @{$dbh->selectall_arrayref($sql)}; |
440 | 7660 | $self->{tbls} = \@tbls; | 7660 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database',$self->{db}); |
441 | 7661 | } | 7661 | $self->{tbls} = \@tbls; |
442 | 7662 | 7662 | } | |
443 | 7663 | while ( my $tbl = shift @{$self->{tbls}} ) { | 7663 | |
444 | 7664 | my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) }; | 7664 | TABLE: |
445 | 7665 | if ( my $e = $EVAL_ERROR ) { | 7665 | while ( my $tbl = shift @{$self->{tbls}} ) { |
446 | 7666 | my $table_name = "$self->{db}.$tbl"; | 7666 | my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) }; |
447 | 7667 | if ( $e =~ /\QTable '$table_name' doesn't exist/ ) { | 7667 | if ( my $e = $EVAL_ERROR ) { |
448 | 7668 | PTDEBUG && _d("Skipping $table_name because it no longer exists"); | 7668 | my $table_name = "$self->{db}.$tbl"; |
449 | 7669 | } | 7669 | if ( $e =~ /\QTable '$table_name' doesn't exist/ ) { |
450 | 7670 | else { | 7670 | PTDEBUG && _d("$table_name no longer exists"); |
451 | 7671 | warn "Skipping $table_name because SHOW CREATE TABLE failed: $e"; | 7671 | } |
452 | 7672 | } | 7672 | else { |
453 | 7673 | next; | 7673 | warn "Skipping $table_name because SHOW CREATE TABLE failed: $e"; |
454 | 7674 | } | 7674 | } |
455 | 7675 | my $tbl_struct = $tp->parse($ddl); | 7675 | next TABLE; |
456 | 7676 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { | 7676 | } |
457 | 7677 | return { | 7677 | |
458 | 7678 | db => $self->{db}, | 7678 | my $tbl_struct = $tp->parse($ddl); |
459 | 7679 | tbl => $tbl, | 7679 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { |
460 | 7680 | name => $q->quote($self->{db}, $tbl), | 7680 | return { |
461 | 7681 | ddl => $ddl, | 7681 | db => $self->{db}, |
462 | 7682 | tbl_struct => $tbl_struct, | 7682 | tbl => $tbl, |
463 | 7683 | }; | 7683 | name => $q->quote($self->{db}, $tbl), |
464 | 7684 | } | 7684 | ddl => $ddl, |
465 | 7685 | } | 7685 | tbl_struct => $tbl_struct, |
466 | 7686 | 7686 | }; | |
467 | 7687 | PTDEBUG && _d('No more tables in database', $self->{db}); | 7687 | } |
468 | 7688 | $self->{db} = undef; | 7688 | } |
469 | 7689 | $self->{tbls} = undef; | 7689 | |
470 | 7690 | 7690 | PTDEBUG && _d('No more tables in database', $self->{db}); | |
471 | 7691 | return $self->_iterate_dbh(); | 7691 | $self->{db} = undef; |
472 | 7692 | $self->{tbls} = undef; | ||
473 | 7693 | } # DATABASE | ||
474 | 7694 | |||
475 | 7695 | PTDEBUG && _d('No more databases'); | ||
476 | 7696 | return; | ||
477 | 7692 | } | 7697 | } |
478 | 7693 | 7698 | ||
479 | 7694 | sub database_is_allowed { | 7699 | sub database_is_allowed { |
480 | 7695 | 7700 | ||
481 | === modified file 'lib/SchemaIterator.pm' | |||
482 | --- lib/SchemaIterator.pm 2013-01-03 00:19:16 +0000 | |||
483 | +++ lib/SchemaIterator.pm 2013-06-25 23:43:28 +0000 | |||
484 | @@ -334,64 +334,67 @@ | |||
485 | 334 | $self->{dbs} = \@dbs; | 334 | $self->{dbs} = \@dbs; |
486 | 335 | } | 335 | } |
487 | 336 | 336 | ||
546 | 337 | if ( !$self->{db} ) { | 337 | DATABASE: |
547 | 338 | $self->{db} = shift @{$self->{dbs}}; | 338 | while ( $self->{db} || defined(my $db = shift @{$self->{dbs}}) ) { |
548 | 339 | PTDEBUG && _d('Next database:', $self->{db}); | 339 | if ( !$self->{db} ) { |
549 | 340 | return unless $self->{db}; | 340 | PTDEBUG && _d('Next database:', $db); |
550 | 341 | } | 341 | $self->{db} = $db; |
551 | 342 | 342 | } | |
552 | 343 | if ( !defined $self->{tbls} ) { | 343 | |
553 | 344 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); | 344 | if ( !$self->{tbls} ) { |
554 | 345 | PTDEBUG && _d($sql); | 345 | my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db}); |
555 | 346 | my @tbls = map { | 346 | PTDEBUG && _d($sql); |
556 | 347 | $_->[0]; # (tbl, type) | 347 | my @tbls = map { |
557 | 348 | } | 348 | $_->[0]; # (tbl, type) |
558 | 349 | grep { | 349 | } |
559 | 350 | my ($tbl, $type) = @$_; | 350 | grep { |
560 | 351 | (!$type || ($type ne 'VIEW')) | 351 | my ($tbl, $type) = @$_; |
561 | 352 | && $self->_resume_from_table($tbl) | 352 | (!$type || ($type ne 'VIEW')) |
562 | 353 | && $self->table_is_allowed($self->{db}, $tbl); | 353 | && $self->_resume_from_table($tbl) |
563 | 354 | } | 354 | && $self->table_is_allowed($self->{db}, $tbl); |
564 | 355 | @{$dbh->selectall_arrayref($sql)}; | 355 | } |
565 | 356 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db}); | 356 | @{$dbh->selectall_arrayref($sql)}; |
566 | 357 | $self->{tbls} = \@tbls; | 357 | PTDEBUG && _d('Found', scalar @tbls, 'tables in database',$self->{db}); |
567 | 358 | } | 358 | $self->{tbls} = \@tbls; |
568 | 359 | 359 | } | |
569 | 360 | while ( my $tbl = shift @{$self->{tbls}} ) { | 360 | |
570 | 361 | my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) }; | 361 | TABLE: |
571 | 362 | if ( my $e = $EVAL_ERROR ) { | 362 | while ( my $tbl = shift @{$self->{tbls}} ) { |
572 | 363 | my $table_name = "$self->{db}.$tbl"; | 363 | my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) }; |
573 | 364 | # SHOW CREATE TABLE failed. This is a bit puzzling; | 364 | if ( my $e = $EVAL_ERROR ) { |
574 | 365 | # maybe the table got dropped, or crashed. Not much we can | 365 | my $table_name = "$self->{db}.$tbl"; |
575 | 366 | # do about it; If the table is missing, just PTDEBUG it, but | 366 | # SHOW CREATE TABLE failed. This is a bit puzzling; |
576 | 367 | # otherwise, warn with the error. | 367 | # maybe the table got dropped, or crashed. Not much we can |
577 | 368 | if ( $e =~ /\QTable '$table_name' doesn't exist/ ) { | 368 | # do about it; If the table is missing, just PTDEBUG it, but |
578 | 369 | PTDEBUG && _d("Skipping $table_name because it no longer exists"); | 369 | # otherwise, warn with the error. |
579 | 370 | } | 370 | if ( $e =~ /\QTable '$table_name' doesn't exist/ ) { |
580 | 371 | else { | 371 | PTDEBUG && _d("$table_name no longer exists"); |
581 | 372 | warn "Skipping $table_name because SHOW CREATE TABLE failed: $e"; | 372 | } |
582 | 373 | } | 373 | else { |
583 | 374 | next; | 374 | warn "Skipping $table_name because SHOW CREATE TABLE failed: $e"; |
584 | 375 | } | 375 | } |
585 | 376 | my $tbl_struct = $tp->parse($ddl); | 376 | next TABLE; |
586 | 377 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { | 377 | } |
587 | 378 | return { | 378 | |
588 | 379 | db => $self->{db}, | 379 | my $tbl_struct = $tp->parse($ddl); |
589 | 380 | tbl => $tbl, | 380 | if ( $self->engine_is_allowed($tbl_struct->{engine}) ) { |
590 | 381 | name => $q->quote($self->{db}, $tbl), | 381 | return { |
591 | 382 | ddl => $ddl, | 382 | db => $self->{db}, |
592 | 383 | tbl_struct => $tbl_struct, | 383 | tbl => $tbl, |
593 | 384 | }; | 384 | name => $q->quote($self->{db}, $tbl), |
594 | 385 | } | 385 | ddl => $ddl, |
595 | 386 | } | 386 | tbl_struct => $tbl_struct, |
596 | 387 | 387 | }; | |
597 | 388 | PTDEBUG && _d('No more tables in database', $self->{db}); | 388 | } |
598 | 389 | $self->{db} = undef; | 389 | } |
599 | 390 | $self->{tbls} = undef; | 390 | |
600 | 391 | 391 | PTDEBUG && _d('No more tables in database', $self->{db}); | |
601 | 392 | # Recurse to get the next database. If there's no next db, then the | 392 | $self->{db} = undef; |
602 | 393 | # call will return undef and we'll return undef, too. | 393 | $self->{tbls} = undef; |
603 | 394 | return $self->_iterate_dbh(); | 394 | } # DATABASE |
604 | 395 | |||
605 | 396 | PTDEBUG && _d('No more databases'); | ||
606 | 397 | return; | ||
607 | 395 | } | 398 | } |
608 | 396 | 399 | ||
609 | 397 | sub database_is_allowed { | 400 | sub database_is_allowed { |
610 | 398 | 401 | ||
611 | === modified file 't/lib/SchemaIterator.t' | |||
612 | --- t/lib/SchemaIterator.t 2012-12-07 18:52:33 +0000 | |||
613 | +++ t/lib/SchemaIterator.t 2013-06-25 23:43:28 +0000 | |||
614 | @@ -548,9 +548,23 @@ | |||
615 | 548 | diag(`$trunk/sandbox/stop-sandbox $master3_port >/dev/null`); | 548 | diag(`$trunk/sandbox/stop-sandbox $master3_port >/dev/null`); |
616 | 549 | 549 | ||
617 | 550 | # ############################################################################# | 550 | # ############################################################################# |
618 | 551 | # Bug 1136559: Deep recursion on subroutine "SchemaIterator::_iterate_dbh" | ||
619 | 552 | # ############################################################################# | ||
620 | 553 | |||
621 | 554 | $sb->wipe_clean($dbh); | ||
622 | 555 | diag(`/tmp/12345/use < $trunk/t/lib/samples/100-dbs.sql`); | ||
623 | 556 | |||
624 | 557 | test_so( | ||
625 | 558 | filters => [], | ||
626 | 559 | result => "foo001.bar001 ", | ||
627 | 560 | lives_ok => 1, | ||
628 | 561 | test_name => "Bug 1136559: Deep recursion on subroutine SchemaIterator::_iterate_dbh", | ||
629 | 562 | ); | ||
630 | 563 | |||
631 | 564 | diag(`/tmp/12345/use < $trunk/t/lib/samples/100-dbs-drop.sql`); | ||
632 | 565 | |||
633 | 566 | # ############################################################################# | ||
634 | 551 | # Done. | 567 | # Done. |
635 | 552 | # ############################################################################# | 568 | # ############################################################################# |
636 | 553 | ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); | 569 | ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); |
637 | 554 | |||
638 | 555 | done_testing; | 570 | done_testing; |
639 | 556 | exit; | ||
640 | 557 | 571 | ||
641 | === added file 't/lib/samples/100-dbs-drop.sql' | |||
642 | --- t/lib/samples/100-dbs-drop.sql 1970-01-01 00:00:00 +0000 | |||
643 | +++ t/lib/samples/100-dbs-drop.sql 2013-06-25 23:43:28 +0000 | |||
644 | @@ -0,0 +1,100 @@ | |||
645 | 1 | DROP DATABASE IF EXISTS foo001; | ||
646 | 2 | DROP DATABASE IF EXISTS foo002; | ||
647 | 3 | DROP DATABASE IF EXISTS foo003; | ||
648 | 4 | DROP DATABASE IF EXISTS foo004; | ||
649 | 5 | DROP DATABASE IF EXISTS foo005; | ||
650 | 6 | DROP DATABASE IF EXISTS foo006; | ||
651 | 7 | DROP DATABASE IF EXISTS foo007; | ||
652 | 8 | DROP DATABASE IF EXISTS foo008; | ||
653 | 9 | DROP DATABASE IF EXISTS foo009; | ||
654 | 10 | DROP DATABASE IF EXISTS foo010; | ||
655 | 11 | DROP DATABASE IF EXISTS foo011; | ||
656 | 12 | DROP DATABASE IF EXISTS foo012; | ||
657 | 13 | DROP DATABASE IF EXISTS foo013; | ||
658 | 14 | DROP DATABASE IF EXISTS foo014; | ||
659 | 15 | DROP DATABASE IF EXISTS foo015; | ||
660 | 16 | DROP DATABASE IF EXISTS foo016; | ||
661 | 17 | DROP DATABASE IF EXISTS foo017; | ||
662 | 18 | DROP DATABASE IF EXISTS foo018; | ||
663 | 19 | DROP DATABASE IF EXISTS foo019; | ||
664 | 20 | DROP DATABASE IF EXISTS foo020; | ||
665 | 21 | DROP DATABASE IF EXISTS foo021; | ||
666 | 22 | DROP DATABASE IF EXISTS foo022; | ||
667 | 23 | DROP DATABASE IF EXISTS foo023; | ||
668 | 24 | DROP DATABASE IF EXISTS foo024; | ||
669 | 25 | DROP DATABASE IF EXISTS foo025; | ||
670 | 26 | DROP DATABASE IF EXISTS foo026; | ||
671 | 27 | DROP DATABASE IF EXISTS foo027; | ||
672 | 28 | DROP DATABASE IF EXISTS foo028; | ||
673 | 29 | DROP DATABASE IF EXISTS foo029; | ||
674 | 30 | DROP DATABASE IF EXISTS foo030; | ||
675 | 31 | DROP DATABASE IF EXISTS foo031; | ||
676 | 32 | DROP DATABASE IF EXISTS foo032; | ||
677 | 33 | DROP DATABASE IF EXISTS foo033; | ||
678 | 34 | DROP DATABASE IF EXISTS foo034; | ||
679 | 35 | DROP DATABASE IF EXISTS foo035; | ||
680 | 36 | DROP DATABASE IF EXISTS foo036; | ||
681 | 37 | DROP DATABASE IF EXISTS foo037; | ||
682 | 38 | DROP DATABASE IF EXISTS foo038; | ||
683 | 39 | DROP DATABASE IF EXISTS foo039; | ||
684 | 40 | DROP DATABASE IF EXISTS foo040; | ||
685 | 41 | DROP DATABASE IF EXISTS foo041; | ||
686 | 42 | DROP DATABASE IF EXISTS foo042; | ||
687 | 43 | DROP DATABASE IF EXISTS foo043; | ||
688 | 44 | DROP DATABASE IF EXISTS foo044; | ||
689 | 45 | DROP DATABASE IF EXISTS foo045; | ||
690 | 46 | DROP DATABASE IF EXISTS foo046; | ||
691 | 47 | DROP DATABASE IF EXISTS foo047; | ||
692 | 48 | DROP DATABASE IF EXISTS foo048; | ||
693 | 49 | DROP DATABASE IF EXISTS foo049; | ||
694 | 50 | DROP DATABASE IF EXISTS foo050; | ||
695 | 51 | DROP DATABASE IF EXISTS foo051; | ||
696 | 52 | DROP DATABASE IF EXISTS foo052; | ||
697 | 53 | DROP DATABASE IF EXISTS foo053; | ||
698 | 54 | DROP DATABASE IF EXISTS foo054; | ||
699 | 55 | DROP DATABASE IF EXISTS foo055; | ||
700 | 56 | DROP DATABASE IF EXISTS foo056; | ||
701 | 57 | DROP DATABASE IF EXISTS foo057; | ||
702 | 58 | DROP DATABASE IF EXISTS foo058; | ||
703 | 59 | DROP DATABASE IF EXISTS foo059; | ||
704 | 60 | DROP DATABASE IF EXISTS foo060; | ||
705 | 61 | DROP DATABASE IF EXISTS foo061; | ||
706 | 62 | DROP DATABASE IF EXISTS foo062; | ||
707 | 63 | DROP DATABASE IF EXISTS foo063; | ||
708 | 64 | DROP DATABASE IF EXISTS foo064; | ||
709 | 65 | DROP DATABASE IF EXISTS foo065; | ||
710 | 66 | DROP DATABASE IF EXISTS foo066; | ||
711 | 67 | DROP DATABASE IF EXISTS foo067; | ||
712 | 68 | DROP DATABASE IF EXISTS foo068; | ||
713 | 69 | DROP DATABASE IF EXISTS foo069; | ||
714 | 70 | DROP DATABASE IF EXISTS foo070; | ||
715 | 71 | DROP DATABASE IF EXISTS foo071; | ||
716 | 72 | DROP DATABASE IF EXISTS foo072; | ||
717 | 73 | DROP DATABASE IF EXISTS foo073; | ||
718 | 74 | DROP DATABASE IF EXISTS foo074; | ||
719 | 75 | DROP DATABASE IF EXISTS foo075; | ||
720 | 76 | DROP DATABASE IF EXISTS foo076; | ||
721 | 77 | DROP DATABASE IF EXISTS foo077; | ||
722 | 78 | DROP DATABASE IF EXISTS foo078; | ||
723 | 79 | DROP DATABASE IF EXISTS foo079; | ||
724 | 80 | DROP DATABASE IF EXISTS foo080; | ||
725 | 81 | DROP DATABASE IF EXISTS foo081; | ||
726 | 82 | DROP DATABASE IF EXISTS foo082; | ||
727 | 83 | DROP DATABASE IF EXISTS foo083; | ||
728 | 84 | DROP DATABASE IF EXISTS foo084; | ||
729 | 85 | DROP DATABASE IF EXISTS foo085; | ||
730 | 86 | DROP DATABASE IF EXISTS foo086; | ||
731 | 87 | DROP DATABASE IF EXISTS foo087; | ||
732 | 88 | DROP DATABASE IF EXISTS foo088; | ||
733 | 89 | DROP DATABASE IF EXISTS foo089; | ||
734 | 90 | DROP DATABASE IF EXISTS foo090; | ||
735 | 91 | DROP DATABASE IF EXISTS foo091; | ||
736 | 92 | DROP DATABASE IF EXISTS foo092; | ||
737 | 93 | DROP DATABASE IF EXISTS foo093; | ||
738 | 94 | DROP DATABASE IF EXISTS foo094; | ||
739 | 95 | DROP DATABASE IF EXISTS foo095; | ||
740 | 96 | DROP DATABASE IF EXISTS foo096; | ||
741 | 97 | DROP DATABASE IF EXISTS foo097; | ||
742 | 98 | DROP DATABASE IF EXISTS foo098; | ||
743 | 99 | DROP DATABASE IF EXISTS foo099; | ||
744 | 100 | DROP DATABASE IF EXISTS foo100; | ||
745 | 0 | 101 | ||
746 | === added file 't/lib/samples/100-dbs.sql' | |||
747 | --- t/lib/samples/100-dbs.sql 1970-01-01 00:00:00 +0000 | |||
748 | +++ t/lib/samples/100-dbs.sql 2013-06-25 23:43:28 +0000 | |||
749 | @@ -0,0 +1,105 @@ | |||
750 | 1 | CREATE DATABASE IF NOT EXISTS foo001; | ||
751 | 2 | CREATE DATABASE IF NOT EXISTS foo002; | ||
752 | 3 | CREATE DATABASE IF NOT EXISTS foo003; | ||
753 | 4 | CREATE DATABASE IF NOT EXISTS foo004; | ||
754 | 5 | CREATE DATABASE IF NOT EXISTS foo005; | ||
755 | 6 | CREATE DATABASE IF NOT EXISTS foo006; | ||
756 | 7 | CREATE DATABASE IF NOT EXISTS foo007; | ||
757 | 8 | CREATE DATABASE IF NOT EXISTS foo008; | ||
758 | 9 | CREATE DATABASE IF NOT EXISTS foo009; | ||
759 | 10 | CREATE DATABASE IF NOT EXISTS foo010; | ||
760 | 11 | CREATE DATABASE IF NOT EXISTS foo011; | ||
761 | 12 | CREATE DATABASE IF NOT EXISTS foo012; | ||
762 | 13 | CREATE DATABASE IF NOT EXISTS foo013; | ||
763 | 14 | CREATE DATABASE IF NOT EXISTS foo014; | ||
764 | 15 | CREATE DATABASE IF NOT EXISTS foo015; | ||
765 | 16 | CREATE DATABASE IF NOT EXISTS foo016; | ||
766 | 17 | CREATE DATABASE IF NOT EXISTS foo017; | ||
767 | 18 | CREATE DATABASE IF NOT EXISTS foo018; | ||
768 | 19 | CREATE DATABASE IF NOT EXISTS foo019; | ||
769 | 20 | CREATE DATABASE IF NOT EXISTS foo020; | ||
770 | 21 | CREATE DATABASE IF NOT EXISTS foo021; | ||
771 | 22 | CREATE DATABASE IF NOT EXISTS foo022; | ||
772 | 23 | CREATE DATABASE IF NOT EXISTS foo023; | ||
773 | 24 | CREATE DATABASE IF NOT EXISTS foo024; | ||
774 | 25 | CREATE DATABASE IF NOT EXISTS foo025; | ||
775 | 26 | CREATE DATABASE IF NOT EXISTS foo026; | ||
776 | 27 | CREATE DATABASE IF NOT EXISTS foo027; | ||
777 | 28 | CREATE DATABASE IF NOT EXISTS foo028; | ||
778 | 29 | CREATE DATABASE IF NOT EXISTS foo029; | ||
779 | 30 | CREATE DATABASE IF NOT EXISTS foo030; | ||
780 | 31 | CREATE DATABASE IF NOT EXISTS foo031; | ||
781 | 32 | CREATE DATABASE IF NOT EXISTS foo032; | ||
782 | 33 | CREATE DATABASE IF NOT EXISTS foo033; | ||
783 | 34 | CREATE DATABASE IF NOT EXISTS foo034; | ||
784 | 35 | CREATE DATABASE IF NOT EXISTS foo035; | ||
785 | 36 | CREATE DATABASE IF NOT EXISTS foo036; | ||
786 | 37 | CREATE DATABASE IF NOT EXISTS foo037; | ||
787 | 38 | CREATE DATABASE IF NOT EXISTS foo038; | ||
788 | 39 | CREATE DATABASE IF NOT EXISTS foo039; | ||
789 | 40 | CREATE DATABASE IF NOT EXISTS foo040; | ||
790 | 41 | CREATE DATABASE IF NOT EXISTS foo041; | ||
791 | 42 | CREATE DATABASE IF NOT EXISTS foo042; | ||
792 | 43 | CREATE DATABASE IF NOT EXISTS foo043; | ||
793 | 44 | CREATE DATABASE IF NOT EXISTS foo044; | ||
794 | 45 | CREATE DATABASE IF NOT EXISTS foo045; | ||
795 | 46 | CREATE DATABASE IF NOT EXISTS foo046; | ||
796 | 47 | CREATE DATABASE IF NOT EXISTS foo047; | ||
797 | 48 | CREATE DATABASE IF NOT EXISTS foo048; | ||
798 | 49 | CREATE DATABASE IF NOT EXISTS foo049; | ||
799 | 50 | CREATE DATABASE IF NOT EXISTS foo050; | ||
800 | 51 | CREATE DATABASE IF NOT EXISTS foo051; | ||
801 | 52 | CREATE DATABASE IF NOT EXISTS foo052; | ||
802 | 53 | CREATE DATABASE IF NOT EXISTS foo053; | ||
803 | 54 | CREATE DATABASE IF NOT EXISTS foo054; | ||
804 | 55 | CREATE DATABASE IF NOT EXISTS foo055; | ||
805 | 56 | CREATE DATABASE IF NOT EXISTS foo056; | ||
806 | 57 | CREATE DATABASE IF NOT EXISTS foo057; | ||
807 | 58 | CREATE DATABASE IF NOT EXISTS foo058; | ||
808 | 59 | CREATE DATABASE IF NOT EXISTS foo059; | ||
809 | 60 | CREATE DATABASE IF NOT EXISTS foo060; | ||
810 | 61 | CREATE DATABASE IF NOT EXISTS foo061; | ||
811 | 62 | CREATE DATABASE IF NOT EXISTS foo062; | ||
812 | 63 | CREATE DATABASE IF NOT EXISTS foo063; | ||
813 | 64 | CREATE DATABASE IF NOT EXISTS foo064; | ||
814 | 65 | CREATE DATABASE IF NOT EXISTS foo065; | ||
815 | 66 | CREATE DATABASE IF NOT EXISTS foo066; | ||
816 | 67 | CREATE DATABASE IF NOT EXISTS foo067; | ||
817 | 68 | CREATE DATABASE IF NOT EXISTS foo068; | ||
818 | 69 | CREATE DATABASE IF NOT EXISTS foo069; | ||
819 | 70 | CREATE DATABASE IF NOT EXISTS foo070; | ||
820 | 71 | CREATE DATABASE IF NOT EXISTS foo071; | ||
821 | 72 | CREATE DATABASE IF NOT EXISTS foo072; | ||
822 | 73 | CREATE DATABASE IF NOT EXISTS foo073; | ||
823 | 74 | CREATE DATABASE IF NOT EXISTS foo074; | ||
824 | 75 | CREATE DATABASE IF NOT EXISTS foo075; | ||
825 | 76 | CREATE DATABASE IF NOT EXISTS foo076; | ||
826 | 77 | CREATE DATABASE IF NOT EXISTS foo077; | ||
827 | 78 | CREATE DATABASE IF NOT EXISTS foo078; | ||
828 | 79 | CREATE DATABASE IF NOT EXISTS foo079; | ||
829 | 80 | CREATE DATABASE IF NOT EXISTS foo080; | ||
830 | 81 | CREATE DATABASE IF NOT EXISTS foo081; | ||
831 | 82 | CREATE DATABASE IF NOT EXISTS foo082; | ||
832 | 83 | CREATE DATABASE IF NOT EXISTS foo083; | ||
833 | 84 | CREATE DATABASE IF NOT EXISTS foo084; | ||
834 | 85 | CREATE DATABASE IF NOT EXISTS foo085; | ||
835 | 86 | CREATE DATABASE IF NOT EXISTS foo086; | ||
836 | 87 | CREATE DATABASE IF NOT EXISTS foo087; | ||
837 | 88 | CREATE DATABASE IF NOT EXISTS foo088; | ||
838 | 89 | CREATE DATABASE IF NOT EXISTS foo089; | ||
839 | 90 | CREATE DATABASE IF NOT EXISTS foo090; | ||
840 | 91 | CREATE DATABASE IF NOT EXISTS foo091; | ||
841 | 92 | CREATE DATABASE IF NOT EXISTS foo092; | ||
842 | 93 | CREATE DATABASE IF NOT EXISTS foo093; | ||
843 | 94 | CREATE DATABASE IF NOT EXISTS foo094; | ||
844 | 95 | CREATE DATABASE IF NOT EXISTS foo095; | ||
845 | 96 | CREATE DATABASE IF NOT EXISTS foo096; | ||
846 | 97 | CREATE DATABASE IF NOT EXISTS foo097; | ||
847 | 98 | CREATE DATABASE IF NOT EXISTS foo098; | ||
848 | 99 | CREATE DATABASE IF NOT EXISTS foo099; | ||
849 | 100 | CREATE DATABASE IF NOT EXISTS foo100; | ||
850 | 101 | CREATE TABLE IF NOT EXISTS foo001.bar001 ( | ||
851 | 102 | `id` int unsigned NOT NULL AUTO_INCREMENT, | ||
852 | 103 | `value` varchar(255) NOT NULL, | ||
853 | 104 | PRIMARY KEY (`id`) | ||
854 | 105 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |