/ Hex Artifact Content
Login

Artifact 9b032b2e9172952400be0910d28f1852d5ca1ed1:


0000: 23 20 32 30 30 37 20 4d 61 79 20 30 35 0a 23 0a  # 2007 May 05.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 0a 23 20 54 68 69 73 20 66 69 6c  ***.#.# This fil
0170: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6d 6d 6f  e contains commo
0180: 6e 20 63 6f 64 65 20 75 73 65 64 20 62 79 20 6d  n code used by m
0190: 61 6e 79 20 64 69 66 66 65 72 65 6e 74 20 6d 61  any different ma
01a0: 6c 6c 6f 63 20 74 65 73 74 73 0a 23 20 77 69 74  lloc tests.# wit
01b0: 68 69 6e 20 74 68 65 20 74 65 73 74 20 73 75 69  hin the test sui
01c0: 74 65 2e 0a 23 0a 23 20 24 49 64 3a 20 6d 61 6c  te..#.# $Id: mal
01d0: 6c 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 2c 76  loc_common.tcl,v
01e0: 20 31 2e 32 32 20 32 30 30 38 2f 30 39 2f 32 33   1.22 2008/09/23
01f0: 20 31 36 3a 34 31 3a 33 30 20 64 61 6e 69 65 6c   16:41:30 daniel
0200: 6b 31 39 37 37 20 45 78 70 20 24 0a 0a 23 20 49  k1977 Exp $..# I
0210: 66 20 77 65 20 64 69 64 20 6e 6f 74 20 63 6f 6d  f we did not com
0220: 70 69 6c 65 20 77 69 74 68 20 6d 61 6c 6c 6f 63  pile with malloc
0230: 20 74 65 73 74 69 6e 67 20 65 6e 61 62 6c 65 64   testing enabled
0240: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
0250: 67 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 62  g..#.ifcapable b
0260: 75 69 6c 74 69 6e 5f 74 65 73 74 20 7b 0a 20 20  uiltin_test {.  
0270: 73 65 74 20 4d 45 4d 44 45 42 55 47 20 31 0a 7d  set MEMDEBUG 1.}
0280: 20 65 6c 73 65 20 7b 0a 20 20 73 65 74 20 4d 45   else {.  set ME
0290: 4d 44 45 42 55 47 20 30 0a 20 20 72 65 74 75 72  MDEBUG 0.  retur
02a0: 6e 20 30 0a 7d 0a 0a 23 20 54 72 61 6e 73 69 65  n 0.}..# Transie
02b0: 6e 74 20 61 6e 64 20 70 65 72 73 69 73 74 65 6e  nt and persisten
02c0: 74 20 4f 4f 4d 20 65 72 72 6f 72 73 3a 0a 23 0a  t OOM errors:.#.
02d0: 73 65 74 20 46 41 55 4c 54 53 49 4d 28 6f 6f 6d  set FAULTSIM(oom
02e0: 2d 74 72 61 6e 73 69 65 6e 74 29 20 5b 6c 69 73  -transient) [lis
02f0: 74 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 2d  t          \.  -
0300: 69 6e 6a 65 63 74 73 74 61 72 74 20 20 20 7b 6f  injectstart   {o
0310: 6f 6d 5f 69 6e 6a 65 63 74 73 74 61 72 74 20 30  om_injectstart 0
0320: 7d 20 20 20 20 20 20 20 5c 0a 20 20 2d 69 6e 6a  }       \.  -inj
0330: 65 63 74 73 74 6f 70 20 20 20 20 6f 6f 6d 5f 69  ectstop    oom_i
0340: 6e 6a 65 63 74 73 74 6f 70 20 20 20 20 20 20 20  njectstop       
0350: 20 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74       \.  -inject
0360: 65 72 72 6c 69 73 74 20 7b 7b 31 20 7b 6f 75 74  errlist {{1 {out
0370: 20 6f 66 20 6d 65 6d 6f 72 79 7d 7d 7d 20 20 20   of memory}}}   
0380: 20 20 5c 0a 5d 0a 73 65 74 20 46 41 55 4c 54 53    \.].set FAULTS
0390: 49 4d 28 6f 6f 6d 2d 70 65 72 73 69 73 74 65 6e  IM(oom-persisten
03a0: 74 29 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  t) [list        
03b0: 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 73 74 61 72   \.  -injectstar
03c0: 74 20 7b 6f 6f 6d 5f 69 6e 6a 65 63 74 73 74 61  t {oom_injectsta
03d0: 72 74 20 31 30 30 30 30 30 30 7d 20 20 20 5c 0a  rt 1000000}   \.
03e0: 20 20 2d 69 6e 6a 65 63 74 73 74 6f 70 20 6f 6f    -injectstop oo
03f0: 6d 5f 69 6e 6a 65 63 74 73 74 6f 70 20 20 20 20  m_injectstop    
0400: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 2d             \.  -
0410: 69 6e 6a 65 63 74 65 72 72 6c 69 73 74 20 7b 7b  injecterrlist {{
0420: 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  1 {out of memory
0430: 7d 7d 7d 20 20 20 20 20 5c 0a 5d 0a 20 20 0a 23  }}}     \.].  .#
0440: 20 54 72 61 6e 73 69 65 6e 74 20 61 6e 64 20 70   Transient and p
0450: 65 72 73 69 73 74 65 6e 74 20 49 4f 20 65 72 72  ersistent IO err
0460: 6f 72 73 3a 0a 23 0a 73 65 74 20 46 41 55 4c 54  ors:.#.set FAULT
0470: 53 49 4d 28 69 6f 65 72 72 2d 74 72 61 6e 73 69  SIM(ioerr-transi
0480: 65 6e 74 29 20 5b 6c 69 73 74 20 20 20 20 20 20  ent) [list      
0490: 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 73 74 61    \.  -injectsta
04a0: 72 74 20 20 20 7b 69 6f 65 72 72 5f 69 6e 6a 65  rt   {ioerr_inje
04b0: 63 74 73 74 61 72 74 20 30 7d 20 20 20 20 20 5c  ctstart 0}     \
04c0: 0a 20 20 2d 69 6e 6a 65 63 74 73 74 6f 70 20 20  .  -injectstop  
04d0: 20 20 69 6f 65 72 72 5f 69 6e 6a 65 63 74 73 74    ioerr_injectst
04e0: 6f 70 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20  op          \.  
04f0: 2d 69 6e 6a 65 63 74 65 72 72 6c 69 73 74 20 7b  -injecterrlist {
0500: 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72  {1 {disk I/O err
0510: 6f 72 7d 7d 7d 20 20 20 20 5c 0a 5d 0a 73 65 74  or}}}    \.].set
0520: 20 46 41 55 4c 54 53 49 4d 28 69 6f 65 72 72 2d   FAULTSIM(ioerr-
0530: 70 65 72 73 69 73 74 65 6e 74 29 20 5b 6c 69 73  persistent) [lis
0540: 74 20 20 20 20 20 20 20 5c 0a 20 20 2d 69 6e 6a  t       \.  -inj
0550: 65 63 74 73 74 61 72 74 20 20 20 7b 69 6f 65 72  ectstart   {ioer
0560: 72 5f 69 6e 6a 65 63 74 73 74 61 72 74 20 31 7d  r_injectstart 1}
0570: 20 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74       \.  -inject
0580: 73 74 6f 70 20 20 20 20 69 6f 65 72 72 5f 69 6e  stop    ioerr_in
0590: 6a 65 63 74 73 74 6f 70 20 20 20 20 20 20 20 20  jectstop        
05a0: 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 65 72 72    \.  -injecterr
05b0: 6c 69 73 74 20 7b 7b 31 20 7b 64 69 73 6b 20 49  list {{1 {disk I
05c0: 2f 4f 20 65 72 72 6f 72 7d 7d 7d 20 20 20 20 5c  /O error}}}    \
05d0: 0a 5d 0a 0a 23 20 53 51 4c 49 54 45 5f 46 55 4c  .]..# SQLITE_FUL
05e0: 4c 20 65 72 72 6f 72 73 20 28 61 6c 77 61 79 73  L errors (always
05f0: 20 70 65 72 73 69 73 74 65 6e 74 29 3a 0a 23 0a   persistent):.#.
0600: 73 65 74 20 46 41 55 4c 54 53 49 4d 28 66 75 6c  set FAULTSIM(ful
0610: 6c 29 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  l) [list        
0620: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 2d             \.  -
0630: 69 6e 6a 65 63 74 69 6e 73 74 61 6c 6c 20 20 20  injectinstall   
0640: 66 75 6c 6c 65 72 72 5f 69 6e 6a 65 63 74 69 6e  fullerr_injectin
0650: 73 74 61 6c 6c 20 20 20 5c 0a 20 20 2d 69 6e 6a  stall   \.  -inj
0660: 65 63 74 73 74 61 72 74 20 20 20 20 20 66 75 6c  ectstart     ful
0670: 6c 65 72 72 5f 69 6e 6a 65 63 74 73 74 61 72 74  lerr_injectstart
0680: 20 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74       \.  -inject
0690: 73 74 6f 70 20 20 20 20 20 20 66 75 6c 6c 65 72  stop      fuller
06a0: 72 5f 69 6e 6a 65 63 74 73 74 6f 70 20 20 20 20  r_injectstop    
06b0: 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 65 72 72    \.  -injecterr
06c0: 6c 69 73 74 20 20 20 7b 7b 31 20 7b 64 61 74 61  list   {{1 {data
06d0: 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20  base or disk is 
06e0: 66 75 6c 6c 7d 7d 7d 20 5c 0a 20 20 2d 69 6e 6a  full}}} \.  -inj
06f0: 65 63 74 75 6e 69 6e 73 74 61 6c 6c 20 66 75 6c  ectuninstall ful
0700: 6c 65 72 72 5f 69 6e 6a 65 63 74 75 6e 69 6e 73  lerr_injectunins
0710: 74 61 6c 6c 20 5c 0a 5d 0a 0a 23 20 54 72 61 6e  tall \.]..# Tran
0720: 73 69 65 6e 74 20 61 6e 64 20 70 65 72 73 69 73  sient and persis
0730: 74 65 6e 74 20 53 48 4d 20 65 72 72 6f 72 73 3a  tent SHM errors:
0740: 0a 23 0a 73 65 74 20 46 41 55 4c 54 53 49 4d 28  .#.set FAULTSIM(
0750: 73 68 6d 65 72 72 2d 74 72 61 6e 73 69 65 6e 74  shmerr-transient
0760: 29 20 5b 6c 69 73 74 20 20 20 20 20 20 20 5c 0a  ) [list       \.
0770: 20 20 2d 69 6e 6a 65 63 74 69 6e 73 74 61 6c 6c    -injectinstall
0780: 20 20 20 73 68 6d 65 72 72 5f 69 6e 6a 65 63 74     shmerr_inject
0790: 69 6e 73 74 61 6c 6c 20 20 20 20 5c 0a 20 20 2d  install    \.  -
07a0: 69 6e 6a 65 63 74 73 74 61 72 74 20 20 20 20 20  injectstart     
07b0: 7b 73 68 6d 65 72 72 5f 69 6e 6a 65 63 74 73 74  {shmerr_injectst
07c0: 61 72 74 20 30 7d 20 20 5c 0a 20 20 2d 69 6e 6a  art 0}  \.  -inj
07d0: 65 63 74 73 74 6f 70 20 20 20 20 20 20 73 68 6d  ectstop      shm
07e0: 65 72 72 5f 69 6e 6a 65 63 74 73 74 6f 70 20 20  err_injectstop  
07f0: 20 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74       \.  -inject
0800: 65 72 72 6c 69 73 74 20 20 20 7b 7b 31 20 7b 64  errlist   {{1 {d
0810: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 7d  isk I/O error}}}
0820: 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 75 6e 69    \.  -injectuni
0830: 6e 73 74 61 6c 6c 20 73 68 6d 65 72 72 5f 69 6e  nstall shmerr_in
0840: 6a 65 63 74 75 6e 69 6e 73 74 61 6c 6c 20 20 5c  jectuninstall  \
0850: 0a 5d 0a 73 65 74 20 46 41 55 4c 54 53 49 4d 28  .].set FAULTSIM(
0860: 73 68 6d 65 72 72 2d 70 65 72 73 69 73 74 65 6e  shmerr-persisten
0870: 74 29 20 5b 6c 69 73 74 20 20 20 20 20 20 5c 0a  t) [list      \.
0880: 20 20 2d 69 6e 6a 65 63 74 69 6e 73 74 61 6c 6c    -injectinstall
0890: 20 20 20 73 68 6d 65 72 72 5f 69 6e 6a 65 63 74     shmerr_inject
08a0: 69 6e 73 74 61 6c 6c 20 20 20 20 5c 0a 20 20 2d  install    \.  -
08b0: 69 6e 6a 65 63 74 73 74 61 72 74 20 20 20 20 20  injectstart     
08c0: 7b 73 68 6d 65 72 72 5f 69 6e 6a 65 63 74 73 74  {shmerr_injectst
08d0: 61 72 74 20 31 7d 20 20 5c 0a 20 20 2d 69 6e 6a  art 1}  \.  -inj
08e0: 65 63 74 73 74 6f 70 20 20 20 20 20 20 73 68 6d  ectstop      shm
08f0: 65 72 72 5f 69 6e 6a 65 63 74 73 74 6f 70 20 20  err_injectstop  
0900: 20 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74       \.  -inject
0910: 65 72 72 6c 69 73 74 20 20 20 7b 7b 31 20 7b 64  errlist   {{1 {d
0920: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 7d  isk I/O error}}}
0930: 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 75 6e 69    \.  -injectuni
0940: 6e 73 74 61 6c 6c 20 73 68 6d 65 72 72 5f 69 6e  nstall shmerr_in
0950: 6a 65 63 74 75 6e 69 6e 73 74 61 6c 6c 20 20 5c  jectuninstall  \
0960: 0a 5d 0a 0a 23 20 54 72 61 6e 73 69 65 6e 74 20  .]..# Transient 
0970: 61 6e 64 20 70 65 72 73 69 73 74 65 6e 74 20 43  and persistent C
0980: 41 4e 54 4f 50 45 4e 20 65 72 72 6f 72 73 3a 0a  ANTOPEN errors:.
0990: 23 0a 73 65 74 20 46 41 55 4c 54 53 49 4d 28 63  #.set FAULTSIM(c
09a0: 61 6e 74 6f 70 65 6e 2d 74 72 61 6e 73 69 65 6e  antopen-transien
09b0: 74 29 20 5b 6c 69 73 74 20 20 20 20 20 20 20 5c  t) [list       \
09c0: 0a 20 20 2d 69 6e 6a 65 63 74 69 6e 73 74 61 6c  .  -injectinstal
09d0: 6c 20 20 20 63 61 6e 74 6f 70 65 6e 5f 69 6e 6a  l   cantopen_inj
09e0: 65 63 74 69 6e 73 74 61 6c 6c 20 20 20 20 5c 0a  ectinstall    \.
09f0: 20 20 2d 69 6e 6a 65 63 74 73 74 61 72 74 20 20    -injectstart  
0a00: 20 20 20 7b 63 61 6e 74 6f 70 65 6e 5f 69 6e 6a     {cantopen_inj
0a10: 65 63 74 73 74 61 72 74 20 30 7d 20 20 5c 0a 20  ectstart 0}  \. 
0a20: 20 2d 69 6e 6a 65 63 74 73 74 6f 70 20 20 20 20   -injectstop    
0a30: 20 20 63 61 6e 74 6f 70 65 6e 5f 69 6e 6a 65 63    cantopen_injec
0a40: 74 73 74 6f 70 20 20 20 20 20 20 20 5c 0a 20 20  tstop       \.  
0a50: 2d 69 6e 6a 65 63 74 65 72 72 6c 69 73 74 20 20  -injecterrlist  
0a60: 20 7b 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20   {{1 {unable to 
0a70: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
0a80: 6c 65 7d 7d 7d 20 20 5c 0a 20 20 2d 69 6e 6a 65  le}}}  \.  -inje
0a90: 63 74 75 6e 69 6e 73 74 61 6c 6c 20 63 61 6e 74  ctuninstall cant
0aa0: 6f 70 65 6e 5f 69 6e 6a 65 63 74 75 6e 69 6e 73  open_injectunins
0ab0: 74 61 6c 6c 20 20 5c 0a 5d 0a 73 65 74 20 46 41  tall  \.].set FA
0ac0: 55 4c 54 53 49 4d 28 63 61 6e 74 6f 70 65 6e 2d  ULTSIM(cantopen-
0ad0: 70 65 72 73 69 73 74 65 6e 74 29 20 5b 6c 69 73  persistent) [lis
0ae0: 74 20 20 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65  t      \.  -inje
0af0: 63 74 69 6e 73 74 61 6c 6c 20 20 20 63 61 6e 74  ctinstall   cant
0b00: 6f 70 65 6e 5f 69 6e 6a 65 63 74 69 6e 73 74 61  open_injectinsta
0b10: 6c 6c 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65 63  ll    \.  -injec
0b20: 74 73 74 61 72 74 20 20 20 20 20 7b 63 61 6e 74  tstart     {cant
0b30: 6f 70 65 6e 5f 69 6e 6a 65 63 74 73 74 61 72 74  open_injectstart
0b40: 20 31 7d 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74   1}  \.  -inject
0b50: 73 74 6f 70 20 20 20 20 20 20 63 61 6e 74 6f 70  stop      cantop
0b60: 65 6e 5f 69 6e 6a 65 63 74 73 74 6f 70 20 20 20  en_injectstop   
0b70: 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 65      \.  -injecte
0b80: 72 72 6c 69 73 74 20 20 20 7b 7b 31 20 7b 75 6e  rrlist   {{1 {un
0b90: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
0ba0: 61 62 61 73 65 20 66 69 6c 65 7d 7d 7d 20 20 5c  abase file}}}  \
0bb0: 0a 20 20 2d 69 6e 6a 65 63 74 75 6e 69 6e 73 74  .  -injectuninst
0bc0: 61 6c 6c 20 63 61 6e 74 6f 70 65 6e 5f 69 6e 6a  all cantopen_inj
0bd0: 65 63 74 75 6e 69 6e 73 74 61 6c 6c 20 20 5c 0a  ectuninstall  \.
0be0: 5d 0a 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ]....#----------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 0a 23 20 55 73 61 67 65 20 64 6f 5f 66 61 75 6c  .# Usage do_faul
0c40: 74 73 69 6d 5f 74 65 73 74 20 4e 41 4d 45 20 3f  tsim_test NAME ?
0c50: 4f 50 54 49 4f 4e 53 2e 2e 2e 3f 20 0a 23 0a 23  OPTIONS...? .#.#
0c60: 20 20 20 20 20 2d 66 61 75 6c 74 73 20 20 20 20       -faults    
0c70: 20 20 20 20 20 20 20 4c 69 73 74 20 6f 66 20 66         List of f
0c80: 61 75 6c 74 20 74 79 70 65 73 20 74 6f 20 73 69  ault types to si
0c90: 6d 75 6c 61 74 65 2e 0a 23 0a 23 20 20 20 20 20  mulate..#.#     
0ca0: 2d 70 72 65 70 20 20 20 20 20 20 20 20 20 20 20  -prep           
0cb0: 20 20 53 63 72 69 70 74 20 74 6f 20 65 78 65 63    Script to exec
0cc0: 75 74 65 20 62 65 66 6f 72 65 20 2d 62 6f 64 79  ute before -body
0cd0: 2e 0a 23 0a 23 20 20 20 20 20 2d 62 6f 64 79 20  ..#.#     -body 
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 53 63 72 69              Scri
0cf0: 70 74 20 74 6f 20 65 78 65 63 75 74 65 20 28 77  pt to execute (w
0d00: 69 74 68 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ith fault inject
0d10: 69 6f 6e 29 2e 0a 23 0a 23 20 20 20 20 20 2d 74  ion)..#.#     -t
0d20: 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
0d30: 53 63 72 69 70 74 20 74 6f 20 65 78 65 63 75 74  Script to execut
0d40: 65 20 61 66 74 65 72 20 2d 62 6f 64 79 2e 0a 23  e after -body..#
0d50: 0a 70 72 6f 63 20 64 6f 5f 66 61 75 6c 74 73 69  .proc do_faultsi
0d60: 6d 5f 74 65 73 74 20 7b 6e 61 6d 65 20 61 72 67  m_test {name arg
0d70: 73 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 46 41  s} {.  global FA
0d80: 55 4c 54 53 49 4d 0a 20 20 0a 20 20 73 65 74 20  ULTSIM.  .  set 
0d90: 44 45 46 41 55 4c 54 28 2d 66 61 75 6c 74 73 29  DEFAULT(-faults)
0da0: 20 20 20 20 20 20 20 20 5b 61 72 72 61 79 20 6e          [array n
0db0: 61 6d 65 73 20 46 41 55 4c 54 53 49 4d 5d 0a 20  ames FAULTSIM]. 
0dc0: 20 73 65 74 20 44 45 46 41 55 4c 54 28 2d 70 72   set DEFAULT(-pr
0dd0: 65 70 29 20 20 20 20 20 20 20 20 20 20 22 22 0a  ep)          "".
0de0: 20 20 73 65 74 20 44 45 46 41 55 4c 54 28 2d 62    set DEFAULT(-b
0df0: 6f 64 79 29 20 20 20 20 20 20 20 20 20 20 22 22  ody)          ""
0e00: 0a 20 20 73 65 74 20 44 45 46 41 55 4c 54 28 2d  .  set DEFAULT(-
0e10: 74 65 73 74 29 20 20 20 20 20 20 20 20 20 20 22  test)          "
0e20: 22 0a 0a 20 20 61 72 72 61 79 20 73 65 74 20 4f  "..  array set O
0e30: 20 5b 61 72 72 61 79 20 67 65 74 20 44 45 46 41   [array get DEFA
0e40: 55 4c 54 5d 0a 20 20 61 72 72 61 79 20 73 65 74  ULT].  array set
0e50: 20 4f 20 24 61 72 67 73 0a 20 20 66 6f 72 65 61   O $args.  forea
0e60: 63 68 20 6f 20 5b 61 72 72 61 79 20 6e 61 6d 65  ch o [array name
0e70: 73 20 4f 5d 20 7b 0a 20 20 20 20 69 66 20 7b 5b  s O] {.    if {[
0e80: 69 6e 66 6f 20 65 78 69 73 74 73 20 44 45 46 41  info exists DEFA
0e90: 55 4c 54 28 24 6f 29 5d 3d 3d 30 7d 20 7b 20 65  ULT($o)]==0} { e
0ea0: 72 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  rror "unknown op
0eb0: 74 69 6f 6e 3a 20 24 6f 22 20 7d 0a 20 20 7d 0a  tion: $o" }.  }.
0ec0: 0a 20 20 73 65 74 20 66 61 75 6c 74 6c 69 73 74  .  set faultlist
0ed0: 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61 63   [list].  foreac
0ee0: 68 20 66 20 24 4f 28 2d 66 61 75 6c 74 73 29 20  h f $O(-faults) 
0ef0: 7b 0a 20 20 20 20 73 65 74 20 66 6c 69 73 74 20  {.    set flist 
0f00: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 46 41 55  [array names FAU
0f10: 4c 54 53 49 4d 20 24 66 5d 0a 20 20 20 20 69 66  LTSIM $f].    if
0f20: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 6c 69 73   {[llength $flis
0f30: 74 5d 3d 3d 30 7d 20 7b 20 65 72 72 6f 72 20 22  t]==0} { error "
0f40: 75 6e 6b 6e 6f 77 6e 20 66 61 75 6c 74 3a 20 24  unknown fault: $
0f50: 66 22 20 7d 0a 20 20 20 20 73 65 74 20 66 61 75  f" }.    set fau
0f60: 6c 74 6c 69 73 74 20 5b 63 6f 6e 63 61 74 20 24  ltlist [concat $
0f70: 66 61 75 6c 74 6c 69 73 74 20 24 66 6c 69 73 74  faultlist $flist
0f80: 5d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 74 65 73  ].  }..  set tes
0f90: 74 73 70 65 63 20 5b 6c 69 73 74 20 2d 70 72 65  tspec [list -pre
0fa0: 70 20 24 4f 28 2d 70 72 65 70 29 20 2d 62 6f 64  p $O(-prep) -bod
0fb0: 79 20 24 4f 28 2d 62 6f 64 79 29 20 2d 74 65 73  y $O(-body) -tes
0fc0: 74 20 24 4f 28 2d 74 65 73 74 29 5d 0a 20 20 66  t $O(-test)].  f
0fd0: 6f 72 65 61 63 68 20 66 20 5b 6c 73 6f 72 74 20  oreach f [lsort 
0fe0: 2d 75 6e 69 71 75 65 20 24 66 61 75 6c 74 6c 69  -unique $faultli
0ff0: 73 74 5d 20 7b 0a 20 20 20 20 65 76 61 6c 20 64  st] {.    eval d
1000: 6f 5f 6f 6e 65 5f 66 61 75 6c 74 73 69 6d 5f 74  o_one_faultsim_t
1010: 65 73 74 20 22 24 6e 61 6d 65 2d 24 66 22 20 24  est "$name-$f" $
1020: 46 41 55 4c 54 53 49 4d 28 24 66 29 20 24 74 65  FAULTSIM($f) $te
1030: 73 74 73 70 65 63 0a 20 20 7d 0a 7d 0a 0a 23 2d  stspec.  }.}..#-
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1080: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 50 72 6f 63 65  --------.# Proce
1090: 64 75 72 65 73 20 74 6f 20 73 61 76 65 20 61 6e  dures to save an
10a0: 64 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  d restore the cu
10b0: 72 72 65 6e 74 20 66 69 6c 65 2d 73 79 73 74 65  rrent file-syste
10c0: 6d 20 73 74 61 74 65 3a 0a 23 0a 23 20 20 20 66  m state:.#.#   f
10d0: 61 75 6c 74 73 69 6d 5f 73 61 76 65 0a 23 20 20  aultsim_save.#  
10e0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
10f0: 65 0a 23 20 20 20 66 61 75 6c 74 73 69 6d 5f 73  e.#   faultsim_s
1100: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 23 20  ave_and_close.# 
1110: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
1120: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 23 20  re_and_reopen.# 
1130: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
1140: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 23 0a 70  e_and_reopen.#.p
1150: 72 6f 63 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  roc faultsim_sav
1160: 65 20 7b 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68  e {} {.  foreach
1170: 20 66 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70   f [glob -nocomp
1180: 6c 61 69 6e 20 73 76 5f 74 65 73 74 2e 64 62 2a  lain sv_test.db*
1190: 5d 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20  ] { file delete 
11a0: 2d 66 6f 72 63 65 20 24 66 20 7d 0a 20 20 66 6f  -force $f }.  fo
11b0: 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 2d 6e  reach f [glob -n
11c0: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 2e 64  ocomplain test.d
11d0: 62 2a 5d 20 7b 0a 20 20 20 20 73 65 74 20 66 32  b*] {.    set f2
11e0: 20 22 73 76 5f 24 66 22 0a 20 20 20 20 66 69 6c   "sv_$f".    fil
11f0: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 66  e copy -force $f
1200: 20 24 66 32 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20   $f2.  }.}.proc 
1210: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e  faultsim_save_an
1220: 64 5f 63 6c 6f 73 65 20 7b 7d 20 7b 0a 20 20 66  d_close {} {.  f
1230: 61 75 6c 74 73 69 6d 5f 73 61 76 65 0a 20 20 63  aultsim_save.  c
1240: 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
1250: 7d 0a 20 20 72 65 74 75 72 6e 20 22 22 0a 7d 0a  }.  return "".}.
1260: 70 72 6f 63 20 66 61 75 6c 74 73 69 6d 5f 72 65  proc faultsim_re
1270: 73 74 6f 72 65 20 7b 7d 20 7b 0a 20 20 66 6f 72  store {} {.  for
1280: 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 2d 6e 6f  each f [glob -no
1290: 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 2e 64 62  complain test.db
12a0: 2a 5d 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65  *] { file delete
12b0: 20 2d 66 6f 72 63 65 20 24 66 20 7d 0a 20 20 66   -force $f }.  f
12c0: 6f 72 65 61 63 68 20 66 32 20 5b 67 6c 6f 62 20  oreach f2 [glob 
12d0: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 76 5f 74  -nocomplain sv_t
12e0: 65 73 74 2e 64 62 2a 5d 20 7b 0a 20 20 20 20 73  est.db*] {.    s
12f0: 65 74 20 66 20 5b 73 74 72 69 6e 67 20 72 61 6e  et f [string ran
1300: 67 65 20 24 66 32 20 33 20 65 6e 64 5d 0a 20 20  ge $f2 3 end].  
1310: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
1320: 63 65 20 24 66 32 20 24 66 0a 20 20 7d 0a 7d 0a  ce $f2 $f.  }.}.
1330: 70 72 6f 63 20 66 61 75 6c 74 73 69 6d 5f 72 65  proc faultsim_re
1340: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
1350: 20 7b 7b 64 62 66 69 6c 65 20 74 65 73 74 2e 64   {{dbfile test.d
1360: 62 7d 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b 20  b}} {.  catch { 
1370: 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 61 75  db close }.  fau
1380: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 0a 20 20  ltsim_restore.  
1390: 73 71 6c 69 74 65 33 20 64 62 20 24 64 62 66 69  sqlite3 db $dbfi
13a0: 6c 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74  le.  sqlite3_ext
13b0: 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
13c0: 65 73 20 64 62 20 31 0a 20 20 73 71 6c 69 74 65  es db 1.  sqlite
13d0: 33 5f 64 62 5f 63 6f 6e 66 69 67 5f 6c 6f 6f 6b  3_db_config_look
13e0: 61 73 69 64 65 20 64 62 20 30 20 30 20 30 0a 7d  aside db 0 0 0.}
13f0: 0a 0a 70 72 6f 63 20 66 61 75 6c 74 73 69 6d 5f  ..proc faultsim_
1400: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
1410: 7b 7b 64 62 20 64 62 7d 7d 20 7b 0a 20 20 73 65  {{db db}} {.  se
1420: 74 20 69 63 20 5b 24 64 62 20 65 76 61 6c 20 7b  t ic [$db eval {
1430: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
1440: 79 5f 63 68 65 63 6b 20 7d 5d 0a 20 20 69 66 20  y_check }].  if 
1450: 7b 24 69 63 20 21 3d 20 22 6f 6b 22 7d 20 7b 20  {$ic != "ok"} { 
1460: 65 72 72 6f 72 20 22 49 6e 74 65 67 72 69 74 79  error "Integrity
1470: 20 63 68 65 63 6b 3a 20 24 69 63 22 20 7d 0a 7d   check: $ic" }.}
1480: 0a 0a 70 72 6f 63 20 66 61 75 6c 74 73 69 6d 5f  ..proc faultsim_
1490: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
14a0: 6e 20 7b 7b 66 69 6c 65 20 74 65 73 74 2e 64 62  n {{file test.db
14b0: 7d 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b 20 64  }} {.  catch { d
14c0: 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 6f 72 65  b close }.  fore
14d0: 61 63 68 20 66 20 5b 67 6c 6f 62 20 2d 6e 6f 63  ach f [glob -noc
14e0: 6f 6d 70 6c 61 69 6e 20 74 65 73 74 2e 64 62 2a  omplain test.db*
14f0: 5d 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20  ] { file delete 
1500: 2d 66 6f 72 63 65 20 24 66 20 7d 0a 20 20 73 71  -force $f }.  sq
1510: 6c 69 74 65 33 20 64 62 20 24 66 69 6c 65 0a 7d  lite3 db $file.}
1520: 0a 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ...# The followi
1530: 6e 67 20 70 72 6f 63 73 20 61 72 65 20 75 73 65  ng procs are use
1540: 64 20 61 73 20 5b 64 6f 5f 6f 6e 65 5f 66 61 75  d as [do_one_fau
1550: 6c 74 73 69 6d 5f 74 65 73 74 5d 20 63 61 6c 6c  ltsim_test] call
1560: 62 61 63 6b 73 20 77 68 65 6e 20 0a 23 20 69 6e  backs when .# in
1570: 6a 65 63 74 69 6e 67 20 4f 4f 4d 20 66 61 75 6c  jecting OOM faul
1580: 74 73 20 69 6e 74 6f 20 74 65 73 74 20 63 61 73  ts into test cas
1590: 65 73 2e 0a 23 0a 70 72 6f 63 20 6f 6f 6d 5f 69  es..#.proc oom_i
15a0: 6e 6a 65 63 74 73 74 61 72 74 20 7b 6e 52 65 70  njectstart {nRep
15b0: 65 61 74 20 69 46 61 69 6c 7d 20 7b 0a 20 20 73  eat iFail} {.  s
15c0: 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f  qlite3_memdebug_
15d0: 66 61 69 6c 20 5b 65 78 70 72 20 24 69 46 61 69  fail [expr $iFai
15e0: 6c 2d 31 5d 20 2d 72 65 70 65 61 74 20 24 6e 52  l-1] -repeat $nR
15f0: 65 70 65 61 74 0a 7d 0a 70 72 6f 63 20 6f 6f 6d  epeat.}.proc oom
1600: 5f 69 6e 6a 65 63 74 73 74 6f 70 20 7b 7d 20 7b  _injectstop {} {
1610: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65  .  sqlite3_memde
1620: 62 75 67 5f 66 61 69 6c 20 2d 31 0a 7d 0a 0a 23  bug_fail -1.}..#
1630: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
1640: 72 6f 63 73 20 61 72 65 20 75 73 65 64 20 61 73  rocs are used as
1650: 20 5b 64 6f 5f 6f 6e 65 5f 66 61 75 6c 74 73 69   [do_one_faultsi
1660: 6d 5f 74 65 73 74 5d 20 63 61 6c 6c 62 61 63 6b  m_test] callback
1670: 73 20 77 68 65 6e 20 0a 23 20 69 6e 6a 65 63 74  s when .# inject
1680: 69 6e 67 20 49 4f 20 65 72 72 6f 72 20 66 61 75  ing IO error fau
1690: 6c 74 73 20 69 6e 74 6f 20 74 65 73 74 20 63 61  lts into test ca
16a0: 73 65 73 2e 0a 23 0a 70 72 6f 63 20 69 6f 65 72  ses..#.proc ioer
16b0: 72 5f 69 6e 6a 65 63 74 73 74 61 72 74 20 7b 70  r_injectstart {p
16c0: 65 72 73 69 73 74 20 69 46 61 69 6c 7d 20 7b 0a  ersist iFail} {.
16d0: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69    set ::sqlite_i
16e0: 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73 74 20  o_error_persist 
16f0: 24 70 65 72 73 69 73 74 0a 20 20 73 65 74 20 3a  $persist.  set :
1700: 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72  :sqlite_io_error
1710: 5f 70 65 6e 64 69 6e 67 20 24 69 46 61 69 6c 0a  _pending $iFail.
1720: 7d 0a 70 72 6f 63 20 69 6f 65 72 72 5f 69 6e 6a  }.proc ioerr_inj
1730: 65 63 74 73 74 6f 70 20 7b 7d 20 7b 0a 20 20 73  ectstop {} {.  s
1740: 65 74 20 73 76 20 24 3a 3a 73 71 6c 69 74 65 5f  et sv $::sqlite_
1750: 69 6f 5f 65 72 72 6f 72 5f 68 69 74 0a 20 20 73  io_error_hit.  s
1760: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65  et ::sqlite_io_e
1770: 72 72 6f 72 5f 70 65 72 73 69 73 74 20 30 0a 20  rror_persist 0. 
1780: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f   set ::sqlite_io
1790: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 30  _error_pending 0
17a0: 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f  .  set ::sqlite_
17b0: 69 6f 5f 65 72 72 6f 72 5f 68 61 72 64 68 69 74  io_error_hardhit
17c0: 20 30 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74   0.  set ::sqlit
17d0: 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 20  e_io_error_hit  
17e0: 20 20 20 30 0a 20 20 73 65 74 20 3a 3a 73 71 6c     0.  set ::sql
17f0: 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  ite_io_error_pen
1800: 64 69 6e 67 20 30 0a 20 20 72 65 74 75 72 6e 20  ding 0.  return 
1810: 24 73 76 0a 7d 0a 0a 23 20 54 68 65 20 66 6f 6c  $sv.}..# The fol
1820: 6c 6f 77 69 6e 67 20 70 72 6f 63 73 20 61 72 65  lowing procs are
1830: 20 75 73 65 64 20 61 73 20 5b 64 6f 5f 6f 6e 65   used as [do_one
1840: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5d 20  _faultsim_test] 
1850: 63 61 6c 6c 62 61 63 6b 73 20 77 68 65 6e 20 0a  callbacks when .
1860: 23 20 69 6e 6a 65 63 74 69 6e 67 20 73 68 61 72  # injecting shar
1870: 65 64 2d 6d 65 6d 6f 72 79 20 72 65 6c 61 74 65  ed-memory relate
1880: 64 20 65 72 72 6f 72 20 66 61 75 6c 74 73 20 69  d error faults i
1890: 6e 74 6f 20 74 65 73 74 20 63 61 73 65 73 2e 0a  nto test cases..
18a0: 23 0a 70 72 6f 63 20 73 68 6d 65 72 72 5f 69 6e  #.proc shmerr_in
18b0: 6a 65 63 74 69 6e 73 74 61 6c 6c 20 7b 7d 20 7b  jectinstall {} {
18c0: 0a 20 20 74 65 73 74 76 66 73 20 73 68 6d 66 61  .  testvfs shmfa
18d0: 75 6c 74 20 2d 64 65 66 61 75 6c 74 20 74 72 75  ult -default tru
18e0: 65 0a 20 20 73 68 6d 66 61 75 6c 74 20 66 69 6c  e.  shmfault fil
18f0: 74 65 72 20 7b 78 53 68 6d 4f 70 65 6e 20 78 53  ter {xShmOpen xS
1900: 68 6d 4d 61 70 20 78 53 68 6d 4c 6f 63 6b 7d 0a  hmMap xShmLock}.
1910: 7d 0a 70 72 6f 63 20 73 68 6d 65 72 72 5f 69 6e  }.proc shmerr_in
1920: 6a 65 63 74 75 6e 69 6e 73 74 61 6c 6c 20 7b 7d  jectuninstall {}
1930: 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 20   {.  catch {db  
1940: 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20 7b  close}.  catch {
1950: 64 62 32 20 63 6c 6f 73 65 7d 0a 20 20 73 68 6d  db2 close}.  shm
1960: 66 61 75 6c 74 20 64 65 6c 65 74 65 0a 7d 0a 70  fault delete.}.p
1970: 72 6f 63 20 73 68 6d 65 72 72 5f 69 6e 6a 65 63  roc shmerr_injec
1980: 74 73 74 61 72 74 20 7b 70 65 72 73 69 73 74 20  tstart {persist 
1990: 69 46 61 69 6c 7d 20 7b 0a 20 20 73 68 6d 66 61  iFail} {.  shmfa
19a0: 75 6c 74 20 69 6f 65 72 72 20 24 69 46 61 69 6c  ult ioerr $iFail
19b0: 20 24 70 65 72 73 69 73 74 0a 7d 0a 70 72 6f 63   $persist.}.proc
19c0: 20 73 68 6d 65 72 72 5f 69 6e 6a 65 63 74 73 74   shmerr_injectst
19d0: 6f 70 20 7b 7d 20 7b 0a 20 20 73 68 6d 66 61 75  op {} {.  shmfau
19e0: 6c 74 20 69 6f 65 72 72 0a 7d 0a 0a 23 20 54 68  lt ioerr.}..# Th
19f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
1a00: 73 20 61 72 65 20 75 73 65 64 20 61 73 20 5b 64  s are used as [d
1a10: 6f 5f 6f 6e 65 5f 66 61 75 6c 74 73 69 6d 5f 74  o_one_faultsim_t
1a20: 65 73 74 5d 20 63 61 6c 6c 62 61 63 6b 73 20 77  est] callbacks w
1a30: 68 65 6e 20 0a 23 20 69 6e 6a 65 63 74 69 6e 67  hen .# injecting
1a40: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72   SQLITE_FULL err
1a50: 6f 72 20 66 61 75 6c 74 73 20 69 6e 74 6f 20 74  or faults into t
1a60: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 70 72 6f  est cases..#.pro
1a70: 63 20 66 75 6c 6c 65 72 72 5f 69 6e 6a 65 63 74  c fullerr_inject
1a80: 69 6e 73 74 61 6c 6c 20 7b 7d 20 7b 0a 20 20 74  install {} {.  t
1a90: 65 73 74 76 66 73 20 73 68 6d 66 61 75 6c 74 20  estvfs shmfault 
1aa0: 2d 64 65 66 61 75 6c 74 20 74 72 75 65 0a 7d 0a  -default true.}.
1ab0: 70 72 6f 63 20 66 75 6c 6c 65 72 72 5f 69 6e 6a  proc fullerr_inj
1ac0: 65 63 74 75 6e 69 6e 73 74 61 6c 6c 20 7b 7d 20  ectuninstall {} 
1ad0: 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 20 63  {.  catch {db  c
1ae0: 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20 7b 64  lose}.  catch {d
1af0: 62 32 20 63 6c 6f 73 65 7d 0a 20 20 73 68 6d 66  b2 close}.  shmf
1b00: 61 75 6c 74 20 64 65 6c 65 74 65 0a 7d 0a 70 72  ault delete.}.pr
1b10: 6f 63 20 66 75 6c 6c 65 72 72 5f 69 6e 6a 65 63  oc fullerr_injec
1b20: 74 73 74 61 72 74 20 7b 69 46 61 69 6c 7d 20 7b  tstart {iFail} {
1b30: 0a 20 20 73 68 6d 66 61 75 6c 74 20 66 75 6c 6c  .  shmfault full
1b40: 20 24 69 46 61 69 6c 20 31 0a 7d 0a 70 72 6f 63   $iFail 1.}.proc
1b50: 20 66 75 6c 6c 65 72 72 5f 69 6e 6a 65 63 74 73   fullerr_injects
1b60: 74 6f 70 20 7b 7d 20 7b 0a 20 20 73 68 6d 66 61  top {} {.  shmfa
1b70: 75 6c 74 20 66 75 6c 6c 0a 7d 0a 0a 23 20 54 68  ult full.}..# Th
1b80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
1b90: 73 20 61 72 65 20 75 73 65 64 20 61 73 20 5b 64  s are used as [d
1ba0: 6f 5f 6f 6e 65 5f 66 61 75 6c 74 73 69 6d 5f 74  o_one_faultsim_t
1bb0: 65 73 74 5d 20 63 61 6c 6c 62 61 63 6b 73 20 77  est] callbacks w
1bc0: 68 65 6e 20 0a 23 20 69 6e 6a 65 63 74 69 6e 67  hen .# injecting
1bd0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1be0: 20 65 72 72 6f 72 20 66 61 75 6c 74 73 20 69 6e   error faults in
1bf0: 74 6f 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23  to test cases..#
1c00: 0a 70 72 6f 63 20 63 61 6e 74 6f 70 65 6e 5f 69  .proc cantopen_i
1c10: 6e 6a 65 63 74 69 6e 73 74 61 6c 6c 20 7b 7d 20  njectinstall {} 
1c20: 7b 0a 20 20 74 65 73 74 76 66 73 20 73 68 6d 66  {.  testvfs shmf
1c30: 61 75 6c 74 20 2d 64 65 66 61 75 6c 74 20 74 72  ault -default tr
1c40: 75 65 0a 7d 0a 70 72 6f 63 20 63 61 6e 74 6f 70  ue.}.proc cantop
1c50: 65 6e 5f 69 6e 6a 65 63 74 75 6e 69 6e 73 74 61  en_injectuninsta
1c60: 6c 6c 20 7b 7d 20 7b 0a 20 20 63 61 74 63 68 20  ll {} {.  catch 
1c70: 7b 64 62 20 20 63 6c 6f 73 65 7d 0a 20 20 63 61  {db  close}.  ca
1c80: 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a  tch {db2 close}.
1c90: 20 20 73 68 6d 66 61 75 6c 74 20 64 65 6c 65 74    shmfault delet
1ca0: 65 0a 7d 0a 70 72 6f 63 20 63 61 6e 74 6f 70 65  e.}.proc cantope
1cb0: 6e 5f 69 6e 6a 65 63 74 73 74 61 72 74 20 7b 70  n_injectstart {p
1cc0: 65 72 73 69 73 74 20 69 46 61 69 6c 7d 20 7b 0a  ersist iFail} {.
1cd0: 20 20 73 68 6d 66 61 75 6c 74 20 63 61 6e 74 6f    shmfault canto
1ce0: 70 65 6e 20 24 69 46 61 69 6c 20 24 70 65 72 73  pen $iFail $pers
1cf0: 69 73 74 0a 7d 0a 70 72 6f 63 20 63 61 6e 74 6f  ist.}.proc canto
1d00: 70 65 6e 5f 69 6e 6a 65 63 74 73 74 6f 70 20 7b  pen_injectstop {
1d10: 7d 20 7b 0a 20 20 73 68 6d 66 61 75 6c 74 20 63  } {.  shmfault c
1d20: 61 6e 74 6f 70 65 6e 0a 7d 0a 0a 23 20 54 68 69  antopen.}..# Thi
1d30: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74  s command is not
1d40: 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79   called directly
1d50: 2e 20 49 74 20 69 73 20 75 73 65 64 20 62 79 20  . It is used by 
1d60: 74 68 65 20 0a 23 20 5b 66 61 75 6c 74 73 69 6d  the .# [faultsim
1d70: 5f 74 65 73 74 5f 72 65 73 75 6c 74 5d 20 63 6f  _test_result] co
1d80: 6d 6d 61 6e 64 20 63 72 65 61 74 65 64 20 62 79  mmand created by
1d90: 20 5b 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65   [do_faultsim_te
1da0: 73 74 5d 20 61 6e 64 20 75 73 65 64 0a 23 20 62  st] and used.# b
1db0: 79 20 2d 74 65 73 74 20 73 63 72 69 70 74 73 2e  y -test scripts.
1dc0: 0a 23 0a 70 72 6f 63 20 66 61 75 6c 74 73 69 6d  .#.proc faultsim
1dd0: 5f 74 65 73 74 5f 72 65 73 75 6c 74 5f 69 6e 74  _test_result_int
1de0: 20 7b 61 72 67 73 7d 20 7b 0a 20 20 75 70 76 61   {args} {.  upva
1df0: 72 20 74 65 73 74 72 63 20 74 65 73 74 72 63 20  r testrc testrc 
1e00: 74 65 73 74 72 65 73 75 6c 74 20 74 65 73 74 72  testresult testr
1e10: 65 73 75 6c 74 20 74 65 73 74 6e 66 61 69 6c 20  esult testnfail 
1e20: 74 65 73 74 6e 66 61 69 6c 0a 20 20 73 65 74 20  testnfail.  set 
1e30: 74 20 5b 6c 69 73 74 20 24 74 65 73 74 72 63 20  t [list $testrc 
1e40: 24 74 65 73 74 72 65 73 75 6c 74 5d 0a 20 20 73  $testresult].  s
1e50: 65 74 20 72 20 24 61 72 67 73 0a 20 20 69 66 20  et r $args.  if 
1e60: 7b 20 28 24 74 65 73 74 6e 66 61 69 6c 3d 3d 30  { ($testnfail==0
1e70: 20 26 26 20 24 74 20 21 3d 20 5b 6c 69 6e 64 65   && $t != [linde
1e80: 78 20 24 72 20 30 5d 29 20 7c 7c 20 5b 6c 73 65  x $r 0]) || [lse
1e90: 61 72 63 68 20 24 72 20 24 74 5d 3c 30 20 7d 20  arch $r $t]<0 } 
1ea0: 7b 0a 20 20 20 20 65 72 72 6f 72 20 22 6e 66 61  {.    error "nfa
1eb0: 69 6c 3d 24 74 65 73 74 6e 66 61 69 6c 20 72 63  il=$testnfail rc
1ec0: 3d 24 74 65 73 74 72 63 20 72 65 73 75 6c 74 3d  =$testrc result=
1ed0: 24 74 65 73 74 72 65 73 75 6c 74 22 0a 20 20 7d  $testresult".  }
1ee0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1f30: 23 20 55 73 61 67 65 20 64 6f 5f 6f 6e 65 5f 66  # Usage do_one_f
1f40: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 4e 41 4d  aultsim_test NAM
1f50: 45 20 3f 4f 50 54 49 4f 4e 53 2e 2e 2e 3f 20 0a  E ?OPTIONS...? .
1f60: 23 0a 23 20 54 68 65 20 66 69 72 73 74 20 61 72  #.# The first ar
1f70: 67 75 6d 65 6e 74 2c 20 3c 74 65 73 74 20 6e 75  gument, <test nu
1f80: 6d 62 65 72 3e 2c 20 69 73 20 75 73 65 64 20 61  mber>, is used a
1f90: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
1fa0: 65 20 74 65 73 74 20 6e 61 6d 65 73 0a 23 20 74  e test names.# t
1fb0: 61 6b 65 6e 20 62 79 20 74 65 73 74 73 20 65 78  aken by tests ex
1fc0: 65 63 75 74 65 64 20 62 79 20 74 68 69 73 20 63  ecuted by this c
1fd0: 6f 6d 6d 61 6e 64 2e 20 4f 70 74 69 6f 6e 73 20  ommand. Options 
1fe0: 61 72 65 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20  are as follows. 
1ff0: 41 6c 6c 0a 23 20 6f 70 74 69 6f 6e 73 20 74 61  All.# options ta
2000: 6b 65 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75  ke a single argu
2010: 6d 65 6e 74 2e 0a 23 0a 23 20 20 20 20 20 2d 69  ment..#.#     -i
2020: 6e 6a 65 63 74 73 74 61 72 74 20 20 20 20 20 20  njectstart      
2030: 53 63 72 69 70 74 20 74 6f 20 65 6e 61 62 6c 65  Script to enable
2040: 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e   fault-injection
2050: 2e 0a 23 0a 23 20 20 20 20 20 2d 69 6e 6a 65 63  ..#.#     -injec
2060: 74 73 74 6f 70 20 20 20 20 20 20 20 53 63 72 69  tstop       Scri
2070: 70 74 20 74 6f 20 64 69 73 61 62 6c 65 20 66 61  pt to disable fa
2080: 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 2e 0a 23  ult-injection..#
2090: 0a 23 20 20 20 20 20 2d 69 6e 6a 65 63 74 65 72  .#     -injecter
20a0: 72 6c 69 73 74 20 20 20 20 4c 69 73 74 20 6f 66  rlist    List of
20b0: 20 67 65 6e 65 72 61 6c 6c 79 20 61 63 63 65 70   generally accep
20c0: 74 61 62 6c 65 20 74 65 73 74 20 72 65 73 75 6c  table test resul
20d0: 74 73 20 28 69 2e 65 2e 20 65 72 72 6f 72 0a 23  ts (i.e. error.#
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 20 20 20 6d 65 73 73 61 67 65 73 29         messages)
2100: 2e 20 45 78 61 6d 70 6c 65 3a 20 5b 6c 69 73 74  . Example: [list
2110: 20 7b 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f   {1 {out of memo
2120: 72 79 7d 7d 5d 0a 23 0a 23 20 20 20 20 20 2d 69  ry}}].#.#     -i
2130: 6e 6a 65 63 74 69 6e 73 74 61 6c 6c 0a 23 0a 23  njectinstall.#.#
2140: 20 20 20 20 20 2d 69 6e 6a 65 63 74 75 6e 69 6e       -injectunin
2150: 73 74 61 6c 6c 0a 23 0a 23 20 20 20 20 20 2d 70  stall.#.#     -p
2160: 72 65 70 20 20 20 20 20 20 20 20 20 20 20 20 20  rep             
2170: 53 63 72 69 70 74 20 74 6f 20 65 78 65 63 75 74  Script to execut
2180: 65 20 62 65 66 6f 72 65 20 2d 62 6f 64 79 2e 0a  e before -body..
2190: 23 0a 23 20 20 20 20 20 2d 62 6f 64 79 20 20 20  #.#     -body   
21a0: 20 20 20 20 20 20 20 20 20 20 53 63 72 69 70 74            Script
21b0: 20 74 6f 20 65 78 65 63 75 74 65 20 28 77 69 74   to execute (wit
21c0: 68 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f  h fault injectio
21d0: 6e 29 2e 0a 23 0a 23 20 20 20 20 20 2d 74 65 73  n)..#.#     -tes
21e0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 53 63  t             Sc
21f0: 72 69 70 74 20 74 6f 20 65 78 65 63 75 74 65 20  ript to execute 
2200: 61 66 74 65 72 20 2d 62 6f 64 79 2e 0a 23 0a 70  after -body..#.p
2210: 72 6f 63 20 64 6f 5f 6f 6e 65 5f 66 61 75 6c 74  roc do_one_fault
2220: 73 69 6d 5f 74 65 73 74 20 7b 74 65 73 74 6e 61  sim_test {testna
2230: 6d 65 20 61 72 67 73 7d 20 7b 0a 0a 20 20 73 65  me args} {..  se
2240: 74 20 44 45 46 41 55 4c 54 28 2d 69 6e 6a 65 63  t DEFAULT(-injec
2250: 74 73 74 61 72 74 29 20 20 20 20 20 22 65 78 70  tstart)     "exp
2260: 72 22 0a 20 20 73 65 74 20 44 45 46 41 55 4c 54  r".  set DEFAULT
2270: 28 2d 69 6e 6a 65 63 74 73 74 6f 70 29 20 20 20  (-injectstop)   
2280: 20 20 20 22 65 78 70 72 20 30 22 0a 20 20 73 65     "expr 0".  se
2290: 74 20 44 45 46 41 55 4c 54 28 2d 69 6e 6a 65 63  t DEFAULT(-injec
22a0: 74 65 72 72 6c 69 73 74 29 20 20 20 5b 6c 69 73  terrlist)   [lis
22b0: 74 5d 0a 20 20 73 65 74 20 44 45 46 41 55 4c 54  t].  set DEFAULT
22c0: 28 2d 69 6e 6a 65 63 74 69 6e 73 74 61 6c 6c 29  (-injectinstall)
22d0: 20 20 20 22 22 0a 20 20 73 65 74 20 44 45 46 41     "".  set DEFA
22e0: 55 4c 54 28 2d 69 6e 6a 65 63 74 75 6e 69 6e 73  ULT(-injectunins
22f0: 74 61 6c 6c 29 20 22 22 0a 20 20 73 65 74 20 44  tall) "".  set D
2300: 45 46 41 55 4c 54 28 2d 70 72 65 70 29 20 20 20  EFAULT(-prep)   
2310: 20 20 20 20 20 20 20 20 20 22 22 0a 20 20 73 65           "".  se
2320: 74 20 44 45 46 41 55 4c 54 28 2d 62 6f 64 79 29  t DEFAULT(-body)
2330: 20 20 20 20 20 20 20 20 20 20 20 20 22 22 0a 20              "". 
2340: 20 73 65 74 20 44 45 46 41 55 4c 54 28 2d 74 65   set DEFAULT(-te
2350: 73 74 29 20 20 20 20 20 20 20 20 20 20 20 20 22  st)            "
2360: 22 0a 0a 20 20 61 72 72 61 79 20 73 65 74 20 4f  "..  array set O
2370: 20 5b 61 72 72 61 79 20 67 65 74 20 44 45 46 41   [array get DEFA
2380: 55 4c 54 5d 0a 20 20 61 72 72 61 79 20 73 65 74  ULT].  array set
2390: 20 4f 20 24 61 72 67 73 0a 20 20 66 6f 72 65 61   O $args.  forea
23a0: 63 68 20 6f 20 5b 61 72 72 61 79 20 6e 61 6d 65  ch o [array name
23b0: 73 20 4f 5d 20 7b 0a 20 20 20 20 69 66 20 7b 5b  s O] {.    if {[
23c0: 69 6e 66 6f 20 65 78 69 73 74 73 20 44 45 46 41  info exists DEFA
23d0: 55 4c 54 28 24 6f 29 5d 3d 3d 30 7d 20 7b 20 65  ULT($o)]==0} { e
23e0: 72 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  rror "unknown op
23f0: 74 69 6f 6e 3a 20 24 6f 22 20 7d 0a 20 20 7d 0a  tion: $o" }.  }.
2400: 0a 20 20 70 72 6f 63 20 66 61 75 6c 74 73 69 6d  .  proc faultsim
2410: 5f 74 65 73 74 5f 70 72 6f 63 20 7b 74 65 73 74  _test_proc {test
2420: 72 63 20 74 65 73 74 72 65 73 75 6c 74 20 74 65  rc testresult te
2430: 73 74 6e 66 61 69 6c 7d 20 24 4f 28 2d 74 65 73  stnfail} $O(-tes
2440: 74 29 0a 20 20 70 72 6f 63 20 66 61 75 6c 74 73  t).  proc faults
2450: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
2460: 61 72 67 73 7d 20 22 0a 20 20 20 20 75 70 6c 65  args} ".    uple
2470: 76 65 6c 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  vel faultsim_tes
2480: 74 5f 72 65 73 75 6c 74 5f 69 6e 74 20 5c 24 61  t_result_int \$a
2490: 72 67 73 20 5b 6c 69 73 74 20 24 4f 28 2d 69 6e  rgs [list $O(-in
24a0: 6a 65 63 74 65 72 72 6c 69 73 74 29 5d 0a 20 20  jecterrlist)].  
24b0: 22 0a 0a 20 20 65 76 61 6c 20 24 4f 28 2d 69 6e  "..  eval $O(-in
24c0: 6a 65 63 74 69 6e 73 74 61 6c 6c 29 0a 0a 20 20  jectinstall)..  
24d0: 73 65 74 20 73 74 6f 70 20 30 0a 20 20 66 6f 72  set stop 0.  for
24e0: 20 7b 73 65 74 20 69 46 61 69 6c 20 31 7d 20 7b   {set iFail 1} {
24f0: 21 24 73 74 6f 70 7d 20 7b 69 6e 63 72 20 69 46  !$stop} {incr iF
2500: 61 69 6c 7d 20 7b 0a 0a 20 20 20 20 23 20 45 76  ail} {..    # Ev
2510: 61 6c 75 61 74 65 20 74 68 65 20 2d 70 72 65 70  aluate the -prep
2520: 20 73 63 72 69 70 74 2e 0a 20 20 20 20 23 0a 20   script..    #. 
2530: 20 20 20 65 76 61 6c 20 24 4f 28 2d 70 72 65 70     eval $O(-prep
2540: 29 0a 0a 20 20 20 20 23 20 53 74 61 72 74 20 74  )..    # Start t
2550: 68 65 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69  he fault-injecti
2560: 6f 6e 2e 20 52 75 6e 20 74 68 65 20 2d 62 6f 64  on. Run the -bod
2570: 79 20 73 63 72 69 70 74 2e 20 53 74 6f 70 20 74  y script. Stop t
2580: 68 65 20 66 61 75 6c 74 0a 20 20 20 20 23 20 69  he fault.    # i
2590: 6e 6a 65 63 74 69 6f 6e 2e 20 4c 6f 63 61 6c 20  njection. Local 
25a0: 76 61 72 20 24 6e 66 61 69 6c 20 69 73 20 73 65  var $nfail is se
25b0: 74 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  t to the total n
25c0: 75 6d 62 65 72 20 6f 66 20 66 61 75 6c 74 73 20  umber of faults 
25d0: 0a 20 20 20 20 23 20 69 6e 6a 65 63 74 65 64 20  .    # injected 
25e0: 69 6e 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  into the system 
25f0: 74 68 69 73 20 74 72 69 61 6c 2e 0a 20 20 20 20  this trial..    
2600: 23 0a 20 20 20 20 65 76 61 6c 20 24 4f 28 2d 69  #.    eval $O(-i
2610: 6e 6a 65 63 74 73 74 61 72 74 29 20 24 69 46 61  njectstart) $iFa
2620: 69 6c 0a 20 20 20 20 73 65 74 20 72 63 20 5b 63  il.    set rc [c
2630: 61 74 63 68 20 24 4f 28 2d 62 6f 64 79 29 20 72  atch $O(-body) r
2640: 65 73 5d 0a 20 20 20 20 73 65 74 20 6e 66 61 69  es].    set nfai
2650: 6c 20 5b 65 76 61 6c 20 24 4f 28 2d 69 6e 6a 65  l [eval $O(-inje
2660: 63 74 73 74 6f 70 29 5d 0a 0a 20 20 20 20 23 20  ctstop)]..    # 
2670: 52 75 6e 20 74 68 65 20 2d 74 65 73 74 20 73 63  Run the -test sc
2680: 72 69 70 74 2e 20 49 66 20 69 74 20 74 68 72 6f  ript. If it thro
2690: 77 73 20 6e 6f 20 65 72 72 6f 72 2c 20 63 6f 6e  ws no error, con
26a0: 73 69 64 65 72 20 74 68 69 73 20 74 72 69 61 6c  sider this trial
26b0: 0a 20 20 20 20 23 20 73 75 63 65 73 73 66 75 6c  .    # sucessful
26c0: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 74 68 72  . If it does thr
26d0: 6f 77 20 61 6e 20 65 72 72 6f 72 2c 20 63 61 75  ow an error, cau
26e0: 73 65 20 61 20 5b 64 6f 5f 74 65 73 74 5d 20 74  se a [do_test] t
26f0: 65 73 74 20 74 6f 0a 20 20 20 20 23 20 66 61 69  est to.    # fai
2700: 6c 20 28 61 6e 64 20 70 72 69 6e 74 20 6f 75 74  l (and print out
2710: 20 74 68 65 20 75 6e 65 78 70 65 63 74 65 64 20   the unexpected 
2720: 65 78 63 65 70 74 69 6f 6e 20 74 68 72 6f 77 6e  exception thrown
2730: 20 62 79 20 74 68 65 20 2d 74 65 73 74 0a 20 20   by the -test.  
2740: 20 20 23 20 73 63 72 69 70 74 20 61 74 20 74 68    # script at th
2750: 65 20 73 61 6d 65 20 74 69 6d 65 29 2e 0a 20 20  e same time)..  
2760: 20 20 23 0a 20 20 20 20 73 65 74 20 72 63 20 5b    #.    set rc [
2770: 63 61 74 63 68 20 5b 6c 69 73 74 20 66 61 75 6c  catch [list faul
2780: 74 73 69 6d 5f 74 65 73 74 5f 70 72 6f 63 20 24  tsim_test_proc $
2790: 72 63 20 24 72 65 73 20 24 6e 66 61 69 6c 5d 20  rc $res $nfail] 
27a0: 72 65 73 5d 0a 20 20 20 20 69 66 20 7b 24 72 63  res].    if {$rc
27b0: 20 3d 3d 20 30 7d 20 7b 73 65 74 20 72 65 73 20   == 0} {set res 
27c0: 6f 6b 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  ok}.    do_test 
27d0: 24 74 65 73 74 6e 61 6d 65 2e 24 69 46 61 69 6c  $testname.$iFail
27e0: 20 5b 6c 69 73 74 20 6c 69 73 74 20 24 72 63 20   [list list $rc 
27f0: 24 72 65 73 5d 20 7b 30 20 6f 6b 7d 0a 0a 20 20  $res] {0 ok}..  
2800: 20 20 23 20 49 66 20 6e 6f 20 66 61 75 6c 74 73    # If no faults
2810: 20 77 68 65 72 65 20 69 6e 6a 65 63 74 65 64 20   where injected 
2820: 74 68 69 73 20 74 72 69 61 6c 2c 20 64 6f 6e 27  this trial, don'
2830: 74 20 62 6f 74 68 65 72 20 72 75 6e 6e 69 6e 67  t bother running
2840: 0a 20 20 20 20 23 20 61 6e 79 20 6d 6f 72 65 2e  .    # any more.
2850: 20 54 68 69 73 20 74 65 73 74 20 69 73 20 66 69   This test is fi
2860: 6e 69 73 68 65 64 2e 0a 20 20 20 20 23 0a 20 20  nished..    #.  
2870: 20 20 69 66 20 7b 24 6e 66 61 69 6c 3d 3d 30 7d    if {$nfail==0}
2880: 20 7b 20 73 65 74 20 73 74 6f 70 20 31 20 7d 0a   { set stop 1 }.
2890: 20 20 7d 0a 0a 20 20 65 76 61 6c 20 24 4f 28 2d    }..  eval $O(-
28a0: 69 6e 6a 65 63 74 75 6e 69 6e 73 74 61 6c 6c 29  injectuninstall)
28b0: 0a 7d 0a 0a 23 20 55 73 61 67 65 3a 20 64 6f 5f  .}..# Usage: do_
28c0: 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 3c 74 65 73  malloc_test <tes
28d0: 74 20 6e 75 6d 62 65 72 3e 20 3c 6f 70 74 69 6f  t number> <optio
28e0: 6e 73 2e 2e 2e 3e 0a 23 0a 23 20 54 68 65 20 66  ns...>.#.# The f
28f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 3c  irst argument, <
2900: 74 65 73 74 20 6e 75 6d 62 65 72 3e 2c 20 69 73  test number>, is
2910: 20 61 6e 20 69 6e 74 65 67 65 72 20 75 73 65 64   an integer used
2920: 20 74 6f 20 6e 61 6d 65 20 74 68 65 0a 23 20 74   to name the.# t
2930: 65 73 74 73 20 65 78 65 63 75 74 65 64 20 62 79  ests executed by
2940: 20 74 68 69 73 20 70 72 6f 63 2e 20 4f 70 74 69   this proc. Opti
2950: 6f 6e 73 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f  ons are as follo
2960: 77 73 3a 0a 23 0a 23 20 20 20 20 20 2d 74 63 6c  ws:.#.#     -tcl
2970: 70 72 65 70 20 20 20 20 20 20 20 20 20 20 54 43  prep          TC
2980: 4c 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20  L script to run 
2990: 74 6f 20 70 72 65 70 61 72 65 20 74 65 73 74 2e  to prepare test.
29a0: 0a 23 20 20 20 20 20 2d 73 71 6c 70 72 65 70 20  .#     -sqlprep 
29b0: 20 20 20 20 20 20 20 20 20 53 51 4c 20 73 63 72           SQL scr
29c0: 69 70 74 20 74 6f 20 72 75 6e 20 74 6f 20 70 72  ipt to run to pr
29d0: 65 70 61 72 65 20 74 65 73 74 2e 0a 23 20 20 20  epare test..#   
29e0: 20 20 2d 74 63 6c 62 6f 64 79 20 20 20 20 20 20    -tclbody      
29f0: 20 20 20 20 54 43 4c 20 73 63 72 69 70 74 20 74      TCL script t
2a00: 6f 20 72 75 6e 20 77 69 74 68 20 6d 61 6c 6c 6f  o run with mallo
2a10: 63 20 66 61 69 6c 75 72 65 20 73 69 6d 75 6c 61  c failure simula
2a20: 74 69 6f 6e 2e 0a 23 20 20 20 20 20 2d 73 71 6c  tion..#     -sql
2a30: 62 6f 64 79 20 20 20 20 20 20 20 20 20 20 54 43  body          TC
2a40: 4c 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20  L script to run 
2a50: 77 69 74 68 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  with malloc fail
2a60: 75 72 65 20 73 69 6d 75 6c 61 74 69 6f 6e 2e 0a  ure simulation..
2a70: 23 20 20 20 20 20 2d 63 6c 65 61 6e 75 70 20 20  #     -cleanup  
2a80: 20 20 20 20 20 20 20 20 54 43 4c 20 73 63 72 69          TCL scri
2a90: 70 74 20 74 6f 20 72 75 6e 20 61 66 74 65 72 20  pt to run after 
2aa0: 74 68 65 20 74 65 73 74 2e 0a 23 0a 23 20 54 68  the test..#.# Th
2ab0: 69 73 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  is command runs 
2ac0: 61 20 73 65 72 69 65 73 20 6f 66 20 74 65 73 74  a series of test
2ad0: 73 20 74 6f 20 76 65 72 69 66 79 20 53 51 4c 69  s to verify SQLi
2ae0: 74 65 27 73 20 61 62 69 6c 69 74 79 0a 23 20 74  te's ability.# t
2af0: 6f 20 68 61 6e 64 6c 65 20 61 6e 20 6f 75 74 2d  o handle an out-
2b00: 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74  of-memory condit
2b10: 69 6f 6e 20 67 72 61 63 65 66 75 6c 6c 79 2e 20  ion gracefully. 
2b20: 49 74 20 69 73 20 61 73 73 75 6d 65 64 0a 23 20  It is assumed.# 
2b30: 74 68 61 74 20 69 66 20 74 68 69 73 20 63 6f 6e  that if this con
2b40: 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 20 61 20  dition occurs a 
2b50: 6d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 20 77 69  malloc() call wi
2b60: 6c 6c 20 72 65 74 75 72 6e 20 61 0a 23 20 4e 55  ll return a.# NU
2b70: 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 4c 69 6e 75  LL pointer. Linu
2b80: 78 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  x, for example, 
2b90: 64 6f 65 73 6e 27 74 20 64 6f 20 74 68 61 74 20  doesn't do that 
2ba0: 62 79 20 64 65 66 61 75 6c 74 2e 20 53 65 65 0a  by default. See.
2bb0: 23 20 74 68 65 20 22 42 55 47 53 22 20 73 65 63  # the "BUGS" sec
2bc0: 74 69 6f 6e 20 6f 66 20 6d 61 6c 6c 6f 63 28 33  tion of malloc(3
2bd0: 29 2e 0a 23 0a 23 20 45 61 63 68 20 69 74 65 72  )..#.# Each iter
2be0: 61 74 69 6f 6e 20 6f 66 20 61 20 6c 6f 6f 70 2c  ation of a loop,
2bf0: 20 74 68 65 20 54 43 4c 20 63 6f 6d 6d 61 6e 64   the TCL command
2c00: 73 20 69 6e 20 61 6e 79 20 61 72 67 75 6d 65 6e  s in any argumen
2c10: 74 20 70 61 73 73 65 64 0a 23 20 74 6f 20 74 68  t passed.# to th
2c20: 65 20 2d 74 63 6c 62 6f 64 79 20 73 77 69 74 63  e -tclbody switc
2c30: 68 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  h, followed by t
2c40: 68 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 73 20  he SQL commands 
2c50: 69 6e 20 61 6e 79 20 61 72 67 75 6d 65 6e 74 0a  in any argument.
2c60: 23 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  # passed to the 
2c70: 2d 73 71 6c 62 6f 64 79 20 73 77 69 74 63 68 20  -sqlbody switch 
2c80: 61 72 65 20 65 78 65 63 75 74 65 64 2e 20 45 61  are executed. Ea
2c90: 63 68 20 69 74 65 72 61 74 69 6f 6e 20 74 68 65  ch iteration the
2ca0: 0a 23 20 4e 74 68 20 63 61 6c 6c 20 74 6f 20 73  .# Nth call to s
2cb0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 69 73  qliteMalloc() is
2cc0: 20 6d 61 64 65 20 74 6f 20 66 61 69 6c 2c 20 77   made to fail, w
2cd0: 68 65 72 65 20 4e 20 69 73 20 69 6e 63 72 65 61  here N is increa
2ce0: 73 65 64 0a 23 20 65 61 63 68 20 74 69 6d 65 20  sed.# each time 
2cf0: 74 68 65 20 6c 6f 6f 70 20 72 75 6e 73 20 73 74  the loop runs st
2d00: 61 72 74 69 6e 67 20 66 72 6f 6d 20 31 2e 20 57  arting from 1. W
2d10: 68 65 6e 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73  hen all commands
2d20: 20 65 78 65 63 75 74 65 0a 23 20 73 75 63 63 65   execute.# succe
2d30: 73 73 66 75 6c 6c 79 2c 20 74 68 65 20 6c 6f 6f  ssfully, the loo
2d40: 70 20 65 6e 64 73 2e 0a 23 0a 70 72 6f 63 20 64  p ends..#.proc d
2d50: 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 7b 74  o_malloc_test {t
2d60: 6e 20 61 72 67 73 7d 20 7b 0a 20 20 61 72 72 61  n args} {.  arra
2d70: 79 20 75 6e 73 65 74 20 3a 3a 6d 61 6c 6c 6f 63  y unset ::malloc
2d80: 6f 70 74 73 20 0a 20 20 61 72 72 61 79 20 73 65  opts .  array se
2d90: 74 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 20 24  t ::mallocopts $
2da0: 61 72 67 73 0a 0a 20 20 69 66 20 7b 5b 73 74 72  args..  if {[str
2db0: 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 24  ing is integer $
2dc0: 74 6e 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 74  tn]} {.    set t
2dd0: 6e 20 6d 61 6c 6c 6f 63 2d 24 74 6e 0a 20 20 7d  n malloc-$tn.  }
2de0: 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  .  if {[info exi
2df0: 73 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73  sts ::mallocopts
2e00: 28 2d 73 74 61 72 74 29 5d 7d 20 7b 0a 20 20 20  (-start)]} {.   
2e10: 20 73 65 74 20 73 74 61 72 74 20 24 3a 3a 6d 61   set start $::ma
2e20: 6c 6c 6f 63 6f 70 74 73 28 2d 73 74 61 72 74 29  llocopts(-start)
2e30: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
2e40: 73 65 74 20 73 74 61 72 74 20 30 0a 20 20 7d 0a  set start 0.  }.
2e50: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
2e60: 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28  ts ::mallocopts(
2e70: 2d 65 6e 64 29 5d 7d 20 7b 0a 20 20 20 20 73 65  -end)]} {.    se
2e80: 74 20 65 6e 64 20 24 3a 3a 6d 61 6c 6c 6f 63 6f  t end $::malloco
2e90: 70 74 73 28 2d 65 6e 64 29 0a 20 20 7d 20 65 6c  pts(-end).  } el
2ea0: 73 65 20 7b 0a 20 20 20 20 73 65 74 20 65 6e 64  se {.    set end
2eb0: 20 35 30 30 30 30 0a 20 20 7d 0a 20 20 73 61 76   50000.  }.  sav
2ec0: 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 0a 20 20  e_prng_state..  
2ed0: 66 6f 72 65 61 63 68 20 3a 3a 69 52 65 70 65 61  foreach ::iRepea
2ee0: 74 20 7b 30 20 31 30 30 30 30 30 30 30 7d 20 7b  t {0 10000000} {
2ef0: 0a 20 20 20 20 73 65 74 20 3a 3a 67 6f 20 31 0a  .    set ::go 1.
2f00: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 3a 3a 6e      for {set ::n
2f10: 20 24 73 74 61 72 74 7d 20 7b 24 3a 3a 67 6f 20   $start} {$::go 
2f20: 26 26 20 24 3a 3a 6e 20 3c 3d 20 24 65 6e 64 7d  && $::n <= $end}
2f30: 20 7b 69 6e 63 72 20 3a 3a 6e 7d 20 7b 0a 0a 20   {incr ::n} {.. 
2f40: 20 20 20 20 20 23 20 49 66 20 24 3a 3a 69 52 65       # If $::iRe
2f50: 70 65 61 74 20 69 73 20 30 2c 20 74 68 65 6e 20  peat is 0, then 
2f60: 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  the malloc() fai
2f70: 6c 75 72 65 20 69 73 20 74 72 61 6e 73 69 65 6e  lure is transien
2f80: 74 20 2d 20 69 74 0a 20 20 20 20 20 20 23 20 66  t - it.      # f
2f90: 61 69 6c 73 20 61 6e 64 20 74 68 65 6e 20 73 75  ails and then su
2fa0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 73  bsequent calls s
2fb0: 75 63 63 65 65 64 2e 20 49 66 20 24 3a 3a 69 52  ucceed. If $::iR
2fc0: 65 70 65 61 74 20 69 73 20 31 2c 20 0a 20 20 20  epeat is 1, .   
2fd0: 20 20 20 23 20 74 68 65 6e 20 74 68 65 20 66 61     # then the fa
2fe0: 69 6c 75 72 65 20 69 73 20 70 65 72 73 69 73 74  ilure is persist
2ff0: 65 6e 74 20 2d 20 6f 6e 63 65 20 6d 61 6c 6c 6f  ent - once mallo
3000: 63 28 29 20 66 61 69 6c 73 20 69 74 20 6b 65 65  c() fails it kee
3010: 70 73 0a 20 20 20 20 20 20 23 20 66 61 69 6c 69  ps.      # faili
3020: 6e 67 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20  ng..      #.    
3030: 20 20 73 65 74 20 7a 52 65 70 65 61 74 20 22 74    set zRepeat "t
3040: 72 61 6e 73 69 65 6e 74 22 0a 20 20 20 20 20 20  ransient".      
3050: 69 66 20 7b 24 3a 3a 69 52 65 70 65 61 74 7d 20  if {$::iRepeat} 
3060: 7b 73 65 74 20 7a 52 65 70 65 61 74 20 22 70 65  {set zRepeat "pe
3070: 72 73 69 73 74 65 6e 74 22 7d 0a 20 20 20 20 20  rsistent"}.     
3080: 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74   restore_prng_st
3090: 61 74 65 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ate.      foreac
30a0: 68 20 66 69 6c 65 20 5b 67 6c 6f 62 20 2d 6e 6f  h file [glob -no
30b0: 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 2e 64 62  complain test.db
30c0: 2d 6d 6a 2a 5d 20 7b 66 69 6c 65 20 64 65 6c 65  -mj*] {file dele
30d0: 74 65 20 2d 66 6f 72 63 65 20 24 66 69 6c 65 7d  te -force $file}
30e0: 0a 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20  ..      do_test 
30f0: 24 7b 74 6e 7d 2e 24 7b 7a 52 65 70 65 61 74 7d  ${tn}.${zRepeat}
3100: 2e 24 7b 3a 3a 6e 7d 20 7b 0a 20 20 0a 20 20 20  .${::n} {.  .   
3110: 20 20 20 20 20 23 20 52 65 6d 6f 76 65 20 61 6c       # Remove al
3120: 6c 20 74 72 61 63 65 73 20 6f 66 20 64 61 74 61  l traces of data
3130: 62 61 73 65 20 66 69 6c 65 73 20 74 65 73 74 2e  base files test.
3140: 64 62 20 61 6e 64 20 74 65 73 74 32 2e 64 62 20  db and test2.db 
3150: 0a 20 20 20 20 20 20 20 20 23 20 66 72 6f 6d 20  .        # from 
3160: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
3170: 20 54 68 65 6e 20 6f 70 65 6e 20 28 65 6d 70 74   Then open (empt
3180: 79 20 64 61 74 61 62 61 73 65 29 20 22 74 65 73  y database) "tes
3190: 74 2e 64 62 22 20 0a 20 20 20 20 20 20 20 20 23  t.db" .        #
31a0: 20 77 69 74 68 20 74 68 65 20 68 61 6e 64 6c 65   with the handle
31b0: 20 5b 64 62 5d 2e 0a 20 20 20 20 20 20 20 20 23   [db]..        #
31c0: 20 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20   .        catch 
31d0: 7b 64 62 20 63 6c 6f 73 65 7d 20 0a 20 20 20 20  {db close} .    
31e0: 20 20 20 20 63 61 74 63 68 20 7b 64 62 32 20 63      catch {db2 c
31f0: 6c 6f 73 65 7d 20 0a 20 20 20 20 20 20 20 20 63  lose} .        c
3200: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
3210: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
3220: 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  }.        catch 
3230: 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f  {file delete -fo
3240: 72 63 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  rce test.db-jour
3250: 6e 61 6c 7d 0a 20 20 20 20 20 20 20 20 63 61 74  nal}.        cat
3260: 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
3270: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77  -force test.db-w
3280: 61 6c 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63  al}.        catc
3290: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  h {file delete -
32a0: 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62 7d 0a  force test2.db}.
32b0: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 66          catch {f
32c0: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
32d0: 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e  e test2.db-journ
32e0: 61 6c 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63  al}.        catc
32f0: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  h {file delete -
3300: 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62 2d 77  force test2.db-w
3310: 61 6c 7d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  al}.        if {
3320: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6d  [info exists ::m
3330: 61 6c 6c 6f 63 6f 70 74 73 28 2d 74 65 73 74 64  allocopts(-testd
3340: 62 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  b)]} {.         
3350: 20 66 69 6c 65 20 63 6f 70 79 20 24 3a 3a 6d 61   file copy $::ma
3360: 6c 6c 6f 63 6f 70 74 73 28 2d 74 65 73 74 64 62  llocopts(-testdb
3370: 29 20 74 65 73 74 2e 64 62 0a 20 20 20 20 20 20  ) test.db.      
3380: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63    }.        catc
3390: 68 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74  h { sqlite3 db t
33a0: 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 20 20 20  est.db }.       
33b0: 20 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 6d 61   if {[info comma
33c0: 6e 64 73 20 64 62 5d 20 6e 65 20 22 22 7d 20 7b  nds db] ne ""} {
33d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
33e0: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
33f0: 6c 74 5f 63 6f 64 65 73 20 64 62 20 31 0a 20 20  lt_codes db 1.  
3400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3410: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
3420: 67 5f 6c 6f 6f 6b 61 73 69 64 65 20 64 62 20 30  g_lookaside db 0
3430: 20 30 20 30 0a 20 20 0a 20 20 20 20 20 20 20 20   0 0.  .        
3440: 23 20 45 78 65 63 75 74 65 20 61 6e 79 20 2d 74  # Execute any -t
3450: 63 6c 70 72 65 70 20 61 6e 64 20 2d 73 71 6c 70  clprep and -sqlp
3460: 72 65 70 20 73 63 72 69 70 74 73 2e 0a 20 20 20  rep scripts..   
3470: 20 20 20 20 20 23 0a 20 20 20 20 20 20 20 20 69       #.        i
3480: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3490: 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 74 63  ::mallocopts(-tc
34a0: 6c 70 72 65 70 29 5d 7d 20 7b 0a 20 20 20 20 20  lprep)]} {.     
34b0: 20 20 20 20 20 65 76 61 6c 20 24 3a 3a 6d 61 6c       eval $::mal
34c0: 6c 6f 63 6f 70 74 73 28 2d 74 63 6c 70 72 65 70  locopts(-tclprep
34d0: 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ).        }.    
34e0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
34f0: 69 73 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74  ists ::mallocopt
3500: 73 28 2d 73 71 6c 70 72 65 70 29 5d 7d 20 7b 0a  s(-sqlprep)]} {.
3510: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 73 71            execsq
3520: 6c 20 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28  l $::mallocopts(
3530: 2d 73 71 6c 70 72 65 70 29 0a 20 20 20 20 20 20  -sqlprep).      
3540: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 23    }.  .        #
3550: 20 4e 6f 77 20 73 65 74 20 74 68 65 20 24 7b 3a   Now set the ${:
3560: 3a 6e 7d 74 68 20 6d 61 6c 6c 6f 63 28 29 20 74  :n}th malloc() t
3570: 6f 20 66 61 69 6c 20 61 6e 64 20 65 78 65 63 75  o fail and execu
3580: 74 65 20 74 68 65 20 2d 74 63 6c 62 6f 64 79 20  te the -tclbody 
3590: 0a 20 20 20 20 20 20 20 20 23 20 61 6e 64 20 2d  .        # and -
35a0: 73 71 6c 62 6f 64 79 20 73 63 72 69 70 74 73 2e  sqlbody scripts.
35b0: 0a 20 20 20 20 20 20 20 20 23 0a 20 20 20 20 20  .        #.     
35c0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65     sqlite3_memde
35d0: 62 75 67 5f 66 61 69 6c 20 24 3a 3a 6e 20 2d 72  bug_fail $::n -r
35e0: 65 70 65 61 74 20 24 3a 3a 69 52 65 70 65 61 74  epeat $::iRepeat
35f0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 6d  .        set ::m
3600: 61 6c 6c 6f 63 62 6f 64 79 20 7b 7d 0a 20 20 20  allocbody {}.   
3610: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
3620: 78 69 73 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70  xists ::mallocop
3630: 74 73 28 2d 74 63 6c 62 6f 64 79 29 5d 7d 20 7b  ts(-tclbody)]} {
3640: 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
3650: 64 20 3a 3a 6d 61 6c 6c 6f 63 62 6f 64 79 20 22  d ::mallocbody "
3660: 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 74  $::mallocopts(-t
3670: 63 6c 62 6f 64 79 29 5c 6e 22 0a 20 20 20 20 20  clbody)\n".     
3680: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20     }.        if 
3690: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
36a0: 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 73 71 6c 62  mallocopts(-sqlb
36b0: 6f 64 79 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20  ody)]} {.       
36c0: 20 20 20 61 70 70 65 6e 64 20 3a 3a 6d 61 6c 6c     append ::mall
36d0: 6f 63 62 6f 64 79 20 22 64 62 20 65 76 61 6c 20  ocbody "db eval 
36e0: 7b 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d  {$::mallocopts(-
36f0: 73 71 6c 62 6f 64 79 29 7d 22 0a 20 20 20 20 20  sqlbody)}".     
3700: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 23 20     }..        # 
3710: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
3720: 6f 63 6b 20 73 65 74 73 20 6c 6f 63 61 6c 20 76  ock sets local v
3730: 61 72 69 61 62 6c 65 73 20 61 73 20 66 6f 6c 6c  ariables as foll
3740: 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 23 0a 20  ows:.        #. 
3750: 20 20 20 20 20 20 20 23 20 20 20 20 20 69 73 46         #     isF
3760: 61 69 6c 20 20 2d 20 54 72 75 65 20 69 66 20 61  ail  - True if a
3770: 6e 20 65 72 72 6f 72 20 28 61 6e 79 20 65 72 72  n error (any err
3780: 6f 72 29 20 77 61 73 20 72 65 70 6f 72 74 65 64  or) was reported
3790: 20 62 79 20 73 71 6c 69 74 65 2e 0a 20 20 20 20   by sqlite..    
37a0: 20 20 20 20 23 20 20 20 20 20 6e 46 61 69 6c 20      #     nFail 
37b0: 20 20 2d 20 54 68 65 20 74 6f 74 61 6c 20 6e 75    - The total nu
37c0: 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 61 74 65  mber of simulate
37d0: 64 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  d malloc() failu
37e0: 72 65 73 2e 0a 20 20 20 20 20 20 20 20 23 20 20  res..        #  
37f0: 20 20 20 6e 42 65 6e 69 67 6e 20 2d 20 54 68 65     nBenign - The
3800: 20 6e 75 6d 62 65 72 20 6f 66 20 62 65 6e 69 67   number of benig
3810: 6e 20 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c  n simulated mall
3820: 6f 63 28 29 20 66 61 69 6c 75 72 65 73 2e 0a 20  oc() failures.. 
3830: 20 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 20         #.       
3840: 20 73 65 74 20 69 73 46 61 69 6c 20 5b 63 61 74   set isFail [cat
3850: 63 68 20 24 3a 3a 6d 61 6c 6c 6f 63 62 6f 64 79  ch $::mallocbody
3860: 20 6d 73 67 5d 0a 20 20 20 20 20 20 20 20 73 65   msg].        se
3870: 74 20 6e 46 61 69 6c 20 5b 73 71 6c 69 74 65 33  t nFail [sqlite3
3880: 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 2d  _memdebug_fail -
3890: 31 20 2d 62 65 6e 69 67 6e 63 6e 74 20 6e 42 65  1 -benigncnt nBe
38a0: 6e 69 67 6e 5d 0a 20 20 20 20 20 20 20 20 23 20  nign].        # 
38b0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
38c0: 22 20 28 69 73 46 61 69 6c 3d 24 69 73 46 61 69  " (isFail=$isFai
38d0: 6c 20 6e 46 61 69 6c 3d 24 6e 46 61 69 6c 20 6e  l nFail=$nFail n
38e0: 42 65 6e 69 67 6e 3d 24 6e 42 65 6e 69 67 6e 29  Benign=$nBenign)
38f0: 20 22 0a 0a 20 20 20 20 20 20 20 20 23 20 49 66   "..        # If
3900: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6d 61 6c   one or more mal
3910: 6c 6f 63 73 20 66 61 69 6c 65 64 2c 20 72 75 6e  locs failed, run
3920: 20 74 68 69 73 20 6c 6f 6f 70 20 62 6f 64 79 20   this loop body 
3930: 61 67 61 69 6e 2e 0a 20 20 20 20 20 20 20 20 23  again..        #
3940: 0a 20 20 20 20 20 20 20 20 73 65 74 20 67 6f 20  .        set go 
3950: 5b 65 78 70 72 20 7b 24 6e 46 61 69 6c 3e 30 7d  [expr {$nFail>0}
3960: 5d 0a 0a 20 20 20 20 20 20 20 20 69 66 20 7b 28  ]..        if {(
3970: 24 6e 46 61 69 6c 2d 24 6e 42 65 6e 69 67 6e 29  $nFail-$nBenign)
3980: 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ==0} {.         
3990: 20 69 66 20 7b 24 69 73 46 61 69 6c 7d 20 7b 0a   if {$isFail} {.
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
39b0: 76 32 20 24 6d 73 67 0a 20 20 20 20 20 20 20 20  v2 $msg.        
39c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
39d0: 20 20 20 20 20 20 20 73 65 74 20 69 73 46 61 69         set isFai
39e0: 6c 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  l 1.            
39f0: 73 65 74 20 76 32 20 31 0a 20 20 20 20 20 20 20  set v2 1.       
3a00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65     }.        } e
3a10: 6c 73 65 69 66 20 7b 21 24 69 73 46 61 69 6c 7d  lseif {!$isFail}
3a20: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74   {.          set
3a30: 20 76 32 20 24 6d 73 67 0a 20 20 20 20 20 20 20   v2 $msg.       
3a40: 20 7d 20 65 6c 73 65 69 66 20 7b 0a 20 20 20 20   } elseif {.    
3a50: 20 20 20 20 20 20 5b 69 6e 66 6f 20 63 6f 6d 6d        [info comm
3a60: 61 6e 64 20 64 62 5d 3d 3d 22 22 20 7c 7c 20 0a  and db]=="" || .
3a70: 20 20 20 20 20 20 20 20 20 20 5b 64 62 20 65 72            [db er
3a80: 72 6f 72 63 6f 64 65 5d 3d 3d 37 20 7c 7c 0a 20  rorcode]==7 ||. 
3a90: 20 20 20 20 20 20 20 20 20 24 6d 73 67 3d 3d 22           $msg=="
3aa0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 0a 20  out of memory". 
3ab0: 20 20 20 20 20 20 20 7d 20 7b 0a 20 20 20 20 20         } {.     
3ac0: 20 20 20 20 20 73 65 74 20 76 32 20 31 0a 20 20       set v2 1.  
3ad0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
3ae0: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 32 20           set v2 
3af0: 24 6d 73 67 0a 20 20 20 20 20 20 20 20 20 20 70  $msg.          p
3b00: 75 74 73 20 5b 64 62 20 65 72 72 6f 72 63 6f 64  uts [db errorcod
3b10: 65 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e].        }.   
3b20: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 69 73 46       lappend isF
3b30: 61 69 6c 20 24 76 32 0a 20 20 20 20 20 20 7d 20  ail $v2.      } 
3b40: 7b 31 20 31 7d 0a 20 20 0a 20 20 20 20 20 20 69  {1 1}.  .      i
3b50: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3b60: 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 63 6c  ::mallocopts(-cl
3b70: 65 61 6e 75 70 29 5d 7d 20 7b 0a 20 20 20 20 20  eanup)]} {.     
3b80: 20 20 20 63 61 74 63 68 20 5b 6c 69 73 74 20 75     catch [list u
3b90: 70 6c 65 76 65 6c 20 23 30 20 24 3a 3a 6d 61 6c  plevel #0 $::mal
3ba0: 6c 6f 63 6f 70 74 73 28 2d 63 6c 65 61 6e 75 70  locopts(-cleanup
3bb0: 29 5d 20 6d 73 67 0a 20 20 20 20 20 20 7d 0a 20  )] msg.      }. 
3bc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 75 6e 73 65 74     }.  }.  unset
3bd0: 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 0a 20 20   ::mallocopts.  
3be0: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67  sqlite3_memdebug
3bf0: 5f 66 61 69 6c 20 2d 31 0a 7d 0a 0a 0a 23 2d 2d  _fail -1.}...#--
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c40: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 70  -------.# This p
3c50: 72 6f 63 20 69 73 20 75 73 65 64 20 74 6f 20 74  roc is used to t
3c60: 65 73 74 20 61 20 73 69 6e 67 6c 65 20 53 45 4c  est a single SEL
3c70: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 50  ECT statement. P
3c80: 61 72 61 6d 65 74 65 72 20 24 6e 61 6d 65 20 69  arameter $name i
3c90: 73 0a 23 20 70 61 73 73 65 64 20 61 20 6e 61 6d  s.# passed a nam
3ca0: 65 20 66 6f 72 20 74 68 65 20 74 65 73 74 20 63  e for the test c
3cb0: 61 73 65 20 28 69 2e 65 2e 20 22 66 74 73 33 5f  ase (i.e. "fts3_
3cc0: 6d 61 6c 6c 6f 63 2d 31 2e 34 2e 31 22 29 20 61  malloc-1.4.1") a
3cd0: 6e 64 20 70 61 72 61 6d 65 74 65 72 0a 23 20 24  nd parameter.# $
3ce0: 73 71 6c 20 69 73 20 70 61 73 73 65 64 20 74 68  sql is passed th
3cf0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 45  e text of the SE
3d00: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
3d10: 50 61 72 61 6d 65 74 65 72 20 24 72 65 73 75 6c  Parameter $resul
3d20: 74 20 69 73 0a 23 20 73 65 74 20 74 6f 20 74 68  t is.# set to th
3d30: 65 20 65 78 70 65 63 74 65 64 20 6f 75 74 70 75  e expected outpu
3d40: 74 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  t if the SELECT 
3d50: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 75 63  statement is suc
3d60: 63 65 73 73 66 75 6c 6c 79 0a 23 20 65 78 65 63  cessfully.# exec
3d70: 75 74 65 64 20 75 73 69 6e 67 20 5b 64 62 20 65  uted using [db e
3d80: 76 61 6c 5d 2e 0a 23 0a 23 20 45 78 61 6d 70 6c  val]..#.# Exampl
3d90: 65 3a 0a 23 0a 23 20 20 20 64 6f 5f 73 65 6c 65  e:.#.#   do_sele
3da0: 63 74 5f 74 65 73 74 20 74 65 73 74 63 61 73 65  ct_test testcase
3db0: 2d 31 2e 31 20 22 53 45 4c 45 43 54 20 31 2b 31  -1.1 "SELECT 1+1
3dc0: 2c 20 31 2b 32 22 20 7b 31 20 32 7d 0a 23 0a 23  , 1+2" {1 2}.#.#
3dd0: 20 49 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   If global varia
3de0: 62 6c 65 20 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45  ble DO_MALLOC_TE
3df0: 53 54 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e  ST is set to a n
3e00: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 6f  on-zero value, o
3e10: 72 20 69 66 0a 23 20 69 74 20 69 73 20 6e 6f 74  r if.# it is not
3e20: 20 64 65 66 69 6e 65 64 20 61 74 20 61 6c 6c 2c   defined at all,
3e30: 20 74 68 65 6e 20 4f 4f 4d 20 74 65 73 74 69 6e   then OOM testin
3e40: 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  g is performed o
3e50: 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 23 20 73  n the SELECT.# s
3e60: 74 61 74 65 6d 65 6e 74 2e 20 45 61 63 68 20 4f  tatement. Each O
3e70: 4f 4d 20 74 65 73 74 20 63 61 73 65 20 69 73 20  OM test case is 
3e80: 73 61 69 64 20 74 6f 20 70 61 73 73 20 69 66 20  said to pass if 
3e90: 65 69 74 68 65 72 20 28 61 29 20 65 78 65 63 75  either (a) execu
3ea0: 74 69 6e 67 0a 23 20 74 68 65 20 53 45 4c 45 43  ting.# the SELEC
3eb0: 54 20 73 74 61 74 65 6d 65 6e 74 20 73 75 63 63  T statement succ
3ec0: 65 65 64 73 20 61 6e 64 20 74 68 65 20 72 65 73  eeds and the res
3ed0: 75 6c 74 73 20 6d 61 74 63 68 20 74 68 6f 73 65  ults match those
3ee0: 20 73 70 65 63 69 66 69 65 64 0a 23 20 62 79 20   specified.# by 
3ef0: 70 61 72 61 6d 65 74 65 72 20 24 72 65 73 75 6c  parameter $resul
3f00: 74 2c 20 6f 72 20 28 62 29 20 54 43 4c 20 74 68  t, or (b) TCL th
3f10: 72 6f 77 73 20 61 6e 20 22 6f 75 74 20 6f 66 20  rows an "out of 
3f20: 6d 65 6d 6f 72 79 22 20 65 72 72 6f 72 2e 0a 23  memory" error..#
3f30: 0a 23 20 49 66 20 44 4f 5f 4d 41 4c 4c 4f 43 5f  .# If DO_MALLOC_
3f40: 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64 20  TEST is defined 
3f50: 61 6e 64 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c  and set to zero,
3f60: 20 74 68 65 6e 20 74 68 65 20 53 45 4c 45 43 54   then the SELECT
3f70: 20 73 74 61 74 65 6d 65 6e 74 0a 23 20 69 73 20   statement.# is 
3f80: 65 78 65 63 75 74 65 64 20 6a 75 73 74 20 6f 6e  executed just on
3f90: 63 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ce. In this case
3fa0: 20 74 68 65 20 74 65 73 74 20 63 61 73 65 20 70   the test case p
3fb0: 61 73 73 65 73 20 69 66 20 74 68 65 20 72 65 73  asses if the res
3fc0: 75 6c 74 73 0a 23 20 6d 61 74 63 68 20 74 68 65  ults.# match the
3fd0: 20 65 78 70 65 63 74 65 64 20 72 65 73 75 6c 74   expected result
3fe0: 73 20 70 61 73 73 65 64 20 76 69 61 20 70 61 72  s passed via par
3ff0: 61 6d 65 74 65 72 20 24 72 65 73 75 6c 74 2e 0a  ameter $result..
4000: 23 0a 70 72 6f 63 20 64 6f 5f 73 65 6c 65 63 74  #.proc do_select
4010: 5f 74 65 73 74 20 7b 6e 61 6d 65 20 73 71 6c 20  _test {name sql 
4020: 72 65 73 75 6c 74 7d 20 7b 0a 20 20 75 70 6c 65  result} {.  uple
4030: 76 65 6c 20 5b 6c 69 73 74 20 64 6f 50 61 73 73  vel [list doPass
4040: 69 76 65 54 65 73 74 20 30 20 24 6e 61 6d 65 20  iveTest 0 $name 
4050: 24 73 71 6c 20 5b 6c 69 73 74 20 30 20 24 72 65  $sql [list 0 $re
4060: 73 75 6c 74 5d 5d 0a 7d 0a 0a 70 72 6f 63 20 64  sult]].}..proc d
4070: 6f 5f 72 65 73 74 61 72 74 5f 73 65 6c 65 63 74  o_restart_select
4080: 5f 74 65 73 74 20 7b 6e 61 6d 65 20 73 71 6c 20  _test {name sql 
4090: 72 65 73 75 6c 74 7d 20 7b 0a 20 20 75 70 6c 65  result} {.  uple
40a0: 76 65 6c 20 5b 6c 69 73 74 20 64 6f 50 61 73 73  vel [list doPass
40b0: 69 76 65 54 65 73 74 20 31 20 24 6e 61 6d 65 20  iveTest 1 $name 
40c0: 24 73 71 6c 20 5b 6c 69 73 74 20 30 20 24 72 65  $sql [list 0 $re
40d0: 73 75 6c 74 5d 5d 0a 7d 0a 0a 70 72 6f 63 20 64  sult]].}..proc d
40e0: 6f 5f 65 72 72 6f 72 5f 74 65 73 74 20 7b 6e 61  o_error_test {na
40f0: 6d 65 20 73 71 6c 20 65 72 72 6f 72 7d 20 7b 0a  me sql error} {.
4100: 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20    uplevel [list 
4110: 64 6f 50 61 73 73 69 76 65 54 65 73 74 20 30 20  doPassiveTest 0 
4120: 24 6e 61 6d 65 20 24 73 71 6c 20 5b 6c 69 73 74  $name $sql [list
4130: 20 31 20 24 65 72 72 6f 72 5d 5d 0a 7d 0a 0a 70   1 $error]].}..p
4140: 72 6f 63 20 64 6f 50 61 73 73 69 76 65 54 65 73  roc doPassiveTes
4150: 74 20 7b 69 73 52 65 73 74 61 72 74 20 6e 61 6d  t {isRestart nam
4160: 65 20 73 71 6c 20 63 61 74 63 68 72 65 73 7d 20  e sql catchres} 
4170: 7b 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65  {.  if {![info e
4180: 78 69 73 74 73 20 3a 3a 44 4f 5f 4d 41 4c 4c 4f  xists ::DO_MALLO
4190: 43 5f 54 45 53 54 5d 7d 20 7b 20 73 65 74 20 3a  C_TEST]} { set :
41a0: 3a 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 20  :DO_MALLOC_TEST 
41b0: 31 20 7d 0a 0a 20 20 73 77 69 74 63 68 20 24 3a  1 }..  switch $:
41c0: 3a 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 20  :DO_MALLOC_TEST 
41d0: 7b 0a 20 20 20 20 30 20 7b 20 23 20 4e 6f 20 6d  {.    0 { # No m
41e0: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 2e 0a  alloc failures..
41f0: 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 24 6e        do_test $n
4200: 61 6d 65 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d  ame [list set {}
4210: 20 5b 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20   [uplevel [list 
4220: 63 61 74 63 68 73 71 6c 20 24 73 71 6c 5d 5d 5d  catchsql $sql]]]
4230: 20 24 63 61 74 63 68 72 65 73 0a 20 20 20 20 20   $catchres.     
4240: 20 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 20 20   return.    }.  
4250: 20 20 31 20 7b 20 23 20 53 69 6d 75 6c 61 74 65    1 { # Simulate
4260: 20 74 72 61 6e 73 69 65 6e 74 20 66 61 69 6c 75   transient failu
4270: 72 65 73 2e 0a 20 20 20 20 20 20 73 65 74 20 6e  res..      set n
4280: 52 65 70 65 61 74 20 31 0a 20 20 20 20 20 20 73  Repeat 1.      s
4290: 65 74 20 7a 4e 61 6d 65 20 22 74 72 61 6e 73 69  et zName "transi
42a0: 65 6e 74 22 0a 20 20 20 20 20 20 73 65 74 20 6e  ent".      set n
42b0: 53 74 61 72 74 4c 69 6d 69 74 20 31 30 30 30 30  StartLimit 10000
42c0: 30 0a 20 20 20 20 20 20 73 65 74 20 6e 42 61 63  0.      set nBac
42d0: 6b 75 70 20 31 0a 20 20 20 20 7d 0a 20 20 20 20  kup 1.    }.    
42e0: 32 20 7b 20 23 20 53 69 6d 75 6c 61 74 65 20 70  2 { # Simulate p
42f0: 65 72 73 69 73 74 65 6e 74 20 66 61 69 6c 75 72  ersistent failur
4300: 65 73 2e 0a 20 20 20 20 20 20 73 65 74 20 6e 52  es..      set nR
4310: 65 70 65 61 74 20 31 0a 20 20 20 20 20 20 73 65  epeat 1.      se
4320: 74 20 7a 4e 61 6d 65 20 22 70 65 72 73 69 73 74  t zName "persist
4330: 65 6e 74 22 0a 20 20 20 20 20 20 73 65 74 20 6e  ent".      set n
4340: 53 74 61 72 74 4c 69 6d 69 74 20 31 30 30 30 30  StartLimit 10000
4350: 30 0a 20 20 20 20 20 20 73 65 74 20 6e 42 61 63  0.      set nBac
4360: 6b 75 70 20 31 0a 20 20 20 20 7d 0a 20 20 20 20  kup 1.    }.    
4370: 33 20 7b 20 23 20 53 69 6d 75 6c 61 74 65 20 74  3 { # Simulate t
4380: 72 61 6e 73 69 65 6e 74 20 66 61 69 6c 75 72 65  ransient failure
4390: 73 20 77 69 74 68 20 65 78 74 72 61 20 62 72 75  s with extra bru
43a0: 74 65 20 66 6f 72 63 65 2e 0a 20 20 20 20 20 20  te force..      
43b0: 73 65 74 20 6e 52 65 70 65 61 74 20 31 30 30 30  set nRepeat 1000
43c0: 30 30 0a 20 20 20 20 20 20 73 65 74 20 7a 4e 61  00.      set zNa
43d0: 6d 65 20 22 72 69 64 69 63 75 6c 6f 75 73 22 0a  me "ridiculous".
43e0: 20 20 20 20 20 20 73 65 74 20 6e 53 74 61 72 74        set nStart
43f0: 4c 69 6d 69 74 20 31 0a 20 20 20 20 20 20 73 65  Limit 1.      se
4400: 74 20 6e 42 61 63 6b 75 70 20 31 30 0a 20 20 20  t nBackup 10.   
4410: 20 7d 0a 20 20 7d 0a 0a 20 20 23 20 54 68 65 20   }.  }..  # The 
4420: 73 65 74 20 6f 66 20 61 63 63 65 70 74 61 62 6c  set of acceptabl
4430: 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 72  e results from r
4440: 75 6e 6e 69 6e 67 20 5b 63 61 74 63 68 73 71 6c  unning [catchsql
4450: 20 24 73 71 6c 5d 2e 0a 20 20 23 0a 20 20 73 65   $sql]..  #.  se
4460: 74 20 61 6e 73 77 65 72 73 20 5b 6c 69 73 74 20  t answers [list 
4470: 7b 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  {1 {out of memor
4480: 79 7d 7d 20 24 63 61 74 63 68 72 65 73 5d 0a 20  y}} $catchres]. 
4490: 20 73 65 74 20 73 74 72 20 5b 6a 6f 69 6e 20 24   set str [join $
44a0: 61 6e 73 77 65 72 73 20 22 20 4f 52 20 22 5d 0a  answers " OR "].
44b0: 0a 20 20 73 65 74 20 6e 46 61 69 6c 20 31 0a 20  .  set nFail 1. 
44c0: 20 66 6f 72 20 7b 73 65 74 20 69 4c 69 6d 69 74   for {set iLimit
44d0: 20 24 6e 53 74 61 72 74 4c 69 6d 69 74 7d 20 7b   $nStartLimit} {
44e0: 24 6e 46 61 69 6c 7d 20 7b 69 6e 63 72 20 69 4c  $nFail} {incr iL
44f0: 69 6d 69 74 7d 20 7b 0a 20 20 20 20 66 6f 72 20  imit} {.    for 
4500: 7b 73 65 74 20 69 46 61 69 6c 20 31 7d 20 7b 24  {set iFail 1} {$
4510: 6e 46 61 69 6c 20 26 26 20 24 69 46 61 69 6c 3c  nFail && $iFail<
4520: 3d 24 69 4c 69 6d 69 74 7d 20 7b 69 6e 63 72 20  =$iLimit} {incr 
4530: 69 46 61 69 6c 7d 20 7b 0a 20 20 20 20 20 20 66  iFail} {.      f
4540: 6f 72 20 7b 73 65 74 20 69 54 65 73 74 20 30 7d  or {set iTest 0}
4550: 20 7b 24 69 54 65 73 74 3c 24 6e 42 61 63 6b 75   {$iTest<$nBacku
4560: 70 20 26 26 20 28 24 69 46 61 69 6c 2d 24 69 54  p && ($iFail-$iT
4570: 65 73 74 29 3e 30 7d 20 7b 69 6e 63 72 20 69 54  est)>0} {incr iT
4580: 65 73 74 7d 20 7b 0a 0a 20 20 20 20 20 20 20 20  est} {..        
4590: 69 66 20 7b 24 69 73 52 65 73 74 61 72 74 7d 20  if {$isRestart} 
45a0: 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  { sqlite3 db tes
45b0: 74 2e 64 62 20 7d 0a 0a 20 20 20 20 20 20 20 20  t.db }..        
45c0: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67  sqlite3_memdebug
45d0: 5f 66 61 69 6c 20 5b 65 78 70 72 20 24 69 46 61  _fail [expr $iFa
45e0: 69 6c 2d 24 69 54 65 73 74 5d 20 2d 72 65 70 65  il-$iTest] -repe
45f0: 61 74 20 24 6e 52 65 70 65 61 74 0a 20 20 20 20  at $nRepeat.    
4600: 20 20 20 20 73 65 74 20 72 65 73 20 5b 75 70 6c      set res [upl
4610: 65 76 65 6c 20 5b 6c 69 73 74 20 63 61 74 63 68  evel [list catch
4620: 73 71 6c 20 24 73 71 6c 5d 5d 0a 20 20 20 20 20  sql $sql]].     
4630: 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20     if {[lsearch 
4640: 2d 65 78 61 63 74 20 24 61 6e 73 77 65 72 73 20  -exact $answers 
4650: 24 72 65 73 5d 3e 3d 30 7d 20 7b 20 73 65 74 20  $res]>=0} { set 
4660: 72 65 73 20 24 73 74 72 20 7d 0a 20 20 20 20 20  res $str }.     
4670: 20 20 20 73 65 74 20 74 65 73 74 6e 61 6d 65 20     set testname 
4680: 22 24 6e 61 6d 65 2e 24 7a 4e 61 6d 65 2e 24 69  "$name.$zName.$i
4690: 46 61 69 6c 22 0a 20 20 20 20 20 20 20 20 64 6f  Fail".        do
46a0: 5f 74 65 73 74 20 22 24 6e 61 6d 65 2e 24 7a 4e  _test "$name.$zN
46b0: 61 6d 65 2e 24 69 4c 69 6d 69 74 2e 24 69 46 61  ame.$iLimit.$iFa
46c0: 69 6c 22 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d  il" [list set {}
46d0: 20 24 72 65 73 5d 20 24 73 74 72 0a 0a 20 20 20   $res] $str..   
46e0: 20 20 20 20 20 73 65 74 20 6e 46 61 69 6c 20 5b       set nFail [
46f0: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67  sqlite3_memdebug
4700: 5f 66 61 69 6c 20 2d 31 20 2d 62 65 6e 69 67 6e  _fail -1 -benign
4710: 63 6e 74 20 6e 42 65 6e 69 67 6e 5d 0a 20 20 20  cnt nBenign].   
4720: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
4730: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
4780: 54 65 73 74 20 61 20 73 69 6e 67 6c 65 20 77 72  Test a single wr
4790: 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
47a0: 61 73 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ase. In this cas
47b0: 65 20 61 20 20 22 77 72 69 74 65 22 20 69 73 20  e a  "write" is 
47c0: 61 20 0a 23 20 44 45 4c 45 54 45 2c 20 55 50 44  a .# DELETE, UPD
47d0: 41 54 45 20 6f 72 20 49 4e 53 45 52 54 20 73 74  ATE or INSERT st
47e0: 61 74 65 6d 65 6e 74 2e 0a 23 0a 23 20 49 66 20  atement..#.# If 
47f0: 4f 4f 4d 20 74 65 73 74 69 6e 67 20 69 73 20 70  OOM testing is p
4800: 65 72 66 6f 72 6d 65 64 2c 20 74 68 65 72 65 20  erformed, there 
4810: 61 72 65 20 73 65 76 65 72 61 6c 20 61 63 63 65  are several acce
4820: 70 74 61 62 6c 65 20 6f 75 74 63 6f 6d 65 73 3a  ptable outcomes:
4830: 0a 23 0a 23 20 20 20 31 29 20 54 68 65 20 77 72  .#.#   1) The wr
4840: 69 74 65 20 73 75 63 63 65 65 64 73 2e 20 4e 6f  ite succeeds. No
4850: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
4860: 65 64 2e 0a 23 0a 23 20 20 20 32 29 20 41 6e 20  ed..#.#   2) An 
4870: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 20  "out of memory" 
4880: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 72  exception is thr
4890: 6f 77 6e 20 61 6e 64 3a 0a 23 0a 23 20 20 20 20  own and:.#.#    
48a0: 20 61 29 20 54 68 65 20 73 74 61 74 65 6d 65 6e   a) The statemen
48b0: 74 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2c  t has no effect,
48c0: 20 4f 52 0a 23 20 20 20 20 20 62 29 20 54 68 65   OR.#     b) The
48d0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
48e0: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
48f0: 61 63 6b 2c 20 4f 52 0a 23 20 20 20 20 20 63 29  ack, OR.#     c)
4900: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   The statement s
4910: 75 63 63 65 65 64 73 2e 20 54 68 69 73 20 63 61  ucceeds. This ca
4920: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
4930: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   the connection.
4940: 23 20 20 20 20 20 20 20 20 69 73 20 69 6e 20 61  #        is in a
4950: 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  uto-commit mode 
4960: 28 61 66 74 65 72 20 74 68 65 20 73 74 61 74 65  (after the state
4970: 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65 64  ment is executed
4980: 2c 20 73 6f 20 74 68 69 73 0a 23 20 20 20 20 20  , so this.#     
4990: 20 20 20 69 6e 63 6c 75 64 65 73 20 43 4f 4d 4d     includes COMM
49a0: 49 54 20 73 74 61 74 65 6d 65 6e 74 73 29 2e 0a  IT statements)..
49b0: 23 0a 23 20 49 66 20 74 68 65 20 77 72 69 74 65  #.# If the write
49c0: 20 6f 70 65 72 61 74 69 6f 6e 20 65 76 65 6e 74   operation event
49d0: 75 61 6c 6c 79 20 73 75 63 63 65 65 64 73 2c 20  ually succeeds, 
49e0: 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
49f0: 2e 20 49 66 20 61 0a 23 20 74 72 61 6e 73 61 63  . If a.# transac
4a00: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
4a10: 61 63 6b 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  ack, non-zero is
4a20: 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a 23 20 50   returned..#.# P
4a30: 61 72 61 6d 65 74 65 72 20 24 6e 61 6d 65 20 69  arameter $name i
4a40: 73 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 75 73  s the name to us
4a50: 65 20 66 6f 72 20 74 68 65 20 74 65 73 74 20 63  e for the test c
4a60: 61 73 65 20 28 6f 72 20 74 65 73 74 20 63 61 73  ase (or test cas
4a70: 65 73 29 2e 0a 23 20 54 68 65 20 73 65 63 6f 6e  es)..# The secon
4a80: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 24 74 62  d parameter, $tb
4a90: 6c 2c 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  l, should be the
4aa0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
4ab0: 61 62 61 73 65 20 74 61 62 6c 65 0a 23 20 62 65  abase table.# be
4ac0: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 50 61  ing modified. Pa
4ad0: 72 61 6d 65 74 65 72 20 24 73 71 6c 20 63 6f 6e  rameter $sql con
4ae0: 74 61 69 6e 73 20 74 68 65 20 53 51 4c 20 73 74  tains the SQL st
4af0: 61 74 65 6d 65 6e 74 20 74 6f 20 74 65 73 74 2e  atement to test.
4b00: 0a 23 0a 70 72 6f 63 20 64 6f 5f 77 72 69 74 65  .#.proc do_write
4b10: 5f 74 65 73 74 20 7b 6e 61 6d 65 20 74 62 6c 20  _test {name tbl 
4b20: 73 71 6c 7d 20 7b 0a 20 20 69 66 20 7b 21 5b 69  sql} {.  if {![i
4b30: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 44 4f 5f  nfo exists ::DO_
4b40: 4d 41 4c 4c 4f 43 5f 54 45 53 54 5d 7d 20 7b 20  MALLOC_TEST]} { 
4b50: 73 65 74 20 3a 3a 44 4f 5f 4d 41 4c 4c 4f 43 5f  set ::DO_MALLOC_
4b60: 54 45 53 54 20 31 20 7d 0a 0a 20 20 23 20 46 69  TEST 1 }..  # Fi
4b70: 67 75 72 65 20 6f 75 74 20 61 6e 20 73 74 61 74  gure out an stat
4b80: 65 6d 65 6e 74 20 74 6f 20 67 65 74 20 61 20 63  ement to get a c
4b90: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 61 62 6c  hecksum for tabl
4ba0: 65 20 24 74 62 6c 2e 0a 20 20 64 62 20 65 76 61  e $tbl..  db eva
4bb0: 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l "SELECT * FROM
4bc0: 20 24 74 62 6c 22 20 56 20 62 72 65 61 6b 0a 20   $tbl" V break. 
4bd0: 20 73 65 74 20 63 6b 73 75 6d 73 71 6c 20 22 53   set cksumsql "S
4be0: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 5b 6a 6f  ELECT md5sum([jo
4bf0: 69 6e 20 5b 63 6f 6e 63 61 74 20 72 6f 77 69 64  in [concat rowid
4c00: 20 24 56 28 2a 29 5d 20 2c 5d 29 20 46 52 4f 4d   $V(*)] ,]) FROM
4c10: 20 24 74 62 6c 22 0a 0a 20 20 23 20 43 61 6c 63   $tbl"..  # Calc
4c20: 75 6c 61 74 65 20 74 68 65 20 69 6e 69 74 69 61  ulate the initia
4c30: 6c 20 74 61 62 6c 65 20 63 68 65 63 6b 73 75 6d  l table checksum
4c40: 2e 0a 20 20 73 65 74 20 63 6b 73 75 6d 31 20 5b  ..  set cksum1 [
4c50: 64 62 20 6f 6e 65 20 24 63 6b 73 75 6d 73 71 6c  db one $cksumsql
4c60: 5d 0a 0a 20 20 69 66 20 7b 24 3a 3a 44 4f 5f 4d  ]..  if {$::DO_M
4c70: 41 4c 4c 4f 43 5f 54 45 53 54 20 7d 20 7b 0a 20  ALLOC_TEST } {. 
4c80: 20 20 20 73 65 74 20 61 6e 73 77 65 72 73 20 5b     set answers [
4c90: 6c 69 73 74 20 7b 31 20 7b 6f 75 74 20 6f 66 20  list {1 {out of 
4ca0: 6d 65 6d 6f 72 79 7d 7d 20 7b 30 20 7b 7d 7d 5d  memory}} {0 {}}]
4cb0: 0a 20 20 20 20 69 66 20 7b 24 3a 3a 44 4f 5f 4d  .    if {$::DO_M
4cc0: 41 4c 4c 4f 43 5f 54 45 53 54 3d 3d 31 7d 20 7b  ALLOC_TEST==1} {
4cd0: 0a 20 20 20 20 20 20 73 65 74 20 6d 6f 64 65 73  .      set modes
4ce0: 20 7b 31 30 30 30 30 30 20 70 65 72 73 69 73 74   {100000 persist
4cf0: 65 6e 74 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ent}.    } else 
4d00: 7b 0a 20 20 20 20 20 20 73 65 74 20 6d 6f 64 65  {.      set mode
4d10: 73 20 7b 31 20 74 72 61 6e 73 69 65 6e 74 7d 0a  s {1 transient}.
4d20: 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
4d30: 0a 20 20 20 20 73 65 74 20 61 6e 73 77 65 72 73  .    set answers
4d40: 20 5b 6c 69 73 74 20 7b 30 20 7b 7d 7d 5d 0a 20   [list {0 {}}]. 
4d50: 20 20 20 73 65 74 20 6d 6f 64 65 73 20 5b 6c 69     set modes [li
4d60: 73 74 20 30 20 6e 6f 66 61 69 6c 5d 0a 20 20 7d  st 0 nofail].  }
4d70: 0a 20 20 73 65 74 20 73 74 72 20 5b 6a 6f 69 6e  .  set str [join
4d80: 20 24 61 6e 73 77 65 72 73 20 22 20 4f 52 20 22   $answers " OR "
4d90: 5d 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 52  ]..  foreach {nR
4da0: 65 70 65 61 74 20 7a 4e 61 6d 65 7d 20 24 6d 6f  epeat zName} $mo
4db0: 64 65 73 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73  des {.    for {s
4dc0: 65 74 20 69 46 61 69 6c 20 31 7d 20 31 20 7b 69  et iFail 1} 1 {i
4dd0: 6e 63 72 20 69 46 61 69 6c 7d 20 7b 0a 20 20 20  ncr iFail} {.   
4de0: 20 20 20 69 66 20 7b 24 3a 3a 44 4f 5f 4d 41 4c     if {$::DO_MAL
4df0: 4c 4f 43 5f 54 45 53 54 7d 20 7b 73 71 6c 69 74  LOC_TEST} {sqlit
4e00: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c  e3_memdebug_fail
4e10: 20 24 69 46 61 69 6c 20 2d 72 65 70 65 61 74 20   $iFail -repeat 
4e20: 24 6e 52 65 70 65 61 74 7d 0a 0a 20 20 20 20 20  $nRepeat}..     
4e30: 20 73 65 74 20 72 65 73 20 5b 75 70 6c 65 76 65   set res [upleve
4e40: 6c 20 5b 6c 69 73 74 20 63 61 74 63 68 73 71 6c  l [list catchsql
4e50: 20 24 73 71 6c 5d 5d 0a 20 20 20 20 20 20 73 65   $sql]].      se
4e60: 74 20 6e 46 61 69 6c 20 5b 73 71 6c 69 74 65 33  t nFail [sqlite3
4e70: 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 2d  _memdebug_fail -
4e80: 31 20 2d 62 65 6e 69 67 6e 63 6e 74 20 6e 42 65  1 -benigncnt nBe
4e90: 6e 69 67 6e 5d 0a 20 20 20 20 20 20 69 66 20 7b  nign].      if {
4ea0: 24 6e 46 61 69 6c 3d 3d 30 7d 20 7b 0a 20 20 20  $nFail==0} {.   
4eb0: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 24 6e 61       do_test $na
4ec0: 6d 65 2e 24 7a 4e 61 6d 65 2e 24 69 46 61 69 6c  me.$zName.$iFail
4ed0: 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72   [list set {} $r
4ee0: 65 73 5d 20 7b 30 20 7b 7d 7d 0a 20 20 20 20 20  es] {0 {}}.     
4ef0: 20 20 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20     return.      
4f00: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
4f10: 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 24 61   if {[lsearch $a
4f20: 6e 73 77 65 72 73 20 24 72 65 73 5d 3e 3d 30 7d  nswers $res]>=0}
4f30: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74   {.          set
4f40: 20 72 65 73 20 24 73 74 72 0a 20 20 20 20 20 20   res $str.      
4f50: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 6f 5f 74    }.        do_t
4f60: 65 73 74 20 24 6e 61 6d 65 2e 24 7a 4e 61 6d 65  est $name.$zName
4f70: 2e 24 69 46 61 69 6c 20 5b 6c 69 73 74 20 73 65  .$iFail [list se
4f80: 74 20 7b 7d 20 24 72 65 73 5d 20 24 73 74 72 0a  t {} $res] $str.
4f90: 20 20 20 20 20 20 20 20 73 65 74 20 63 6b 73 75          set cksu
4fa0: 6d 32 20 5b 64 62 20 6f 6e 65 20 24 63 6b 73 75  m2 [db one $cksu
4fb0: 6d 73 71 6c 5d 0a 20 20 20 20 20 20 20 20 69 66  msql].        if
4fc0: 20 7b 24 63 6b 73 75 6d 31 20 21 3d 20 24 63 6b   {$cksum1 != $ck
4fd0: 73 75 6d 32 7d 20 72 65 74 75 72 6e 0a 20 20 20  sum2} return.   
4fe0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
4ff0: 0a                                               .