/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 053da63476d1b6a32ec61ac21c0391e614cb1d1a:


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: 33 30 20 32 30 30 37 2f 30 33 2f 31 35 20 31 32  30 2007/03/15 12
02b0: 3a 31 37 3a 34 33 20 64 72 68 20 45 78 70 20 24  :17:43 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 65 72 63 20 31  t ioerr-1 -erc 1
0490: 20 2d 73 71 6c 70 72 65 70 20 7b 0a 20 20 53 45   -sqlprep {.  SE
04a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
04b0: 74 65 5f 6d 61 73 74 65 72 3b 0a 7d 20 2d 73 71  te_master;.} -sq
04c0: 6c 62 6f 64 79 20 7b 0a 20 20 43 52 45 41 54 45  lbody {.  CREATE
04d0: 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 29   TABLE t1(a,b,c)
04e0: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
04f0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
0500: 0a 20 20 42 45 47 49 4e 20 54 52 41 4e 53 41 43  .  BEGIN TRANSAC
0510: 54 49 4f 4e 3b 0a 20 20 49 4e 53 45 52 54 20 49  TION;.  INSERT I
0520: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
0530: 32 2c 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  2,3);.  INSERT I
0540: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
0550: 35 2c 36 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b  5,6);.  ROLLBACK
0560: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
0570: 4d 20 74 31 3b 0a 20 20 42 45 47 49 4e 20 54 52  M t1;.  BEGIN TR
0580: 41 4e 53 41 43 54 49 4f 4e 3b 0a 20 20 49 4e 53  ANSACTION;.  INS
0590: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
05a0: 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 49 4e 53  ES(1,2,3);.  INS
05b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
05c0: 45 53 28 34 2c 35 2c 36 29 3b 0a 20 20 43 4f 4d  ES(4,5,6);.  COM
05d0: 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  MIT;.  SELECT * 
05e0: 46 52 4f 4d 20 74 31 3b 0a 20 20 44 45 4c 45 54  FROM t1;.  DELET
05f0: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
0600: 61 3c 31 30 30 3b 0a 7d 20 2d 65 78 63 6c 75 64  a<100;.} -exclud
0610: 65 20 5b 65 78 70 72 20 5b 73 74 72 69 6e 67 20  e [expr [string 
0620: 6d 61 74 63 68 20 5b 65 78 65 63 73 71 6c 20 7b  match [execsql {
0630: 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75  pragma auto_vacu
0640: 75 6d 7d 5d 20 31 5d 20 3f 20 34 20 3a 20 30 5d  um}] 1] ? 4 : 0]
0650: 0a 0a 23 20 54 65 73 74 20 66 6f 72 20 49 4f 20  ..# Test for IO 
0660: 65 72 72 6f 72 73 20 64 75 72 69 6e 67 20 61 20  errors during a 
0670: 56 41 43 55 55 4d 2e 20 0a 23 0a 23 20 54 68 65  VACUUM. .#.# The
0680: 20 66 69 72 73 74 20 49 4f 20 63 61 6c 6c 20 69   first IO call i
0690: 73 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  s excluded from 
06a0: 74 68 65 20 74 65 73 74 2e 20 54 68 69 73 20 63  the test. This c
06b0: 61 6c 6c 20 61 74 74 65 6d 70 74 73 20 74 6f 20  all attempts to 
06c0: 72 65 61 64 0a 23 20 74 68 65 20 66 69 6c 65 2d  read.# the file-
06d0: 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 74 65  header of the te
06e0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
06f0: 20 75 73 65 64 20 62 79 20 56 41 43 55 55 4d 2e   used by VACUUM.
0700: 20 53 69 6e 63 65 20 74 68 65 0a 23 20 64 61 74   Since the.# dat
0710: 61 62 61 73 65 20 64 6f 65 73 6e 27 74 20 65 78  abase doesn't ex
0720: 69 73 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  ist at that poin
0730: 74 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  t, the IO error 
0740: 69 73 20 6e 6f 74 20 64 65 74 65 63 74 65 64 2e  is not detected.
0750: 0a 23 20 0a 23 20 41 64 64 69 74 69 6f 6e 61 6c  .# .# Additional
0760: 6c 79 2c 20 69 66 20 61 75 74 6f 2d 76 61 63 75  ly, if auto-vacu
0770: 75 6d 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  um is enabled, t
0780: 68 65 20 31 32 74 68 20 49 4f 20 65 72 72 6f 72  he 12th IO error
0790: 20 69 73 20 6e 6f 74 20 0a 23 20 64 65 74 65 63   is not .# detec
07a0: 74 65 64 2e 20 53 61 6d 65 20 72 65 61 73 6f 6e  ted. Same reason
07b0: 20 61 73 20 74 68 65 20 38 74 68 20 69 6e 20 74   as the 8th in t
07c0: 68 65 20 74 65 73 74 20 63 61 73 65 20 61 62 6f  he test case abo
07d0: 76 65 2e 0a 23 20 0a 69 66 63 61 70 61 62 6c 65  ve..# .ifcapable
07e0: 20 76 61 63 75 75 6d 20 7b 0a 20 20 64 6f 5f 69   vacuum {.  do_i
07f0: 6f 65 72 72 5f 74 65 73 74 20 69 6f 65 72 72 2d  oerr_test ioerr-
0800: 32 20 2d 63 6b 73 75 6d 20 74 72 75 65 20 2d 73  2 -cksum true -s
0810: 71 6c 70 72 65 70 20 7b 20 0a 20 20 20 20 42 45  qlprep { .    BE
0820: 47 49 4e 3b 20 0a 20 20 20 20 43 52 45 41 54 45  GIN; .    CREATE
0830: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
0840: 63 29 3b 20 0a 20 20 20 20 49 4e 53 45 52 54 20  c); .    INSERT 
0850: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0860: 2c 20 72 61 6e 64 73 74 72 28 35 30 2c 35 30 29  , randstr(50,50)
0870: 2c 20 72 61 6e 64 73 74 72 28 35 30 2c 35 30 29  , randstr(50,50)
0880: 29 3b 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ); .    INSERT I
0890: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b  NTO t1 SELECT a+
08a0: 32 2c 20 62 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64  2, b||'-'||rowid
08b0: 2c 20 63 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64 20  , c||'-'||rowid 
08c0: 46 52 4f 4d 20 74 31 3b 20 0a 20 20 20 20 49 4e  FROM t1; .    IN
08d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
08e0: 45 43 54 20 61 2b 34 2c 20 62 7c 7c 27 2d 27 7c  ECT a+4, b||'-'|
08f0: 7c 72 6f 77 69 64 2c 20 63 7c 7c 27 2d 27 7c 7c  |rowid, c||'-'||
0900: 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 3b 0a 20  rowid FROM t1;. 
0910: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0920: 31 20 53 45 4c 45 43 54 20 61 2b 38 2c 20 62 7c  1 SELECT a+8, b|
0930: 7c 27 2d 27 7c 7c 72 6f 77 69 64 2c 20 63 7c 7c  |'-'||rowid, c||
0940: 27 2d 27 7c 7c 72 6f 77 69 64 20 46 52 4f 4d 20  '-'||rowid FROM 
0950: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
0960: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b  NTO t1 SELECT a+
0970: 31 36 2c 20 62 7c 7c 27 2d 27 7c 7c 72 6f 77 69  16, b||'-'||rowi
0980: 64 2c 20 63 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64  d, c||'-'||rowid
0990: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
09a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
09b0: 45 43 54 20 61 2b 33 32 2c 20 62 7c 7c 27 2d 27  ECT a+32, b||'-'
09c0: 7c 7c 72 6f 77 69 64 2c 20 63 7c 7c 27 2d 27 7c  ||rowid, c||'-'|
09d0: 7c 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 3b 0a  |rowid FROM t1;.
09e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
09f0: 74 31 20 53 45 4c 45 43 54 20 61 2b 36 34 2c 20  t1 SELECT a+64, 
0a00: 62 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64 2c 20 63  b||'-'||rowid, c
0a10: 7c 7c 27 2d 27 7c 7c 72 6f 77 69 64 20 46 52 4f  ||'-'||rowid FRO
0a20: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
0a30: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
0a40: 61 2b 31 32 38 2c 20 62 7c 7c 27 2d 27 7c 7c 72  a+128, b||'-'||r
0a50: 6f 77 69 64 2c 20 63 7c 7c 27 2d 27 7c 7c 72 6f  owid, c||'-'||ro
0a60: 77 69 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  wid FROM t1;.   
0a70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0a80: 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 73 74  VALUES(1, randst
0a90: 72 28 36 30 30 2c 36 30 30 29 2c 20 72 61 6e 64  r(600,600), rand
0aa0: 73 74 72 28 36 30 30 2c 36 30 30 29 29 3b 0a 20  str(600,600));. 
0ab0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0ac0: 74 32 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  t2 AS SELECT * F
0ad0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 52 45 41  ROM t1;.    CREA
0ae0: 54 45 20 54 41 42 4c 45 20 74 33 20 41 53 20 53  TE TABLE t3 AS S
0af0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
0b00: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  .    COMMIT;.   
0b10: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
0b20: 20 20 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a 20    } -sqlbody {. 
0b30: 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d 20 2d     VACUUM;.  } -
0b40: 65 78 63 6c 75 64 65 20 5b 6c 69 73 74 20 5c 0a  exclude [list \.
0b50: 20 20 20 20 20 20 31 20 5b 65 78 70 72 20 5b 73        1 [expr [s
0b60: 74 72 69 6e 67 20 6d 61 74 63 68 20 5b 65 78 65  tring match [exe
0b70: 63 73 71 6c 20 7b 70 72 61 67 6d 61 20 61 75 74  csql {pragma aut
0b80: 6f 5f 76 61 63 75 75 6d 7d 5d 20 31 5d 3f 39 3a  o_vacuum}] 1]?9:
0b90: 2d 31 5d 5d 0a 7d 0a 0a 64 6f 5f 69 6f 65 72 72  -1]].}..do_ioerr
0ba0: 5f 74 65 73 74 20 69 6f 65 72 72 2d 33 20 2d 74  _test ioerr-3 -t
0bb0: 63 6c 70 72 65 70 20 7b 0a 20 20 65 78 65 63 73  clprep {.  execs
0bc0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
0bd0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
0be0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
0bf0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
0c00: 28 61 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (a);.    INSERT 
0c10: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
0c20: 72 61 6e 64 73 74 72 28 31 35 30 30 2c 31 35 30  randstr(1500,150
0c30: 30 29 29 3b 20 2d 2d 20 50 61 67 65 20 34 20 69  0)); -- Page 4 i
0c40: 73 20 6f 76 65 72 66 6c 6f 77 0a 20 20 7d 0a 20  s overflow.  }. 
0c50: 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b   for {set i 0} {
0c60: 24 69 3c 31 35 30 7d 20 7b 69 6e 63 72 20 69 7d  $i<150} {incr i}
0c70: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
0c80: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0c90: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 72 61  TO abc VALUES(ra
0ca0: 6e 64 73 74 72 28 31 30 30 2c 31 30 30 29 29 3b  ndstr(100,100));
0cb0: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 78   .    }.  }.  ex
0cc0: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 2d  ecsql COMMIT.} -
0cd0: 73 71 6c 62 6f 64 79 20 7b 0a 20 20 43 52 45 41  sqlbody {.  CREA
0ce0: 54 45 20 54 41 42 4c 45 20 61 62 63 32 28 61 29  TE TABLE abc2(a)
0cf0: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 44 45 4c  ;.  BEGIN;.  DEL
0d00: 45 54 45 20 46 52 4f 4d 20 61 62 63 20 57 48 45  ETE FROM abc WHE
0d10: 52 45 20 6c 65 6e 67 74 68 28 61 29 3e 31 30 30  RE length(a)>100
0d20: 3b 0a 20 20 55 50 44 41 54 45 20 61 62 63 20 53  ;.  UPDATE abc S
0d30: 45 54 20 61 20 3d 20 72 61 6e 64 73 74 72 28 39  ET a = randstr(9
0d40: 30 2c 39 30 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  0,90);.  COMMIT;
0d50: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0d60: 61 62 63 33 28 61 29 3b 0a 7d 20 0a 0a 23 20 54  abc3(a);.} ..# T
0d70: 65 73 74 20 49 4f 20 65 72 72 6f 72 73 20 74 68  est IO errors th
0d80: 61 74 20 63 61 6e 20 6f 63 63 75 72 20 72 65 74  at can occur ret
0d90: 72 69 65 76 69 6e 67 20 61 20 72 65 63 6f 72 64  rieving a record
0da0: 20 68 65 61 64 65 72 20 74 68 61 74 20 66 6c 6f   header that flo
0db0: 77 73 20 6f 76 65 72 0a 23 20 6f 6e 74 6f 20 61  ws over.# onto a
0dc0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
0dd0: 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74 20 69  .do_ioerr_test i
0de0: 6f 65 72 72 2d 34 20 2d 74 63 6c 70 72 65 70 20  oerr-4 -tclprep 
0df0: 7b 0a 20 20 73 65 74 20 73 71 6c 20 22 43 52 45  {.  set sql "CRE
0e00: 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 31  ATE TABLE abc(a1
0e10: 22 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 32  ".  for {set i 2
0e20: 7d 20 7b 24 69 3c 31 33 30 30 7d 20 7b 69 6e 63  } {$i<1300} {inc
0e30: 72 20 69 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e  r i} {.    appen
0e40: 64 20 73 71 6c 20 22 2c 20 61 24 69 22 0a 20 20  d sql ", a$i".  
0e50: 7d 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22  }.  append sql "
0e60: 29 3b 22 0a 20 20 65 78 65 63 73 71 6c 20 24 73  );".  execsql $s
0e70: 71 6c 0a 20 20 65 78 65 63 73 71 6c 20 7b 49 4e  ql.  execsql {IN
0e80: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 28 61  SERT INTO abc (a
0e90: 31 29 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29 7d  1) VALUES(NULL)}
0ea0: 0a 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a 20 53  .} -sqlbody {. S
0eb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
0ec0: 3b 0a 7d 0a 0a 23 20 54 65 73 74 20 49 4f 20 65  ;.}..# Test IO e
0ed0: 72 72 6f 72 73 20 74 68 61 74 20 6d 61 79 20 6f  rrors that may o
0ee0: 63 63 75 72 20 64 75 72 69 6e 67 20 61 20 6d 75  ccur during a mu
0ef0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 2e  lti-file commit.
0f00: 0a 23 0a 23 20 54 65 73 74 73 20 38 20 61 6e 64  .#.# Tests 8 and
0f10: 20 31 37 20 61 72 65 20 65 78 63 6c 75 64 65 64   17 are excluded
0f20: 20 77 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   when auto-vacuu
0f30: 6d 20 69 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  m is enabled for
0f40: 20 74 68 65 20 73 61 6d 65 20 0a 23 20 72 65 61   the same .# rea
0f50: 73 6f 6e 20 61 73 20 69 6e 20 74 65 73 74 20 63  son as in test c
0f60: 61 73 65 73 20 69 6f 65 72 72 2d 31 2e 58 58 58  ases ioerr-1.XXX
0f70: 0a 73 65 74 20 65 78 20 22 22 0a 69 66 20 7b 5b  .set ex "".if {[
0f80: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5b 65 78  string match [ex
0f90: 65 63 73 71 6c 20 7b 70 72 61 67 6d 61 20 61 75  ecsql {pragma au
0fa0: 74 6f 5f 76 61 63 75 75 6d 7d 5d 20 31 5d 7d 20  to_vacuum}] 1]} 
0fb0: 7b 0a 20 20 73 65 74 20 65 78 20 5b 6c 69 73 74  {.  set ex [list
0fc0: 20 34 20 31 37 5d 0a 7d 0a 64 6f 5f 69 6f 65 72   4 17].}.do_ioer
0fd0: 72 5f 74 65 73 74 20 69 6f 65 72 72 2d 35 20 2d  r_test ioerr-5 -
0fe0: 73 71 6c 70 72 65 70 20 7b 0a 20 20 41 54 54 41  sqlprep {.  ATTA
0ff0: 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 41 53  CH 'test2.db' AS
1000: 20 74 65 73 74 32 3b 0a 7d 20 2d 73 71 6c 62 6f   test2;.} -sqlbo
1010: 64 79 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  dy {.  BEGIN;.  
1020: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1030: 61 2c 62 2c 63 29 3b 0a 20 20 43 52 45 41 54 45  a,b,c);.  CREATE
1040: 20 54 41 42 4c 45 20 74 65 73 74 32 2e 74 32 28   TABLE test2.t2(
1050: 61 2c 62 2c 63 29 3b 0a 20 20 43 4f 4d 4d 49 54  a,b,c);.  COMMIT
1060: 3b 0a 7d 20 2d 65 78 63 6c 75 64 65 20 24 65 78  ;.} -exclude $ex
1070: 0a 0a 23 20 54 65 73 74 20 49 4f 20 65 72 72 6f  ..# Test IO erro
1080: 72 73 20 77 68 65 6e 20 72 65 70 6c 61 79 69 6e  rs when replayin
1090: 67 20 74 77 6f 20 68 6f 74 20 6a 6f 75 72 6e 61  g two hot journa
10a0: 6c 73 20 66 72 6f 6d 20 61 20 32 2d 66 69 6c 65  ls from a 2-file
10b0: 20 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e   .# transaction.
10c0: 20 54 68 69 73 20 74 65 73 74 20 6f 6e 6c 79 20   This test only 
10d0: 72 75 6e 73 20 6f 6e 20 55 4e 49 58 2e 0a 69 66  runs on UNIX..if
10e0: 63 61 70 61 62 6c 65 20 63 72 61 73 68 74 65 73  capable crashtes
10f0: 74 20 7b 0a 20 20 69 66 20 7b 21 5b 63 61 74 63  t {.  if {![catc
1100: 68 20 7b 73 71 6c 69 74 65 33 20 2d 68 61 73 5f  h {sqlite3 -has_
1110: 63 6f 64 65 63 7d 20 72 5d 20 26 26 20 21 24 72  codec} r] && !$r
1120: 7d 20 7b 0a 20 20 20 20 64 6f 5f 69 6f 65 72 72  } {.    do_ioerr
1130: 5f 74 65 73 74 20 69 6f 65 72 72 2d 36 20 2d 74  _test ioerr-6 -t
1140: 63 6c 70 72 65 70 20 7b 0a 20 20 20 20 20 20 65  clprep {.      e
1150: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20  xecsql {.       
1160: 20 41 54 54 41 43 48 20 27 74 65 73 74 32 2e 64   ATTACH 'test2.d
1170: 62 27 20 61 73 20 61 75 78 3b 0a 20 20 20 20 20  b' as aux;.     
1180: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1190: 74 78 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  tx(a, b);.      
11a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
11b0: 75 78 2e 74 79 28 61 2c 20 62 29 3b 0a 20 20 20  ux.ty(a, b);.   
11c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 20 72     }.      set r
11d0: 63 20 5b 63 72 61 73 68 73 71 6c 20 32 20 74 65  c [crashsql 2 te
11e0: 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7b  st2.db-journal {
11f0: 0a 20 20 20 20 20 20 20 20 41 54 54 41 43 48 20  .        ATTACH 
1200: 27 74 65 73 74 32 2e 64 62 27 20 61 73 20 61 75  'test2.db' as au
1210: 78 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d  x;.        PRAGM
1220: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
1230: 30 3b 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e  0;.        BEGIN
1240: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
1250: 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c   TABLE aux.t2(a,
1260: 20 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20   b, c);.        
1270: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1280: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 20 20  a, b, c);.      
1290: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
12a0: 7d 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 72 63  }].      if {$rc
12b0: 21 3d 22 31 20 7b 63 68 69 6c 64 20 70 72 6f 63  !="1 {child proc
12c0: 65 73 73 20 65 78 69 74 65 64 20 61 62 6e 6f 72  ess exited abnor
12d0: 6d 61 6c 6c 79 7d 22 7d 20 7b 0a 20 20 20 20 20  mally}"} {.     
12e0: 20 20 20 65 72 72 6f 72 20 22 57 72 6f 6e 67 20     error "Wrong 
12f0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 20 24  error message: $
1300: 72 63 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc".      }.    
1310: 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a 20 20 20  } -sqlbody {.   
1320: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1330: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
1340: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1350: 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d  ROM aux.sqlite_m
1360: 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  aster;.    }.  }
1370: 0a 7d 20 0a 0a 23 20 54 65 73 74 20 68 61 6e 64  .} ..# Test hand
1380: 6c 69 6e 67 20 6f 66 20 49 4f 20 65 72 72 6f 72  ling of IO error
1390: 73 20 74 68 61 74 20 6f 63 63 75 72 20 77 68 69  s that occur whi
13a0: 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  le rolling back 
13b0: 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 23 20 66 69  hot journal.# fi
13c0: 6c 65 73 2e 0a 23 0a 23 20 54 68 65 73 65 20 74  les..#.# These t
13d0: 65 73 74 73 20 63 61 6e 27 74 20 62 65 20 72 75  ests can't be ru
13e0: 6e 20 6f 6e 20 77 69 6e 64 6f 77 73 20 62 65 63  n on windows bec
13f0: 61 75 73 65 20 74 68 65 20 77 69 6e 64 6f 77 73  ause the windows
1400: 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 23 20 53   version of .# S
1410: 51 4c 69 74 65 20 68 6f 6c 64 73 20 61 20 6d 61  QLite holds a ma
1420: 6e 64 61 74 6f 72 79 20 65 78 63 6c 75 73 69 76  ndatory exclusiv
1430: 65 20 6c 6f 63 6b 20 6f 6e 20 6a 6f 75 72 6e 61  e lock on journa
1440: 6c 20 66 69 6c 65 73 20 69 74 20 68 61 73 20 6f  l files it has o
1450: 70 65 6e 2e 0a 23 0a 62 74 72 65 65 5f 62 72 65  pen..#.btree_bre
1460: 61 6b 70 6f 69 6e 74 0a 69 66 20 7b 24 74 63 6c  akpoint.if {$tcl
1470: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
1480: 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d 20  rm)!="windows"} 
1490: 7b 0a 20 20 64 6f 5f 69 6f 65 72 72 5f 74 65 73  {.  do_ioerr_tes
14a0: 74 20 69 6f 65 72 72 2d 37 20 2d 74 63 6c 70 72  t ioerr-7 -tclpr
14b0: 65 70 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73  ep {.    db clos
14c0: 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  e.    sqlite3 db
14d0: 32 20 74 65 73 74 32 2e 64 62 0a 20 20 20 20 64  2 test2.db.    d
14e0: 62 32 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20  b2 eval {.      
14f0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
1500: 75 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 52  us = 0;.      CR
1510: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
1520: 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
1530: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1540: 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 42 45  (1, 2);.      BE
1550: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
1560: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1570: 28 33 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  (3, 4);.    }.  
1580: 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74    copy_file test
1590: 32 2e 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  2.db test.db.   
15a0: 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 32   copy_file test2
15b0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74  .db-journal test
15c0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  .db-journal.    
15d0: 64 62 32 20 63 6c 6f 73 65 0a 20 20 7d 20 2d 74  db2 close.  } -t
15e0: 63 6c 62 6f 64 79 20 7b 0a 20 20 20 20 73 71 6c  clbody {.    sql
15f0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
1600: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20      db eval {.  
1610: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1620: 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
1630: 2d 65 78 63 6c 75 64 65 20 31 0a 7d 0a 0a 23 20  -exclude 1.}..# 
1640: 46 6f 72 20 74 65 73 74 20 63 6f 76 65 72 61 67  For test coverag
1650: 65 3a 20 20 43 61 75 73 65 20 61 6e 20 49 2f 4f  e:  Cause an I/O
1660: 20 66 61 69 6c 75 72 65 20 77 68 69 6c 65 20 74   failure while t
1670: 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 61 0a  rying to read a.
1680: 23 20 73 68 6f 72 74 20 66 69 65 6c 64 20 28 6f  # short field (o
1690: 6e 65 20 74 68 61 74 20 66 69 74 73 20 69 6e 74  ne that fits int
16a0: 6f 20 61 20 4d 65 6d 20 62 75 66 66 65 72 20 77  o a Mem buffer w
16b0: 69 74 68 6f 75 74 20 6d 61 6c 6c 6f 63 69 6e 67  ithout mallocing
16c0: 0a 23 20 66 6f 72 20 73 70 61 63 65 29 2e 0a 23  .# for space)..#
16d0: 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74 20 69  .do_ioerr_test i
16e0: 6f 65 72 72 2d 38 20 2d 74 63 6c 70 72 65 70 20  oerr-8 -tclprep 
16f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1700: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1710: 31 28 61 2c 62 2c 63 29 3b 0a 20 20 20 20 49 4e  1(a,b,c);.    IN
1720: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1730: 55 45 53 28 72 61 6e 64 73 74 72 28 32 30 30 2c  UES(randstr(200,
1740: 32 30 30 29 2c 20 72 61 6e 64 73 74 72 28 31 30  200), randstr(10
1750: 30 30 2c 31 30 30 30 29 2c 20 32 29 3b 0a 20 20  00,1000), 2);.  
1760: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  }.  db close.  s
1770: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1780: 62 0a 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a 20  b.} -sqlbody {. 
1790: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
17a0: 31 3b 0a 7d 0a 0a 23 20 46 6f 72 20 74 65 73 74  1;.}..# For test
17b0: 20 63 6f 76 65 72 61 67 65 3a 20 43 61 75 73 65   coverage: Cause
17c0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 68 69   an IO error whi
17d0: 6c 73 74 20 72 65 61 64 69 6e 67 20 74 68 65 20  lst reading the 
17e0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 0a 23  master-journal.#
17f0: 20 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75   name from a jou
1800: 72 6e 61 6c 20 66 69 6c 65 2e 0a 69 66 20 7b 24  rnal file..if {$
1810: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
1820: 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20  tform)=="unix"} 
1830: 7b 0a 20 20 64 6f 5f 69 6f 65 72 72 5f 74 65 73  {.  do_ioerr_tes
1840: 74 20 69 6f 65 72 72 2d 39 20 2d 74 63 6c 70 72  t ioerr-9 -tclpr
1850: 65 70 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  ep {.    execsql
1860: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
1870: 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 29 3b  TABLE t1(a,b,c);
1880: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1890: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
18a0: 64 73 74 72 28 32 30 30 2c 32 30 30 29 2c 20 72  dstr(200,200), r
18b0: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
18c0: 29 2c 20 32 29 3b 0a 20 20 20 20 20 20 42 45 47  ), 2);.      BEG
18d0: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
18e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
18f0: 72 61 6e 64 73 74 72 28 32 30 30 2c 32 30 30 29  randstr(200,200)
1900: 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31  , randstr(1000,1
1910: 30 30 30 29 2c 20 32 29 3b 0a 20 20 20 20 7d 0a  000), 2);.    }.
1920: 20 20 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65      copy_file te
1930: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65  st.db-journal te
1940: 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20  st2.db-journal. 
1950: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
1960: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
1970: 0a 20 20 20 20 63 6f 70 79 5f 66 69 6c 65 20 74  .    copy_file t
1980: 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  est2.db-journal 
1990: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
19a0: 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20      set f [open 
19b0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
19c0: 61 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72  a].    fconfigur
19d0: 65 20 24 66 20 2d 65 6e 63 6f 64 69 6e 67 20 62  e $f -encoding b
19e0: 69 6e 61 72 79 0a 20 20 20 20 70 75 74 73 20 2d  inary.    puts -
19f0: 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 20 22 68 65  nonewline $f "he
1a00: 6c 6c 6f 22 0a 20 20 20 20 70 75 74 73 20 2d 6e  llo".    puts -n
1a10: 6f 6e 65 77 6c 69 6e 65 20 24 66 20 22 5c 78 30  onewline $f "\x0
1a20: 30 5c 78 30 30 5c 78 30 30 5c 78 30 35 5c 78 30  0\x00\x00\x05\x0
1a30: 31 5c 78 30 32 5c 78 30 33 5c 78 30 34 22 0a 20  1\x02\x03\x04". 
1a40: 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69     puts -nonewli
1a50: 6e 65 20 24 66 20 22 5c 78 64 39 5c 78 64 35 5c  ne $f "\xd9\xd5\
1a60: 78 30 35 5c 78 66 39 5c 78 32 30 5c 78 61 31 5c  x05\xf9\x20\xa1\
1a70: 78 36 33 5c 78 64 37 22 0a 20 20 20 20 63 6c 6f  x63\xd7".    clo
1a80: 73 65 20 24 66 0a 20 20 7d 20 2d 73 71 6c 62 6f  se $f.  } -sqlbo
1a90: 64 79 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  dy {.    SELECT 
1aa0: 61 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  a FROM t1;.  }.}
1ab0: 0a 0a 23 20 46 6f 72 20 74 65 73 74 20 63 6f 76  ..# For test cov
1ac0: 65 72 61 67 65 3a 20 43 61 75 73 65 20 61 6e 20  erage: Cause an 
1ad0: 49 4f 20 65 72 72 6f 72 20 64 75 72 69 6e 67 20  IO error during 
1ae0: 73 74 61 74 65 6d 65 6e 74 20 70 6c 61 79 62 61  statement playba
1af0: 63 6b 20 28 69 2e 65 2e 20 0a 23 20 61 20 63 6f  ck (i.e. .# a co
1b00: 6e 73 74 72 61 69 6e 74 29 2e 0a 64 6f 5f 69 6f  nstraint)..do_io
1b10: 65 72 72 5f 74 65 73 74 20 69 6f 65 72 72 2d 31  err_test ioerr-1
1b20: 30 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 65  0 -tclprep {.  e
1b30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
1b40: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
1b50: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
1b60: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 7d 0a 20  Y KEY, b);.  }. 
1b70: 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b   for {set i 0} {
1b80: 24 69 20 3c 20 35 30 30 7d 20 7b 69 6e 63 72 20  $i < 500} {incr 
1b90: 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  i} {.    execsql
1ba0: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   {INSERT INTO t1
1bb0: 20 56 41 4c 55 45 53 28 3a 69 2c 20 27 68 65 6c   VALUES(:i, 'hel
1bc0: 6c 6f 20 77 6f 72 6c 64 27 29 3b 7d 0a 20 20 7d  lo world');}.  }
1bd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1be0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 2d   COMMIT;.  }.} -
1bf0: 74 63 6c 62 6f 64 79 20 7b 0a 0a 20 20 63 61 74  tclbody {..  cat
1c00: 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20  ch {execsql {.  
1c10: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
1c20: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1c30: 45 53 28 27 61 62 63 27 2c 20 31 32 33 29 3b 0a  ES('abc', 123);.
1c40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1c50: 74 31 20 56 41 4c 55 45 53 28 27 64 65 66 27 2c  t1 VALUES('def',
1c60: 20 31 32 33 29 3b 0a 20 20 20 20 49 4e 53 45 52   123);.    INSER
1c70: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1c80: 28 27 67 68 69 27 2c 20 31 32 33 29 3b 0a 20 20  ('ghi', 123);.  
1c90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1ca0: 20 53 45 4c 45 43 54 20 28 61 2b 35 30 30 29 25   SELECT (a+500)%
1cb0: 39 30 30 2c 20 27 67 6f 6f 64 20 73 74 72 69 6e  900, 'good strin
1cc0: 67 27 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 7d  g' FROM t1;.  }}
1cd0: 20 6d 73 67 0a 0a 20 20 69 66 20 7b 24 6d 73 67   msg..  if {$msg
1ce0: 20 21 3d 20 22 63 6f 6c 75 6d 6e 20 61 20 69 73   != "column a is
1cf0: 20 6e 6f 74 20 75 6e 69 71 75 65 22 7d 20 7b 0a   not unique"} {.
1d00: 20 20 20 20 65 72 72 6f 72 20 24 6d 73 67 0a 20      error $msg. 
1d10: 20 7d 0a 7d 0a 0a 23 20 41 73 73 65 72 74 69 6f   }.}..# Assertio
1d20: 6e 20 66 61 75 6c 74 20 62 75 67 20 72 65 70 6f  n fault bug repo
1d30: 72 74 65 64 20 62 79 20 61 6c 65 78 20 64 69 6d  rted by alex dim
1d40: 69 74 72 6f 76 2e 0a 23 0a 64 6f 5f 69 6f 65 72  itrov..#.do_ioer
1d50: 72 5f 74 65 73 74 20 69 6f 65 72 72 2d 31 31 20  r_test ioerr-11 
1d60: 2d 65 72 63 20 31 20 2d 73 71 6c 70 72 65 70 20  -erc 1 -sqlprep 
1d70: 7b 0a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  {.   CREATE TABL
1d80: 45 20 41 28 49 64 20 49 4e 54 45 47 45 52 2c 20  E A(Id INTEGER, 
1d90: 4e 61 6d 65 20 54 45 58 54 29 3b 0a 20 20 20 49  Name TEXT);.   I
1da0: 4e 53 45 52 54 20 49 4e 54 4f 20 41 28 49 64 2c  NSERT INTO A(Id,
1db0: 20 4e 61 6d 65 29 20 56 41 4c 55 45 53 28 31 2c   Name) VALUES(1,
1dc0: 20 27 4e 61 6d 65 27 29 3b 0a 7d 20 2d 73 71 6c   'Name');.} -sql
1dd0: 62 6f 64 79 20 7b 0a 20 20 20 55 50 44 41 54 45  body {.   UPDATE
1de0: 20 41 20 53 45 54 20 49 64 20 3d 20 32 2c 20 4e   A SET Id = 2, N
1df0: 61 6d 65 20 3d 20 27 4e 61 6d 65 32 27 20 57 48  ame = 'Name2' WH
1e00: 45 52 45 20 49 64 20 3d 20 31 3b 0a 7d 0a 0a 66  ERE Id = 1;.}..f
1e10: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.