Fix basics.t so it doesn't break replication. Add IF EXISTS to DROP TABLE statements.

This commit is contained in:
Daniel Nichter
2012-02-21 12:34:21 -07:00
parent cb7a7946d8
commit 7c76b25179
2 changed files with 48 additions and 25 deletions

View File

@@ -4218,7 +4218,7 @@ sub main {
msg($sql); msg($sql);
$dbh->do($sql) unless $o->get('print'); $dbh->do($sql) unless $o->get('print');
$sql = "DROP TABLE `$db`.`$tbl`"; $sql = "DROP TABLE IF EXISTS `$db`.`$tbl`";
msg($sql); msg($sql);
$dbh->do($sql) unless $o->get('print'); $dbh->do($sql) unless $o->get('print');
@@ -4241,7 +4241,7 @@ sub main {
$capture_sync->cleanup(%plugin_args); $capture_sync->cleanup(%plugin_args);
if ( $o->get('rename-tables') && $o->get('drop-old-table') ) { if ( $o->get('rename-tables') && $o->get('drop-old-table') ) {
$sql = "DROP TABLE `$db`.`$old_tbl`"; $sql = "DROP TABLE IF EXISTS `$db`.`$old_tbl`";
msg($sql); msg($sql);
$dbh->do($sql) unless $o->get('print'); $dbh->do($sql) unless $o->get('print');
} }

View File

@@ -19,13 +19,17 @@ use Data::Dumper;
my $dp = new DSNParser(opts=>$dsn_opts); my $dp = new DSNParser(opts=>$dsn_opts);
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
my $dbh = $sb->get_dbh_for('master'); my $master_dbh = $sb->get_dbh_for('master');
my $slave_dbh = $sb->get_dbh_for('slave1');
if ( !$dbh ) { if ( !$master_dbh ) {
plan skip_all => 'Cannot connect to sandbox master'; plan skip_all => 'Cannot connect to sandbox master';
} }
elsif ( !$slave_dbh ) {
plan skip_all => 'Cannot connect to sandbox slave';
}
else { else {
plan tests => 22; plan tests => 24;
} }
my $output = ""; my $output = "";
@@ -35,7 +39,9 @@ my $exit = 0;
my $rows; my $rows;
$sb->load_file('master', "t/pt-online-schema-change/samples/small_table.sql"); $sb->load_file('master', "t/pt-online-schema-change/samples/small_table.sql");
$dbh->do('use mkosc'); PerconaTest::wait_for_table($slave_dbh, "mkosc.a", "c='r'");
$master_dbh->do('use mkosc');
$slave_dbh->do('use mkosc');
# ############################################################################# # #############################################################################
# --check-tables-and-exit # --check-tables-and-exit
@@ -86,7 +92,7 @@ output(
'D=mkosc,t=a', qw(--alter ENGINE=InnoDB)) }, 'D=mkosc,t=a', qw(--alter ENGINE=InnoDB)) },
); );
$rows = $dbh->selectall_hashref('show table status from mkosc', 'name'); $rows = $master_dbh->selectall_hashref('show table status from mkosc', 'name');
is( is(
$rows->{a}->{engine}, $rows->{a}->{engine},
'InnoDB', 'InnoDB',
@@ -99,8 +105,8 @@ is(
"Kept old table, ENGINE=MyISAM" "Kept old table, ENGINE=MyISAM"
); );
my $org_rows = $dbh->selectall_arrayref('select * from mkosc.__old_a order by i'); my $org_rows = $master_dbh->selectall_arrayref('select * from mkosc.__old_a order by i');
my $new_rows = $dbh->selectall_arrayref('select * from mkosc.a order by i'); my $new_rows = $master_dbh->selectall_arrayref('select * from mkosc.a order by i');
is_deeply( is_deeply(
$new_rows, $new_rows,
$org_rows, $org_rows,
@@ -113,10 +119,19 @@ is(
"Exit status 0" "Exit status 0"
); );
# Tool should set SQL_LOG_BIN=0 by default, so the table
# on the slave should not have changed.
$rows = $slave_dbh->selectall_hashref('show table status from mkosc', 'name');
is(
$rows->{a}->{engine},
'MyISAM',
"SQL_LOG_BIN=0 by default"
);
# ############################################################################# # #############################################################################
# No --alter and --drop-old-table. # No --alter and --drop-old-table.
# ############################################################################# # #############################################################################
$dbh->do('drop table mkosc.__old_a'); # from previous run $master_dbh->do('drop table if exists mkosc.__old_a'); # from prev run
$sb->load_file('master', "t/pt-online-schema-change/samples/small_table.sql"); $sb->load_file('master', "t/pt-online-schema-change/samples/small_table.sql");
output( output(
@@ -124,7 +139,7 @@ output(
'D=mkosc,t=a', qw(--drop-old-table)) }, 'D=mkosc,t=a', qw(--drop-old-table)) },
); );
$rows = $dbh->selectall_hashref('show table status from mkosc', 'name'); $rows = $master_dbh->selectall_hashref('show table status from mkosc', 'name');
is( is(
$rows->{a}->{engine}, $rows->{a}->{engine},
'MyISAM', 'MyISAM',
@@ -136,7 +151,7 @@ ok(
"--drop-old-table" "--drop-old-table"
); );
$new_rows = $dbh->selectall_arrayref('select * from mkosc.a order by i'); $new_rows = $master_dbh->selectall_arrayref('select * from mkosc.a order by i');
is_deeply( is_deeply(
$new_rows, $new_rows,
$org_rows, # from previous run since old table was dropped this run $org_rows, # from previous run since old table was dropped this run
@@ -149,6 +164,14 @@ is(
"Exit status 0" "Exit status 0"
); );
# Bug 933232: drop temp table replicates and break replication.
$rows = $slave_dbh->selectrow_hashref('show slave status');
is(
$rows->{last_error},
'',
"Dropping temp table doesn't break replication (bug 933232)"
);
# ############################################################################ # ############################################################################
# Alter a table with foreign keys. # Alter a table with foreign keys.
# ############################################################################ # ############################################################################
@@ -164,7 +187,7 @@ is(
$sb->load_file('master', "t/pt-online-schema-change/samples/fk_tables_schema.sql"); $sb->load_file('master', "t/pt-online-schema-change/samples/fk_tables_schema.sql");
# city has a fk constraint on country, so get its original table def. # city has a fk constraint on country, so get its original table def.
my $orig_table_def = $dbh->selectrow_hashref('show create table mkosc.city')->{'create table'}; my $orig_table_def = $master_dbh->selectrow_hashref('show create table mkosc.city')->{'create table'};
# Alter the parent table. The error we need to avoid is: # Alter the parent table. The error we need to avoid is:
# DBD::mysql::db do failed: Cannot delete or update a parent row: # DBD::mysql::db do failed: Cannot delete or update a parent row:
@@ -181,7 +204,7 @@ is(
"Exit status 0 (rebuild_constraints method)" "Exit status 0 (rebuild_constraints method)"
); );
$rows = $dbh->selectall_arrayref('show tables from mkosc like "\_\_%"'); $rows = $master_dbh->selectall_arrayref('show tables from mkosc like "\_\_%"');
is_deeply( is_deeply(
$rows, $rows,
[], [],
@@ -193,7 +216,7 @@ is_deeply(
# also updated city's fk constraint to __old_country. We should have # also updated city's fk constraint to __old_country. We should have
# dropped and re-added that constraint exactly, changing only __old_country # dropped and re-added that constraint exactly, changing only __old_country
# to country, like it originally was. # to country, like it originally was.
my $new_table_def = $dbh->selectrow_hashref('show create table mkosc.city')->{'create table'}; my $new_table_def = $master_dbh->selectrow_hashref('show create table mkosc.city')->{'create table'};
is( is(
$new_table_def, $new_table_def,
$orig_table_def, $orig_table_def,
@@ -205,7 +228,7 @@ is(
####################### #######################
$sb->load_file('master', "t/pt-online-schema-change/samples/fk_tables_schema.sql"); $sb->load_file('master', "t/pt-online-schema-change/samples/fk_tables_schema.sql");
$orig_table_def = $dbh->selectrow_hashref('show create table mkosc.city')->{'create table'}; $orig_table_def = $master_dbh->selectrow_hashref('show create table mkosc.city')->{'create table'};
output( output(
sub { $exit = pt_online_schema_change::main(@args, sub { $exit = pt_online_schema_change::main(@args,
@@ -218,14 +241,14 @@ is(
"Exit status 0 (drop_old_table method)" "Exit status 0 (drop_old_table method)"
); );
$rows = $dbh->selectall_arrayref('show tables from mkosc like "\_\_%"'); $rows = $master_dbh->selectall_arrayref('show tables from mkosc like "\_\_%"');
is_deeply( is_deeply(
$rows, $rows,
[], [],
"Old table dropped (drop_old_table method)" "Old table dropped (drop_old_table method)"
) or print Dumper($rows); ) or print Dumper($rows);
$new_table_def = $dbh->selectrow_hashref('show create table mkosc.city')->{'create table'}; $new_table_def = $master_dbh->selectrow_hashref('show create table mkosc.city')->{'create table'};
is( is(
$new_table_def, $new_table_def,
$orig_table_def, $orig_table_def,
@@ -240,19 +263,19 @@ sub test_table {
my ($file, $name) = @args{qw(file name)}; my ($file, $name) = @args{qw(file name)};
$sb->load_file('master', "t/lib/samples/osc/$file"); $sb->load_file('master', "t/lib/samples/osc/$file");
PerconaTest::wait_for_table($dbh, "osc.t", "id=5"); PerconaTest::wait_for_table($master_dbh, "osc.t", "id=5");
PerconaTest::wait_for_table($dbh, "osc.__new_t"); PerconaTest::wait_for_table($master_dbh, "osc.__new_t");
$dbh->do('use osc'); $master_dbh->do('use osc');
$dbh->do("DROP TABLE IF EXISTS osc.__new_t"); $master_dbh->do("DROP TABLE IF EXISTS osc.__new_t");
$org_rows = $dbh->selectall_arrayref('select * from osc.t order by id'); $org_rows = $master_dbh->selectall_arrayref('select * from osc.t order by id');
output( output(
sub { $exit = pt_online_schema_change::main(@args, sub { $exit = pt_online_schema_change::main(@args,
'D=osc,t=t', qw(--alter ENGINE=InnoDB)) }, 'D=osc,t=t', qw(--alter ENGINE=InnoDB)) },
); );
$new_rows = $dbh->selectall_arrayref('select * from osc.t order by id'); $new_rows = $master_dbh->selectall_arrayref('select * from osc.t order by id');
is_deeply( is_deeply(
$new_rows, $new_rows,
@@ -280,5 +303,5 @@ test_table(
# ############################################################################# # #############################################################################
# Done. # Done.
# ############################################################################# # #############################################################################
$sb->wipe_clean($dbh); $sb->wipe_clean($master_dbh);
exit; exit;