/ Hex Artifact Content
Login

Artifact 988bda4d8d6fa1593765a514bf7a24adb3240da9:


0000: 23 20 32 30 30 37 20 41 70 72 69 6c 20 32 0a 23  # 2007 April 2.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65  ****.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72   implements regr
0180: 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72  ession tests for
0190: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
01a0: 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66    The.# focus of
01b0: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74 65   this file is te
01c0: 73 74 69 6e 67 20 66 6f 72 20 63 6f 72 72 65 63  sting for correc
01d0: 74 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 49 2f  t handling of I/
01e0: 4f 20 65 72 72 6f 72 73 0a 23 20 73 75 63 68 20  O errors.# such 
01f0: 61 73 20 77 72 69 74 65 73 20 66 61 69 6c 69 6e  as writes failin
0200: 67 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69  g because the di
0210: 73 6b 20 69 73 20 66 75 6c 6c 2e 0a 23 20 0a 23  sk is full..# .#
0220: 20 54 68 65 20 74 65 73 74 73 20 69 6e 20 74 68   The tests in th
0230: 69 73 20 66 69 6c 65 20 75 73 65 20 73 70 65 63  is file use spec
0240: 69 61 6c 20 66 61 63 69 6c 69 74 69 65 73 20 74  ial facilities t
0250: 68 61 74 20 61 72 65 20 6f 6e 6c 79 0a 23 20 61  hat are only.# a
0260: 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20  vailable in the 
0270: 53 51 4c 69 74 65 20 74 65 73 74 20 66 69 78 74  SQLite test fixt
0280: 75 72 65 2e 0a 23 0a 23 20 24 49 64 3a 20 69 6f  ure..#.# $Id: io
0290: 65 72 72 32 2e 74 65 73 74 2c 76 20 31 2e 39 20  err2.test,v 1.9 
02a0: 32 30 30 38 2f 30 38 2f 32 30 20 31 34 3a 34 39  2008/08/20 14:49
02b0: 3a 32 35 20 64 61 6e 69 65 6c 6b 31 39 37 37 20  :25 danielk1977 
02c0: 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74 64  Exp $..set testd
02d0: 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ir [file dirname
02e0: 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20   $argv0].source 
02f0: 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e  $testdir/tester.
0300: 74 63 6c 0a 0a 69 66 63 61 70 61 62 6c 65 20 21  tcl..ifcapable !
0310: 69 6e 74 65 67 72 69 74 79 63 6b 20 7b 0a 20 20  integrityck {.  
0320: 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65  finish_test.  re
0330: 74 75 72 6e 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  turn.}..do_test 
0340: 69 6f 65 72 72 32 2d 31 2e 31 20 7b 0a 20 20 65  ioerr2-1.1 {.  e
0350: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
0360: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
0370: 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   10;.    PRAGMA 
0380: 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69  default_cache_si
0390: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 43 52 45  ze = 10;.    CRE
03a0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
03b0: 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61  b, PRIMARY KEY(a
03c0: 2c 20 62 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  , b));.    INSER
03d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
03e0: 28 72 61 6e 64 73 74 72 28 34 30 30 2c 34 30 30  (randstr(400,400
03f0: 29 2c 72 61 6e 64 73 74 72 28 34 30 30 2c 34 30  ),randstr(400,40
0400: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
0410: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
0420: 61 6e 64 73 74 72 28 34 30 30 2c 34 30 30 29 2c  andstr(400,400),
0430: 20 72 61 6e 64 73 74 72 28 34 30 30 2c 34 30 30   randstr(400,400
0440: 29 20 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 32 0a  ) FROM t1; -- 2.
0450: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0460: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74  t1 SELECT randst
0470: 72 28 34 30 30 2c 34 30 30 29 2c 20 72 61 6e 64  r(400,400), rand
0480: 73 74 72 28 34 30 30 2c 34 30 30 29 20 46 52 4f  str(400,400) FRO
0490: 4d 20 74 31 3b 20 2d 2d 20 34 0a 20 20 20 20 49  M t1; -- 4.    I
04a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
04b0: 4c 45 43 54 20 72 61 6e 64 73 74 72 28 34 30 30  LECT randstr(400
04c0: 2c 34 30 30 29 2c 20 72 61 6e 64 73 74 72 28 34  ,400), randstr(4
04d0: 30 30 2c 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  00,400) FROM t1;
04e0: 20 2d 2d 20 38 0a 20 20 20 20 49 4e 53 45 52 54   -- 8.    INSERT
04f0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
0500: 72 61 6e 64 73 74 72 28 34 30 30 2c 34 30 30 29  randstr(400,400)
0510: 2c 20 72 61 6e 64 73 74 72 28 34 30 30 2c 34 30  , randstr(400,40
0520: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 31  0) FROM t1; -- 1
0530: 36 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  6.    INSERT INT
0540: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
0550: 73 74 72 28 34 30 30 2c 34 30 30 29 2c 20 72 61  str(400,400), ra
0560: 6e 64 73 74 72 28 34 30 30 2c 34 30 30 29 20 46  ndstr(400,400) F
0570: 52 4f 4d 20 74 31 3b 20 2d 2d 20 33 32 0a 20 20  ROM t1; -- 32.  
0580: 7d 0a 7d 20 7b 7d 0a 0a 73 65 74 20 3a 3a 63 6b  }.} {}..set ::ck
0590: 73 75 6d 20 5b 65 78 65 63 73 71 6c 20 7b 53 45  sum [execsql {SE
05a0: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
05b0: 29 20 46 52 4f 4d 20 74 31 7d 5d 0a 70 72 6f 63  ) FROM t1}].proc
05c0: 20 63 68 65 63 6b 5f 64 62 20 7b 74 65 73 74 6e   check_db {testn
05d0: 61 6d 65 7d 20 7b 0a 0a 20 20 23 20 4d 61 6b 65  ame} {..  # Make
05e0: 20 73 75 72 65 20 6e 6f 20 49 2f 4f 20 65 72 72   sure no I/O err
05f0: 6f 72 73 20 61 72 65 20 73 69 6d 75 6c 61 74 65  ors are simulate
0600: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 2e 0a  d in this proc..
0610: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69    set ::sqlite_i
0620: 6f 5f 65 72 72 6f 72 5f 68 69 74 20 30 0a 20 20  o_error_hit 0.  
0630: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f  set ::sqlite_io_
0640: 65 72 72 6f 72 5f 70 65 72 73 69 73 74 20 30 0a  error_persist 0.
0650: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69    set ::sqlite_i
0660: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
0670: 30 0a 0a 20 20 23 20 52 75 6e 20 61 6e 20 69 6e  0..  # Run an in
0680: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 20 49  tegrity-check. I
0690: 66 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  f "disk I/O erro
06a0: 72 22 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  r" is returned, 
06b0: 74 68 65 0a 20 20 23 20 70 61 67 65 72 20 6d 75  the.  # pager mu
06c0: 73 74 20 62 65 20 69 6e 20 65 72 72 6f 72 20 73  st be in error s
06d0: 74 61 74 65 2e 20 49 6e 20 74 68 69 73 20 63 61  tate. In this ca
06e0: 73 65 20 6f 70 65 6e 20 61 20 6e 65 77 20 64 61  se open a new da
06f0: 74 61 62 61 73 65 0a 20 20 23 20 63 6f 6e 6e 65  tabase.  # conne
0700: 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
0710: 2c 20 74 72 79 20 61 20 52 4f 4c 4c 42 41 43 4b  , try a ROLLBACK
0720: 2c 20 69 6e 20 63 61 73 65 20 61 20 74 72 61 6e  , in case a tran
0730: 73 61 63 74 69 6f 6e 20 0a 20 20 23 20 69 73 20  saction .  # is 
0740: 73 74 69 6c 6c 20 61 63 74 69 76 65 2e 0a 20 20  still active..  
0750: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 65  set rc [catch {e
0760: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69  xecsql {PRAGMA i
0770: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 7d  ntegrity_check}}
0780: 20 6d 73 67 5d 0a 20 20 69 66 20 7b 24 72 63 20   msg].  if {$rc 
0790: 26 26 20 28 24 6d 73 67 20 65 71 20 22 64 69 73  && ($msg eq "dis
07a0: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 20 7c 7c 20  k I/O error" || 
07b0: 24 6d 73 67 20 65 71 20 22 64 61 74 61 62 61 73  $msg eq "databas
07c0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 7d 20 7b  e is locked")} {
07d0: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
07e0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
07f0: 74 2e 64 62 0a 20 20 20 20 73 65 74 20 72 65 66  t.db.    set ref
0800: 63 6e 74 20 30 0a 20 20 7d 20 65 6c 73 65 20 7b  cnt 0.  } else {
0810: 0a 20 20 20 20 69 66 20 7b 24 72 63 20 7c 7c 20  .    if {$rc || 
0820: 24 6d 73 67 20 6e 65 20 22 6f 6b 22 7d 20 7b 0a  $msg ne "ok"} {.
0830: 20 20 20 20 20 20 65 72 72 6f 72 20 24 6d 73 67        error $msg
0840: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68  .    }.    catch
0850: 20 7b 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41   {execsql ROLLBA
0860: 43 4b 7d 0a 20 20 7d 0a 0a 20 20 23 20 43 68 65  CK}.  }..  # Che
0870: 63 6b 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ck that the data
0880: 62 61 73 65 20 63 68 65 63 6b 73 75 6d 20 69 73  base checksum is
0890: 20 73 74 69 6c 6c 20 24 3a 3a 63 6b 73 75 6d 2c   still $::cksum,
08a0: 20 61 6e 64 20 74 68 61 74 0a 20 20 23 20 74 68   and that.  # th
08b0: 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
08c0: 6b 20 70 61 73 73 65 73 2e 0a 20 20 73 65 74 20  k passes..  set 
08d0: 63 6b 20 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c  ck [execsql {SEL
08e0: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
08f0: 20 46 52 4f 4d 20 74 31 7d 5d 0a 20 20 64 6f 5f   FROM t1}].  do_
0900: 74 65 73 74 20 24 7b 74 65 73 74 6e 61 6d 65 7d  test ${testname}
0910: 2e 63 6b 73 75 6d 20 5b 6c 69 73 74 20 73 65 74  .cksum [list set
0920: 20 63 6b 20 24 63 6b 5d 20 24 3a 3a 63 6b 73 75   ck $ck] $::cksu
0930: 6d 0a 20 20 69 6e 74 65 67 72 69 74 79 5f 63 68  m.  integrity_ch
0940: 65 63 6b 20 24 7b 74 65 73 74 6e 61 6d 65 7d 2e  eck ${testname}.
0950: 69 6e 74 65 67 72 69 74 79 0a 20 20 64 6f 5f 74  integrity.  do_t
0960: 65 73 74 20 24 7b 74 65 73 74 6e 61 6d 65 7d 2e  est ${testname}.
0970: 72 65 66 63 6e 74 20 7b 0a 20 20 20 20 6c 69 6e  refcnt {.    lin
0980: 64 65 78 20 5b 73 71 6c 69 74 65 33 5f 70 61 67  dex [sqlite3_pag
0990: 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 5d  er_refcounts db]
09a0: 20 30 0a 20 20 7d 20 30 0a 7d 0a 0a 63 68 65 63   0.  } 0.}..chec
09b0: 6b 5f 64 62 20 69 6f 65 72 72 32 2d 32 0a 0a 73  k_db ioerr2-2..s
09c0: 65 74 20 73 71 6c 20 7b 0a 20 20 50 52 41 47 4d  et sql {.  PRAGM
09d0: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
09e0: 30 3b 0a 20 20 50 52 41 47 4d 41 20 64 65 66 61  0;.  PRAGMA defa
09f0: 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 20 3d  ult_cache_size =
0a00: 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20   10;.  BEGIN;.  
0a10: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
0a20: 48 45 52 45 20 28 6f 69 64 25 37 29 3d 3d 30 3b  HERE (oid%7)==0;
0a30: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0a40: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72  1 SELECT randstr
0a50: 28 34 30 30 2c 34 30 30 29 2c 20 72 61 6e 64 73  (400,400), rands
0a60: 74 72 28 34 30 30 2c 34 30 30 29 20 0a 20 20 20  tr(400,400) .   
0a70: 20 57 48 45 52 45 20 28 72 61 6e 64 6f 6d 28 29   WHERE (random()
0a80: 25 37 29 3d 3d 30 3b 0a 20 20 55 50 44 41 54 45  %7)==0;.  UPDATE
0a90: 20 74 31 20 53 45 54 20 61 20 3d 20 72 61 6e 64   t1 SET a = rand
0aa0: 73 74 72 28 34 30 30 2c 34 30 30 29 2c 20 62 20  str(400,400), b 
0ab0: 3d 20 72 61 6e 64 73 74 72 28 34 30 30 2c 34 30  = randstr(400,40
0ac0: 30 29 20 0a 20 20 20 20 57 48 45 52 45 20 28 72  0) .    WHERE (r
0ad0: 61 6e 64 6f 6d 28 29 25 37 29 3d 3d 30 3b 0a 20  andom()%7)==0;. 
0ae0: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 7d 0a 0a 66 6f   ROLLBACK;.}..fo
0af0: 72 65 61 63 68 20 62 50 65 72 73 69 73 74 20 5b  reach bPersist [
0b00: 6c 69 73 74 20 30 20 31 5d 20 7b 0a 20 20 73 65  list 0 1] {.  se
0b10: 74 20 3a 3a 67 6f 20 31 0a 20 20 66 6f 72 20 7b  t ::go 1.  for {
0b20: 73 65 74 20 3a 3a 4e 20 31 7d 20 7b 24 3a 3a 67  set ::N 1} {$::g
0b30: 6f 7d 20 7b 69 6e 63 72 20 3a 3a 4e 7d 20 7b 0a  o} {incr ::N} {.
0b40: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
0b50: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
0b60: 2e 64 62 0a 20 20 20 20 73 65 74 20 3a 3a 73 71  .db.    set ::sq
0b70: 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  lite_io_error_hi
0b80: 74 20 30 0a 20 20 20 20 73 65 74 20 3a 3a 73 71  t 0.    set ::sq
0b90: 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  lite_io_error_pe
0ba0: 72 73 69 73 74 20 24 62 50 65 72 73 69 73 74 0a  rsist $bPersist.
0bb0: 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65      set ::sqlite
0bc0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
0bd0: 67 20 24 3a 3a 4e 0a 0a 20 20 20 20 66 6f 72 65  g $::N..    fore
0be0: 61 63 68 20 7b 3a 3a 67 6f 20 72 65 73 7d 20 5b  ach {::go res} [
0bf0: 63 61 74 63 68 73 71 6c 20 24 73 71 6c 5d 20 7b  catchsql $sql] {
0c00: 7d 0a 20 20 20 20 63 68 65 63 6b 5f 64 62 20 69  }.    check_db i
0c10: 6f 65 72 72 32 2d 33 2e 24 62 50 65 72 73 69 73  oerr2-3.$bPersis
0c20: 74 2e 24 3a 3a 4e 0a 20 20 7d 0a 7d 0a 66 6f 72  t.$::N.  }.}.for
0c30: 65 61 63 68 20 62 50 65 72 73 69 73 74 20 5b 6c  each bPersist [l
0c40: 69 73 74 20 30 20 31 5d 20 7b 0a 20 20 73 65 74  ist 0 1] {.  set
0c50: 20 3a 3a 67 6f 20 31 0a 20 20 66 6f 72 20 7b 73   ::go 1.  for {s
0c60: 65 74 20 3a 3a 4e 20 31 7d 20 7b 24 3a 3a 67 6f  et ::N 1} {$::go
0c70: 7d 20 7b 69 6e 63 72 20 3a 3a 4e 7d 20 7b 0a 20  } {incr ::N} {. 
0c80: 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f     set ::sqlite_
0c90: 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 30 0a 20  io_error_hit 0. 
0ca0: 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f     set ::sqlite_
0cb0: 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73 74  io_error_persist
0cc0: 20 24 62 50 65 72 73 69 73 74 0a 20 20 20 20 73   $bPersist.    s
0cd0: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65  et ::sqlite_io_e
0ce0: 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 24 3a 3a  rror_pending $::
0cf0: 4e 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b  N..    foreach {
0d00: 3a 3a 67 6f 20 72 65 73 7d 20 5b 63 61 74 63 68  ::go res} [catch
0d10: 73 71 6c 20 24 73 71 6c 5d 20 7b 7d 0a 20 20 20  sql $sql] {}.   
0d20: 20 63 68 65 63 6b 5f 64 62 20 69 6f 65 72 72 32   check_db ioerr2
0d30: 2d 34 2e 5b 65 78 70 72 20 7b 24 62 50 65 72 73  -4.[expr {$bPers
0d40: 69 73 74 2b 32 7d 5d 2e 24 3a 3a 4e 0a 20 20 7d  ist+2}].$::N.  }
0d50: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6f 65 72  .}..do_test ioer
0d60: 72 32 2d 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  r2-5 {.  execsql
0d70: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
0d80: 42 4c 45 20 74 32 20 41 53 20 53 45 4c 45 43 54  BLE t2 AS SELECT
0d90: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
0da0: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
0db0: 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 7d 0a  e = memory;.  }.
0dc0: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69    set ::sqlite_i
0dd0: 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73 74 20  o_error_persist 
0de0: 30 0a 20 20 73 65 74 20 3a 3a 67 6f 20 31 0a 20  0.  set ::go 1. 
0df0: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
0e00: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 3a 3a  .    for {set ::
0e10: 4e 20 32 7d 20 7b 24 3a 3a 4e 3c 32 30 30 7d 20  N 2} {$::N<200} 
0e20: 7b 69 6e 63 72 20 3a 3a 4e 7d 20 7b 0a 20 20 20  {incr ::N} {.   
0e30: 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45     db eval {SELE
0e40: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
0e50: 52 45 20 72 6f 77 69 64 20 49 4e 20 28 31 2c 20  RE rowid IN (1, 
0e60: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 29 7d 20  5, 10, 15, 20)} 
0e70: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a  {.        set ::
0e80: 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f  sqlite_io_error_
0e90: 68 69 74 20 30 0a 20 20 20 20 20 20 20 20 73 65  hit 0.        se
0ea0: 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72  t ::sqlite_io_er
0eb0: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 24 3a 3a 4e  ror_pending $::N
0ec0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c  .        set sql
0ed0: 20 7b 55 50 44 41 54 45 20 74 32 20 53 45 54 20   {UPDATE t2 SET 
0ee0: 62 20 3d 20 72 61 6e 64 73 74 72 28 34 30 30 2c  b = randstr(400,
0ef0: 34 30 30 29 7d 0a 20 20 20 20 20 20 20 20 66 6f  400)}.        fo
0f00: 72 65 61 63 68 20 7b 3a 3a 67 6f 20 72 65 73 7d  reach {::go res}
0f10: 20 5b 63 61 74 63 68 73 71 6c 20 24 73 71 6c 5d   [catchsql $sql]
0f20: 20 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   {}.      }.    
0f30: 7d 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 6c 69 73  }.  } msg].  lis
0f40: 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20  t $rc $msg.} {1 
0f50: 7b 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  {callback reques
0f60: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 7d  ted query abort}
0f70: 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     }..finish_test.