/ Hex Artifact Content
Login

Artifact 049b88b8ba0a1db3240aeaf9695cd08b9a3ba9e1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 4a 61 6e 20 32  /*.** 2008 Jan 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f  .** This file co
0180: 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69  ntains code to i
0190: 6d 70 6c 65 6d 65 6e 74 20 61 20 66 61 75 6c 74  mplement a fault
01a0: 2d 69 6e 6a 65 63 74 6f 72 20 75 73 65 64 20 66  -injector used f
01b0: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
01c0: 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 6f  d verification o
01d0: 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a 20  f SQLite..**.** 
01e0: 53 75 62 73 79 73 74 65 6d 73 20 77 69 74 68 69  Subsystems withi
01f0: 6e 20 53 51 4c 69 74 65 20 63 61 6e 20 63 61 6c  n SQLite can cal
0200: 6c 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 74  l sqlite3FaultSt
0210: 65 70 28 29 20 74 6f 20 73 65 65 20 69 66 0a 2a  ep() to see if.*
0220: 2a 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69  * they should si
0230: 6d 75 6c 61 74 65 20 61 20 66 61 75 6c 74 2e 20  mulate a fault. 
0240: 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 74 65   sqlite3FaultSte
0250: 70 28 29 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 74  p() normally ret
0260: 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 62 75 74  urns.** zero but
0270: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 6e 6f 6e   will return non
0280: 2d 7a 65 72 6f 20 69 66 20 61 20 66 61 75 6c 74  -zero if a fault
0290: 20 73 68 6f 75 6c 64 20 62 65 20 73 69 6d 75 6c   should be simul
02a0: 61 74 65 64 2e 0a 2a 2a 20 46 61 75 6c 74 20 69  ated..** Fault i
02b0: 6e 6a 65 63 74 6f 72 73 20 63 61 6e 20 62 65 20  njectors can be 
02c0: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
02d0: 65 2c 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 6d  e, to simulate m
02e0: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
02f0: 69 6f 6e 20 66 61 69 6c 75 72 65 73 20 6f 72 20  ion failures or 
0300: 49 2f 4f 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  I/O errors..**.*
0310: 2a 20 54 68 65 20 66 61 75 6c 74 20 69 6e 6a 65  * The fault inje
0320: 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20  ctor is omitted 
0330: 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 69 66  from the code if
0340: 20 53 51 4c 69 74 65 20 69 73 0a 2a 2a 20 63 6f   SQLite is.** co
0350: 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51  mpiled with -DSQ
0360: 4c 49 54 45 5f 4f 4d 49 54 5f 46 41 55 4c 54 49  LITE_OMIT_FAULTI
0370: 4e 4a 45 43 54 4f 52 3d 31 2e 20 20 54 68 65 72  NJECTOR=1.  Ther
0380: 65 20 69 73 20 61 20 76 65 72 79 0a 2a 2a 20 73  e is a very.** s
0390: 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65  mall performance
03a0: 20 68 69 74 20 66 6f 72 20 6c 65 61 76 69 6e 67   hit for leaving
03b0: 20 74 68 65 20 66 61 75 6c 74 20 69 6e 6a 65 63   the fault injec
03c0: 74 6f 72 20 69 6e 20 74 68 65 20 63 6f 64 65 2e  tor in the code.
03d0: 0a 2a 2a 20 43 6f 6d 6d 65 72 69 63 61 6c 20 70  .** Commerical p
03e0: 72 6f 64 75 63 74 73 20 77 69 6c 6c 20 70 72 6f  roducts will pro
03f0: 62 61 62 6c 79 20 77 61 6e 74 20 74 6f 20 6f 6d  bably want to om
0400: 69 74 20 74 68 65 20 66 61 75 6c 74 20 69 6e 6a  it the fault inj
0410: 65 63 74 6f 72 0a 2a 2a 20 66 72 6f 6d 20 70 72  ector.** from pr
0420: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 73 2e  oduction builds.
0430: 20 20 42 75 74 20 73 61 66 65 74 79 2d 63 72 69    But safety-cri
0440: 74 69 63 61 6c 20 73 79 73 74 65 6d 73 20 77 68  tical systems wh
0450: 6f 20 77 6f 72 6b 0a 2a 2a 20 75 6e 64 65 72 20  o work.** under 
0460: 74 68 65 20 6d 6f 74 74 6f 20 22 66 6c 79 20 77  the motto "fly w
0470: 68 61 74 20 79 6f 75 20 74 65 73 74 20 61 6e 64  hat you test and
0480: 20 74 65 73 74 20 77 68 61 74 20 79 6f 75 20 66   test what you f
0490: 6c 79 22 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ly" may.** choos
04a0: 65 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 66  e to leave the f
04b0: 61 75 6c 74 20 69 6e 6a 65 63 74 6f 72 20 65 6e  ault injector en
04c0: 61 62 6c 65 64 20 65 76 65 6e 20 69 6e 20 70 72  abled even in pr
04d0: 6f 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e  oduction..*/.#in
04e0: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
04f0: 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .h"..#ifndef SQL
0500: 49 54 45 5f 4f 4d 49 54 5f 46 41 55 4c 54 49 4e  ITE_OMIT_FAULTIN
0510: 4a 45 43 54 4f 52 0a 0a 2f 2a 0a 2a 2a 20 54 68  JECTOR../*.** Th
0520: 65 72 65 20 63 61 6e 20 62 65 20 76 61 72 69 6f  ere can be vario
0530: 75 73 20 6b 69 6e 64 73 20 6f 66 20 66 61 75 6c  us kinds of faul
0540: 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ts.  For example
0550: 2c 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  , there can be.*
0560: 2a 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  * a memory alloc
0570: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20  ation failure.  
0580: 4f 72 20 61 6e 20 49 2f 4f 20 66 61 69 6c 75 72  Or an I/O failur
0590: 65 2e 20 20 46 6f 72 20 65 61 63 68 20 64 69 66  e.  For each dif
05a0: 66 65 72 65 6e 74 0a 2a 2a 20 66 61 75 6c 74 20  ferent.** fault 
05b0: 74 79 70 65 2c 20 74 68 65 72 65 20 69 73 20 61  type, there is a
05c0: 20 73 65 70 61 72 61 74 65 20 46 61 75 6c 74 49   separate FaultI
05d0: 6e 6a 65 63 74 6f 72 20 73 74 72 75 63 74 75 72  njector structur
05e0: 65 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 0a  e to keep track.
05f0: 2a 2a 20 6f 66 20 74 68 65 20 73 74 61 74 75 73  ** of the status
0600: 20 6f 66 20 74 68 61 74 20 66 61 75 6c 74 2e 0a   of that fault..
0610: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
0620: 20 46 61 75 6c 74 49 6e 6a 65 63 74 6f 72 20 7b   FaultInjector {
0630: 0a 20 20 69 6e 74 20 69 43 6f 75 6e 74 64 6f 77  .  int iCountdow
0640: 6e 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  n;   /* Number o
0650: 66 20 70 65 6e 64 69 6e 67 20 73 75 63 63 65 73  f pending succes
0660: 73 65 73 20 62 65 66 6f 72 65 20 77 65 20 68 69  ses before we hi
0670: 74 20 61 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  t a failure */. 
0680: 20 69 6e 74 20 6e 52 65 70 65 61 74 3b 20 20 20   int nRepeat;   
0690: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
06a0: 74 69 6d 65 73 20 74 6f 20 72 65 70 65 61 74 20  times to repeat 
06b0: 74 68 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  the failure */. 
06c0: 20 69 6e 74 20 6e 42 65 6e 69 67 6e 3b 20 20 20   int nBenign;   
06d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
06e0: 62 65 6e 69 67 6e 20 66 61 69 6c 75 72 65 73 20  benign failures 
06f0: 73 65 65 6e 20 73 69 6e 63 65 20 6c 61 73 74 20  seen since last 
0700: 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 69 6e 74 20  config */.  int 
0710: 6e 46 61 69 6c 3b 20 20 20 20 20 20 20 20 2f 2a  nFail;        /*
0720: 20 4e 75 6d 62 65 72 20 6f 66 20 66 61 69 6c 75   Number of failu
0730: 72 65 73 20 73 65 65 6e 20 73 69 6e 63 65 20 6c  res seen since l
0740: 61 73 74 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20  ast config */.  
0750: 75 38 20 65 6e 61 62 6c 65 3b 20 20 20 20 20 20  u8 enable;      
0760: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 6e 61    /* True if ena
0770: 62 6c 65 64 20 2a 2f 0a 20 20 75 38 20 62 65 6e  bled */.  u8 ben
0780: 69 67 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ign;        /* T
0790: 75 72 65 20 69 66 20 6e 65 78 74 20 66 61 69 6c  ure if next fail
07a0: 75 72 65 20 77 69 6c 6c 20 62 65 20 62 65 6e 69  ure will be beni
07b0: 67 6e 20 2a 2f 0a 7d 20 61 46 61 75 6c 74 5b 53  gn */.} aFault[S
07c0: 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43  QLITE_FAULTINJEC
07d0: 54 4f 52 5f 43 4f 55 4e 54 5d 3b 0a 0a 2f 2a 0a  TOR_COUNT];../*.
07e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
07f0: 63 6f 6e 66 69 67 75 72 65 73 20 61 6e 64 20 65  configures and e
0800: 6e 61 62 6c 65 73 20 61 20 66 61 75 6c 74 20 69  nables a fault i
0810: 6e 6a 65 63 74 6f 72 2e 20 20 41 66 74 65 72 0a  njector.  After.
0820: 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
0830: 72 6f 75 74 69 6e 65 2c 20 61 46 61 75 6c 74 53  routine, aFaultS
0840: 74 65 70 28 29 20 77 69 6c 6c 20 72 65 74 75 72  tep() will retur
0850: 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 0a 2a  n false (zero).*
0860: 2a 20 6e 44 65 6c 61 79 20 74 69 6d 65 73 2c 20  * nDelay times, 
0870: 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 72 65 74  then it will ret
0880: 75 72 6e 20 74 72 75 65 20 6e 52 65 70 65 61 74  urn true nRepeat
0890: 20 74 69 6d 65 73 2c 0a 2a 2a 20 74 68 65 6e 20   times,.** then 
08a0: 69 74 20 77 69 6c 6c 20 61 67 61 69 6e 20 62 65  it will again be
08b0: 67 69 6e 20 72 65 74 75 72 6e 69 6e 67 20 66 61  gin returning fa
08c0: 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lse..*/.void sql
08d0: 69 74 65 33 46 61 75 6c 74 43 6f 6e 66 69 67 28  ite3FaultConfig(
08e0: 69 6e 74 20 69 64 2c 20 69 6e 74 20 6e 44 65 6c  int id, int nDel
08f0: 61 79 2c 20 69 6e 74 20 6e 52 65 70 65 61 74 29  ay, int nRepeat)
0900: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 3e 3d  {.  assert( id>=
0910: 30 20 26 26 20 69 64 3c 53 51 4c 49 54 45 5f 46  0 && id<SQLITE_F
0920: 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 43 4f 55  AULTINJECTOR_COU
0930: 4e 54 20 29 3b 0a 20 20 61 46 61 75 6c 74 5b 69  NT );.  aFault[i
0940: 64 5d 2e 69 43 6f 75 6e 74 64 6f 77 6e 20 3d 20  d].iCountdown = 
0950: 6e 44 65 6c 61 79 3b 0a 20 20 61 46 61 75 6c 74  nDelay;.  aFault
0960: 5b 69 64 5d 2e 6e 52 65 70 65 61 74 20 3d 20 6e  [id].nRepeat = n
0970: 52 65 70 65 61 74 3b 0a 20 20 61 46 61 75 6c 74  Repeat;.  aFault
0980: 5b 69 64 5d 2e 6e 42 65 6e 69 67 6e 20 3d 20 30  [id].nBenign = 0
0990: 3b 0a 20 20 61 46 61 75 6c 74 5b 69 64 5d 2e 6e  ;.  aFault[id].n
09a0: 46 61 69 6c 20 3d 20 30 3b 0a 20 20 61 46 61 75  Fail = 0;.  aFau
09b0: 6c 74 5b 69 64 5d 2e 65 6e 61 62 6c 65 20 3d 20  lt[id].enable = 
09c0: 6e 44 65 6c 61 79 3e 3d 30 3b 0a 20 20 61 46 61  nDelay>=0;.  aFa
09d0: 75 6c 74 5b 69 64 5d 2e 62 65 6e 69 67 6e 20 3d  ult[id].benign =
09e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
09f0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
0a00: 66 20 66 61 75 6c 74 73 20 28 62 6f 74 68 20 68  f faults (both h
0a10: 61 72 64 20 61 6e 64 20 62 65 6e 69 67 6e 20 66  ard and benign f
0a20: 61 75 6c 74 73 29 20 74 68 61 74 20 68 61 76 65  aults) that have
0a30: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 20 73 69 6e  .** occurred sin
0a40: 63 65 20 74 68 65 20 69 6e 6a 65 63 74 6f 72 20  ce the injector 
0a50: 77 61 73 20 6c 61 73 74 20 63 6f 6e 66 69 67 75  was last configu
0a60: 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
0a70: 74 65 33 46 61 75 6c 74 46 61 69 6c 75 72 65 73  te3FaultFailures
0a80: 28 69 6e 74 20 69 64 29 7b 0a 20 20 61 73 73 65  (int id){.  asse
0a90: 72 74 28 20 69 64 3e 3d 30 20 26 26 20 69 64 3c  rt( id>=0 && id<
0aa0: 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45  SQLITE_FAULTINJE
0ab0: 43 54 4f 52 5f 43 4f 55 4e 54 20 29 3b 0a 20 20  CTOR_COUNT );.  
0ac0: 72 65 74 75 72 6e 20 61 46 61 75 6c 74 5b 69 64  return aFault[id
0ad0: 5d 2e 6e 46 61 69 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  ].nFail;.}../*.*
0ae0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
0af0: 62 65 72 20 6f 66 20 62 65 6e 69 67 6e 20 66 61  ber of benign fa
0b00: 75 6c 74 73 20 74 68 61 74 20 68 61 76 65 20 6f  ults that have o
0b10: 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 68  ccurred since th
0b20: 65 0a 2a 2a 20 69 6e 6a 65 63 74 6f 72 20 77 61  e.** injector wa
0b30: 73 20 6c 61 73 74 20 63 6f 6e 66 69 67 75 72 65  s last configure
0b40: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0b50: 33 46 61 75 6c 74 42 65 6e 69 67 6e 46 61 69 6c  3FaultBenignFail
0b60: 75 72 65 73 28 69 6e 74 20 69 64 29 7b 0a 20 20  ures(int id){.  
0b70: 61 73 73 65 72 74 28 20 69 64 3e 3d 30 20 26 26  assert( id>=0 &&
0b80: 20 69 64 3c 53 51 4c 49 54 45 5f 46 41 55 4c 54   id<SQLITE_FAULT
0b90: 49 4e 4a 45 43 54 4f 52 5f 43 4f 55 4e 54 20 29  INJECTOR_COUNT )
0ba0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 46 61 75 6c  ;.  return aFaul
0bb0: 74 5b 69 64 5d 2e 6e 42 65 6e 69 67 6e 3b 0a 7d  t[id].nBenign;.}
0bc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0bd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 75 63  he number of suc
0be0: 63 65 73 73 65 73 20 74 68 61 74 20 77 69 6c 6c  cesses that will
0bf0: 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
0c00: 65 20 6e 65 78 74 20 66 61 69 6c 75 72 65 2e 0a  e next failure..
0c10: 2a 2a 20 49 66 20 6e 6f 20 66 61 69 6c 75 72 65  ** If no failure
0c20: 73 20 61 72 65 20 73 63 68 65 64 75 6c 65 64 2c  s are scheduled,
0c30: 20 72 65 74 75 72 6e 20 2d 31 2e 0a 2a 2f 0a 69   return -1..*/.i
0c40: 6e 74 20 73 71 6c 69 74 65 33 46 61 75 6c 74 50  nt sqlite3FaultP
0c50: 65 6e 64 69 6e 67 28 69 6e 74 20 69 64 29 7b 0a  ending(int id){.
0c60: 20 20 61 73 73 65 72 74 28 20 69 64 3e 3d 30 20    assert( id>=0 
0c70: 26 26 20 69 64 3c 53 51 4c 49 54 45 5f 46 41 55  && id<SQLITE_FAU
0c80: 4c 54 49 4e 4a 45 43 54 4f 52 5f 43 4f 55 4e 54  LTINJECTOR_COUNT
0c90: 20 29 3b 0a 20 20 69 66 28 20 61 46 61 75 6c 74   );.  if( aFault
0ca0: 5b 69 64 5d 2e 65 6e 61 62 6c 65 20 29 7b 0a 20  [id].enable ){. 
0cb0: 20 20 20 72 65 74 75 72 6e 20 61 46 61 75 6c 74     return aFault
0cc0: 5b 69 64 5d 2e 69 43 6f 75 6e 74 64 6f 77 6e 3b  [id].iCountdown;
0cd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
0ce0: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a  turn -1;.  }.}..
0cf0: 2f 2a 20 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  /* .** After thi
0d00: 73 20 72 6f 75 74 69 6e 65 20 63 61 75 73 65 73  s routine causes
0d10: 20 73 75 62 73 65 71 75 65 6e 74 20 66 61 75 6c   subsequent faul
0d20: 74 73 20 74 6f 20 62 65 20 65 69 74 68 65 72 20  ts to be either 
0d30: 62 65 6e 69 67 6e 0a 2a 2a 20 6f 72 20 68 61 72  benign.** or har
0d40: 64 20 28 6e 6f 74 20 62 65 6e 69 67 6e 29 2c 20  d (not benign), 
0d50: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
0d60: 20 22 65 6e 61 62 6c 65 22 20 70 61 72 61 6d 65   "enable" parame
0d70: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  ter..**.** Most 
0d80: 66 61 75 6c 74 73 20 61 72 65 20 68 61 72 64 2e  faults are hard.
0d90: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
0da0: 2c 20 6d 6f 73 74 20 66 61 75 6c 74 73 20 63 61  , most faults ca
0db0: 75 73 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  use.** an error 
0dc0: 74 6f 20 62 65 20 70 72 6f 70 61 67 61 74 65 64  to be propagated
0dd0: 20 62 61 63 6b 20 75 70 20 74 6f 20 74 68 65 20   back up to the 
0de0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 6e 74 65  application inte
0df0: 72 66 61 63 65 2e 0a 2a 2a 20 48 6f 77 65 76 65  rface..** Howeve
0e00: 72 2c 20 73 6f 6d 65 74 69 6d 65 73 20 61 20 66  r, sometimes a f
0e10: 61 75 6c 74 20 69 73 20 65 61 73 69 6c 79 20 72  ault is easily r
0e20: 65 63 6f 76 65 72 61 62 6c 65 2e 20 20 46 6f 72  ecoverable.  For
0e30: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20   example,.** if 
0e40: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
0e50: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 61 20  hile resizing a 
0e60: 68 61 73 68 20 74 61 62 6c 65 2c 20 74 68 69 73  hash table, this
0e70: 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a   is completely.*
0e80: 2a 20 72 65 63 6f 76 65 72 61 62 6c 65 20 73 69  * recoverable si
0e90: 6d 70 6c 79 20 62 79 20 6e 6f 74 20 63 61 72 72  mply by not carr
0ea0: 79 69 6e 67 20 6f 75 74 20 74 68 65 20 72 65 73  ying out the res
0eb0: 69 7a 65 2e 20 20 54 68 65 20 68 61 73 68 20 74  ize.  The hash t
0ec0: 61 62 6c 65 0a 2a 2a 20 77 69 6c 6c 20 63 6f 6e  able.** will con
0ed0: 74 69 6e 75 65 20 74 6f 20 66 75 6e 63 74 69 6f  tinue to functio
0ee0: 6e 20 6e 6f 72 6d 61 6c 6c 79 2e 20 20 53 6f 20  n normally.  So 
0ef0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
0f00: 20 64 75 72 69 6e 67 0a 2a 2a 20 61 20 68 61 73   during.** a has
0f10: 68 20 74 61 62 6c 65 20 72 65 73 69 7a 65 20 69  h table resize i
0f20: 73 20 61 20 62 65 6e 69 67 6e 20 66 61 75 6c 74  s a benign fault
0f30: 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
0f40: 74 65 33 46 61 75 6c 74 42 65 6e 69 67 6e 28 69  te3FaultBenign(i
0f50: 6e 74 20 69 64 2c 20 69 6e 74 20 65 6e 61 62 6c  nt id, int enabl
0f60: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64  e){.  assert( id
0f70: 3e 3d 30 20 26 26 20 69 64 3c 53 51 4c 49 54 45  >=0 && id<SQLITE
0f80: 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 43  _FAULTINJECTOR_C
0f90: 4f 55 4e 54 20 29 3b 0a 20 20 61 46 61 75 6c 74  OUNT );.  aFault
0fa0: 5b 69 64 5d 2e 62 65 6e 69 67 6e 20 3d 20 65 6e  [id].benign = en
0fb0: 61 62 6c 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  able;.}../*.** T
0fc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73  his routine exis
0fd0: 74 73 20 61 73 20 61 20 70 6c 61 63 65 20 74 6f  ts as a place to
0fe0: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
0ff0: 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 66  t that will.** f
1000: 69 72 65 20 6f 6e 20 61 6e 79 20 73 69 6d 75 6c  ire on any simul
1010: 61 74 65 64 20 66 61 75 6c 74 2e 0a 2a 2f 0a 73  ated fault..*/.s
1020: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1030: 65 33 46 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  e3Fault(void){. 
1040: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
1050: 3d 20 30 3b 0a 20 20 63 6e 74 2b 2b 3b 0a 7d 0a  = 0;.  cnt++;.}.
1060: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
1070: 20 73 65 65 20 69 66 20 61 20 66 61 75 6c 74 20   see if a fault 
1080: 73 68 6f 75 6c 64 20 62 65 20 73 69 6d 75 6c 61  should be simula
1090: 74 65 64 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ted.  Return tru
10a0: 65 20 74 6f 20 73 69 6d 75 6c 61 74 65 0a 2a 2a  e to simulate.**
10b0: 20 74 68 65 20 66 61 75 6c 74 2e 20 20 52 65 74   the fault.  Ret
10c0: 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65  urn false if the
10d0: 20 66 61 75 6c 74 20 73 68 6f 75 6c 64 20 6e 6f   fault should no
10e0: 74 20 62 65 20 73 69 6d 75 6c 61 74 65 64 2e 0a  t be simulated..
10f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 61  */.int sqlite3Fa
1100: 75 6c 74 53 74 65 70 28 69 6e 74 20 69 64 29 7b  ultStep(int id){
1110: 0a 20 20 61 73 73 65 72 74 28 20 69 64 3e 3d 30  .  assert( id>=0
1120: 20 26 26 20 69 64 3c 53 51 4c 49 54 45 5f 46 41   && id<SQLITE_FA
1130: 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 43 4f 55 4e  ULTINJECTOR_COUN
1140: 54 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  T );.  if( likel
1150: 79 28 21 61 46 61 75 6c 74 5b 69 64 5d 2e 65 6e  y(!aFault[id].en
1160: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
1170: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1180: 20 61 46 61 75 6c 74 5b 69 64 5d 2e 69 43 6f 75   aFault[id].iCou
1190: 6e 74 64 6f 77 6e 3e 30 20 29 7b 0a 20 20 20 20  ntdown>0 ){.    
11a0: 61 46 61 75 6c 74 5b 69 64 5d 2e 69 43 6f 75 6e  aFault[id].iCoun
11b0: 74 64 6f 77 6e 2d 2d 3b 0a 20 20 20 20 72 65 74  tdown--;.    ret
11c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
11d0: 69 74 65 33 46 61 75 6c 74 28 29 3b 0a 20 20 61  ite3Fault();.  a
11e0: 46 61 75 6c 74 5b 69 64 5d 2e 6e 46 61 69 6c 2b  Fault[id].nFail+
11f0: 2b 3b 0a 20 20 69 66 28 20 61 46 61 75 6c 74 5b  +;.  if( aFault[
1200: 69 64 5d 2e 62 65 6e 69 67 6e 20 29 7b 0a 20 20  id].benign ){.  
1210: 20 20 61 46 61 75 6c 74 5b 69 64 5d 2e 6e 42 65    aFault[id].nBe
1220: 6e 69 67 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 61 46  nign++;.  }.  aF
1230: 61 75 6c 74 5b 69 64 5d 2e 6e 52 65 70 65 61 74  ault[id].nRepeat
1240: 2d 2d 3b 0a 20 20 69 66 28 20 61 46 61 75 6c 74  --;.  if( aFault
1250: 5b 69 64 5d 2e 6e 52 65 70 65 61 74 3c 3d 30 20  [id].nRepeat<=0 
1260: 29 7b 0a 20 20 20 20 61 46 61 75 6c 74 5b 69 64  ){.    aFault[id
1270: 5d 2e 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ].enable = 0;.  
1280: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 0a  }.  return 1;  .
1290: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
12a0: 49 54 45 5f 4f 4d 49 54 5f 46 41 55 4c 54 49 4e  ITE_OMIT_FAULTIN
12b0: 4a 45 43 54 4f 52 20 2a 2f 0a                    JECTOR */.