/ Hex Artifact Content
Login

Artifact 3638519d1e0b82bccfafcb9f5ff491918b28f8e1:


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 0a 2a 2a 20 24 49 64 3a 20 66 61 75 6c  .**.** $Id: faul
0180: 74 2e 63 2c 76 20 31 2e 31 30 20 32 30 30 38 2f  t.c,v 1.10 2008/
0190: 30 36 2f 32 32 20 31 32 3a 33 37 3a 35 38 20 64  06/22 12:37:58 d
01a0: 72 68 20 45 78 70 20 24 0a 2a 2f 0a 0a 2f 2a 0a  rh Exp $.*/../*.
01b0: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
01c0: 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 73 75  tains code to su
01d0: 70 70 6f 72 74 20 74 68 65 20 63 6f 6e 63 65 70  pport the concep
01e0: 74 20 6f 66 20 22 62 65 6e 69 67 6e 22 20 0a 2a  t of "benign" .*
01f0: 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  * malloc failure
0200: 73 20 28 77 68 65 6e 20 74 68 65 20 78 4d 61 6c  s (when the xMal
0210: 6c 6f 63 28 29 20 6f 72 20 78 52 65 61 6c 6c 6f  loc() or xReallo
0220: 63 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  c() method of th
0230: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d  e.** sqlite3_mem
0240: 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75  _methods structu
0250: 72 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f  re fails to allo
0260: 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
0270: 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6e 64 20 72 65  memory.** and re
0280: 74 75 72 6e 73 20 30 29 2e 20 0a 2a 2a 0a 2a 2a  turns 0). .**.**
0290: 20 4d 6f 73 74 20 6d 61 6c 6c 6f 63 20 66 61 69   Most malloc fai
02a0: 6c 75 72 65 73 20 61 72 65 20 6e 6f 6e 2d 62 65  lures are non-be
02b0: 6e 69 67 6e 2e 20 41 66 74 65 72 20 74 68 65 79  nign. After they
02c0: 20 6f 63 63 75 72 2c 20 53 51 4c 69 74 65 0a 2a   occur, SQLite.*
02d0: 2a 20 61 62 61 6e 64 6f 6e 73 20 74 68 65 20 63  * abandons the c
02e0: 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e  urrent operation
02f0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
0300: 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61  error code (usua
0310: 6c 6c 79 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  lly.** SQLITE_NO
0320: 4d 45 4d 29 20 74 6f 20 74 68 65 20 75 73 65 72  MEM) to the user
0330: 2e 20 48 6f 77 65 76 65 72 2c 20 73 6f 6d 65 74  . However, somet
0340: 69 6d 65 73 20 61 20 66 61 75 6c 74 20 69 73 20  imes a fault is 
0350: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a  not necessarily.
0360: 2a 2a 20 66 61 74 61 6c 2e 20 46 6f 72 20 65 78  ** fatal. For ex
0370: 61 6d 70 6c 65 2c 20 69 66 20 61 20 6d 61 6c 6c  ample, if a mall
0380: 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 72  oc fails while r
0390: 65 73 69 7a 69 6e 67 20 61 20 68 61 73 68 20 74  esizing a hash t
03a0: 61 62 6c 65 2c 20 74 68 69 73 20 0a 2a 2a 20 69  able, this .** i
03b0: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 65 63  s completely rec
03c0: 6f 76 65 72 61 62 6c 65 20 73 69 6d 70 6c 79 20  overable simply 
03d0: 62 79 20 6e 6f 74 20 63 61 72 72 79 69 6e 67 20  by not carrying 
03e0: 6f 75 74 20 74 68 65 20 72 65 73 69 7a 65 2e 20  out the resize. 
03f0: 54 68 65 20 0a 2a 2a 20 68 61 73 68 20 74 61 62  The .** hash tab
0400: 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  le will continue
0410: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72   to function nor
0420: 6d 61 6c 6c 79 2e 20 20 53 6f 20 61 20 6d 61 6c  mally.  So a mal
0430: 6c 6f 63 20 66 61 69 6c 75 72 65 20 0a 2a 2a 20  loc failure .** 
0440: 64 75 72 69 6e 67 20 61 20 68 61 73 68 20 74 61  during a hash ta
0450: 62 6c 65 20 72 65 73 69 7a 65 20 69 73 20 61 20  ble resize is a 
0460: 62 65 6e 69 67 6e 20 66 61 75 6c 74 2e 0a 2a 2f  benign fault..*/
0470: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ..#include "sqli
0480: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e 64 65  teInt.h"..#ifnde
0490: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55  f SQLITE_OMIT_BU
04a0: 49 4c 54 49 4e 5f 54 45 53 54 0a 0a 2f 2a 0a 2a  ILTIN_TEST../*.*
04b0: 2a 20 47 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  * Global variabl
04c0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  es..*/.static st
04d0: 72 75 63 74 20 42 65 6e 69 67 6e 4d 61 6c 6c 6f  ruct BenignMallo
04e0: 63 48 6f 6f 6b 73 20 7b 0a 20 20 76 6f 69 64 20  cHooks {.  void 
04f0: 28 2a 78 42 65 6e 69 67 6e 42 65 67 69 6e 29 28  (*xBenignBegin)(
0500: 76 6f 69 64 29 3b 0a 20 20 76 6f 69 64 20 28 2a  void);.  void (*
0510: 78 42 65 6e 69 67 6e 45 6e 64 29 28 76 6f 69 64  xBenignEnd)(void
0520: 29 3b 0a 7d 20 68 6f 6f 6b 73 3b 0a 0a 2f 2a 0a  );.} hooks;../*.
0530: 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b  ** Register hook
0540: 73 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 73  s to call when s
0550: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
0560: 6e 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 0a 2a 2a  nMalloc() and.**
0570: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
0580: 6e 4d 61 6c 6c 6f 63 28 29 20 61 72 65 20 63 61  nMalloc() are ca
0590: 6c 6c 65 64 2c 20 72 65 73 70 65 63 74 69 76 65  lled, respective
05a0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
05b0: 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
05c0: 6f 6f 6b 73 28 0a 20 20 76 6f 69 64 20 28 2a 78  ooks(.  void (*x
05d0: 42 65 6e 69 67 6e 42 65 67 69 6e 29 28 76 6f 69  BenignBegin)(voi
05e0: 64 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 42 65  d),.  void (*xBe
05f0: 6e 69 67 6e 45 6e 64 29 28 76 6f 69 64 29 0a 29  nignEnd)(void).)
0600: 7b 0a 20 20 68 6f 6f 6b 73 2e 78 42 65 6e 69 67  {.  hooks.xBenig
0610: 6e 42 65 67 69 6e 20 3d 20 78 42 65 6e 69 67 6e  nBegin = xBenign
0620: 42 65 67 69 6e 3b 0a 20 20 68 6f 6f 6b 73 2e 78  Begin;.  hooks.x
0630: 42 65 6e 69 67 6e 45 6e 64 20 3d 20 78 42 65 6e  BenignEnd = xBen
0640: 69 67 6e 45 6e 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ignEnd;.}../*.**
0650: 20 54 68 69 73 20 28 73 71 6c 69 74 65 33 45 6e   This (sqlite3En
0660: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 29  dBenignMalloc())
0670: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 53 51   is called by SQ
0680: 4c 69 74 65 20 63 6f 64 65 20 74 6f 20 69 6e 64  Lite code to ind
0690: 69 63 61 74 65 20 74 68 61 74 0a 2a 2a 20 73 75  icate that.** su
06a0: 62 73 65 71 75 65 6e 74 20 6d 61 6c 6c 6f 63 20  bsequent malloc 
06b0: 66 61 69 6c 75 72 65 73 20 61 72 65 20 62 65 6e  failures are ben
06c0: 69 67 6e 2e 20 41 20 63 61 6c 6c 20 74 6f 20 73  ign. A call to s
06d0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
06e0: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 69 6e 64 69 63  alloc().** indic
06f0: 61 74 65 73 20 74 68 61 74 20 73 75 62 73 65 71  ates that subseq
0700: 75 65 6e 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  uent malloc fail
0710: 75 72 65 73 20 61 72 65 20 6e 6f 6e 2d 62 65 6e  ures are non-ben
0720: 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ign..*/.void sql
0730: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
0740: 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20 69  alloc(void){.  i
0750: 66 28 20 68 6f 6f 6b 73 2e 78 42 65 6e 69 67 6e  f( hooks.xBenign
0760: 42 65 67 69 6e 20 29 7b 0a 20 20 20 20 68 6f 6f  Begin ){.    hoo
0770: 6b 73 2e 78 42 65 6e 69 67 6e 42 65 67 69 6e 28  ks.xBenignBegin(
0780: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
0790: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
07a0: 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20 69 66  lloc(void){.  if
07b0: 28 20 68 6f 6f 6b 73 2e 78 42 65 6e 69 67 6e 45  ( hooks.xBenignE
07c0: 6e 64 20 29 7b 0a 20 20 20 20 68 6f 6f 6b 73 2e  nd ){.    hooks.
07d0: 78 42 65 6e 69 67 6e 45 6e 64 28 29 3b 0a 20 20  xBenignEnd();.  
07e0: 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 20 20 2f 2a  }.}..#endif   /*
07f0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
0800: 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
0810: 54 20 2a 2f 0a                                   T */.