/ Hex Artifact Content
Login

Artifact 58e54229c4132ef882a11fab6419ec4cd3073589:


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 73 65 74 20 46 41 55 4c 54 53 49 4d 28  ]..set FAULTSIM(
0bf0: 69 6e 74 65 72 72 75 70 74 29 20 5b 6c 69 73 74  interrupt) [list
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c10: 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 69 6e 73 74   \.  -injectinst
0c20: 61 6c 6c 20 20 20 69 6e 74 65 72 72 75 70 74 5f  all   interrupt_
0c30: 69 6e 6a 65 63 74 69 6e 73 74 61 6c 6c 20 20 20  injectinstall   
0c40: 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 73 74 61 72   \.  -injectstar
0c50: 74 20 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f  t     interrupt_
0c60: 69 6e 6a 65 63 74 73 74 61 72 74 20 20 20 20 20  injectstart     
0c70: 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 73 74 6f 70   \.  -injectstop
0c80: 20 20 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f        interrupt_
0c90: 69 6e 6a 65 63 74 73 74 6f 70 20 20 20 20 20 20  injectstop      
0ca0: 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 65 72 72 6c   \.  -injecterrl
0cb0: 69 73 74 20 20 20 7b 7b 31 20 69 6e 74 65 72 72  ist   {{1 interr
0cc0: 75 70 74 65 64 7d 20 7b 31 20 69 6e 74 65 72 72  upted} {1 interr
0cd0: 75 70 74 7d 7d 20 20 20 20 20 20 20 20 5c 0a 20  upt}}        \. 
0ce0: 20 2d 69 6e 6a 65 63 74 75 6e 69 6e 73 74 61 6c   -injectuninstal
0cf0: 6c 20 69 6e 74 65 72 72 75 70 74 5f 69 6e 6a 65  l interrupt_inje
0d00: 63 74 75 6e 69 6e 73 74 61 6c 6c 20 20 5c 0a 5d  ctuninstall  \.]
0d10: 0a 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ....#-----------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0d60: 23 20 55 73 61 67 65 20 64 6f 5f 66 61 75 6c 74  # Usage do_fault
0d70: 73 69 6d 5f 74 65 73 74 20 4e 41 4d 45 20 3f 4f  sim_test NAME ?O
0d80: 50 54 49 4f 4e 53 2e 2e 2e 3f 20 0a 23 0a 23 20  PTIONS...? .#.# 
0d90: 20 20 20 20 2d 66 61 75 6c 74 73 20 20 20 20 20      -faults     
0da0: 20 20 20 20 20 20 4c 69 73 74 20 6f 66 20 66 61        List of fa
0db0: 75 6c 74 20 74 79 70 65 73 20 74 6f 20 73 69 6d  ult types to sim
0dc0: 75 6c 61 74 65 2e 0a 23 0a 23 20 20 20 20 20 2d  ulate..#.#     -
0dd0: 70 72 65 70 20 20 20 20 20 20 20 20 20 20 20 20  prep            
0de0: 20 53 63 72 69 70 74 20 74 6f 20 65 78 65 63 75   Script to execu
0df0: 74 65 20 62 65 66 6f 72 65 20 2d 62 6f 64 79 2e  te before -body.
0e00: 0a 23 0a 23 20 20 20 20 20 2d 62 6f 64 79 20 20  .#.#     -body  
0e10: 20 20 20 20 20 20 20 20 20 20 20 53 63 72 69 70             Scrip
0e20: 74 20 74 6f 20 65 78 65 63 75 74 65 20 28 77 69  t to execute (wi
0e30: 74 68 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  th fault injecti
0e40: 6f 6e 29 2e 0a 23 0a 23 20 20 20 20 20 2d 74 65  on)..#.#     -te
0e50: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 53  st             S
0e60: 63 72 69 70 74 20 74 6f 20 65 78 65 63 75 74 65  cript to execute
0e70: 20 61 66 74 65 72 20 2d 62 6f 64 79 2e 0a 23 0a   after -body..#.
0e80: 23 20 20 20 20 20 2d 69 6e 73 74 61 6c 6c 20 20  #     -install  
0e90: 20 20 20 20 20 20 20 20 53 63 72 69 70 74 20 74          Script t
0ea0: 6f 20 65 78 65 63 75 74 65 20 61 66 74 65 72 20  o execute after 
0eb0: 66 61 75 6c 74 73 69 6d 20 2d 69 6e 6a 65 63 74  faultsim -inject
0ec0: 69 6e 73 74 61 6c 6c 0a 23 0a 23 20 20 20 20 20  install.#.#     
0ed0: 2d 75 6e 69 6e 73 74 61 6c 6c 20 20 20 20 20 20  -uninstall      
0ee0: 20 20 53 63 72 69 70 74 20 74 6f 20 65 78 65 63    Script to exec
0ef0: 75 74 65 20 61 66 74 65 72 20 66 61 75 6c 74 73  ute after faults
0f00: 69 6d 20 2d 75 6e 69 6e 6a 65 63 74 69 6e 73 74  im -uninjectinst
0f10: 61 6c 6c 0a 23 0a 70 72 6f 63 20 64 6f 5f 66 61  all.#.proc do_fa
0f20: 75 6c 74 73 69 6d 5f 74 65 73 74 20 7b 6e 61 6d  ultsim_test {nam
0f30: 65 20 61 72 67 73 7d 20 7b 0a 20 20 67 6c 6f 62  e args} {.  glob
0f40: 61 6c 20 46 41 55 4c 54 53 49 4d 0a 20 20 0a 20  al FAULTSIM.  . 
0f50: 20 66 6f 72 65 61 63 68 20 6e 20 5b 61 72 72 61   foreach n [arra
0f60: 79 20 6e 61 6d 65 73 20 46 41 55 4c 54 53 49 4d  y names FAULTSIM
0f70: 5d 20 7b 0a 20 20 20 20 69 66 20 7b 24 6e 20 21  ] {.    if {$n !
0f80: 3d 20 22 69 6e 74 65 72 72 75 70 74 22 7d 20 7b  = "interrupt"} {
0f90: 6c 61 70 70 65 6e 64 20 44 45 46 41 55 4c 54 28  lappend DEFAULT(
0fa0: 2d 66 61 75 6c 74 73 29 20 24 6e 7d 0a 20 20 7d  -faults) $n}.  }
0fb0: 0a 20 20 73 65 74 20 44 45 46 41 55 4c 54 28 2d  .  set DEFAULT(-
0fc0: 70 72 65 70 29 20 20 20 20 20 20 20 20 20 20 22  prep)          "
0fd0: 22 0a 20 20 73 65 74 20 44 45 46 41 55 4c 54 28  ".  set DEFAULT(
0fe0: 2d 62 6f 64 79 29 20 20 20 20 20 20 20 20 20 20  -body)          
0ff0: 22 22 0a 20 20 73 65 74 20 44 45 46 41 55 4c 54  "".  set DEFAULT
1000: 28 2d 74 65 73 74 29 20 20 20 20 20 20 20 20 20  (-test)         
1010: 20 22 22 0a 20 20 73 65 74 20 44 45 46 41 55 4c   "".  set DEFAUL
1020: 54 28 2d 69 6e 73 74 61 6c 6c 29 20 20 20 20 20  T(-install)     
1030: 20 20 22 22 0a 20 20 73 65 74 20 44 45 46 41 55    "".  set DEFAU
1040: 4c 54 28 2d 75 6e 69 6e 73 74 61 6c 6c 29 20 20  LT(-uninstall)  
1050: 20 20 20 22 22 0a 0a 20 20 66 69 78 5f 74 65 73     ""..  fix_tes
1060: 74 6e 61 6d 65 20 6e 61 6d 65 0a 0a 20 20 61 72  tname name..  ar
1070: 72 61 79 20 73 65 74 20 4f 20 5b 61 72 72 61 79  ray set O [array
1080: 20 67 65 74 20 44 45 46 41 55 4c 54 5d 0a 20 20   get DEFAULT].  
1090: 61 72 72 61 79 20 73 65 74 20 4f 20 24 61 72 67  array set O $arg
10a0: 73 0a 20 20 66 6f 72 65 61 63 68 20 6f 20 5b 61  s.  foreach o [a
10b0: 72 72 61 79 20 6e 61 6d 65 73 20 4f 5d 20 7b 0a  rray names O] {.
10c0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
10d0: 69 73 74 73 20 44 45 46 41 55 4c 54 28 24 6f 29  ists DEFAULT($o)
10e0: 5d 3d 3d 30 7d 20 7b 20 65 72 72 6f 72 20 22 75  ]==0} { error "u
10f0: 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 24  nknown option: $
1100: 6f 22 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20  o" }.  }..  set 
1110: 66 61 75 6c 74 6c 69 73 74 20 5b 6c 69 73 74 5d  faultlist [list]
1120: 0a 20 20 66 6f 72 65 61 63 68 20 66 20 24 4f 28  .  foreach f $O(
1130: 2d 66 61 75 6c 74 73 29 20 7b 0a 20 20 20 20 73  -faults) {.    s
1140: 65 74 20 66 6c 69 73 74 20 5b 61 72 72 61 79 20  et flist [array 
1150: 6e 61 6d 65 73 20 46 41 55 4c 54 53 49 4d 20 24  names FAULTSIM $
1160: 66 5d 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  f].    if {[llen
1170: 67 74 68 20 24 66 6c 69 73 74 5d 3d 3d 30 7d 20  gth $flist]==0} 
1180: 7b 20 65 72 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e  { error "unknown
1190: 20 66 61 75 6c 74 3a 20 24 66 22 20 7d 0a 20 20   fault: $f" }.  
11a0: 20 20 73 65 74 20 66 61 75 6c 74 6c 69 73 74 20    set faultlist 
11b0: 5b 63 6f 6e 63 61 74 20 24 66 61 75 6c 74 6c 69  [concat $faultli
11c0: 73 74 20 24 66 6c 69 73 74 5d 0a 20 20 7d 0a 0a  st $flist].  }..
11d0: 20 20 73 65 74 20 74 65 73 74 73 70 65 63 20 5b    set testspec [
11e0: 6c 69 73 74 20 2d 70 72 65 70 20 24 4f 28 2d 70  list -prep $O(-p
11f0: 72 65 70 29 20 2d 62 6f 64 79 20 24 4f 28 2d 62  rep) -body $O(-b
1200: 6f 64 79 29 20 5c 0a 20 20 20 20 20 20 2d 74 65  ody) \.      -te
1210: 73 74 20 24 4f 28 2d 74 65 73 74 29 20 2d 69 6e  st $O(-test) -in
1220: 73 74 61 6c 6c 20 24 4f 28 2d 69 6e 73 74 61 6c  stall $O(-instal
1230: 6c 29 20 2d 75 6e 69 6e 73 74 61 6c 6c 20 24 4f  l) -uninstall $O
1240: 28 2d 75 6e 69 6e 73 74 61 6c 6c 29 0a 20 20 5d  (-uninstall).  ]
1250: 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b 6c 73  .  foreach f [ls
1260: 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 66 61 75  ort -unique $fau
1270: 6c 74 6c 69 73 74 5d 20 7b 0a 20 20 20 20 65 76  ltlist] {.    ev
1280: 61 6c 20 64 6f 5f 6f 6e 65 5f 66 61 75 6c 74 73  al do_one_faults
1290: 69 6d 5f 74 65 73 74 20 22 24 6e 61 6d 65 2d 24  im_test "$name-$
12a0: 66 22 20 24 46 41 55 4c 54 53 49 4d 28 24 66 29  f" $FAULTSIM($f)
12b0: 20 24 74 65 73 74 73 70 65 63 0a 20 20 7d 0a 7d   $testspec.  }.}
12c0: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
1310: 50 72 6f 63 65 64 75 72 65 73 20 74 6f 20 73 61  Procedures to sa
1320: 76 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20 74  ve and restore t
1330: 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 2d  he current file-
1340: 73 79 73 74 65 6d 20 73 74 61 74 65 3a 0a 23 0a  system state:.#.
1350: 23 20 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  #   faultsim_sav
1360: 65 0a 23 20 20 20 66 61 75 6c 74 73 69 6d 5f 72  e.#   faultsim_r
1370: 65 73 74 6f 72 65 0a 23 20 20 20 66 61 75 6c 74  estore.#   fault
1380: 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f  sim_save_and_clo
1390: 73 65 0a 23 20 20 20 66 61 75 6c 74 73 69 6d 5f  se.#   faultsim_
13a0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
13b0: 65 6e 0a 23 20 20 20 66 61 75 6c 74 73 69 6d 5f  en.#   faultsim_
13c0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
13d0: 6e 0a 23 0a 70 72 6f 63 20 66 61 75 6c 74 73 69  n.#.proc faultsi
13e0: 6d 5f 73 61 76 65 20 7b 61 72 67 73 7d 20 7b 20  m_save {args} { 
13f0: 75 70 6c 65 76 65 6c 20 64 62 5f 73 61 76 65 20  uplevel db_save 
1400: 24 61 72 67 73 20 7d 0a 70 72 6f 63 20 66 61 75  $args }.proc fau
1410: 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63  ltsim_save_and_c
1420: 6c 6f 73 65 20 7b 61 72 67 73 7d 20 7b 20 75 70  lose {args} { up
1430: 6c 65 76 65 6c 20 64 62 5f 73 61 76 65 5f 61 6e  level db_save_an
1440: 64 5f 63 6c 6f 73 65 20 24 61 72 67 73 20 7d 0a  d_close $args }.
1450: 70 72 6f 63 20 66 61 75 6c 74 73 69 6d 5f 72 65  proc faultsim_re
1460: 73 74 6f 72 65 20 7b 61 72 67 73 7d 20 7b 20 75  store {args} { u
1470: 70 6c 65 76 65 6c 20 64 62 5f 72 65 73 74 6f 72  plevel db_restor
1480: 65 20 24 61 72 67 73 20 7d 0a 70 72 6f 63 20 66  e $args }.proc f
1490: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
14a0: 61 6e 64 5f 72 65 6f 70 65 6e 20 7b 61 72 67 73  and_reopen {args
14b0: 7d 20 7b 20 0a 20 20 75 70 6c 65 76 65 6c 20 64  } { .  uplevel d
14c0: 62 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  b_restore_and_re
14d0: 6f 70 65 6e 20 24 61 72 67 73 20 0a 20 20 73 71  open $args .  sq
14e0: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
14f0: 65 73 75 6c 74 5f 63 6f 64 65 73 20 64 62 20 31  esult_codes db 1
1500: 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  .  sqlite3_db_co
1510: 6e 66 69 67 5f 6c 6f 6f 6b 61 73 69 64 65 20 64  nfig_lookaside d
1520: 62 20 30 20 30 20 30 0a 7d 0a 70 72 6f 63 20 66  b 0 0 0.}.proc f
1530: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
1540: 6e 64 5f 72 65 6f 70 65 6e 20 7b 61 72 67 73 7d  nd_reopen {args}
1550: 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20 64 62 5f   {.  uplevel db_
1560: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
1570: 6e 20 24 61 72 67 73 20 0a 20 20 73 71 6c 69 74  n $args .  sqlit
1580: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
1590: 6c 74 5f 63 6f 64 65 73 20 64 62 20 31 0a 20 20  lt_codes db 1.  
15a0: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
15b0: 67 5f 6c 6f 6f 6b 61 73 69 64 65 20 64 62 20 30  g_lookaside db 0
15c0: 20 30 20 30 0a 7d 0a 0a 70 72 6f 63 20 66 61 75   0 0.}..proc fau
15d0: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
15e0: 63 68 65 63 6b 20 7b 7b 64 62 20 64 62 7d 7d 20  check {{db db}} 
15f0: 7b 0a 20 20 73 65 74 20 69 63 20 5b 24 64 62 20  {.  set ic [$db 
1600: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  eval { PRAGMA in
1610: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 5d  tegrity_check }]
1620: 0a 20 20 69 66 20 7b 24 69 63 20 21 3d 20 22 6f  .  if {$ic != "o
1630: 6b 22 7d 20 7b 20 65 72 72 6f 72 20 22 49 6e 74  k"} { error "Int
1640: 65 67 72 69 74 79 20 63 68 65 63 6b 3a 20 24 69  egrity check: $i
1650: 63 22 20 7d 0a 7d 0a 0a 0a 23 20 54 68 65 20 66  c" }.}...# The f
1660: 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 73 20 61  ollowing procs a
1670: 72 65 20 75 73 65 64 20 61 73 20 5b 64 6f 5f 6f  re used as [do_o
1680: 6e 65 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  ne_faultsim_test
1690: 5d 20 63 61 6c 6c 62 61 63 6b 73 20 77 68 65 6e  ] callbacks when
16a0: 20 0a 23 20 69 6e 6a 65 63 74 69 6e 67 20 4f 4f   .# injecting OO
16b0: 4d 20 66 61 75 6c 74 73 20 69 6e 74 6f 20 74 65  M faults into te
16c0: 73 74 20 63 61 73 65 73 2e 0a 23 0a 70 72 6f 63  st cases..#.proc
16d0: 20 6f 6f 6d 5f 69 6e 6a 65 63 74 73 74 61 72 74   oom_injectstart
16e0: 20 7b 6e 52 65 70 65 61 74 20 69 46 61 69 6c 7d   {nRepeat iFail}
16f0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d   {.  sqlite3_mem
1700: 64 65 62 75 67 5f 66 61 69 6c 20 5b 65 78 70 72  debug_fail [expr
1710: 20 24 69 46 61 69 6c 2d 31 5d 20 2d 72 65 70 65   $iFail-1] -repe
1720: 61 74 20 24 6e 52 65 70 65 61 74 0a 7d 0a 70 72  at $nRepeat.}.pr
1730: 6f 63 20 6f 6f 6d 5f 69 6e 6a 65 63 74 73 74 6f  oc oom_injectsto
1740: 70 20 7b 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33  p {} {.  sqlite3
1750: 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 2d  _memdebug_fail -
1760: 31 0a 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  1.}..# The follo
1770: 77 69 6e 67 20 70 72 6f 63 73 20 61 72 65 20 75  wing procs are u
1780: 73 65 64 20 61 73 20 5b 64 6f 5f 6f 6e 65 5f 66  sed as [do_one_f
1790: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5d 20 63 61  aultsim_test] ca
17a0: 6c 6c 62 61 63 6b 73 20 77 68 65 6e 20 0a 23 20  llbacks when .# 
17b0: 69 6e 6a 65 63 74 69 6e 67 20 49 4f 20 65 72 72  injecting IO err
17c0: 6f 72 20 66 61 75 6c 74 73 20 69 6e 74 6f 20 74  or faults into t
17d0: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 70 72 6f  est cases..#.pro
17e0: 63 20 69 6f 65 72 72 5f 69 6e 6a 65 63 74 73 74  c ioerr_injectst
17f0: 61 72 74 20 7b 70 65 72 73 69 73 74 20 69 46 61  art {persist iFa
1800: 69 6c 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73 71  il} {.  set ::sq
1810: 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  lite_io_error_pe
1820: 72 73 69 73 74 20 24 70 65 72 73 69 73 74 0a 20  rsist $persist. 
1830: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f   set ::sqlite_io
1840: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 24  _error_pending $
1850: 69 46 61 69 6c 0a 7d 0a 70 72 6f 63 20 69 6f 65  iFail.}.proc ioe
1860: 72 72 5f 69 6e 6a 65 63 74 73 74 6f 70 20 7b 7d  rr_injectstop {}
1870: 20 7b 0a 20 20 73 65 74 20 73 76 20 24 3a 3a 73   {.  set sv $::s
1880: 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68  qlite_io_error_h
1890: 69 74 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  it.  set ::sqlit
18a0: 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69  e_io_error_persi
18b0: 73 74 20 30 0a 20 20 73 65 74 20 3a 3a 73 71 6c  st 0.  set ::sql
18c0: 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  ite_io_error_pen
18d0: 64 69 6e 67 20 30 0a 20 20 73 65 74 20 3a 3a 73  ding 0.  set ::s
18e0: 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68  qlite_io_error_h
18f0: 61 72 64 68 69 74 20 30 0a 20 20 73 65 74 20 3a  ardhit 0.  set :
1900: 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72  :sqlite_io_error
1910: 5f 68 69 74 20 20 20 20 20 30 0a 20 20 73 65 74  _hit     0.  set
1920: 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72   ::sqlite_io_err
1930: 6f 72 5f 70 65 6e 64 69 6e 67 20 30 0a 20 20 72  or_pending 0.  r
1940: 65 74 75 72 6e 20 24 73 76 0a 7d 0a 0a 23 20 54  eturn $sv.}..# T
1950: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
1960: 63 73 20 61 72 65 20 75 73 65 64 20 61 73 20 5b  cs are used as [
1970: 64 6f 5f 6f 6e 65 5f 66 61 75 6c 74 73 69 6d 5f  do_one_faultsim_
1980: 74 65 73 74 5d 20 63 61 6c 6c 62 61 63 6b 73 20  test] callbacks 
1990: 77 68 65 6e 20 0a 23 20 69 6e 6a 65 63 74 69 6e  when .# injectin
19a0: 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
19b0: 72 65 6c 61 74 65 64 20 65 72 72 6f 72 20 66 61  related error fa
19c0: 75 6c 74 73 20 69 6e 74 6f 20 74 65 73 74 20 63  ults into test c
19d0: 61 73 65 73 2e 0a 23 0a 70 72 6f 63 20 73 68 6d  ases..#.proc shm
19e0: 65 72 72 5f 69 6e 6a 65 63 74 69 6e 73 74 61 6c  err_injectinstal
19f0: 6c 20 7b 7d 20 7b 0a 20 20 74 65 73 74 76 66 73  l {} {.  testvfs
1a00: 20 73 68 6d 66 61 75 6c 74 20 2d 64 65 66 61 75   shmfault -defau
1a10: 6c 74 20 74 72 75 65 0a 20 20 73 68 6d 66 61 75  lt true.  shmfau
1a20: 6c 74 20 66 69 6c 74 65 72 20 7b 78 53 68 6d 4f  lt filter {xShmO
1a30: 70 65 6e 20 78 53 68 6d 4d 61 70 20 78 53 68 6d  pen xShmMap xShm
1a40: 4c 6f 63 6b 7d 0a 7d 0a 70 72 6f 63 20 73 68 6d  Lock}.}.proc shm
1a50: 65 72 72 5f 69 6e 6a 65 63 74 75 6e 69 6e 73 74  err_injectuninst
1a60: 61 6c 6c 20 7b 7d 20 7b 0a 20 20 63 61 74 63 68  all {} {.  catch
1a70: 20 7b 64 62 20 20 63 6c 6f 73 65 7d 0a 20 20 63   {db  close}.  c
1a80: 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d  atch {db2 close}
1a90: 0a 20 20 73 68 6d 66 61 75 6c 74 20 64 65 6c 65  .  shmfault dele
1aa0: 74 65 0a 7d 0a 70 72 6f 63 20 73 68 6d 65 72 72  te.}.proc shmerr
1ab0: 5f 69 6e 6a 65 63 74 73 74 61 72 74 20 7b 70 65  _injectstart {pe
1ac0: 72 73 69 73 74 20 69 46 61 69 6c 7d 20 7b 0a 20  rsist iFail} {. 
1ad0: 20 73 68 6d 66 61 75 6c 74 20 69 6f 65 72 72 20   shmfault ioerr 
1ae0: 24 69 46 61 69 6c 20 24 70 65 72 73 69 73 74 0a  $iFail $persist.
1af0: 7d 0a 70 72 6f 63 20 73 68 6d 65 72 72 5f 69 6e  }.proc shmerr_in
1b00: 6a 65 63 74 73 74 6f 70 20 7b 7d 20 7b 0a 20 20  jectstop {} {.  
1b10: 73 68 6d 66 61 75 6c 74 20 69 6f 65 72 72 0a 7d  shmfault ioerr.}
1b20: 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
1b30: 67 20 70 72 6f 63 73 20 61 72 65 20 75 73 65 64  g procs are used
1b40: 20 61 73 20 5b 64 6f 5f 6f 6e 65 5f 66 61 75 6c   as [do_one_faul
1b50: 74 73 69 6d 5f 74 65 73 74 5d 20 63 61 6c 6c 62  tsim_test] callb
1b60: 61 63 6b 73 20 77 68 65 6e 20 0a 23 20 69 6e 6a  acks when .# inj
1b70: 65 63 74 69 6e 67 20 53 51 4c 49 54 45 5f 46 55  ecting SQLITE_FU
1b80: 4c 4c 20 65 72 72 6f 72 20 66 61 75 6c 74 73 20  LL error faults 
1b90: 69 6e 74 6f 20 74 65 73 74 20 63 61 73 65 73 2e  into test cases.
1ba0: 0a 23 0a 70 72 6f 63 20 66 75 6c 6c 65 72 72 5f  .#.proc fullerr_
1bb0: 69 6e 6a 65 63 74 69 6e 73 74 61 6c 6c 20 7b 7d  injectinstall {}
1bc0: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 73 68 6d   {.  testvfs shm
1bd0: 66 61 75 6c 74 20 2d 64 65 66 61 75 6c 74 20 74  fault -default t
1be0: 72 75 65 0a 7d 0a 70 72 6f 63 20 66 75 6c 6c 65  rue.}.proc fulle
1bf0: 72 72 5f 69 6e 6a 65 63 74 75 6e 69 6e 73 74 61  rr_injectuninsta
1c00: 6c 6c 20 7b 7d 20 7b 0a 20 20 63 61 74 63 68 20  ll {} {.  catch 
1c10: 7b 64 62 20 20 63 6c 6f 73 65 7d 0a 20 20 63 61  {db  close}.  ca
1c20: 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a  tch {db2 close}.
1c30: 20 20 73 68 6d 66 61 75 6c 74 20 64 65 6c 65 74    shmfault delet
1c40: 65 0a 7d 0a 70 72 6f 63 20 66 75 6c 6c 65 72 72  e.}.proc fullerr
1c50: 5f 69 6e 6a 65 63 74 73 74 61 72 74 20 7b 69 46  _injectstart {iF
1c60: 61 69 6c 7d 20 7b 0a 20 20 73 68 6d 66 61 75 6c  ail} {.  shmfaul
1c70: 74 20 66 75 6c 6c 20 24 69 46 61 69 6c 20 31 0a  t full $iFail 1.
1c80: 7d 0a 70 72 6f 63 20 66 75 6c 6c 65 72 72 5f 69  }.proc fullerr_i
1c90: 6e 6a 65 63 74 73 74 6f 70 20 7b 7d 20 7b 0a 20  njectstop {} {. 
1ca0: 20 73 68 6d 66 61 75 6c 74 20 66 75 6c 6c 0a 7d   shmfault full.}
1cb0: 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
1cc0: 67 20 70 72 6f 63 73 20 61 72 65 20 75 73 65 64  g procs are used
1cd0: 20 61 73 20 5b 64 6f 5f 6f 6e 65 5f 66 61 75 6c   as [do_one_faul
1ce0: 74 73 69 6d 5f 74 65 73 74 5d 20 63 61 6c 6c 62  tsim_test] callb
1cf0: 61 63 6b 73 20 77 68 65 6e 20 0a 23 20 69 6e 6a  acks when .# inj
1d00: 65 63 74 69 6e 67 20 53 51 4c 49 54 45 5f 43 41  ecting SQLITE_CA
1d10: 4e 54 4f 50 45 4e 20 65 72 72 6f 72 20 66 61 75  NTOPEN error fau
1d20: 6c 74 73 20 69 6e 74 6f 20 74 65 73 74 20 63 61  lts into test ca
1d30: 73 65 73 2e 0a 23 0a 70 72 6f 63 20 63 61 6e 74  ses..#.proc cant
1d40: 6f 70 65 6e 5f 69 6e 6a 65 63 74 69 6e 73 74 61  open_injectinsta
1d50: 6c 6c 20 7b 7d 20 7b 0a 20 20 74 65 73 74 76 66  ll {} {.  testvf
1d60: 73 20 73 68 6d 66 61 75 6c 74 20 2d 64 65 66 61  s shmfault -defa
1d70: 75 6c 74 20 74 72 75 65 0a 7d 0a 70 72 6f 63 20  ult true.}.proc 
1d80: 63 61 6e 74 6f 70 65 6e 5f 69 6e 6a 65 63 74 75  cantopen_injectu
1d90: 6e 69 6e 73 74 61 6c 6c 20 7b 7d 20 7b 0a 20 20  ninstall {} {.  
1da0: 63 61 74 63 68 20 7b 64 62 20 20 63 6c 6f 73 65  catch {db  close
1db0: 7d 0a 20 20 63 61 74 63 68 20 7b 64 62 32 20 63  }.  catch {db2 c
1dc0: 6c 6f 73 65 7d 0a 20 20 73 68 6d 66 61 75 6c 74  lose}.  shmfault
1dd0: 20 64 65 6c 65 74 65 0a 7d 0a 70 72 6f 63 20 63   delete.}.proc c
1de0: 61 6e 74 6f 70 65 6e 5f 69 6e 6a 65 63 74 73 74  antopen_injectst
1df0: 61 72 74 20 7b 70 65 72 73 69 73 74 20 69 46 61  art {persist iFa
1e00: 69 6c 7d 20 7b 0a 20 20 73 68 6d 66 61 75 6c 74  il} {.  shmfault
1e10: 20 63 61 6e 74 6f 70 65 6e 20 24 69 46 61 69 6c   cantopen $iFail
1e20: 20 24 70 65 72 73 69 73 74 0a 7d 0a 70 72 6f 63   $persist.}.proc
1e30: 20 63 61 6e 74 6f 70 65 6e 5f 69 6e 6a 65 63 74   cantopen_inject
1e40: 73 74 6f 70 20 7b 7d 20 7b 0a 20 20 73 68 6d 66  stop {} {.  shmf
1e50: 61 75 6c 74 20 63 61 6e 74 6f 70 65 6e 0a 7d 0a  ault cantopen.}.
1e60: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
1e70: 20 70 72 6f 63 73 20 61 72 65 20 75 73 65 64 20   procs are used 
1e80: 61 73 20 5b 64 6f 5f 6f 6e 65 5f 66 61 75 6c 74  as [do_one_fault
1e90: 73 69 6d 5f 74 65 73 74 5d 20 63 61 6c 6c 62 61  sim_test] callba
1ea0: 63 6b 73 20 0a 23 20 77 68 65 6e 20 69 6e 6a 65  cks .# when inje
1eb0: 63 74 69 6e 67 20 53 51 4c 49 54 45 5f 49 4e 54  cting SQLITE_INT
1ec0: 45 52 52 55 50 54 20 65 72 72 6f 72 20 66 61 75  ERRUPT error fau
1ed0: 6c 74 73 20 69 6e 74 6f 20 74 65 73 74 20 63 61  lts into test ca
1ee0: 73 65 73 2e 0a 23 0a 70 72 6f 63 20 69 6e 74 65  ses..#.proc inte
1ef0: 72 72 75 70 74 5f 69 6e 6a 65 63 74 69 6e 73 74  rrupt_injectinst
1f00: 61 6c 6c 20 7b 7d 20 7b 0a 7d 0a 70 72 6f 63 20  all {} {.}.proc 
1f10: 69 6e 74 65 72 72 75 70 74 5f 69 6e 6a 65 63 74  interrupt_inject
1f20: 75 6e 69 6e 73 74 61 6c 6c 20 7b 7d 20 7b 0a 7d  uninstall {} {.}
1f30: 0a 70 72 6f 63 20 69 6e 74 65 72 72 75 70 74 5f  .proc interrupt_
1f40: 69 6e 6a 65 63 74 73 74 61 72 74 20 7b 69 46 61  injectstart {iFa
1f50: 69 6c 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73 71  il} {.  set ::sq
1f60: 6c 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f 63  lite_interrupt_c
1f70: 6f 75 6e 74 20 24 69 46 61 69 6c 0a 7d 0a 70 72  ount $iFail.}.pr
1f80: 6f 63 20 69 6e 74 65 72 72 75 70 74 5f 69 6e 6a  oc interrupt_inj
1f90: 65 63 74 73 74 6f 70 20 7b 7d 20 7b 0a 20 20 73  ectstop {} {.  s
1fa0: 65 74 20 72 65 73 20 5b 65 78 70 72 20 24 3a 3a  et res [expr $::
1fb0: 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70 74  sqlite_interrupt
1fc0: 5f 63 6f 75 6e 74 3c 3d 30 5d 0a 20 20 73 65 74  _count<=0].  set
1fd0: 20 3a 3a 73 71 6c 69 74 65 5f 69 6e 74 65 72 72   ::sqlite_interr
1fe0: 75 70 74 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65  upt_count 0.  se
1ff0: 74 20 72 65 73 0a 7d 0a 0a 23 20 54 68 69 73 20  t res.}..# This 
2000: 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 63  command is not c
2010: 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 2e 20  alled directly. 
2020: 49 74 20 69 73 20 75 73 65 64 20 62 79 20 74 68  It is used by th
2030: 65 20 0a 23 20 5b 66 61 75 6c 74 73 69 6d 5f 74  e .# [faultsim_t
2040: 65 73 74 5f 72 65 73 75 6c 74 5d 20 63 6f 6d 6d  est_result] comm
2050: 61 6e 64 20 63 72 65 61 74 65 64 20 62 79 20 5b  and created by [
2060: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
2070: 5d 20 61 6e 64 20 75 73 65 64 0a 23 20 62 79 20  ] and used.# by 
2080: 2d 74 65 73 74 20 73 63 72 69 70 74 73 2e 0a 23  -test scripts..#
2090: 0a 70 72 6f 63 20 66 61 75 6c 74 73 69 6d 5f 74  .proc faultsim_t
20a0: 65 73 74 5f 72 65 73 75 6c 74 5f 69 6e 74 20 7b  est_result_int {
20b0: 61 72 67 73 7d 20 7b 0a 20 20 75 70 76 61 72 20  args} {.  upvar 
20c0: 74 65 73 74 72 63 20 74 65 73 74 72 63 20 74 65  testrc testrc te
20d0: 73 74 72 65 73 75 6c 74 20 74 65 73 74 72 65 73  stresult testres
20e0: 75 6c 74 20 74 65 73 74 6e 66 61 69 6c 20 74 65  ult testnfail te
20f0: 73 74 6e 66 61 69 6c 0a 20 20 73 65 74 20 74 20  stnfail.  set t 
2100: 5b 6c 69 73 74 20 24 74 65 73 74 72 63 20 24 74  [list $testrc $t
2110: 65 73 74 72 65 73 75 6c 74 5d 0a 20 20 73 65 74  estresult].  set
2120: 20 72 20 24 61 72 67 73 0a 20 20 69 66 20 7b 20   r $args.  if { 
2130: 28 24 74 65 73 74 6e 66 61 69 6c 3d 3d 30 20 26  ($testnfail==0 &
2140: 26 20 24 74 20 21 3d 20 5b 6c 69 6e 64 65 78 20  & $t != [lindex 
2150: 24 72 20 30 5d 29 20 7c 7c 20 5b 6c 73 65 61 72  $r 0]) || [lsear
2160: 63 68 20 24 72 20 24 74 5d 3c 30 20 7d 20 7b 0a  ch $r $t]<0 } {.
2170: 20 20 20 20 65 72 72 6f 72 20 22 6e 66 61 69 6c      error "nfail
2180: 3d 24 74 65 73 74 6e 66 61 69 6c 20 72 63 3d 24  =$testnfail rc=$
2190: 74 65 73 74 72 63 20 72 65 73 75 6c 74 3d 24 74  testrc result=$t
21a0: 65 73 74 72 65 73 75 6c 74 20 6c 69 73 74 3d 24  estresult list=$
21b0: 72 22 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  r".  }.}..#-----
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 0a 23 20 55 73 61 67 65 20 64 6f  -----.# Usage do
2210: 5f 6f 6e 65 5f 66 61 75 6c 74 73 69 6d 5f 74 65  _one_faultsim_te
2220: 73 74 20 4e 41 4d 45 20 3f 4f 50 54 49 4f 4e 53  st NAME ?OPTIONS
2230: 2e 2e 2e 3f 20 0a 23 0a 23 20 54 68 65 20 66 69  ...? .#.# The fi
2240: 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 3c 74  rst argument, <t
2250: 65 73 74 20 6e 75 6d 62 65 72 3e 2c 20 69 73 20  est number>, is 
2260: 75 73 65 64 20 61 73 20 61 20 70 72 65 66 69 78  used as a prefix
2270: 20 6f 66 20 74 68 65 20 74 65 73 74 20 6e 61 6d   of the test nam
2280: 65 73 0a 23 20 74 61 6b 65 6e 20 62 79 20 74 65  es.# taken by te
2290: 73 74 73 20 65 78 65 63 75 74 65 64 20 62 79 20  sts executed by 
22a0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 2e 20 4f 70  this command. Op
22b0: 74 69 6f 6e 73 20 61 72 65 20 61 73 20 66 6f 6c  tions are as fol
22c0: 6c 6f 77 73 2e 20 41 6c 6c 0a 23 20 6f 70 74 69  lows. All.# opti
22d0: 6f 6e 73 20 74 61 6b 65 20 61 20 73 69 6e 67 6c  ons take a singl
22e0: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 23 0a 23 20  e argument..#.# 
22f0: 20 20 20 20 2d 69 6e 6a 65 63 74 73 74 61 72 74      -injectstart
2300: 20 20 20 20 20 20 53 63 72 69 70 74 20 74 6f 20        Script to 
2310: 65 6e 61 62 6c 65 20 66 61 75 6c 74 2d 69 6e 6a  enable fault-inj
2320: 65 63 74 69 6f 6e 2e 0a 23 0a 23 20 20 20 20 20  ection..#.#     
2330: 2d 69 6e 6a 65 63 74 73 74 6f 70 20 20 20 20 20  -injectstop     
2340: 20 20 53 63 72 69 70 74 20 74 6f 20 64 69 73 61    Script to disa
2350: 62 6c 65 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74  ble fault-inject
2360: 69 6f 6e 2e 0a 23 0a 23 20 20 20 20 20 2d 69 6e  ion..#.#     -in
2370: 6a 65 63 74 65 72 72 6c 69 73 74 20 20 20 20 4c  jecterrlist    L
2380: 69 73 74 20 6f 66 20 67 65 6e 65 72 61 6c 6c 79  ist of generally
2390: 20 61 63 63 65 70 74 61 62 6c 65 20 74 65 73 74   acceptable test
23a0: 20 72 65 73 75 6c 74 73 20 28 69 2e 65 2e 20 65   results (i.e. e
23b0: 72 72 6f 72 0a 23 20 20 20 20 20 20 20 20 20 20  rror.#          
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 73               mes
23d0: 73 61 67 65 73 29 2e 20 45 78 61 6d 70 6c 65 3a  sages). Example:
23e0: 20 5b 6c 69 73 74 20 7b 31 20 7b 6f 75 74 20 6f   [list {1 {out o
23f0: 66 20 6d 65 6d 6f 72 79 7d 7d 5d 0a 23 0a 23 20  f memory}}].#.# 
2400: 20 20 20 20 2d 69 6e 6a 65 63 74 69 6e 73 74 61      -injectinsta
2410: 6c 6c 0a 23 0a 23 20 20 20 20 20 2d 69 6e 6a 65  ll.#.#     -inje
2420: 63 74 75 6e 69 6e 73 74 61 6c 6c 0a 23 0a 23 20  ctuninstall.#.# 
2430: 20 20 20 20 2d 70 72 65 70 20 20 20 20 20 20 20      -prep       
2440: 20 20 20 20 20 20 53 63 72 69 70 74 20 74 6f 20        Script to 
2450: 65 78 65 63 75 74 65 20 62 65 66 6f 72 65 20 2d  execute before -
2460: 62 6f 64 79 2e 0a 23 0a 23 20 20 20 20 20 2d 62  body..#.#     -b
2470: 6f 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ody             
2480: 53 63 72 69 70 74 20 74 6f 20 65 78 65 63 75 74  Script to execut
2490: 65 20 28 77 69 74 68 20 66 61 75 6c 74 20 69 6e  e (with fault in
24a0: 6a 65 63 74 69 6f 6e 29 2e 0a 23 0a 23 20 20 20  jection)..#.#   
24b0: 20 20 2d 74 65 73 74 20 20 20 20 20 20 20 20 20    -test         
24c0: 20 20 20 20 53 63 72 69 70 74 20 74 6f 20 65 78      Script to ex
24d0: 65 63 75 74 65 20 61 66 74 65 72 20 2d 62 6f 64  ecute after -bod
24e0: 79 2e 0a 23 0a 70 72 6f 63 20 64 6f 5f 6f 6e 65  y..#.proc do_one
24f0: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 7b  _faultsim_test {
2500: 74 65 73 74 6e 61 6d 65 20 61 72 67 73 7d 20 7b  testname args} {
2510: 0a 0a 20 20 73 65 74 20 44 45 46 41 55 4c 54 28  ..  set DEFAULT(
2520: 2d 69 6e 6a 65 63 74 73 74 61 72 74 29 20 20 20  -injectstart)   
2530: 20 20 22 65 78 70 72 22 0a 20 20 73 65 74 20 44    "expr".  set D
2540: 45 46 41 55 4c 54 28 2d 69 6e 6a 65 63 74 73 74  EFAULT(-injectst
2550: 6f 70 29 20 20 20 20 20 20 22 65 78 70 72 20 30  op)      "expr 0
2560: 22 0a 20 20 73 65 74 20 44 45 46 41 55 4c 54 28  ".  set DEFAULT(
2570: 2d 69 6e 6a 65 63 74 65 72 72 6c 69 73 74 29 20  -injecterrlist) 
2580: 20 20 5b 6c 69 73 74 5d 0a 20 20 73 65 74 20 44    [list].  set D
2590: 45 46 41 55 4c 54 28 2d 69 6e 6a 65 63 74 69 6e  EFAULT(-injectin
25a0: 73 74 61 6c 6c 29 20 20 20 22 22 0a 20 20 73 65  stall)   "".  se
25b0: 74 20 44 45 46 41 55 4c 54 28 2d 69 6e 6a 65 63  t DEFAULT(-injec
25c0: 74 75 6e 69 6e 73 74 61 6c 6c 29 20 22 22 0a 20  tuninstall) "". 
25d0: 20 73 65 74 20 44 45 46 41 55 4c 54 28 2d 70 72   set DEFAULT(-pr
25e0: 65 70 29 20 20 20 20 20 20 20 20 20 20 20 20 22  ep)            "
25f0: 22 0a 20 20 73 65 74 20 44 45 46 41 55 4c 54 28  ".  set DEFAULT(
2600: 2d 62 6f 64 79 29 20 20 20 20 20 20 20 20 20 20  -body)          
2610: 20 20 22 22 0a 20 20 73 65 74 20 44 45 46 41 55    "".  set DEFAU
2620: 4c 54 28 2d 74 65 73 74 29 20 20 20 20 20 20 20  LT(-test)       
2630: 20 20 20 20 20 22 22 0a 20 20 73 65 74 20 44 45       "".  set DE
2640: 46 41 55 4c 54 28 2d 69 6e 73 74 61 6c 6c 29 20  FAULT(-install) 
2650: 20 20 20 20 20 20 20 20 22 22 0a 20 20 73 65 74          "".  set
2660: 20 44 45 46 41 55 4c 54 28 2d 75 6e 69 6e 73 74   DEFAULT(-uninst
2670: 61 6c 6c 29 20 20 20 20 20 20 20 22 22 0a 0a 20  all)       "".. 
2680: 20 61 72 72 61 79 20 73 65 74 20 4f 20 5b 61 72   array set O [ar
2690: 72 61 79 20 67 65 74 20 44 45 46 41 55 4c 54 5d  ray get DEFAULT]
26a0: 0a 20 20 61 72 72 61 79 20 73 65 74 20 4f 20 24  .  array set O $
26b0: 61 72 67 73 0a 20 20 66 6f 72 65 61 63 68 20 6f  args.  foreach o
26c0: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 4f 5d   [array names O]
26d0: 20 7b 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f   {.    if {[info
26e0: 20 65 78 69 73 74 73 20 44 45 46 41 55 4c 54 28   exists DEFAULT(
26f0: 24 6f 29 5d 3d 3d 30 7d 20 7b 20 65 72 72 6f 72  $o)]==0} { error
2700: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
2710: 3a 20 24 6f 22 20 7d 0a 20 20 7d 0a 0a 20 20 70  : $o" }.  }..  p
2720: 72 6f 63 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  roc faultsim_tes
2730: 74 5f 70 72 6f 63 20 7b 74 65 73 74 72 63 20 74  t_proc {testrc t
2740: 65 73 74 72 65 73 75 6c 74 20 74 65 73 74 6e 66  estresult testnf
2750: 61 69 6c 7d 20 24 4f 28 2d 74 65 73 74 29 0a 20  ail} $O(-test). 
2760: 20 70 72 6f 63 20 66 61 75 6c 74 73 69 6d 5f 74   proc faultsim_t
2770: 65 73 74 5f 72 65 73 75 6c 74 20 7b 61 72 67 73  est_result {args
2780: 7d 20 22 0a 20 20 20 20 75 70 6c 65 76 65 6c 20  } ".    uplevel 
2790: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
27a0: 73 75 6c 74 5f 69 6e 74 20 5c 24 61 72 67 73 20  sult_int \$args 
27b0: 5b 6c 69 73 74 20 24 4f 28 2d 69 6e 6a 65 63 74  [list $O(-inject
27c0: 65 72 72 6c 69 73 74 29 5d 0a 20 20 22 0a 0a 20  errlist)].  ".. 
27d0: 20 65 76 61 6c 20 24 4f 28 2d 69 6e 6a 65 63 74   eval $O(-inject
27e0: 69 6e 73 74 61 6c 6c 29 0a 20 20 65 76 61 6c 20  install).  eval 
27f0: 24 4f 28 2d 69 6e 73 74 61 6c 6c 29 0a 0a 20 20  $O(-install)..  
2800: 73 65 74 20 73 74 6f 70 20 30 0a 20 20 66 6f 72  set stop 0.  for
2810: 20 7b 73 65 74 20 69 46 61 69 6c 20 31 7d 20 7b   {set iFail 1} {
2820: 21 24 73 74 6f 70 7d 20 7b 69 6e 63 72 20 69 46  !$stop} {incr iF
2830: 61 69 6c 7d 20 7b 0a 0a 20 20 20 20 23 20 45 76  ail} {..    # Ev
2840: 61 6c 75 61 74 65 20 74 68 65 20 2d 70 72 65 70  aluate the -prep
2850: 20 73 63 72 69 70 74 2e 0a 20 20 20 20 23 0a 20   script..    #. 
2860: 20 20 20 65 76 61 6c 20 24 4f 28 2d 70 72 65 70     eval $O(-prep
2870: 29 0a 0a 20 20 20 20 23 20 53 74 61 72 74 20 74  )..    # Start t
2880: 68 65 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69  he fault-injecti
2890: 6f 6e 2e 20 52 75 6e 20 74 68 65 20 2d 62 6f 64  on. Run the -bod
28a0: 79 20 73 63 72 69 70 74 2e 20 53 74 6f 70 20 74  y script. Stop t
28b0: 68 65 20 66 61 75 6c 74 0a 20 20 20 20 23 20 69  he fault.    # i
28c0: 6e 6a 65 63 74 69 6f 6e 2e 20 4c 6f 63 61 6c 20  njection. Local 
28d0: 76 61 72 20 24 6e 66 61 69 6c 20 69 73 20 73 65  var $nfail is se
28e0: 74 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  t to the total n
28f0: 75 6d 62 65 72 20 6f 66 20 66 61 75 6c 74 73 20  umber of faults 
2900: 0a 20 20 20 20 23 20 69 6e 6a 65 63 74 65 64 20  .    # injected 
2910: 69 6e 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  into the system 
2920: 74 68 69 73 20 74 72 69 61 6c 2e 0a 20 20 20 20  this trial..    
2930: 23 0a 20 20 20 20 65 76 61 6c 20 24 4f 28 2d 69  #.    eval $O(-i
2940: 6e 6a 65 63 74 73 74 61 72 74 29 20 24 69 46 61  njectstart) $iFa
2950: 69 6c 0a 20 20 20 20 73 65 74 20 72 63 20 5b 63  il.    set rc [c
2960: 61 74 63 68 20 24 4f 28 2d 62 6f 64 79 29 20 72  atch $O(-body) r
2970: 65 73 5d 0a 20 20 20 20 73 65 74 20 6e 66 61 69  es].    set nfai
2980: 6c 20 5b 65 76 61 6c 20 24 4f 28 2d 69 6e 6a 65  l [eval $O(-inje
2990: 63 74 73 74 6f 70 29 5d 0a 0a 20 20 20 20 23 20  ctstop)]..    # 
29a0: 52 75 6e 20 74 68 65 20 2d 74 65 73 74 20 73 63  Run the -test sc
29b0: 72 69 70 74 2e 20 49 66 20 69 74 20 74 68 72 6f  ript. If it thro
29c0: 77 73 20 6e 6f 20 65 72 72 6f 72 2c 20 63 6f 6e  ws no error, con
29d0: 73 69 64 65 72 20 74 68 69 73 20 74 72 69 61 6c  sider this trial
29e0: 0a 20 20 20 20 23 20 73 75 63 65 73 73 66 75 6c  .    # sucessful
29f0: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 74 68 72  . If it does thr
2a00: 6f 77 20 61 6e 20 65 72 72 6f 72 2c 20 63 61 75  ow an error, cau
2a10: 73 65 20 61 20 5b 64 6f 5f 74 65 73 74 5d 20 74  se a [do_test] t
2a20: 65 73 74 20 74 6f 0a 20 20 20 20 23 20 66 61 69  est to.    # fai
2a30: 6c 20 28 61 6e 64 20 70 72 69 6e 74 20 6f 75 74  l (and print out
2a40: 20 74 68 65 20 75 6e 65 78 70 65 63 74 65 64 20   the unexpected 
2a50: 65 78 63 65 70 74 69 6f 6e 20 74 68 72 6f 77 6e  exception thrown
2a60: 20 62 79 20 74 68 65 20 2d 74 65 73 74 0a 20 20   by the -test.  
2a70: 20 20 23 20 73 63 72 69 70 74 20 61 74 20 74 68    # script at th
2a80: 65 20 73 61 6d 65 20 74 69 6d 65 29 2e 0a 20 20  e same time)..  
2a90: 20 20 23 0a 20 20 20 20 73 65 74 20 72 63 20 5b    #.    set rc [
2aa0: 63 61 74 63 68 20 5b 6c 69 73 74 20 66 61 75 6c  catch [list faul
2ab0: 74 73 69 6d 5f 74 65 73 74 5f 70 72 6f 63 20 24  tsim_test_proc $
2ac0: 72 63 20 24 72 65 73 20 24 6e 66 61 69 6c 5d 20  rc $res $nfail] 
2ad0: 72 65 73 5d 0a 20 20 20 20 69 66 20 7b 24 72 63  res].    if {$rc
2ae0: 20 3d 3d 20 30 7d 20 7b 73 65 74 20 72 65 73 20   == 0} {set res 
2af0: 6f 6b 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  ok}.    do_test 
2b00: 24 74 65 73 74 6e 61 6d 65 2e 24 69 46 61 69 6c  $testname.$iFail
2b10: 20 5b 6c 69 73 74 20 6c 69 73 74 20 24 72 63 20   [list list $rc 
2b20: 24 72 65 73 5d 20 7b 30 20 6f 6b 7d 0a 0a 20 20  $res] {0 ok}..  
2b30: 20 20 23 20 49 66 20 6e 6f 20 66 61 75 6c 74 73    # If no faults
2b40: 20 77 68 65 72 65 20 69 6e 6a 65 63 74 65 64 20   where injected 
2b50: 74 68 69 73 20 74 72 69 61 6c 2c 20 64 6f 6e 27  this trial, don'
2b60: 74 20 62 6f 74 68 65 72 20 72 75 6e 6e 69 6e 67  t bother running
2b70: 0a 20 20 20 20 23 20 61 6e 79 20 6d 6f 72 65 2e  .    # any more.
2b80: 20 54 68 69 73 20 74 65 73 74 20 69 73 20 66 69   This test is fi
2b90: 6e 69 73 68 65 64 2e 0a 20 20 20 20 23 0a 20 20  nished..    #.  
2ba0: 20 20 69 66 20 7b 24 6e 66 61 69 6c 3d 3d 30 7d    if {$nfail==0}
2bb0: 20 7b 20 73 65 74 20 73 74 6f 70 20 31 20 7d 0a   { set stop 1 }.
2bc0: 20 20 7d 0a 0a 20 20 65 76 61 6c 20 24 4f 28 2d    }..  eval $O(-
2bd0: 75 6e 69 6e 73 74 61 6c 6c 29 0a 20 20 65 76 61  uninstall).  eva
2be0: 6c 20 24 4f 28 2d 69 6e 6a 65 63 74 75 6e 69 6e  l $O(-injectunin
2bf0: 73 74 61 6c 6c 29 0a 7d 0a 0a 23 20 55 73 61 67  stall).}..# Usag
2c00: 65 3a 20 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73  e: do_malloc_tes
2c10: 74 20 3c 74 65 73 74 20 6e 75 6d 62 65 72 3e 20  t <test number> 
2c20: 3c 6f 70 74 69 6f 6e 73 2e 2e 2e 3e 0a 23 0a 23  <options...>.#.#
2c30: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
2c40: 65 6e 74 2c 20 3c 74 65 73 74 20 6e 75 6d 62 65  ent, <test numbe
2c50: 72 3e 2c 20 69 73 20 61 6e 20 69 6e 74 65 67 65  r>, is an intege
2c60: 72 20 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74  r used to name t
2c70: 68 65 0a 23 20 74 65 73 74 73 20 65 78 65 63 75  he.# tests execu
2c80: 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63  ted by this proc
2c90: 2e 20 4f 70 74 69 6f 6e 73 20 61 72 65 20 61 73  . Options are as
2ca0: 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20   follows:.#.#   
2cb0: 20 20 2d 74 63 6c 70 72 65 70 20 20 20 20 20 20    -tclprep      
2cc0: 20 20 20 20 54 43 4c 20 73 63 72 69 70 74 20 74      TCL script t
2cd0: 6f 20 72 75 6e 20 74 6f 20 70 72 65 70 61 72 65  o run to prepare
2ce0: 20 74 65 73 74 2e 0a 23 20 20 20 20 20 2d 73 71   test..#     -sq
2cf0: 6c 70 72 65 70 20 20 20 20 20 20 20 20 20 20 53  lprep          S
2d00: 51 4c 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e  QL script to run
2d10: 20 74 6f 20 70 72 65 70 61 72 65 20 74 65 73 74   to prepare test
2d20: 2e 0a 23 20 20 20 20 20 2d 74 63 6c 62 6f 64 79  ..#     -tclbody
2d30: 20 20 20 20 20 20 20 20 20 20 54 43 4c 20 73 63            TCL sc
2d40: 72 69 70 74 20 74 6f 20 72 75 6e 20 77 69 74 68  ript to run with
2d50: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2d60: 73 69 6d 75 6c 61 74 69 6f 6e 2e 0a 23 20 20 20  simulation..#   
2d70: 20 20 2d 73 71 6c 62 6f 64 79 20 20 20 20 20 20    -sqlbody      
2d80: 20 20 20 20 54 43 4c 20 73 63 72 69 70 74 20 74      TCL script t
2d90: 6f 20 72 75 6e 20 77 69 74 68 20 6d 61 6c 6c 6f  o run with mallo
2da0: 63 20 66 61 69 6c 75 72 65 20 73 69 6d 75 6c 61  c failure simula
2db0: 74 69 6f 6e 2e 0a 23 20 20 20 20 20 2d 63 6c 65  tion..#     -cle
2dc0: 61 6e 75 70 20 20 20 20 20 20 20 20 20 20 54 43  anup          TC
2dd0: 4c 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20  L script to run 
2de0: 61 66 74 65 72 20 74 68 65 20 74 65 73 74 2e 0a  after the test..
2df0: 23 0a 23 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  #.# This command
2e00: 20 72 75 6e 73 20 61 20 73 65 72 69 65 73 20 6f   runs a series o
2e10: 66 20 74 65 73 74 73 20 74 6f 20 76 65 72 69 66  f tests to verif
2e20: 79 20 53 51 4c 69 74 65 27 73 20 61 62 69 6c 69  y SQLite's abili
2e30: 74 79 0a 23 20 74 6f 20 68 61 6e 64 6c 65 20 61  ty.# to handle a
2e40: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
2e50: 63 6f 6e 64 69 74 69 6f 6e 20 67 72 61 63 65 66  condition gracef
2e60: 75 6c 6c 79 2e 20 49 74 20 69 73 20 61 73 73 75  ully. It is assu
2e70: 6d 65 64 0a 23 20 74 68 61 74 20 69 66 20 74 68  med.# that if th
2e80: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63  is condition occ
2e90: 75 72 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 63  urs a malloc() c
2ea0: 61 6c 6c 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  all will return 
2eb0: 61 0a 23 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  a.# NULL pointer
2ec0: 2e 20 4c 69 6e 75 78 2c 20 66 6f 72 20 65 78 61  . Linux, for exa
2ed0: 6d 70 6c 65 2c 20 64 6f 65 73 6e 27 74 20 64 6f  mple, doesn't do
2ee0: 20 74 68 61 74 20 62 79 20 64 65 66 61 75 6c 74   that by default
2ef0: 2e 20 53 65 65 0a 23 20 74 68 65 20 22 42 55 47  . See.# the "BUG
2f00: 53 22 20 73 65 63 74 69 6f 6e 20 6f 66 20 6d 61  S" section of ma
2f10: 6c 6c 6f 63 28 33 29 2e 0a 23 0a 23 20 45 61 63  lloc(3)..#.# Eac
2f20: 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 61  h iteration of a
2f30: 20 6c 6f 6f 70 2c 20 74 68 65 20 54 43 4c 20 63   loop, the TCL c
2f40: 6f 6d 6d 61 6e 64 73 20 69 6e 20 61 6e 79 20 61  ommands in any a
2f50: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 0a 23  rgument passed.#
2f60: 20 74 6f 20 74 68 65 20 2d 74 63 6c 62 6f 64 79   to the -tclbody
2f70: 20 73 77 69 74 63 68 2c 20 66 6f 6c 6c 6f 77 65   switch, followe
2f80: 64 20 62 79 20 74 68 65 20 53 51 4c 20 63 6f 6d  d by the SQL com
2f90: 6d 61 6e 64 73 20 69 6e 20 61 6e 79 20 61 72 67  mands in any arg
2fa0: 75 6d 65 6e 74 0a 23 20 70 61 73 73 65 64 20 74  ument.# passed t
2fb0: 6f 20 74 68 65 20 2d 73 71 6c 62 6f 64 79 20 73  o the -sqlbody s
2fc0: 77 69 74 63 68 20 61 72 65 20 65 78 65 63 75 74  witch are execut
2fd0: 65 64 2e 20 45 61 63 68 20 69 74 65 72 61 74 69  ed. Each iterati
2fe0: 6f 6e 20 74 68 65 0a 23 20 4e 74 68 20 63 61 6c  on the.# Nth cal
2ff0: 6c 20 74 6f 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  l to sqliteMallo
3000: 63 28 29 20 69 73 20 6d 61 64 65 20 74 6f 20 66  c() is made to f
3010: 61 69 6c 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ail, where N is 
3020: 69 6e 63 72 65 61 73 65 64 0a 23 20 65 61 63 68  increased.# each
3030: 20 74 69 6d 65 20 74 68 65 20 6c 6f 6f 70 20 72   time the loop r
3040: 75 6e 73 20 73 74 61 72 74 69 6e 67 20 66 72 6f  uns starting fro
3050: 6d 20 31 2e 20 57 68 65 6e 20 61 6c 6c 20 63 6f  m 1. When all co
3060: 6d 6d 61 6e 64 73 20 65 78 65 63 75 74 65 0a 23  mmands execute.#
3070: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 74   successfully, t
3080: 68 65 20 6c 6f 6f 70 20 65 6e 64 73 2e 0a 23 0a  he loop ends..#.
3090: 70 72 6f 63 20 64 6f 5f 6d 61 6c 6c 6f 63 5f 74  proc do_malloc_t
30a0: 65 73 74 20 7b 74 6e 20 61 72 67 73 7d 20 7b 0a  est {tn args} {.
30b0: 20 20 61 72 72 61 79 20 75 6e 73 65 74 20 3a 3a    array unset ::
30c0: 6d 61 6c 6c 6f 63 6f 70 74 73 20 0a 20 20 61 72  mallocopts .  ar
30d0: 72 61 79 20 73 65 74 20 3a 3a 6d 61 6c 6c 6f 63  ray set ::malloc
30e0: 6f 70 74 73 20 24 61 72 67 73 0a 0a 20 20 69 66  opts $args..  if
30f0: 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74   {[string is int
3100: 65 67 65 72 20 24 74 6e 5d 7d 20 7b 0a 20 20 20  eger $tn]} {.   
3110: 20 73 65 74 20 74 6e 20 6d 61 6c 6c 6f 63 2d 24   set tn malloc-$
3120: 74 6e 0a 20 20 7d 0a 20 20 69 66 20 7b 5b 69 6e  tn.  }.  if {[in
3130: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6d 61 6c 6c  fo exists ::mall
3140: 6f 63 6f 70 74 73 28 2d 73 74 61 72 74 29 5d 7d  ocopts(-start)]}
3150: 20 7b 0a 20 20 20 20 73 65 74 20 73 74 61 72 74   {.    set start
3160: 20 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d   $::mallocopts(-
3170: 73 74 61 72 74 29 0a 20 20 7d 20 65 6c 73 65 20  start).  } else 
3180: 7b 0a 20 20 20 20 73 65 74 20 73 74 61 72 74 20  {.    set start 
3190: 30 0a 20 20 7d 0a 20 20 69 66 20 7b 5b 69 6e 66  0.  }.  if {[inf
31a0: 6f 20 65 78 69 73 74 73 20 3a 3a 6d 61 6c 6c 6f  o exists ::mallo
31b0: 63 6f 70 74 73 28 2d 65 6e 64 29 5d 7d 20 7b 0a  copts(-end)]} {.
31c0: 20 20 20 20 73 65 74 20 65 6e 64 20 24 3a 3a 6d      set end $::m
31d0: 61 6c 6c 6f 63 6f 70 74 73 28 2d 65 6e 64 29 0a  allocopts(-end).
31e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
31f0: 65 74 20 65 6e 64 20 35 30 30 30 30 0a 20 20 7d  et end 50000.  }
3200: 0a 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61  .  save_prng_sta
3210: 74 65 0a 0a 20 20 66 6f 72 65 61 63 68 20 3a 3a  te..  foreach ::
3220: 69 52 65 70 65 61 74 20 7b 30 20 31 30 30 30 30  iRepeat {0 10000
3230: 30 30 30 7d 20 7b 0a 20 20 20 20 73 65 74 20 3a  000} {.    set :
3240: 3a 67 6f 20 31 0a 20 20 20 20 66 6f 72 20 7b 73  :go 1.    for {s
3250: 65 74 20 3a 3a 6e 20 24 73 74 61 72 74 7d 20 7b  et ::n $start} {
3260: 24 3a 3a 67 6f 20 26 26 20 24 3a 3a 6e 20 3c 3d  $::go && $::n <=
3270: 20 24 65 6e 64 7d 20 7b 69 6e 63 72 20 3a 3a 6e   $end} {incr ::n
3280: 7d 20 7b 0a 0a 20 20 20 20 20 20 23 20 49 66 20  } {..      # If 
3290: 24 3a 3a 69 52 65 70 65 61 74 20 69 73 20 30 2c  $::iRepeat is 0,
32a0: 20 74 68 65 6e 20 74 68 65 20 6d 61 6c 6c 6f 63   then the malloc
32b0: 28 29 20 66 61 69 6c 75 72 65 20 69 73 20 74 72  () failure is tr
32c0: 61 6e 73 69 65 6e 74 20 2d 20 69 74 0a 20 20 20  ansient - it.   
32d0: 20 20 20 23 20 66 61 69 6c 73 20 61 6e 64 20 74     # fails and t
32e0: 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63  hen subsequent c
32f0: 61 6c 6c 73 20 73 75 63 63 65 65 64 2e 20 49 66  alls succeed. If
3300: 20 24 3a 3a 69 52 65 70 65 61 74 20 69 73 20 31   $::iRepeat is 1
3310: 2c 20 0a 20 20 20 20 20 20 23 20 74 68 65 6e 20  , .      # then 
3320: 74 68 65 20 66 61 69 6c 75 72 65 20 69 73 20 70  the failure is p
3330: 65 72 73 69 73 74 65 6e 74 20 2d 20 6f 6e 63 65  ersistent - once
3340: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20   malloc() fails 
3350: 69 74 20 6b 65 65 70 73 0a 20 20 20 20 20 20 23  it keeps.      #
3360: 20 66 61 69 6c 69 6e 67 2e 0a 20 20 20 20 20 20   failing..      
3370: 23 0a 20 20 20 20 20 20 73 65 74 20 7a 52 65 70  #.      set zRep
3380: 65 61 74 20 22 74 72 61 6e 73 69 65 6e 74 22 0a  eat "transient".
3390: 20 20 20 20 20 20 69 66 20 7b 24 3a 3a 69 52 65        if {$::iRe
33a0: 70 65 61 74 7d 20 7b 73 65 74 20 7a 52 65 70 65  peat} {set zRepe
33b0: 61 74 20 22 70 65 72 73 69 73 74 65 6e 74 22 7d  at "persistent"}
33c0: 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 70  .      restore_p
33d0: 72 6e 67 5f 73 74 61 74 65 0a 20 20 20 20 20 20  rng_state.      
33e0: 66 6f 72 65 61 63 68 20 66 69 6c 65 20 5b 67 6c  foreach file [gl
33f0: 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74  ob -nocomplain t
3400: 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 66 6f 72  est.db-mj*] {for
3410: 63 65 64 65 6c 65 74 65 20 24 66 69 6c 65 7d 0a  cedelete $file}.
3420: 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 24  .      do_test $
3430: 7b 74 6e 7d 2e 24 7b 7a 52 65 70 65 61 74 7d 2e  {tn}.${zRepeat}.
3440: 24 7b 3a 3a 6e 7d 20 7b 0a 20 20 0a 20 20 20 20  ${::n} {.  .    
3450: 20 20 20 20 23 20 52 65 6d 6f 76 65 20 61 6c 6c      # Remove all
3460: 20 74 72 61 63 65 73 20 6f 66 20 64 61 74 61 62   traces of datab
3470: 61 73 65 20 66 69 6c 65 73 20 74 65 73 74 2e 64  ase files test.d
3480: 62 20 61 6e 64 20 74 65 73 74 32 2e 64 62 20 0a  b and test2.db .
3490: 20 20 20 20 20 20 20 20 23 20 66 72 6f 6d 20 74          # from t
34a0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
34b0: 54 68 65 6e 20 6f 70 65 6e 20 28 65 6d 70 74 79  Then open (empty
34c0: 20 64 61 74 61 62 61 73 65 29 20 22 74 65 73 74   database) "test
34d0: 2e 64 62 22 20 0a 20 20 20 20 20 20 20 20 23 20  .db" .        # 
34e0: 77 69 74 68 20 74 68 65 20 68 61 6e 64 6c 65 20  with the handle 
34f0: 5b 64 62 5d 2e 0a 20 20 20 20 20 20 20 20 23 20  [db]..        # 
3500: 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
3510: 64 62 20 63 6c 6f 73 65 7d 20 0a 20 20 20 20 20  db close} .     
3520: 20 20 20 63 61 74 63 68 20 7b 64 62 32 20 63 6c     catch {db2 cl
3530: 6f 73 65 7d 20 0a 20 20 20 20 20 20 20 20 66 6f  ose} .        fo
3540: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
3550: 62 0a 20 20 20 20 20 20 20 20 66 6f 72 63 65 64  b.        forced
3560: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  elete test.db-jo
3570: 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 66 6f  urnal.        fo
3580: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
3590: 62 2d 77 61 6c 0a 20 20 20 20 20 20 20 20 66 6f  b-wal.        fo
35a0: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
35b0: 64 62 0a 20 20 20 20 20 20 20 20 66 6f 72 63 65  db.        force
35c0: 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 2d  delete test2.db-
35d0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
35e0: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
35f0: 32 2e 64 62 2d 77 61 6c 0a 20 20 20 20 20 20 20  2.db-wal.       
3600: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
3610: 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d  s ::mallocopts(-
3620: 74 65 73 74 64 62 29 5d 7d 20 7b 0a 20 20 20 20  testdb)]} {.    
3630: 20 20 20 20 20 20 63 6f 70 79 5f 66 69 6c 65 20        copy_file 
3640: 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 74  $::mallocopts(-t
3650: 65 73 74 64 62 29 20 74 65 73 74 2e 64 62 0a 20  estdb) test.db. 
3660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3670: 20 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33   catch { sqlite3
3680: 20 64 62 20 74 65 73 74 2e 64 62 20 7d 0a 20 20   db test.db }.  
3690: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
36a0: 63 6f 6d 6d 61 6e 64 73 20 64 62 5d 20 6e 65 20  commands db] ne 
36b0: 22 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ""} {.          
36c0: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
36d0: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 64 62  _result_codes db
36e0: 20 31 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   1.        }.   
36f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
3700: 63 6f 6e 66 69 67 5f 6c 6f 6f 6b 61 73 69 64 65  config_lookaside
3710: 20 64 62 20 30 20 30 20 30 0a 20 20 0a 20 20 20   db 0 0 0.  .   
3720: 20 20 20 20 20 23 20 45 78 65 63 75 74 65 20 61       # Execute a
3730: 6e 79 20 2d 74 63 6c 70 72 65 70 20 61 6e 64 20  ny -tclprep and 
3740: 2d 73 71 6c 70 72 65 70 20 73 63 72 69 70 74 73  -sqlprep scripts
3750: 2e 0a 20 20 20 20 20 20 20 20 23 0a 20 20 20 20  ..        #.    
3760: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3770: 69 73 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74  ists ::mallocopt
3780: 73 28 2d 74 63 6c 70 72 65 70 29 5d 7d 20 7b 0a  s(-tclprep)]} {.
3790: 20 20 20 20 20 20 20 20 20 20 65 76 61 6c 20 24            eval $
37a0: 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 74 63  ::mallocopts(-tc
37b0: 6c 70 72 65 70 29 0a 20 20 20 20 20 20 20 20 7d  lprep).        }
37c0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
37d0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6d 61 6c 6c  fo exists ::mall
37e0: 6f 63 6f 70 74 73 28 2d 73 71 6c 70 72 65 70 29  ocopts(-sqlprep)
37f0: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 65  ]} {.          e
3800: 78 65 63 73 71 6c 20 24 3a 3a 6d 61 6c 6c 6f 63  xecsql $::malloc
3810: 6f 70 74 73 28 2d 73 71 6c 70 72 65 70 29 0a 20  opts(-sqlprep). 
3820: 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
3830: 20 20 20 20 23 20 4e 6f 77 20 73 65 74 20 74 68      # Now set th
3840: 65 20 24 7b 3a 3a 6e 7d 74 68 20 6d 61 6c 6c 6f  e ${::n}th mallo
3850: 63 28 29 20 74 6f 20 66 61 69 6c 20 61 6e 64 20  c() to fail and 
3860: 65 78 65 63 75 74 65 20 74 68 65 20 2d 74 63 6c  execute the -tcl
3870: 62 6f 64 79 20 0a 20 20 20 20 20 20 20 20 23 20  body .        # 
3880: 61 6e 64 20 2d 73 71 6c 62 6f 64 79 20 73 63 72  and -sqlbody scr
3890: 69 70 74 73 2e 0a 20 20 20 20 20 20 20 20 23 0a  ipts..        #.
38a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
38b0: 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 24 3a  memdebug_fail $:
38c0: 3a 6e 20 2d 72 65 70 65 61 74 20 24 3a 3a 69 52  :n -repeat $::iR
38d0: 65 70 65 61 74 0a 20 20 20 20 20 20 20 20 73 65  epeat.        se
38e0: 74 20 3a 3a 6d 61 6c 6c 6f 63 62 6f 64 79 20 7b  t ::mallocbody {
38f0: 7d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  }.        if {[i
3900: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6d 61 6c  nfo exists ::mal
3910: 6c 6f 63 6f 70 74 73 28 2d 74 63 6c 62 6f 64 79  locopts(-tclbody
3920: 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  )]} {.          
3930: 61 70 70 65 6e 64 20 3a 3a 6d 61 6c 6c 6f 63 62  append ::mallocb
3940: 6f 64 79 20 22 24 3a 3a 6d 61 6c 6c 6f 63 6f 70  ody "$::mallocop
3950: 74 73 28 2d 74 63 6c 62 6f 64 79 29 5c 6e 22 0a  ts(-tclbody)\n".
3960: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3970: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3980: 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28  ts ::mallocopts(
3990: 2d 73 71 6c 62 6f 64 79 29 5d 7d 20 7b 0a 20 20  -sqlbody)]} {.  
39a0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 3a          append :
39b0: 3a 6d 61 6c 6c 6f 63 62 6f 64 79 20 22 64 62 20  :mallocbody "db 
39c0: 65 76 61 6c 20 7b 24 3a 3a 6d 61 6c 6c 6f 63 6f  eval {$::malloco
39d0: 70 74 73 28 2d 73 71 6c 62 6f 64 79 29 7d 22 0a  pts(-sqlbody)}".
39e0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
39f0: 20 20 20 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69     # The followi
3a00: 6e 67 20 62 6c 6f 63 6b 20 73 65 74 73 20 6c 6f  ng block sets lo
3a10: 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 73  cal variables as
3a20: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
3a30: 20 20 23 0a 20 20 20 20 20 20 20 20 23 20 20 20    #.        #   
3a40: 20 20 69 73 46 61 69 6c 20 20 2d 20 54 72 75 65    isFail  - True
3a50: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 61 6e   if an error (an
3a60: 79 20 65 72 72 6f 72 29 20 77 61 73 20 72 65 70  y error) was rep
3a70: 6f 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 2e  orted by sqlite.
3a80: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 6e  .        #     n
3a90: 46 61 69 6c 20 20 20 2d 20 54 68 65 20 74 6f 74  Fail   - The tot
3aa0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  al number of sim
3ab0: 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 28 29 20  ulated malloc() 
3ac0: 66 61 69 6c 75 72 65 73 2e 0a 20 20 20 20 20 20  failures..      
3ad0: 20 20 23 20 20 20 20 20 6e 42 65 6e 69 67 6e 20    #     nBenign 
3ae0: 2d 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - The number of 
3af0: 62 65 6e 69 67 6e 20 73 69 6d 75 6c 61 74 65 64  benign simulated
3b00: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
3b10: 65 73 2e 0a 20 20 20 20 20 20 20 20 23 0a 20 20  es..        #.  
3b20: 20 20 20 20 20 20 73 65 74 20 69 73 46 61 69 6c        set isFail
3b30: 20 5b 63 61 74 63 68 20 24 3a 3a 6d 61 6c 6c 6f   [catch $::mallo
3b40: 63 62 6f 64 79 20 6d 73 67 5d 0a 20 20 20 20 20  cbody msg].     
3b50: 20 20 20 73 65 74 20 6e 46 61 69 6c 20 5b 73 71     set nFail [sq
3b60: 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66  lite3_memdebug_f
3b70: 61 69 6c 20 2d 31 20 2d 62 65 6e 69 67 6e 63 6e  ail -1 -benigncn
3b80: 74 20 6e 42 65 6e 69 67 6e 5d 0a 20 20 20 20 20  t nBenign].     
3b90: 20 20 20 23 20 70 75 74 73 20 2d 6e 6f 6e 65 77     # puts -nonew
3ba0: 6c 69 6e 65 20 22 20 28 69 73 46 61 69 6c 3d 24  line " (isFail=$
3bb0: 69 73 46 61 69 6c 20 6e 46 61 69 6c 3d 24 6e 46  isFail nFail=$nF
3bc0: 61 69 6c 20 6e 42 65 6e 69 67 6e 3d 24 6e 42 65  ail nBenign=$nBe
3bd0: 6e 69 67 6e 29 20 22 0a 0a 20 20 20 20 20 20 20  nign) "..       
3be0: 20 23 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72   # If one or mor
3bf0: 65 20 6d 61 6c 6c 6f 63 73 20 66 61 69 6c 65 64  e mallocs failed
3c00: 2c 20 72 75 6e 20 74 68 69 73 20 6c 6f 6f 70 20  , run this loop 
3c10: 62 6f 64 79 20 61 67 61 69 6e 2e 0a 20 20 20 20  body again..    
3c20: 20 20 20 20 23 0a 20 20 20 20 20 20 20 20 73 65      #.        se
3c30: 74 20 67 6f 20 5b 65 78 70 72 20 7b 24 6e 46 61  t go [expr {$nFa
3c40: 69 6c 3e 30 7d 5d 0a 0a 20 20 20 20 20 20 20 20  il>0}]..        
3c50: 69 66 20 7b 28 24 6e 46 61 69 6c 2d 24 6e 42 65  if {($nFail-$nBe
3c60: 6e 69 67 6e 29 3d 3d 30 7d 20 7b 0a 20 20 20 20  nign)==0} {.    
3c70: 20 20 20 20 20 20 69 66 20 7b 24 69 73 46 61 69        if {$isFai
3c80: 6c 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l} {.           
3c90: 20 73 65 74 20 76 32 20 24 6d 73 67 0a 20 20 20   set v2 $msg.   
3ca0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
3cc0: 69 73 46 61 69 6c 20 31 0a 20 20 20 20 20 20 20  isFail 1.       
3cd0: 20 20 20 20 20 73 65 74 20 76 32 20 31 0a 20 20       set v2 1.  
3ce0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3cf0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 69 73    } elseif {!$is
3d00: 46 61 69 6c 7d 20 7b 0a 20 20 20 20 20 20 20 20  Fail} {.        
3d10: 20 20 73 65 74 20 76 32 20 24 6d 73 67 0a 20 20    set v2 $msg.  
3d20: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
3d30: 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f  .          [info
3d40: 20 63 6f 6d 6d 61 6e 64 20 64 62 5d 3d 3d 22 22   command db]==""
3d50: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 5b   || .          [
3d60: 64 62 20 65 72 72 6f 72 63 6f 64 65 5d 3d 3d 37  db errorcode]==7
3d70: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 24 6d   ||.          $m
3d80: 73 67 3d 3d 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  sg=="out of memo
3d90: 72 79 22 0a 20 20 20 20 20 20 20 20 7d 20 7b 0a  ry".        } {.
3da0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 32            set v2
3db0: 20 31 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73   1.        } els
3dc0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65  e {.          se
3dd0: 74 20 76 32 20 24 6d 73 67 0a 20 20 20 20 20 20  t v2 $msg.      
3de0: 20 20 20 20 70 75 74 73 20 5b 64 62 20 65 72 72      puts [db err
3df0: 6f 72 63 6f 64 65 5d 0a 20 20 20 20 20 20 20 20  orcode].        
3e00: 7d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  }.        lappen
3e10: 64 20 69 73 46 61 69 6c 20 24 76 32 0a 20 20 20  d isFail $v2.   
3e20: 20 20 20 7d 20 7b 31 20 31 7d 0a 20 20 0a 20 20     } {1 1}.  .  
3e30: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3e40: 69 73 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74  ists ::mallocopt
3e50: 73 28 2d 63 6c 65 61 6e 75 70 29 5d 7d 20 7b 0a  s(-cleanup)]} {.
3e60: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 5b 6c          catch [l
3e70: 69 73 74 20 75 70 6c 65 76 65 6c 20 23 30 20 24  ist uplevel #0 $
3e80: 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 63 6c  ::mallocopts(-cl
3e90: 65 61 6e 75 70 29 5d 20 6d 73 67 0a 20 20 20 20  eanup)] msg.    
3ea0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
3eb0: 75 6e 73 65 74 20 3a 3a 6d 61 6c 6c 6f 63 6f 70  unset ::mallocop
3ec0: 74 73 0a 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d  ts.  sqlite3_mem
3ed0: 64 65 62 75 67 5f 66 61 69 6c 20 2d 31 0a 7d 0a  debug_fail -1.}.
3ee0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
3f30: 68 69 73 20 70 72 6f 63 20 69 73 20 75 73 65 64  his proc is used
3f40: 20 74 6f 20 74 65 73 74 20 61 20 73 69 6e 67 6c   to test a singl
3f50: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3f60: 6e 74 2e 20 50 61 72 61 6d 65 74 65 72 20 24 6e  nt. Parameter $n
3f70: 61 6d 65 20 69 73 0a 23 20 70 61 73 73 65 64 20  ame is.# passed 
3f80: 61 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74  a name for the t
3f90: 65 73 74 20 63 61 73 65 20 28 69 2e 65 2e 20 22  est case (i.e. "
3fa0: 66 74 73 33 5f 6d 61 6c 6c 6f 63 2d 31 2e 34 2e  fts3_malloc-1.4.
3fb0: 31 22 29 20 61 6e 64 20 70 61 72 61 6d 65 74 65  1") and paramete
3fc0: 72 0a 23 20 24 73 71 6c 20 69 73 20 70 61 73 73  r.# $sql is pass
3fd0: 65 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ed the text of t
3fe0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3ff0: 65 6e 74 2e 20 50 61 72 61 6d 65 74 65 72 20 24  ent. Parameter $
4000: 72 65 73 75 6c 74 20 69 73 0a 23 20 73 65 74 20  result is.# set 
4010: 74 6f 20 74 68 65 20 65 78 70 65 63 74 65 64 20  to the expected 
4020: 6f 75 74 70 75 74 20 69 66 20 74 68 65 20 53 45  output if the SE
4030: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
4040: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 23  s successfully.#
4050: 20 65 78 65 63 75 74 65 64 20 75 73 69 6e 67 20   executed using 
4060: 5b 64 62 20 65 76 61 6c 5d 2e 0a 23 0a 23 20 45  [db eval]..#.# E
4070: 78 61 6d 70 6c 65 3a 0a 23 0a 23 20 20 20 64 6f  xample:.#.#   do
4080: 5f 73 65 6c 65 63 74 5f 74 65 73 74 20 74 65 73  _select_test tes
4090: 74 63 61 73 65 2d 31 2e 31 20 22 53 45 4c 45 43  tcase-1.1 "SELEC
40a0: 54 20 31 2b 31 2c 20 31 2b 32 22 20 7b 31 20 32  T 1+1, 1+2" {1 2
40b0: 7d 0a 23 0a 23 20 49 66 20 67 6c 6f 62 61 6c 20  }.#.# If global 
40c0: 76 61 72 69 61 62 6c 65 20 44 4f 5f 4d 41 4c 4c  variable DO_MALL
40d0: 4f 43 5f 54 45 53 54 20 69 73 20 73 65 74 20 74  OC_TEST is set t
40e0: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
40f0: 75 65 2c 20 6f 72 20 69 66 0a 23 20 69 74 20 69  ue, or if.# it i
4100: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 74  s not defined at
4110: 20 61 6c 6c 2c 20 74 68 65 6e 20 4f 4f 4d 20 74   all, then OOM t
4120: 65 73 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72  esting is perfor
4130: 6d 65 64 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  med on the SELEC
4140: 54 0a 23 20 73 74 61 74 65 6d 65 6e 74 2e 20 45  T.# statement. E
4150: 61 63 68 20 4f 4f 4d 20 74 65 73 74 20 63 61 73  ach OOM test cas
4160: 65 20 69 73 20 73 61 69 64 20 74 6f 20 70 61 73  e is said to pas
4170: 73 20 69 66 20 65 69 74 68 65 72 20 28 61 29 20  s if either (a) 
4180: 65 78 65 63 75 74 69 6e 67 0a 23 20 74 68 65 20  executing.# the 
4190: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
41a0: 20 73 75 63 63 65 65 64 73 20 61 6e 64 20 74 68   succeeds and th
41b0: 65 20 72 65 73 75 6c 74 73 20 6d 61 74 63 68 20  e results match 
41c0: 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
41d0: 23 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 24  # by parameter $
41e0: 72 65 73 75 6c 74 2c 20 6f 72 20 28 62 29 20 54  result, or (b) T
41f0: 43 4c 20 74 68 72 6f 77 73 20 61 6e 20 22 6f 75  CL throws an "ou
4200: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 20 65 72 72  t of memory" err
4210: 6f 72 2e 0a 23 0a 23 20 49 66 20 44 4f 5f 4d 41  or..#.# If DO_MA
4220: 4c 4c 4f 43 5f 54 45 53 54 20 69 73 20 64 65 66  LLOC_TEST is def
4230: 69 6e 65 64 20 61 6e 64 20 73 65 74 20 74 6f 20  ined and set to 
4240: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
4250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
4260: 23 20 69 73 20 65 78 65 63 75 74 65 64 20 6a 75  # is executed ju
4270: 73 74 20 6f 6e 63 65 2e 20 49 6e 20 74 68 69 73  st once. In this
4280: 20 63 61 73 65 20 74 68 65 20 74 65 73 74 20 63   case the test c
4290: 61 73 65 20 70 61 73 73 65 73 20 69 66 20 74 68  ase passes if th
42a0: 65 20 72 65 73 75 6c 74 73 0a 23 20 6d 61 74 63  e results.# matc
42b0: 68 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72  h the expected r
42c0: 65 73 75 6c 74 73 20 70 61 73 73 65 64 20 76 69  esults passed vi
42d0: 61 20 70 61 72 61 6d 65 74 65 72 20 24 72 65 73  a parameter $res
42e0: 75 6c 74 2e 0a 23 0a 70 72 6f 63 20 64 6f 5f 73  ult..#.proc do_s
42f0: 65 6c 65 63 74 5f 74 65 73 74 20 7b 6e 61 6d 65  elect_test {name
4300: 20 73 71 6c 20 72 65 73 75 6c 74 7d 20 7b 0a 20   sql result} {. 
4310: 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64   uplevel [list d
4320: 6f 50 61 73 73 69 76 65 54 65 73 74 20 30 20 24  oPassiveTest 0 $
4330: 6e 61 6d 65 20 24 73 71 6c 20 5b 6c 69 73 74 20  name $sql [list 
4340: 30 20 5b 6c 69 73 74 20 7b 2a 7d 24 72 65 73 75  0 [list {*}$resu
4350: 6c 74 5d 5d 5d 0a 7d 0a 0a 70 72 6f 63 20 64 6f  lt]]].}..proc do
4360: 5f 72 65 73 74 61 72 74 5f 73 65 6c 65 63 74 5f  _restart_select_
4370: 74 65 73 74 20 7b 6e 61 6d 65 20 73 71 6c 20 72  test {name sql r
4380: 65 73 75 6c 74 7d 20 7b 0a 20 20 75 70 6c 65 76  esult} {.  uplev
4390: 65 6c 20 5b 6c 69 73 74 20 64 6f 50 61 73 73 69  el [list doPassi
43a0: 76 65 54 65 73 74 20 31 20 24 6e 61 6d 65 20 24  veTest 1 $name $
43b0: 73 71 6c 20 5b 6c 69 73 74 20 30 20 24 72 65 73  sql [list 0 $res
43c0: 75 6c 74 5d 5d 0a 7d 0a 0a 70 72 6f 63 20 64 6f  ult]].}..proc do
43d0: 5f 65 72 72 6f 72 5f 74 65 73 74 20 7b 6e 61 6d  _error_test {nam
43e0: 65 20 73 71 6c 20 65 72 72 6f 72 7d 20 7b 0a 20  e sql error} {. 
43f0: 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64   uplevel [list d
4400: 6f 50 61 73 73 69 76 65 54 65 73 74 20 30 20 24  oPassiveTest 0 $
4410: 6e 61 6d 65 20 24 73 71 6c 20 5b 6c 69 73 74 20  name $sql [list 
4420: 31 20 24 65 72 72 6f 72 5d 5d 0a 7d 0a 0a 70 72  1 $error]].}..pr
4430: 6f 63 20 64 6f 50 61 73 73 69 76 65 54 65 73 74  oc doPassiveTest
4440: 20 7b 69 73 52 65 73 74 61 72 74 20 6e 61 6d 65   {isRestart name
4450: 20 73 71 6c 20 63 61 74 63 68 72 65 73 7d 20 7b   sql catchres} {
4460: 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .  if {![info ex
4470: 69 73 74 73 20 3a 3a 44 4f 5f 4d 41 4c 4c 4f 43  ists ::DO_MALLOC
4480: 5f 54 45 53 54 5d 7d 20 7b 20 73 65 74 20 3a 3a  _TEST]} { set ::
4490: 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 20 31  DO_MALLOC_TEST 1
44a0: 20 7d 0a 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20   }..  if {[info 
44b0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 70 72 65  exists ::testpre
44c0: 66 69 78 5d 20 0a 20 20 20 26 26 20 5b 73 74 72  fix] .   && [str
44d0: 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 5b  ing is integer [
44e0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6e 61  string range $na
44f0: 6d 65 20 30 20 30 5d 5d 0a 20 20 7d 20 7b 0a 20  me 0 0]].  } {. 
4500: 20 20 20 73 65 74 20 6e 61 6d 65 20 24 3a 3a 74     set name $::t
4510: 65 73 74 70 72 65 66 69 78 2e 24 6e 61 6d 65 0a  estprefix.$name.
4520: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 20 24 3a    }..  switch $:
4530: 3a 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 20  :DO_MALLOC_TEST 
4540: 7b 0a 20 20 20 20 30 20 7b 20 23 20 4e 6f 20 6d  {.    0 { # No m
4550: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 2e 0a  alloc failures..
4560: 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 24 6e        do_test $n
4570: 61 6d 65 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d  ame [list set {}
4580: 20 5b 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20   [uplevel [list 
4590: 63 61 74 63 68 73 71 6c 20 24 73 71 6c 5d 5d 5d  catchsql $sql]]]
45a0: 20 24 63 61 74 63 68 72 65 73 0a 20 20 20 20 20   $catchres.     
45b0: 20 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 20 20   return.    }.  
45c0: 20 20 31 20 7b 20 23 20 53 69 6d 75 6c 61 74 65    1 { # Simulate
45d0: 20 74 72 61 6e 73 69 65 6e 74 20 66 61 69 6c 75   transient failu
45e0: 72 65 73 2e 0a 20 20 20 20 20 20 73 65 74 20 6e  res..      set n
45f0: 52 65 70 65 61 74 20 31 0a 20 20 20 20 20 20 73  Repeat 1.      s
4600: 65 74 20 7a 4e 61 6d 65 20 22 74 72 61 6e 73 69  et zName "transi
4610: 65 6e 74 22 0a 20 20 20 20 20 20 73 65 74 20 6e  ent".      set n
4620: 53 74 61 72 74 4c 69 6d 69 74 20 31 30 30 30 30  StartLimit 10000
4630: 30 0a 20 20 20 20 20 20 73 65 74 20 6e 42 61 63  0.      set nBac
4640: 6b 75 70 20 31 0a 20 20 20 20 7d 0a 20 20 20 20  kup 1.    }.    
4650: 32 20 7b 20 23 20 53 69 6d 75 6c 61 74 65 20 70  2 { # Simulate p
4660: 65 72 73 69 73 74 65 6e 74 20 66 61 69 6c 75 72  ersistent failur
4670: 65 73 2e 0a 20 20 20 20 20 20 73 65 74 20 6e 52  es..      set nR
4680: 65 70 65 61 74 20 31 0a 20 20 20 20 20 20 73 65  epeat 1.      se
4690: 74 20 7a 4e 61 6d 65 20 22 70 65 72 73 69 73 74  t zName "persist
46a0: 65 6e 74 22 0a 20 20 20 20 20 20 73 65 74 20 6e  ent".      set n
46b0: 53 74 61 72 74 4c 69 6d 69 74 20 31 30 30 30 30  StartLimit 10000
46c0: 30 0a 20 20 20 20 20 20 73 65 74 20 6e 42 61 63  0.      set nBac
46d0: 6b 75 70 20 31 0a 20 20 20 20 7d 0a 20 20 20 20  kup 1.    }.    
46e0: 33 20 7b 20 23 20 53 69 6d 75 6c 61 74 65 20 74  3 { # Simulate t
46f0: 72 61 6e 73 69 65 6e 74 20 66 61 69 6c 75 72 65  ransient failure
4700: 73 20 77 69 74 68 20 65 78 74 72 61 20 62 72 75  s with extra bru
4710: 74 65 20 66 6f 72 63 65 2e 0a 20 20 20 20 20 20  te force..      
4720: 73 65 74 20 6e 52 65 70 65 61 74 20 31 30 30 30  set nRepeat 1000
4730: 30 30 0a 20 20 20 20 20 20 73 65 74 20 7a 4e 61  00.      set zNa
4740: 6d 65 20 22 72 69 64 69 63 75 6c 6f 75 73 22 0a  me "ridiculous".
4750: 20 20 20 20 20 20 73 65 74 20 6e 53 74 61 72 74        set nStart
4760: 4c 69 6d 69 74 20 31 0a 20 20 20 20 20 20 73 65  Limit 1.      se
4770: 74 20 6e 42 61 63 6b 75 70 20 31 30 0a 20 20 20  t nBackup 10.   
4780: 20 7d 0a 20 20 7d 0a 0a 20 20 23 20 54 68 65 20   }.  }..  # The 
4790: 73 65 74 20 6f 66 20 61 63 63 65 70 74 61 62 6c  set of acceptabl
47a0: 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 72  e results from r
47b0: 75 6e 6e 69 6e 67 20 5b 63 61 74 63 68 73 71 6c  unning [catchsql
47c0: 20 24 73 71 6c 5d 2e 0a 20 20 23 0a 20 20 73 65   $sql]..  #.  se
47d0: 74 20 61 6e 73 77 65 72 73 20 5b 6c 69 73 74 20  t answers [list 
47e0: 7b 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  {1 {out of memor
47f0: 79 7d 7d 20 24 63 61 74 63 68 72 65 73 5d 0a 20  y}} $catchres]. 
4800: 20 73 65 74 20 73 74 72 20 5b 6a 6f 69 6e 20 24   set str [join $
4810: 61 6e 73 77 65 72 73 20 22 20 4f 52 20 22 5d 0a  answers " OR "].
4820: 0a 20 20 73 65 74 20 6e 46 61 69 6c 20 31 0a 20  .  set nFail 1. 
4830: 20 66 6f 72 20 7b 73 65 74 20 69 4c 69 6d 69 74   for {set iLimit
4840: 20 24 6e 53 74 61 72 74 4c 69 6d 69 74 7d 20 7b   $nStartLimit} {
4850: 24 6e 46 61 69 6c 7d 20 7b 69 6e 63 72 20 69 4c  $nFail} {incr iL
4860: 69 6d 69 74 7d 20 7b 0a 20 20 20 20 66 6f 72 20  imit} {.    for 
4870: 7b 73 65 74 20 69 46 61 69 6c 20 31 7d 20 7b 24  {set iFail 1} {$
4880: 6e 46 61 69 6c 20 26 26 20 24 69 46 61 69 6c 3c  nFail && $iFail<
4890: 3d 24 69 4c 69 6d 69 74 7d 20 7b 69 6e 63 72 20  =$iLimit} {incr 
48a0: 69 46 61 69 6c 7d 20 7b 0a 20 20 20 20 20 20 66  iFail} {.      f
48b0: 6f 72 20 7b 73 65 74 20 69 54 65 73 74 20 30 7d  or {set iTest 0}
48c0: 20 7b 24 69 54 65 73 74 3c 24 6e 42 61 63 6b 75   {$iTest<$nBacku
48d0: 70 20 26 26 20 28 24 69 46 61 69 6c 2d 24 69 54  p && ($iFail-$iT
48e0: 65 73 74 29 3e 30 7d 20 7b 69 6e 63 72 20 69 54  est)>0} {incr iT
48f0: 65 73 74 7d 20 7b 0a 0a 20 20 20 20 20 20 20 20  est} {..        
4900: 69 66 20 7b 24 69 73 52 65 73 74 61 72 74 7d 20  if {$isRestart} 
4910: 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  { sqlite3 db tes
4920: 74 2e 64 62 20 7d 0a 0a 20 20 20 20 20 20 20 20  t.db }..        
4930: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67  sqlite3_memdebug
4940: 5f 66 61 69 6c 20 5b 65 78 70 72 20 24 69 46 61  _fail [expr $iFa
4950: 69 6c 2d 24 69 54 65 73 74 5d 20 2d 72 65 70 65  il-$iTest] -repe
4960: 61 74 20 24 6e 52 65 70 65 61 74 0a 20 20 20 20  at $nRepeat.    
4970: 20 20 20 20 73 65 74 20 72 65 73 20 5b 75 70 6c      set res [upl
4980: 65 76 65 6c 20 5b 6c 69 73 74 20 63 61 74 63 68  evel [list catch
4990: 73 71 6c 20 24 73 71 6c 5d 5d 0a 20 20 20 20 20  sql $sql]].     
49a0: 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20     if {[lsearch 
49b0: 2d 65 78 61 63 74 20 24 61 6e 73 77 65 72 73 20  -exact $answers 
49c0: 24 72 65 73 5d 3e 3d 30 7d 20 7b 20 73 65 74 20  $res]>=0} { set 
49d0: 72 65 73 20 24 73 74 72 20 7d 0a 20 20 20 20 20  res $str }.     
49e0: 20 20 20 73 65 74 20 74 65 73 74 6e 61 6d 65 20     set testname 
49f0: 22 24 6e 61 6d 65 2e 24 7a 4e 61 6d 65 2e 24 69  "$name.$zName.$i
4a00: 46 61 69 6c 22 0a 20 20 20 20 20 20 20 20 64 6f  Fail".        do
4a10: 5f 74 65 73 74 20 22 24 6e 61 6d 65 2e 24 7a 4e  _test "$name.$zN
4a20: 61 6d 65 2e 24 69 4c 69 6d 69 74 2e 24 69 46 61  ame.$iLimit.$iFa
4a30: 69 6c 22 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d  il" [list set {}
4a40: 20 24 72 65 73 5d 20 24 73 74 72 0a 0a 20 20 20   $res] $str..   
4a50: 20 20 20 20 20 73 65 74 20 6e 46 61 69 6c 20 5b       set nFail [
4a60: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67  sqlite3_memdebug
4a70: 5f 66 61 69 6c 20 2d 31 20 2d 62 65 6e 69 67 6e  _fail -1 -benign
4a80: 63 6e 74 20 6e 42 65 6e 69 67 6e 5d 0a 20 20 20  cnt nBenign].   
4a90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
4aa0: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
4af0: 54 65 73 74 20 61 20 73 69 6e 67 6c 65 20 77 72  Test a single wr
4b00: 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
4b10: 61 73 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ase. In this cas
4b20: 65 20 61 20 20 22 77 72 69 74 65 22 20 69 73 20  e a  "write" is 
4b30: 61 20 0a 23 20 44 45 4c 45 54 45 2c 20 55 50 44  a .# DELETE, UPD
4b40: 41 54 45 20 6f 72 20 49 4e 53 45 52 54 20 73 74  ATE or INSERT st
4b50: 61 74 65 6d 65 6e 74 2e 0a 23 0a 23 20 49 66 20  atement..#.# If 
4b60: 4f 4f 4d 20 74 65 73 74 69 6e 67 20 69 73 20 70  OOM testing is p
4b70: 65 72 66 6f 72 6d 65 64 2c 20 74 68 65 72 65 20  erformed, there 
4b80: 61 72 65 20 73 65 76 65 72 61 6c 20 61 63 63 65  are several acce
4b90: 70 74 61 62 6c 65 20 6f 75 74 63 6f 6d 65 73 3a  ptable outcomes:
4ba0: 0a 23 0a 23 20 20 20 31 29 20 54 68 65 20 77 72  .#.#   1) The wr
4bb0: 69 74 65 20 73 75 63 63 65 65 64 73 2e 20 4e 6f  ite succeeds. No
4bc0: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
4bd0: 65 64 2e 0a 23 0a 23 20 20 20 32 29 20 41 6e 20  ed..#.#   2) An 
4be0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 20  "out of memory" 
4bf0: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 72  exception is thr
4c00: 6f 77 6e 20 61 6e 64 3a 0a 23 0a 23 20 20 20 20  own and:.#.#    
4c10: 20 61 29 20 54 68 65 20 73 74 61 74 65 6d 65 6e   a) The statemen
4c20: 74 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2c  t has no effect,
4c30: 20 4f 52 0a 23 20 20 20 20 20 62 29 20 54 68 65   OR.#     b) The
4c40: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
4c50: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
4c60: 61 63 6b 2c 20 4f 52 0a 23 20 20 20 20 20 63 29  ack, OR.#     c)
4c70: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   The statement s
4c80: 75 63 63 65 65 64 73 2e 20 54 68 69 73 20 63 61  ucceeds. This ca
4c90: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
4ca0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   the connection.
4cb0: 23 20 20 20 20 20 20 20 20 69 73 20 69 6e 20 61  #        is in a
4cc0: 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  uto-commit mode 
4cd0: 28 61 66 74 65 72 20 74 68 65 20 73 74 61 74 65  (after the state
4ce0: 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65 64  ment is executed
4cf0: 2c 20 73 6f 20 74 68 69 73 0a 23 20 20 20 20 20  , so this.#     
4d00: 20 20 20 69 6e 63 6c 75 64 65 73 20 43 4f 4d 4d     includes COMM
4d10: 49 54 20 73 74 61 74 65 6d 65 6e 74 73 29 2e 0a  IT statements)..
4d20: 23 0a 23 20 49 66 20 74 68 65 20 77 72 69 74 65  #.# If the write
4d30: 20 6f 70 65 72 61 74 69 6f 6e 20 65 76 65 6e 74   operation event
4d40: 75 61 6c 6c 79 20 73 75 63 63 65 65 64 73 2c 20  ually succeeds, 
4d50: 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
4d60: 2e 20 49 66 20 61 0a 23 20 74 72 61 6e 73 61 63  . If a.# transac
4d70: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
4d80: 61 63 6b 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  ack, non-zero is
4d90: 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a 23 20 50   returned..#.# P
4da0: 61 72 61 6d 65 74 65 72 20 24 6e 61 6d 65 20 69  arameter $name i
4db0: 73 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 75 73  s the name to us
4dc0: 65 20 66 6f 72 20 74 68 65 20 74 65 73 74 20 63  e for the test c
4dd0: 61 73 65 20 28 6f 72 20 74 65 73 74 20 63 61 73  ase (or test cas
4de0: 65 73 29 2e 0a 23 20 54 68 65 20 73 65 63 6f 6e  es)..# The secon
4df0: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 24 74 62  d parameter, $tb
4e00: 6c 2c 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  l, should be the
4e10: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
4e20: 61 62 61 73 65 20 74 61 62 6c 65 0a 23 20 62 65  abase table.# be
4e30: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 50 61  ing modified. Pa
4e40: 72 61 6d 65 74 65 72 20 24 73 71 6c 20 63 6f 6e  rameter $sql con
4e50: 74 61 69 6e 73 20 74 68 65 20 53 51 4c 20 73 74  tains the SQL st
4e60: 61 74 65 6d 65 6e 74 20 74 6f 20 74 65 73 74 2e  atement to test.
4e70: 0a 23 0a 70 72 6f 63 20 64 6f 5f 77 72 69 74 65  .#.proc do_write
4e80: 5f 74 65 73 74 20 7b 6e 61 6d 65 20 74 62 6c 20  _test {name tbl 
4e90: 73 71 6c 7d 20 7b 0a 20 20 69 66 20 7b 21 5b 69  sql} {.  if {![i
4ea0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 44 4f 5f  nfo exists ::DO_
4eb0: 4d 41 4c 4c 4f 43 5f 54 45 53 54 5d 7d 20 7b 20  MALLOC_TEST]} { 
4ec0: 73 65 74 20 3a 3a 44 4f 5f 4d 41 4c 4c 4f 43 5f  set ::DO_MALLOC_
4ed0: 54 45 53 54 20 31 20 7d 0a 0a 20 20 23 20 46 69  TEST 1 }..  # Fi
4ee0: 67 75 72 65 20 6f 75 74 20 61 6e 20 73 74 61 74  gure out an stat
4ef0: 65 6d 65 6e 74 20 74 6f 20 67 65 74 20 61 20 63  ement to get a c
4f00: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 61 62 6c  hecksum for tabl
4f10: 65 20 24 74 62 6c 2e 0a 20 20 64 62 20 65 76 61  e $tbl..  db eva
4f20: 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l "SELECT * FROM
4f30: 20 24 74 62 6c 22 20 56 20 62 72 65 61 6b 0a 20   $tbl" V break. 
4f40: 20 73 65 74 20 63 6b 73 75 6d 73 71 6c 20 22 53   set cksumsql "S
4f50: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 5b 6a 6f  ELECT md5sum([jo
4f60: 69 6e 20 5b 63 6f 6e 63 61 74 20 72 6f 77 69 64  in [concat rowid
4f70: 20 24 56 28 2a 29 5d 20 2c 5d 29 20 46 52 4f 4d   $V(*)] ,]) FROM
4f80: 20 24 74 62 6c 22 0a 0a 20 20 23 20 43 61 6c 63   $tbl"..  # Calc
4f90: 75 6c 61 74 65 20 74 68 65 20 69 6e 69 74 69 61  ulate the initia
4fa0: 6c 20 74 61 62 6c 65 20 63 68 65 63 6b 73 75 6d  l table checksum
4fb0: 2e 0a 20 20 73 65 74 20 63 6b 73 75 6d 31 20 5b  ..  set cksum1 [
4fc0: 64 62 20 6f 6e 65 20 24 63 6b 73 75 6d 73 71 6c  db one $cksumsql
4fd0: 5d 0a 0a 20 20 69 66 20 7b 24 3a 3a 44 4f 5f 4d  ]..  if {$::DO_M
4fe0: 41 4c 4c 4f 43 5f 54 45 53 54 20 7d 20 7b 0a 20  ALLOC_TEST } {. 
4ff0: 20 20 20 73 65 74 20 61 6e 73 77 65 72 73 20 5b     set answers [
5000: 6c 69 73 74 20 7b 31 20 7b 6f 75 74 20 6f 66 20  list {1 {out of 
5010: 6d 65 6d 6f 72 79 7d 7d 20 7b 30 20 7b 7d 7d 5d  memory}} {0 {}}]
5020: 0a 20 20 20 20 69 66 20 7b 24 3a 3a 44 4f 5f 4d  .    if {$::DO_M
5030: 41 4c 4c 4f 43 5f 54 45 53 54 3d 3d 31 7d 20 7b  ALLOC_TEST==1} {
5040: 0a 20 20 20 20 20 20 73 65 74 20 6d 6f 64 65 73  .      set modes
5050: 20 7b 31 30 30 30 30 30 20 70 65 72 73 69 73 74   {100000 persist
5060: 65 6e 74 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ent}.    } else 
5070: 7b 0a 20 20 20 20 20 20 73 65 74 20 6d 6f 64 65  {.      set mode
5080: 73 20 7b 31 20 74 72 61 6e 73 69 65 6e 74 7d 0a  s {1 transient}.
5090: 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
50a0: 0a 20 20 20 20 73 65 74 20 61 6e 73 77 65 72 73  .    set answers
50b0: 20 5b 6c 69 73 74 20 7b 30 20 7b 7d 7d 5d 0a 20   [list {0 {}}]. 
50c0: 20 20 20 73 65 74 20 6d 6f 64 65 73 20 5b 6c 69     set modes [li
50d0: 73 74 20 30 20 6e 6f 66 61 69 6c 5d 0a 20 20 7d  st 0 nofail].  }
50e0: 0a 20 20 73 65 74 20 73 74 72 20 5b 6a 6f 69 6e  .  set str [join
50f0: 20 24 61 6e 73 77 65 72 73 20 22 20 4f 52 20 22   $answers " OR "
5100: 5d 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 52  ]..  foreach {nR
5110: 65 70 65 61 74 20 7a 4e 61 6d 65 7d 20 24 6d 6f  epeat zName} $mo
5120: 64 65 73 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73  des {.    for {s
5130: 65 74 20 69 46 61 69 6c 20 31 7d 20 31 20 7b 69  et iFail 1} 1 {i
5140: 6e 63 72 20 69 46 61 69 6c 7d 20 7b 0a 20 20 20  ncr iFail} {.   
5150: 20 20 20 69 66 20 7b 24 3a 3a 44 4f 5f 4d 41 4c     if {$::DO_MAL
5160: 4c 4f 43 5f 54 45 53 54 7d 20 7b 73 71 6c 69 74  LOC_TEST} {sqlit
5170: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c  e3_memdebug_fail
5180: 20 24 69 46 61 69 6c 20 2d 72 65 70 65 61 74 20   $iFail -repeat 
5190: 24 6e 52 65 70 65 61 74 7d 0a 0a 20 20 20 20 20  $nRepeat}..     
51a0: 20 73 65 74 20 72 65 73 20 5b 75 70 6c 65 76 65   set res [upleve
51b0: 6c 20 5b 6c 69 73 74 20 63 61 74 63 68 73 71 6c  l [list catchsql
51c0: 20 24 73 71 6c 5d 5d 0a 20 20 20 20 20 20 73 65   $sql]].      se
51d0: 74 20 6e 46 61 69 6c 20 5b 73 71 6c 69 74 65 33  t nFail [sqlite3
51e0: 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 2d  _memdebug_fail -
51f0: 31 20 2d 62 65 6e 69 67 6e 63 6e 74 20 6e 42 65  1 -benigncnt nBe
5200: 6e 69 67 6e 5d 0a 20 20 20 20 20 20 69 66 20 7b  nign].      if {
5210: 24 6e 46 61 69 6c 3d 3d 30 7d 20 7b 0a 20 20 20  $nFail==0} {.   
5220: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 24 6e 61       do_test $na
5230: 6d 65 2e 24 7a 4e 61 6d 65 2e 24 69 46 61 69 6c  me.$zName.$iFail
5240: 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72   [list set {} $r
5250: 65 73 5d 20 7b 30 20 7b 7d 7d 0a 20 20 20 20 20  es] {0 {}}.     
5260: 20 20 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20     return.      
5270: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
5280: 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 24 61   if {[lsearch $a
5290: 6e 73 77 65 72 73 20 24 72 65 73 5d 3e 3d 30 7d  nswers $res]>=0}
52a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74   {.          set
52b0: 20 72 65 73 20 24 73 74 72 0a 20 20 20 20 20 20   res $str.      
52c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 6f 5f 74    }.        do_t
52d0: 65 73 74 20 24 6e 61 6d 65 2e 24 7a 4e 61 6d 65  est $name.$zName
52e0: 2e 24 69 46 61 69 6c 20 5b 6c 69 73 74 20 73 65  .$iFail [list se
52f0: 74 20 7b 7d 20 24 72 65 73 5d 20 24 73 74 72 0a  t {} $res] $str.
5300: 20 20 20 20 20 20 20 20 73 65 74 20 63 6b 73 75          set cksu
5310: 6d 32 20 5b 64 62 20 6f 6e 65 20 24 63 6b 73 75  m2 [db one $cksu
5320: 6d 73 71 6c 5d 0a 20 20 20 20 20 20 20 20 69 66  msql].        if
5330: 20 7b 24 63 6b 73 75 6d 31 20 21 3d 20 24 63 6b   {$cksum1 != $ck
5340: 73 75 6d 32 7d 20 72 65 74 75 72 6e 0a 20 20 20  sum2} return.   
5350: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
5360: 0a                                               .