summaryrefslogtreecommitdiff
path: root/mysql-test/suite/atomic/create_table.test
blob: ff53a12ebabc07018e38c15a99428effa449a31f (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
--source include/have_debug.inc
--source include/have_sequence.inc
--source include/have_innodb.inc
--source include/have_log_bin.inc
--source include/not_valgrind.inc

#
# Testing of atomic create table with crashes in a lot of different places
#
# We test both statement based logging and row logging as CREATE ... SELECT
# works a bit differently depending on the logging format
# First engine will use row logging and second engine will use statement
# based logging
#

--disable_query_log
call mtr.add_suppression("InnoDB: .* does not exist in the InnoDB internal");
# Speed up wait_until_connected_again.inc
let NO_WSREP=1;
RESET MASTER;
--enable_query_log
let $MYSQLD_DATADIR= `SELECT @@datadir`;

if ($engine_count == "")
{
  let $engine_count=2;
  let $engines='myisam','innodb';
}

let $crash_count=9;
let $crash_points='ddl_log_create_before_create_frm', 'storage_engine_middle_of_create', 'ddl_log_create_before_create_table', 'ddl_log_create_after_create_table', 'ddl_log_create_after_drop', 'ddl_log_create_before_binlog', 'ddl_log_create_after_prepare_eof', 'ddl_log_create_after_binlog', 'ddl_log_create_log_complete';

let $statement_count=6;
let $statements='CREATE TABLE t1 (a int)',
                'CREATE OR REPLACE TABLE t2 (a int)',
                'CREATE TABLE t1 LIKE const_table',
                'CREATE OR REPLACE TABLE t2 LIKE const_table',
                'CREATE TABLE t1 SELECT * from t2',
                'CREATE OR REPLACE TABLE t2 SELECT * from const_table';

create table const_table (a int, b int) engine=myisam;
insert into const_table values (1,1),(2,2);
flush tables;

let $old_debug=`select @@debug_dbug`;

let $e=0;
let $keep_include_silent=1;
let $grep_script=CREATE|DROP;
--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;
  }
  --echo engine: $engine

  let $r=0;
  while ($r < $statement_count)
  {
    inc $r;
    let $statement=`select ELT($r, $statements)`;
    --echo query: $statement

    let $c=0;
    while ($c < $crash_count)
    {
      inc $c;
      let $crash=`select ELT($c, $crash_points)`;

      --eval set @@default_storage_engine=$default_engine
      create or replace table t2 select * from seq_1_to_2;
      flush tables;

      if ($e == 1)
      {
        --source include/set_binlog_format_row.sql
      }
      if ($e == 2)
      {
        --source include/set_binlog_format_statement.sql
      }
      FLUSH BINARY LOGS;
      --let $start_binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)

      --echo crash point: $crash
      --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
      --eval $statement;
      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!";
      }
      # Check which tables still exists
      --list_files $MYSQLD_DATADIR/test t*
      --list_files $MYSQLD_DATADIR/test *sql*

      --let $binlog_file=$start_binlog_file
      --let $binlog_output_name=master-bin.000001
      --source include/show_binlog_events.inc
      if ($error)
      {
        --let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)
        --let $binlog_output_name=master-bin.000002
        if ($binlog_file != $start_binlog_file)
        {
          --source include/show_binlog_events.inc
        }
      }
      # Drop the tables. The warnings will show what was dropped
      --disable_warnings
      drop table if exists t1,t2;
      --enable_warnings
    }
  }
}
drop table if exists t1,t2,const_table;

--enable_query_log