/ Hex Artifact Content
Login

Artifact 50d0ed21eed0ae9548b58935bd29ac89a05a54fa:


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 23 20 20 20 20 20 2d 69 6e 73 74 61 6c 6c 20  .#     -install 
0d60: 20 20 20 20 20 20 20 20 20 53 63 72 69 70 74 20           Script 
0d70: 74 6f 20 65 78 65 63 75 74 65 20 61 66 74 65 72  to execute after
0d80: 20 66 61 75 6c 74 73 69 6d 20 2d 69 6e 6a 65 63   faultsim -injec
0d90: 74 69 6e 73 74 61 6c 6c 0a 23 0a 23 20 20 20 20  tinstall.#.#    
0da0: 20 2d 75 6e 69 6e 73 74 61 6c 6c 20 20 20 20 20   -uninstall     
0db0: 20 20 20 53 63 72 69 70 74 20 74 6f 20 65 78 65     Script to exe
0dc0: 63 75 74 65 20 61 66 74 65 72 20 66 61 75 6c 74  cute after fault
0dd0: 73 69 6d 20 2d 75 6e 69 6e 6a 65 63 74 69 6e 73  sim -uninjectins
0de0: 74 61 6c 6c 0a 23 0a 70 72 6f 63 20 64 6f 5f 66  tall.#.proc do_f
0df0: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 7b 6e 61  aultsim_test {na
0e00: 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 67 6c 6f  me args} {.  glo
0e10: 62 61 6c 20 46 41 55 4c 54 53 49 4d 0a 20 20 0a  bal FAULTSIM.  .
0e20: 20 20 73 65 74 20 44 45 46 41 55 4c 54 28 2d 66    set DEFAULT(-f
0e30: 61 75 6c 74 73 29 20 20 20 20 20 20 20 20 5b 61  aults)        [a
0e40: 72 72 61 79 20 6e 61 6d 65 73 20 46 41 55 4c 54  rray names FAULT
0e50: 53 49 4d 5d 0a 20 20 73 65 74 20 44 45 46 41 55  SIM].  set DEFAU
0e60: 4c 54 28 2d 70 72 65 70 29 20 20 20 20 20 20 20  LT(-prep)       
0e70: 20 20 20 22 22 0a 20 20 73 65 74 20 44 45 46 41     "".  set DEFA
0e80: 55 4c 54 28 2d 62 6f 64 79 29 20 20 20 20 20 20  ULT(-body)      
0e90: 20 20 20 20 22 22 0a 20 20 73 65 74 20 44 45 46      "".  set DEF
0ea0: 41 55 4c 54 28 2d 74 65 73 74 29 20 20 20 20 20  AULT(-test)     
0eb0: 20 20 20 20 20 22 22 0a 20 20 73 65 74 20 44 45       "".  set DE
0ec0: 46 41 55 4c 54 28 2d 69 6e 73 74 61 6c 6c 29 20  FAULT(-install) 
0ed0: 20 20 20 20 20 20 22 22 0a 20 20 73 65 74 20 44        "".  set D
0ee0: 45 46 41 55 4c 54 28 2d 75 6e 69 6e 73 74 61 6c  EFAULT(-uninstal
0ef0: 6c 29 20 20 20 20 20 22 22 0a 0a 20 20 66 69 78  l)     ""..  fix
0f00: 5f 74 65 73 74 6e 61 6d 65 20 6e 61 6d 65 0a 0a  _testname name..
0f10: 20 20 61 72 72 61 79 20 73 65 74 20 4f 20 5b 61    array set O [a
0f20: 72 72 61 79 20 67 65 74 20 44 45 46 41 55 4c 54  rray get DEFAULT
0f30: 5d 0a 20 20 61 72 72 61 79 20 73 65 74 20 4f 20  ].  array set O 
0f40: 24 61 72 67 73 0a 20 20 66 6f 72 65 61 63 68 20  $args.  foreach 
0f50: 6f 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 4f  o [array names O
0f60: 5d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66  ] {.    if {[inf
0f70: 6f 20 65 78 69 73 74 73 20 44 45 46 41 55 4c 54  o exists DEFAULT
0f80: 28 24 6f 29 5d 3d 3d 30 7d 20 7b 20 65 72 72 6f  ($o)]==0} { erro
0f90: 72 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  r "unknown optio
0fa0: 6e 3a 20 24 6f 22 20 7d 0a 20 20 7d 0a 0a 20 20  n: $o" }.  }..  
0fb0: 73 65 74 20 66 61 75 6c 74 6c 69 73 74 20 5b 6c  set faultlist [l
0fc0: 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68 20 66  ist].  foreach f
0fd0: 20 24 4f 28 2d 66 61 75 6c 74 73 29 20 7b 0a 20   $O(-faults) {. 
0fe0: 20 20 20 73 65 74 20 66 6c 69 73 74 20 5b 61 72     set flist [ar
0ff0: 72 61 79 20 6e 61 6d 65 73 20 46 41 55 4c 54 53  ray names FAULTS
1000: 49 4d 20 24 66 5d 0a 20 20 20 20 69 66 20 7b 5b  IM $f].    if {[
1010: 6c 6c 65 6e 67 74 68 20 24 66 6c 69 73 74 5d 3d  llength $flist]=
1020: 3d 30 7d 20 7b 20 65 72 72 6f 72 20 22 75 6e 6b  =0} { error "unk
1030: 6e 6f 77 6e 20 66 61 75 6c 74 3a 20 24 66 22 20  nown fault: $f" 
1040: 7d 0a 20 20 20 20 73 65 74 20 66 61 75 6c 74 6c  }.    set faultl
1050: 69 73 74 20 5b 63 6f 6e 63 61 74 20 24 66 61 75  ist [concat $fau
1060: 6c 74 6c 69 73 74 20 24 66 6c 69 73 74 5d 0a 20  ltlist $flist]. 
1070: 20 7d 0a 0a 20 20 73 65 74 20 74 65 73 74 73 70   }..  set testsp
1080: 65 63 20 5b 6c 69 73 74 20 2d 70 72 65 70 20 24  ec [list -prep $
1090: 4f 28 2d 70 72 65 70 29 20 2d 62 6f 64 79 20 24  O(-prep) -body $
10a0: 4f 28 2d 62 6f 64 79 29 20 5c 0a 20 20 20 20 20  O(-body) \.     
10b0: 20 2d 74 65 73 74 20 24 4f 28 2d 74 65 73 74 29   -test $O(-test)
10c0: 20 2d 69 6e 73 74 61 6c 6c 20 24 4f 28 2d 69 6e   -install $O(-in
10d0: 73 74 61 6c 6c 29 20 2d 75 6e 69 6e 73 74 61 6c  stall) -uninstal
10e0: 6c 20 24 4f 28 2d 75 6e 69 6e 73 74 61 6c 6c 29  l $O(-uninstall)
10f0: 0a 20 20 5d 0a 20 20 66 6f 72 65 61 63 68 20 66  .  ].  foreach f
1100: 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 20   [lsort -unique 
1110: 24 66 61 75 6c 74 6c 69 73 74 5d 20 7b 0a 20 20  $faultlist] {.  
1120: 20 20 65 76 61 6c 20 64 6f 5f 6f 6e 65 5f 66 61    eval do_one_fa
1130: 75 6c 74 73 69 6d 5f 74 65 73 74 20 22 24 6e 61  ultsim_test "$na
1140: 6d 65 2d 24 66 22 20 24 46 41 55 4c 54 53 49 4d  me-$f" $FAULTSIM
1150: 28 24 66 29 20 24 74 65 73 74 73 70 65 63 0a 20  ($f) $testspec. 
1160: 20 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   }.}...#--------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b0: 2d 0a 23 20 50 72 6f 63 65 64 75 72 65 73 20 74  -.# Procedures t
11c0: 6f 20 73 61 76 65 20 61 6e 64 20 72 65 73 74 6f  o save and resto
11d0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  re the current f
11e0: 69 6c 65 2d 73 79 73 74 65 6d 20 73 74 61 74 65  ile-system state
11f0: 3a 0a 23 0a 23 20 20 20 66 61 75 6c 74 73 69 6d  :.#.#   faultsim
1200: 5f 73 61 76 65 0a 23 20 20 20 66 61 75 6c 74 73  _save.#   faults
1210: 69 6d 5f 72 65 73 74 6f 72 65 0a 23 20 20 20 66  im_restore.#   f
1220: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
1230: 5f 63 6c 6f 73 65 0a 23 20 20 20 66 61 75 6c 74  _close.#   fault
1240: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
1250: 72 65 6f 70 65 6e 0a 23 20 20 20 66 61 75 6c 74  reopen.#   fault
1260: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
1270: 65 6f 70 65 6e 0a 23 0a 70 72 6f 63 20 66 61 75  eopen.#.proc fau
1280: 6c 74 73 69 6d 5f 73 61 76 65 20 7b 61 72 67 73  ltsim_save {args
1290: 7d 20 7b 20 75 70 6c 65 76 65 6c 20 64 62 5f 73  } { uplevel db_s
12a0: 61 76 65 20 24 61 72 67 73 20 7d 0a 70 72 6f 63  ave $args }.proc
12b0: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61   faultsim_save_a
12c0: 6e 64 5f 63 6c 6f 73 65 20 7b 61 72 67 73 7d 20  nd_close {args} 
12d0: 7b 20 75 70 6c 65 76 65 6c 20 64 62 5f 73 61 76  { uplevel db_sav
12e0: 65 5f 61 6e 64 5f 63 6c 6f 73 65 20 24 61 72 67  e_and_close $arg
12f0: 73 20 7d 0a 70 72 6f 63 20 66 61 75 6c 74 73 69  s }.proc faultsi
1300: 6d 5f 72 65 73 74 6f 72 65 20 7b 61 72 67 73 7d  m_restore {args}
1310: 20 7b 20 75 70 6c 65 76 65 6c 20 64 62 5f 72 65   { uplevel db_re
1320: 73 74 6f 72 65 20 24 61 72 67 73 20 7d 0a 70 72  store $args }.pr
1330: 6f 63 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  oc faultsim_rest
1340: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 7b  ore_and_reopen {
1350: 61 72 67 73 7d 20 7b 20 0a 20 20 75 70 6c 65 76  args} { .  uplev
1360: 65 6c 20 64 62 5f 72 65 73 74 6f 72 65 5f 61 6e  el db_restore_an
1370: 64 5f 72 65 6f 70 65 6e 20 24 61 72 67 73 20 0a  d_reopen $args .
1380: 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
1390: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20  ed_result_codes 
13a0: 64 62 20 31 0a 20 20 73 71 6c 69 74 65 33 5f 64  db 1.  sqlite3_d
13b0: 62 5f 63 6f 6e 66 69 67 5f 6c 6f 6f 6b 61 73 69  b_config_lookasi
13c0: 64 65 20 64 62 20 30 20 30 20 30 0a 7d 0a 70 72  de db 0 0 0.}.pr
13d0: 6f 63 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  oc faultsim_dele
13e0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 7b 61  te_and_reopen {a
13f0: 72 67 73 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c  rgs} {.  uplevel
1400: 20 64 62 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72   db_delete_and_r
1410: 65 6f 70 65 6e 20 24 61 72 67 73 20 0a 20 20 73  eopen $args .  s
1420: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
1430: 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 64 62 20  result_codes db 
1440: 31 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  1.  sqlite3_db_c
1450: 6f 6e 66 69 67 5f 6c 6f 6f 6b 61 73 69 64 65 20  onfig_lookaside 
1460: 64 62 20 30 20 30 20 30 0a 7d 0a 0a 70 72 6f 63  db 0 0 0.}..proc
1470: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
1480: 69 74 79 5f 63 68 65 63 6b 20 7b 7b 64 62 20 64  ity_check {{db d
1490: 62 7d 7d 20 7b 0a 20 20 73 65 74 20 69 63 20 5b  b}} {.  set ic [
14a0: 24 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  $db eval { PRAGM
14b0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
14c0: 6b 20 7d 5d 0a 20 20 69 66 20 7b 24 69 63 20 21  k }].  if {$ic !
14d0: 3d 20 22 6f 6b 22 7d 20 7b 20 65 72 72 6f 72 20  = "ok"} { error 
14e0: 22 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b  "Integrity check
14f0: 3a 20 24 69 63 22 20 7d 0a 7d 0a 0a 0a 23 20 54  : $ic" }.}...# T
1500: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
1510: 63 73 20 61 72 65 20 75 73 65 64 20 61 73 20 5b  cs are used as [
1520: 64 6f 5f 6f 6e 65 5f 66 61 75 6c 74 73 69 6d 5f  do_one_faultsim_
1530: 74 65 73 74 5d 20 63 61 6c 6c 62 61 63 6b 73 20  test] callbacks 
1540: 77 68 65 6e 20 0a 23 20 69 6e 6a 65 63 74 69 6e  when .# injectin
1550: 67 20 4f 4f 4d 20 66 61 75 6c 74 73 20 69 6e 74  g OOM faults int
1560: 6f 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a  o test cases..#.
1570: 70 72 6f 63 20 6f 6f 6d 5f 69 6e 6a 65 63 74 73  proc oom_injects
1580: 74 61 72 74 20 7b 6e 52 65 70 65 61 74 20 69 46  tart {nRepeat iF
1590: 61 69 6c 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33  ail} {.  sqlite3
15a0: 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 5b  _memdebug_fail [
15b0: 65 78 70 72 20 24 69 46 61 69 6c 2d 31 5d 20 2d  expr $iFail-1] -
15c0: 72 65 70 65 61 74 20 24 6e 52 65 70 65 61 74 0a  repeat $nRepeat.
15d0: 7d 0a 70 72 6f 63 20 6f 6f 6d 5f 69 6e 6a 65 63  }.proc oom_injec
15e0: 74 73 74 6f 70 20 7b 7d 20 7b 0a 20 20 73 71 6c  tstop {} {.  sql
15f0: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66 61  ite3_memdebug_fa
1600: 69 6c 20 2d 31 0a 7d 0a 0a 23 20 54 68 65 20 66  il -1.}..# The f
1610: 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 73 20 61  ollowing procs a
1620: 72 65 20 75 73 65 64 20 61 73 20 5b 64 6f 5f 6f  re used as [do_o
1630: 6e 65 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  ne_faultsim_test
1640: 5d 20 63 61 6c 6c 62 61 63 6b 73 20 77 68 65 6e  ] callbacks when
1650: 20 0a 23 20 69 6e 6a 65 63 74 69 6e 67 20 49 4f   .# injecting IO
1660: 20 65 72 72 6f 72 20 66 61 75 6c 74 73 20 69 6e   error faults in
1670: 74 6f 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23  to test cases..#
1680: 0a 70 72 6f 63 20 69 6f 65 72 72 5f 69 6e 6a 65  .proc ioerr_inje
1690: 63 74 73 74 61 72 74 20 7b 70 65 72 73 69 73 74  ctstart {persist
16a0: 20 69 46 61 69 6c 7d 20 7b 0a 20 20 73 65 74 20   iFail} {.  set 
16b0: 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f  ::sqlite_io_erro
16c0: 72 5f 70 65 72 73 69 73 74 20 24 70 65 72 73 69  r_persist $persi
16d0: 73 74 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  st.  set ::sqlit
16e0: 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  e_io_error_pendi
16f0: 6e 67 20 24 69 46 61 69 6c 0a 7d 0a 70 72 6f 63  ng $iFail.}.proc
1700: 20 69 6f 65 72 72 5f 69 6e 6a 65 63 74 73 74 6f   ioerr_injectsto
1710: 70 20 7b 7d 20 7b 0a 20 20 73 65 74 20 73 76 20  p {} {.  set sv 
1720: 24 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72  $::sqlite_io_err
1730: 6f 72 5f 68 69 74 0a 20 20 73 65 74 20 3a 3a 73  or_hit.  set ::s
1740: 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70  qlite_io_error_p
1750: 65 72 73 69 73 74 20 30 0a 20 20 73 65 74 20 3a  ersist 0.  set :
1760: 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72  :sqlite_io_error
1770: 5f 70 65 6e 64 69 6e 67 20 30 0a 20 20 73 65 74  _pending 0.  set
1780: 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72   ::sqlite_io_err
1790: 6f 72 5f 68 61 72 64 68 69 74 20 30 0a 20 20 73  or_hardhit 0.  s
17a0: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65  et ::sqlite_io_e
17b0: 72 72 6f 72 5f 68 69 74 20 20 20 20 20 30 0a 20  rror_hit     0. 
17c0: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f   set ::sqlite_io
17d0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 30  _error_pending 0
17e0: 0a 20 20 72 65 74 75 72 6e 20 24 73 76 0a 7d 0a  .  return $sv.}.
17f0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
1800: 20 70 72 6f 63 73 20 61 72 65 20 75 73 65 64 20   procs are used 
1810: 61 73 20 5b 64 6f 5f 6f 6e 65 5f 66 61 75 6c 74  as [do_one_fault
1820: 73 69 6d 5f 74 65 73 74 5d 20 63 61 6c 6c 62 61  sim_test] callba
1830: 63 6b 73 20 77 68 65 6e 20 0a 23 20 69 6e 6a 65  cks when .# inje
1840: 63 74 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  cting shared-mem
1850: 6f 72 79 20 72 65 6c 61 74 65 64 20 65 72 72 6f  ory related erro
1860: 72 20 66 61 75 6c 74 73 20 69 6e 74 6f 20 74 65  r faults into te
1870: 73 74 20 63 61 73 65 73 2e 0a 23 0a 70 72 6f 63  st cases..#.proc
1880: 20 73 68 6d 65 72 72 5f 69 6e 6a 65 63 74 69 6e   shmerr_injectin
1890: 73 74 61 6c 6c 20 7b 7d 20 7b 0a 20 20 74 65 73  stall {} {.  tes
18a0: 74 76 66 73 20 73 68 6d 66 61 75 6c 74 20 2d 64  tvfs shmfault -d
18b0: 65 66 61 75 6c 74 20 74 72 75 65 0a 20 20 73 68  efault true.  sh
18c0: 6d 66 61 75 6c 74 20 66 69 6c 74 65 72 20 7b 78  mfault filter {x
18d0: 53 68 6d 4f 70 65 6e 20 78 53 68 6d 4d 61 70 20  ShmOpen xShmMap 
18e0: 78 53 68 6d 4c 6f 63 6b 7d 0a 7d 0a 70 72 6f 63  xShmLock}.}.proc
18f0: 20 73 68 6d 65 72 72 5f 69 6e 6a 65 63 74 75 6e   shmerr_injectun
1900: 69 6e 73 74 61 6c 6c 20 7b 7d 20 7b 0a 20 20 63  install {} {.  c
1910: 61 74 63 68 20 7b 64 62 20 20 63 6c 6f 73 65 7d  atch {db  close}
1920: 0a 20 20 63 61 74 63 68 20 7b 64 62 32 20 63 6c  .  catch {db2 cl
1930: 6f 73 65 7d 0a 20 20 73 68 6d 66 61 75 6c 74 20  ose}.  shmfault 
1940: 64 65 6c 65 74 65 0a 7d 0a 70 72 6f 63 20 73 68  delete.}.proc sh
1950: 6d 65 72 72 5f 69 6e 6a 65 63 74 73 74 61 72 74  merr_injectstart
1960: 20 7b 70 65 72 73 69 73 74 20 69 46 61 69 6c 7d   {persist iFail}
1970: 20 7b 0a 20 20 73 68 6d 66 61 75 6c 74 20 69 6f   {.  shmfault io
1980: 65 72 72 20 24 69 46 61 69 6c 20 24 70 65 72 73  err $iFail $pers
1990: 69 73 74 0a 7d 0a 70 72 6f 63 20 73 68 6d 65 72  ist.}.proc shmer
19a0: 72 5f 69 6e 6a 65 63 74 73 74 6f 70 20 7b 7d 20  r_injectstop {} 
19b0: 7b 0a 20 20 73 68 6d 66 61 75 6c 74 20 69 6f 65  {.  shmfault ioe
19c0: 72 72 0a 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c  rr.}..# The foll
19d0: 6f 77 69 6e 67 20 70 72 6f 63 73 20 61 72 65 20  owing procs are 
19e0: 75 73 65 64 20 61 73 20 5b 64 6f 5f 6f 6e 65 5f  used as [do_one_
19f0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5d 20 63  faultsim_test] c
1a00: 61 6c 6c 62 61 63 6b 73 20 77 68 65 6e 20 0a 23  allbacks when .#
1a10: 20 69 6e 6a 65 63 74 69 6e 67 20 53 51 4c 49 54   injecting SQLIT
1a20: 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 66 61 75  E_FULL error fau
1a30: 6c 74 73 20 69 6e 74 6f 20 74 65 73 74 20 63 61  lts into test ca
1a40: 73 65 73 2e 0a 23 0a 70 72 6f 63 20 66 75 6c 6c  ses..#.proc full
1a50: 65 72 72 5f 69 6e 6a 65 63 74 69 6e 73 74 61 6c  err_injectinstal
1a60: 6c 20 7b 7d 20 7b 0a 20 20 74 65 73 74 76 66 73  l {} {.  testvfs
1a70: 20 73 68 6d 66 61 75 6c 74 20 2d 64 65 66 61 75   shmfault -defau
1a80: 6c 74 20 74 72 75 65 0a 7d 0a 70 72 6f 63 20 66  lt true.}.proc f
1a90: 75 6c 6c 65 72 72 5f 69 6e 6a 65 63 74 75 6e 69  ullerr_injectuni
1aa0: 6e 73 74 61 6c 6c 20 7b 7d 20 7b 0a 20 20 63 61  nstall {} {.  ca
1ab0: 74 63 68 20 7b 64 62 20 20 63 6c 6f 73 65 7d 0a  tch {db  close}.
1ac0: 20 20 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f    catch {db2 clo
1ad0: 73 65 7d 0a 20 20 73 68 6d 66 61 75 6c 74 20 64  se}.  shmfault d
1ae0: 65 6c 65 74 65 0a 7d 0a 70 72 6f 63 20 66 75 6c  elete.}.proc ful
1af0: 6c 65 72 72 5f 69 6e 6a 65 63 74 73 74 61 72 74  lerr_injectstart
1b00: 20 7b 69 46 61 69 6c 7d 20 7b 0a 20 20 73 68 6d   {iFail} {.  shm
1b10: 66 61 75 6c 74 20 66 75 6c 6c 20 24 69 46 61 69  fault full $iFai
1b20: 6c 20 31 0a 7d 0a 70 72 6f 63 20 66 75 6c 6c 65  l 1.}.proc fulle
1b30: 72 72 5f 69 6e 6a 65 63 74 73 74 6f 70 20 7b 7d  rr_injectstop {}
1b40: 20 7b 0a 20 20 73 68 6d 66 61 75 6c 74 20 66 75   {.  shmfault fu
1b50: 6c 6c 0a 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c  ll.}..# The foll
1b60: 6f 77 69 6e 67 20 70 72 6f 63 73 20 61 72 65 20  owing procs are 
1b70: 75 73 65 64 20 61 73 20 5b 64 6f 5f 6f 6e 65 5f  used as [do_one_
1b80: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5d 20 63  faultsim_test] c
1b90: 61 6c 6c 62 61 63 6b 73 20 77 68 65 6e 20 0a 23  allbacks when .#
1ba0: 20 69 6e 6a 65 63 74 69 6e 67 20 53 51 4c 49 54   injecting SQLIT
1bb0: 45 5f 43 41 4e 54 4f 50 45 4e 20 65 72 72 6f 72  E_CANTOPEN error
1bc0: 20 66 61 75 6c 74 73 20 69 6e 74 6f 20 74 65 73   faults into tes
1bd0: 74 20 63 61 73 65 73 2e 0a 23 0a 70 72 6f 63 20  t cases..#.proc 
1be0: 63 61 6e 74 6f 70 65 6e 5f 69 6e 6a 65 63 74 69  cantopen_injecti
1bf0: 6e 73 74 61 6c 6c 20 7b 7d 20 7b 0a 20 20 74 65  nstall {} {.  te
1c00: 73 74 76 66 73 20 73 68 6d 66 61 75 6c 74 20 2d  stvfs shmfault -
1c10: 64 65 66 61 75 6c 74 20 74 72 75 65 0a 7d 0a 70  default true.}.p
1c20: 72 6f 63 20 63 61 6e 74 6f 70 65 6e 5f 69 6e 6a  roc cantopen_inj
1c30: 65 63 74 75 6e 69 6e 73 74 61 6c 6c 20 7b 7d 20  ectuninstall {} 
1c40: 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 20 63  {.  catch {db  c
1c50: 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20 7b 64  lose}.  catch {d
1c60: 62 32 20 63 6c 6f 73 65 7d 0a 20 20 73 68 6d 66  b2 close}.  shmf
1c70: 61 75 6c 74 20 64 65 6c 65 74 65 0a 7d 0a 70 72  ault delete.}.pr
1c80: 6f 63 20 63 61 6e 74 6f 70 65 6e 5f 69 6e 6a 65  oc cantopen_inje
1c90: 63 74 73 74 61 72 74 20 7b 70 65 72 73 69 73 74  ctstart {persist
1ca0: 20 69 46 61 69 6c 7d 20 7b 0a 20 20 73 68 6d 66   iFail} {.  shmf
1cb0: 61 75 6c 74 20 63 61 6e 74 6f 70 65 6e 20 24 69  ault cantopen $i
1cc0: 46 61 69 6c 20 24 70 65 72 73 69 73 74 0a 7d 0a  Fail $persist.}.
1cd0: 70 72 6f 63 20 63 61 6e 74 6f 70 65 6e 5f 69 6e  proc cantopen_in
1ce0: 6a 65 63 74 73 74 6f 70 20 7b 7d 20 7b 0a 20 20  jectstop {} {.  
1cf0: 73 68 6d 66 61 75 6c 74 20 63 61 6e 74 6f 70 65  shmfault cantope
1d00: 6e 0a 7d 0a 0a 23 20 54 68 69 73 20 63 6f 6d 6d  n.}..# This comm
1d10: 61 6e 64 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  and is not calle
1d20: 64 20 64 69 72 65 63 74 6c 79 2e 20 49 74 20 69  d directly. It i
1d30: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 23  s used by the .#
1d40: 20 5b 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f   [faultsim_test_
1d50: 72 65 73 75 6c 74 5d 20 63 6f 6d 6d 61 6e 64 20  result] command 
1d60: 63 72 65 61 74 65 64 20 62 79 20 5b 64 6f 5f 66  created by [do_f
1d70: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5d 20 61 6e  aultsim_test] an
1d80: 64 20 75 73 65 64 0a 23 20 62 79 20 2d 74 65 73  d used.# by -tes
1d90: 74 20 73 63 72 69 70 74 73 2e 0a 23 0a 70 72 6f  t scripts..#.pro
1da0: 63 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f  c faultsim_test_
1db0: 72 65 73 75 6c 74 5f 69 6e 74 20 7b 61 72 67 73  result_int {args
1dc0: 7d 20 7b 0a 20 20 75 70 76 61 72 20 74 65 73 74  } {.  upvar test
1dd0: 72 63 20 74 65 73 74 72 63 20 74 65 73 74 72 65  rc testrc testre
1de0: 73 75 6c 74 20 74 65 73 74 72 65 73 75 6c 74 20  sult testresult 
1df0: 74 65 73 74 6e 66 61 69 6c 20 74 65 73 74 6e 66  testnfail testnf
1e00: 61 69 6c 0a 20 20 73 65 74 20 74 20 5b 6c 69 73  ail.  set t [lis
1e10: 74 20 24 74 65 73 74 72 63 20 24 74 65 73 74 72  t $testrc $testr
1e20: 65 73 75 6c 74 5d 0a 20 20 73 65 74 20 72 20 24  esult].  set r $
1e30: 61 72 67 73 0a 20 20 69 66 20 7b 20 28 24 74 65  args.  if { ($te
1e40: 73 74 6e 66 61 69 6c 3d 3d 30 20 26 26 20 24 74  stnfail==0 && $t
1e50: 20 21 3d 20 5b 6c 69 6e 64 65 78 20 24 72 20 30   != [lindex $r 0
1e60: 5d 29 20 7c 7c 20 5b 6c 73 65 61 72 63 68 20 24  ]) || [lsearch $
1e70: 72 20 24 74 5d 3c 30 20 7d 20 7b 0a 20 20 20 20  r $t]<0 } {.    
1e80: 65 72 72 6f 72 20 22 6e 66 61 69 6c 3d 24 74 65  error "nfail=$te
1e90: 73 74 6e 66 61 69 6c 20 72 63 3d 24 74 65 73 74  stnfail rc=$test
1ea0: 72 63 20 72 65 73 75 6c 74 3d 24 74 65 73 74 72  rc result=$testr
1eb0: 65 73 75 6c 74 22 0a 20 20 7d 0a 7d 0a 0a 23 2d  esult".  }.}..#-
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 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 0a 23 20 55 73 61 67  ---------.# Usag
1f10: 65 20 64 6f 5f 6f 6e 65 5f 66 61 75 6c 74 73 69  e do_one_faultsi
1f20: 6d 5f 74 65 73 74 20 4e 41 4d 45 20 3f 4f 50 54  m_test NAME ?OPT
1f30: 49 4f 4e 53 2e 2e 2e 3f 20 0a 23 0a 23 20 54 68  IONS...? .#.# Th
1f40: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1f50: 2c 20 3c 74 65 73 74 20 6e 75 6d 62 65 72 3e 2c  , <test number>,
1f60: 20 69 73 20 75 73 65 64 20 61 73 20 61 20 70 72   is used as a pr
1f70: 65 66 69 78 20 6f 66 20 74 68 65 20 74 65 73 74  efix of the test
1f80: 20 6e 61 6d 65 73 0a 23 20 74 61 6b 65 6e 20 62   names.# taken b
1f90: 79 20 74 65 73 74 73 20 65 78 65 63 75 74 65 64  y tests executed
1fa0: 20 62 79 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64   by this command
1fb0: 2e 20 4f 70 74 69 6f 6e 73 20 61 72 65 20 61 73  . Options are as
1fc0: 20 66 6f 6c 6c 6f 77 73 2e 20 41 6c 6c 0a 23 20   follows. All.# 
1fd0: 6f 70 74 69 6f 6e 73 20 74 61 6b 65 20 61 20 73  options take a s
1fe0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 2e 0a  ingle argument..
1ff0: 23 0a 23 20 20 20 20 20 2d 69 6e 6a 65 63 74 73  #.#     -injects
2000: 74 61 72 74 20 20 20 20 20 20 53 63 72 69 70 74  tart      Script
2010: 20 74 6f 20 65 6e 61 62 6c 65 20 66 61 75 6c 74   to enable fault
2020: 2d 69 6e 6a 65 63 74 69 6f 6e 2e 0a 23 0a 23 20  -injection..#.# 
2030: 20 20 20 20 2d 69 6e 6a 65 63 74 73 74 6f 70 20      -injectstop 
2040: 20 20 20 20 20 20 53 63 72 69 70 74 20 74 6f 20        Script to 
2050: 64 69 73 61 62 6c 65 20 66 61 75 6c 74 2d 69 6e  disable fault-in
2060: 6a 65 63 74 69 6f 6e 2e 0a 23 0a 23 20 20 20 20  jection..#.#    
2070: 20 2d 69 6e 6a 65 63 74 65 72 72 6c 69 73 74 20   -injecterrlist 
2080: 20 20 20 4c 69 73 74 20 6f 66 20 67 65 6e 65 72     List of gener
2090: 61 6c 6c 79 20 61 63 63 65 70 74 61 62 6c 65 20  ally acceptable 
20a0: 74 65 73 74 20 72 65 73 75 6c 74 73 20 28 69 2e  test results (i.
20b0: 65 2e 20 65 72 72 6f 72 0a 23 20 20 20 20 20 20  e. error.#      
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 6d 65 73 73 61 67 65 73 29 2e 20 45 78 61 6d   messages). Exam
20e0: 70 6c 65 3a 20 5b 6c 69 73 74 20 7b 31 20 7b 6f  ple: [list {1 {o
20f0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 7d 7d 5d 0a  ut of memory}}].
2100: 23 0a 23 20 20 20 20 20 2d 69 6e 6a 65 63 74 69  #.#     -injecti
2110: 6e 73 74 61 6c 6c 0a 23 0a 23 20 20 20 20 20 2d  nstall.#.#     -
2120: 69 6e 6a 65 63 74 75 6e 69 6e 73 74 61 6c 6c 0a  injectuninstall.
2130: 23 0a 23 20 20 20 20 20 2d 70 72 65 70 20 20 20  #.#     -prep   
2140: 20 20 20 20 20 20 20 20 20 20 53 63 72 69 70 74            Script
2150: 20 74 6f 20 65 78 65 63 75 74 65 20 62 65 66 6f   to execute befo
2160: 72 65 20 2d 62 6f 64 79 2e 0a 23 0a 23 20 20 20  re -body..#.#   
2170: 20 20 2d 62 6f 64 79 20 20 20 20 20 20 20 20 20    -body         
2180: 20 20 20 20 53 63 72 69 70 74 20 74 6f 20 65 78      Script to ex
2190: 65 63 75 74 65 20 28 77 69 74 68 20 66 61 75 6c  ecute (with faul
21a0: 74 20 69 6e 6a 65 63 74 69 6f 6e 29 2e 0a 23 0a  t injection)..#.
21b0: 23 20 20 20 20 20 2d 74 65 73 74 20 20 20 20 20  #     -test     
21c0: 20 20 20 20 20 20 20 20 53 63 72 69 70 74 20 74          Script t
21d0: 6f 20 65 78 65 63 75 74 65 20 61 66 74 65 72 20  o execute after 
21e0: 2d 62 6f 64 79 2e 0a 23 0a 70 72 6f 63 20 64 6f  -body..#.proc do
21f0: 5f 6f 6e 65 5f 66 61 75 6c 74 73 69 6d 5f 74 65  _one_faultsim_te
2200: 73 74 20 7b 74 65 73 74 6e 61 6d 65 20 61 72 67  st {testname arg
2210: 73 7d 20 7b 0a 0a 20 20 73 65 74 20 44 45 46 41  s} {..  set DEFA
2220: 55 4c 54 28 2d 69 6e 6a 65 63 74 73 74 61 72 74  ULT(-injectstart
2230: 29 20 20 20 20 20 22 65 78 70 72 22 0a 20 20 73  )     "expr".  s
2240: 65 74 20 44 45 46 41 55 4c 54 28 2d 69 6e 6a 65  et DEFAULT(-inje
2250: 63 74 73 74 6f 70 29 20 20 20 20 20 20 22 65 78  ctstop)      "ex
2260: 70 72 20 30 22 0a 20 20 73 65 74 20 44 45 46 41  pr 0".  set DEFA
2270: 55 4c 54 28 2d 69 6e 6a 65 63 74 65 72 72 6c 69  ULT(-injecterrli
2280: 73 74 29 20 20 20 5b 6c 69 73 74 5d 0a 20 20 73  st)   [list].  s
2290: 65 74 20 44 45 46 41 55 4c 54 28 2d 69 6e 6a 65  et DEFAULT(-inje
22a0: 63 74 69 6e 73 74 61 6c 6c 29 20 20 20 22 22 0a  ctinstall)   "".
22b0: 20 20 73 65 74 20 44 45 46 41 55 4c 54 28 2d 69    set DEFAULT(-i
22c0: 6e 6a 65 63 74 75 6e 69 6e 73 74 61 6c 6c 29 20  njectuninstall) 
22d0: 22 22 0a 20 20 73 65 74 20 44 45 46 41 55 4c 54  "".  set DEFAULT
22e0: 28 2d 70 72 65 70 29 20 20 20 20 20 20 20 20 20  (-prep)         
22f0: 20 20 20 22 22 0a 20 20 73 65 74 20 44 45 46 41     "".  set DEFA
2300: 55 4c 54 28 2d 62 6f 64 79 29 20 20 20 20 20 20  ULT(-body)      
2310: 20 20 20 20 20 20 22 22 0a 20 20 73 65 74 20 44        "".  set D
2320: 45 46 41 55 4c 54 28 2d 74 65 73 74 29 20 20 20  EFAULT(-test)   
2330: 20 20 20 20 20 20 20 20 20 22 22 0a 20 20 73 65           "".  se
2340: 74 20 44 45 46 41 55 4c 54 28 2d 69 6e 73 74 61  t DEFAULT(-insta
2350: 6c 6c 29 20 20 20 20 20 20 20 20 20 22 22 0a 20  ll)         "". 
2360: 20 73 65 74 20 44 45 46 41 55 4c 54 28 2d 75 6e   set DEFAULT(-un
2370: 69 6e 73 74 61 6c 6c 29 20 20 20 20 20 20 20 22  install)       "
2380: 22 0a 0a 20 20 61 72 72 61 79 20 73 65 74 20 4f  "..  array set O
2390: 20 5b 61 72 72 61 79 20 67 65 74 20 44 45 46 41   [array get DEFA
23a0: 55 4c 54 5d 0a 20 20 61 72 72 61 79 20 73 65 74  ULT].  array set
23b0: 20 4f 20 24 61 72 67 73 0a 20 20 66 6f 72 65 61   O $args.  forea
23c0: 63 68 20 6f 20 5b 61 72 72 61 79 20 6e 61 6d 65  ch o [array name
23d0: 73 20 4f 5d 20 7b 0a 20 20 20 20 69 66 20 7b 5b  s O] {.    if {[
23e0: 69 6e 66 6f 20 65 78 69 73 74 73 20 44 45 46 41  info exists DEFA
23f0: 55 4c 54 28 24 6f 29 5d 3d 3d 30 7d 20 7b 20 65  ULT($o)]==0} { e
2400: 72 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  rror "unknown op
2410: 74 69 6f 6e 3a 20 24 6f 22 20 7d 0a 20 20 7d 0a  tion: $o" }.  }.
2420: 0a 20 20 70 72 6f 63 20 66 61 75 6c 74 73 69 6d  .  proc faultsim
2430: 5f 74 65 73 74 5f 70 72 6f 63 20 7b 74 65 73 74  _test_proc {test
2440: 72 63 20 74 65 73 74 72 65 73 75 6c 74 20 74 65  rc testresult te
2450: 73 74 6e 66 61 69 6c 7d 20 24 4f 28 2d 74 65 73  stnfail} $O(-tes
2460: 74 29 0a 20 20 70 72 6f 63 20 66 61 75 6c 74 73  t).  proc faults
2470: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
2480: 61 72 67 73 7d 20 22 0a 20 20 20 20 75 70 6c 65  args} ".    uple
2490: 76 65 6c 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  vel faultsim_tes
24a0: 74 5f 72 65 73 75 6c 74 5f 69 6e 74 20 5c 24 61  t_result_int \$a
24b0: 72 67 73 20 5b 6c 69 73 74 20 24 4f 28 2d 69 6e  rgs [list $O(-in
24c0: 6a 65 63 74 65 72 72 6c 69 73 74 29 5d 0a 20 20  jecterrlist)].  
24d0: 22 0a 0a 20 20 65 76 61 6c 20 24 4f 28 2d 69 6e  "..  eval $O(-in
24e0: 6a 65 63 74 69 6e 73 74 61 6c 6c 29 0a 20 20 65  jectinstall).  e
24f0: 76 61 6c 20 24 4f 28 2d 69 6e 73 74 61 6c 6c 29  val $O(-install)
2500: 0a 0a 20 20 73 65 74 20 73 74 6f 70 20 30 0a 20  ..  set stop 0. 
2510: 20 66 6f 72 20 7b 73 65 74 20 69 46 61 69 6c 20   for {set iFail 
2520: 31 7d 20 7b 21 24 73 74 6f 70 7d 20 7b 69 6e 63  1} {!$stop} {inc
2530: 72 20 69 46 61 69 6c 7d 20 7b 0a 0a 20 20 20 20  r iFail} {..    
2540: 23 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 2d  # Evaluate the -
2550: 70 72 65 70 20 73 63 72 69 70 74 2e 0a 20 20 20  prep script..   
2560: 20 23 0a 20 20 20 20 65 76 61 6c 20 24 4f 28 2d   #.    eval $O(-
2570: 70 72 65 70 29 0a 0a 20 20 20 20 23 20 53 74 61  prep)..    # Sta
2580: 72 74 20 74 68 65 20 66 61 75 6c 74 2d 69 6e 6a  rt the fault-inj
2590: 65 63 74 69 6f 6e 2e 20 52 75 6e 20 74 68 65 20  ection. Run the 
25a0: 2d 62 6f 64 79 20 73 63 72 69 70 74 2e 20 53 74  -body script. St
25b0: 6f 70 20 74 68 65 20 66 61 75 6c 74 0a 20 20 20  op the fault.   
25c0: 20 23 20 69 6e 6a 65 63 74 69 6f 6e 2e 20 4c 6f   # injection. Lo
25d0: 63 61 6c 20 76 61 72 20 24 6e 66 61 69 6c 20 69  cal var $nfail i
25e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 74 6f 74  s set to the tot
25f0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 61 75  al number of fau
2600: 6c 74 73 20 0a 20 20 20 20 23 20 69 6e 6a 65 63  lts .    # injec
2610: 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 79 73  ted into the sys
2620: 74 65 6d 20 74 68 69 73 20 74 72 69 61 6c 2e 0a  tem this trial..
2630: 20 20 20 20 23 0a 20 20 20 20 65 76 61 6c 20 24      #.    eval $
2640: 4f 28 2d 69 6e 6a 65 63 74 73 74 61 72 74 29 20  O(-injectstart) 
2650: 24 69 46 61 69 6c 0a 20 20 20 20 73 65 74 20 72  $iFail.    set r
2660: 63 20 5b 63 61 74 63 68 20 24 4f 28 2d 62 6f 64  c [catch $O(-bod
2670: 79 29 20 72 65 73 5d 0a 20 20 20 20 73 65 74 20  y) res].    set 
2680: 6e 66 61 69 6c 20 5b 65 76 61 6c 20 24 4f 28 2d  nfail [eval $O(-
2690: 69 6e 6a 65 63 74 73 74 6f 70 29 5d 0a 0a 20 20  injectstop)]..  
26a0: 20 20 23 20 52 75 6e 20 74 68 65 20 2d 74 65 73    # Run the -tes
26b0: 74 20 73 63 72 69 70 74 2e 20 49 66 20 69 74 20  t script. If it 
26c0: 74 68 72 6f 77 73 20 6e 6f 20 65 72 72 6f 72 2c  throws no error,
26d0: 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74   consider this t
26e0: 72 69 61 6c 0a 20 20 20 20 23 20 73 75 63 65 73  rial.    # suces
26f0: 73 66 75 6c 2e 20 49 66 20 69 74 20 64 6f 65 73  sful. If it does
2700: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2c   throw an error,
2710: 20 63 61 75 73 65 20 61 20 5b 64 6f 5f 74 65 73   cause a [do_tes
2720: 74 5d 20 74 65 73 74 20 74 6f 0a 20 20 20 20 23  t] test to.    #
2730: 20 66 61 69 6c 20 28 61 6e 64 20 70 72 69 6e 74   fail (and print
2740: 20 6f 75 74 20 74 68 65 20 75 6e 65 78 70 65 63   out the unexpec
2750: 74 65 64 20 65 78 63 65 70 74 69 6f 6e 20 74 68  ted exception th
2760: 72 6f 77 6e 20 62 79 20 74 68 65 20 2d 74 65 73  rown by the -tes
2770: 74 0a 20 20 20 20 23 20 73 63 72 69 70 74 20 61  t.    # script a
2780: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 29  t the same time)
2790: 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20  ..    #.    set 
27a0: 72 63 20 5b 63 61 74 63 68 20 5b 6c 69 73 74 20  rc [catch [list 
27b0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 70 72  faultsim_test_pr
27c0: 6f 63 20 24 72 63 20 24 72 65 73 20 24 6e 66 61  oc $rc $res $nfa
27d0: 69 6c 5d 20 72 65 73 5d 0a 20 20 20 20 69 66 20  il] res].    if 
27e0: 7b 24 72 63 20 3d 3d 20 30 7d 20 7b 73 65 74 20  {$rc == 0} {set 
27f0: 72 65 73 20 6f 6b 7d 0a 20 20 20 20 64 6f 5f 74  res ok}.    do_t
2800: 65 73 74 20 24 74 65 73 74 6e 61 6d 65 2e 24 69  est $testname.$i
2810: 46 61 69 6c 20 5b 6c 69 73 74 20 6c 69 73 74 20  Fail [list list 
2820: 24 72 63 20 24 72 65 73 5d 20 7b 30 20 6f 6b 7d  $rc $res] {0 ok}
2830: 0a 0a 20 20 20 20 23 20 49 66 20 6e 6f 20 66 61  ..    # If no fa
2840: 75 6c 74 73 20 77 68 65 72 65 20 69 6e 6a 65 63  ults where injec
2850: 74 65 64 20 74 68 69 73 20 74 72 69 61 6c 2c 20  ted this trial, 
2860: 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 72 75 6e  don't bother run
2870: 6e 69 6e 67 0a 20 20 20 20 23 20 61 6e 79 20 6d  ning.    # any m
2880: 6f 72 65 2e 20 54 68 69 73 20 74 65 73 74 20 69  ore. This test i
2890: 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
28a0: 23 0a 20 20 20 20 69 66 20 7b 24 6e 66 61 69 6c  #.    if {$nfail
28b0: 3d 3d 30 7d 20 7b 20 73 65 74 20 73 74 6f 70 20  ==0} { set stop 
28c0: 31 20 7d 0a 20 20 7d 0a 0a 20 20 65 76 61 6c 20  1 }.  }..  eval 
28d0: 24 4f 28 2d 75 6e 69 6e 73 74 61 6c 6c 29 0a 20  $O(-uninstall). 
28e0: 20 65 76 61 6c 20 24 4f 28 2d 69 6e 6a 65 63 74   eval $O(-inject
28f0: 75 6e 69 6e 73 74 61 6c 6c 29 0a 7d 0a 0a 23 20  uninstall).}..# 
2900: 55 73 61 67 65 3a 20 64 6f 5f 6d 61 6c 6c 6f 63  Usage: do_malloc
2910: 5f 74 65 73 74 20 3c 74 65 73 74 20 6e 75 6d 62  _test <test numb
2920: 65 72 3e 20 3c 6f 70 74 69 6f 6e 73 2e 2e 2e 3e  er> <options...>
2930: 0a 23 0a 23 20 54 68 65 20 66 69 72 73 74 20 61  .#.# The first a
2940: 72 67 75 6d 65 6e 74 2c 20 3c 74 65 73 74 20 6e  rgument, <test n
2950: 75 6d 62 65 72 3e 2c 20 69 73 20 61 6e 20 69 6e  umber>, is an in
2960: 74 65 67 65 72 20 75 73 65 64 20 74 6f 20 6e 61  teger used to na
2970: 6d 65 20 74 68 65 0a 23 20 74 65 73 74 73 20 65  me the.# tests e
2980: 78 65 63 75 74 65 64 20 62 79 20 74 68 69 73 20  xecuted by this 
2990: 70 72 6f 63 2e 20 4f 70 74 69 6f 6e 73 20 61 72  proc. Options ar
29a0: 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a  e as follows:.#.
29b0: 23 20 20 20 20 20 2d 74 63 6c 70 72 65 70 20 20  #     -tclprep  
29c0: 20 20 20 20 20 20 20 20 54 43 4c 20 73 63 72 69          TCL scri
29d0: 70 74 20 74 6f 20 72 75 6e 20 74 6f 20 70 72 65  pt to run to pre
29e0: 70 61 72 65 20 74 65 73 74 2e 0a 23 20 20 20 20  pare test..#    
29f0: 20 2d 73 71 6c 70 72 65 70 20 20 20 20 20 20 20   -sqlprep       
2a00: 20 20 20 53 51 4c 20 73 63 72 69 70 74 20 74 6f     SQL script to
2a10: 20 72 75 6e 20 74 6f 20 70 72 65 70 61 72 65 20   run to prepare 
2a20: 74 65 73 74 2e 0a 23 20 20 20 20 20 2d 74 63 6c  test..#     -tcl
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 73 71 6c 62 6f 64 79 20 20  #     -sqlbody  
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 77 69 74 68 20 6d  pt to run with m
2aa0: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 73 69  alloc failure si
2ab0: 6d 75 6c 61 74 69 6f 6e 2e 0a 23 20 20 20 20 20  mulation..#     
2ac0: 2d 63 6c 65 61 6e 75 70 20 20 20 20 20 20 20 20  -cleanup        
2ad0: 20 20 54 43 4c 20 73 63 72 69 70 74 20 74 6f 20    TCL script to 
2ae0: 72 75 6e 20 61 66 74 65 72 20 74 68 65 20 74 65  run after the te
2af0: 73 74 2e 0a 23 0a 23 20 54 68 69 73 20 63 6f 6d  st..#.# This com
2b00: 6d 61 6e 64 20 72 75 6e 73 20 61 20 73 65 72 69  mand runs a seri
2b10: 65 73 20 6f 66 20 74 65 73 74 73 20 74 6f 20 76  es of tests to v
2b20: 65 72 69 66 79 20 53 51 4c 69 74 65 27 73 20 61  erify SQLite's a
2b30: 62 69 6c 69 74 79 0a 23 20 74 6f 20 68 61 6e 64  bility.# to hand
2b40: 6c 65 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  le an out-of-mem
2b50: 6f 72 79 20 63 6f 6e 64 69 74 69 6f 6e 20 67 72  ory condition gr
2b60: 61 63 65 66 75 6c 6c 79 2e 20 49 74 20 69 73 20  acefully. It is 
2b70: 61 73 73 75 6d 65 64 0a 23 20 74 68 61 74 20 69  assumed.# that i
2b80: 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  f this condition
2b90: 20 6f 63 63 75 72 73 20 61 20 6d 61 6c 6c 6f 63   occurs a malloc
2ba0: 28 29 20 63 61 6c 6c 20 77 69 6c 6c 20 72 65 74  () call will ret
2bb0: 75 72 6e 20 61 0a 23 20 4e 55 4c 4c 20 70 6f 69  urn a.# NULL poi
2bc0: 6e 74 65 72 2e 20 4c 69 6e 75 78 2c 20 66 6f 72  nter. Linux, for
2bd0: 20 65 78 61 6d 70 6c 65 2c 20 64 6f 65 73 6e 27   example, doesn'
2be0: 74 20 64 6f 20 74 68 61 74 20 62 79 20 64 65 66  t do that by def
2bf0: 61 75 6c 74 2e 20 53 65 65 0a 23 20 74 68 65 20  ault. See.# the 
2c00: 22 42 55 47 53 22 20 73 65 63 74 69 6f 6e 20 6f  "BUGS" section o
2c10: 66 20 6d 61 6c 6c 6f 63 28 33 29 2e 0a 23 0a 23  f malloc(3)..#.#
2c20: 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   Each iteration 
2c30: 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65 20 54  of a loop, the T
2c40: 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 61  CL commands in a
2c50: 6e 79 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ny argument pass
2c60: 65 64 0a 23 20 74 6f 20 74 68 65 20 2d 74 63 6c  ed.# to the -tcl
2c70: 62 6f 64 79 20 73 77 69 74 63 68 2c 20 66 6f 6c  body switch, fol
2c80: 6c 6f 77 65 64 20 62 79 20 74 68 65 20 53 51 4c  lowed by the SQL
2c90: 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 61 6e 79   commands in any
2ca0: 20 61 72 67 75 6d 65 6e 74 0a 23 20 70 61 73 73   argument.# pass
2cb0: 65 64 20 74 6f 20 74 68 65 20 2d 73 71 6c 62 6f  ed to the -sqlbo
2cc0: 64 79 20 73 77 69 74 63 68 20 61 72 65 20 65 78  dy switch are ex
2cd0: 65 63 75 74 65 64 2e 20 45 61 63 68 20 69 74 65  ecuted. Each ite
2ce0: 72 61 74 69 6f 6e 20 74 68 65 0a 23 20 4e 74 68  ration the.# Nth
2cf0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 4d   call to sqliteM
2d00: 61 6c 6c 6f 63 28 29 20 69 73 20 6d 61 64 65 20  alloc() is made 
2d10: 74 6f 20 66 61 69 6c 2c 20 77 68 65 72 65 20 4e  to fail, where N
2d20: 20 69 73 20 69 6e 63 72 65 61 73 65 64 0a 23 20   is increased.# 
2d30: 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 6c 6f  each time the lo
2d40: 6f 70 20 72 75 6e 73 20 73 74 61 72 74 69 6e 67  op runs starting
2d50: 20 66 72 6f 6d 20 31 2e 20 57 68 65 6e 20 61 6c   from 1. When al
2d60: 6c 20 63 6f 6d 6d 61 6e 64 73 20 65 78 65 63 75  l commands execu
2d70: 74 65 0a 23 20 73 75 63 63 65 73 73 66 75 6c 6c  te.# successfull
2d80: 79 2c 20 74 68 65 20 6c 6f 6f 70 20 65 6e 64 73  y, the loop ends
2d90: 2e 0a 23 0a 70 72 6f 63 20 64 6f 5f 6d 61 6c 6c  ..#.proc do_mall
2da0: 6f 63 5f 74 65 73 74 20 7b 74 6e 20 61 72 67 73  oc_test {tn args
2db0: 7d 20 7b 0a 20 20 61 72 72 61 79 20 75 6e 73 65  } {.  array unse
2dc0: 74 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 20 0a  t ::mallocopts .
2dd0: 20 20 61 72 72 61 79 20 73 65 74 20 3a 3a 6d 61    array set ::ma
2de0: 6c 6c 6f 63 6f 70 74 73 20 24 61 72 67 73 0a 0a  llocopts $args..
2df0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73    if {[string is
2e00: 20 69 6e 74 65 67 65 72 20 24 74 6e 5d 7d 20 7b   integer $tn]} {
2e10: 0a 20 20 20 20 73 65 74 20 74 6e 20 6d 61 6c 6c  .    set tn mall
2e20: 6f 63 2d 24 74 6e 0a 20 20 7d 0a 20 20 69 66 20  oc-$tn.  }.  if 
2e30: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
2e40: 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 73 74 61 72  mallocopts(-star
2e50: 74 29 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 73  t)]} {.    set s
2e60: 74 61 72 74 20 24 3a 3a 6d 61 6c 6c 6f 63 6f 70  tart $::mallocop
2e70: 74 73 28 2d 73 74 61 72 74 29 0a 20 20 7d 20 65  ts(-start).  } e
2e80: 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 73 74  lse {.    set st
2e90: 61 72 74 20 30 0a 20 20 7d 0a 20 20 69 66 20 7b  art 0.  }.  if {
2ea0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6d  [info exists ::m
2eb0: 61 6c 6c 6f 63 6f 70 74 73 28 2d 65 6e 64 29 5d  allocopts(-end)]
2ec0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 6e 64 20  } {.    set end 
2ed0: 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 65  $::mallocopts(-e
2ee0: 6e 64 29 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  nd).  } else {. 
2ef0: 20 20 20 73 65 74 20 65 6e 64 20 35 30 30 30 30     set end 50000
2f00: 0a 20 20 7d 0a 20 20 73 61 76 65 5f 70 72 6e 67  .  }.  save_prng
2f10: 5f 73 74 61 74 65 0a 0a 20 20 66 6f 72 65 61 63  _state..  foreac
2f20: 68 20 3a 3a 69 52 65 70 65 61 74 20 7b 30 20 31  h ::iRepeat {0 1
2f30: 30 30 30 30 30 30 30 7d 20 7b 0a 20 20 20 20 73  0000000} {.    s
2f40: 65 74 20 3a 3a 67 6f 20 31 0a 20 20 20 20 66 6f  et ::go 1.    fo
2f50: 72 20 7b 73 65 74 20 3a 3a 6e 20 24 73 74 61 72  r {set ::n $star
2f60: 74 7d 20 7b 24 3a 3a 67 6f 20 26 26 20 24 3a 3a  t} {$::go && $::
2f70: 6e 20 3c 3d 20 24 65 6e 64 7d 20 7b 69 6e 63 72  n <= $end} {incr
2f80: 20 3a 3a 6e 7d 20 7b 0a 0a 20 20 20 20 20 20 23   ::n} {..      #
2f90: 20 49 66 20 24 3a 3a 69 52 65 70 65 61 74 20 69   If $::iRepeat i
2fa0: 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  s 0, then the ma
2fb0: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 69  lloc() failure i
2fc0: 73 20 74 72 61 6e 73 69 65 6e 74 20 2d 20 69 74  s transient - it
2fd0: 0a 20 20 20 20 20 20 23 20 66 61 69 6c 73 20 61  .      # fails a
2fe0: 6e 64 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  nd then subseque
2ff0: 6e 74 20 63 61 6c 6c 73 20 73 75 63 63 65 65 64  nt calls succeed
3000: 2e 20 49 66 20 24 3a 3a 69 52 65 70 65 61 74 20  . If $::iRepeat 
3010: 69 73 20 31 2c 20 0a 20 20 20 20 20 20 23 20 74  is 1, .      # t
3020: 68 65 6e 20 74 68 65 20 66 61 69 6c 75 72 65 20  hen the failure 
3030: 69 73 20 70 65 72 73 69 73 74 65 6e 74 20 2d 20  is persistent - 
3040: 6f 6e 63 65 20 6d 61 6c 6c 6f 63 28 29 20 66 61  once malloc() fa
3050: 69 6c 73 20 69 74 20 6b 65 65 70 73 0a 20 20 20  ils it keeps.   
3060: 20 20 20 23 20 66 61 69 6c 69 6e 67 2e 0a 20 20     # failing..  
3070: 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74 20      #.      set 
3080: 7a 52 65 70 65 61 74 20 22 74 72 61 6e 73 69 65  zRepeat "transie
3090: 6e 74 22 0a 20 20 20 20 20 20 69 66 20 7b 24 3a  nt".      if {$:
30a0: 3a 69 52 65 70 65 61 74 7d 20 7b 73 65 74 20 7a  :iRepeat} {set z
30b0: 52 65 70 65 61 74 20 22 70 65 72 73 69 73 74 65  Repeat "persiste
30c0: 6e 74 22 7d 0a 20 20 20 20 20 20 72 65 73 74 6f  nt"}.      resto
30d0: 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 20 20  re_prng_state.  
30e0: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
30f0: 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61   [glob -nocompla
3100: 69 6e 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20  in test.db-mj*] 
3110: 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f  {file delete -fo
3120: 72 63 65 20 24 66 69 6c 65 7d 0a 0a 20 20 20 20  rce $file}..    
3130: 20 20 64 6f 5f 74 65 73 74 20 24 7b 74 6e 7d 2e    do_test ${tn}.
3140: 24 7b 7a 52 65 70 65 61 74 7d 2e 24 7b 3a 3a 6e  ${zRepeat}.${::n
3150: 7d 20 7b 0a 20 20 0a 20 20 20 20 20 20 20 20 23  } {.  .        #
3160: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74 72 61 63   Remove all trac
3170: 65 73 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  es of database f
3180: 69 6c 65 73 20 74 65 73 74 2e 64 62 20 61 6e 64  iles test.db and
3190: 20 74 65 73 74 32 2e 64 62 20 0a 20 20 20 20 20   test2.db .     
31a0: 20 20 20 23 20 66 72 6f 6d 20 74 68 65 20 66 69     # from the fi
31b0: 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 65 6e 20  le-system. Then 
31c0: 6f 70 65 6e 20 28 65 6d 70 74 79 20 64 61 74 61  open (empty data
31d0: 62 61 73 65 29 20 22 74 65 73 74 2e 64 62 22 20  base) "test.db" 
31e0: 0a 20 20 20 20 20 20 20 20 23 20 77 69 74 68 20  .        # with 
31f0: 74 68 65 20 68 61 6e 64 6c 65 20 5b 64 62 5d 2e  the handle [db].
3200: 0a 20 20 20 20 20 20 20 20 23 20 0a 20 20 20 20  .        # .    
3210: 20 20 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c      catch {db cl
3220: 6f 73 65 7d 20 0a 20 20 20 20 20 20 20 20 63 61  ose} .        ca
3230: 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 20  tch {db2 close} 
3240: 0a 20 20 20 20 20 20 20 20 66 6f 72 63 65 64 65  .        forcede
3250: 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20 20  lete test.db.   
3260: 20 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65       forcedelete
3270: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3280: 0a 20 20 20 20 20 20 20 20 66 6f 72 63 65 64 65  .        forcede
3290: 6c 65 74 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  lete test.db-wal
32a0: 0a 20 20 20 20 20 20 20 20 66 6f 72 63 65 64 65  .        forcede
32b0: 6c 65 74 65 20 74 65 73 74 32 2e 64 62 0a 20 20  lete test2.db.  
32c0: 20 20 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74        forcedelet
32d0: 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e  e test2.db-journ
32e0: 61 6c 0a 20 20 20 20 20 20 20 20 66 6f 72 63 65  al.        force
32f0: 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 2d  delete test2.db-
3300: 77 61 6c 0a 20 20 20 20 20 20 20 20 69 66 20 7b  wal.        if {
3310: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6d  [info exists ::m
3320: 61 6c 6c 6f 63 6f 70 74 73 28 2d 74 65 73 74 64  allocopts(-testd
3330: 62 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  b)]} {.         
3340: 20 66 69 6c 65 20 63 6f 70 79 20 24 3a 3a 6d 61   file copy $::ma
3350: 6c 6c 6f 63 6f 70 74 73 28 2d 74 65 73 74 64 62  llocopts(-testdb
3360: 29 20 74 65 73 74 2e 64 62 0a 20 20 20 20 20 20  ) test.db.      
3370: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63    }.        catc
3380: 68 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74  h { sqlite3 db t
3390: 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 20 20 20  est.db }.       
33a0: 20 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 6d 61   if {[info comma
33b0: 6e 64 73 20 64 62 5d 20 6e 65 20 22 22 7d 20 7b  nds db] ne ""} {
33c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
33d0: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
33e0: 6c 74 5f 63 6f 64 65 73 20 64 62 20 31 0a 20 20  lt_codes db 1.  
33f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3400: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
3410: 67 5f 6c 6f 6f 6b 61 73 69 64 65 20 64 62 20 30  g_lookaside db 0
3420: 20 30 20 30 0a 20 20 0a 20 20 20 20 20 20 20 20   0 0.  .        
3430: 23 20 45 78 65 63 75 74 65 20 61 6e 79 20 2d 74  # Execute any -t
3440: 63 6c 70 72 65 70 20 61 6e 64 20 2d 73 71 6c 70  clprep and -sqlp
3450: 72 65 70 20 73 63 72 69 70 74 73 2e 0a 20 20 20  rep scripts..   
3460: 20 20 20 20 20 23 0a 20 20 20 20 20 20 20 20 69       #.        i
3470: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3480: 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 74 63  ::mallocopts(-tc
3490: 6c 70 72 65 70 29 5d 7d 20 7b 0a 20 20 20 20 20  lprep)]} {.     
34a0: 20 20 20 20 20 65 76 61 6c 20 24 3a 3a 6d 61 6c       eval $::mal
34b0: 6c 6f 63 6f 70 74 73 28 2d 74 63 6c 70 72 65 70  locopts(-tclprep
34c0: 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ).        }.    
34d0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
34e0: 69 73 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74  ists ::mallocopt
34f0: 73 28 2d 73 71 6c 70 72 65 70 29 5d 7d 20 7b 0a  s(-sqlprep)]} {.
3500: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 73 71            execsq
3510: 6c 20 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28  l $::mallocopts(
3520: 2d 73 71 6c 70 72 65 70 29 0a 20 20 20 20 20 20  -sqlprep).      
3530: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 23    }.  .        #
3540: 20 4e 6f 77 20 73 65 74 20 74 68 65 20 24 7b 3a   Now set the ${:
3550: 3a 6e 7d 74 68 20 6d 61 6c 6c 6f 63 28 29 20 74  :n}th malloc() t
3560: 6f 20 66 61 69 6c 20 61 6e 64 20 65 78 65 63 75  o fail and execu
3570: 74 65 20 74 68 65 20 2d 74 63 6c 62 6f 64 79 20  te the -tclbody 
3580: 0a 20 20 20 20 20 20 20 20 23 20 61 6e 64 20 2d  .        # and -
3590: 73 71 6c 62 6f 64 79 20 73 63 72 69 70 74 73 2e  sqlbody scripts.
35a0: 0a 20 20 20 20 20 20 20 20 23 0a 20 20 20 20 20  .        #.     
35b0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65     sqlite3_memde
35c0: 62 75 67 5f 66 61 69 6c 20 24 3a 3a 6e 20 2d 72  bug_fail $::n -r
35d0: 65 70 65 61 74 20 24 3a 3a 69 52 65 70 65 61 74  epeat $::iRepeat
35e0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 6d  .        set ::m
35f0: 61 6c 6c 6f 63 62 6f 64 79 20 7b 7d 0a 20 20 20  allocbody {}.   
3600: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
3610: 78 69 73 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70  xists ::mallocop
3620: 74 73 28 2d 74 63 6c 62 6f 64 79 29 5d 7d 20 7b  ts(-tclbody)]} {
3630: 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
3640: 64 20 3a 3a 6d 61 6c 6c 6f 63 62 6f 64 79 20 22  d ::mallocbody "
3650: 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 74  $::mallocopts(-t
3660: 63 6c 62 6f 64 79 29 5c 6e 22 0a 20 20 20 20 20  clbody)\n".     
3670: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20     }.        if 
3680: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
3690: 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 73 71 6c 62  mallocopts(-sqlb
36a0: 6f 64 79 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20  ody)]} {.       
36b0: 20 20 20 61 70 70 65 6e 64 20 3a 3a 6d 61 6c 6c     append ::mall
36c0: 6f 63 62 6f 64 79 20 22 64 62 20 65 76 61 6c 20  ocbody "db eval 
36d0: 7b 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d  {$::mallocopts(-
36e0: 73 71 6c 62 6f 64 79 29 7d 22 0a 20 20 20 20 20  sqlbody)}".     
36f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 23 20     }..        # 
3700: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
3710: 6f 63 6b 20 73 65 74 73 20 6c 6f 63 61 6c 20 76  ock sets local v
3720: 61 72 69 61 62 6c 65 73 20 61 73 20 66 6f 6c 6c  ariables as foll
3730: 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 23 0a 20  ows:.        #. 
3740: 20 20 20 20 20 20 20 23 20 20 20 20 20 69 73 46         #     isF
3750: 61 69 6c 20 20 2d 20 54 72 75 65 20 69 66 20 61  ail  - True if a
3760: 6e 20 65 72 72 6f 72 20 28 61 6e 79 20 65 72 72  n error (any err
3770: 6f 72 29 20 77 61 73 20 72 65 70 6f 72 74 65 64  or) was reported
3780: 20 62 79 20 73 71 6c 69 74 65 2e 0a 20 20 20 20   by sqlite..    
3790: 20 20 20 20 23 20 20 20 20 20 6e 46 61 69 6c 20      #     nFail 
37a0: 20 20 2d 20 54 68 65 20 74 6f 74 61 6c 20 6e 75    - The total nu
37b0: 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 61 74 65  mber of simulate
37c0: 64 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  d malloc() failu
37d0: 72 65 73 2e 0a 20 20 20 20 20 20 20 20 23 20 20  res..        #  
37e0: 20 20 20 6e 42 65 6e 69 67 6e 20 2d 20 54 68 65     nBenign - The
37f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 65 6e 69 67   number of benig
3800: 6e 20 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c  n simulated mall
3810: 6f 63 28 29 20 66 61 69 6c 75 72 65 73 2e 0a 20  oc() failures.. 
3820: 20 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 20         #.       
3830: 20 73 65 74 20 69 73 46 61 69 6c 20 5b 63 61 74   set isFail [cat
3840: 63 68 20 24 3a 3a 6d 61 6c 6c 6f 63 62 6f 64 79  ch $::mallocbody
3850: 20 6d 73 67 5d 0a 20 20 20 20 20 20 20 20 73 65   msg].        se
3860: 74 20 6e 46 61 69 6c 20 5b 73 71 6c 69 74 65 33  t nFail [sqlite3
3870: 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 2d  _memdebug_fail -
3880: 31 20 2d 62 65 6e 69 67 6e 63 6e 74 20 6e 42 65  1 -benigncnt nBe
3890: 6e 69 67 6e 5d 0a 20 20 20 20 20 20 20 20 23 20  nign].        # 
38a0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
38b0: 22 20 28 69 73 46 61 69 6c 3d 24 69 73 46 61 69  " (isFail=$isFai
38c0: 6c 20 6e 46 61 69 6c 3d 24 6e 46 61 69 6c 20 6e  l nFail=$nFail n
38d0: 42 65 6e 69 67 6e 3d 24 6e 42 65 6e 69 67 6e 29  Benign=$nBenign)
38e0: 20 22 0a 0a 20 20 20 20 20 20 20 20 23 20 49 66   "..        # If
38f0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6d 61 6c   one or more mal
3900: 6c 6f 63 73 20 66 61 69 6c 65 64 2c 20 72 75 6e  locs failed, run
3910: 20 74 68 69 73 20 6c 6f 6f 70 20 62 6f 64 79 20   this loop body 
3920: 61 67 61 69 6e 2e 0a 20 20 20 20 20 20 20 20 23  again..        #
3930: 0a 20 20 20 20 20 20 20 20 73 65 74 20 67 6f 20  .        set go 
3940: 5b 65 78 70 72 20 7b 24 6e 46 61 69 6c 3e 30 7d  [expr {$nFail>0}
3950: 5d 0a 0a 20 20 20 20 20 20 20 20 69 66 20 7b 28  ]..        if {(
3960: 24 6e 46 61 69 6c 2d 24 6e 42 65 6e 69 67 6e 29  $nFail-$nBenign)
3970: 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ==0} {.         
3980: 20 69 66 20 7b 24 69 73 46 61 69 6c 7d 20 7b 0a   if {$isFail} {.
3990: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
39a0: 76 32 20 24 6d 73 67 0a 20 20 20 20 20 20 20 20  v2 $msg.        
39b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
39c0: 20 20 20 20 20 20 20 73 65 74 20 69 73 46 61 69         set isFai
39d0: 6c 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  l 1.            
39e0: 73 65 74 20 76 32 20 31 0a 20 20 20 20 20 20 20  set v2 1.       
39f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65     }.        } e
3a00: 6c 73 65 69 66 20 7b 21 24 69 73 46 61 69 6c 7d  lseif {!$isFail}
3a10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74   {.          set
3a20: 20 76 32 20 24 6d 73 67 0a 20 20 20 20 20 20 20   v2 $msg.       
3a30: 20 7d 20 65 6c 73 65 69 66 20 7b 0a 20 20 20 20   } elseif {.    
3a40: 20 20 20 20 20 20 5b 69 6e 66 6f 20 63 6f 6d 6d        [info comm
3a50: 61 6e 64 20 64 62 5d 3d 3d 22 22 20 7c 7c 20 0a  and db]=="" || .
3a60: 20 20 20 20 20 20 20 20 20 20 5b 64 62 20 65 72            [db er
3a70: 72 6f 72 63 6f 64 65 5d 3d 3d 37 20 7c 7c 0a 20  rorcode]==7 ||. 
3a80: 20 20 20 20 20 20 20 20 20 24 6d 73 67 3d 3d 22           $msg=="
3a90: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 0a 20  out of memory". 
3aa0: 20 20 20 20 20 20 20 7d 20 7b 0a 20 20 20 20 20         } {.     
3ab0: 20 20 20 20 20 73 65 74 20 76 32 20 31 0a 20 20       set v2 1.  
3ac0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
3ad0: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 32 20           set v2 
3ae0: 24 6d 73 67 0a 20 20 20 20 20 20 20 20 20 20 70  $msg.          p
3af0: 75 74 73 20 5b 64 62 20 65 72 72 6f 72 63 6f 64  uts [db errorcod
3b00: 65 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e].        }.   
3b10: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 69 73 46       lappend isF
3b20: 61 69 6c 20 24 76 32 0a 20 20 20 20 20 20 7d 20  ail $v2.      } 
3b30: 7b 31 20 31 7d 0a 20 20 0a 20 20 20 20 20 20 69  {1 1}.  .      i
3b40: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3b50: 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 63 6c  ::mallocopts(-cl
3b60: 65 61 6e 75 70 29 5d 7d 20 7b 0a 20 20 20 20 20  eanup)]} {.     
3b70: 20 20 20 63 61 74 63 68 20 5b 6c 69 73 74 20 75     catch [list u
3b80: 70 6c 65 76 65 6c 20 23 30 20 24 3a 3a 6d 61 6c  plevel #0 $::mal
3b90: 6c 6f 63 6f 70 74 73 28 2d 63 6c 65 61 6e 75 70  locopts(-cleanup
3ba0: 29 5d 20 6d 73 67 0a 20 20 20 20 20 20 7d 0a 20  )] msg.      }. 
3bb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 75 6e 73 65 74     }.  }.  unset
3bc0: 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 0a 20 20   ::mallocopts.  
3bd0: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67  sqlite3_memdebug
3be0: 5f 66 61 69 6c 20 2d 31 0a 7d 0a 0a 0a 23 2d 2d  _fail -1.}...#--
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 69 73 20 70  -------.# This p
3c40: 72 6f 63 20 69 73 20 75 73 65 64 20 74 6f 20 74  roc is used to t
3c50: 65 73 74 20 61 20 73 69 6e 67 6c 65 20 53 45 4c  est a single SEL
3c60: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 50  ECT statement. P
3c70: 61 72 61 6d 65 74 65 72 20 24 6e 61 6d 65 20 69  arameter $name i
3c80: 73 0a 23 20 70 61 73 73 65 64 20 61 20 6e 61 6d  s.# passed a nam
3c90: 65 20 66 6f 72 20 74 68 65 20 74 65 73 74 20 63  e for the test c
3ca0: 61 73 65 20 28 69 2e 65 2e 20 22 66 74 73 33 5f  ase (i.e. "fts3_
3cb0: 6d 61 6c 6c 6f 63 2d 31 2e 34 2e 31 22 29 20 61  malloc-1.4.1") a
3cc0: 6e 64 20 70 61 72 61 6d 65 74 65 72 0a 23 20 24  nd parameter.# $
3cd0: 73 71 6c 20 69 73 20 70 61 73 73 65 64 20 74 68  sql is passed th
3ce0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 45  e text of the SE
3cf0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
3d00: 50 61 72 61 6d 65 74 65 72 20 24 72 65 73 75 6c  Parameter $resul
3d10: 74 20 69 73 0a 23 20 73 65 74 20 74 6f 20 74 68  t is.# set to th
3d20: 65 20 65 78 70 65 63 74 65 64 20 6f 75 74 70 75  e expected outpu
3d30: 74 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  t if the SELECT 
3d40: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 75 63  statement is suc
3d50: 63 65 73 73 66 75 6c 6c 79 0a 23 20 65 78 65 63  cessfully.# exec
3d60: 75 74 65 64 20 75 73 69 6e 67 20 5b 64 62 20 65  uted using [db e
3d70: 76 61 6c 5d 2e 0a 23 0a 23 20 45 78 61 6d 70 6c  val]..#.# Exampl
3d80: 65 3a 0a 23 0a 23 20 20 20 64 6f 5f 73 65 6c 65  e:.#.#   do_sele
3d90: 63 74 5f 74 65 73 74 20 74 65 73 74 63 61 73 65  ct_test testcase
3da0: 2d 31 2e 31 20 22 53 45 4c 45 43 54 20 31 2b 31  -1.1 "SELECT 1+1
3db0: 2c 20 31 2b 32 22 20 7b 31 20 32 7d 0a 23 0a 23  , 1+2" {1 2}.#.#
3dc0: 20 49 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   If global varia
3dd0: 62 6c 65 20 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45  ble DO_MALLOC_TE
3de0: 53 54 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e  ST is set to a n
3df0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 6f  on-zero value, o
3e00: 72 20 69 66 0a 23 20 69 74 20 69 73 20 6e 6f 74  r if.# it is not
3e10: 20 64 65 66 69 6e 65 64 20 61 74 20 61 6c 6c 2c   defined at all,
3e20: 20 74 68 65 6e 20 4f 4f 4d 20 74 65 73 74 69 6e   then OOM testin
3e30: 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  g is performed o
3e40: 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 23 20 73  n the SELECT.# s
3e50: 74 61 74 65 6d 65 6e 74 2e 20 45 61 63 68 20 4f  tatement. Each O
3e60: 4f 4d 20 74 65 73 74 20 63 61 73 65 20 69 73 20  OM test case is 
3e70: 73 61 69 64 20 74 6f 20 70 61 73 73 20 69 66 20  said to pass if 
3e80: 65 69 74 68 65 72 20 28 61 29 20 65 78 65 63 75  either (a) execu
3e90: 74 69 6e 67 0a 23 20 74 68 65 20 53 45 4c 45 43  ting.# the SELEC
3ea0: 54 20 73 74 61 74 65 6d 65 6e 74 20 73 75 63 63  T statement succ
3eb0: 65 65 64 73 20 61 6e 64 20 74 68 65 20 72 65 73  eeds and the res
3ec0: 75 6c 74 73 20 6d 61 74 63 68 20 74 68 6f 73 65  ults match those
3ed0: 20 73 70 65 63 69 66 69 65 64 0a 23 20 62 79 20   specified.# by 
3ee0: 70 61 72 61 6d 65 74 65 72 20 24 72 65 73 75 6c  parameter $resul
3ef0: 74 2c 20 6f 72 20 28 62 29 20 54 43 4c 20 74 68  t, or (b) TCL th
3f00: 72 6f 77 73 20 61 6e 20 22 6f 75 74 20 6f 66 20  rows an "out of 
3f10: 6d 65 6d 6f 72 79 22 20 65 72 72 6f 72 2e 0a 23  memory" error..#
3f20: 0a 23 20 49 66 20 44 4f 5f 4d 41 4c 4c 4f 43 5f  .# If DO_MALLOC_
3f30: 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64 20  TEST is defined 
3f40: 61 6e 64 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c  and set to zero,
3f50: 20 74 68 65 6e 20 74 68 65 20 53 45 4c 45 43 54   then the SELECT
3f60: 20 73 74 61 74 65 6d 65 6e 74 0a 23 20 69 73 20   statement.# is 
3f70: 65 78 65 63 75 74 65 64 20 6a 75 73 74 20 6f 6e  executed just on
3f80: 63 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ce. In this case
3f90: 20 74 68 65 20 74 65 73 74 20 63 61 73 65 20 70   the test case p
3fa0: 61 73 73 65 73 20 69 66 20 74 68 65 20 72 65 73  asses if the res
3fb0: 75 6c 74 73 0a 23 20 6d 61 74 63 68 20 74 68 65  ults.# match the
3fc0: 20 65 78 70 65 63 74 65 64 20 72 65 73 75 6c 74   expected result
3fd0: 73 20 70 61 73 73 65 64 20 76 69 61 20 70 61 72  s passed via par
3fe0: 61 6d 65 74 65 72 20 24 72 65 73 75 6c 74 2e 0a  ameter $result..
3ff0: 23 0a 70 72 6f 63 20 64 6f 5f 73 65 6c 65 63 74  #.proc do_select
4000: 5f 74 65 73 74 20 7b 6e 61 6d 65 20 73 71 6c 20  _test {name sql 
4010: 72 65 73 75 6c 74 7d 20 7b 0a 20 20 75 70 6c 65  result} {.  uple
4020: 76 65 6c 20 5b 6c 69 73 74 20 64 6f 50 61 73 73  vel [list doPass
4030: 69 76 65 54 65 73 74 20 30 20 24 6e 61 6d 65 20  iveTest 0 $name 
4040: 24 73 71 6c 20 5b 6c 69 73 74 20 30 20 5b 6c 69  $sql [list 0 [li
4050: 73 74 20 7b 2a 7d 24 72 65 73 75 6c 74 5d 5d 5d  st {*}$result]]]
4060: 0a 7d 0a 0a 70 72 6f 63 20 64 6f 5f 72 65 73 74  .}..proc do_rest
4070: 61 72 74 5f 73 65 6c 65 63 74 5f 74 65 73 74 20  art_select_test 
4080: 7b 6e 61 6d 65 20 73 71 6c 20 72 65 73 75 6c 74  {name sql result
4090: 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c  } {.  uplevel [l
40a0: 69 73 74 20 64 6f 50 61 73 73 69 76 65 54 65 73  ist doPassiveTes
40b0: 74 20 31 20 24 6e 61 6d 65 20 24 73 71 6c 20 5b  t 1 $name $sql [
40c0: 6c 69 73 74 20 30 20 24 72 65 73 75 6c 74 5d 5d  list 0 $result]]
40d0: 0a 7d 0a 0a 70 72 6f 63 20 64 6f 5f 65 72 72 6f  .}..proc do_erro
40e0: 72 5f 74 65 73 74 20 7b 6e 61 6d 65 20 73 71 6c  r_test {name sql
40f0: 20 65 72 72 6f 72 7d 20 7b 0a 20 20 75 70 6c 65   error} {.  uple
4100: 76 65 6c 20 5b 6c 69 73 74 20 64 6f 50 61 73 73  vel [list doPass
4110: 69 76 65 54 65 73 74 20 30 20 24 6e 61 6d 65 20  iveTest 0 $name 
4120: 24 73 71 6c 20 5b 6c 69 73 74 20 31 20 24 65 72  $sql [list 1 $er
4130: 72 6f 72 5d 5d 0a 7d 0a 0a 70 72 6f 63 20 64 6f  ror]].}..proc do
4140: 50 61 73 73 69 76 65 54 65 73 74 20 7b 69 73 52  PassiveTest {isR
4150: 65 73 74 61 72 74 20 6e 61 6d 65 20 73 71 6c 20  estart name sql 
4160: 63 61 74 63 68 72 65 73 7d 20 7b 0a 20 20 69 66  catchres} {.  if
4170: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
4180: 3a 3a 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54  ::DO_MALLOC_TEST
4190: 5d 7d 20 7b 20 73 65 74 20 3a 3a 44 4f 5f 4d 41  ]} { set ::DO_MA
41a0: 4c 4c 4f 43 5f 54 45 53 54 20 31 20 7d 0a 0a 20  LLOC_TEST 1 }.. 
41b0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
41c0: 73 20 3a 3a 74 65 73 74 70 72 65 66 69 78 5d 20  s ::testprefix] 
41d0: 0a 20 20 20 26 26 20 5b 73 74 72 69 6e 67 20 69  .   && [string i
41e0: 73 20 69 6e 74 65 67 65 72 20 5b 73 74 72 69 6e  s integer [strin
41f0: 67 20 72 61 6e 67 65 20 24 6e 61 6d 65 20 30 20  g range $name 0 
4200: 30 5d 5d 0a 20 20 7d 20 7b 0a 20 20 20 20 73 65  0]].  } {.    se
4210: 74 20 6e 61 6d 65 20 24 3a 3a 74 65 73 74 70 72  t name $::testpr
4220: 65 66 69 78 2e 24 6e 61 6d 65 0a 20 20 7d 0a 0a  efix.$name.  }..
4230: 20 20 73 77 69 74 63 68 20 24 3a 3a 44 4f 5f 4d    switch $::DO_M
4240: 41 4c 4c 4f 43 5f 54 45 53 54 20 7b 0a 20 20 20  ALLOC_TEST {.   
4250: 20 30 20 7b 20 23 20 4e 6f 20 6d 61 6c 6c 6f 63   0 { # No malloc
4260: 20 66 61 69 6c 75 72 65 73 2e 0a 20 20 20 20 20   failures..     
4270: 20 64 6f 5f 74 65 73 74 20 24 6e 61 6d 65 20 5b   do_test $name [
4280: 6c 69 73 74 20 73 65 74 20 7b 7d 20 5b 75 70 6c  list set {} [upl
4290: 65 76 65 6c 20 5b 6c 69 73 74 20 63 61 74 63 68  evel [list catch
42a0: 73 71 6c 20 24 73 71 6c 5d 5d 5d 20 24 63 61 74  sql $sql]]] $cat
42b0: 63 68 72 65 73 0a 20 20 20 20 20 20 72 65 74 75  chres.      retu
42c0: 72 6e 0a 20 20 20 20 7d 0a 20 20 20 20 31 20 7b  rn.    }.    1 {
42d0: 20 23 20 53 69 6d 75 6c 61 74 65 20 74 72 61 6e   # Simulate tran
42e0: 73 69 65 6e 74 20 66 61 69 6c 75 72 65 73 2e 0a  sient failures..
42f0: 20 20 20 20 20 20 73 65 74 20 6e 52 65 70 65 61        set nRepea
4300: 74 20 31 0a 20 20 20 20 20 20 73 65 74 20 7a 4e  t 1.      set zN
4310: 61 6d 65 20 22 74 72 61 6e 73 69 65 6e 74 22 0a  ame "transient".
4320: 20 20 20 20 20 20 73 65 74 20 6e 53 74 61 72 74        set nStart
4330: 4c 69 6d 69 74 20 31 30 30 30 30 30 0a 20 20 20  Limit 100000.   
4340: 20 20 20 73 65 74 20 6e 42 61 63 6b 75 70 20 31     set nBackup 1
4350: 0a 20 20 20 20 7d 0a 20 20 20 20 32 20 7b 20 23  .    }.    2 { #
4360: 20 53 69 6d 75 6c 61 74 65 20 70 65 72 73 69 73   Simulate persis
4370: 74 65 6e 74 20 66 61 69 6c 75 72 65 73 2e 0a 20  tent failures.. 
4380: 20 20 20 20 20 73 65 74 20 6e 52 65 70 65 61 74       set nRepeat
4390: 20 31 0a 20 20 20 20 20 20 73 65 74 20 7a 4e 61   1.      set zNa
43a0: 6d 65 20 22 70 65 72 73 69 73 74 65 6e 74 22 0a  me "persistent".
43b0: 20 20 20 20 20 20 73 65 74 20 6e 53 74 61 72 74        set nStart
43c0: 4c 69 6d 69 74 20 31 30 30 30 30 30 0a 20 20 20  Limit 100000.   
43d0: 20 20 20 73 65 74 20 6e 42 61 63 6b 75 70 20 31     set nBackup 1
43e0: 0a 20 20 20 20 7d 0a 20 20 20 20 33 20 7b 20 23  .    }.    3 { #
43f0: 20 53 69 6d 75 6c 61 74 65 20 74 72 61 6e 73 69   Simulate transi
4400: 65 6e 74 20 66 61 69 6c 75 72 65 73 20 77 69 74  ent failures wit
4410: 68 20 65 78 74 72 61 20 62 72 75 74 65 20 66 6f  h extra brute fo
4420: 72 63 65 2e 0a 20 20 20 20 20 20 73 65 74 20 6e  rce..      set n
4430: 52 65 70 65 61 74 20 31 30 30 30 30 30 0a 20 20  Repeat 100000.  
4440: 20 20 20 20 73 65 74 20 7a 4e 61 6d 65 20 22 72      set zName "r
4450: 69 64 69 63 75 6c 6f 75 73 22 0a 20 20 20 20 20  idiculous".     
4460: 20 73 65 74 20 6e 53 74 61 72 74 4c 69 6d 69 74   set nStartLimit
4470: 20 31 0a 20 20 20 20 20 20 73 65 74 20 6e 42 61   1.      set nBa
4480: 63 6b 75 70 20 31 30 0a 20 20 20 20 7d 0a 20 20  ckup 10.    }.  
4490: 7d 0a 0a 20 20 23 20 54 68 65 20 73 65 74 20 6f  }..  # The set o
44a0: 66 20 61 63 63 65 70 74 61 62 6c 65 20 72 65 73  f acceptable res
44b0: 75 6c 74 73 20 66 72 6f 6d 20 72 75 6e 6e 69 6e  ults from runnin
44c0: 67 20 5b 63 61 74 63 68 73 71 6c 20 24 73 71 6c  g [catchsql $sql
44d0: 5d 2e 0a 20 20 23 0a 20 20 73 65 74 20 61 6e 73  ]..  #.  set ans
44e0: 77 65 72 73 20 5b 6c 69 73 74 20 7b 31 20 7b 6f  wers [list {1 {o
44f0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 7d 7d 20 24  ut of memory}} $
4500: 63 61 74 63 68 72 65 73 5d 0a 20 20 73 65 74 20  catchres].  set 
4510: 73 74 72 20 5b 6a 6f 69 6e 20 24 61 6e 73 77 65  str [join $answe
4520: 72 73 20 22 20 4f 52 20 22 5d 0a 0a 20 20 73 65  rs " OR "]..  se
4530: 74 20 6e 46 61 69 6c 20 31 0a 20 20 66 6f 72 20  t nFail 1.  for 
4540: 7b 73 65 74 20 69 4c 69 6d 69 74 20 24 6e 53 74  {set iLimit $nSt
4550: 61 72 74 4c 69 6d 69 74 7d 20 7b 24 6e 46 61 69  artLimit} {$nFai
4560: 6c 7d 20 7b 69 6e 63 72 20 69 4c 69 6d 69 74 7d  l} {incr iLimit}
4570: 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20   {.    for {set 
4580: 69 46 61 69 6c 20 31 7d 20 7b 24 6e 46 61 69 6c  iFail 1} {$nFail
4590: 20 26 26 20 24 69 46 61 69 6c 3c 3d 24 69 4c 69   && $iFail<=$iLi
45a0: 6d 69 74 7d 20 7b 69 6e 63 72 20 69 46 61 69 6c  mit} {incr iFail
45b0: 7d 20 7b 0a 20 20 20 20 20 20 66 6f 72 20 7b 73  } {.      for {s
45c0: 65 74 20 69 54 65 73 74 20 30 7d 20 7b 24 69 54  et iTest 0} {$iT
45d0: 65 73 74 3c 24 6e 42 61 63 6b 75 70 20 26 26 20  est<$nBackup && 
45e0: 28 24 69 46 61 69 6c 2d 24 69 54 65 73 74 29 3e  ($iFail-$iTest)>
45f0: 30 7d 20 7b 69 6e 63 72 20 69 54 65 73 74 7d 20  0} {incr iTest} 
4600: 7b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
4610: 69 73 52 65 73 74 61 72 74 7d 20 7b 20 73 71 6c  isRestart} { sql
4620: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20  ite3 db test.db 
4630: 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  }..        sqlit
4640: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c  e3_memdebug_fail
4650: 20 5b 65 78 70 72 20 24 69 46 61 69 6c 2d 24 69   [expr $iFail-$i
4660: 54 65 73 74 5d 20 2d 72 65 70 65 61 74 20 24 6e  Test] -repeat $n
4670: 52 65 70 65 61 74 0a 20 20 20 20 20 20 20 20 73  Repeat.        s
4680: 65 74 20 72 65 73 20 5b 75 70 6c 65 76 65 6c 20  et res [uplevel 
4690: 5b 6c 69 73 74 20 63 61 74 63 68 73 71 6c 20 24  [list catchsql $
46a0: 73 71 6c 5d 5d 0a 20 20 20 20 20 20 20 20 69 66  sql]].        if
46b0: 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63   {[lsearch -exac
46c0: 74 20 24 61 6e 73 77 65 72 73 20 24 72 65 73 5d  t $answers $res]
46d0: 3e 3d 30 7d 20 7b 20 73 65 74 20 72 65 73 20 24  >=0} { set res $
46e0: 73 74 72 20 7d 0a 20 20 20 20 20 20 20 20 73 65  str }.        se
46f0: 74 20 74 65 73 74 6e 61 6d 65 20 22 24 6e 61 6d  t testname "$nam
4700: 65 2e 24 7a 4e 61 6d 65 2e 24 69 46 61 69 6c 22  e.$zName.$iFail"
4710: 0a 20 20 20 20 20 20 20 20 64 6f 5f 74 65 73 74  .        do_test
4720: 20 22 24 6e 61 6d 65 2e 24 7a 4e 61 6d 65 2e 24   "$name.$zName.$
4730: 69 4c 69 6d 69 74 2e 24 69 46 61 69 6c 22 20 5b  iLimit.$iFail" [
4740: 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72 65 73  list set {} $res
4750: 5d 20 24 73 74 72 0a 0a 20 20 20 20 20 20 20 20  ] $str..        
4760: 73 65 74 20 6e 46 61 69 6c 20 5b 73 71 6c 69 74  set nFail [sqlit
4770: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c  e3_memdebug_fail
4780: 20 2d 31 20 2d 62 65 6e 69 67 6e 63 6e 74 20 6e   -1 -benigncnt n
4790: 42 65 6e 69 67 6e 5d 0a 20 20 20 20 20 20 7d 0a  Benign].      }.
47a0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 23 2d      }.  }.}...#-
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
4800: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 20 74  a single write t
4810: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
4820: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 20 20  In this case a  
4830: 22 77 72 69 74 65 22 20 69 73 20 61 20 0a 23 20  "write" is a .# 
4840: 44 45 4c 45 54 45 2c 20 55 50 44 41 54 45 20 6f  DELETE, UPDATE o
4850: 72 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  r INSERT stateme
4860: 6e 74 2e 0a 23 0a 23 20 49 66 20 4f 4f 4d 20 74  nt..#.# If OOM t
4870: 65 73 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72  esting is perfor
4880: 6d 65 64 2c 20 74 68 65 72 65 20 61 72 65 20 73  med, there are s
4890: 65 76 65 72 61 6c 20 61 63 63 65 70 74 61 62 6c  everal acceptabl
48a0: 65 20 6f 75 74 63 6f 6d 65 73 3a 0a 23 0a 23 20  e outcomes:.#.# 
48b0: 20 20 31 29 20 54 68 65 20 77 72 69 74 65 20 73    1) The write s
48c0: 75 63 63 65 65 64 73 2e 20 4e 6f 20 65 72 72 6f  ucceeds. No erro
48d0: 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 23  r is returned..#
48e0: 0a 23 20 20 20 32 29 20 41 6e 20 22 6f 75 74 20  .#   2) An "out 
48f0: 6f 66 20 6d 65 6d 6f 72 79 22 20 65 78 63 65 70  of memory" excep
4900: 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 20 61  tion is thrown a
4910: 6e 64 3a 0a 23 0a 23 20 20 20 20 20 61 29 20 54  nd:.#.#     a) T
4920: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  he statement has
4930: 20 6e 6f 20 65 66 66 65 63 74 2c 20 4f 52 0a 23   no effect, OR.#
4940: 20 20 20 20 20 62 29 20 54 68 65 20 63 75 72 72       b) The curr
4950: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
4960: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
4970: 4f 52 0a 23 20 20 20 20 20 63 29 20 54 68 65 20  OR.#     c) The 
4980: 73 74 61 74 65 6d 65 6e 74 20 73 75 63 63 65 65  statement succee
4990: 64 73 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ds. This can onl
49a0: 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
49b0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 23 20 20 20 20  connection.#    
49c0: 20 20 20 20 69 73 20 69 6e 20 61 75 74 6f 2d 63      is in auto-c
49d0: 6f 6d 6d 69 74 20 6d 6f 64 65 20 28 61 66 74 65  ommit mode (afte
49e0: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
49f0: 69 73 20 65 78 65 63 75 74 65 64 2c 20 73 6f 20  is executed, so 
4a00: 74 68 69 73 0a 23 20 20 20 20 20 20 20 20 69 6e  this.#        in
4a10: 63 6c 75 64 65 73 20 43 4f 4d 4d 49 54 20 73 74  cludes COMMIT st
4a20: 61 74 65 6d 65 6e 74 73 29 2e 0a 23 0a 23 20 49  atements)..#.# I
4a30: 66 20 74 68 65 20 77 72 69 74 65 20 6f 70 65 72  f the write oper
4a40: 61 74 69 6f 6e 20 65 76 65 6e 74 75 61 6c 6c 79  ation eventually
4a50: 20 73 75 63 63 65 65 64 73 2c 20 7a 65 72 6f 20   succeeds, zero 
4a60: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
4a70: 61 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  a.# transaction 
4a80: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
4a90: 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
4aa0: 72 6e 65 64 2e 0a 23 0a 23 20 50 61 72 61 6d 65  rned..#.# Parame
4ab0: 74 65 72 20 24 6e 61 6d 65 20 69 73 20 74 68 65  ter $name is the
4ac0: 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72   name to use for
4ad0: 20 74 68 65 20 74 65 73 74 20 63 61 73 65 20 28   the test case (
4ae0: 6f 72 20 74 65 73 74 20 63 61 73 65 73 29 2e 0a  or test cases)..
4af0: 23 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72  # The second par
4b00: 61 6d 65 74 65 72 2c 20 24 74 62 6c 2c 20 73 68  ameter, $tbl, sh
4b10: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
4b20: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
4b30: 20 74 61 62 6c 65 0a 23 20 62 65 69 6e 67 20 6d   table.# being m
4b40: 6f 64 69 66 69 65 64 2e 20 50 61 72 61 6d 65 74  odified. Paramet
4b50: 65 72 20 24 73 71 6c 20 63 6f 6e 74 61 69 6e 73  er $sql contains
4b60: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
4b70: 6e 74 20 74 6f 20 74 65 73 74 2e 0a 23 0a 70 72  nt to test..#.pr
4b80: 6f 63 20 64 6f 5f 77 72 69 74 65 5f 74 65 73 74  oc do_write_test
4b90: 20 7b 6e 61 6d 65 20 74 62 6c 20 73 71 6c 7d 20   {name tbl sql} 
4ba0: 7b 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65  {.  if {![info e
4bb0: 78 69 73 74 73 20 3a 3a 44 4f 5f 4d 41 4c 4c 4f  xists ::DO_MALLO
4bc0: 43 5f 54 45 53 54 5d 7d 20 7b 20 73 65 74 20 3a  C_TEST]} { set :
4bd0: 3a 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 20  :DO_MALLOC_TEST 
4be0: 31 20 7d 0a 0a 20 20 23 20 46 69 67 75 72 65 20  1 }..  # Figure 
4bf0: 6f 75 74 20 61 6e 20 73 74 61 74 65 6d 65 6e 74  out an statement
4c00: 20 74 6f 20 67 65 74 20 61 20 63 68 65 63 6b 73   to get a checks
4c10: 75 6d 20 66 6f 72 20 74 61 62 6c 65 20 24 74 62  um for table $tb
4c20: 6c 2e 0a 20 20 64 62 20 65 76 61 6c 20 22 53 45  l..  db eval "SE
4c30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 24 74 62 6c  LECT * FROM $tbl
4c40: 22 20 56 20 62 72 65 61 6b 0a 20 20 73 65 74 20  " V break.  set 
4c50: 63 6b 73 75 6d 73 71 6c 20 22 53 45 4c 45 43 54  cksumsql "SELECT
4c60: 20 6d 64 35 73 75 6d 28 5b 6a 6f 69 6e 20 5b 63   md5sum([join [c
4c70: 6f 6e 63 61 74 20 72 6f 77 69 64 20 24 56 28 2a  oncat rowid $V(*
4c80: 29 5d 20 2c 5d 29 20 46 52 4f 4d 20 24 74 62 6c  )] ,]) FROM $tbl
4c90: 22 0a 0a 20 20 23 20 43 61 6c 63 75 6c 61 74 65  "..  # Calculate
4ca0: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 74 61 62   the initial tab
4cb0: 6c 65 20 63 68 65 63 6b 73 75 6d 2e 0a 20 20 73  le checksum..  s
4cc0: 65 74 20 63 6b 73 75 6d 31 20 5b 64 62 20 6f 6e  et cksum1 [db on
4cd0: 65 20 24 63 6b 73 75 6d 73 71 6c 5d 0a 0a 20 20  e $cksumsql]..  
4ce0: 69 66 20 7b 24 3a 3a 44 4f 5f 4d 41 4c 4c 4f 43  if {$::DO_MALLOC
4cf0: 5f 54 45 53 54 20 7d 20 7b 0a 20 20 20 20 73 65  _TEST } {.    se
4d00: 74 20 61 6e 73 77 65 72 73 20 5b 6c 69 73 74 20  t answers [list 
4d10: 7b 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  {1 {out of memor
4d20: 79 7d 7d 20 7b 30 20 7b 7d 7d 5d 0a 20 20 20 20  y}} {0 {}}].    
4d30: 69 66 20 7b 24 3a 3a 44 4f 5f 4d 41 4c 4c 4f 43  if {$::DO_MALLOC
4d40: 5f 54 45 53 54 3d 3d 31 7d 20 7b 0a 20 20 20 20  _TEST==1} {.    
4d50: 20 20 73 65 74 20 6d 6f 64 65 73 20 7b 31 30 30    set modes {100
4d60: 30 30 30 20 70 65 72 73 69 73 74 65 6e 74 7d 0a  000 persistent}.
4d70: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
4d80: 20 20 20 73 65 74 20 6d 6f 64 65 73 20 7b 31 20     set modes {1 
4d90: 74 72 61 6e 73 69 65 6e 74 7d 0a 20 20 20 20 7d  transient}.    }
4da0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
4db0: 73 65 74 20 61 6e 73 77 65 72 73 20 5b 6c 69 73  set answers [lis
4dc0: 74 20 7b 30 20 7b 7d 7d 5d 0a 20 20 20 20 73 65  t {0 {}}].    se
4dd0: 74 20 6d 6f 64 65 73 20 5b 6c 69 73 74 20 30 20  t modes [list 0 
4de0: 6e 6f 66 61 69 6c 5d 0a 20 20 7d 0a 20 20 73 65  nofail].  }.  se
4df0: 74 20 73 74 72 20 5b 6a 6f 69 6e 20 24 61 6e 73  t str [join $ans
4e00: 77 65 72 73 20 22 20 4f 52 20 22 5d 0a 0a 20 20  wers " OR "]..  
4e10: 66 6f 72 65 61 63 68 20 7b 6e 52 65 70 65 61 74  foreach {nRepeat
4e20: 20 7a 4e 61 6d 65 7d 20 24 6d 6f 64 65 73 20 7b   zName} $modes {
4e30: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 46  .    for {set iF
4e40: 61 69 6c 20 31 7d 20 31 20 7b 69 6e 63 72 20 69  ail 1} 1 {incr i
4e50: 46 61 69 6c 7d 20 7b 0a 20 20 20 20 20 20 69 66  Fail} {.      if
4e60: 20 7b 24 3a 3a 44 4f 5f 4d 41 4c 4c 4f 43 5f 54   {$::DO_MALLOC_T
4e70: 45 53 54 7d 20 7b 73 71 6c 69 74 65 33 5f 6d 65  EST} {sqlite3_me
4e80: 6d 64 65 62 75 67 5f 66 61 69 6c 20 24 69 46 61  mdebug_fail $iFa
4e90: 69 6c 20 2d 72 65 70 65 61 74 20 24 6e 52 65 70  il -repeat $nRep
4ea0: 65 61 74 7d 0a 0a 20 20 20 20 20 20 73 65 74 20  eat}..      set 
4eb0: 72 65 73 20 5b 75 70 6c 65 76 65 6c 20 5b 6c 69  res [uplevel [li
4ec0: 73 74 20 63 61 74 63 68 73 71 6c 20 24 73 71 6c  st catchsql $sql
4ed0: 5d 5d 0a 20 20 20 20 20 20 73 65 74 20 6e 46 61  ]].      set nFa
4ee0: 69 6c 20 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 64  il [sqlite3_memd
4ef0: 65 62 75 67 5f 66 61 69 6c 20 2d 31 20 2d 62 65  ebug_fail -1 -be
4f00: 6e 69 67 6e 63 6e 74 20 6e 42 65 6e 69 67 6e 5d  nigncnt nBenign]
4f10: 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 46 61 69  .      if {$nFai
4f20: 6c 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20 20 20  l==0} {.        
4f30: 64 6f 5f 74 65 73 74 20 24 6e 61 6d 65 2e 24 7a  do_test $name.$z
4f40: 4e 61 6d 65 2e 24 69 46 61 69 6c 20 5b 6c 69 73  Name.$iFail [lis
4f50: 74 20 73 65 74 20 7b 7d 20 24 72 65 73 5d 20 7b  t set {} $res] {
4f60: 30 20 7b 7d 7d 0a 20 20 20 20 20 20 20 20 72 65  0 {}}.        re
4f70: 74 75 72 6e 0a 20 20 20 20 20 20 7d 20 65 6c 73  turn.      } els
4f80: 65 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  e {.        if {
4f90: 5b 6c 73 65 61 72 63 68 20 24 61 6e 73 77 65 72  [lsearch $answer
4fa0: 73 20 24 72 65 73 5d 3e 3d 30 7d 20 7b 0a 20 20  s $res]>=0} {.  
4fb0: 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73 20          set res 
4fc0: 24 73 74 72 0a 20 20 20 20 20 20 20 20 7d 0a 20  $str.        }. 
4fd0: 20 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 24         do_test $
4fe0: 6e 61 6d 65 2e 24 7a 4e 61 6d 65 2e 24 69 46 61  name.$zName.$iFa
4ff0: 69 6c 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20  il [list set {} 
5000: 24 72 65 73 5d 20 24 73 74 72 0a 20 20 20 20 20  $res] $str.     
5010: 20 20 20 73 65 74 20 63 6b 73 75 6d 32 20 5b 64     set cksum2 [d
5020: 62 20 6f 6e 65 20 24 63 6b 73 75 6d 73 71 6c 5d  b one $cksumsql]
5030: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 63 6b  .        if {$ck
5040: 73 75 6d 31 20 21 3d 20 24 63 6b 73 75 6d 32 7d  sum1 != $cksum2}
5050: 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 7d 0a   return.      }.
5060: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a                  }.  }.}.