/ Hex Artifact Content
Login

Artifact 039abb45c9dbcbdf575ec2a23ae38db01bc2f7b2:


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 54 45 53 54 4c 4f  LITE_OMIT_TESTLO
0370: 47 49 43 3d 31 2e 20 20 54 68 65 72 65 20 69 73  GIC=1.  There is
0380: 20 61 20 76 65 72 79 0a 2a 2a 20 73 6d 61 6c 6c   a very.** small
0390: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
03a0: 20 66 6f 72 20 6c 65 61 76 69 6e 67 20 74 68 65   for leaving the
03b0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 6f 72 20   fault injector 
03c0: 69 6e 20 74 68 65 20 63 6f 64 65 2e 0a 2a 2a 20  in the code..** 
03d0: 43 6f 6d 6d 65 72 69 63 61 6c 20 70 72 6f 64 75  Commerical produ
03e0: 63 74 73 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  cts will probabl
03f0: 79 20 77 61 6e 74 20 74 6f 20 6f 6d 69 74 20 74  y want to omit t
0400: 68 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 6f  he fault injecto
0410: 72 0a 2a 2a 20 66 72 6f 6d 20 70 72 6f 64 75 63  r.** from produc
0420: 74 69 6f 6e 20 62 75 69 6c 64 73 2e 20 20 42 75  tion builds.  Bu
0430: 74 20 73 61 66 65 74 79 2d 63 72 69 74 69 63 61  t safety-critica
0440: 6c 20 73 79 73 74 65 6d 73 20 77 68 6f 20 77 6f  l systems who wo
0450: 72 6b 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20  rk.** under the 
0460: 6d 6f 74 74 6f 20 22 66 6c 79 20 77 68 61 74 20  motto "fly what 
0470: 79 6f 75 20 74 65 73 74 20 61 6e 64 20 74 65 73  you test and tes
0480: 74 20 77 68 61 74 20 79 6f 75 20 66 6c 79 22 20  t what you fly" 
0490: 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 74 6f  may.** choose to
04a0: 20 6c 65 61 76 65 20 74 68 65 20 66 61 75 6c 74   leave the fault
04b0: 20 69 6e 6a 65 63 74 6f 72 20 65 6e 61 62 6c 65   injector enable
04c0: 64 20 65 76 65 6e 20 69 6e 20 70 72 6f 64 75 63  d even in produc
04d0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tion..*/.#includ
04e0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
04f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0500: 4f 4d 49 54 5f 54 45 53 54 4c 4f 47 49 43 0a 0a  OMIT_TESTLOGIC..
0510: 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e 20  /*.** There can 
0520: 62 65 20 76 61 72 69 6f 75 73 20 6b 69 6e 64 73  be various kinds
0530: 20 6f 66 20 66 61 75 6c 74 73 2e 20 20 46 6f 72   of faults.  For
0540: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20   example, there 
0550: 63 61 6e 20 62 65 0a 2a 2a 20 61 20 6d 65 6d 6f  can be.** a memo
0560: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
0570: 69 6c 75 72 65 2e 20 20 4f 72 20 61 6e 20 49 2f  ilure.  Or an I/
0580: 4f 20 66 61 69 6c 75 72 65 2e 20 20 46 6f 72 20  O failure.  For 
0590: 65 61 63 68 20 64 69 66 66 65 72 65 6e 74 0a 2a  each different.*
05a0: 2a 20 66 61 75 6c 74 20 74 79 70 65 2c 20 74 68  * fault type, th
05b0: 65 72 65 20 69 73 20 61 20 73 65 70 61 72 61 74  ere is a separat
05c0: 65 20 46 61 75 6c 74 49 6e 6a 65 63 74 6f 72 20  e FaultInjector 
05d0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 6b 65 65  structure to kee
05e0: 70 20 74 72 61 63 6b 0a 2a 2a 20 6f 66 20 74 68  p track.** of th
05f0: 65 20 73 74 61 74 75 73 20 6f 66 20 74 68 61 74  e status of that
0600: 20 66 61 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69   fault..*/.stati
0610: 63 20 73 74 72 75 63 74 20 46 61 75 6c 74 49 6e  c struct FaultIn
0620: 6a 65 63 74 6f 72 20 7b 0a 20 20 69 6e 74 20 69  jector {.  int i
0630: 43 6f 75 6e 74 64 6f 77 6e 3b 20 20 20 2f 2a 20  Countdown;   /* 
0640: 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  Number of pendin
0650: 67 20 73 75 63 63 65 73 73 65 73 20 62 65 66 6f  g successes befo
0660: 72 65 20 77 65 20 68 69 74 20 61 20 66 61 69 6c  re we hit a fail
0670: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ure */.  int nRe
0680: 70 65 61 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75  peat;      /* Nu
0690: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 6f  mber of times to
06a0: 20 72 65 70 65 61 74 20 74 68 65 20 66 61 69 6c   repeat the fail
06b0: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 65  ure */.  int nBe
06c0: 6e 69 67 6e 3b 20 20 20 20 20 20 2f 2a 20 4e 75  nign;      /* Nu
06d0: 6d 62 65 72 20 6f 66 20 62 65 6e 69 67 6e 20 66  mber of benign f
06e0: 61 69 6c 75 72 65 73 20 73 65 65 6e 20 73 69 6e  ailures seen sin
06f0: 63 65 20 6c 61 73 74 20 63 6f 6e 66 69 67 20 2a  ce last config *
0700: 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 3b 20 20  /.  int nFail;  
0710: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0720: 6f 66 20 66 61 69 6c 75 72 65 73 20 73 65 65 6e  of failures seen
0730: 20 73 69 6e 63 65 20 6c 61 73 74 20 63 6f 6e 66   since last conf
0740: 69 67 20 2a 2f 0a 20 20 75 38 20 65 6e 61 62 6c  ig */.  u8 enabl
0750: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
0760: 65 20 69 66 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  e if enabled */.
0770: 20 20 75 38 20 62 65 6e 69 67 6e 3b 20 20 20 20    u8 benign;    
0780: 20 20 20 20 2f 2a 20 54 75 72 65 20 69 66 20 6e      /* Ture if n
0790: 65 78 74 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  ext failure will
07a0: 20 62 65 20 62 65 6e 69 67 6e 20 2a 2f 0a 7d 20   be benign */.} 
07b0: 61 46 61 75 6c 74 5b 53 51 4c 49 54 45 5f 46 41  aFault[SQLITE_FA
07c0: 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 43 4f 55 4e  ULTINJECTOR_COUN
07d0: 54 5d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  T];../*.** This 
07e0: 72 6f 75 74 69 6e 65 20 63 6f 6e 66 69 67 75 72  routine configur
07f0: 65 73 20 61 6e 64 20 65 6e 61 62 6c 65 73 20 61  es and enables a
0800: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 6f 72 2e   fault injector.
0810: 20 20 41 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69    After.** calli
0820: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  ng this routine,
0830: 20 61 46 61 75 6c 74 53 74 65 70 28 29 20 77 69   aFaultStep() wi
0840: 6c 6c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20  ll return false 
0850: 28 7a 65 72 6f 29 0a 2a 2a 20 6e 44 65 6c 61 79  (zero).** nDelay
0860: 20 74 69 6d 65 73 2c 20 74 68 65 6e 20 69 74 20   times, then it 
0870: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
0880: 20 6e 52 65 70 65 61 74 20 74 69 6d 65 73 2c 0a   nRepeat times,.
0890: 2a 2a 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  ** then it will 
08a0: 61 67 61 69 6e 20 62 65 67 69 6e 20 72 65 74 75  again begin retu
08b0: 72 6e 69 6e 67 20 66 61 6c 73 65 2e 0a 2a 2f 0a  rning false..*/.
08c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 61 75 6c  void sqlite3Faul
08d0: 74 43 6f 6e 66 69 67 28 69 6e 74 20 69 64 2c 20  tConfig(int id, 
08e0: 69 6e 74 20 6e 44 65 6c 61 79 2c 20 69 6e 74 20  int nDelay, int 
08f0: 6e 52 65 70 65 61 74 29 7b 0a 20 20 61 73 73 65  nRepeat){.  asse
0900: 72 74 28 20 69 64 3e 3d 30 20 26 26 20 69 64 3c  rt( id>=0 && id<
0910: 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45  SQLITE_FAULTINJE
0920: 43 54 4f 52 5f 43 4f 55 4e 54 20 29 3b 0a 20 20  CTOR_COUNT );.  
0930: 61 46 61 75 6c 74 5b 69 64 5d 2e 69 43 6f 75 6e  aFault[id].iCoun
0940: 74 64 6f 77 6e 20 3d 20 6e 44 65 6c 61 79 3b 0a  tdown = nDelay;.
0950: 20 20 61 46 61 75 6c 74 5b 69 64 5d 2e 6e 52 65    aFault[id].nRe
0960: 70 65 61 74 20 3d 20 6e 52 65 70 65 61 74 3b 0a  peat = nRepeat;.
0970: 20 20 61 46 61 75 6c 74 5b 69 64 5d 2e 6e 42 65    aFault[id].nBe
0980: 6e 69 67 6e 20 3d 20 30 3b 0a 20 20 61 46 61 75  nign = 0;.  aFau
0990: 6c 74 5b 69 64 5d 2e 6e 46 61 69 6c 20 3d 20 30  lt[id].nFail = 0
09a0: 3b 0a 20 20 61 46 61 75 6c 74 5b 69 64 5d 2e 65  ;.  aFault[id].e
09b0: 6e 61 62 6c 65 20 3d 20 6e 44 65 6c 61 79 3e 3d  nable = nDelay>=
09c0: 30 3b 0a 20 20 61 46 61 75 6c 74 5b 69 64 5d 2e  0;.  aFault[id].
09d0: 62 65 6e 69 67 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f  benign = 0;.}../
09e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
09f0: 6e 75 6d 62 65 72 20 6f 66 20 66 61 75 6c 74 73  number of faults
0a00: 20 28 62 6f 74 68 20 68 61 72 64 20 61 6e 64 20   (both hard and 
0a10: 62 65 6e 69 67 6e 20 66 61 75 6c 74 73 29 20 74  benign faults) t
0a20: 68 61 74 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  hat have.** occu
0a30: 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 69  rred since the i
0a40: 6e 6a 65 63 74 6f 72 20 77 61 73 20 6c 61 73 74  njector was last
0a50: 20 63 6f 6e 66 69 67 75 72 65 64 2e 0a 2a 2f 0a   configured..*/.
0a60: 69 6e 74 20 73 71 6c 69 74 65 33 46 61 75 6c 74  int sqlite3Fault
0a70: 46 61 69 6c 75 72 65 73 28 69 6e 74 20 69 64 29  Failures(int id)
0a80: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 3e 3d  {.  assert( id>=
0a90: 30 20 26 26 20 69 64 3c 53 51 4c 49 54 45 5f 46  0 && id<SQLITE_F
0aa0: 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 43 4f 55  AULTINJECTOR_COU
0ab0: 4e 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  NT );.  return a
0ac0: 46 61 75 6c 74 5b 69 64 5d 2e 6e 46 61 69 6c 3b  Fault[id].nFail;
0ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0ae0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
0af0: 65 6e 69 67 6e 20 66 61 75 6c 74 73 20 74 68 61  enign faults tha
0b00: 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  t have occurred 
0b10: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 69 6e 6a  since the.** inj
0b20: 65 63 74 6f 72 20 77 61 73 20 6c 61 73 74 20 63  ector was last c
0b30: 6f 6e 66 69 67 75 72 65 64 2e 0a 2a 2f 0a 69 6e  onfigured..*/.in
0b40: 74 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65  t sqlite3FaultBe
0b50: 6e 69 67 6e 46 61 69 6c 75 72 65 73 28 69 6e 74  nignFailures(int
0b60: 20 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20   id){.  assert( 
0b70: 69 64 3e 3d 30 20 26 26 20 69 64 3c 53 51 4c 49  id>=0 && id<SQLI
0b80: 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52  TE_FAULTINJECTOR
0b90: 5f 43 4f 55 4e 54 20 29 3b 0a 20 20 72 65 74 75  _COUNT );.  retu
0ba0: 72 6e 20 61 46 61 75 6c 74 5b 69 64 5d 2e 6e 42  rn aFault[id].nB
0bb0: 65 6e 69 67 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  enign;.}../*.** 
0bc0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
0bd0: 72 20 6f 66 20 73 75 63 63 65 73 73 65 73 20 74  r of successes t
0be0: 68 61 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 62  hat will occur b
0bf0: 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 20 66  efore the next f
0c00: 61 69 6c 75 72 65 2e 0a 2a 2a 20 49 66 20 6e 6f  ailure..** If no
0c10: 20 66 61 69 6c 75 72 65 73 20 61 72 65 20 73 63   failures are sc
0c20: 68 65 64 75 6c 65 64 2c 20 72 65 74 75 72 6e 20  heduled, return 
0c30: 2d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  -1..*/.int sqlit
0c40: 65 33 46 61 75 6c 74 50 65 6e 64 69 6e 67 28 69  e3FaultPending(i
0c50: 6e 74 20 69 64 29 7b 0a 20 20 61 73 73 65 72 74  nt id){.  assert
0c60: 28 20 69 64 3e 3d 30 20 26 26 20 69 64 3c 53 51  ( id>=0 && id<SQ
0c70: 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54  LITE_FAULTINJECT
0c80: 4f 52 5f 43 4f 55 4e 54 20 29 3b 0a 20 20 69 66  OR_COUNT );.  if
0c90: 28 20 61 46 61 75 6c 74 5b 69 64 5d 2e 65 6e 61  ( aFault[id].ena
0ca0: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
0cb0: 6e 20 61 46 61 75 6c 74 5b 69 64 5d 2e 69 43 6f  n aFault[id].iCo
0cc0: 75 6e 74 64 6f 77 6e 3b 0a 20 20 7d 65 6c 73 65  untdown;.  }else
0cd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
0ce0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41  .  }.}../* .** A
0cf0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
0d00: 65 20 63 61 75 73 65 73 20 73 75 62 73 65 71 75  e causes subsequ
0d10: 65 6e 74 20 66 61 75 6c 74 73 20 74 6f 20 62 65  ent faults to be
0d20: 20 65 69 74 68 65 72 20 62 65 6e 69 67 6e 0a 2a   either benign.*
0d30: 2a 20 6f 72 20 68 61 72 64 20 28 6e 6f 74 20 62  * or hard (not b
0d40: 65 6e 69 67 6e 29 2c 20 61 63 63 6f 72 64 69 6e  enign), accordin
0d50: 67 20 74 6f 20 74 68 65 20 22 65 6e 61 62 6c 65  g to the "enable
0d60: 22 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  " parameter..**.
0d70: 2a 2a 20 4d 6f 73 74 20 66 61 75 6c 74 73 20 61  ** Most faults a
0d80: 72 65 20 68 61 72 64 2e 20 20 49 6e 20 6f 74 68  re hard.  In oth
0d90: 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 20 66  er words, most f
0da0: 61 75 6c 74 73 20 63 61 75 73 65 0a 2a 2a 20 61  aults cause.** a
0db0: 6e 20 65 72 72 6f 72 20 74 6f 20 62 65 20 70 72  n error to be pr
0dc0: 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20 75 70  opagated back up
0dd0: 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74   to the applicat
0de0: 69 6f 6e 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ion interface..*
0df0: 2a 20 48 6f 77 65 76 65 72 2c 20 73 6f 6d 65 74  * However, somet
0e00: 69 6d 65 73 20 61 20 66 61 75 6c 74 20 69 73 20  imes a fault is 
0e10: 65 61 73 69 6c 79 20 72 65 63 6f 76 65 72 61 62  easily recoverab
0e20: 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
0e30: 2c 0a 2a 2a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ,.** if a malloc
0e40: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 72 65 73   fails while res
0e50: 69 7a 69 6e 67 20 61 20 68 61 73 68 20 74 61 62  izing a hash tab
0e60: 6c 65 2c 20 74 68 69 73 20 69 73 20 63 6f 6d 70  le, this is comp
0e70: 6c 65 74 65 6c 79 0a 2a 2a 20 72 65 63 6f 76 65  letely.** recove
0e80: 72 61 62 6c 65 20 73 69 6d 70 6c 79 20 62 79 20  rable simply by 
0e90: 6e 6f 74 20 63 61 72 72 79 69 6e 67 20 6f 75 74  not carrying out
0ea0: 20 74 68 65 20 72 65 73 69 7a 65 2e 20 20 54 68   the resize.  Th
0eb0: 65 20 68 61 73 68 20 74 61 62 6c 65 0a 2a 2a 20  e hash table.** 
0ec0: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
0ed0: 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
0ee0: 6c 79 2e 20 20 53 6f 20 61 20 6d 61 6c 6c 6f 63  ly.  So a malloc
0ef0: 20 66 61 69 6c 75 72 65 20 64 75 72 69 6e 67 0a   failure during.
0f00: 2a 2a 20 61 20 68 61 73 68 20 74 61 62 6c 65 20  ** a hash table 
0f10: 72 65 73 69 7a 65 20 69 73 20 61 20 62 65 6e 69  resize is a beni
0f20: 67 6e 20 66 61 75 6c 74 2e 20 20 0a 2a 2f 0a 76  gn fault.  .*/.v
0f30: 6f 69 64 20 73 71 6c 69 74 65 33 46 61 75 6c 74  oid sqlite3Fault
0f40: 42 65 6e 69 67 6e 28 69 6e 74 20 69 64 2c 20 69  Benign(int id, i
0f50: 6e 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 61 73  nt enable){.  as
0f60: 73 65 72 74 28 20 69 64 3e 3d 30 20 26 26 20 69  sert( id>=0 && i
0f70: 64 3c 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e  d<SQLITE_FAULTIN
0f80: 4a 45 43 54 4f 52 5f 43 4f 55 4e 54 20 29 3b 0a  JECTOR_COUNT );.
0f90: 20 20 61 46 61 75 6c 74 5b 69 64 5d 2e 62 65 6e    aFault[id].ben
0fa0: 69 67 6e 20 3d 20 65 6e 61 62 6c 65 3b 0a 7d 0a  ign = enable;.}.
0fb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0fc0: 69 6e 65 20 65 78 69 73 74 73 20 61 73 20 61 20  ine exists as a 
0fd0: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
0fe0: 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77  reakpoint that w
0ff0: 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 6f 6e 20 61  ill.** fire on a
1000: 6e 79 20 73 69 6d 75 6c 61 74 65 64 20 66 61 75  ny simulated fau
1010: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lt..*/.static vo
1020: 69 64 20 73 71 6c 69 74 65 33 46 61 75 6c 74 28  id sqlite3Fault(
1030: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
1040: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63  int cnt = 0;.  c
1050: 6e 74 2b 2b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nt++;.}.../*.** 
1060: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1070: 61 20 66 61 75 6c 74 20 73 68 6f 75 6c 64 20 62  a fault should b
1080: 65 20 73 69 6d 75 6c 61 74 65 64 2e 20 20 52 65  e simulated.  Re
1090: 74 75 72 6e 20 74 72 75 65 20 74 6f 20 73 69 6d  turn true to sim
10a0: 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 66 61 75  ulate.** the fau
10b0: 6c 74 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  lt.  Return fals
10c0: 65 20 69 66 20 74 68 65 20 66 61 75 6c 74 20 73  e if the fault s
10d0: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 69 6d  hould not be sim
10e0: 75 6c 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ulated..*/.int s
10f0: 71 6c 69 74 65 33 46 61 75 6c 74 53 74 65 70 28  qlite3FaultStep(
1100: 69 6e 74 20 69 64 29 7b 0a 20 20 61 73 73 65 72  int id){.  asser
1110: 74 28 20 69 64 3e 3d 30 20 26 26 20 69 64 3c 53  t( id>=0 && id<S
1120: 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43  QLITE_FAULTINJEC
1130: 54 4f 52 5f 43 4f 55 4e 54 20 29 3b 0a 20 20 69  TOR_COUNT );.  i
1140: 66 28 20 6c 69 6b 65 6c 79 28 21 61 46 61 75 6c  f( likely(!aFaul
1150: 74 5b 69 64 5d 2e 65 6e 61 62 6c 65 29 20 29 7b  t[id].enable) ){
1160: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1170: 20 7d 0a 20 20 69 66 28 20 61 46 61 75 6c 74 5b   }.  if( aFault[
1180: 69 64 5d 2e 69 43 6f 75 6e 74 64 6f 77 6e 3e 30  id].iCountdown>0
1190: 20 29 7b 0a 20 20 20 20 61 46 61 75 6c 74 5b 69   ){.    aFault[i
11a0: 64 5d 2e 69 43 6f 75 6e 74 64 6f 77 6e 2d 2d 3b  d].iCountdown--;
11b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
11c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 61 75 6c   }.  sqlite3Faul
11d0: 74 28 29 3b 0a 20 20 61 46 61 75 6c 74 5b 69 64  t();.  aFault[id
11e0: 5d 2e 6e 46 61 69 6c 2b 2b 3b 0a 20 20 69 66 28  ].nFail++;.  if(
11f0: 20 61 46 61 75 6c 74 5b 69 64 5d 2e 62 65 6e 69   aFault[id].beni
1200: 67 6e 20 29 7b 0a 20 20 20 20 61 46 61 75 6c 74  gn ){.    aFault
1210: 5b 69 64 5d 2e 6e 42 65 6e 69 67 6e 2b 2b 3b 0a  [id].nBenign++;.
1220: 20 20 7d 0a 20 20 61 46 61 75 6c 74 5b 69 64 5d    }.  aFault[id]
1230: 2e 6e 52 65 70 65 61 74 2d 2d 3b 0a 20 20 69 66  .nRepeat--;.  if
1240: 28 20 61 46 61 75 6c 74 5b 69 64 5d 2e 6e 52 65  ( aFault[id].nRe
1250: 70 65 61 74 3c 3d 30 20 29 7b 0a 20 20 20 20 61  peat<=0 ){.    a
1260: 46 61 75 6c 74 5b 69 64 5d 2e 65 6e 61 62 6c 65  Fault[id].enable
1270: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1280: 72 6e 20 31 3b 20 20 0a 7d 0a 0a 23 65 6e 64 69  rn 1;  .}..#endi
1290: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12a0: 5f 54 45 53 54 4c 4f 47 49 43 20 2a 2f 0a        _TESTLOGIC */.