summaryrefslogtreecommitdiff
path: root/mysql-test/suite/maria/t/maria-recovery-rtree-ft.test
blob: a943185d12f61849d74d15c4eb7bb5839850bb6c (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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# Test of Recovery of R-tree (table t1) and fulltext (table t2) indices

--source include/not_embedded.inc
# Don't test this under valgrind, memory leaks will occur as we crash
--source include/not_valgrind.inc
# Binary must be compiled with debug for crash to occur
--source include/have_debug.inc
--source include/have_maria.inc

set global aria_log_file_size=4294967295;
let $MARIA_LOG=.;

--disable_warnings
drop database if exists mysqltest;
--enable_warnings
create database mysqltest;
let $mms_tname=t;

# Include scripts can perform SQL. For it to not influence the main test
# they use a separate connection. This way if they use a DDL it would
# not autocommit in the main test.
connect (admin, localhost, root,,mysqltest,,);
--enable_reconnect

connection default;
use mysqltest;
--enable_reconnect

-- source include/maria_empty_logs.inc
let $mms_tables=2;

CREATE TABLE t1 (
  line LINESTRING NOT NULL,
  kind ENUM('po', 'pp', 'rr', 'dr', 'rd', 'ts', 'cl') NOT NULL DEFAULT 'po',
  name VARCHAR(32)
  ,SPATIAL key (line)
) transactional=1 row_format=page engine=aria;
SHOW INDEX FROM t1;
CREATE TABLE t2 (a VARCHAR(200), b TEXT, FULLTEXT (a,b)
) transactional=1 row_format=page engine=aria;
SHOW INDEX FROM t2;

let $query1=   INSERT INTO t1 (name, kind, line) VALUES 
  ("Aadaouane", "pp", GeomFromText("POINT(32.816667 35.983333)")),
  ("Aadassiye", "pp", GeomFromText("POINT(35.816667 36.216667)")),
  ("Aadbel", "pp", GeomFromText("POINT(34.533333 36.100000)")),
  ("Aadchit", "pp", GeomFromText("POINT(33.347222 35.423611)")),
  ("Aadchite", "pp", GeomFromText("POINT(33.347222 35.423611)")),
  ("Aadchit el Qoussair", "pp", GeomFromText("POINT(33.283333 35.483333)")),
  ("Aaddaye", "pp", GeomFromText("POINT(36.716667 40.833333)")),
  ("'Aadeissa", "pp", GeomFromText("POINT(32.823889 35.698889)")),
  ("Aaderup", "pp", GeomFromText("POINT(55.216667 11.766667)")),
  ("Qalaat Aades", "pp", GeomFromText("POINT(33.503333 35.377500)")),
  ("A ad'ino", "pp", GeomFromText("POINT(54.812222 38.209167)")),
  ("Aadi Noia", "pp", GeomFromText("POINT(13.800000 39.833333)")),
  ("Aad La Macta", "pp", GeomFromText("POINT(35.779444 -0.129167)")),
  ("Aadland", "pp", GeomFromText("POINT(60.366667 5.483333)")),
  ("Aadliye", "pp", GeomFromText("POINT(33.366667 36.333333)")),
  ("Aadloun", "pp", GeomFromText("POINT(33.403889 35.273889)")),
  ("Aadma", "pp", GeomFromText("POINT(58.798333 22.663889)")),
  ("Aadma Asundus", "pp", GeomFromText("POINT(58.798333 22.663889)")),
  ("Aadmoun", "pp", GeomFromText("POINT(34.150000 35.650000)")),
  ("Aadneram", "pp", GeomFromText("POINT(59.016667 6.933333)")),
  ("Aadneskaar", "pp", GeomFromText("POINT(58.083333 6.983333)")),
  ("Aadorf", "pp", GeomFromText("POINT(47.483333 8.900000)")),
  ("Aadorp", "pp", GeomFromText("POINT(52.366667 6.633333)")),
  ("Aadouane", "pp", GeomFromText("POINT(32.816667 35.983333)")),
  ("Aadoui", "pp", GeomFromText("POINT(34.450000 35.983333)")),
  ("Aadouiye", "pp", GeomFromText("POINT(34.583333 36.183333)")),
  ("Aadouss", "pp", GeomFromText("POINT(33.512500 35.601389)")),
  ("Aadra", "pp", GeomFromText("POINT(33.616667 36.500000)")),
  ("Aadzi", "pp", GeomFromText("POINT(38.100000 64.850000)"));

let $query2= INSERT INTO t2 VALUES
 ('MySQL has now support', 'for full-text search'),
 ('Full-text indexes', 'are called collections'),
 ('Only MyISAM tables','support collections'),
 ('Function MATCH ... AGAINST()','is used to do a search'),
 ('Full-text search in MySQL', 'implements vector space model'),
 ('We want to see', 'if this is recoverable'),
 ('Or rather leaves a bad corrupted table', 'after a crash'),
 ('Test of REDOs', 'and then UNDOs'),
 ('Recovery is interesting', 'but sometimes complicated'),
 ('But what if it was simple', 'and boring?'),
 ('I wish I knew more', 'about how fulltext works'),
 ('Maybe I should read about it', 'on the Internet');

--echo * TEST of REDO: see if recovery can reconstruct if we give it an old table

-- source include/maria_make_snapshot_for_feeding_recovery.inc

--disable_query_log
let $1=120; # 8 is smallest value to cause root split; 12 for child split
while($1)
{
  eval $query1;
  eval $query2;
  dec $1;
}
let $1=120;
while($1)
{
  delete from t1 limit 1;
  delete from t1 limit 10;
  delete from t1 limit 7;
  delete from t1 limit 2;
  delete from t2 limit 6;
  dec $1;
}
--enable_query_log
-- source include/maria_make_snapshot_for_comparison.inc
# we want recovery to run on the first snapshot made above
let $mvr_restore_old_snapshot=1;
let $mms_compare_physically=0;
let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash";
let $mvr_crash_statement= set global aria_checkpoint_interval=1;
# the script below will trigger recovery and compare checksums
-- source include/maria_verify_recovery.inc

# Test of REDO + UNDO
--echo * TEST of INSERT and DELETE's rollback

# different types of crash => a loop; here are loop control variables
let $crash_no_flush=1;
let $crash_flush_whole_page_cache=0;
let $crash_flush_states=0;
let $crash_flush_whole_log=0;
let $crash_loop=1;

# we want recovery to use the tables as they were at time of crash
let $mvr_restore_old_snapshot=0;
# UNDO phase prevents physical comparison, normally,
# so we'll only use checksums to compare.
let $mms_compare_physically=0;
let $mvr_crash_statement= set global aria_checkpoint_interval=1;

# Note that we don't remove logs between iterations. Test is
# cumulative (each new recovery processes more log records than the previous).

while ($crash_loop)
{
  if ($crash_flush_whole_log)
  {
     let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash";
     # set up what next iteration should do:
     let $crash_flush_whole_log=0;
     let $crash_loop=0;
  }
  if ($crash_flush_states)
  {
     let $mvr_debug_option="+d,maria_flush_states,maria_flush_whole_log,maria_crash";
     let $crash_flush_states=0;
     let $crash_flush_whole_log=1;
  }
  if ($crash_flush_whole_page_cache)
  {
     let $mvr_debug_option="+d,maria_flush_whole_page_cache,maria_crash";
     let $crash_flush_whole_page_cache=0;
     let $crash_flush_states=1;
  }
  if ($crash_no_flush)
  {
     let $mvr_debug_option="+d,maria_crash";
     let $crash_no_flush=0;
     let $crash_flush_whole_page_cache=1;
  }
  # Your committed statements here
  -- source include/maria_make_snapshot_for_comparison.inc
  # Your statements which we expect to be rolled back
  lock tables t1 write, t2 write;

  --disable_query_log
  let $1=120;
  while($1)
  {
    eval $query1;
    eval $query2;
    dec $1;
  }
  let $1=120;
  while($1)
  {
    delete from t1 limit 1;
    delete from t1 limit 10;
    delete from t1 limit 7;
    delete from t1 limit 2;
    delete from t2 limit 6;
    dec $1;
  }
  --enable_query_log

  -- source include/maria_verify_recovery.inc
}

# Finally check when we make the table empty
# This is currently hitting BUG#36319 so is disabled

if (0)
{
-- source include/maria_make_snapshot_for_comparison.inc
lock tables t1 write, t2 write;
select count(*) from t1;
delete from t1;
select count(*) from t1;
select count(*) from t2;
delete from t2;
select count(*) from t2;
}

-- source include/maria_verify_recovery.inc

# clean up everything
let $mms_purpose=feeding_recovery;
eval drop database mysqltest_for_$mms_purpose;
let $mms_purpose=comparison;
eval drop database mysqltest_for_$mms_purpose;
drop database mysqltest;