/ Hex Artifact Content
Login

Artifact aca09f9b303e2e69a42b61298e6e659d92e5c532:


0000: 23 20 32 30 30 31 20 4f 63 74 6f 62 65 72 20 31  # 2001 October 1
0010: 32 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  2.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an 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 2a 2a 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73  ry.  The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   of this file is
01c0: 20 74 65 73 74 69 6e 67 20 66 6f 72 20 63 6f 72   testing for cor
01d0: 72 65 63 74 20 68 61 6e 64 6c 69 6e 67 20 6f 66  rect handling of
01e0: 20 49 2f 4f 20 65 72 72 6f 72 73 0a 23 20 73 75   I/O errors.# su
01f0: 63 68 20 61 73 20 77 72 69 74 65 73 20 66 61 69  ch as writes fai
0200: 6c 69 6e 67 20 62 65 63 61 75 73 65 20 74 68 65  ling because the
0210: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2e 0a 23   disk is full..#
0220: 20 0a 23 20 54 68 65 20 74 65 73 74 73 20 69 6e   .# The tests in
0230: 20 74 68 69 73 20 66 69 6c 65 20 75 73 65 20 73   this file use s
0240: 70 65 63 69 61 6c 20 66 61 63 69 6c 69 74 69 65  pecial facilitie
0250: 73 20 74 68 61 74 20 61 72 65 20 6f 6e 6c 79 0a  s that are only.
0260: 23 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  # available in t
0270: 68 65 20 53 51 4c 69 74 65 20 74 65 73 74 20 66  he SQLite test f
0280: 69 78 74 75 72 65 2e 0a 23 0a 23 20 24 49 64 3a  ixture..#.# $Id:
0290: 20 69 6f 65 72 72 2e 74 65 73 74 2c 76 20 31 2e   ioerr.test,v 1.
02a0: 32 32 20 32 30 30 36 2f 30 31 2f 30 36 20 31 34  22 2006/01/06 14
02b0: 3a 33 32 3a 32 30 20 64 72 68 20 45 78 70 20 24  :32:20 drh Exp $
02c0: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
02d0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
02e0: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
02f0: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a  dir/tester.tcl..
0300: 0a 23 20 49 66 20 53 51 4c 49 54 45 5f 44 45 46  .# If SQLITE_DEF
0310: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
0320: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20  is set to true, 
0330: 74 68 65 6e 20 61 20 73 69 6d 75 6c 61 74 65 64  then a simulated
0340: 20 49 4f 20 65 72 72 6f 72 0a 23 20 6f 6e 20 74   IO error.# on t
0350: 68 65 20 38 74 68 20 49 4f 20 6f 70 65 72 61 74  he 8th IO operat
0360: 69 6f 6e 20 69 6e 20 74 68 65 20 53 51 4c 20 73  ion in the SQL s
0370: 63 72 69 70 74 20 62 65 6c 6f 77 20 64 6f 65 73  cript below does
0380: 6e 27 74 20 72 65 70 6f 72 74 20 61 6e 20 65 72  n't report an er
0390: 72 6f 72 2e 0a 23 0a 23 20 54 68 69 73 20 69 73  ror..#.# This is
03a0: 20 62 65 63 61 75 73 65 20 74 68 65 20 38 74 68   because the 8th
03b0: 20 49 4f 20 63 61 6c 6c 20 61 74 74 65 6d 70 74   IO call attempt
03c0: 73 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 32  s to read page 2
03d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
03e0: 0a 23 20 66 69 6c 65 20 77 68 65 6e 20 74 68 65  .# file when the
03f0: 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
0400: 20 6f 6e 6c 79 20 31 20 70 61 67 65 2e 20 54 68   only 1 page. Th
0410: 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
0420: 74 65 63 74 73 20 74 68 61 74 0a 23 20 74 68 69  tects that.# thi
0430: 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 20 61  s has happened a
0440: 6e 64 20 73 75 70 70 72 65 73 73 65 73 20 74 68  nd suppresses th
0450: 65 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64  e error returned
0460: 20 62 79 20 74 68 65 20 4f 53 20 6c 61 79 65 72   by the OS layer
0470: 2e 0a 23 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73  ..#.do_ioerr_tes
0480: 74 20 69 6f 65 72 72 2d 31 20 2d 73 71 6c 70 72  t ioerr-1 -sqlpr
0490: 65 70 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  ep {.  SELECT * 
04a0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
04b0: 65 72 3b 0a 7d 20 2d 73 71 6c 62 6f 64 79 20 7b  er;.} -sqlbody {
04c0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
04d0: 74 31 28 61 2c 62 2c 63 29 3b 0a 20 20 53 45 4c  t1(a,b,c);.  SEL
04e0: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
04f0: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 42 45 47 49  e_master;.  BEGI
0500: 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 0a 20  N TRANSACTION;. 
0510: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0520: 56 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20  VALUES(1,2,3);. 
0530: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0540: 56 41 4c 55 45 53 28 34 2c 35 2c 36 29 3b 0a 20  VALUES(4,5,6);. 
0550: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 53 45 4c   ROLLBACK;.  SEL
0560: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
0570: 20 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49   BEGIN TRANSACTI
0580: 4f 4e 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ON;.  INSERT INT
0590: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 2c  O t1 VALUES(1,2,
05a0: 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3);.  INSERT INT
05b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 35 2c  O t1 VALUES(4,5,
05c0: 36 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  6);.  COMMIT;.  
05d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
05e0: 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  ;.  DELETE FROM 
05f0: 74 31 20 57 48 45 52 45 20 61 3c 31 30 30 3b 0a  t1 WHERE a<100;.
0600: 7d 20 2d 65 78 63 6c 75 64 65 20 5b 65 78 70 72  } -exclude [expr
0610: 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5b   [string match [
0620: 65 78 65 63 73 71 6c 20 7b 70 72 61 67 6d 61 20  execsql {pragma 
0630: 61 75 74 6f 5f 76 61 63 75 75 6d 7d 5d 20 31 5d  auto_vacuum}] 1]
0640: 20 3f 20 38 20 3a 20 30 5d 0a 0a 23 20 54 65 73   ? 8 : 0]..# Tes
0650: 74 20 66 6f 72 20 49 4f 20 65 72 72 6f 72 73 20  t for IO errors 
0660: 64 75 72 69 6e 67 20 61 20 56 41 43 55 55 4d 2e  during a VACUUM.
0670: 20 0a 23 0a 23 20 54 68 65 20 66 69 72 73 74 20   .#.# The first 
0680: 49 4f 20 63 61 6c 6c 20 69 73 20 65 78 63 6c 75  IO call is exclu
0690: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65 73  ded from the tes
06a0: 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 61 74 74  t. This call att
06b0: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 0a 23 20  empts to read.# 
06c0: 74 68 65 20 66 69 6c 65 2d 68 65 61 64 65 72 20  the file-header 
06d0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
06e0: 20 64 61 74 61 62 61 73 65 20 75 73 65 64 20 62   database used b
06f0: 79 20 56 41 43 55 55 4d 2e 20 53 69 6e 63 65 20  y VACUUM. Since 
0700: 74 68 65 0a 23 20 64 61 74 61 62 61 73 65 20 64  the.# database d
0710: 6f 65 73 6e 27 74 20 65 78 69 73 74 20 61 74 20  oesn't exist at 
0720: 74 68 61 74 20 70 6f 69 6e 74 2c 20 74 68 65 20  that point, the 
0730: 49 4f 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20  IO error is not 
0740: 64 65 74 65 63 74 65 64 2e 0a 23 20 0a 23 20 41  detected..# .# A
0750: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
0760: 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 65  auto-vacuum is e
0770: 6e 61 62 6c 65 64 2c 20 74 68 65 20 31 32 74 68  nabled, the 12th
0780: 20 49 4f 20 65 72 72 6f 72 20 69 73 20 6e 6f 74   IO error is not
0790: 20 0a 23 20 64 65 74 65 63 74 65 64 2e 20 53 61   .# detected. Sa
07a0: 6d 65 20 72 65 61 73 6f 6e 20 61 73 20 74 68 65  me reason as the
07b0: 20 38 74 68 20 69 6e 20 74 68 65 20 74 65 73 74   8th in the test
07c0: 20 63 61 73 65 20 61 62 6f 76 65 2e 0a 23 20 0a   case above..# .
07d0: 69 66 63 61 70 61 62 6c 65 20 76 61 63 75 75 6d  ifcapable vacuum
07e0: 20 7b 0a 20 20 64 6f 5f 69 6f 65 72 72 5f 74 65   {.  do_ioerr_te
07f0: 73 74 20 69 6f 65 72 72 2d 32 20 2d 63 6b 73 75  st ioerr-2 -cksu
0800: 6d 20 74 72 75 65 20 2d 73 71 6c 70 72 65 70 20  m true -sqlprep 
0810: 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 20 0a 20  { .    BEGIN; . 
0820: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0830: 74 31 28 61 2c 20 62 2c 20 63 29 3b 20 0a 20 20  t1(a, b, c); .  
0840: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0850: 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 73   VALUES(1, rands
0860: 74 72 28 35 30 2c 35 30 29 2c 20 72 61 6e 64 73  tr(50,50), rands
0870: 74 72 28 35 30 2c 35 30 29 29 3b 20 0a 20 20 20  tr(50,50)); .   
0880: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0890: 53 45 4c 45 43 54 20 61 2b 32 2c 20 62 7c 7c 27  SELECT a+2, b||'
08a0: 2d 27 7c 7c 72 6f 77 69 64 2c 20 63 7c 7c 27 2d  -'||rowid, c||'-
08b0: 27 7c 7c 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  '||rowid FROM t1
08c0: 3b 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ; .    INSERT IN
08d0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 34  TO t1 SELECT a+4
08e0: 2c 20 62 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64 2c  , b||'-'||rowid,
08f0: 20 63 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64 20 46   c||'-'||rowid F
0900: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
0910: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
0920: 54 20 61 2b 38 2c 20 62 7c 7c 27 2d 27 7c 7c 72  T a+8, b||'-'||r
0930: 6f 77 69 64 2c 20 63 7c 7c 27 2d 27 7c 7c 72 6f  owid, c||'-'||ro
0940: 77 69 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  wid FROM t1;.   
0950: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0960: 53 45 4c 45 43 54 20 61 2b 31 36 2c 20 62 7c 7c  SELECT a+16, b||
0970: 27 2d 27 7c 7c 72 6f 77 69 64 2c 20 63 7c 7c 27  '-'||rowid, c||'
0980: 2d 27 7c 7c 72 6f 77 69 64 20 46 52 4f 4d 20 74  -'||rowid FROM t
0990: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
09a0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 33  TO t1 SELECT a+3
09b0: 32 2c 20 62 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64  2, b||'-'||rowid
09c0: 2c 20 63 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64 20  , c||'-'||rowid 
09d0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
09e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
09f0: 43 54 20 61 2b 36 34 2c 20 62 7c 7c 27 2d 27 7c  CT a+64, b||'-'|
0a00: 7c 72 6f 77 69 64 2c 20 63 7c 7c 27 2d 27 7c 7c  |rowid, c||'-'||
0a10: 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 3b 0a 20  rowid FROM t1;. 
0a20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0a30: 31 20 53 45 4c 45 43 54 20 61 2b 31 32 38 2c 20  1 SELECT a+128, 
0a40: 62 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64 2c 20 63  b||'-'||rowid, c
0a50: 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64 20 46 52 4f  ||'-'||rowid FRO
0a60: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
0a70: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0a80: 31 2c 20 72 61 6e 64 73 74 72 28 36 30 30 2c 36  1, randstr(600,6
0a90: 30 30 29 2c 20 72 61 6e 64 73 74 72 28 36 30 30  00), randstr(600
0aa0: 2c 36 30 30 29 29 3b 0a 20 20 20 20 43 52 45 41  ,600));.    CREA
0ab0: 54 45 20 54 41 42 4c 45 20 74 32 20 41 53 20 53  TE TABLE t2 AS S
0ac0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
0ad0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0ae0: 45 20 74 33 20 41 53 20 53 45 4c 45 43 54 20 2a  E t3 AS SELECT *
0af0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f   FROM t1;.    CO
0b00: 4d 4d 49 54 3b 0a 20 20 20 20 44 52 4f 50 20 54  MMIT;.    DROP T
0b10: 41 42 4c 45 20 74 32 3b 0a 20 20 7d 20 2d 73 71  ABLE t2;.  } -sq
0b20: 6c 62 6f 64 79 20 7b 0a 20 20 20 20 56 41 43 55  lbody {.    VACU
0b30: 55 4d 3b 0a 20 20 7d 20 2d 65 78 63 6c 75 64 65  UM;.  } -exclude
0b40: 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 20 20 31   [list \.      1
0b50: 20 5b 65 78 70 72 20 5b 73 74 72 69 6e 67 20 6d   [expr [string m
0b60: 61 74 63 68 20 5b 65 78 65 63 73 71 6c 20 7b 70  atch [execsql {p
0b70: 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75  ragma auto_vacuu
0b80: 6d 7d 5d 20 31 5d 3f 31 32 3a 2d 31 5d 5d 0a 7d  m}] 1]?12:-1]].}
0b90: 0a 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74 20  ..do_ioerr_test 
0ba0: 69 6f 65 72 72 2d 33 20 2d 74 63 6c 70 72 65 70  ioerr-3 -tclprep
0bb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0bc0: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
0bd0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42  size = 10;.    B
0be0: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
0bf0: 20 54 41 42 4c 45 20 61 62 63 28 61 29 3b 0a 20   TABLE abc(a);. 
0c00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
0c10: 62 63 20 56 41 4c 55 45 53 28 72 61 6e 64 73 74  bc VALUES(randst
0c20: 72 28 31 35 30 30 2c 31 35 30 30 29 29 3b 20 2d  r(1500,1500)); -
0c30: 2d 20 50 61 67 65 20 34 20 69 73 20 6f 76 65 72  - Page 4 is over
0c40: 66 6c 6f 77 0a 20 20 7d 0a 20 20 66 6f 72 20 7b  flow.  }.  for {
0c50: 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 31 35 30  set i 0} {$i<150
0c60: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
0c70: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
0c80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
0c90: 20 56 41 4c 55 45 53 28 72 61 6e 64 73 74 72 28   VALUES(randstr(
0ca0: 31 30 30 2c 31 30 30 29 29 3b 20 0a 20 20 20 20  100,100)); .    
0cb0: 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
0cc0: 43 4f 4d 4d 49 54 0a 7d 20 2d 73 71 6c 62 6f 64  COMMIT.} -sqlbod
0cd0: 79 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  y {.  CREATE TAB
0ce0: 4c 45 20 61 62 63 32 28 61 29 3b 0a 20 20 42 45  LE abc2(a);.  BE
0cf0: 47 49 4e 3b 0a 20 20 44 45 4c 45 54 45 20 46 52  GIN;.  DELETE FR
0d00: 4f 4d 20 61 62 63 20 57 48 45 52 45 20 6c 65 6e  OM abc WHERE len
0d10: 67 74 68 28 61 29 3e 31 30 30 3b 0a 20 20 55 50  gth(a)>100;.  UP
0d20: 44 41 54 45 20 61 62 63 20 53 45 54 20 61 20 3d  DATE abc SET a =
0d30: 20 72 61 6e 64 73 74 72 28 39 30 2c 39 30 29 3b   randstr(90,90);
0d40: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 43 52 45  .  COMMIT;.  CRE
0d50: 41 54 45 20 54 41 42 4c 45 20 61 62 63 33 28 61  ATE TABLE abc3(a
0d60: 29 3b 0a 7d 20 0a 0a 23 20 54 65 73 74 20 49 4f  );.} ..# Test IO
0d70: 20 65 72 72 6f 72 73 20 74 68 61 74 20 63 61 6e   errors that can
0d80: 20 6f 63 63 75 72 20 72 65 74 72 69 65 76 69 6e   occur retrievin
0d90: 67 20 61 20 72 65 63 6f 72 64 20 68 65 61 64 65  g a record heade
0da0: 72 20 74 68 61 74 20 66 6c 6f 77 73 20 6f 76 65  r that flows ove
0db0: 72 0a 23 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72  r.# onto an over
0dc0: 66 6c 6f 77 20 70 61 67 65 2e 0a 64 6f 5f 69 6f  flow page..do_io
0dd0: 65 72 72 5f 74 65 73 74 20 69 6f 65 72 72 2d 34  err_test ioerr-4
0de0: 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 73 65   -tclprep {.  se
0df0: 74 20 73 71 6c 20 22 43 52 45 41 54 45 20 54 41  t sql "CREATE TA
0e00: 42 4c 45 20 61 62 63 28 61 31 22 0a 20 20 66 6f  BLE abc(a1".  fo
0e10: 72 20 7b 73 65 74 20 69 20 32 7d 20 7b 24 69 3c  r {set i 2} {$i<
0e20: 31 33 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  1300} {incr i} {
0e30: 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20  .    append sql 
0e40: 22 2c 20 61 24 69 22 0a 20 20 7d 0a 20 20 61 70  ", a$i".  }.  ap
0e50: 70 65 6e 64 20 73 71 6c 20 22 29 3b 22 0a 20 20  pend sql ");".  
0e60: 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20 65  execsql $sql.  e
0e70: 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49  xecsql {INSERT I
0e80: 4e 54 4f 20 61 62 63 20 28 61 31 29 20 56 41 4c  NTO abc (a1) VAL
0e90: 55 45 53 28 4e 55 4c 4c 29 7d 0a 7d 20 2d 73 71  UES(NULL)}.} -sq
0ea0: 6c 62 6f 64 79 20 7b 0a 20 53 45 4c 45 43 54 20  lbody {. SELECT 
0eb0: 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 7d 0a 0a 23  * FROM abc;.}..#
0ec0: 20 54 65 73 74 20 49 4f 20 65 72 72 6f 72 73 20   Test IO errors 
0ed0: 74 68 61 74 20 6d 61 79 20 6f 63 63 75 72 20 64  that may occur d
0ee0: 75 72 69 6e 67 20 61 20 6d 75 6c 74 69 2d 66 69  uring a multi-fi
0ef0: 6c 65 20 63 6f 6d 6d 69 74 2e 0a 23 0a 23 20 54  le commit..#.# T
0f00: 65 73 74 73 20 38 20 61 6e 64 20 31 37 20 61 72  ests 8 and 17 ar
0f10: 65 20 65 78 63 6c 75 64 65 64 20 77 68 65 6e 20  e excluded when 
0f20: 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 65  auto-vacuum is e
0f30: 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 73  nabled for the s
0f40: 61 6d 65 20 0a 23 20 72 65 61 73 6f 6e 20 61 73  ame .# reason as
0f50: 20 69 6e 20 74 65 73 74 20 63 61 73 65 73 20 69   in test cases i
0f60: 6f 65 72 72 2d 31 2e 58 58 58 0a 73 65 74 20 65  oerr-1.XXX.set e
0f70: 78 20 22 22 0a 69 66 20 7b 5b 73 74 72 69 6e 67  x "".if {[string
0f80: 20 6d 61 74 63 68 20 5b 65 78 65 63 73 71 6c 20   match [execsql 
0f90: 7b 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63  {pragma auto_vac
0fa0: 75 75 6d 7d 5d 20 31 5d 7d 20 7b 0a 20 20 73 65  uum}] 1]} {.  se
0fb0: 74 20 65 78 20 5b 6c 69 73 74 20 38 20 31 37 5d  t ex [list 8 17]
0fc0: 0a 7d 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74  .}.do_ioerr_test
0fd0: 20 69 6f 65 72 72 2d 35 20 2d 73 71 6c 70 72 65   ioerr-5 -sqlpre
0fe0: 70 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65  p {.  ATTACH 'te
0ff0: 73 74 32 2e 64 62 27 20 41 53 20 74 65 73 74 32  st2.db' AS test2
1000: 3b 0a 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a 20  ;.} -sqlbody {. 
1010: 20 42 45 47 49 4e 3b 0a 20 20 43 52 45 41 54 45   BEGIN;.  CREATE
1020: 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 29   TABLE t1(a,b,c)
1030: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
1040: 20 74 65 73 74 32 2e 74 32 28 61 2c 62 2c 63 29   test2.t2(a,b,c)
1050: 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 2d 65  ;.  COMMIT;.} -e
1060: 78 63 6c 75 64 65 20 24 65 78 0a 0a 23 20 54 65  xclude $ex..# Te
1070: 73 74 20 49 4f 20 65 72 72 6f 72 73 20 77 68 65  st IO errors whe
1080: 6e 20 72 65 70 6c 61 79 69 6e 67 20 74 77 6f 20  n replaying two 
1090: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 20 66 72 6f  hot journals fro
10a0: 6d 20 61 20 32 2d 66 69 6c 65 20 0a 23 20 74 72  m a 2-file .# tr
10b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
10c0: 74 65 73 74 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  test only runs o
10d0: 6e 20 55 4e 49 58 2e 0a 69 66 63 61 70 61 62 6c  n UNIX..ifcapabl
10e0: 65 20 63 72 61 73 68 74 65 73 74 20 7b 0a 20 20  e crashtest {.  
10f0: 69 66 20 7b 21 5b 63 61 74 63 68 20 7b 73 71 6c  if {![catch {sql
1100: 69 74 65 33 20 2d 68 61 73 5f 63 6f 64 65 63 7d  ite3 -has_codec}
1110: 20 72 5d 20 26 26 20 21 24 72 7d 20 7b 0a 20 20   r] && !$r} {.  
1120: 20 20 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74 20    do_ioerr_test 
1130: 69 6f 65 72 72 2d 36 20 2d 74 63 6c 70 72 65 70  ioerr-6 -tclprep
1140: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
1150: 20 7b 0a 20 20 20 20 20 20 20 20 41 54 54 41 43   {.        ATTAC
1160: 48 20 27 74 65 73 74 32 2e 64 62 27 20 61 73 20  H 'test2.db' as 
1170: 61 75 78 3b 0a 20 20 20 20 20 20 20 20 43 52 45  aux;.        CRE
1180: 41 54 45 20 54 41 42 4c 45 20 74 78 28 61 2c 20  ATE TABLE tx(a, 
1190: 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  b);.        CREA
11a0: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 79 28  TE TABLE aux.ty(
11b0: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  a, b);.      }. 
11c0: 20 20 20 20 20 73 65 74 20 72 63 20 5b 63 72 61       set rc [cra
11d0: 73 68 73 71 6c 20 32 20 74 65 73 74 32 2e 64 62  shsql 2 test2.db
11e0: 2d 6a 6f 75 72 6e 61 6c 20 7b 0a 20 20 20 20 20  -journal {.     
11f0: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32     ATTACH 'test2
1200: 2e 64 62 27 20 61 73 20 61 75 78 3b 0a 20 20 20  .db' as aux;.   
1210: 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
1220: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
1230: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
1240: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1250: 20 61 75 78 2e 74 32 28 61 2c 20 62 2c 20 63 29   aux.t2(a, b, c)
1260: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
1270: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
1280: 63 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 4d 4d  c);.        COMM
1290: 49 54 3b 0a 20 20 20 20 20 20 7d 5d 0a 20 20 20  IT;.      }].   
12a0: 20 20 20 69 66 20 7b 24 72 63 21 3d 22 31 20 7b     if {$rc!="1 {
12b0: 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 65 78  child process ex
12c0: 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c 6c 79 7d  ited abnormally}
12d0: 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 65 72 72  "} {.        err
12e0: 6f 72 20 22 57 72 6f 6e 67 20 65 72 72 6f 72 20  or "Wrong error 
12f0: 6d 65 73 73 61 67 65 3a 20 24 72 63 22 0a 20 20  message: $rc".  
1300: 20 20 20 20 7d 0a 20 20 20 20 7d 20 2d 73 71 6c      }.    } -sql
1310: 62 6f 64 79 20 7b 0a 20 20 20 20 20 20 53 45 4c  body {.      SEL
1320: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
1330: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20 20  e_master;.      
1340: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 75  SELECT * FROM au
1350: 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  x.sqlite_master;
1360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 0a 0a 23  .    }.  }.} ..#
1370: 20 54 65 73 74 20 68 61 6e 64 6c 69 6e 67 20 6f   Test handling o
1380: 66 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74  f IO errors that
1390: 20 6f 63 63 75 72 20 77 68 69 6c 65 20 72 6f 6c   occur while rol
13a0: 6c 69 6e 67 20 62 61 63 6b 20 68 6f 74 20 6a 6f  ling back hot jo
13b0: 75 72 6e 61 6c 0a 23 20 66 69 6c 65 73 2e 0a 23  urnal.# files..#
13c0: 0a 23 20 54 68 65 73 65 20 74 65 73 74 73 20 63  .# These tests c
13d0: 61 6e 27 74 20 62 65 20 72 75 6e 20 6f 6e 20 77  an't be run on w
13e0: 69 6e 64 6f 77 73 20 62 65 63 61 75 73 65 20 74  indows because t
13f0: 68 65 20 77 69 6e 64 6f 77 73 20 76 65 72 73 69  he windows versi
1400: 6f 6e 20 6f 66 20 0a 23 20 53 51 4c 69 74 65 20  on of .# SQLite 
1410: 68 6f 6c 64 73 20 61 20 6d 61 6e 64 61 74 6f 72  holds a mandator
1420: 79 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  y exclusive lock
1430: 20 6f 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   on journal file
1440: 73 20 69 74 20 68 61 73 20 6f 70 65 6e 2e 0a 23  s it has open..#
1450: 0a 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f  .if {$tcl_platfo
1460: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77  rm(platform)!="w
1470: 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 64 6f 5f  indows"} {.  do_
1480: 69 6f 65 72 72 5f 74 65 73 74 20 69 6f 65 72 72  ioerr_test ioerr
1490: 2d 37 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20  -7 -tclprep {.  
14a0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73    db close.    s
14b0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 32  qlite3 db2 test2
14c0: 2e 64 62 0a 20 20 20 20 64 62 32 20 65 76 61 6c  .db.    db2 eval
14d0: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
14e0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 30 3b  synchronous = 0;
14f0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
1500: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
1510: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1520: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
1530: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
1540: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1550: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
1560: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 70 79 5f  .    }.    copy_
1570: 66 69 6c 65 20 74 65 73 74 32 2e 64 62 20 74 65  file test2.db te
1580: 73 74 2e 64 62 0a 20 20 20 20 63 6f 70 79 5f 66  st.db.    copy_f
1590: 69 6c 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75  ile test2.db-jou
15a0: 72 6e 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rnal test.db-jou
15b0: 72 6e 61 6c 0a 20 20 20 20 64 62 32 20 63 6c 6f  rnal.    db2 clo
15c0: 73 65 0a 20 20 7d 20 2d 74 63 6c 62 6f 64 79 20  se.  } -tclbody 
15d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
15e0: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 64 62 20   test.db.    db 
15f0: 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  eval {.      SEL
1600: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
1610: 20 20 20 7d 0a 20 20 7d 20 2d 65 78 63 6c 75 64     }.  } -exclud
1620: 65 20 31 0a 7d 0a 0a 23 20 46 6f 72 20 74 65 73  e 1.}..# For tes
1630: 74 20 63 6f 76 65 72 61 67 65 3a 20 20 43 61 75  t coverage:  Cau
1640: 73 65 20 61 6e 20 49 2f 4f 20 66 61 69 6c 75 72  se an I/O failur
1650: 65 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  e while trying t
1660: 6f 20 72 65 61 64 20 61 0a 23 20 73 68 6f 72 74  o read a.# short
1670: 20 66 69 65 6c 64 20 28 6f 6e 65 20 74 68 61 74   field (one that
1680: 20 66 69 74 73 20 69 6e 74 6f 20 61 20 4d 65 6d   fits into a Mem
1690: 20 62 75 66 66 65 72 20 77 69 74 68 6f 75 74 20   buffer without 
16a0: 6d 61 6c 6c 6f 63 69 6e 67 0a 23 20 66 6f 72 20  mallocing.# for 
16b0: 73 70 61 63 65 29 2e 0a 23 0a 64 6f 5f 69 6f 65  space)..#.do_ioe
16c0: 72 72 5f 74 65 73 74 20 69 6f 65 72 72 2d 38 20  rr_test ioerr-8 
16d0: 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 65 78 65  -tclprep {.  exe
16e0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
16f0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
1700: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1710: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
1720: 64 73 74 72 28 32 30 30 2c 32 30 30 29 2c 20 72  dstr(200,200), r
1730: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
1740: 29 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 64 62 20  ), 2);.  }.  db 
1750: 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
1760: 64 62 20 74 65 73 74 2e 64 62 0a 7d 20 2d 73 71  db test.db.} -sq
1770: 6c 62 6f 64 79 20 7b 0a 20 20 53 45 4c 45 43 54  lbody {.  SELECT
1780: 20 63 20 46 52 4f 4d 20 74 31 3b 0a 7d 0a 0a 66   c FROM t1;.}..f
1790: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.