blob: d0d7cc642595208caf6d76639af5c171c6064537 [file] [log] [blame]
danielk197707cb5602006-01-20 10:55:05 +00001# 2005 December 30
2#
3# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
5#
6# May you do good and not evil.
7# May you find forgiveness for yourself and forgive others.
8# May you share freely, never taking more than you give.
9#
10#***********************************************************************
11#
12# The focus of the tests in this file are IO errors that occur in a shared
13# cache context. What happens to connection B if one connection A encounters
14# an IO-error whilst reading or writing the file-system?
15#
danielk1977992772c2007-08-30 10:07:38 +000016# $Id: shared_err.test,v 1.16 2007/08/30 10:07:39 danielk1977 Exp $
danielk197707cb5602006-01-20 10:55:05 +000017
18proc skip {args} {}
19
20
21set testdir [file dirname $argv0]
22source $testdir/tester.tcl
danielk1977222a7572007-08-25 13:37:48 +000023source $testdir/malloc_common.tcl
danielk197707cb5602006-01-20 10:55:05 +000024db close
25
26ifcapable !shared_cache||!subquery {
27 finish_test
28 return
29}
danielk1977222a7572007-08-25 13:37:48 +000030
danielk197707cb5602006-01-20 10:55:05 +000031set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
32
danielk197707cb5602006-01-20 10:55:05 +000033do_ioerr_test shared_ioerr-1 -tclprep {
34 sqlite3 db2 test.db
35 execsql {
36 PRAGMA read_uncommitted = 1;
37 CREATE TABLE t1(a,b,c);
38 BEGIN;
39 SELECT * FROM sqlite_master;
40 } db2
41} -sqlbody {
42 SELECT * FROM sqlite_master;
43 INSERT INTO t1 VALUES(1,2,3);
44 BEGIN TRANSACTION;
45 INSERT INTO t1 VALUES(1,2,3);
46 INSERT INTO t1 VALUES(4,5,6);
47 ROLLBACK;
48 SELECT * FROM t1;
49 BEGIN TRANSACTION;
50 INSERT INTO t1 VALUES(1,2,3);
51 INSERT INTO t1 VALUES(4,5,6);
52 COMMIT;
53 SELECT * FROM t1;
54 DELETE FROM t1 WHERE a<100;
55} -cleanup {
danielk197797a227c2006-01-20 16:32:04 +000056 do_test shared_ioerr-1.$n.cleanup.1 {
danielk197707cb5602006-01-20 10:55:05 +000057 set res [catchsql {
58 SELECT * FROM t1;
59 } db2]
60 set possible_results [list \
61 "1 {disk I/O error}" \
62 "0 {1 2 3}" \
63 "0 {1 2 3 1 2 3 4 5 6}" \
64 "0 {1 2 3 1 2 3 4 5 6 1 2 3 4 5 6}" \
65 "0 {}" \
66 ]
67 set rc [expr [lsearch -exact $possible_results $res] >= 0]
68 if {$rc != 1} {
69 puts ""
70 puts "Result: $res"
71 }
72 set rc
73 } {1}
74 db2 close
75}
76
77do_ioerr_test shared_ioerr-2 -tclprep {
78 sqlite3 db2 test.db
79 execsql {
80 PRAGMA read_uncommitted = 1;
81 BEGIN;
82 CREATE TABLE t1(a, b);
83 INSERT INTO t1(oid) VALUES(NULL);
84 INSERT INTO t1(oid) SELECT NULL FROM t1;
85 INSERT INTO t1(oid) SELECT NULL FROM t1;
86 INSERT INTO t1(oid) SELECT NULL FROM t1;
87 INSERT INTO t1(oid) SELECT NULL FROM t1;
88 INSERT INTO t1(oid) SELECT NULL FROM t1;
89 INSERT INTO t1(oid) SELECT NULL FROM t1;
90 INSERT INTO t1(oid) SELECT NULL FROM t1;
91 INSERT INTO t1(oid) SELECT NULL FROM t1;
92 INSERT INTO t1(oid) SELECT NULL FROM t1;
93 INSERT INTO t1(oid) SELECT NULL FROM t1;
94 UPDATE t1 set a = oid, b = 'abcdefghijklmnopqrstuvwxyz0123456789';
95 CREATE INDEX i1 ON t1(a);
96 COMMIT;
97 BEGIN;
98 SELECT * FROM sqlite_master;
99 } db2
100} -tclbody {
101 set ::residx 0
102 execsql {DELETE FROM t1 WHERE 0 = (a % 2);}
103 incr ::residx
104
105 # When this transaction begins the table contains 512 entries. The
106 # two statements together add 512+146 more if it succeeds.
107 # (1024/7==146)
108 execsql {BEGIN;}
109 execsql {INSERT INTO t1 SELECT a+1, b FROM t1;}
110 execsql {INSERT INTO t1 SELECT 'string' || a, b FROM t1 WHERE 0 = (a%7);}
111 execsql {COMMIT;}
112
113 incr ::residx
114} -cleanup {
115 do_test shared_ioerr-2.$n.cleanup.1 {
116 set res [catchsql {
117 SELECT max(a), min(a), count(*) FROM (SELECT a FROM t1 order by a);
118 } db2]
119 set possible_results [list \
120 {0 {1024 1 1024}} \
121 {0 {1023 1 512}} \
122 {0 {string994 1 1170}} \
123 ]
124 set idx [lsearch -exact $possible_results $res]
125 set success [expr {$idx==$::residx || $res=="1 {disk I/O error}"}]
126 if {!$success} {
127 puts ""
128 puts "Result: \"$res\" ($::residx)"
129 }
130 set success
131 } {1}
132 db2 close
133}
134
danielk197797a227c2006-01-20 16:32:04 +0000135# This test is designed to provoke an IO error when a cursor position is
136# "saved" (because another cursor is going to modify the underlying table).
137#
138do_ioerr_test shared_ioerr-3 -tclprep {
139 sqlite3 db2 test.db
140 execsql {
141 PRAGMA read_uncommitted = 1;
danielk1977c4da5b92006-01-21 12:08:54 +0000142 PRAGMA cache_size = 10;
143 BEGIN;
144 CREATE TABLE t1(a, b, UNIQUE(a, b));
145 } db2
146 for {set i 0} {$i < 200} {incr i} {
147 set a [string range [string repeat "[format %03d $i]." 5] 0 end-1]
148
149 set b [string repeat $i 2000]
150 execsql {INSERT INTO t1 VALUES($a, $b)} db2
151 }
152 execsql {COMMIT} db2
153 set ::DB2 [sqlite3_connection_pointer db2]
154 set ::STMT [sqlite3_prepare $::DB2 "SELECT a FROM t1 ORDER BY a" -1 DUMMY]
155 sqlite3_step $::STMT ;# Cursor points at 000.000.000.000
156 sqlite3_step $::STMT ;# Cursor points at 001.001.001.001
157
158} -tclbody {
159 execsql {
danielk197775bab7d2006-01-23 13:09:45 +0000160 BEGIN;
danielk1977c4da5b92006-01-21 12:08:54 +0000161 INSERT INTO t1 VALUES('201.201.201.201.201', NULL);
danielk197775bab7d2006-01-23 13:09:45 +0000162 UPDATE t1 SET a = '202.202.202.202.202' WHERE a LIKE '201%';
163 COMMIT;
danielk1977c4da5b92006-01-21 12:08:54 +0000164 }
165} -cleanup {
danielk1977b94bf852007-03-19 13:53:37 +0000166 set ::steprc [sqlite3_step $::STMT]
167 set ::column [sqlite3_column_text $::STMT 0]
168 set ::finalrc [sqlite3_finalize $::STMT]
169
170 # There are three possible outcomes here (assuming persistent IO errors):
171 #
172 # 1. If the [sqlite3_step] did not require any IO (required pages in
173 # the cache), then the next row ("002...") may be retrieved
174 # successfully.
175 #
176 # 2. If the [sqlite3_step] does require IO, then [sqlite3_step] returns
177 # SQLITE_ERROR and [sqlite3_finalize] returns IOERR.
178 #
179 # 3. If, after the initial IO error, SQLite tried to rollback the
180 # active transaction and a second IO error was encountered, then
181 # statement $::STMT will have been aborted. This means [sqlite3_stmt]
182 # returns SQLITE_ABORT, and the statement cursor does not move. i.e.
183 # [sqlite3_column] still returns the current row ("001...") and
184 # [sqlite3_finalize] returns SQLITE_OK.
185 #
186
danielk1977c4da5b92006-01-21 12:08:54 +0000187 do_test shared_ioerr-3.$n.cleanup.1 {
danielk1977b94bf852007-03-19 13:53:37 +0000188 expr {
189 $::steprc eq "SQLITE_ROW" ||
190 $::steprc eq "SQLITE_ERROR" ||
191 $::steprc eq "SQLITE_ABORT"
192 }
193 } {1}
danielk1977c4da5b92006-01-21 12:08:54 +0000194 do_test shared_ioerr-3.$n.cleanup.2 {
danielk1977b94bf852007-03-19 13:53:37 +0000195 expr {
196 ($::steprc eq "SQLITE_ROW" && $::column eq "002.002.002.002.002") ||
197 ($::steprc eq "SQLITE_ERROR" && $::column eq "") ||
198 ($::steprc eq "SQLITE_ABORT" && $::column eq "001.001.001.001.001")
199 }
200 } {1}
danielk1977c4da5b92006-01-21 12:08:54 +0000201 do_test shared_ioerr-3.$n.cleanup.3 {
danielk1977b94bf852007-03-19 13:53:37 +0000202 expr {
203 ($::steprc eq "SQLITE_ROW" && $::finalrc eq "SQLITE_OK") ||
204 ($::steprc eq "SQLITE_ERROR" && $::finalrc eq "SQLITE_IOERR") ||
drhc1a7f942007-08-30 02:26:53 +0000205 ($::steprc eq "SQLITE_ERROR" && $::finalrc eq "SQLITE_ABORT")
danielk1977b94bf852007-03-19 13:53:37 +0000206 }
207 } {1}
208
danielk1977c4da5b92006-01-21 12:08:54 +0000209# db2 eval {select * from sqlite_master}
210 db2 close
211}
212
drh77a2a5e2007-04-06 01:04:39 +0000213# This is a repeat of the previous test except that this time we
214# are doing a reverse-order scan of the table when the cursor is
215# "saved".
216#
217do_ioerr_test shared_ioerr-3rev -tclprep {
218 sqlite3 db2 test.db
219 execsql {
220 PRAGMA read_uncommitted = 1;
221 PRAGMA cache_size = 10;
222 BEGIN;
223 CREATE TABLE t1(a, b, UNIQUE(a, b));
224 } db2
225 for {set i 0} {$i < 200} {incr i} {
226 set a [string range [string repeat "[format %03d $i]." 5] 0 end-1]
227
228 set b [string repeat $i 2000]
229 execsql {INSERT INTO t1 VALUES($a, $b)} db2
230 }
231 execsql {COMMIT} db2
232 set ::DB2 [sqlite3_connection_pointer db2]
233 set ::STMT [sqlite3_prepare $::DB2 \
234 "SELECT a FROM t1 ORDER BY a DESC" -1 DUMMY]
235 sqlite3_step $::STMT ;# Cursor points at 199.199.199.199.199
236 sqlite3_step $::STMT ;# Cursor points at 198.198.198.198.198
237
238} -tclbody {
239 execsql {
240 BEGIN;
241 INSERT INTO t1 VALUES('201.201.201.201.201', NULL);
242 UPDATE t1 SET a = '202.202.202.202.202' WHERE a LIKE '201%';
243 COMMIT;
244 }
245} -cleanup {
246 set ::steprc [sqlite3_step $::STMT]
247 set ::column [sqlite3_column_text $::STMT 0]
248 set ::finalrc [sqlite3_finalize $::STMT]
249
250 # There are three possible outcomes here (assuming persistent IO errors):
251 #
252 # 1. If the [sqlite3_step] did not require any IO (required pages in
253 # the cache), then the next row ("002...") may be retrieved
254 # successfully.
255 #
256 # 2. If the [sqlite3_step] does require IO, then [sqlite3_step] returns
257 # SQLITE_ERROR and [sqlite3_finalize] returns IOERR.
258 #
259 # 3. If, after the initial IO error, SQLite tried to rollback the
260 # active transaction and a second IO error was encountered, then
261 # statement $::STMT will have been aborted. This means [sqlite3_stmt]
262 # returns SQLITE_ABORT, and the statement cursor does not move. i.e.
263 # [sqlite3_column] still returns the current row ("001...") and
264 # [sqlite3_finalize] returns SQLITE_OK.
265 #
266
267 do_test shared_ioerr-3rev.$n.cleanup.1 {
268 expr {
269 $::steprc eq "SQLITE_ROW" ||
270 $::steprc eq "SQLITE_ERROR" ||
271 $::steprc eq "SQLITE_ABORT"
272 }
273 } {1}
274 do_test shared_ioerr-3rev.$n.cleanup.2 {
275 expr {
276 ($::steprc eq "SQLITE_ROW" && $::column eq "197.197.197.197.197") ||
277 ($::steprc eq "SQLITE_ERROR" && $::column eq "") ||
278 ($::steprc eq "SQLITE_ABORT" && $::column eq "198.198.198.198.198")
279 }
280 } {1}
281 do_test shared_ioerr-3rev.$n.cleanup.3 {
282 expr {
283 ($::steprc eq "SQLITE_ROW" && $::finalrc eq "SQLITE_OK") ||
284 ($::steprc eq "SQLITE_ERROR" && $::finalrc eq "SQLITE_IOERR") ||
drhc1a7f942007-08-30 02:26:53 +0000285 ($::steprc eq "SQLITE_ERROR" && $::finalrc eq "SQLITE_ABORT")
drh77a2a5e2007-04-06 01:04:39 +0000286 }
287 } {1}
288
289# db2 eval {select * from sqlite_master}
290 db2 close
291}
292
drh7b3822b2006-01-23 23:49:34 +0000293# Only run these tests if memory debugging is turned on.
294#
drhc1a7f942007-08-30 02:26:53 +0000295ifcapable !memdebug {
drh7b3822b2006-01-23 23:49:34 +0000296 puts "Skipping malloc tests: not compiled with -DSQLITE_MEMDEBUG..."
drh80d56822006-01-24 00:15:15 +0000297 db close
298 sqlite3_enable_shared_cache $::enable_shared_cache
drh7b3822b2006-01-23 23:49:34 +0000299 finish_test
300 return
301}
302
danielk1977c4da5b92006-01-21 12:08:54 +0000303# Provoke a malloc() failure when a cursor position is being saved. This
304# only happens with index cursors (because they malloc() space to save the
305# current key value). It does not happen with tables, because an integer
306# key does not require a malloc() to store.
307#
308# The library should return an SQLITE_NOMEM to the caller. The query that
309# owns the cursor (the one for which the position is not saved) should
310# continue unaffected.
311#
drhc1a7f942007-08-30 02:26:53 +0000312do_malloc_test shared_err-4 -tclprep {
danielk1977c4da5b92006-01-21 12:08:54 +0000313 sqlite3 db2 test.db
314 execsql {
315 PRAGMA read_uncommitted = 1;
danielk197797a227c2006-01-20 16:32:04 +0000316 BEGIN;
317 CREATE TABLE t1(a, b, UNIQUE(a, b));
318 } db2
319 for {set i 0} {$i < 5} {incr i} {
320 set a [string repeat $i 10]
321 set b [string repeat $i 2000]
322 execsql {INSERT INTO t1 VALUES($a, $b)} db2
323 }
324 execsql {COMMIT} db2
325 set ::DB2 [sqlite3_connection_pointer db2]
326 set ::STMT [sqlite3_prepare $::DB2 "SELECT a FROM t1 ORDER BY a" -1 DUMMY]
327 sqlite3_step $::STMT ;# Cursor points at 0000000000
328 sqlite3_step $::STMT ;# Cursor points at 1111111111
329} -tclbody {
330 execsql {
331 INSERT INTO t1 VALUES(6, NULL);
332 }
333} -cleanup {
danielk1977c4da5b92006-01-21 12:08:54 +0000334 do_test shared_malloc-4.$::n.cleanup.1 {
danielk19778d34dfd2006-01-24 16:37:57 +0000335 set ::rc [sqlite3_step $::STMT]
drhc1a7f942007-08-30 02:26:53 +0000336 expr {$::rc=="SQLITE_ROW" || $::rc=="SQLITE_ERROR"}
danielk19778d34dfd2006-01-24 16:37:57 +0000337 } {1}
338 if {$::rc=="SQLITE_ROW"} {
339 do_test shared_malloc-4.$::n.cleanup.2 {
340 sqlite3_column_text $::STMT 0
341 } {2222222222}
342 }
danielk1977c4da5b92006-01-21 12:08:54 +0000343 do_test shared_malloc-4.$::n.cleanup.3 {
drhc1a7f942007-08-30 02:26:53 +0000344 set rc [sqlite3_finalize $::STMT]
345 expr {$rc=="SQLITE_OK" || $rc=="SQLITE_ABORT" || $rc=="SQLITE_NOMEM"}
346 } {1}
danielk197797a227c2006-01-20 16:32:04 +0000347# db2 eval {select * from sqlite_master}
348 db2 close
349}
350
drhc1a7f942007-08-30 02:26:53 +0000351do_malloc_test shared_err-5 -tclbody {
352 db close
danielk19774b202ae2006-01-23 05:50:58 +0000353 sqlite3 dbX test.db
354 sqlite3 dbY test.db
355 dbX close
356 dbY close
357} -cleanup {
358 catch {dbX close}
359 catch {dbY close}
360}
361
drhc1a7f942007-08-30 02:26:53 +0000362do_malloc_test shared_err-6 -tclbody {
danielk19777246f5b2006-01-24 11:30:27 +0000363 catch {db close}
364 sqlite3_thread_cleanup
365 sqlite3_enable_shared_cache 0
366} -cleanup {
367 sqlite3_enable_shared_cache 1
368}
369
drhc1a7f942007-08-30 02:26:53 +0000370# As of 3.5.0, sqlite3_enable_shared_cache can be called at
371# any time and from any thread
372#do_test shared_err-misuse-7.1 {
373# sqlite3 db test.db
374# catch {
375# sqlite3_enable_shared_cache 0
376# } msg
377# set msg
378#} {library routine called out of sequence}
danielk19777246f5b2006-01-24 11:30:27 +0000379
danielk19778d34dfd2006-01-24 16:37:57 +0000380# Again provoke a malloc() failure when a cursor position is being saved,
381# this time during a ROLLBACK operation by some other handle.
382#
383# The library should return an SQLITE_NOMEM to the caller. The query that
384# owns the cursor (the one for which the position is not saved) should
385# be aborted.
386#
387set ::aborted 0
drhc1a7f942007-08-30 02:26:53 +0000388do_malloc_test shared_err-8 -tclprep {
danielk19778d34dfd2006-01-24 16:37:57 +0000389 sqlite3 db2 test.db
390 execsql {
391 PRAGMA read_uncommitted = 1;
392 BEGIN;
393 CREATE TABLE t1(a, b, UNIQUE(a, b));
394 } db2
395 for {set i 0} {$i < 2} {incr i} {
396 set a [string repeat $i 10]
397 set b [string repeat $i 2000]
398 execsql {INSERT INTO t1 VALUES($a, $b)} db2
399 }
400 execsql {COMMIT} db2
401 set ::DB2 [sqlite3_connection_pointer db2]
402 set ::STMT [sqlite3_prepare $::DB2 "SELECT a FROM t1 ORDER BY a" -1 DUMMY]
403 sqlite3_step $::STMT ;# Cursor points at 0000000000
404 sqlite3_step $::STMT ;# Cursor points at 1111111111
405} -tclbody {
406 execsql {
407 BEGIN;
408 INSERT INTO t1 VALUES(6, NULL);
409 ROLLBACK;
410 }
411} -cleanup {
412 do_test shared_malloc-8.$::n.cleanup.1 {
413 lrange [execsql {
414 SELECT a FROM t1;
415 } db2] 0 1
416 } {0000000000 1111111111}
417 do_test shared_malloc-8.$::n.cleanup.2 {
418 set rc1 [sqlite3_step $::STMT]
419 set rc2 [sqlite3_finalize $::STMT]
drhc1a7f942007-08-30 02:26:53 +0000420 if {$rc2=="SQLITE_ABORT"} {
danielk19778d34dfd2006-01-24 16:37:57 +0000421 incr ::aborted
422 }
423 expr {
424 ($rc1=="SQLITE_DONE" && $rc2=="SQLITE_OK") ||
drhc1a7f942007-08-30 02:26:53 +0000425 ($rc1=="SQLITE_ERROR" && $rc2=="SQLITE_ABORT") ||
426 ($rc1=="SQLITE_ERROR" && $rc2=="SQLITE_NOMEM")
danielk19778d34dfd2006-01-24 16:37:57 +0000427 }
428 } {1}
429 db2 close
430}
431do_test shared_malloc-8.X {
432 # Test that one or more queries were aborted due to the malloc() failure.
433 expr $::aborted>=1
434} {1}
435
danielk1977992772c2007-08-30 10:07:38 +0000436# This test is designed to catch a specific bug that was present during
437# development of 3.5.0. If a malloc() failed while setting the page-size,
438# a buffer (Pager.pTmpSpace) was being freed. This could cause a seg-fault
439# later if another connection tried to use the pager.
440#
441# This test will crash 3.4.2.
442#
443do_malloc_test shared_err-9 -tclprep {
444 sqlite3 db2 test.db
445} -sqlbody {
446 PRAGMA page_size = 4096;
447 PRAGMA page_size = 1024;
448} -cleanup {
449 db2 eval {
450 CREATE TABLE abc(a, b, c);
451 BEGIN;
452 INSERT INTO abc VALUES(1, 2, 3);
453 ROLLBACK;
454 }
455 db2 close
456}
457
458
danielk197707cb5602006-01-20 10:55:05 +0000459catch {db close}
danielk1977992772c2007-08-30 10:07:38 +0000460catch {db2 close}
danielk197707cb5602006-01-20 10:55:05 +0000461sqlite3_enable_shared_cache $::enable_shared_cache
462finish_test