Merge lp:~percona-toolkit-dev/percona-toolkit/fix-deep-recursion-bug-1136559-2.1 into lp:percona-toolkit/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
Reviewer Review Type Date Requested Status
Daniel Nichter Approve
Review via email: mp+171436@code.launchpad.net
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
=== modified file 'bin/pt-duplicate-key-checker'
--- bin/pt-duplicate-key-checker 2013-02-11 17:31:15 +0000
+++ bin/pt-duplicate-key-checker 2013-06-25 23:43:28 +0000
@@ -3142,58 +3142,63 @@
3142 $self->{dbs} = \@dbs;3142 $self->{dbs} = \@dbs;
3143 }3143 }
31443144
3145 if ( !$self->{db} ) {3145 DATABASE:
3146 $self->{db} = shift @{$self->{dbs}};3146 while ( $self->{db} || defined(my $db = shift @{$self->{dbs}}) ) {
3147 PTDEBUG && _d('Next database:', $self->{db});3147 if ( !$self->{db} ) {
3148 return unless $self->{db};3148 PTDEBUG && _d('Next database:', $db);
3149 }3149 $self->{db} = $db;
31503150 }
3151 if ( !defined $self->{tbls} ) {3151
3152 my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db});3152 if ( !$self->{tbls} ) {
3153 PTDEBUG && _d($sql);3153 my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db});
3154 my @tbls = map {3154 PTDEBUG && _d($sql);
3155 $_->[0]; # (tbl, type)3155 my @tbls = map {
3156 }3156 $_->[0]; # (tbl, type)
3157 grep {3157 }
3158 my ($tbl, $type) = @$_;3158 grep {
3159 (!$type || ($type ne 'VIEW'))3159 my ($tbl, $type) = @$_;
3160 && $self->_resume_from_table($tbl)3160 (!$type || ($type ne 'VIEW'))
3161 && $self->table_is_allowed($self->{db}, $tbl);3161 && $self->_resume_from_table($tbl)
3162 }3162 && $self->table_is_allowed($self->{db}, $tbl);
3163 @{$dbh->selectall_arrayref($sql)};3163 }
3164 PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db});3164 @{$dbh->selectall_arrayref($sql)};
3165 $self->{tbls} = \@tbls;3165 PTDEBUG && _d('Found', scalar @tbls, 'tables in database',$self->{db});
3166 }3166 $self->{tbls} = \@tbls;
31673167 }
3168 while ( my $tbl = shift @{$self->{tbls}} ) {3168
3169 my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) };3169 TABLE:
3170 if ( my $e = $EVAL_ERROR ) {3170 while ( my $tbl = shift @{$self->{tbls}} ) {
3171 my $table_name = "$self->{db}.$tbl";3171 my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) };
3172 if ( $e =~ /\QTable '$table_name' doesn't exist/ ) {3172 if ( my $e = $EVAL_ERROR ) {
3173 PTDEBUG && _d("Skipping $table_name because it no longer exists");3173 my $table_name = "$self->{db}.$tbl";
3174 }3174 if ( $e =~ /\QTable '$table_name' doesn't exist/ ) {
3175 else {3175 PTDEBUG && _d("$table_name no longer exists");
3176 warn "Skipping $table_name because SHOW CREATE TABLE failed: $e";3176 }
3177 }3177 else {
3178 next;3178 warn "Skipping $table_name because SHOW CREATE TABLE failed: $e";
3179 }3179 }
3180 my $tbl_struct = $tp->parse($ddl);3180 next TABLE;
3181 if ( $self->engine_is_allowed($tbl_struct->{engine}) ) {3181 }
3182 return {3182
3183 db => $self->{db},3183 my $tbl_struct = $tp->parse($ddl);
3184 tbl => $tbl,3184 if ( $self->engine_is_allowed($tbl_struct->{engine}) ) {
3185 name => $q->quote($self->{db}, $tbl),3185 return {
3186 ddl => $ddl,3186 db => $self->{db},
3187 tbl_struct => $tbl_struct,3187 tbl => $tbl,
3188 };3188 name => $q->quote($self->{db}, $tbl),
3189 }3189 ddl => $ddl,
3190 }3190 tbl_struct => $tbl_struct,
31913191 };
3192 PTDEBUG && _d('No more tables in database', $self->{db});3192 }
3193 $self->{db} = undef;3193 }
3194 $self->{tbls} = undef;3194
31953195 PTDEBUG && _d('No more tables in database', $self->{db});
3196 return $self->_iterate_dbh();3196 $self->{db} = undef;
3197 $self->{tbls} = undef;
3198 } # DATABASE
3199
3200 PTDEBUG && _d('No more databases');
3201 return;
3197}3202}
31983203
3199sub database_is_allowed {3204sub database_is_allowed {
32003205
=== modified file 'bin/pt-index-usage'
--- bin/pt-index-usage 2013-02-11 17:31:15 +0000
+++ bin/pt-index-usage 2013-06-25 23:43:28 +0000
@@ -3974,58 +3974,63 @@
3974 $self->{dbs} = \@dbs;3974 $self->{dbs} = \@dbs;
3975 }3975 }
39763976
3977 if ( !$self->{db} ) {3977 DATABASE:
3978 $self->{db} = shift @{$self->{dbs}};3978 while ( $self->{db} || defined(my $db = shift @{$self->{dbs}}) ) {
3979 PTDEBUG && _d('Next database:', $self->{db});3979 if ( !$self->{db} ) {
3980 return unless $self->{db};3980 PTDEBUG && _d('Next database:', $db);
3981 }3981 $self->{db} = $db;
39823982 }
3983 if ( !defined $self->{tbls} ) {3983
3984 my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db});3984 if ( !$self->{tbls} ) {
3985 PTDEBUG && _d($sql);3985 my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db});
3986 my @tbls = map {3986 PTDEBUG && _d($sql);
3987 $_->[0]; # (tbl, type)3987 my @tbls = map {
3988 }3988 $_->[0]; # (tbl, type)
3989 grep {3989 }
3990 my ($tbl, $type) = @$_;3990 grep {
3991 (!$type || ($type ne 'VIEW'))3991 my ($tbl, $type) = @$_;
3992 && $self->_resume_from_table($tbl)3992 (!$type || ($type ne 'VIEW'))
3993 && $self->table_is_allowed($self->{db}, $tbl);3993 && $self->_resume_from_table($tbl)
3994 }3994 && $self->table_is_allowed($self->{db}, $tbl);
3995 @{$dbh->selectall_arrayref($sql)};3995 }
3996 PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db});3996 @{$dbh->selectall_arrayref($sql)};
3997 $self->{tbls} = \@tbls;3997 PTDEBUG && _d('Found', scalar @tbls, 'tables in database',$self->{db});
3998 }3998 $self->{tbls} = \@tbls;
39993999 }
4000 while ( my $tbl = shift @{$self->{tbls}} ) {4000
4001 my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) };4001 TABLE:
4002 if ( my $e = $EVAL_ERROR ) {4002 while ( my $tbl = shift @{$self->{tbls}} ) {
4003 my $table_name = "$self->{db}.$tbl";4003 my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) };
4004 if ( $e =~ /\QTable '$table_name' doesn't exist/ ) {4004 if ( my $e = $EVAL_ERROR ) {
4005 PTDEBUG && _d("Skipping $table_name because it no longer exists");4005 my $table_name = "$self->{db}.$tbl";
4006 }4006 if ( $e =~ /\QTable '$table_name' doesn't exist/ ) {
4007 else {4007 PTDEBUG && _d("$table_name no longer exists");
4008 warn "Skipping $table_name because SHOW CREATE TABLE failed: $e";4008 }
4009 }4009 else {
4010 next;4010 warn "Skipping $table_name because SHOW CREATE TABLE failed: $e";
4011 }4011 }
4012 my $tbl_struct = $tp->parse($ddl);4012 next TABLE;
4013 if ( $self->engine_is_allowed($tbl_struct->{engine}) ) {4013 }
4014 return {4014
4015 db => $self->{db},4015 my $tbl_struct = $tp->parse($ddl);
4016 tbl => $tbl,4016 if ( $self->engine_is_allowed($tbl_struct->{engine}) ) {
4017 name => $q->quote($self->{db}, $tbl),4017 return {
4018 ddl => $ddl,4018 db => $self->{db},
4019 tbl_struct => $tbl_struct,4019 tbl => $tbl,
4020 };4020 name => $q->quote($self->{db}, $tbl),
4021 }4021 ddl => $ddl,
4022 }4022 tbl_struct => $tbl_struct,
40234023 };
4024 PTDEBUG && _d('No more tables in database', $self->{db});4024 }
4025 $self->{db} = undef;4025 }
4026 $self->{tbls} = undef;4026
40274027 PTDEBUG && _d('No more tables in database', $self->{db});
4028 return $self->_iterate_dbh();4028 $self->{db} = undef;
4029 $self->{tbls} = undef;
4030 } # DATABASE
4031
4032 PTDEBUG && _d('No more databases');
4033 return;
4029}4034}
40304035
4031sub database_is_allowed {4036sub database_is_allowed {
40324037
=== modified file 'bin/pt-table-checksum'
--- bin/pt-table-checksum 2013-04-04 21:44:42 +0000
+++ bin/pt-table-checksum 2013-06-25 23:43:28 +0000
@@ -6883,58 +6883,63 @@
6883 $self->{dbs} = \@dbs;6883 $self->{dbs} = \@dbs;
6884 }6884 }
68856885
6886 if ( !$self->{db} ) {6886 DATABASE:
6887 $self->{db} = shift @{$self->{dbs}};6887 while ( $self->{db} || defined(my $db = shift @{$self->{dbs}}) ) {
6888 PTDEBUG && _d('Next database:', $self->{db});6888 if ( !$self->{db} ) {
6889 return unless $self->{db};6889 PTDEBUG && _d('Next database:', $db);
6890 }6890 $self->{db} = $db;
68916891 }
6892 if ( !defined $self->{tbls} ) {6892
6893 my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db});6893 if ( !$self->{tbls} ) {
6894 PTDEBUG && _d($sql);6894 my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db});
6895 my @tbls = map {6895 PTDEBUG && _d($sql);
6896 $_->[0]; # (tbl, type)6896 my @tbls = map {
6897 }6897 $_->[0]; # (tbl, type)
6898 grep {6898 }
6899 my ($tbl, $type) = @$_;6899 grep {
6900 (!$type || ($type ne 'VIEW'))6900 my ($tbl, $type) = @$_;
6901 && $self->_resume_from_table($tbl)6901 (!$type || ($type ne 'VIEW'))
6902 && $self->table_is_allowed($self->{db}, $tbl);6902 && $self->_resume_from_table($tbl)
6903 }6903 && $self->table_is_allowed($self->{db}, $tbl);
6904 @{$dbh->selectall_arrayref($sql)};6904 }
6905 PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db});6905 @{$dbh->selectall_arrayref($sql)};
6906 $self->{tbls} = \@tbls;6906 PTDEBUG && _d('Found', scalar @tbls, 'tables in database',$self->{db});
6907 }6907 $self->{tbls} = \@tbls;
69086908 }
6909 while ( my $tbl = shift @{$self->{tbls}} ) {6909
6910 my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) };6910 TABLE:
6911 if ( my $e = $EVAL_ERROR ) {6911 while ( my $tbl = shift @{$self->{tbls}} ) {
6912 my $table_name = "$self->{db}.$tbl";6912 my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) };
6913 if ( $e =~ /\QTable '$table_name' doesn't exist/ ) {6913 if ( my $e = $EVAL_ERROR ) {
6914 PTDEBUG && _d("Skipping $table_name because it no longer exists");6914 my $table_name = "$self->{db}.$tbl";
6915 }6915 if ( $e =~ /\QTable '$table_name' doesn't exist/ ) {
6916 else {6916 PTDEBUG && _d("$table_name no longer exists");
6917 warn "Skipping $table_name because SHOW CREATE TABLE failed: $e";6917 }
6918 }6918 else {
6919 next;6919 warn "Skipping $table_name because SHOW CREATE TABLE failed: $e";
6920 }6920 }
6921 my $tbl_struct = $tp->parse($ddl);6921 next TABLE;
6922 if ( $self->engine_is_allowed($tbl_struct->{engine}) ) {6922 }
6923 return {6923
6924 db => $self->{db},6924 my $tbl_struct = $tp->parse($ddl);
6925 tbl => $tbl,6925 if ( $self->engine_is_allowed($tbl_struct->{engine}) ) {
6926 name => $q->quote($self->{db}, $tbl),6926 return {
6927 ddl => $ddl,6927 db => $self->{db},
6928 tbl_struct => $tbl_struct,6928 tbl => $tbl,
6929 };6929 name => $q->quote($self->{db}, $tbl),
6930 }6930 ddl => $ddl,
6931 }6931 tbl_struct => $tbl_struct,
69326932 };
6933 PTDEBUG && _d('No more tables in database', $self->{db});6933 }
6934 $self->{db} = undef;6934 }
6935 $self->{tbls} = undef;6935
69366936 PTDEBUG && _d('No more tables in database', $self->{db});
6937 return $self->_iterate_dbh();6937 $self->{db} = undef;
6938 $self->{tbls} = undef;
6939 } # DATABASE
6940
6941 PTDEBUG && _d('No more databases');
6942 return;
6938}6943}
69396944
6940sub database_is_allowed {6945sub database_is_allowed {
69416946
=== modified file 'bin/pt-table-sync'
--- bin/pt-table-sync 2013-02-11 17:31:15 +0000
+++ bin/pt-table-sync 2013-06-25 23:43:28 +0000
@@ -7637,58 +7637,63 @@
7637 $self->{dbs} = \@dbs;7637 $self->{dbs} = \@dbs;
7638 }7638 }
76397639
7640 if ( !$self->{db} ) {7640 DATABASE:
7641 $self->{db} = shift @{$self->{dbs}};7641 while ( $self->{db} || defined(my $db = shift @{$self->{dbs}}) ) {
7642 PTDEBUG && _d('Next database:', $self->{db});7642 if ( !$self->{db} ) {
7643 return unless $self->{db};7643 PTDEBUG && _d('Next database:', $db);
7644 }7644 $self->{db} = $db;
76457645 }
7646 if ( !defined $self->{tbls} ) {7646
7647 my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db});7647 if ( !$self->{tbls} ) {
7648 PTDEBUG && _d($sql);7648 my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db});
7649 my @tbls = map {7649 PTDEBUG && _d($sql);
7650 $_->[0]; # (tbl, type)7650 my @tbls = map {
7651 }7651 $_->[0]; # (tbl, type)
7652 grep {7652 }
7653 my ($tbl, $type) = @$_;7653 grep {
7654 (!$type || ($type ne 'VIEW'))7654 my ($tbl, $type) = @$_;
7655 && $self->_resume_from_table($tbl)7655 (!$type || ($type ne 'VIEW'))
7656 && $self->table_is_allowed($self->{db}, $tbl);7656 && $self->_resume_from_table($tbl)
7657 }7657 && $self->table_is_allowed($self->{db}, $tbl);
7658 @{$dbh->selectall_arrayref($sql)};7658 }
7659 PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db});7659 @{$dbh->selectall_arrayref($sql)};
7660 $self->{tbls} = \@tbls;7660 PTDEBUG && _d('Found', scalar @tbls, 'tables in database',$self->{db});
7661 }7661 $self->{tbls} = \@tbls;
76627662 }
7663 while ( my $tbl = shift @{$self->{tbls}} ) {7663
7664 my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) };7664 TABLE:
7665 if ( my $e = $EVAL_ERROR ) {7665 while ( my $tbl = shift @{$self->{tbls}} ) {
7666 my $table_name = "$self->{db}.$tbl";7666 my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) };
7667 if ( $e =~ /\QTable '$table_name' doesn't exist/ ) {7667 if ( my $e = $EVAL_ERROR ) {
7668 PTDEBUG && _d("Skipping $table_name because it no longer exists");7668 my $table_name = "$self->{db}.$tbl";
7669 }7669 if ( $e =~ /\QTable '$table_name' doesn't exist/ ) {
7670 else {7670 PTDEBUG && _d("$table_name no longer exists");
7671 warn "Skipping $table_name because SHOW CREATE TABLE failed: $e";7671 }
7672 }7672 else {
7673 next;7673 warn "Skipping $table_name because SHOW CREATE TABLE failed: $e";
7674 }7674 }
7675 my $tbl_struct = $tp->parse($ddl);7675 next TABLE;
7676 if ( $self->engine_is_allowed($tbl_struct->{engine}) ) {7676 }
7677 return {7677
7678 db => $self->{db},7678 my $tbl_struct = $tp->parse($ddl);
7679 tbl => $tbl,7679 if ( $self->engine_is_allowed($tbl_struct->{engine}) ) {
7680 name => $q->quote($self->{db}, $tbl),7680 return {
7681 ddl => $ddl,7681 db => $self->{db},
7682 tbl_struct => $tbl_struct,7682 tbl => $tbl,
7683 };7683 name => $q->quote($self->{db}, $tbl),
7684 }7684 ddl => $ddl,
7685 }7685 tbl_struct => $tbl_struct,
76867686 };
7687 PTDEBUG && _d('No more tables in database', $self->{db});7687 }
7688 $self->{db} = undef;7688 }
7689 $self->{tbls} = undef;7689
76907690 PTDEBUG && _d('No more tables in database', $self->{db});
7691 return $self->_iterate_dbh();7691 $self->{db} = undef;
7692 $self->{tbls} = undef;
7693 } # DATABASE
7694
7695 PTDEBUG && _d('No more databases');
7696 return;
7692}7697}
76937698
7694sub database_is_allowed {7699sub database_is_allowed {
76957700
=== modified file 'lib/SchemaIterator.pm'
--- lib/SchemaIterator.pm 2013-01-03 00:19:16 +0000
+++ lib/SchemaIterator.pm 2013-06-25 23:43:28 +0000
@@ -334,64 +334,67 @@
334 $self->{dbs} = \@dbs;334 $self->{dbs} = \@dbs;
335 }335 }
336336
337 if ( !$self->{db} ) {337 DATABASE:
338 $self->{db} = shift @{$self->{dbs}};338 while ( $self->{db} || defined(my $db = shift @{$self->{dbs}}) ) {
339 PTDEBUG && _d('Next database:', $self->{db});339 if ( !$self->{db} ) {
340 return unless $self->{db};340 PTDEBUG && _d('Next database:', $db);
341 }341 $self->{db} = $db;
342342 }
343 if ( !defined $self->{tbls} ) {343
344 my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db});344 if ( !$self->{tbls} ) {
345 PTDEBUG && _d($sql);345 my $sql = 'SHOW /*!50002 FULL*/ TABLES FROM ' . $q->quote($self->{db});
346 my @tbls = map {346 PTDEBUG && _d($sql);
347 $_->[0]; # (tbl, type)347 my @tbls = map {
348 }348 $_->[0]; # (tbl, type)
349 grep {349 }
350 my ($tbl, $type) = @$_;350 grep {
351 (!$type || ($type ne 'VIEW'))351 my ($tbl, $type) = @$_;
352 && $self->_resume_from_table($tbl)352 (!$type || ($type ne 'VIEW'))
353 && $self->table_is_allowed($self->{db}, $tbl);353 && $self->_resume_from_table($tbl)
354 }354 && $self->table_is_allowed($self->{db}, $tbl);
355 @{$dbh->selectall_arrayref($sql)};355 }
356 PTDEBUG && _d('Found', scalar @tbls, 'tables in database', $self->{db});356 @{$dbh->selectall_arrayref($sql)};
357 $self->{tbls} = \@tbls;357 PTDEBUG && _d('Found', scalar @tbls, 'tables in database',$self->{db});
358 }358 $self->{tbls} = \@tbls;
359359 }
360 while ( my $tbl = shift @{$self->{tbls}} ) {360
361 my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) };361 TABLE:
362 if ( my $e = $EVAL_ERROR ) {362 while ( my $tbl = shift @{$self->{tbls}} ) {
363 my $table_name = "$self->{db}.$tbl";363 my $ddl = eval { $tp->get_create_table($dbh, $self->{db}, $tbl) };
364 # SHOW CREATE TABLE failed. This is a bit puzzling;364 if ( my $e = $EVAL_ERROR ) {
365 # maybe the table got dropped, or crashed. Not much we can365 my $table_name = "$self->{db}.$tbl";
366 # do about it; If the table is missing, just PTDEBUG it, but366 # SHOW CREATE TABLE failed. This is a bit puzzling;
367 # otherwise, warn with the error.367 # maybe the table got dropped, or crashed. Not much we can
368 if ( $e =~ /\QTable '$table_name' doesn't exist/ ) {368 # do about it; If the table is missing, just PTDEBUG it, but
369 PTDEBUG && _d("Skipping $table_name because it no longer exists");369 # otherwise, warn with the error.
370 }370 if ( $e =~ /\QTable '$table_name' doesn't exist/ ) {
371 else {371 PTDEBUG && _d("$table_name no longer exists");
372 warn "Skipping $table_name because SHOW CREATE TABLE failed: $e";372 }
373 }373 else {
374 next;374 warn "Skipping $table_name because SHOW CREATE TABLE failed: $e";
375 }375 }
376 my $tbl_struct = $tp->parse($ddl);376 next TABLE;
377 if ( $self->engine_is_allowed($tbl_struct->{engine}) ) {377 }
378 return {378
379 db => $self->{db},379 my $tbl_struct = $tp->parse($ddl);
380 tbl => $tbl,380 if ( $self->engine_is_allowed($tbl_struct->{engine}) ) {
381 name => $q->quote($self->{db}, $tbl),381 return {
382 ddl => $ddl,382 db => $self->{db},
383 tbl_struct => $tbl_struct,383 tbl => $tbl,
384 };384 name => $q->quote($self->{db}, $tbl),
385 }385 ddl => $ddl,
386 }386 tbl_struct => $tbl_struct,
387387 };
388 PTDEBUG && _d('No more tables in database', $self->{db});388 }
389 $self->{db} = undef;389 }
390 $self->{tbls} = undef;390
391391 PTDEBUG && _d('No more tables in database', $self->{db});
392 # Recurse to get the next database. If there's no next db, then the392 $self->{db} = undef;
393 # call will return undef and we'll return undef, too.393 $self->{tbls} = undef;
394 return $self->_iterate_dbh();394 } # DATABASE
395
396 PTDEBUG && _d('No more databases');
397 return;
395}398}
396399
397sub database_is_allowed {400sub database_is_allowed {
398401
=== modified file 't/lib/SchemaIterator.t'
--- t/lib/SchemaIterator.t 2012-12-07 18:52:33 +0000
+++ t/lib/SchemaIterator.t 2013-06-25 23:43:28 +0000
@@ -548,9 +548,23 @@
548diag(`$trunk/sandbox/stop-sandbox $master3_port >/dev/null`);548diag(`$trunk/sandbox/stop-sandbox $master3_port >/dev/null`);
549549
550# #############################################################################550# #############################################################################
551# Bug 1136559: Deep recursion on subroutine "SchemaIterator::_iterate_dbh"
552# #############################################################################
553
554$sb->wipe_clean($dbh);
555diag(`/tmp/12345/use < $trunk/t/lib/samples/100-dbs.sql`);
556
557test_so(
558 filters => [],
559 result => "foo001.bar001 ",
560 lives_ok => 1,
561 test_name => "Bug 1136559: Deep recursion on subroutine SchemaIterator::_iterate_dbh",
562);
563
564diag(`/tmp/12345/use < $trunk/t/lib/samples/100-dbs-drop.sql`);
565
566# #############################################################################
551# Done.567# Done.
552# #############################################################################568# #############################################################################
553ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");569ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
554
555done_testing;570done_testing;
556exit;
557571
=== added file 't/lib/samples/100-dbs-drop.sql'
--- t/lib/samples/100-dbs-drop.sql 1970-01-01 00:00:00 +0000
+++ t/lib/samples/100-dbs-drop.sql 2013-06-25 23:43:28 +0000
@@ -0,0 +1,100 @@
1DROP DATABASE IF EXISTS foo001;
2DROP DATABASE IF EXISTS foo002;
3DROP DATABASE IF EXISTS foo003;
4DROP DATABASE IF EXISTS foo004;
5DROP DATABASE IF EXISTS foo005;
6DROP DATABASE IF EXISTS foo006;
7DROP DATABASE IF EXISTS foo007;
8DROP DATABASE IF EXISTS foo008;
9DROP DATABASE IF EXISTS foo009;
10DROP DATABASE IF EXISTS foo010;
11DROP DATABASE IF EXISTS foo011;
12DROP DATABASE IF EXISTS foo012;
13DROP DATABASE IF EXISTS foo013;
14DROP DATABASE IF EXISTS foo014;
15DROP DATABASE IF EXISTS foo015;
16DROP DATABASE IF EXISTS foo016;
17DROP DATABASE IF EXISTS foo017;
18DROP DATABASE IF EXISTS foo018;
19DROP DATABASE IF EXISTS foo019;
20DROP DATABASE IF EXISTS foo020;
21DROP DATABASE IF EXISTS foo021;
22DROP DATABASE IF EXISTS foo022;
23DROP DATABASE IF EXISTS foo023;
24DROP DATABASE IF EXISTS foo024;
25DROP DATABASE IF EXISTS foo025;
26DROP DATABASE IF EXISTS foo026;
27DROP DATABASE IF EXISTS foo027;
28DROP DATABASE IF EXISTS foo028;
29DROP DATABASE IF EXISTS foo029;
30DROP DATABASE IF EXISTS foo030;
31DROP DATABASE IF EXISTS foo031;
32DROP DATABASE IF EXISTS foo032;
33DROP DATABASE IF EXISTS foo033;
34DROP DATABASE IF EXISTS foo034;
35DROP DATABASE IF EXISTS foo035;
36DROP DATABASE IF EXISTS foo036;
37DROP DATABASE IF EXISTS foo037;
38DROP DATABASE IF EXISTS foo038;
39DROP DATABASE IF EXISTS foo039;
40DROP DATABASE IF EXISTS foo040;
41DROP DATABASE IF EXISTS foo041;
42DROP DATABASE IF EXISTS foo042;
43DROP DATABASE IF EXISTS foo043;
44DROP DATABASE IF EXISTS foo044;
45DROP DATABASE IF EXISTS foo045;
46DROP DATABASE IF EXISTS foo046;
47DROP DATABASE IF EXISTS foo047;
48DROP DATABASE IF EXISTS foo048;
49DROP DATABASE IF EXISTS foo049;
50DROP DATABASE IF EXISTS foo050;
51DROP DATABASE IF EXISTS foo051;
52DROP DATABASE IF EXISTS foo052;
53DROP DATABASE IF EXISTS foo053;
54DROP DATABASE IF EXISTS foo054;
55DROP DATABASE IF EXISTS foo055;
56DROP DATABASE IF EXISTS foo056;
57DROP DATABASE IF EXISTS foo057;
58DROP DATABASE IF EXISTS foo058;
59DROP DATABASE IF EXISTS foo059;
60DROP DATABASE IF EXISTS foo060;
61DROP DATABASE IF EXISTS foo061;
62DROP DATABASE IF EXISTS foo062;
63DROP DATABASE IF EXISTS foo063;
64DROP DATABASE IF EXISTS foo064;
65DROP DATABASE IF EXISTS foo065;
66DROP DATABASE IF EXISTS foo066;
67DROP DATABASE IF EXISTS foo067;
68DROP DATABASE IF EXISTS foo068;
69DROP DATABASE IF EXISTS foo069;
70DROP DATABASE IF EXISTS foo070;
71DROP DATABASE IF EXISTS foo071;
72DROP DATABASE IF EXISTS foo072;
73DROP DATABASE IF EXISTS foo073;
74DROP DATABASE IF EXISTS foo074;
75DROP DATABASE IF EXISTS foo075;
76DROP DATABASE IF EXISTS foo076;
77DROP DATABASE IF EXISTS foo077;
78DROP DATABASE IF EXISTS foo078;
79DROP DATABASE IF EXISTS foo079;
80DROP DATABASE IF EXISTS foo080;
81DROP DATABASE IF EXISTS foo081;
82DROP DATABASE IF EXISTS foo082;
83DROP DATABASE IF EXISTS foo083;
84DROP DATABASE IF EXISTS foo084;
85DROP DATABASE IF EXISTS foo085;
86DROP DATABASE IF EXISTS foo086;
87DROP DATABASE IF EXISTS foo087;
88DROP DATABASE IF EXISTS foo088;
89DROP DATABASE IF EXISTS foo089;
90DROP DATABASE IF EXISTS foo090;
91DROP DATABASE IF EXISTS foo091;
92DROP DATABASE IF EXISTS foo092;
93DROP DATABASE IF EXISTS foo093;
94DROP DATABASE IF EXISTS foo094;
95DROP DATABASE IF EXISTS foo095;
96DROP DATABASE IF EXISTS foo096;
97DROP DATABASE IF EXISTS foo097;
98DROP DATABASE IF EXISTS foo098;
99DROP DATABASE IF EXISTS foo099;
100DROP DATABASE IF EXISTS foo100;
0101
=== added file 't/lib/samples/100-dbs.sql'
--- t/lib/samples/100-dbs.sql 1970-01-01 00:00:00 +0000
+++ t/lib/samples/100-dbs.sql 2013-06-25 23:43:28 +0000
@@ -0,0 +1,105 @@
1CREATE DATABASE IF NOT EXISTS foo001;
2CREATE DATABASE IF NOT EXISTS foo002;
3CREATE DATABASE IF NOT EXISTS foo003;
4CREATE DATABASE IF NOT EXISTS foo004;
5CREATE DATABASE IF NOT EXISTS foo005;
6CREATE DATABASE IF NOT EXISTS foo006;
7CREATE DATABASE IF NOT EXISTS foo007;
8CREATE DATABASE IF NOT EXISTS foo008;
9CREATE DATABASE IF NOT EXISTS foo009;
10CREATE DATABASE IF NOT EXISTS foo010;
11CREATE DATABASE IF NOT EXISTS foo011;
12CREATE DATABASE IF NOT EXISTS foo012;
13CREATE DATABASE IF NOT EXISTS foo013;
14CREATE DATABASE IF NOT EXISTS foo014;
15CREATE DATABASE IF NOT EXISTS foo015;
16CREATE DATABASE IF NOT EXISTS foo016;
17CREATE DATABASE IF NOT EXISTS foo017;
18CREATE DATABASE IF NOT EXISTS foo018;
19CREATE DATABASE IF NOT EXISTS foo019;
20CREATE DATABASE IF NOT EXISTS foo020;
21CREATE DATABASE IF NOT EXISTS foo021;
22CREATE DATABASE IF NOT EXISTS foo022;
23CREATE DATABASE IF NOT EXISTS foo023;
24CREATE DATABASE IF NOT EXISTS foo024;
25CREATE DATABASE IF NOT EXISTS foo025;
26CREATE DATABASE IF NOT EXISTS foo026;
27CREATE DATABASE IF NOT EXISTS foo027;
28CREATE DATABASE IF NOT EXISTS foo028;
29CREATE DATABASE IF NOT EXISTS foo029;
30CREATE DATABASE IF NOT EXISTS foo030;
31CREATE DATABASE IF NOT EXISTS foo031;
32CREATE DATABASE IF NOT EXISTS foo032;
33CREATE DATABASE IF NOT EXISTS foo033;
34CREATE DATABASE IF NOT EXISTS foo034;
35CREATE DATABASE IF NOT EXISTS foo035;
36CREATE DATABASE IF NOT EXISTS foo036;
37CREATE DATABASE IF NOT EXISTS foo037;
38CREATE DATABASE IF NOT EXISTS foo038;
39CREATE DATABASE IF NOT EXISTS foo039;
40CREATE DATABASE IF NOT EXISTS foo040;
41CREATE DATABASE IF NOT EXISTS foo041;
42CREATE DATABASE IF NOT EXISTS foo042;
43CREATE DATABASE IF NOT EXISTS foo043;
44CREATE DATABASE IF NOT EXISTS foo044;
45CREATE DATABASE IF NOT EXISTS foo045;
46CREATE DATABASE IF NOT EXISTS foo046;
47CREATE DATABASE IF NOT EXISTS foo047;
48CREATE DATABASE IF NOT EXISTS foo048;
49CREATE DATABASE IF NOT EXISTS foo049;
50CREATE DATABASE IF NOT EXISTS foo050;
51CREATE DATABASE IF NOT EXISTS foo051;
52CREATE DATABASE IF NOT EXISTS foo052;
53CREATE DATABASE IF NOT EXISTS foo053;
54CREATE DATABASE IF NOT EXISTS foo054;
55CREATE DATABASE IF NOT EXISTS foo055;
56CREATE DATABASE IF NOT EXISTS foo056;
57CREATE DATABASE IF NOT EXISTS foo057;
58CREATE DATABASE IF NOT EXISTS foo058;
59CREATE DATABASE IF NOT EXISTS foo059;
60CREATE DATABASE IF NOT EXISTS foo060;
61CREATE DATABASE IF NOT EXISTS foo061;
62CREATE DATABASE IF NOT EXISTS foo062;
63CREATE DATABASE IF NOT EXISTS foo063;
64CREATE DATABASE IF NOT EXISTS foo064;
65CREATE DATABASE IF NOT EXISTS foo065;
66CREATE DATABASE IF NOT EXISTS foo066;
67CREATE DATABASE IF NOT EXISTS foo067;
68CREATE DATABASE IF NOT EXISTS foo068;
69CREATE DATABASE IF NOT EXISTS foo069;
70CREATE DATABASE IF NOT EXISTS foo070;
71CREATE DATABASE IF NOT EXISTS foo071;
72CREATE DATABASE IF NOT EXISTS foo072;
73CREATE DATABASE IF NOT EXISTS foo073;
74CREATE DATABASE IF NOT EXISTS foo074;
75CREATE DATABASE IF NOT EXISTS foo075;
76CREATE DATABASE IF NOT EXISTS foo076;
77CREATE DATABASE IF NOT EXISTS foo077;
78CREATE DATABASE IF NOT EXISTS foo078;
79CREATE DATABASE IF NOT EXISTS foo079;
80CREATE DATABASE IF NOT EXISTS foo080;
81CREATE DATABASE IF NOT EXISTS foo081;
82CREATE DATABASE IF NOT EXISTS foo082;
83CREATE DATABASE IF NOT EXISTS foo083;
84CREATE DATABASE IF NOT EXISTS foo084;
85CREATE DATABASE IF NOT EXISTS foo085;
86CREATE DATABASE IF NOT EXISTS foo086;
87CREATE DATABASE IF NOT EXISTS foo087;
88CREATE DATABASE IF NOT EXISTS foo088;
89CREATE DATABASE IF NOT EXISTS foo089;
90CREATE DATABASE IF NOT EXISTS foo090;
91CREATE DATABASE IF NOT EXISTS foo091;
92CREATE DATABASE IF NOT EXISTS foo092;
93CREATE DATABASE IF NOT EXISTS foo093;
94CREATE DATABASE IF NOT EXISTS foo094;
95CREATE DATABASE IF NOT EXISTS foo095;
96CREATE DATABASE IF NOT EXISTS foo096;
97CREATE DATABASE IF NOT EXISTS foo097;
98CREATE DATABASE IF NOT EXISTS foo098;
99CREATE DATABASE IF NOT EXISTS foo099;
100CREATE DATABASE IF NOT EXISTS foo100;
101CREATE TABLE IF NOT EXISTS foo001.bar001 (
102 `id` int unsigned NOT NULL AUTO_INCREMENT,
103 `value` varchar(255) NOT NULL,
104 PRIMARY KEY (`id`)
105) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Subscribers

People subscribed via source and target branches