/ Hex Artifact Content
Login

Artifact 6ae2f783424e47a0033304808fe27789cf93e635:


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 6e 63 72 76 61 63 75 75 6d 5f 69 6f 65 72   incrvacuum_ioer
02a0: 72 2e 74 65 73 74 2c 76 20 31 2e 36 20 32 30 30  r.test,v 1.6 200
02b0: 38 2f 30 37 2f 31 32 20 31 34 3a 35 32 3a 32 30  8/07/12 14:52:20
02c0: 20 64 72 68 20 45 78 70 20 24 0a 0a 73 65 74 20   drh Exp $..set 
02d0: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
02e0: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
02f0: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0300: 73 74 65 72 2e 74 63 6c 0a 0a 23 20 49 66 20 74  ster.tcl..# If t
0310: 68 69 73 20 62 75 69 6c 64 20 6f 66 20 74 68 65  his build of the
0320: 20 6c 69 62 72 61 72 79 20 64 6f 65 73 20 6e 6f   library does no
0330: 74 20 73 75 70 70 6f 72 74 20 61 75 74 6f 2d 76  t support auto-v
0340: 61 63 75 75 6d 2c 20 6f 6d 69 74 20 74 68 69 73  acuum, omit this
0350: 0a 23 20 77 68 6f 6c 65 20 66 69 6c 65 2e 0a 69  .# whole file..i
0360: 66 63 61 70 61 62 6c 65 20 7b 21 61 75 74 6f 76  fcapable {!autov
0370: 61 63 75 75 6d 7d 20 7b 0a 20 20 66 69 6e 69 73  acuum} {.  finis
0380: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
0390: 7d 0a 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74  }..do_ioerr_test
03a0: 20 69 6e 63 72 76 61 63 75 75 6d 2d 69 6f 65 72   incrvacuum-ioer
03b0: 72 2d 31 20 2d 63 6b 73 75 6d 20 31 20 2d 73 71  r-1 -cksum 1 -sq
03c0: 6c 70 72 65 70 20 7b 0a 20 20 50 52 41 47 4d 41  lprep {.  PRAGMA
03d0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 27   auto_vacuum = '
03e0: 69 6e 63 72 65 6d 65 6e 74 61 6c 27 3b 0a 20 20  incremental';.  
03f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
0400: 28 61 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  (a);.  INSERT IN
0410: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 72 61  TO abc VALUES(ra
0420: 6e 64 73 74 72 28 31 35 30 30 2c 31 35 30 30 29  ndstr(1500,1500)
0430: 29 3b 0a 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a  );.} -sqlbody {.
0440: 20 20 42 45 47 49 4e 3b 0a 20 20 43 52 45 41 54    BEGIN;.  CREAT
0450: 45 20 54 41 42 4c 45 20 61 62 63 32 28 61 29 3b  E TABLE abc2(a);
0460: 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61  .  DELETE FROM a
0470: 62 63 3b 0a 20 20 50 52 41 47 4d 41 20 69 6e 63  bc;.  PRAGMA inc
0480: 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b  remental_vacuum;
0490: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 0a 0a 23  .  COMMIT;.} ..#
04a0: 20 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74 20 69   do_ioerr_test i
04b0: 6e 63 72 76 61 63 75 75 6d 2d 69 6f 65 72 72 2d  ncrvacuum-ioerr-
04c0: 33 20 2d 73 74 61 72 74 20 31 20 2d 63 6b 73 75  3 -start 1 -cksu
04d0: 6d 20 31 20 2d 74 63 6c 70 72 65 70 20 7b 0a 23  m 1 -tclprep {.#
04e0: 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 23 20 20     db eval {.#  
04f0: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
0500: 61 63 75 75 6d 20 3d 20 27 66 75 6c 6c 27 3b 0a  acuum = 'full';.
0510: 23 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  #     PRAGMA cac
0520: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 23 20  he_size = 10;.# 
0530: 20 20 20 20 42 45 47 49 4e 3b 0a 23 20 20 20 20      BEGIN;.#    
0540: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
0550: 63 28 61 2c 20 55 4e 49 51 55 45 28 61 29 29 3b  c(a, UNIQUE(a));
0560: 0a 23 20 20 20 7d 0a 23 20 20 20 66 6f 72 20 7b  .#   }.#   for {
0570: 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69 20 3c  set ii 0} {$ii <
0580: 20 32 35 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b   25} {incr ii} {
0590: 0a 23 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b  .#     db eval {
05a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
05b0: 56 41 4c 55 45 53 28 72 61 6e 64 73 74 72 28 31  VALUES(randstr(1
05c0: 35 30 30 2c 31 35 30 30 29 29 7d 0a 23 20 20 20  500,1500))}.#   
05d0: 7d 0a 23 20 20 20 64 62 20 65 76 61 6c 20 43 4f  }.#   db eval CO
05e0: 4d 4d 49 54 0a 23 20 7d 20 2d 73 71 6c 62 6f 64  MMIT.# } -sqlbod
05f0: 79 20 7b 0a 23 20 20 20 42 45 47 49 4e 3b 0a 23  y {.#   BEGIN;.#
0600: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61     DELETE FROM a
0610: 62 63 20 57 48 45 52 45 20 28 6f 69 64 25 33 29  bc WHERE (oid%3)
0620: 3d 3d 30 3b 0a 23 20 20 20 49 4e 53 45 52 54 20  ==0;.#   INSERT 
0630: 49 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20  INTO abc SELECT 
0640: 61 20 7c 7c 20 27 31 32 33 34 35 36 37 38 39 30  a || '1234567890
0650: 27 20 46 52 4f 4d 20 61 62 63 20 57 48 45 52 45  ' FROM abc WHERE
0660: 20 6f 69 64 25 32 3b 0a 23 20 20 20 43 52 45 41   oid%2;.#   CREA
0670: 54 45 20 49 4e 44 45 58 20 61 62 63 5f 69 20 4f  TE INDEX abc_i O
0680: 4e 20 61 62 63 28 61 29 3b 0a 23 20 20 20 44 45  N abc(a);.#   DE
0690: 4c 45 54 45 20 46 52 4f 4d 20 61 62 63 20 57 48  LETE FROM abc WH
06a0: 45 52 45 20 28 6f 69 64 25 32 29 3d 3d 30 3b 0a  ERE (oid%2)==0;.
06b0: 23 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20 61  #   DROP INDEX a
06c0: 62 63 5f 69 3b 0a 23 20 20 20 43 4f 4d 4d 49 54  bc_i;.#   COMMIT
06d0: 3b 0a 23 20 7d 0a 0a 64 6f 5f 69 6f 65 72 72 5f  ;.# }..do_ioerr_
06e0: 74 65 73 74 20 69 6e 63 72 76 61 63 75 75 6d 2d  test incrvacuum-
06f0: 69 6f 65 72 72 2d 32 20 2d 73 74 61 72 74 20 31  ioerr-2 -start 1
0700: 20 2d 63 6b 73 75 6d 20 31 20 2d 74 63 6c 70 72   -cksum 1 -tclpr
0710: 65 70 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  ep {.  db eval {
0720: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
0730: 5f 76 61 63 75 75 6d 20 3d 20 27 66 75 6c 6c 27  _vacuum = 'full'
0740: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  ;.    PRAGMA cac
0750: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
0760: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
0770: 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c  ATE TABLE abc(a,
0780: 20 55 4e 49 51 55 45 28 61 29 29 3b 0a 20 20 7d   UNIQUE(a));.  }
0790: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30  .  for {set ii 0
07a0: 7d 20 7b 24 69 69 20 3c 20 32 35 7d 20 7b 69 6e  } {$ii < 25} {in
07b0: 63 72 20 69 69 7d 20 7b 0a 20 20 20 20 64 62 20  cr ii} {.    db 
07c0: 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54  eval {INSERT INT
07d0: 4f 20 61 62 63 20 56 41 4c 55 45 53 28 72 61 6e  O abc VALUES(ran
07e0: 64 73 74 72 28 31 35 30 30 2c 31 35 30 30 29 29  dstr(1500,1500))
07f0: 7d 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20  }.  }.  db eval 
0800: 43 4f 4d 4d 49 54 0a 7d 20 2d 73 71 6c 62 6f 64  COMMIT.} -sqlbod
0810: 79 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 50  y {.  BEGIN;.  P
0820: 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61  RAGMA incrementa
0830: 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 44 45 4c 45  l_vacuum;.  DELE
0840: 54 45 20 46 52 4f 4d 20 61 62 63 20 57 48 45 52  TE FROM abc WHER
0850: 45 20 28 6f 69 64 25 33 29 3d 3d 30 3b 0a 20 20  E (oid%3)==0;.  
0860: 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74  PRAGMA increment
0870: 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 49 4e 53  al_vacuum;.  INS
0880: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c  ERT INTO abc SEL
0890: 45 43 54 20 61 20 7c 7c 20 27 31 32 33 34 35 36  ECT a || '123456
08a0: 37 38 39 30 27 20 46 52 4f 4d 20 61 62 63 20 57  7890' FROM abc W
08b0: 48 45 52 45 20 6f 69 64 25 32 3b 0a 20 20 50 52  HERE oid%2;.  PR
08c0: 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c  AGMA incremental
08d0: 5f 76 61 63 75 75 6d 3b 0a 20 20 43 52 45 41 54  _vacuum;.  CREAT
08e0: 45 20 49 4e 44 45 58 20 61 62 63 5f 69 20 4f 4e  E INDEX abc_i ON
08f0: 20 61 62 63 28 61 29 3b 0a 20 20 44 45 4c 45 54   abc(a);.  DELET
0900: 45 20 46 52 4f 4d 20 61 62 63 20 57 48 45 52 45  E FROM abc WHERE
0910: 20 28 6f 69 64 25 32 29 3d 3d 30 3b 0a 20 20 50   (oid%2)==0;.  P
0920: 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61  RAGMA incrementa
0930: 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 44 52 4f 50  l_vacuum;.  DROP
0940: 20 49 4e 44 45 58 20 61 62 63 5f 69 3b 0a 20 20   INDEX abc_i;.  
0950: 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74  PRAGMA increment
0960: 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 43 4f 4d  al_vacuum;.  COM
0970: 4d 49 54 3b 0a 7d 0a 0a 64 6f 5f 69 6f 65 72 72  MIT;.}..do_ioerr
0980: 5f 74 65 73 74 20 69 6e 63 72 76 61 63 75 75 6d  _test incrvacuum
0990: 2d 69 6f 65 72 72 2d 33 20 2d 73 74 61 72 74 20  -ioerr-3 -start 
09a0: 31 20 2d 63 6b 73 75 6d 20 31 20 2d 74 63 6c 70  1 -cksum 1 -tclp
09b0: 72 65 70 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  rep {.  db eval 
09c0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
09d0: 6f 5f 76 61 63 75 75 6d 20 3d 20 27 69 6e 63 72  o_vacuum = 'incr
09e0: 65 6d 65 6e 74 61 6c 27 3b 0a 20 20 20 20 42 45  emental';.    BE
09f0: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
0a00: 54 41 42 4c 45 20 61 28 69 20 69 6e 74 65 67 65  TABLE a(i intege
0a10: 72 2c 20 62 20 62 6c 6f 62 29 3b 0a 20 20 20 20  r, b blob);.    
0a20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41  INSERT INTO a VA
0a30: 4c 55 45 53 28 31 2c 20 72 61 6e 64 73 74 72 28  LUES(1, randstr(
0a40: 31 35 30 30 2c 31 35 30 30 29 29 3b 0a 20 20 20  1500,1500));.   
0a50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56   INSERT INTO a V
0a60: 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 73 74 72  ALUES(2, randstr
0a70: 28 31 35 30 30 2c 31 35 30 30 29 29 3b 0a 20 20  (1500,1500));.  
0a80: 7d 0a 20 20 64 62 20 65 76 61 6c 20 43 4f 4d 4d  }.  db eval COMM
0a90: 49 54 0a 20 20 64 62 20 65 76 61 6c 20 7b 44 45  IT.  db eval {DE
0aa0: 4c 45 54 45 20 46 52 4f 4d 20 61 20 57 48 45 52  LETE FROM a WHER
0ab0: 45 20 6f 69 64 7d 0a 7d 20 2d 73 71 6c 62 6f 64  E oid}.} -sqlbod
0ac0: 79 20 7b 0a 20 20 50 52 41 47 4d 41 20 69 6e 63  y {.  PRAGMA inc
0ad0: 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28  remental_vacuum(
0ae0: 35 29 3b 0a 7d 20 2d 63 6c 65 61 6e 75 70 20 7b  5);.} -cleanup {
0af0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
0b00: 73 74 2e 64 62 0a 20 20 69 6e 74 65 67 72 69 74  st.db.  integrit
0b10: 79 5f 63 68 65 63 6b 20 69 6e 63 72 76 61 63 75  y_check incrvacu
0b20: 75 6d 2d 69 6f 65 72 72 2d 32 2e 24 6e 2e 69 6e  um-ioerr-2.$n.in
0b30: 74 65 67 72 69 74 79 63 68 65 63 6b 0a 20 20 64  tegritycheck.  d
0b40: 62 20 63 6c 6f 73 65 0a 7d 0a 0a 0a 69 66 63 61  b close.}...ifca
0b50: 70 61 62 6c 65 20 73 68 61 72 65 64 5f 63 61 63  pable shared_cac
0b60: 68 65 20 7b 0a 0a 20 20 63 61 74 63 68 20 7b 20  he {..  catch { 
0b70: 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 6f 72  db close }.  for
0b80: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
0b90: 0a 20 20 73 65 74 20 3a 3a 65 6e 61 62 6c 65 5f  .  set ::enable_
0ba0: 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b 73 71  shared_cache [sq
0bb0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
0bc0: 72 65 64 5f 63 61 63 68 65 20 31 5d 0a 20 20 0a  red_cache 1].  .
0bd0: 20 20 23 20 43 72 65 61 74 65 20 74 77 6f 20 63    # Create two c
0be0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 61 20  onnections to a 
0bf0: 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 63 61  single shared-ca
0c00: 63 68 65 3a 0a 20 20 23 0a 20 20 73 71 6c 69 74  che:.  #.  sqlit
0c10: 65 33 20 64 62 31 20 74 65 73 74 2e 64 62 0a 20  e3 db1 test.db. 
0c20: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
0c30: 74 2e 64 62 0a 20 20 0a 20 20 23 20 43 72 65 61  t.db.  .  # Crea
0c40: 74 65 20 61 20 64 61 74 61 62 61 73 65 20 77 69  te a database wi
0c50: 74 68 20 61 72 6f 75 6e 64 20 32 30 20 66 72 65  th around 20 fre
0c60: 65 20 70 61 67 65 73 2e 0a 20 20 23 0a 20 20 64  e pages..  #.  d
0c70: 6f 5f 74 65 73 74 20 69 6e 63 72 76 61 63 75 75  o_test incrvacuu
0c80: 6d 2d 69 6f 65 72 72 2d 34 2e 30 20 7b 0a 20 20  m-ioerr-4.0 {.  
0c90: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0ca0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
0cb0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20  ze = 1024;.     
0cc0: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
0cd0: 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65  mode = exclusive
0ce0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
0cf0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 27 69 6e  uto_vacuum = 'in
0d00: 63 72 65 6d 65 6e 74 61 6c 27 3b 0a 20 20 20 20  cremental';.    
0d10: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
0d20: 52 45 41 54 45 20 54 41 42 4c 45 20 61 28 69 20  REATE TABLE a(i 
0d30: 69 6e 74 65 67 65 72 2c 20 62 20 62 6c 6f 62 29  integer, b blob)
0d40: 3b 0a 20 20 20 20 7d 20 64 62 31 0a 20 20 20 20  ;.    } db1.    
0d50: 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b  for {set ii 0} {
0d60: 24 69 69 20 3c 20 32 30 7d 20 7b 69 6e 63 72 20  $ii < 20} {incr 
0d70: 69 69 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63  ii} {.      exec
0d80: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
0d90: 4f 20 61 20 56 41 4c 55 45 53 28 24 69 69 2c 20  O a VALUES($ii, 
0da0: 72 61 6e 64 73 74 72 28 38 30 30 2c 31 35 30 30  randstr(800,1500
0db0: 29 29 3b 20 7d 20 64 62 31 0a 20 20 20 20 7d 0a  )); } db1.    }.
0dc0: 20 20 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d      execsql COMM
0dd0: 49 54 20 64 62 31 0a 20 20 20 20 65 78 65 63 73  IT db1.    execs
0de0: 71 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20  ql {DELETE FROM 
0df0: 61 20 57 48 45 52 45 20 6f 69 64 7d 20 64 62 31  a WHERE oid} db1
0e00: 0a 20 20 7d 20 7b 7d 0a 20 20 0a 20 20 73 65 74  .  } {}.  .  set
0e10: 20 3a 3a 72 63 20 31 0a 20 20 66 6f 72 20 7b 73   ::rc 1.  for {s
0e20: 65 74 20 69 54 65 73 74 20 31 7d 20 7b 24 3a 3a  et iTest 1} {$::
0e30: 72 63 20 26 26 20 24 69 54 65 73 74 3c 32 30 30  rc && $iTest<200
0e40: 30 7d 20 7b 69 6e 63 72 20 69 54 65 73 74 7d 20  0} {incr iTest} 
0e50: 7b 0a 20 20 0a 20 20 20 20 23 20 46 69 67 75 72  {.  .    # Figur
0e60: 65 20 6f 75 74 20 68 6f 77 20 62 69 67 20 74 68  e out how big th
0e70: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6e  e database is an
0e80: 64 20 68 6f 77 20 6d 61 6e 79 20 66 72 65 65 20  d how many free 
0e90: 70 61 67 65 73 20 69 74 0a 20 20 20 20 23 20 68  pages it.    # h
0ea0: 61 73 20 62 65 66 6f 72 65 20 72 75 6e 6e 69 6e  as before runnin
0eb0: 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  g incremental-va
0ec0: 63 75 75 6d 2e 0a 20 20 20 20 23 0a 20 20 20 20  cuum..    #.    
0ed0: 73 65 74 20 6e 46 72 65 65 20 5b 65 78 65 63 73  set nFree [execs
0ee0: 71 6c 20 7b 70 72 61 67 6d 61 20 66 72 65 65 6c  ql {pragma freel
0ef0: 69 73 74 5f 63 6f 75 6e 74 7d 20 64 62 31 5d 0a  ist_count} db1].
0f00: 20 20 20 20 73 65 74 20 6e 50 61 67 65 20 5b 65      set nPage [e
0f10: 78 65 63 73 71 6c 20 7b 70 72 61 67 6d 61 20 70  xecsql {pragma p
0f20: 61 67 65 5f 63 6f 75 6e 74 7d 20 64 62 31 5d 0a  age_count} db1].
0f30: 20 20 20 20 70 75 74 73 20 22 6e 46 72 65 65 3d      puts "nFree=
0f40: 24 6e 46 72 65 65 20 6e 50 61 67 65 3d 24 6e 50  $nFree nPage=$nP
0f50: 61 67 65 22 0a 20 20 0a 20 20 20 20 23 20 4e 6f  age".  .    # No
0f60: 77 20 72 75 6e 20 69 6e 63 72 65 6d 65 6e 74 61  w run incrementa
0f70: 6c 2d 76 61 63 75 75 6d 20 74 6f 20 76 61 63 75  l-vacuum to vacu
0f80: 75 6d 20 35 20 70 61 67 65 73 20 66 72 6f 6d 20  um 5 pages from 
0f90: 74 68 65 20 64 62 20 66 69 6c 65 2e 0a 20 20 20  the db file..   
0fa0: 20 23 20 54 68 65 20 69 54 65 73 74 27 74 68 20   # The iTest'th 
0fb0: 49 2f 4f 20 63 61 6c 6c 20 69 73 20 73 65 74 20  I/O call is set 
0fc0: 74 6f 20 66 61 69 6c 2e 0a 20 20 20 20 23 0a 20  to fail..    #. 
0fd0: 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f     set ::sqlite_
0fe0: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
0ff0: 20 24 69 54 65 73 74 0a 20 20 20 20 73 65 74 20   $iTest.    set 
1000: 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f  ::sqlite_io_erro
1010: 72 5f 70 65 72 73 69 73 74 20 31 0a 20 20 20 20  r_persist 1.    
1020: 64 6f 5f 74 65 73 74 20 69 6e 63 72 76 61 63 75  do_test incrvacu
1030: 75 6d 2d 69 6f 65 72 72 2d 34 2e 24 69 54 65 73  um-ioerr-4.$iTes
1040: 74 2e 31 20 7b 0a 20 20 20 20 20 20 73 65 74 20  t.1 {.      set 
1050: 3a 3a 72 63 20 5b 63 61 74 63 68 20 7b 65 78 65  ::rc [catch {exe
1060: 63 73 71 6c 20 7b 70 72 61 67 6d 61 20 69 6e 63  csql {pragma inc
1070: 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28  remental_vacuum(
1080: 35 29 7d 20 64 62 31 7d 20 6d 73 67 5d 0a 20 20  5)} db1} msg].  
1090: 20 20 20 20 65 78 70 72 20 7b 24 3a 3a 72 63 3d      expr {$::rc=
10a0: 3d 30 20 7c 7c 20 24 6d 73 67 20 65 71 20 22 64  =0 || $msg eq "d
10b0: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 7d 0a  isk I/O error"}.
10c0: 20 20 20 20 7d 20 7b 31 7d 0a 20 20 0a 20 20 20      } {1}.  .   
10d0: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f   set ::sqlite_io
10e0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 30  _error_pending 0
10f0: 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  .    set ::sqlit
1100: 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69  e_io_error_persi
1110: 73 74 20 30 0a 20 20 20 20 73 65 74 20 3a 3a 73  st 0.    set ::s
1120: 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68  qlite_io_error_h
1130: 69 74 20 30 0a 20 20 20 20 73 65 74 20 3a 3a 73  it 0.    set ::s
1140: 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68  qlite_io_error_h
1150: 61 72 64 68 69 74 20 30 0a 20 20 0a 20 20 20 20  ardhit 0.  .    
1160: 73 65 74 20 6e 46 72 65 65 32 20 5b 65 78 65 63  set nFree2 [exec
1170: 73 71 6c 20 7b 70 72 61 67 6d 61 20 66 72 65 65  sql {pragma free
1180: 6c 69 73 74 5f 63 6f 75 6e 74 7d 20 64 62 31 5d  list_count} db1]
1190: 0a 20 20 20 20 73 65 74 20 6e 50 61 67 65 32 20  .    set nPage2 
11a0: 5b 65 78 65 63 73 71 6c 20 7b 70 72 61 67 6d 61  [execsql {pragma
11b0: 20 70 61 67 65 5f 63 6f 75 6e 74 7d 20 64 62 31   page_count} db1
11c0: 5d 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65 73 74  ].  .    do_test
11d0: 20 69 6e 63 72 76 61 63 75 75 6d 2d 69 6f 65 72   incrvacuum-ioer
11e0: 72 2d 34 2e 24 69 54 65 73 74 2e 32 20 7b 0a 20  r-4.$iTest.2 {. 
11f0: 20 20 20 20 20 73 65 74 20 73 68 72 69 6e 6b 20       set shrink 
1200: 5b 65 78 70 72 20 7b 24 6e 50 61 67 65 2d 24 6e  [expr {$nPage-$n
1210: 50 61 67 65 32 7d 5d 0a 20 20 20 20 20 20 65 78  Page2}].      ex
1220: 70 72 20 7b 24 73 68 72 69 6e 6b 3d 3d 30 20 7c  pr {$shrink==0 |
1230: 7c 20 24 73 68 72 69 6e 6b 3d 3d 35 20 7c 7c 20  | $shrink==5 || 
1240: 28 24 6e 46 72 65 65 3c 35 20 26 26 20 24 73 68  ($nFree<5 && $sh
1250: 72 69 6e 6b 3d 3d 24 6e 46 72 65 65 29 7d 0a 20  rink==$nFree)}. 
1260: 20 20 20 7d 20 7b 31 7d 0a 20 20 0a 20 20 20 20     } {1}.  .    
1270: 64 6f 5f 74 65 73 74 20 69 6e 63 72 76 61 63 75  do_test incrvacu
1280: 75 6d 2d 69 6f 65 72 72 2d 34 2e 24 69 54 65 73  um-ioerr-4.$iTes
1290: 74 2e 33 20 7b 0a 20 20 20 20 20 20 65 78 70 72  t.3 {.      expr
12a0: 20 7b 24 6e 50 61 67 65 20 2d 20 24 6e 50 61 67   {$nPage - $nPag
12b0: 65 32 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72 20  e2}.    } [expr 
12c0: 7b 24 6e 46 72 65 65 20 2d 20 24 6e 46 72 65 65  {$nFree - $nFree
12d0: 32 7d 5d 0a 20 20 7d 0a 20 20 0a 20 20 23 20 43  2}].  }.  .  # C
12e0: 6c 6f 73 65 20 74 68 65 20 74 77 6f 20 64 61 74  lose the two dat
12f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1300: 73 20 61 6e 64 20 72 65 73 74 6f 72 65 20 74 68  s and restore th
1310: 65 20 64 65 66 61 75 6c 74 0a 20 20 23 20 73 68  e default.  # sh
1320: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
1330: 73 65 74 74 69 6e 67 2e 0a 20 20 23 0a 20 20 64  setting..  #.  d
1340: 62 31 20 63 6c 6f 73 65 0a 20 20 64 62 32 20 63  b1 close.  db2 c
1350: 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 65  lose.  sqlite3_e
1360: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
1370: 68 65 20 24 3a 3a 65 6e 61 62 6c 65 5f 73 68 61  he $::enable_sha
1380: 72 65 64 5f 63 61 63 68 65 0a 7d 0a 0a 66 69 6e  red_cache.}..fin
1390: 69 73 68 5f 74 65 73 74 0a                       ish_test.