1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
--source include/have_debug.inc
--source include/have_innodb.inc
--source include/have_csv.inc
--source include/have_log_bin.inc
--source include/not_valgrind.inc
# Speed up wait_until_connected_again.inc
let NO_WSREP=1;
RESET MASTER;
#
# Testing of atomic rename with binlogging
# - First crash is before binlog is written, in which case the rename should
# be reverted
# - Second crash is after binlog is written, in which case the rename should hold
#
let $engine_count=2;
let $engines='myisam', 'aria';
let $crash_count=2;
let $crash_points='ddl_log_rename_before_binlog','ddl_log_rename_after_binlog';
let $crash_positions= 1;
let $old_debug=`select @@debug_dbug`;
let $e=0;
--disable_query_log
while ($e < $engine_count)
{
inc $e;
let $engine=`select ELT($e, $engines)`;
let $default_engine=$engine;
let $extra_option=;
if ($engine == "aria")
{
let $extra_option=transactional=1;
}
if ($engine == "aria_notrans")
{
let $default_engine="aria";
let $extra_option=transactional=0;
}
--eval set @@default_storage_engine=$default_engine
--eval create table t1 (a int not null) $extra_option;
--eval create table t2 (b int not null) $extra_option;
--eval create table t3 (c int not null) $extra_option;
--eval create table t4 (d int not null) $extra_option;
insert into t1 values(1);
insert into t2 values(2);
insert into t3 values(3);
insert into t4 values(4);
delimiter |;
create trigger t1_trg before insert on t1 for each row
begin
if isnull(new.a) then
set new.a:= 1000;
end if;
end|
create trigger t2_trg before insert on t2 for each row
begin
if isnull(new.b) then
set new.b:= 2000;
end if;
end|
create trigger t3_trg before insert on t3 for each row
begin
if isnull(new.c) then
set new.c:= 4000;
end if;
end|
create trigger t4_trg before insert on t4 for each row
begin
if isnull(new.d) then
set new.d:= 8000;
end if;
end|
delimiter ;|
let $c=0;
while ($c < $crash_count)
{
inc $c;
let $crash=`select ELT($c, $crash_points)`;
let $r=0;
while ($r < $crash_positions)
{
inc $r;
echo "engine: $engine crash point: $crash position: $r";
flush tables;
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--disable_reconnect
--eval set @@debug_dbug="+d,$crash",@debug_crash_counter=1
let $errno=0;
--error 0,2013
rename table t1 to t5, t2 to t1, t5 to t2, t4 to t5, t3 to t4;
let $error=$errno;
--enable_reconnect
--source include/wait_until_connected_again.inc
--disable_query_log
--eval set @@debug_dbug="$old_debug"
if ($error == 0)
{
echo "No crash!";
# No crash, rename things back
rename table t4 to t3, t5 to t4, t2 to t5, t1 to t2, t5 to t1;
}
if ($c == 1)
{
# Check that the tables are back to original
let $res=`select t1.a+t2.b+t3.c+t4.d from t1,t2,t3,t4`;
if ($res != 10)
{
die "Got result $res when 10 was expected";
}
# Ensure that triggers work
insert into t1 values(null);
insert into t2 values(null);
insert into t3 values(null);
insert into t4 values(null);
let $res=`select (select sum(t1.a) from t1)+ (select sum(t2.b) from t2) + (select sum(t3.c) from t3)+ (select sum(t4.d) from t4)`;
if ($res != 15010)
{
die "Got result $res when 15010 was expected";
}
# Restore tables
delete from t1 where a > 100;
delete from t2 where b > 100;
delete from t3 where c > 100;
delete from t4 where d > 100;
}
if ($c == 2)
{
# Check that rename succeded
insert into t1 values(null);
insert into t2 values(null);
insert into t5 values(null);
insert into t4 values(null);
let $res=`select (select sum(t1.b) from t1)+ (select sum(t2.a) from t2) + (select sum(t4.c) from t4)+ (select sum(t5.d) from t5)`;
if ($res != 15010)
{
die "Got result $res when 15010 was expected";
}
let $res=`select (select count(*)=2 from t1) + (select count(*)=2 from t2) + (select count(*)=2 from t4)+ (select count(*)=2 from t5)`;
if ($res != 4)
{
die "Got result $res when 4 was expected";
}
}
}
}
drop table t1,t2,t4,t5;
}
--enable_query_log
# Show the binlogs that holds the renames
--let $binlog_file=master-bin.000002
--source include/show_binlog_events.inc
--let $binlog_file=master-bin.000003
--source include/show_binlog_events.inc
--let $binlog_file=master-bin.000004
--source include/show_binlog_events.inc
--let $binlog_file=master-bin.000005
--source include/show_binlog_events.inc
|