summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/atomic/rename_table_binlog.test
blob: bc505148c935623ae3165a16cbea3def375fea67 (plain)
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