/ Hex Artifact Content
Login

Artifact 685561d2f1602042e349aea5d7a88c3f10a63454:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 65 6d  ******.**.** Mem
0180: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
0190: 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 74 68  unctions used th
01a0: 72 6f 75 67 68 6f 75 74 20 73 71 6c 69 74 65 2e  roughout sqlite.
01b0: 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 6d 61 6c 6c  .**.** $Id: mall
01c0: 6f 63 2e 63 2c 76 20 31 2e 36 36 20 32 30 30 39  oc.c,v 1.66 2009
01d0: 2f 30 37 2f 31 37 20 31 31 3a 34 34 3a 30 37 20  /07/17 11:44:07 
01e0: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
01f0: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0200: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h".#include <st
0210: 64 61 72 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  darg.h>../*.** T
0220: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0230: 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79   when the memory
0240: 20 61 6c 6c 6f 63 61 74 6f 72 20 73 65 65 73 20   allocator sees 
0250: 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 6f 74 61  that the.** tota
0260: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
0270: 69 6f 6e 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ion is about to 
0280: 65 78 63 65 65 64 20 74 68 65 20 73 6f 66 74 20  exceed the soft 
0290: 68 65 61 70 0a 2a 2a 20 6c 69 6d 69 74 2e 0a 2a  heap.** limit..*
02a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f  /.static void so
02b0: 66 74 48 65 61 70 4c 69 6d 69 74 45 6e 66 6f 72  ftHeapLimitEnfor
02c0: 63 65 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  cer(.  void *Not
02d0: 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74 65 33  Used, .  sqlite3
02e0: 5f 69 6e 74 36 34 20 4e 6f 74 55 73 65 64 32 2c  _int64 NotUsed2,
02f0: 0a 20 20 69 6e 74 20 61 6c 6c 6f 63 53 69 7a 65  .  int allocSize
0300: 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
0310: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
0320: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73 71   NotUsed2);.  sq
0330: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
0340: 6d 6f 72 79 28 61 6c 6c 6f 63 53 69 7a 65 29 3b  mory(allocSize);
0350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
0360: 65 20 73 6f 66 74 20 68 65 61 70 2d 73 69 7a 65  e soft heap-size
0370: 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65 20 6c   limit for the l
0380: 69 62 72 61 72 79 2e 20 50 61 73 73 69 6e 67 20  ibrary. Passing 
0390: 61 20 7a 65 72 6f 20 6f 72 20 0a 2a 2a 20 6e 65  a zero or .** ne
03a0: 67 61 74 69 76 65 20 76 61 6c 75 65 20 69 6e 64  gative value ind
03b0: 69 63 61 74 65 73 20 6e 6f 20 6c 69 6d 69 74 2e  icates no limit.
03c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
03d0: 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
03e0: 28 69 6e 74 20 6e 29 7b 0a 20 20 73 71 6c 69 74  (int n){.  sqlit
03f0: 65 33 5f 75 69 6e 74 36 34 20 69 4c 69 6d 69 74  e3_uint64 iLimit
0400: 3b 0a 20 20 69 6e 74 20 6f 76 65 72 61 67 65 3b  ;.  int overage;
0410: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
0420: 20 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20    iLimit = 0;.  
0430: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4c 69 6d 69  }else{.    iLimi
0440: 74 20 3d 20 6e 3b 0a 20 20 7d 0a 23 69 66 6e 64  t = n;.  }.#ifnd
0450: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
0460: 55 54 4f 49 4e 49 54 0a 20 20 73 71 6c 69 74 65  UTOINIT.  sqlite
0470: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
0480: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 4c 69  #endif.  if( iLi
0490: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  mit>0 ){.    sql
04a0: 69 74 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d 28  ite3MemoryAlarm(
04b0: 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 45 6e 66  softHeapLimitEnf
04c0: 6f 72 63 65 72 2c 20 30 2c 20 69 4c 69 6d 69 74  orcer, 0, iLimit
04d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
04e0: 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 41 6c 61  sqlite3MemoryAla
04f0: 72 6d 28 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  rm(0, 0, 0);.  }
0500: 0a 20 20 6f 76 65 72 61 67 65 20 3d 20 28 69 6e  .  overage = (in
0510: 74 29 28 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t)(sqlite3_memor
0520: 79 5f 75 73 65 64 28 29 20 2d 20 28 69 36 34 29  y_used() - (i64)
0530: 6e 29 3b 0a 20 20 69 66 28 20 6f 76 65 72 61 67  n);.  if( overag
0540: 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e>0 ){.    sqlit
0550: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
0560: 79 28 6f 76 65 72 61 67 65 29 3b 0a 20 20 7d 0a  y(overage);.  }.
0570: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
0580: 20 74 6f 20 72 65 6c 65 61 73 65 20 75 70 20 74   to release up t
0590: 6f 20 6e 20 62 79 74 65 73 20 6f 66 20 6e 6f 6e  o n bytes of non
05a0: 2d 65 73 73 65 6e 74 69 61 6c 20 6d 65 6d 6f 72  -essential memor
05b0: 79 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 68  y currently.** h
05c0: 65 6c 64 20 62 79 20 53 51 4c 69 74 65 2e 20 41  eld by SQLite. A
05d0: 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20 6e 6f 6e  n example of non
05e0: 2d 65 73 73 65 6e 74 69 61 6c 20 6d 65 6d 6f 72  -essential memor
05f0: 79 20 69 73 20 6d 65 6d 6f 72 79 20 75 73 65 64  y is memory used
0600: 20 74 6f 0a 2a 2a 20 63 61 63 68 65 20 64 61 74   to.** cache dat
0610: 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74  abase pages that
0620: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
0630: 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ly in use..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  t sqlite3_releas
0650: 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 29 7b  e_memory(int n){
0660: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
0670: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
0680: 41 47 45 4d 45 4e 54 0a 20 20 69 6e 74 20 6e 52  AGEMENT.  int nR
0690: 65 74 20 3d 20 30 3b 0a 20 20 6e 52 65 74 20 2b  et = 0;.  nRet +
06a0: 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  = sqlite3PcacheR
06b0: 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 6e 2d 6e  eleaseMemory(n-n
06c0: 52 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Ret);.  return n
06d0: 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  Ret;.#else.  UNU
06e0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 29  SED_PARAMETER(n)
06f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
0700: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  E_OK;.#endif.}..
0710: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
0720: 72 6d 61 74 69 6f 6e 20 6c 6f 63 61 6c 20 74 6f  rmation local to
0730: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
0740: 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d  cation subsystem
0750: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
0760: 54 45 5f 57 53 44 20 73 74 72 75 63 74 20 4d 65  TE_WSD struct Me
0770: 6d 30 47 6c 6f 62 61 6c 20 7b 0a 20 20 2f 2a 20  m0Global {.  /* 
0780: 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  Number of free p
0790: 61 67 65 73 20 66 6f 72 20 73 63 72 61 74 63 68  ages for scratch
07a0: 20 61 6e 64 20 70 61 67 65 2d 63 61 63 68 65 20   and page-cache 
07b0: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 33 32 20  memory */.  u32 
07c0: 6e 53 63 72 61 74 63 68 46 72 65 65 3b 0a 20 20  nScratchFree;.  
07d0: 75 33 32 20 6e 50 61 67 65 46 72 65 65 3b 0a 0a  u32 nPageFree;..
07e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
07f0: 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  *mutex;         
0800: 2f 2a 20 4d 75 74 65 78 20 74 6f 20 73 65 72 69  /* Mutex to seri
0810: 61 6c 69 7a 65 20 61 63 63 65 73 73 20 2a 2f 0a  alize access */.
0820: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 61  .  /*.  ** The a
0830: 6c 61 72 6d 20 63 61 6c 6c 62 61 63 6b 20 61 6e  larm callback an
0840: 64 20 69 74 73 20 61 72 67 75 6d 65 6e 74 73 2e  d its arguments.
0850: 20 20 54 68 65 20 6d 65 6d 30 2e 6d 75 74 65 78    The mem0.mutex
0860: 20 6c 6f 63 6b 20 77 69 6c 6c 0a 20 20 2a 2a 20   lock will.  ** 
0870: 62 65 20 68 65 6c 64 20 77 68 69 6c 65 20 74 68  be held while th
0880: 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75  e callback is ru
0890: 6e 6e 69 6e 67 2e 20 20 52 65 63 75 72 73 69 76  nning.  Recursiv
08a0: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
08b0: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 75 62  * the memory sub
08c0: 73 79 73 74 65 6d 20 61 72 65 20 61 6c 6c 6f 77  system are allow
08d0: 65 64 2c 20 62 75 74 20 6e 6f 20 6e 65 77 20 63  ed, but no new c
08e0: 61 6c 6c 62 61 63 6b 73 20 77 69 6c 6c 20 62 65  allbacks will be
08f0: 0a 20 20 2a 2a 20 69 73 73 75 65 64 2e 0a 20 20  .  ** issued..  
0900: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
0910: 36 34 20 61 6c 61 72 6d 54 68 72 65 73 68 6f 6c  64 alarmThreshol
0920: 64 3b 0a 20 20 76 6f 69 64 20 28 2a 61 6c 61 72  d;.  void (*alar
0930: 6d 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  mCallback)(void*
0940: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c  , sqlite3_int64,
0950: 69 6e 74 29 3b 0a 20 20 76 6f 69 64 20 2a 61 6c  int);.  void *al
0960: 61 72 6d 41 72 67 3b 0a 0a 20 20 2f 2a 0a 20 20  armArg;..  /*.  
0970: 2a 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 74  ** Pointers to t
0980: 68 65 20 65 6e 64 20 6f 66 20 73 71 6c 69 74 65  he end of sqlite
0990: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
09a0: 63 72 61 74 63 68 20 61 6e 64 0a 20 20 2a 2a 20  cratch and.  ** 
09b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
09c0: 66 69 67 2e 70 50 61 67 65 20 74 6f 20 61 20 62  fig.pPage to a b
09d0: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
09e0: 68 61 74 20 72 65 63 6f 72 64 73 0a 20 20 2a 2a  hat records.  **
09f0: 20 77 68 69 63 68 20 70 61 67 65 73 20 61 72 65   which pages are
0a00: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 2a 2f   available..  */
0a10: 0a 20 20 75 33 32 20 2a 61 53 63 72 61 74 63 68  .  u32 *aScratch
0a20: 46 72 65 65 3b 0a 20 20 75 33 32 20 2a 61 50 61  Free;.  u32 *aPa
0a30: 67 65 46 72 65 65 3b 0a 7d 20 6d 65 6d 30 20 3d  geFree;.} mem0 =
0a40: 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 0, 0, 0, 0, 0
0a50: 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 0a 23 64  , 0, 0, 0 };..#d
0a60: 65 66 69 6e 65 20 6d 65 6d 30 20 47 4c 4f 42 41  efine mem0 GLOBA
0a70: 4c 28 73 74 72 75 63 74 20 4d 65 6d 30 47 6c 6f  L(struct Mem0Glo
0a80: 62 61 6c 2c 20 6d 65 6d 30 29 0a 0a 2f 2a 0a 2a  bal, mem0)../*.*
0a90: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
0aa0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0ab0: 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f  on subsystem..*/
0ac0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .int sqlite3Mall
0ad0: 6f 63 49 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  ocInit(void){.  
0ae0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
0af0: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f  lConfig.m.xMallo
0b00: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c==0 ){.    sqli
0b10: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
0b20: 28 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ();.  }.  memset
0b30: 28 26 6d 65 6d 30 2c 20 30 2c 20 73 69 7a 65 6f  (&mem0, 0, sizeo
0b40: 66 28 6d 65 6d 30 29 29 3b 0a 20 20 69 66 28 20  f(mem0));.  if( 
0b50: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0b60: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
0b70: 7b 0a 20 20 20 20 6d 65 6d 30 2e 6d 75 74 65 78  {.    mem0.mutex
0b80: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
0b90: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
0ba0: 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 0a 20  X_STATIC_MEM);. 
0bb0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
0bc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63  GlobalConfig.pSc
0bd0: 72 61 74 63 68 20 26 26 20 73 71 6c 69 74 65 33  ratch && sqlite3
0be0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
0bf0: 63 72 61 74 63 68 3e 3d 31 30 30 0a 20 20 20 20  cratch>=100.    
0c00: 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
0c10: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
0c20: 68 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h>=0 ){.    int 
0c30: 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  i;.    sqlite3Gl
0c40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72  obalConfig.szScr
0c50: 61 74 63 68 20 3d 20 52 4f 55 4e 44 44 4f 57 4e  atch = ROUNDDOWN
0c60: 38 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  8(sqlite3GlobalC
0c70: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 2d  onfig.szScratch-
0c80: 34 29 3b 0a 20 20 20 20 6d 65 6d 30 2e 61 53 63  4);.    mem0.aSc
0c90: 72 61 74 63 68 46 72 65 65 20 3d 20 28 75 33 32  ratchFree = (u32
0ca0: 2a 29 26 28 28 63 68 61 72 2a 29 73 71 6c 69 74  *)&((char*)sqlit
0cb0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
0cc0: 53 63 72 61 74 63 68 29 0a 20 20 20 20 20 20 20  Scratch).       
0cd0: 20 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 69             [sqli
0ce0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0cf0: 73 7a 53 63 72 61 74 63 68 2a 73 71 6c 69 74 65  szScratch*sqlite
0d00: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53  3GlobalConfig.nS
0d10: 63 72 61 74 63 68 5d 3b 0a 20 20 20 20 66 6f 72  cratch];.    for
0d20: 28 69 3d 30 3b 20 69 3c 73 71 6c 69 74 65 33 47  (i=0; i<sqlite3G
0d30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72  lobalConfig.nScr
0d40: 61 74 63 68 3b 20 69 2b 2b 29 7b 20 6d 65 6d 30  atch; i++){ mem0
0d50: 2e 61 53 63 72 61 74 63 68 46 72 65 65 5b 69 5d  .aScratchFree[i]
0d60: 20 3d 20 69 3b 20 7d 0a 20 20 20 20 6d 65 6d 30   = i; }.    mem0
0d70: 2e 6e 53 63 72 61 74 63 68 46 72 65 65 20 3d 20  .nScratchFree = 
0d80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0d90: 66 69 67 2e 6e 53 63 72 61 74 63 68 3b 0a 20 20  fig.nScratch;.  
0da0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
0db0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
0dc0: 53 63 72 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  Scratch = 0;.   
0dd0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
0de0: 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d  nfig.szScratch =
0df0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
0e00: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0e10: 67 2e 70 50 61 67 65 20 26 26 20 73 71 6c 69 74  g.pPage && sqlit
0e20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0e30: 7a 50 61 67 65 3e 3d 35 31 32 0a 20 20 20 20 20  zPage>=512.     
0e40: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
0e50: 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 3e 3d 31  lConfig.nPage>=1
0e60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
0e70: 20 20 20 69 6e 74 20 6f 76 65 72 68 65 61 64 3b     int overhead;
0e80: 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 52 4f  .    int sz = RO
0e90: 55 4e 44 44 4f 57 4e 38 28 73 71 6c 69 74 65 33  UNDDOWN8(sqlite3
0ea0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50  GlobalConfig.szP
0eb0: 61 67 65 29 3b 0a 20 20 20 20 69 6e 74 20 6e 20  age);.    int n 
0ec0: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
0ed0: 6f 6e 66 69 67 2e 6e 50 61 67 65 3b 0a 20 20 20  onfig.nPage;.   
0ee0: 20 6f 76 65 72 68 65 61 64 20 3d 20 28 34 2a 6e   overhead = (4*n
0ef0: 20 2b 20 73 7a 20 2d 20 31 29 2f 73 7a 3b 0a 20   + sz - 1)/sz;. 
0f00: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
0f10: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 2d 3d 20  Config.nPage -= 
0f20: 6f 76 65 72 68 65 61 64 3b 0a 20 20 20 20 6d 65  overhead;.    me
0f30: 6d 30 2e 61 50 61 67 65 46 72 65 65 20 3d 20 28  m0.aPageFree = (
0f40: 75 33 32 2a 29 26 28 28 63 68 61 72 2a 29 73 71  u32*)&((char*)sq
0f50: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0f60: 67 2e 70 50 61 67 65 29 0a 20 20 20 20 20 20 20  g.pPage).       
0f70: 20 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 69             [sqli
0f80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0f90: 73 7a 50 61 67 65 2a 73 71 6c 69 74 65 33 47 6c  szPage*sqlite3Gl
0fa0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
0fb0: 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ];.    for(i=0; 
0fc0: 69 3c 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  i<sqlite3GlobalC
0fd0: 6f 6e 66 69 67 2e 6e 50 61 67 65 3b 20 69 2b 2b  onfig.nPage; i++
0fe0: 29 7b 20 6d 65 6d 30 2e 61 50 61 67 65 46 72 65  ){ mem0.aPageFre
0ff0: 65 5b 69 5d 20 3d 20 69 3b 20 7d 0a 20 20 20 20  e[i] = i; }.    
1000: 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65 20 3d  mem0.nPageFree =
1010: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1020: 6e 66 69 67 2e 6e 50 61 67 65 3b 0a 20 20 7d 65  nfig.nPage;.  }e
1030: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1040: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
1050: 67 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ge = 0;.    sqli
1060: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1070: 73 7a 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  szPage = 0;.  }.
1080: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1090: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
10a0: 49 6e 69 74 28 73 71 6c 69 74 65 33 47 6c 6f 62  Init(sqlite3Glob
10b0: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 70 41 70 70 44  alConfig.m.pAppD
10c0: 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ata);.}../*.** D
10d0: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  einitialize the 
10e0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
10f0: 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a  n subsystem..*/.
1100: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c  void sqlite3Mall
1110: 6f 63 45 6e 64 28 76 6f 69 64 29 7b 0a 20 20 69  ocEnd(void){.  i
1120: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1130: 43 6f 6e 66 69 67 2e 6d 2e 78 53 68 75 74 64 6f  Config.m.xShutdo
1140: 77 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  wn ){.    sqlite
1150: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
1160: 78 53 68 75 74 64 6f 77 6e 28 73 71 6c 69 74 65  xShutdown(sqlite
1170: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
1180: 70 41 70 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20  pAppData);.  }. 
1190: 20 6d 65 6d 73 65 74 28 26 6d 65 6d 30 2c 20 30   memset(&mem0, 0
11a0: 2c 20 73 69 7a 65 6f 66 28 6d 65 6d 30 29 29 3b  , sizeof(mem0));
11b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11c0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
11d0: 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20  emory currently 
11e0: 63 68 65 63 6b 65 64 20 6f 75 74 2e 0a 2a 2f 0a  checked out..*/.
11f0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1200: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
1210: 64 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6e  d(void){.  int n
1220: 2c 20 6d 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , mx;.  sqlite3_
1230: 69 6e 74 36 34 20 72 65 73 3b 0a 20 20 73 71 6c  int64 res;.  sql
1240: 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49  ite3_status(SQLI
1250: 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
1260: 5f 55 53 45 44 2c 20 26 6e 2c 20 26 6d 78 2c 20  _USED, &n, &mx, 
1270: 30 29 3b 0a 20 20 72 65 73 20 3d 20 28 73 71 6c  0);.  res = (sql
1280: 69 74 65 33 5f 69 6e 74 36 34 29 6e 3b 20 20 2f  ite3_int64)n;  /
1290: 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  * Work around bu
12a0: 67 20 69 6e 20 42 6f 72 6c 61 6e 64 20 43 2e 20  g in Borland C. 
12b0: 54 69 63 6b 65 74 20 23 33 32 31 36 20 2a 2f 0a  Ticket #3216 */.
12c0: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
12d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12e0: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
12f0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   of memory that 
1300: 68 61 73 20 65 76 65 72 20 62 65 65 6e 0a 2a 2a  has ever been.**
1310: 20 63 68 65 63 6b 65 64 20 6f 75 74 20 73 69 6e   checked out sin
1320: 63 65 20 65 69 74 68 65 72 20 74 68 65 20 62 65  ce either the be
1330: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
1340: 70 72 6f 63 65 73 73 0a 2a 2a 20 6f 72 20 73 69  process.** or si
1350: 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  nce the most rec
1360: 65 6e 74 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 71  ent reset..*/.sq
1370: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1380: 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77  te3_memory_highw
1390: 61 74 65 72 28 69 6e 74 20 72 65 73 65 74 46 6c  ater(int resetFl
13a0: 61 67 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 6d 78  ag){.  int n, mx
13b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
13c0: 34 20 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  4 res;.  sqlite3
13d0: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
13e0: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
13f0: 44 2c 20 26 6e 2c 20 26 6d 78 2c 20 72 65 73 65  D, &n, &mx, rese
1400: 74 46 6c 61 67 29 3b 0a 20 20 72 65 73 20 3d 20  tFlag);.  res = 
1410: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 6d  (sqlite3_int64)m
1420: 78 3b 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75  x;  /* Work arou
1430: 6e 64 20 62 75 67 20 69 6e 20 42 6f 72 6c 61 6e  nd bug in Borlan
1440: 64 20 43 2e 20 54 69 63 6b 65 74 20 23 33 32 31  d C. Ticket #321
1450: 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 65  6 */.  return re
1460: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  s;.}../*.** Chan
1470: 67 65 20 74 68 65 20 61 6c 61 72 6d 20 63 61 6c  ge the alarm cal
1480: 6c 62 61 63 6b 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lback.*/.int sql
1490: 69 74 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d 28  ite3MemoryAlarm(
14a0: 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61  .  void(*xCallba
14b0: 63 6b 29 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ck)(void *pArg, 
14c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 73  sqlite3_int64 us
14d0: 65 64 2c 69 6e 74 20 4e 29 2c 0a 20 20 76 6f 69  ed,int N),.  voi
14e0: 64 20 2a 70 41 72 67 2c 0a 20 20 73 71 6c 69 74  d *pArg,.  sqlit
14f0: 65 33 5f 69 6e 74 36 34 20 69 54 68 72 65 73 68  e3_int64 iThresh
1500: 6f 6c 64 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  old.){.  sqlite3
1510: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d  _mutex_enter(mem
1520: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 6d 65 6d 30  0.mutex);.  mem0
1530: 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20 3d  .alarmCallback =
1540: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 6d 65   xCallback;.  me
1550: 6d 30 2e 61 6c 61 72 6d 41 72 67 20 3d 20 70 41  m0.alarmArg = pA
1560: 72 67 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d  rg;.  mem0.alarm
1570: 54 68 72 65 73 68 6f 6c 64 20 3d 20 69 54 68 72  Threshold = iThr
1580: 65 73 68 6f 6c 64 3b 0a 20 20 73 71 6c 69 74 65  eshold;.  sqlite
1590: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
15a0: 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  m0.mutex);.  ret
15b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15d0: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
15e0: 0a 2f 2a 0a 2a 2a 20 44 65 70 72 65 63 61 74 65  ./*.** Deprecate
15f0: 64 20 65 78 74 65 72 6e 61 6c 20 69 6e 74 65 72  d external inter
1600: 66 61 63 65 2e 20 20 49 6e 74 65 72 6e 61 6c 2f  face.  Internal/
1610: 63 6f 72 65 20 53 51 4c 69 74 65 20 63 6f 64 65  core SQLite code
1620: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
1630: 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 41 6c 61  sqlite3MemoryAla
1640: 72 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rm..*/.int sqlit
1650: 65 33 5f 6d 65 6d 6f 72 79 5f 61 6c 61 72 6d 28  e3_memory_alarm(
1660: 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61  .  void(*xCallba
1670: 63 6b 29 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ck)(void *pArg, 
1680: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 73  sqlite3_int64 us
1690: 65 64 2c 69 6e 74 20 4e 29 2c 0a 20 20 76 6f 69  ed,int N),.  voi
16a0: 64 20 2a 70 41 72 67 2c 0a 20 20 73 71 6c 69 74  d *pArg,.  sqlit
16b0: 65 33 5f 69 6e 74 36 34 20 69 54 68 72 65 73 68  e3_int64 iThresh
16c0: 6f 6c 64 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  old.){.  return 
16d0: 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 41 6c 61  sqlite3MemoryAla
16e0: 72 6d 28 78 43 61 6c 6c 62 61 63 6b 2c 20 70 41  rm(xCallback, pA
16f0: 72 67 2c 20 69 54 68 72 65 73 68 6f 6c 64 29 3b  rg, iThreshold);
1700: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1710: 20 54 72 69 67 67 65 72 20 74 68 65 20 61 6c 61   Trigger the ala
1720: 72 6d 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm .*/.static vo
1730: 69 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  id sqlite3Malloc
1740: 41 6c 61 72 6d 28 69 6e 74 20 6e 42 79 74 65 29  Alarm(int nByte)
1750: 7b 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  {.  void (*xCall
1760: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 73 71 6c 69  back)(void*,sqli
1770: 74 65 33 5f 69 6e 74 36 34 2c 69 6e 74 29 3b 0a  te3_int64,int);.
1780: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1790: 6e 6f 77 55 73 65 64 3b 0a 20 20 76 6f 69 64 20  nowUsed;.  void 
17a0: 2a 70 41 72 67 3b 0a 20 20 69 66 28 20 6d 65 6d  *pArg;.  if( mem
17b0: 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 3d  0.alarmCallback=
17c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  =0 ) return;.  x
17d0: 43 61 6c 6c 62 61 63 6b 20 3d 20 6d 65 6d 30 2e  Callback = mem0.
17e0: 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 3b 0a 20  alarmCallback;. 
17f0: 20 6e 6f 77 55 73 65 64 20 3d 20 73 71 6c 69 74   nowUsed = sqlit
1800: 65 33 53 74 61 74 75 73 56 61 6c 75 65 28 53 51  e3StatusValue(SQ
1810: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f  LITE_STATUS_MEMO
1820: 52 59 5f 55 53 45 44 29 3b 0a 20 20 70 41 72 67  RY_USED);.  pArg
1830: 20 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d 41 72 67   = mem0.alarmArg
1840: 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61  ;.  mem0.alarmCa
1850: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 73 71  llback = 0;.  sq
1860: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1870: 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  e(mem0.mutex);. 
1880: 20 78 43 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c   xCallback(pArg,
1890: 20 6e 6f 77 55 73 65 64 2c 20 6e 42 79 74 65 29   nowUsed, nByte)
18a0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
18b0: 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74  x_enter(mem0.mut
18c0: 65 78 29 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61 72  ex);.  mem0.alar
18d0: 6d 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  mCallback = xCal
18e0: 6c 62 61 63 6b 3b 0a 20 20 6d 65 6d 30 2e 61 6c  lback;.  mem0.al
18f0: 61 72 6d 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d  armArg = pArg;.}
1900: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 6d 65 6d  ../*.** Do a mem
1910: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77  ory allocation w
1920: 69 74 68 20 73 74 61 74 69 73 74 69 63 73 20 61  ith statistics a
1930: 6e 64 20 61 6c 61 72 6d 73 2e 20 20 41 73 73 75  nd alarms.  Assu
1940: 6d 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69  me the.** lock i
1950: 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a  s already held..
1960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
1970: 6c 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28 69 6e  llocWithAlarm(in
1980: 74 20 6e 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b  t n, void **pp){
1990: 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 3b 0a 20 20  .  int nFull;.  
19a0: 76 6f 69 64 20 2a 70 3b 0a 20 20 61 73 73 65 72  void *p;.  asser
19b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
19c0: 5f 68 65 6c 64 28 6d 65 6d 30 2e 6d 75 74 65 78  _held(mem0.mutex
19d0: 29 20 29 3b 0a 20 20 6e 46 75 6c 6c 20 3d 20 73  ) );.  nFull = s
19e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
19f0: 69 67 2e 6d 2e 78 52 6f 75 6e 64 75 70 28 6e 29  ig.m.xRoundup(n)
1a00: 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 61 74 75  ;.  sqlite3Statu
1a10: 73 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54  sSet(SQLITE_STAT
1a20: 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20  US_MALLOC_SIZE, 
1a30: 6e 29 3b 0a 20 20 69 66 28 20 6d 65 6d 30 2e 61  n);.  if( mem0.a
1a40: 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 21 3d 30 20  larmCallback!=0 
1a50: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 55 73 65 64  ){.    int nUsed
1a60: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 75 73   = sqlite3Status
1a70: 56 61 6c 75 65 28 53 51 4c 49 54 45 5f 53 54 41  Value(SQLITE_STA
1a80: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 29  TUS_MEMORY_USED)
1a90: 3b 0a 20 20 20 20 69 66 28 20 6e 55 73 65 64 2b  ;.    if( nUsed+
1aa0: 6e 46 75 6c 6c 20 3e 3d 20 6d 65 6d 30 2e 61 6c  nFull >= mem0.al
1ab0: 61 72 6d 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a  armThreshold ){.
1ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c        sqlite3Mal
1ad0: 6c 6f 63 41 6c 61 72 6d 28 6e 46 75 6c 6c 29 3b  locAlarm(nFull);
1ae0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d  .    }.  }.  p =
1af0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b00: 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e  nfig.m.xMalloc(n
1b10: 46 75 6c 6c 29 3b 0a 20 20 69 66 28 20 70 3d 3d  Full);.  if( p==
1b20: 30 20 26 26 20 6d 65 6d 30 2e 61 6c 61 72 6d 43  0 && mem0.alarmC
1b30: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  allback ){.    s
1b40: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72  qlite3MallocAlar
1b50: 6d 28 6e 46 75 6c 6c 29 3b 0a 20 20 20 20 70 20  m(nFull);.    p 
1b60: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
1b70: 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28  onfig.m.xMalloc(
1b80: 6e 46 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  nFull);.  }.  if
1b90: 28 20 70 20 29 7b 0a 20 20 20 20 6e 46 75 6c 6c  ( p ){.    nFull
1ba0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1bb0: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 73 71 6c  Size(p);.    sql
1bc0: 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51  ite3StatusAdd(SQ
1bd0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f  LITE_STATUS_MEMO
1be0: 52 59 5f 55 53 45 44 2c 20 6e 46 75 6c 6c 29 3b  RY_USED, nFull);
1bf0: 0a 20 20 7d 0a 20 20 2a 70 70 20 3d 20 70 3b 0a  .  }.  *pp = p;.
1c00: 20 20 72 65 74 75 72 6e 20 6e 46 75 6c 6c 3b 0a    return nFull;.
1c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1c20: 65 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  e memory.  This 
1c30: 72 6f 75 74 69 6e 65 20 69 73 20 6c 69 6b 65 20  routine is like 
1c40: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
1c50: 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
1c60: 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 65 20 6d  ** assumes the m
1c70: 65 6d 6f 72 79 20 73 75 62 73 79 73 74 65 6d 20  emory subsystem 
1c80: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1c90: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2f   initialized..*/
1ca0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 61  .void *sqlite3Ma
1cb0: 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20 76  lloc(int n){.  v
1cc0: 6f 69 64 20 2a 70 3b 0a 20 20 69 66 28 20 6e 3c  oid *p;.  if( n<
1cd0: 3d 30 20 7c 7c 20 6e 3e 3d 30 78 37 66 66 66 66  =0 || n>=0x7ffff
1ce0: 66 30 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20  f00 ){.    /* A 
1cf0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1d00: 6e 20 6f 66 20 61 20 6e 75 6d 62 65 72 20 6f 66  n of a number of
1d10: 20 62 79 74 65 73 20 77 68 69 63 68 20 69 73 20   bytes which is 
1d20: 6e 65 61 72 20 74 68 65 20 6d 61 78 69 6d 75 6d  near the maximum
1d30: 0a 20 20 20 20 2a 2a 20 73 69 67 6e 65 64 20 69  .    ** signed i
1d40: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6d 69 67  nteger value mig
1d50: 68 74 20 63 61 75 73 65 20 61 6e 20 69 6e 74 65  ht cause an inte
1d60: 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 69 6e 73  ger overflow ins
1d70: 69 64 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ide of the.    *
1d80: 2a 20 78 4d 61 6c 6c 6f 63 28 29 2e 20 20 48 65  * xMalloc().  He
1d90: 6e 63 65 20 77 65 20 6c 69 6d 69 74 20 74 68 65  nce we limit the
1da0: 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 74 6f   maximum size to
1db0: 20 30 78 37 66 66 66 66 66 30 30 2c 20 67 69 76   0x7fffff00, giv
1dc0: 69 6e 67 0a 20 20 20 20 2a 2a 20 32 35 35 20 62  ing.    ** 255 b
1dd0: 79 74 65 73 20 6f 66 20 6f 76 65 72 68 65 61 64  ytes of overhead
1de0: 2e 20 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66  .  SQLite itself
1df0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 75 73 65 20   will never use 
1e00: 61 6e 79 74 68 69 6e 67 20 6e 65 61 72 0a 20 20  anything near.  
1e10: 20 20 2a 2a 20 74 68 69 73 20 61 6d 6f 75 6e 74    ** this amount
1e20: 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20  .  The only way 
1e30: 74 6f 20 72 65 61 63 68 20 74 68 65 20 6c 69 6d  to reach the lim
1e40: 69 74 20 69 73 20 77 69 74 68 20 73 71 6c 69 74  it is with sqlit
1e50: 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 20  e3_malloc() */. 
1e60: 20 20 20 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73     p = 0;.  }els
1e70: 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f  e if( sqlite3Glo
1e80: 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74  balConfig.bMemst
1e90: 61 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  at ){.    sqlite
1ea0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65  3_mutex_enter(me
1eb0: 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 6d  m0.mutex);.    m
1ec0: 61 6c 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28 6e  allocWithAlarm(n
1ed0: 2c 20 26 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  , &p);.    sqlit
1ee0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
1ef0: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65  em0.mutex);.  }e
1f00: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
1f10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f20: 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20  .m.xMalloc(n);. 
1f30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
1f40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ../*.** This ver
1f50: 73 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f  sion of the memo
1f60: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1f70: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
1f80: 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 2a 2a 20  application..** 
1f90: 46 69 72 73 74 20 6d 61 6b 65 20 73 75 72 65 20  First make sure 
1fa0: 74 68 65 20 6d 65 6d 6f 72 79 20 73 75 62 73 79  the memory subsy
1fb0: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1fc0: 7a 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  zed, then do the
1fd0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  .** allocation..
1fe0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
1ff0: 5f 6d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a  _malloc(int n){.
2000: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2010: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
2020: 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  f( sqlite3_initi
2030: 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e  alize() ) return
2040: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
2050: 75 72 6e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  urn sqlite3Mallo
2060: 63 28 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  c(n);.}../*.** E
2070: 61 63 68 20 74 68 72 65 61 64 20 6d 61 79 20 6f  ach thread may o
2080: 6e 6c 79 20 68 61 76 65 20 61 20 73 69 6e 67 6c  nly have a singl
2090: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c  e outstanding al
20a0: 6c 6f 63 61 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a  location from.**
20b0: 20 78 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28   xScratchMalloc(
20c0: 29 2e 20 20 57 65 20 76 65 72 69 66 79 20 74 68  ).  We verify th
20d0: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  is constraint in
20e0: 20 74 68 65 20 73 69 6e 67 6c 65 2d 74 68 72 65   the single-thre
20f0: 61 64 65 64 0a 2a 2a 20 63 61 73 65 20 62 79 20  aded.** case by 
2100: 73 65 74 74 69 6e 67 20 73 63 72 61 74 63 68 41  setting scratchA
2110: 6c 6c 6f 63 4f 75 74 20 74 6f 20 31 20 77 68 65  llocOut to 1 whe
2120: 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  n an allocation.
2130: 2a 2a 20 69 73 20 6f 75 74 73 74 61 6e 64 69 6e  ** is outstandin
2140: 67 20 63 6c 65 61 72 69 6e 67 20 69 74 20 77 68  g clearing it wh
2150: 65 6e 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  en the allocatio
2160: 6e 20 69 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 23  n is freed..*/.#
2170: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2180: 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65 66 69  SAFE==0 && !defi
2190: 6e 65 64 28 4e 44 45 42 55 47 29 0a 73 74 61 74  ned(NDEBUG).stat
21a0: 69 63 20 69 6e 74 20 73 63 72 61 74 63 68 41 6c  ic int scratchAl
21b0: 6c 6f 63 4f 75 74 20 3d 20 30 3b 0a 23 65 6e 64  locOut = 0;.#end
21c0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  if.../*.** Alloc
21d0: 61 74 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ate memory that 
21e0: 69 73 20 74 6f 20 62 65 20 75 73 65 64 20 61 6e  is to be used an
21f0: 64 20 72 65 6c 65 61 73 65 64 20 72 69 67 68 74  d released right
2200: 20 61 77 61 79 2e 0a 2a 2a 20 54 68 69 73 20 72   away..** This r
2210: 6f 75 74 69 6e 65 20 69 73 20 73 69 6d 69 6c 61  outine is simila
2220: 72 20 74 6f 20 61 6c 6c 6f 63 61 28 29 20 69 6e  r to alloca() in
2230: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
2240: 69 6e 74 65 6e 64 65 64 0a 2a 2a 20 66 6f 72 20  intended.** for 
2250: 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
2260: 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 69 67 68   the memory migh
2270: 74 20 62 65 20 68 65 6c 64 20 6c 6f 6e 67 2d 74  t be held long-t
2280: 65 72 6d 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  erm.  This.** ro
2290: 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65  utine is intende
22a0: 64 20 74 6f 20 67 65 74 20 6d 65 6d 6f 72 79 20  d to get memory 
22b0: 74 6f 20 6f 6c 64 20 6c 61 72 67 65 20 74 72 61  to old large tra
22c0: 6e 73 69 65 6e 74 20 64 61 74 61 0a 2a 2a 20 73  nsient data.** s
22d0: 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20 77  tructures that w
22e0: 6f 75 6c 64 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c  ould not normall
22f0: 79 20 66 69 74 20 6f 6e 20 74 68 65 20 73 74 61  y fit on the sta
2300: 63 6b 20 6f 66 20 61 6e 0a 2a 2a 20 65 6d 62 65  ck of an.** embe
2310: 64 64 65 64 20 70 72 6f 63 65 73 73 6f 72 2e 0a  dded processor..
2320: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
2330: 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 69 6e  ScratchMalloc(in
2340: 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b  t n){.  void *p;
2350: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29  .  assert( n>0 )
2360: 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  ;..#if SQLITE_TH
2370: 52 45 41 44 53 41 46 45 3d 3d 30 20 26 26 20 21  READSAFE==0 && !
2380: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a  defined(NDEBUG).
2390: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
23a0: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
23b0: 65 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61  e scratch alloca
23c0: 74 69 6f 6e 20 70 65 72 20 74 68 72 65 61 64 0a  tion per thread.
23d0: 20 20 2a 2a 20 69 73 20 6f 75 74 73 74 61 6e 64    ** is outstand
23e0: 69 6e 67 20 61 74 20 6f 6e 65 20 74 69 6d 65 2e  ing at one time.
23f0: 20 20 28 54 68 69 73 20 69 73 20 6f 6e 6c 79 20    (This is only 
2400: 63 68 65 63 6b 65 64 20 69 6e 20 74 68 65 0a 20  checked in the. 
2410: 20 2a 2a 20 73 69 6e 67 6c 65 2d 74 68 72 65 61   ** single-threa
2420: 64 65 64 20 63 61 73 65 20 73 69 6e 63 65 20 63  ded case since c
2430: 68 65 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 6d  hecking in the m
2440: 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 63 61  ulti-threaded ca
2450: 73 65 0a 20 20 2a 2a 20 77 6f 75 6c 64 20 62 65  se.  ** would be
2460: 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
2470: 69 63 61 74 65 64 2e 29 20 2a 2f 0a 20 20 61 73  icated.) */.  as
2480: 73 65 72 74 28 20 73 63 72 61 74 63 68 41 6c 6c  sert( scratchAll
2490: 6f 63 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64  ocOut==0 );.#end
24a0: 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  if..  if( sqlite
24b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
24c0: 53 63 72 61 74 63 68 3c 6e 20 29 7b 0a 20 20 20  Scratch<n ){.   
24d0: 20 67 6f 74 6f 20 73 63 72 61 74 63 68 5f 6f 76   goto scratch_ov
24e0: 65 72 66 6c 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  erflow;.  }else{
24f0: 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d    .    sqlite3_m
2500: 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e  utex_enter(mem0.
2510: 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66 28 20  mutex);.    if( 
2520: 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46 72 65  mem0.nScratchFre
2530: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
2540: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
2550: 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  e(mem0.mutex);. 
2560: 20 20 20 20 20 67 6f 74 6f 20 73 63 72 61 74 63       goto scratc
2570: 68 5f 6f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  h_overflow;.    
2580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2590: 20 69 3b 0a 20 20 20 20 20 20 69 20 3d 20 6d 65   i;.      i = me
25a0: 6d 30 2e 61 53 63 72 61 74 63 68 46 72 65 65 5b  m0.aScratchFree[
25b0: 2d 2d 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46  --mem0.nScratchF
25c0: 72 65 65 5d 3b 0a 20 20 20 20 20 20 69 20 2a 3d  ree];.      i *=
25d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
25e0: 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 3b 0a  nfig.szScratch;.
25f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61        sqlite3Sta
2600: 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54  tusAdd(SQLITE_ST
2610: 41 54 55 53 5f 53 43 52 41 54 43 48 5f 55 53 45  ATUS_SCRATCH_USE
2620: 44 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  D, 1);.      sql
2630: 69 74 65 33 53 74 61 74 75 73 53 65 74 28 53 51  ite3StatusSet(SQ
2640: 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41  LITE_STATUS_SCRA
2650: 54 43 48 5f 53 49 5a 45 2c 20 6e 29 3b 0a 20 20  TCH_SIZE, n);.  
2660: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2670: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
2680: 65 78 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 28  ex);.      p = (
2690: 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 73  void*)&((char*)s
26a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
26b0: 69 67 2e 70 53 63 72 61 74 63 68 29 5b 69 5d 3b  ig.pScratch)[i];
26c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 20  .      assert(  
26d0: 28 28 28 75 38 2a 29 70 20 2d 20 28 75 38 2a 29  (((u8*)p - (u8*)
26e0: 30 29 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  0) & 7)==0 );.  
26f0: 20 20 7d 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49    }.  }.#if SQLI
2700: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30  TE_THREADSAFE==0
2710: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 44 45   && !defined(NDE
2720: 42 55 47 29 0a 20 20 73 63 72 61 74 63 68 41 6c  BUG).  scratchAl
2730: 6c 6f 63 4f 75 74 20 3d 20 70 21 3d 30 3b 0a 23  locOut = p!=0;.#
2740: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
2750: 70 3b 0a 0a 73 63 72 61 74 63 68 5f 6f 76 65 72  p;..scratch_over
2760: 66 6c 6f 77 3a 0a 20 20 69 66 28 20 73 71 6c 69  flow:.  if( sqli
2770: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2780: 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20  bMemstat ){.    
2790: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
27a0: 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ter(mem0.mutex);
27b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74  .    sqlite3Stat
27c0: 75 73 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41  usSet(SQLITE_STA
27d0: 54 55 53 5f 53 43 52 41 54 43 48 5f 53 49 5a 45  TUS_SCRATCH_SIZE
27e0: 2c 20 6e 29 3b 0a 20 20 20 20 6e 20 3d 20 6d 61  , n);.    n = ma
27f0: 6c 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28 6e 2c  llocWithAlarm(n,
2800: 20 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70 20   &p);.    if( p 
2810: 29 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 41  ) sqlite3StatusA
2820: 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  dd(SQLITE_STATUS
2830: 5f 53 43 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f  _SCRATCH_OVERFLO
2840: 57 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  W, n);.    sqlit
2850: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
2860: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65  em0.mutex);.  }e
2870: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
2880: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2890: 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20  .m.xMalloc(n);. 
28a0: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48   }.#if SQLITE_TH
28b0: 52 45 41 44 53 41 46 45 3d 3d 30 20 26 26 20 21  READSAFE==0 && !
28c0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a  defined(NDEBUG).
28d0: 20 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75    scratchAllocOu
28e0: 74 20 3d 20 70 21 3d 30 3b 0a 23 65 6e 64 69 66  t = p!=0;.#endif
28f0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 20 20 20 20  .  return p;    
2900: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  .}.void sqlite3S
2910: 63 72 61 74 63 68 46 72 65 65 28 76 6f 69 64 20  cratchFree(void 
2920: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
2930: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2940: 41 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65  ADSAFE==0 && !de
2950: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20  fined(NDEBUG).  
2960: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
2970: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
2980: 65 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61  e scratch alloca
2990: 74 69 6f 6e 20 70 65 72 20 74 68 72 65 61 64 0a  tion per thread.
29a0: 20 20 20 20 2a 2a 20 69 73 20 6f 75 74 73 74 61      ** is outsta
29b0: 6e 64 69 6e 67 20 61 74 20 6f 6e 65 20 74 69 6d  nding at one tim
29c0: 65 2e 20 20 28 54 68 69 73 20 69 73 20 6f 6e 6c  e.  (This is onl
29d0: 79 20 63 68 65 63 6b 65 64 20 69 6e 20 74 68 65  y checked in the
29e0: 0a 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 2d 74  .    ** single-t
29f0: 68 72 65 61 64 65 64 20 63 61 73 65 20 73 69 6e  hreaded case sin
2a00: 63 65 20 63 68 65 63 6b 69 6e 67 20 69 6e 20 74  ce checking in t
2a10: 68 65 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65  he multi-threade
2a20: 64 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 77 6f  d case.    ** wo
2a30: 75 6c 64 20 62 65 20 6d 75 63 68 20 6d 6f 72 65  uld be much more
2a40: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 29 20 2a   complicated.) *
2a50: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 63  /.    assert( sc
2a60: 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 3d 3d 31  ratchAllocOut==1
2a70: 20 29 3b 0a 20 20 20 20 73 63 72 61 74 63 68 41   );.    scratchA
2a80: 6c 6c 6f 63 4f 75 74 20 3d 20 30 3b 0a 23 65 6e  llocOut = 0;.#en
2a90: 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  dif..    if( sql
2aa0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2ab0: 2e 70 53 63 72 61 74 63 68 3d 3d 30 0a 20 20 20  .pScratch==0.   
2ac0: 20 20 20 20 20 20 20 20 7c 7c 20 70 3c 73 71 6c          || p<sql
2ad0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2ae0: 2e 70 53 63 72 61 74 63 68 0a 20 20 20 20 20 20  .pScratch.      
2af0: 20 20 20 20 20 7c 7c 20 70 3e 3d 28 76 6f 69 64       || p>=(void
2b00: 2a 29 6d 65 6d 30 2e 61 53 63 72 61 74 63 68 46  *)mem0.aScratchF
2b10: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ree ){.      if(
2b20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b30: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b  nfig.bMemstat ){
2b40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 69  .        int iSi
2b50: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ze = sqlite3Mall
2b60: 6f 63 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ocSize(p);.     
2b70: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2b80: 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65  _enter(mem0.mute
2b90: 78 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  x);.        sqli
2ba0: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
2bb0: 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54  ITE_STATUS_SCRAT
2bc0: 43 48 5f 4f 56 45 52 46 4c 4f 57 2c 20 2d 69 53  CH_OVERFLOW, -iS
2bd0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ize);.        sq
2be0: 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53  lite3StatusAdd(S
2bf0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d  QLITE_STATUS_MEM
2c00: 4f 52 59 5f 55 53 45 44 2c 20 2d 69 53 69 7a 65  ORY_USED, -iSize
2c10: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2c30: 2e 78 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20  .xFree(p);.     
2c40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2c50: 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65  _leave(mem0.mute
2c60: 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  x);.      }else{
2c70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
2c90: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  Free(p);.      }
2ca0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2cb0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
2cc0: 20 3d 20 28 69 6e 74 29 28 28 75 38 2a 29 70 20   = (int)((u8*)p 
2cd0: 2d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 47 6c  - (u8*)sqlite3Gl
2ce0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61  obalConfig.pScra
2cf0: 74 63 68 29 3b 0a 20 20 20 20 20 20 69 20 2f 3d  tch);.      i /=
2d00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2d10: 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 3b 0a  nfig.szScratch;.
2d20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e        assert( i>
2d30: 3d 30 20 26 26 20 69 3c 73 71 6c 69 74 65 33 47  =0 && i<sqlite3G
2d40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72  lobalConfig.nScr
2d50: 61 74 63 68 20 29 3b 0a 20 20 20 20 20 20 73 71  atch );.      sq
2d60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2d70: 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  r(mem0.mutex);. 
2d80: 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
2d90: 30 2e 6e 53 63 72 61 74 63 68 46 72 65 65 3c 28  0.nScratchFree<(
2da0: 75 33 32 29 73 71 6c 69 74 65 33 47 6c 6f 62 61  u32)sqlite3Globa
2db0: 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68  lConfig.nScratch
2dc0: 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 30 2e 61   );.      mem0.a
2dd0: 53 63 72 61 74 63 68 46 72 65 65 5b 6d 65 6d 30  ScratchFree[mem0
2de0: 2e 6e 53 63 72 61 74 63 68 46 72 65 65 2b 2b 5d  .nScratchFree++]
2df0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69   = i;.      sqli
2e00: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
2e10: 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54  ITE_STATUS_SCRAT
2e20: 43 48 5f 55 53 45 44 2c 20 2d 31 29 3b 0a 20 20  CH_USED, -1);.  
2e30: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2e40: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
2e50: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ex);.    }.  }.}
2e60: 0a 0a 2f 2a 0a 2a 2a 20 54 52 55 45 20 69 66 20  ../*.** TRUE if 
2e70: 70 20 69 73 20 61 20 6c 6f 6f 6b 61 73 69 64 65  p is a lookaside
2e80: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2e90: 6f 6e 20 66 72 6f 6d 20 64 62 0a 2a 2f 0a 23 69  on from db.*/.#i
2ea0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2eb0: 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 73 74 61 74  T_LOOKASIDE.stat
2ec0: 69 63 20 69 6e 74 20 69 73 4c 6f 6f 6b 61 73 69  ic int isLookasi
2ed0: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  de(sqlite3 *db, 
2ee0: 76 6f 69 64 20 2a 70 29 7b 0a 20 20 72 65 74 75  void *p){.  retu
2ef0: 72 6e 20 64 62 20 26 26 20 70 20 26 26 20 70 3e  rn db && p && p>
2f00: 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  =db->lookaside.p
2f10: 53 74 61 72 74 20 26 26 20 70 3c 64 62 2d 3e 6c  Start && p<db->l
2f20: 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 3b 0a 7d  ookaside.pEnd;.}
2f30: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 69  .#else.#define i
2f40: 73 4c 6f 6f 6b 61 73 69 64 65 28 41 2c 42 29 20  sLookaside(A,B) 
2f50: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2f60: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
2f70: 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  of a memory allo
2f80: 63 61 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c  cation previousl
2f90: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
2fa0: 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ** sqlite3Malloc
2fb0: 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d 61  () or sqlite3_ma
2fc0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  lloc()..*/.int s
2fd0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65  qlite3MallocSize
2fe0: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 72 65 74  (void *p){.  ret
2ff0: 75 72 6e 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  urn sqlite3Globa
3000: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53 69 7a 65 28  lConfig.m.xSize(
3010: 70 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  p);.}.int sqlite
3020: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 73 71  3DbMallocSize(sq
3030: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
3040: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64  *p){.  assert( d
3050: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
3060: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
3070: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 69  utex) );.  if( i
3080: 73 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70  sLookaside(db, p
3090: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
30a0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
30b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
30c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 6c 6f  eturn sqlite3Glo
30d0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53 69 7a  balConfig.m.xSiz
30e0: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
30f0: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 70  ** Free memory p
3100: 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e  reviously obtain
3110: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4d  ed from sqlite3M
3120: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64  alloc()..*/.void
3130: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 76 6f   sqlite3_free(vo
3140: 69 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  id *p){.  if( p=
3150: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
3160: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3170: 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20  Config.bMemstat 
3180: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
3190: 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e  utex_enter(mem0.
31a0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  mutex);.    sqli
31b0: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
31c0: 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
31d0: 59 5f 55 53 45 44 2c 20 2d 73 71 6c 69 74 65 33  Y_USED, -sqlite3
31e0: 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 29 29 3b 0a  MallocSize(p));.
31f0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3200: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28  lConfig.m.xFree(
3210: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
3220: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30  mutex_leave(mem0
3230: 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65  .mutex);.  }else
3240: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
3250: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46 72 65  balConfig.m.xFre
3260: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
3270: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 74  ** Free memory t
3280: 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 73 73  hat might be ass
3290: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
32a0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
32b0: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
32c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
32d0: 33 44 62 46 72 65 65 28 73 71 6c 69 74 65 33 20  3DbFree(sqlite3 
32e0: 2a 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20  *db, void *p){. 
32f0: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c   assert( db==0 |
3300: 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
3310: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
3320: 29 3b 0a 20 20 69 66 28 20 69 73 4c 6f 6f 6b 61  );.  if( isLooka
3330: 73 69 64 65 28 64 62 2c 20 70 29 20 29 7b 0a 20  side(db, p) ){. 
3340: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
3350: 20 2a 70 42 75 66 20 3d 20 28 4c 6f 6f 6b 61 73   *pBuf = (Lookas
3360: 69 64 65 53 6c 6f 74 2a 29 70 3b 0a 20 20 20 20  ideSlot*)p;.    
3370: 70 42 75 66 2d 3e 70 4e 65 78 74 20 3d 20 64 62  pBuf->pNext = db
3380: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
3390: 65 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  e;.    db->looka
33a0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 42 75  side.pFree = pBu
33b0: 66 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  f;.    db->looka
33c0: 73 69 64 65 2e 6e 4f 75 74 2d 2d 3b 0a 20 20 7d  side.nOut--;.  }
33d0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
33e0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
33f0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3400: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78  he size of an ex
3410: 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  isting memory al
3420: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  location.*/.void
3430: 20 2a 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63   *sqlite3Realloc
3440: 28 76 6f 69 64 20 2a 70 4f 6c 64 2c 20 69 6e 74  (void *pOld, int
3450: 20 6e 42 79 74 65 73 29 7b 0a 20 20 69 6e 74 20   nBytes){.  int 
3460: 6e 4f 6c 64 2c 20 6e 4e 65 77 3b 0a 20 20 76 6f  nOld, nNew;.  vo
3470: 69 64 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  id *pNew;.  if( 
3480: 70 4f 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pOld==0 ){.    r
3490: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 61 6c  eturn sqlite3Mal
34a0: 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20 20 7d  loc(nBytes);.  }
34b0: 0a 20 20 69 66 28 20 6e 42 79 74 65 73 3c 3d 30  .  if( nBytes<=0
34c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
34d0: 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20  free(pOld);.    
34e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
34f0: 69 66 28 20 6e 42 79 74 65 73 3e 3d 30 78 37 66  if( nBytes>=0x7f
3500: 66 66 66 66 30 30 20 29 7b 0a 20 20 20 20 2f 2a  ffff00 ){.    /*
3510: 20 54 68 65 20 30 78 37 66 66 66 66 30 30 20 6c   The 0x7ffff00 l
3520: 69 6d 69 74 20 74 65 72 6d 20 69 73 20 65 78 70  imit term is exp
3530: 6c 61 69 6e 65 64 20 69 6e 20 63 6f 6d 6d 65 6e  lained in commen
3540: 74 73 20 6f 6e 20 73 71 6c 69 74 65 33 4d 61 6c  ts on sqlite3Mal
3550: 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 72 65 74  loc() */.    ret
3560: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 4f 6c  urn 0;.  }.  nOl
3570: 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  d = sqlite3Mallo
3580: 63 53 69 7a 65 28 70 4f 6c 64 29 3b 0a 20 20 6e  cSize(pOld);.  n
3590: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  New = sqlite3Glo
35a0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 6f 75  balConfig.m.xRou
35b0: 6e 64 75 70 28 6e 42 79 74 65 73 29 3b 0a 20 20  ndup(nBytes);.  
35c0: 69 66 28 20 6e 4f 6c 64 3d 3d 6e 4e 65 77 20 29  if( nOld==nNew )
35d0: 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 6c  {.    pNew = pOl
35e0: 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  d;.  }else if( s
35f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3600: 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20  ig.bMemstat ){. 
3610: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
3620: 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65  _enter(mem0.mute
3630: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  x);.    sqlite3S
3640: 74 61 74 75 73 53 65 74 28 53 51 4c 49 54 45 5f  tatusSet(SQLITE_
3650: 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49  STATUS_MALLOC_SI
3660: 5a 45 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 20  ZE, nBytes);.   
3670: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 61 74   if( sqlite3Stat
3680: 75 73 56 61 6c 75 65 28 53 51 4c 49 54 45 5f 53  usValue(SQLITE_S
3690: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
36a0: 44 29 2b 6e 4e 65 77 2d 6e 4f 6c 64 20 3e 3d 20  D)+nNew-nOld >= 
36b0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 30 2e  .          mem0.
36c0: 61 6c 61 72 6d 54 68 72 65 73 68 6f 6c 64 20 29  alarmThreshold )
36d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
36e0: 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 4e 65 77 2d  allocAlarm(nNew-
36f0: 6e 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nOld);.    }.   
3700: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 47   pNew = sqlite3G
3710: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52  lobalConfig.m.xR
3720: 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 4e 65  ealloc(pOld, nNe
3730: 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  w);.    if( pNew
3740: 3d 3d 30 20 26 26 20 6d 65 6d 30 2e 61 6c 61 72  ==0 && mem0.alar
3750: 6d 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  mCallback ){.   
3760: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
3770: 41 6c 61 72 6d 28 6e 42 79 74 65 73 29 3b 0a 20  Alarm(nBytes);. 
3780: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
3790: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
37a0: 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c  m.xRealloc(pOld,
37b0: 20 6e 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20   nNew);.    }.  
37c0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
37d0: 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74      nNew = sqlit
37e0: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4e 65  e3MallocSize(pNe
37f0: 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
3800: 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54  3StatusAdd(SQLIT
3810: 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
3820: 55 53 45 44 2c 20 6e 4e 65 77 2d 6e 4f 6c 64 29  USED, nNew-nOld)
3830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3840: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
3850: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 7d  mem0.mutex);.  }
3860: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d  else{.    pNew =
3870: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3880: 6e 66 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63 28  nfig.m.xRealloc(
3890: 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b 0a 20 20 7d  pOld, nNew);.  }
38a0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
38b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 75 62  }../*.** The pub
38c0: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 74 6f  lic interface to
38d0: 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 2e   sqlite3Realloc.
38e0: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74    Make sure that
38f0: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73   the memory.** s
3900: 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74  ubsystem is init
3910: 69 61 6c 69 7a 65 64 20 70 72 69 6f 72 20 74 6f  ialized prior to
3920: 20 69 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65   invoking sqlite
3930: 52 65 61 6c 6c 6f 63 2e 0a 2a 2f 0a 76 6f 69 64  Realloc..*/.void
3940: 20 2a 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f   *sqlite3_reallo
3950: 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c 20 69 6e  c(void *pOld, in
3960: 74 20 6e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  t n){.#ifndef SQ
3970: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
3980: 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  IT.  if( sqlite3
3990: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20  _initialize() ) 
39a0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
39b0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
39c0: 33 52 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e  3Realloc(pOld, n
39d0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  );.}.../*.** All
39e0: 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 6d  ocate and zero m
39f0: 65 6d 6f 72 79 2e 0a 2a 2f 20 0a 76 6f 69 64 20  emory..*/ .void 
3a00: 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  *sqlite3MallocZe
3a10: 72 6f 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69  ro(int n){.  voi
3a20: 64 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  d *p = sqlite3Ma
3a30: 6c 6c 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 70  lloc(n);.  if( p
3a40: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
3a50: 2c 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72  , 0, n);.  }.  r
3a60: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
3a70: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a  * Allocate and z
3a80: 65 72 6f 20 6d 65 6d 6f 72 79 2e 20 20 49 66 20  ero memory.  If 
3a90: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
3aa0: 61 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a 20 74 68  ails, make.** th
3ab0: 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  e mallocFailed f
3ac0: 6c 61 67 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65  lag in the conne
3ad0: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
3ae0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44  /.void *sqlite3D
3af0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 71 6c 69  bMallocZero(sqli
3b00: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 29 7b  te3 *db, int n){
3b10: 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c  .  void *p = sql
3b20: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
3b30: 64 62 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70 20  db, n);.  if( p 
3b40: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c  ){.    memset(p,
3b50: 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65   0, n);.  }.  re
3b60: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3b70: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65   Allocate and ze
3b80: 72 6f 20 6d 65 6d 6f 72 79 2e 20 20 49 66 20 74  ro memory.  If t
3b90: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  he allocation fa
3ba0: 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a 20 74 68 65  ils, make.** the
3bb0: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
3bc0: 61 67 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63  ag in the connec
3bd0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
3be0: 0a 2a 2a 20 49 66 20 64 62 21 3d 30 20 61 6e 64  .** If db!=0 and
3bf0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
3c00: 64 20 69 73 20 74 72 75 65 20 28 69 6e 64 69 63  d is true (indic
3c10: 61 74 69 6e 67 20 61 20 70 72 69 6f 72 20 6d 61  ating a prior ma
3c20: 6c 6c 6f 63 0a 2a 2a 20 66 61 69 6c 75 72 65 20  lloc.** failure 
3c30: 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  on the same data
3c40: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  base connection)
3c50: 20 74 68 65 6e 20 61 6c 77 61 79 73 20 72 65 74   then always ret
3c60: 75 72 6e 20 30 2e 0a 2a 2a 20 48 65 6e 63 65 20  urn 0..** Hence 
3c70: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
3c80: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
3c90: 74 69 6f 6e 2c 20 6f 6e 63 65 20 6d 61 6c 6c 6f  tion, once mallo
3ca0: 63 20 73 74 61 72 74 73 0a 2a 2a 20 66 61 69 6c  c starts.** fail
3cb0: 69 6e 67 2c 20 69 74 20 66 61 69 6c 73 20 63 6f  ing, it fails co
3cc0: 6e 73 69 73 74 65 6e 74 6c 79 20 75 6e 74 69 6c  nsistently until
3cd0: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 69 73   mallocFailed is
3ce0: 20 72 65 73 65 74 2e 0a 2a 2a 20 54 68 69 73 20   reset..** This 
3cf0: 69 73 20 61 6e 20 69 6d 70 6f 72 74 61 6e 74 20  is an important 
3d00: 61 73 73 75 6d 70 74 69 6f 6e 2e 20 20 54 68 65  assumption.  The
3d10: 72 65 20 61 72 65 20 6d 61 6e 79 20 70 6c 61 63  re are many plac
3d20: 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 63 6f 64  es in the.** cod
3d30: 65 20 74 68 61 74 20 64 6f 20 74 68 69 6e 67 73  e that do things
3d40: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
3d50: 2a 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61  *         int *a
3d60: 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
3d70: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
3d80: 31 30 30 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20  100);.**        
3d90: 20 69 6e 74 20 2a 62 20 3d 20 28 69 6e 74 2a 29   int *b = (int*)
3da0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
3db0: 61 77 28 64 62 2c 20 32 30 30 29 3b 0a 2a 2a 20  aw(db, 200);.** 
3dc0: 20 20 20 20 20 20 20 20 69 66 28 20 62 20 29 20          if( b ) 
3dd0: 61 5b 31 30 5d 20 3d 20 39 3b 0a 2a 2a 0a 2a 2a  a[10] = 9;.**.**
3de0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
3df0: 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
3e00: 20 6d 61 6c 6c 6f 63 20 28 65 78 3a 20 22 62 22   malloc (ex: "b"
3e10: 29 20 77 6f 72 6b 65 64 2c 20 69 74 20 69 73 20  ) worked, it is 
3e20: 61 73 73 75 6d 65 64 0a 2a 2a 20 74 68 61 74 20  assumed.** that 
3e30: 61 6c 6c 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  all prior malloc
3e40: 73 20 28 65 78 3a 20 22 61 22 29 20 77 6f 72 6b  s (ex: "a") work
3e50: 65 64 20 74 6f 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  ed too..*/.void 
3e60: 2a 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  *sqlite3DbMalloc
3e70: 52 61 77 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Raw(sqlite3 *db,
3e80: 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20   int n){.  void 
3e90: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  *p;.  assert( db
3ea0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
3eb0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
3ec0: 74 65 78 29 20 29 3b 0a 23 69 66 6e 64 65 66 20  tex) );.#ifndef 
3ed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
3ee0: 41 53 49 44 45 0a 20 20 69 66 28 20 64 62 20 29  ASIDE.  if( db )
3ef0: 7b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53  {.    LookasideS
3f00: 6c 6f 74 20 2a 70 42 75 66 3b 0a 20 20 20 20 69  lot *pBuf;.    i
3f10: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
3f20: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74  led ){.      ret
3f30: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
3f40: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
3f50: 64 65 2e 62 45 6e 61 62 6c 65 64 20 26 26 20 6e  de.bEnabled && n
3f60: 3c 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  <=db->lookaside.
3f70: 73 7a 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  sz.         && (
3f80: 70 42 75 66 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  pBuf = db->looka
3f90: 73 69 64 65 2e 70 46 72 65 65 29 21 3d 30 20 29  side.pFree)!=0 )
3fa0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  {.      db->look
3fb0: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 42  aside.pFree = pB
3fc0: 75 66 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  uf->pNext;.     
3fd0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
3fe0: 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Out++;.      if(
3ff0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
4000: 4f 75 74 3e 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  Out>db->lookasid
4010: 65 2e 6d 78 4f 75 74 20 29 7b 0a 20 20 20 20 20  e.mxOut ){.     
4020: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4030: 2e 6d 78 4f 75 74 20 3d 20 64 62 2d 3e 6c 6f 6f  .mxOut = db->loo
4040: 6b 61 73 69 64 65 2e 6e 4f 75 74 3b 0a 20 20 20  kaside.nOut;.   
4050: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
4060: 6e 20 28 76 6f 69 64 2a 29 70 42 75 66 3b 0a 20  n (void*)pBuf;. 
4070: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
4080: 20 69 66 28 20 64 62 20 26 26 20 64 62 2d 3e 6d   if( db && db->m
4090: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
40a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
40b0: 0a 23 65 6e 64 69 66 0a 20 20 70 20 3d 20 73 71  .#endif.  p = sq
40c0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a  lite3Malloc(n);.
40d0: 20 20 69 66 28 20 21 70 20 26 26 20 64 62 20 29    if( !p && db )
40e0: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
40f0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
4100: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4110: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
4120: 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
4130: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 20  pointed to by p 
4140: 74 6f 20 6e 20 62 79 74 65 73 2e 20 49 66 20 74  to n bytes. If t
4150: 68 65 0a 2a 2a 20 72 65 73 69 7a 65 20 66 61 69  he.** resize fai
4160: 6c 73 2c 20 73 65 74 20 74 68 65 20 6d 61 6c 6c  ls, set the mall
4170: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 69 6e  ocFailed flag in
4180: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
4190: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20  object..*/.void 
41a0: 2a 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f  *sqlite3DbReallo
41b0: 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  c(sqlite3 *db, v
41c0: 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oid *p, int n){.
41d0: 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30    void *pNew = 0
41e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
41f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
4200: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
4210: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
4220: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
4230: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
4240: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
4250: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
4260: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
4270: 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   n);.    }.    i
4280: 66 28 20 69 73 4c 6f 6f 6b 61 73 69 64 65 28 64  f( isLookaside(d
4290: 62 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 69  b, p) ){.      i
42a0: 66 28 20 6e 3c 3d 64 62 2d 3e 6c 6f 6f 6b 61 73  f( n<=db->lookas
42b0: 69 64 65 2e 73 7a 20 29 7b 0a 20 20 20 20 20 20  ide.sz ){.      
42c0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
42d0: 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 20 3d    }.      pNew =
42e0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
42f0: 52 61 77 28 64 62 2c 20 6e 29 3b 0a 20 20 20 20  Raw(db, n);.    
4300: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
4310: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65        memcpy(pNe
4320: 77 2c 20 70 2c 20 64 62 2d 3e 6c 6f 6f 6b 61 73  w, p, db->lookas
4330: 69 64 65 2e 73 7a 29 3b 0a 20 20 20 20 20 20 20  ide.sz);.       
4340: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4350: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, p);.      }. 
4360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4370: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
4380: 65 61 6c 6c 6f 63 28 70 2c 20 6e 29 3b 0a 20 20  ealloc(p, n);.  
4390: 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b      if( !pNew ){
43a0: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  .        db->mal
43b0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
43c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
43d0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
43f0: 20 74 6f 20 72 65 61 6c 6c 6f 63 61 74 65 20 70   to reallocate p
4400: 2e 20 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f  .  If the reallo
4410: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
4420: 65 6e 20 66 72 65 65 20 70 0a 2a 2a 20 61 6e 64  en free p.** and
4430: 20 73 65 74 20 74 68 65 20 6d 61 6c 6c 6f 63 46   set the mallocF
4440: 61 69 6c 65 64 20 66 6c 61 67 20 69 6e 20 74 68  ailed flag in th
4450: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
4460: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
4470: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
4480: 4f 72 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  OrFree(sqlite3 *
4490: 64 62 2c 20 76 6f 69 64 20 2a 70 2c 20 69 6e 74  db, void *p, int
44a0: 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4e 65   n){.  void *pNe
44b0: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
44c0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
44d0: 20 70 2c 20 6e 29 3b 0a 20 20 69 66 28 20 21 70   p, n);.  if( !p
44e0: 4e 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  New ){.    sqlit
44f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
4500: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
4510: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  ew;.}../*.** Mak
4520: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74  e a copy of a st
4530: 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ring in memory o
4540: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4550: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54 68 65  iteMalloc(). The
4560: 73 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  se .** functions
4570: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4d 61 6c   call sqlite3Mal
4580: 6c 6f 63 52 61 77 28 29 20 64 69 72 65 63 74 6c  locRaw() directl
4590: 79 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  y instead of sql
45a0: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54 68 69  iteMalloc(). Thi
45b0: 73 0a 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20  s.** is because 
45c0: 77 68 65 6e 20 6d 65 6d 6f 72 79 20 64 65 62 75  when memory debu
45d0: 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20  gging is turned 
45e0: 6f 6e 2c 20 74 68 65 73 65 20 74 77 6f 20 66 75  on, these two fu
45f0: 6e 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20  nctions are .** 
4600: 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f  called via macro
4610: 73 20 74 68 61 74 20 72 65 63 6f 72 64 20 74 68  s that record th
4620: 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 61  e current file a
4630: 6e 64 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  nd line number i
4640: 6e 20 74 68 65 0a 2a 2a 20 54 68 72 65 61 64 44  n the.** ThreadD
4650: 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ata structure..*
4660: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 44  /.char *sqlite3D
4670: 62 53 74 72 44 75 70 28 73 71 6c 69 74 65 33 20  bStrDup(sqlite3 
4680: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
4690: 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65  *z){.  char *zNe
46a0: 77 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20  w;.  size_t n;. 
46b0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
46c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
46d0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
46e0: 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 61  en30(z) + 1;.  a
46f0: 73 73 65 72 74 28 20 28 6e 26 30 78 37 66 66 66  ssert( (n&0x7fff
4700: 66 66 66 66 29 3d 3d 6e 20 29 3b 0a 20 20 7a 4e  ffff)==n );.  zN
4710: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
4720: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 28 69 6e 74  llocRaw(db, (int
4730: 29 6e 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20  )n);.  if( zNew 
4740: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e  ){.    memcpy(zN
4750: 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 20  ew, z, n);.  }. 
4760: 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a   return zNew;.}.
4770: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 44 62 53  char *sqlite3DbS
4780: 74 72 4e 44 75 70 28 73 71 6c 69 74 65 33 20 2a  trNDup(sqlite3 *
4790: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
47a0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 63 68 61  z, int n){.  cha
47b0: 72 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a  r *zNew;.  if( z
47c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
47d0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 0;.  }.  asser
47e0: 74 28 20 28 6e 26 30 78 37 66 66 66 66 66 66 66  t( (n&0x7fffffff
47f0: 29 3d 3d 6e 20 29 3b 0a 20 20 7a 4e 65 77 20 3d  )==n );.  zNew =
4800: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4810: 52 61 77 28 64 62 2c 20 6e 2b 31 29 3b 0a 20 20  Raw(db, n+1);.  
4820: 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20  if( zNew ){.    
4830: 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20  memcpy(zNew, z, 
4840: 6e 29 3b 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20  n);.    zNew[n] 
4850: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4860: 6e 20 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zNew;.}../*.**
4870: 20 43 72 65 61 74 65 20 61 20 73 74 72 69 6e 67   Create a string
4880: 20 66 72 6f 6d 20 74 68 65 20 7a 46 72 6f 6d 61   from the zFroma
4890: 74 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 74  t argument and t
48a0: 68 65 20 76 61 5f 6c 69 73 74 20 74 68 61 74 20  he va_list that 
48b0: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 20 53 74 6f 72  follows..** Stor
48c0: 65 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20  e the string in 
48d0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
48e0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
48f0: 63 28 29 20 61 6e 64 20 6d 61 6b 65 20 2a 70 7a  c() and make *pz
4900: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 61  .** point to tha
4910: 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  t string..*/.voi
4920: 64 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69  d sqlite3SetStri
4930: 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20 73 71  ng(char **pz, sq
4940: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
4950: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
4960: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
4970: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ap;.  char *z;..
4980: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
4990: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73  Format);.  z = s
49a0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64  qlite3VMPrintf(d
49b0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
49c0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
49d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
49e0: 62 2c 20 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d  b, *pz);.  *pz =
49f0: 20 7a 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   z;.}.../*.** Th
4a00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
4a10: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
4a20: 65 20 65 78 69 74 69 6e 67 20 61 6e 79 20 41 50  e exiting any AP
4a30: 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  I function (i.e.
4a40: 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20 63   .** returning c
4a50: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 73  ontrol to the us
4a60: 65 72 29 20 74 68 61 74 20 68 61 73 20 63 61 6c  er) that has cal
4a70: 6c 65 64 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  led sqlite3_mall
4a80: 6f 63 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 33  oc or.** sqlite3
4a90: 5f 72 65 61 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20  _realloc..**.** 
4aa0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
4ab0: 75 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  ue is normally a
4ac0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
4ad0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
4ae0: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
4af0: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 61 20  . However, if a 
4b00: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
4b10: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 73 69   has occurred si
4b20: 6e 63 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  nce the previous
4b30: 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 53  .** invocation S
4b40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
4b50: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
4b60: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
4b70: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 64  irst argument, d
4b80: 62 2c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  b, is not NULL a
4b90: 6e 64 20 61 20 6d 61 6c 6c 6f 63 28 29 20 65 72  nd a malloc() er
4ba0: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
4bb0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 6f  ,.** then the co
4bc0: 6e 6e 65 63 74 69 6f 6e 20 65 72 72 6f 72 2d 63  nnection error-c
4bd0: 6f 64 65 20 28 74 68 65 20 76 61 6c 75 65 20 72  ode (the value r
4be0: 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
4bf0: 65 33 5f 65 72 72 63 6f 64 65 28 29 29 0a 2a 2a  e3_errcode()).**
4c00: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
4c10: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20  E_NOMEM..*/.int 
4c20: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 73  sqlite3ApiExit(s
4c30: 71 6c 69 74 65 33 2a 20 64 62 2c 20 69 6e 74 20  qlite3* db, int 
4c40: 72 63 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  rc){.  /* If the
4c50: 20 64 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f   db handle is no
4c60: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 77 65 20  t NULL, then we 
4c70: 6d 75 73 74 20 68 6f 6c 64 20 74 68 65 20 63 6f  must hold the co
4c80: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 0a  nnection handle.
4c90: 20 20 2a 2a 20 6d 75 74 65 78 20 68 65 72 65 2e    ** mutex here.
4ca0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 72   Otherwise the r
4cb0: 65 61 64 20 28 61 6e 64 20 70 6f 73 73 69 62 6c  ead (and possibl
4cc0: 65 20 77 72 69 74 65 29 20 6f 66 20 64 62 2d 3e  e write) of db->
4cd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20  mallocFailed .  
4ce0: 2a 2a 20 69 73 20 75 6e 73 61 66 65 2c 20 61 73  ** is unsafe, as
4cf0: 20 69 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   is the call to 
4d00: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 29 2e 0a  sqlite3Error()..
4d10: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
4d20: 64 62 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  db || sqlite3_mu
4d30: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
4d40: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 20  ex) );.  if( db 
4d50: 26 26 20 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && (db->mallocFa
4d60: 69 6c 65 64 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  iled || rc==SQLI
4d70: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
4d80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4d90: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4e  ror(db, SQLITE_N
4da0: 4f 4d 45 4d 2c 20 30 29 3b 0a 20 20 20 20 64 62  OMEM, 0);.    db
4db0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
4dc0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   0;.    rc = SQL
4dd0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
4de0: 20 72 65 74 75 72 6e 20 72 63 20 26 20 28 64 62   return rc & (db
4df0: 20 3f 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3a   ? db->errMask :
4e00: 20 30 78 66 66 29 3b 0a 7d 0a                     0xff);.}.