/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 7b3b6423f5b355e5d649b91e16ef252d610bcf19:


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 32 20 32 30 30 39  oc.c,v 1.62 2009
01d0: 2f 30 35 2f 30 33 20 32 30 3a 32 33 3a 35 34 20  /05/03 20:23:54 
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 20 20 73 71 6c  t = n;.  }.  sql
0450: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
0460: 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e  );.  if( iLimit>
0470: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
0480: 4d 65 6d 6f 72 79 41 6c 61 72 6d 28 73 6f 66 74  MemoryAlarm(soft
0490: 48 65 61 70 4c 69 6d 69 74 45 6e 66 6f 72 63 65  HeapLimitEnforce
04a0: 72 2c 20 30 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, 0, iLimit);. 
04b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
04c0: 74 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d 28 30  te3MemoryAlarm(0
04d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 6f  , 0, 0);.  }.  o
04e0: 76 65 72 61 67 65 20 3d 20 28 69 6e 74 29 28 73  verage = (int)(s
04f0: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
0500: 65 64 28 29 20 2d 20 28 69 36 34 29 6e 29 3b 0a  ed() - (i64)n);.
0510: 20 20 69 66 28 20 6f 76 65 72 61 67 65 3e 30 20    if( overage>0 
0520: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
0530: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 6f 76  elease_memory(ov
0540: 65 72 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  erage);.  }.}../
0550: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
0560: 72 65 6c 65 61 73 65 20 75 70 20 74 6f 20 6e 20  release up to n 
0570: 62 79 74 65 73 20 6f 66 20 6e 6f 6e 2d 65 73 73  bytes of non-ess
0580: 65 6e 74 69 61 6c 20 6d 65 6d 6f 72 79 20 63 75  ential memory cu
0590: 72 72 65 6e 74 6c 79 0a 2a 2a 20 68 65 6c 64 20  rrently.** held 
05a0: 62 79 20 53 51 4c 69 74 65 2e 20 41 6e 20 65 78  by SQLite. An ex
05b0: 61 6d 70 6c 65 20 6f 66 20 6e 6f 6e 2d 65 73 73  ample of non-ess
05c0: 65 6e 74 69 61 6c 20 6d 65 6d 6f 72 79 20 69 73  ential memory is
05d0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 0a   memory used to.
05e0: 2a 2a 20 63 61 63 68 65 20 64 61 74 61 62 61 73  ** cache databas
05f0: 65 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  e pages that are
0600: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 69   not currently i
0610: 6e 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  n use..*/.int sq
0620: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
0630: 6d 6f 72 79 28 69 6e 74 20 6e 29 7b 0a 23 69 66  mory(int n){.#if
0640: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
0650: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
0660: 45 4e 54 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d  ENT.  int nRet =
0670: 20 30 3b 0a 23 69 66 20 30 0a 20 20 6e 52 65 74   0;.#if 0.  nRet
0680: 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52   += sqlite3VdbeR
0690: 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 6e 29 3b  eleaseMemory(n);
06a0: 0a 23 65 6e 64 69 66 0a 20 20 6e 52 65 74 20 2b  .#endif.  nRet +
06b0: 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  = sqlite3PcacheR
06c0: 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 6e 2d 6e  eleaseMemory(n-n
06d0: 52 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Ret);.  return n
06e0: 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  Ret;.#else.  UNU
06f0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 29  SED_PARAMETER(n)
0700: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
0710: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  E_OK;.#endif.}..
0720: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
0730: 72 6d 61 74 69 6f 6e 20 6c 6f 63 61 6c 20 74 6f  rmation local to
0740: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
0750: 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d  cation subsystem
0760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
0770: 54 45 5f 57 53 44 20 73 74 72 75 63 74 20 4d 65  TE_WSD struct Me
0780: 6d 30 47 6c 6f 62 61 6c 20 7b 0a 20 20 2f 2a 20  m0Global {.  /* 
0790: 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  Number of free p
07a0: 61 67 65 73 20 66 6f 72 20 73 63 72 61 74 63 68  ages for scratch
07b0: 20 61 6e 64 20 70 61 67 65 2d 63 61 63 68 65 20   and page-cache 
07c0: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 33 32 20  memory */.  u32 
07d0: 6e 53 63 72 61 74 63 68 46 72 65 65 3b 0a 20 20  nScratchFree;.  
07e0: 75 33 32 20 6e 50 61 67 65 46 72 65 65 3b 0a 0a  u32 nPageFree;..
07f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
0800: 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  *mutex;         
0810: 2f 2a 20 4d 75 74 65 78 20 74 6f 20 73 65 72 69  /* Mutex to seri
0820: 61 6c 69 7a 65 20 61 63 63 65 73 73 20 2a 2f 0a  alize access */.
0830: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 61  .  /*.  ** The a
0840: 6c 61 72 6d 20 63 61 6c 6c 62 61 63 6b 20 61 6e  larm callback an
0850: 64 20 69 74 73 20 61 72 67 75 6d 65 6e 74 73 2e  d its arguments.
0860: 20 20 54 68 65 20 6d 65 6d 30 2e 6d 75 74 65 78    The mem0.mutex
0870: 20 6c 6f 63 6b 20 77 69 6c 6c 0a 20 20 2a 2a 20   lock will.  ** 
0880: 62 65 20 68 65 6c 64 20 77 68 69 6c 65 20 74 68  be held while th
0890: 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75  e callback is ru
08a0: 6e 6e 69 6e 67 2e 20 20 52 65 63 75 72 73 69 76  nning.  Recursiv
08b0: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
08c0: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 75 62  * the memory sub
08d0: 73 79 73 74 65 6d 20 61 72 65 20 61 6c 6c 6f 77  system are allow
08e0: 65 64 2c 20 62 75 74 20 6e 6f 20 6e 65 77 20 63  ed, but no new c
08f0: 61 6c 6c 62 61 63 6b 73 20 77 69 6c 6c 20 62 65  allbacks will be
0900: 0a 20 20 2a 2a 20 69 73 73 75 65 64 2e 20 20 54  .  ** issued.  T
0910: 68 65 20 61 6c 61 72 6d 42 75 73 79 20 76 61 72  he alarmBusy var
0920: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
0930: 70 72 65 76 65 6e 74 20 72 65 63 75 72 73 69 76  prevent recursiv
0940: 65 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 73  e.  ** callbacks
0950: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
0960: 5f 69 6e 74 36 34 20 61 6c 61 72 6d 54 68 72 65  _int64 alarmThre
0970: 73 68 6f 6c 64 3b 0a 20 20 76 6f 69 64 20 28 2a  shold;.  void (*
0980: 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 29 28 76  alarmCallback)(v
0990: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  oid*, sqlite3_in
09a0: 74 36 34 2c 69 6e 74 29 3b 0a 20 20 76 6f 69 64  t64,int);.  void
09b0: 20 2a 61 6c 61 72 6d 41 72 67 3b 0a 20 20 69 6e   *alarmArg;.  in
09c0: 74 20 61 6c 61 72 6d 42 75 73 79 3b 0a 0a 20 20  t alarmBusy;..  
09d0: 2f 2a 0a 20 20 2a 2a 20 50 6f 69 6e 74 65 72 73  /*.  ** Pointers
09e0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 73   to the end of s
09f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
0a00: 69 67 2e 70 53 63 72 61 74 63 68 20 61 6e 64 0a  ig.pScratch and.
0a10: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
0a20: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 74  alConfig.pPage t
0a30: 6f 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  o a block of mem
0a40: 6f 72 79 20 74 68 61 74 20 72 65 63 6f 72 64 73  ory that records
0a50: 0a 20 20 2a 2a 20 77 68 69 63 68 20 70 61 67 65  .  ** which page
0a60: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  s are available.
0a70: 0a 20 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 63  .  */.  u32 *aSc
0a80: 72 61 74 63 68 46 72 65 65 3b 0a 20 20 75 33 32  ratchFree;.  u32
0a90: 20 2a 61 50 61 67 65 46 72 65 65 3b 0a 7d 20 6d   *aPageFree;.} m
0aa0: 65 6d 30 20 3d 20 7b 20 36 32 35 36 30 39 35 35  em0 = { 62560955
0ab0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ac0: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 0a 23 64 65   0, 0, 0 };..#de
0ad0: 66 69 6e 65 20 6d 65 6d 30 20 47 4c 4f 42 41 4c  fine mem0 GLOBAL
0ae0: 28 73 74 72 75 63 74 20 4d 65 6d 30 47 6c 6f 62  (struct Mem0Glob
0af0: 61 6c 2c 20 6d 65 6d 30 29 0a 0a 2f 2a 0a 2a 2a  al, mem0)../*.**
0b00: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
0b10: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0b20: 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a  n subsystem..*/.
0b30: 69 6e 74 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  int sqlite3Mallo
0b40: 63 49 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69  cInit(void){.  i
0b50: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
0b60: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
0b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
0b80: 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28  e3MemSetDefault(
0b90: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  );.  }.  memset(
0ba0: 26 6d 65 6d 30 2c 20 30 2c 20 73 69 7a 65 6f 66  &mem0, 0, sizeof
0bb0: 28 6d 65 6d 30 29 29 3b 0a 20 20 69 66 28 20 73  (mem0));.  if( s
0bc0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
0bd0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
0be0: 0a 20 20 20 20 6d 65 6d 30 2e 6d 75 74 65 78 20  .    mem0.mutex 
0bf0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
0c00: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
0c10: 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 0a 20 20  _STATIC_MEM);.  
0c20: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
0c30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72  lobalConfig.pScr
0c40: 61 74 63 68 20 26 26 20 73 71 6c 69 74 65 33 47  atch && sqlite3G
0c50: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63  lobalConfig.szSc
0c60: 72 61 74 63 68 3e 3d 31 30 30 0a 20 20 20 20 20  ratch>=100.     
0c70: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
0c80: 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68  lConfig.nScratch
0c90: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >=0 ){.    int i
0ca0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
0cb0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
0cc0: 74 63 68 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38  tch = ROUNDDOWN8
0cd0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
0ce0: 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 2d 34  nfig.szScratch-4
0cf0: 29 3b 0a 20 20 20 20 6d 65 6d 30 2e 61 53 63 72  );.    mem0.aScr
0d00: 61 74 63 68 46 72 65 65 20 3d 20 28 75 33 32 2a  atchFree = (u32*
0d10: 29 26 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  )&((char*)sqlite
0d20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
0d30: 63 72 61 74 63 68 29 0a 20 20 20 20 20 20 20 20  cratch).        
0d40: 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 69 74            [sqlit
0d50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0d60: 7a 53 63 72 61 74 63 68 2a 73 71 6c 69 74 65 33  zScratch*sqlite3
0d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
0d80: 72 61 74 63 68 5d 3b 0a 20 20 20 20 66 6f 72 28  ratch];.    for(
0d90: 69 3d 30 3b 20 69 3c 73 71 6c 69 74 65 33 47 6c  i=0; i<sqlite3Gl
0da0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61  obalConfig.nScra
0db0: 74 63 68 3b 20 69 2b 2b 29 7b 20 6d 65 6d 30 2e  tch; i++){ mem0.
0dc0: 61 53 63 72 61 74 63 68 46 72 65 65 5b 69 5d 20  aScratchFree[i] 
0dd0: 3d 20 69 3b 20 7d 0a 20 20 20 20 6d 65 6d 30 2e  = i; }.    mem0.
0de0: 6e 53 63 72 61 74 63 68 46 72 65 65 20 3d 20 73  nScratchFree = s
0df0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
0e00: 69 67 2e 6e 53 63 72 61 74 63 68 3b 0a 20 20 7d  ig.nScratch;.  }
0e10: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
0e20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
0e30: 63 72 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  cratch = 0;.    
0e40: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0e50: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20  fig.szScratch = 
0e60: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
0e70: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0e80: 2e 70 50 61 67 65 20 26 26 20 73 71 6c 69 74 65  .pPage && sqlite
0e90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
0ea0: 50 61 67 65 3e 3d 35 31 32 0a 20 20 20 20 20 20  Page>=512.      
0eb0: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
0ec0: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 3e 3d 31 20  Config.nPage>=1 
0ed0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
0ee0: 20 20 69 6e 74 20 6f 76 65 72 68 65 61 64 3b 0a    int overhead;.
0ef0: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 52 4f 55      int sz = ROU
0f00: 4e 44 44 4f 57 4e 38 28 73 71 6c 69 74 65 33 47  NDDOWN8(sqlite3G
0f10: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
0f20: 67 65 29 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  ge);.    int n =
0f30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
0f40: 6e 66 69 67 2e 6e 50 61 67 65 3b 0a 20 20 20 20  nfig.nPage;.    
0f50: 6f 76 65 72 68 65 61 64 20 3d 20 28 34 2a 6e 20  overhead = (4*n 
0f60: 2b 20 73 7a 20 2d 20 31 29 2f 73 7a 3b 0a 20 20  + sz - 1)/sz;.  
0f70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
0f80: 6f 6e 66 69 67 2e 6e 50 61 67 65 20 2d 3d 20 6f  onfig.nPage -= o
0f90: 76 65 72 68 65 61 64 3b 0a 20 20 20 20 6d 65 6d  verhead;.    mem
0fa0: 30 2e 61 50 61 67 65 46 72 65 65 20 3d 20 28 75  0.aPageFree = (u
0fb0: 33 32 2a 29 26 28 28 63 68 61 72 2a 29 73 71 6c  32*)&((char*)sql
0fc0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0fd0: 2e 70 50 61 67 65 29 0a 20 20 20 20 20 20 20 20  .pPage).        
0fe0: 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 69 74            [sqlit
0ff0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
1000: 7a 50 61 67 65 2a 73 71 6c 69 74 65 33 47 6c 6f  zPage*sqlite3Glo
1010: 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 5d  balConfig.nPage]
1020: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1030: 3c 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  <sqlite3GlobalCo
1040: 6e 66 69 67 2e 6e 50 61 67 65 3b 20 69 2b 2b 29  nfig.nPage; i++)
1050: 7b 20 6d 65 6d 30 2e 61 50 61 67 65 46 72 65 65  { mem0.aPageFree
1060: 5b 69 5d 20 3d 20 69 3b 20 7d 0a 20 20 20 20 6d  [i] = i; }.    m
1070: 65 6d 30 2e 6e 50 61 67 65 46 72 65 65 20 3d 20  em0.nPageFree = 
1080: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1090: 66 69 67 2e 6e 50 61 67 65 3b 0a 20 20 7d 65 6c  fig.nPage;.  }el
10a0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  se{.    sqlite3G
10b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
10c0: 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
10d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
10e0: 7a 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zPage = 0;.  }. 
10f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47   return sqlite3G
1100: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 49  lobalConfig.m.xI
1110: 6e 69 74 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  nit(sqlite3Globa
1120: 6c 43 6f 6e 66 69 67 2e 6d 2e 70 41 70 70 44 61  lConfig.m.pAppDa
1130: 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ta);.}../*.** De
1140: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
1150: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1160: 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a 76   subsystem..*/.v
1170: 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  oid sqlite3Mallo
1180: 63 45 6e 64 28 76 6f 69 64 29 7b 0a 20 20 69 66  cEnd(void){.  if
1190: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
11a0: 6f 6e 66 69 67 2e 6d 2e 78 53 68 75 74 64 6f 77  onfig.m.xShutdow
11b0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
11c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
11d0: 53 68 75 74 64 6f 77 6e 28 73 71 6c 69 74 65 33  Shutdown(sqlite3
11e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 70  GlobalConfig.m.p
11f0: 41 70 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  AppData);.  }.  
1200: 6d 65 6d 73 65 74 28 26 6d 65 6d 30 2c 20 30 2c  memset(&mem0, 0,
1210: 20 73 69 7a 65 6f 66 28 6d 65 6d 30 29 29 3b 0a   sizeof(mem0));.
1220: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1230: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
1240: 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 63  mory currently c
1250: 68 65 63 6b 65 64 20 6f 75 74 2e 0a 2a 2f 0a 73  hecked out..*/.s
1260: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
1270: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
1280: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6e 2c  (void){.  int n,
1290: 20 6d 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   mx;.  sqlite3_i
12a0: 6e 74 36 34 20 72 65 73 3b 0a 20 20 73 71 6c 69  nt64 res;.  sqli
12b0: 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54  te3_status(SQLIT
12c0: 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
12d0: 55 53 45 44 2c 20 26 6e 2c 20 26 6d 78 2c 20 30  USED, &n, &mx, 0
12e0: 29 3b 0a 20 20 72 65 73 20 3d 20 28 73 71 6c 69  );.  res = (sqli
12f0: 74 65 33 5f 69 6e 74 36 34 29 6e 3b 20 20 2f 2a  te3_int64)n;  /*
1300: 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   Work around bug
1310: 20 69 6e 20 42 6f 72 6c 61 6e 64 20 43 2e 20 54   in Borland C. T
1320: 69 63 6b 65 74 20 23 33 32 31 36 20 2a 2f 0a 20  icket #3216 */. 
1330: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1340: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1350: 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
1360: 6f 66 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 68  of memory that h
1370: 61 73 20 65 76 65 72 20 62 65 65 6e 0a 2a 2a 20  as ever been.** 
1380: 63 68 65 63 6b 65 64 20 6f 75 74 20 73 69 6e 63  checked out sinc
1390: 65 20 65 69 74 68 65 72 20 74 68 65 20 62 65 67  e either the beg
13a0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 70  inning of this p
13b0: 72 6f 63 65 73 73 0a 2a 2a 20 6f 72 20 73 69 6e  rocess.** or sin
13c0: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
13d0: 6e 74 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 71 6c  nt reset..*/.sql
13e0: 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
13f0: 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61  e3_memory_highwa
1400: 74 65 72 28 69 6e 74 20 72 65 73 65 74 46 6c 61  ter(int resetFla
1410: 67 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 6d 78 3b  g){.  int n, mx;
1420: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1430: 20 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f   res;.  sqlite3_
1440: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
1450: 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
1460: 2c 20 26 6e 2c 20 26 6d 78 2c 20 72 65 73 65 74  , &n, &mx, reset
1470: 46 6c 61 67 29 3b 0a 20 20 72 65 73 20 3d 20 28  Flag);.  res = (
1480: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 6d 78  sqlite3_int64)mx
1490: 3b 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e  ;  /* Work aroun
14a0: 64 20 62 75 67 20 69 6e 20 42 6f 72 6c 61 6e 64  d bug in Borland
14b0: 20 43 2e 20 54 69 63 6b 65 74 20 23 33 32 31 36   C. Ticket #3216
14c0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 65 73   */.  return res
14d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
14e0: 65 20 74 68 65 20 61 6c 61 72 6d 20 63 61 6c 6c  e the alarm call
14f0: 62 61 63 6b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  back.*/.int sqli
1500: 74 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d 28 0a  te3MemoryAlarm(.
1510: 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63    void(*xCallbac
1520: 6b 29 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 73  k)(void *pArg, s
1530: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 73 65  qlite3_int64 use
1540: 64 2c 69 6e 74 20 4e 29 2c 0a 20 20 76 6f 69 64  d,int N),.  void
1550: 20 2a 70 41 72 67 2c 0a 20 20 73 71 6c 69 74 65   *pArg,.  sqlite
1560: 33 5f 69 6e 74 36 34 20 69 54 68 72 65 73 68 6f  3_int64 iThresho
1570: 6c 64 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ld.){.  sqlite3_
1580: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30  mutex_enter(mem0
1590: 2e 6d 75 74 65 78 29 3b 0a 20 20 6d 65 6d 30 2e  .mutex);.  mem0.
15a0: 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20 3d 20  alarmCallback = 
15b0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 6d 65 6d  xCallback;.  mem
15c0: 30 2e 61 6c 61 72 6d 41 72 67 20 3d 20 70 41 72  0.alarmArg = pAr
15d0: 67 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 54  g;.  mem0.alarmT
15e0: 68 72 65 73 68 6f 6c 64 20 3d 20 69 54 68 72 65  hreshold = iThre
15f0: 73 68 6f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  shold;.  sqlite3
1600: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
1610: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  0.mutex);.  retu
1620: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1630: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1640: 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
1650: 2f 2a 0a 2a 2a 20 44 65 70 72 65 63 61 74 65 64  /*.** Deprecated
1660: 20 65 78 74 65 72 6e 61 6c 20 69 6e 74 65 72 66   external interf
1670: 61 63 65 2e 20 20 49 6e 74 65 72 6e 61 6c 2f 63  ace.  Internal/c
1680: 6f 72 65 20 53 51 4c 69 74 65 20 63 6f 64 65 0a  ore SQLite code.
1690: 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73  ** should call s
16a0: 71 6c 69 74 65 33 4d 65 6d 6f 72 79 41 6c 61 72  qlite3MemoryAlar
16b0: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
16c0: 33 5f 6d 65 6d 6f 72 79 5f 61 6c 61 72 6d 28 0a  3_memory_alarm(.
16d0: 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63    void(*xCallbac
16e0: 6b 29 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 73  k)(void *pArg, s
16f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 73 65  qlite3_int64 use
1700: 64 2c 69 6e 74 20 4e 29 2c 0a 20 20 76 6f 69 64  d,int N),.  void
1710: 20 2a 70 41 72 67 2c 0a 20 20 73 71 6c 69 74 65   *pArg,.  sqlite
1720: 33 5f 69 6e 74 36 34 20 69 54 68 72 65 73 68 6f  3_int64 iThresho
1730: 6c 64 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ld.){.  return s
1740: 71 6c 69 74 65 33 4d 65 6d 6f 72 79 41 6c 61 72  qlite3MemoryAlar
1750: 6d 28 78 43 61 6c 6c 62 61 63 6b 2c 20 70 41 72  m(xCallback, pAr
1760: 67 2c 20 69 54 68 72 65 73 68 6f 6c 64 29 3b 0a  g, iThreshold);.
1770: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1780: 54 72 69 67 67 65 72 20 74 68 65 20 61 6c 61 72  Trigger the alar
1790: 6d 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m .*/.static voi
17a0: 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41  d sqlite3MallocA
17b0: 6c 61 72 6d 28 69 6e 74 20 6e 42 79 74 65 29 7b  larm(int nByte){
17c0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
17d0: 61 63 6b 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ack)(void*,sqlit
17e0: 65 33 5f 69 6e 74 36 34 2c 69 6e 74 29 3b 0a 20  e3_int64,int);. 
17f0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1800: 6f 77 55 73 65 64 3b 0a 20 20 76 6f 69 64 20 2a  owUsed;.  void *
1810: 70 41 72 67 3b 0a 20 20 69 66 28 20 6d 65 6d 30  pArg;.  if( mem0
1820: 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 3d 3d  .alarmCallback==
1830: 30 20 7c 7c 20 6d 65 6d 30 2e 61 6c 61 72 6d 42  0 || mem0.alarmB
1840: 75 73 79 20 20 29 20 72 65 74 75 72 6e 3b 0a 20  usy  ) return;. 
1850: 20 6d 65 6d 30 2e 61 6c 61 72 6d 42 75 73 79 20   mem0.alarmBusy 
1860: 3d 20 31 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b  = 1;.  xCallback
1870: 20 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c   = mem0.alarmCal
1880: 6c 62 61 63 6b 3b 0a 20 20 6e 6f 77 55 73 65 64  lback;.  nowUsed
1890: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 75 73   = sqlite3Status
18a0: 56 61 6c 75 65 28 53 51 4c 49 54 45 5f 53 54 41  Value(SQLITE_STA
18b0: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 29  TUS_MEMORY_USED)
18c0: 3b 0a 20 20 70 41 72 67 20 3d 20 6d 65 6d 30 2e  ;.  pArg = mem0.
18d0: 61 6c 61 72 6d 41 72 67 3b 0a 20 20 73 71 6c 69  alarmArg;.  sqli
18e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
18f0: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 78  mem0.mutex);.  x
1900: 43 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e  Callback(pArg, n
1910: 6f 77 55 73 65 64 2c 20 6e 42 79 74 65 29 3b 0a  owUsed, nByte);.
1920: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1930: 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78  enter(mem0.mutex
1940: 29 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 42  );.  mem0.alarmB
1950: 75 73 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  usy = 0;.}../*.*
1960: 2a 20 44 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * Do a memory al
1970: 6c 6f 63 61 74 69 6f 6e 20 77 69 74 68 20 73 74  location with st
1980: 61 74 69 73 74 69 63 73 20 61 6e 64 20 61 6c 61  atistics and ala
1990: 72 6d 73 2e 20 20 41 73 73 75 6d 65 20 74 68 65  rms.  Assume the
19a0: 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  .** lock is alre
19b0: 61 64 79 20 68 65 6c 64 2e 0a 2a 2f 0a 73 74 61  ady held..*/.sta
19c0: 74 69 63 20 69 6e 74 20 6d 61 6c 6c 6f 63 57 69  tic int mallocWi
19d0: 74 68 41 6c 61 72 6d 28 69 6e 74 20 6e 2c 20 76  thAlarm(int n, v
19e0: 6f 69 64 20 2a 2a 70 70 29 7b 0a 20 20 69 6e 74  oid **pp){.  int
19f0: 20 6e 46 75 6c 6c 3b 0a 20 20 76 6f 69 64 20 2a   nFull;.  void *
1a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
1a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a20: 6d 65 6d 30 2e 6d 75 74 65 78 29 20 29 3b 0a 20  mem0.mutex) );. 
1a30: 20 6e 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33   nFull = sqlite3
1a40: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
1a50: 52 6f 75 6e 64 75 70 28 6e 29 3b 0a 20 20 73 71  Roundup(n);.  sq
1a60: 6c 69 74 65 33 53 74 61 74 75 73 53 65 74 28 53  lite3StatusSet(S
1a70: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
1a80: 4c 4f 43 5f 53 49 5a 45 2c 20 6e 29 3b 0a 20 20  LOC_SIZE, n);.  
1a90: 69 66 28 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61  if( mem0.alarmCa
1aa0: 6c 6c 62 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20  llback!=0 ){.   
1ab0: 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 73 71 6c   int nUsed = sql
1ac0: 69 74 65 33 53 74 61 74 75 73 56 61 6c 75 65 28  ite3StatusValue(
1ad0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45  SQLITE_STATUS_ME
1ae0: 4d 4f 52 59 5f 55 53 45 44 29 3b 0a 20 20 20 20  MORY_USED);.    
1af0: 69 66 28 20 6e 55 73 65 64 2b 6e 46 75 6c 6c 20  if( nUsed+nFull 
1b00: 3e 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d 54 68 72  >= mem0.alarmThr
1b10: 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20  eshold ){.      
1b20: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61  sqlite3MallocAla
1b30: 72 6d 28 6e 46 75 6c 6c 29 3b 0a 20 20 20 20 7d  rm(nFull);.    }
1b40: 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
1b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1b60: 2e 78 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 29 3b  .xMalloc(nFull);
1b70: 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26 20 6d  .  if( p==0 && m
1b80: 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63  em0.alarmCallbac
1b90: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
1ba0: 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 46 75 6c  MallocAlarm(nFul
1bb0: 6c 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  l);.    p = sqli
1bc0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1bd0: 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 29  m.xMalloc(nFull)
1be0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 7b  ;.  }.  if( p ){
1bf0: 0a 20 20 20 20 6e 46 75 6c 6c 20 3d 20 73 71 6c  .    nFull = sql
1c00: 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  ite3MallocSize(p
1c10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  );.    sqlite3St
1c20: 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53  atusAdd(SQLITE_S
1c30: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
1c40: 44 2c 20 6e 46 75 6c 6c 29 3b 0a 20 20 7d 0a 20  D, nFull);.  }. 
1c50: 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75   *pp = p;.  retu
1c60: 72 6e 20 6e 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn nFull;.}../*.
1c70: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  ** Allocate memo
1c80: 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ry.  This routin
1c90: 65 20 69 73 20 6c 69 6b 65 20 73 71 6c 69 74 65  e is like sqlite
1ca0: 33 5f 6d 61 6c 6c 6f 63 28 29 20 65 78 63 65 70  3_malloc() excep
1cb0: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 61 73 73  t that it.** ass
1cc0: 75 6d 65 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  umes the memory 
1cd0: 73 75 62 73 79 73 74 65 6d 20 68 61 73 20 61 6c  subsystem has al
1ce0: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69 74 69  ready been initi
1cf0: 61 6c 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  alized..*/.void 
1d00: 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 69  *sqlite3Malloc(i
1d10: 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70  nt n){.  void *p
1d20: 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 7c 7c 20  ;.  if( n<=0 || 
1d30: 4e 45 56 45 52 28 6e 3e 3d 30 78 37 66 66 66 66  NEVER(n>=0x7ffff
1d40: 66 30 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f00) ){.    /* T
1d50: 68 65 20 4e 45 56 45 52 28 6e 3e 3d 30 78 37 66  he NEVER(n>=0x7f
1d60: 66 66 66 66 30 30 29 20 74 65 72 6d 20 69 73 20  ffff00) term is 
1d70: 61 64 64 65 64 20 6f 75 74 20 6f 66 20 70 61 72  added out of par
1d80: 61 6e 6f 69 61 2e 20 20 57 65 20 77 61 6e 74 20  anoia.  We want 
1d90: 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 61  to make.    ** a
1da0: 62 73 6f 6c 75 74 65 6c 79 20 73 75 72 65 20 74  bsolutely sure t
1db0: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hat there is not
1dc0: 68 69 6e 67 20 77 69 74 68 69 6e 20 53 51 4c 69  hing within SQLi
1dd0: 74 65 20 74 68 61 74 20 63 61 6e 20 63 61 75 73  te that can caus
1de0: 65 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  e a.    ** memor
1df0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  y allocation of 
1e00: 61 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  a number of byte
1e10: 73 20 77 68 69 63 68 20 69 73 20 6e 65 61 72 20  s which is near 
1e20: 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 67 6e  the maximum sign
1e30: 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  ed.    ** intege
1e40: 72 20 76 61 6c 75 65 20 61 6e 64 20 74 68 75 73  r value and thus
1e50: 20 63 61 75 73 65 20 61 6e 20 69 6e 74 65 67 65   cause an intege
1e60: 72 20 6f 76 65 72 66 6c 6f 77 20 69 6e 73 69 64  r overflow insid
1e70: 65 20 6f 66 20 74 68 65 20 78 4d 61 6c 6c 6f 63  e of the xMalloc
1e80: 28 29 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  ().    ** implem
1e90: 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 6e  entation.  The n
1ea0: 3e 3d 30 78 37 66 66 66 66 66 30 30 20 67 69 76  >=0x7fffff00 giv
1eb0: 65 73 20 75 73 20 32 35 35 20 62 79 74 65 73 20  es us 255 bytes 
1ec0: 6f 66 20 68 65 61 64 72 6f 6f 6d 2e 20 20 54 68  of headroom.  Th
1ed0: 65 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 73 68  e.    ** test sh
1ee0: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 74 72  ould never be tr
1ef0: 75 65 20 62 65 63 61 75 73 65 20 53 51 4c 49 54  ue because SQLIT
1f00: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 73 68 6f  E_MAX_LENGTH sho
1f10: 75 6c 64 20 62 65 20 6d 75 63 68 0a 20 20 20 20  uld be much.    
1f20: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 30 78 37  ** less than 0x7
1f30: 66 66 66 66 66 30 30 20 61 6e 64 20 69 74 20 73  fffff00 and it s
1f40: 68 6f 75 6c 64 20 63 61 74 63 68 20 6c 61 72 67  hould catch larg
1f50: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
1f60: 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 62 65 66 6f  ions.    ** befo
1f70: 72 65 20 74 68 65 79 20 72 65 61 63 68 20 74 68  re they reach th
1f80: 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  is point. */.   
1f90: 20 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20   p = 0;.  }else 
1fa0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1fb0: 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74  lConfig.bMemstat
1fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1fd0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30  mutex_enter(mem0
1fe0: 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 6d 61 6c  .mutex);.    mal
1ff0: 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28 6e 2c 20  locWithAlarm(n, 
2000: 26 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  &p);.    sqlite3
2010: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
2020: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73  0.mutex);.  }els
2030: 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e{.    p = sqlit
2040: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2050: 2e 78 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d  .xMalloc(n);.  }
2060: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2070: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
2080: 6f 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  on of the memory
2090: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 66   allocation is f
20a0: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 61 70  or use by the ap
20b0: 70 6c 69 63 61 74 69 6f 6e 2e 0a 2a 2a 20 46 69  plication..** Fi
20c0: 72 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rst make sure th
20d0: 65 20 6d 65 6d 6f 72 79 20 73 75 62 73 79 73 74  e memory subsyst
20e0: 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  em is initialize
20f0: 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 0a 2a  d, then do the.*
2100: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  * allocation..*/
2110: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 6d  .void *sqlite3_m
2120: 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 23 69  alloc(int n){.#i
2130: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2140: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28  T_AUTOINIT.  if(
2150: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
2160: 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30  ize() ) return 0
2170: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
2180: 6e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  n sqlite3Malloc(
2190: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  n);.}../*.** Eac
21a0: 68 20 74 68 72 65 61 64 20 6d 61 79 20 6f 6e 6c  h thread may onl
21b0: 79 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  y have a single 
21c0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f  outstanding allo
21d0: 63 61 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 78  cation from.** x
21e0: 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 29 2e  ScratchMalloc().
21f0: 20 20 57 65 20 76 65 72 69 66 79 20 74 68 69 73    We verify this
2200: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74   constraint in t
2210: 68 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64  he single-thread
2220: 65 64 0a 2a 2a 20 63 61 73 65 20 62 79 20 73 65  ed.** case by se
2230: 74 74 69 6e 67 20 73 63 72 61 74 63 68 41 6c 6c  tting scratchAll
2240: 6f 63 4f 75 74 20 74 6f 20 31 20 77 68 65 6e 20  ocOut to 1 when 
2250: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
2260: 20 69 73 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   is outstanding 
2270: 63 6c 65 61 72 69 6e 67 20 69 74 20 77 68 65 6e  clearing it when
2280: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
2290: 69 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 23 69 66  is freed..*/.#if
22a0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
22b0: 46 45 3d 3d 30 20 26 26 20 21 64 65 66 69 6e 65  FE==0 && !define
22c0: 64 28 4e 44 45 42 55 47 29 0a 73 74 61 74 69 63  d(NDEBUG).static
22d0: 20 69 6e 74 20 73 63 72 61 74 63 68 41 6c 6c 6f   int scratchAllo
22e0: 63 4f 75 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cOut = 0;.#endif
22f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
2300: 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 69 73  e memory that is
2310: 20 74 6f 20 62 65 20 75 73 65 64 20 61 6e 64 20   to be used and 
2320: 72 65 6c 65 61 73 65 64 20 72 69 67 68 74 20 61  released right a
2330: 77 61 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  way..** This rou
2340: 74 69 6e 65 20 69 73 20 73 69 6d 69 6c 61 72 20  tine is similar 
2350: 74 6f 20 61 6c 6c 6f 63 61 28 29 20 69 6e 20 74  to alloca() in t
2360: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 69 6e  hat it is not in
2370: 74 65 6e 64 65 64 0a 2a 2a 20 66 6f 72 20 73 69  tended.** for si
2380: 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 74  tuations where t
2390: 68 65 20 6d 65 6d 6f 72 79 20 6d 69 67 68 74 20  he memory might 
23a0: 62 65 20 68 65 6c 64 20 6c 6f 6e 67 2d 74 65 72  be held long-ter
23b0: 6d 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  m.  This.** rout
23c0: 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ine is intended 
23d0: 74 6f 20 67 65 74 20 6d 65 6d 6f 72 79 20 74 6f  to get memory to
23e0: 20 6f 6c 64 20 6c 61 72 67 65 20 74 72 61 6e 73   old large trans
23f0: 69 65 6e 74 20 64 61 74 61 0a 2a 2a 20 73 74 72  ient data.** str
2400: 75 63 74 75 72 65 73 20 74 68 61 74 20 77 6f 75  uctures that wou
2410: 6c 64 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20  ld not normally 
2420: 66 69 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  fit on the stack
2430: 20 6f 66 20 61 6e 0a 2a 2a 20 65 6d 62 65 64 64   of an.** embedd
2440: 65 64 20 70 72 6f 63 65 73 73 6f 72 2e 0a 2a 2f  ed processor..*/
2450: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 53 63  .void *sqlite3Sc
2460: 72 61 74 63 68 4d 61 6c 6c 6f 63 28 69 6e 74 20  ratchMalloc(int 
2470: 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  n){.  void *p;. 
2480: 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
2490: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
24a0: 41 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65  ADSAFE==0 && !de
24b0: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20  fined(NDEBUG).  
24c0: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 6e  /* Verify that n
24d0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
24e0: 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69  scratch allocati
24f0: 6f 6e 20 70 65 72 20 74 68 72 65 61 64 0a 20 20  on per thread.  
2500: 2a 2a 20 69 73 20 6f 75 74 73 74 61 6e 64 69 6e  ** is outstandin
2510: 67 20 61 74 20 6f 6e 65 20 74 69 6d 65 2e 20 20  g at one time.  
2520: 28 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 63 68  (This is only ch
2530: 65 63 6b 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  ecked in the.  *
2540: 2a 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  * single-threade
2550: 64 20 63 61 73 65 20 73 69 6e 63 65 20 63 68 65  d case since che
2560: 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 6d 75 6c  cking in the mul
2570: 74 69 2d 74 68 72 65 61 64 65 64 20 63 61 73 65  ti-threaded case
2580: 0a 20 20 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d  .  ** would be m
2590: 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63  uch more complic
25a0: 61 74 65 64 2e 29 20 2a 2f 0a 20 20 61 73 73 65  ated.) */.  asse
25b0: 72 74 28 20 73 63 72 61 74 63 68 41 6c 6c 6f 63  rt( scratchAlloc
25c0: 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Out==0 );.#endif
25d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
25e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63  lobalConfig.szSc
25f0: 72 61 74 63 68 3c 6e 20 29 7b 0a 20 20 20 20 67  ratch<n ){.    g
2600: 6f 74 6f 20 73 63 72 61 74 63 68 5f 6f 76 65 72  oto scratch_over
2610: 66 6c 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  flow;.  }else{  
2620: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
2630: 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75  ex_enter(mem0.mu
2640: 74 65 78 29 3b 0a 20 20 20 20 69 66 28 20 6d 65  tex);.    if( me
2650: 6d 30 2e 6e 53 63 72 61 74 63 68 46 72 65 65 3d  m0.nScratchFree=
2660: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2670: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2680: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20  mem0.mutex);.   
2690: 20 20 20 67 6f 74 6f 20 73 63 72 61 74 63 68 5f     goto scratch_
26a0: 6f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 7d 65  overflow;.    }e
26b0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
26c0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 6d 65 6d 30  ;.      i = mem0
26d0: 2e 61 53 63 72 61 74 63 68 46 72 65 65 5b 2d 2d  .aScratchFree[--
26e0: 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46 72 65  mem0.nScratchFre
26f0: 65 5d 3b 0a 20 20 20 20 20 20 69 20 2a 3d 20 73  e];.      i *= s
2700: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2710: 69 67 2e 73 7a 53 63 72 61 74 63 68 3b 0a 20 20  ig.szScratch;.  
2720: 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75      sqlite3Statu
2730: 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54  sAdd(SQLITE_STAT
2740: 55 53 5f 53 43 52 41 54 43 48 5f 55 53 45 44 2c  US_SCRATCH_USED,
2750: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
2760: 65 33 53 74 61 74 75 73 53 65 74 28 53 51 4c 49  e3StatusSet(SQLI
2770: 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43  TE_STATUS_SCRATC
2780: 48 5f 53 49 5a 45 2c 20 6e 29 3b 0a 20 20 20 20  H_SIZE, n);.    
2790: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
27a0: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
27b0: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 76 6f  );.      p = (vo
27c0: 69 64 2a 29 26 28 28 63 68 61 72 2a 29 73 71 6c  id*)&((char*)sql
27d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
27e0: 2e 70 53 63 72 61 74 63 68 29 5b 69 5d 3b 0a 20  .pScratch)[i];. 
27f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 20 28 28       assert(  ((
2800: 28 75 38 2a 29 70 20 2d 20 28 75 38 2a 29 30 29  (u8*)p - (u8*)0)
2810: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
2820: 7d 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  }.  }.#if SQLITE
2830: 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 20 26  _THREADSAFE==0 &
2840: 26 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  & !defined(NDEBU
2850: 47 29 0a 20 20 73 63 72 61 74 63 68 41 6c 6c 6f  G).  scratchAllo
2860: 63 4f 75 74 20 3d 20 70 21 3d 30 3b 0a 23 65 6e  cOut = p!=0;.#en
2870: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b  dif..  return p;
2880: 0a 0a 73 63 72 61 74 63 68 5f 6f 76 65 72 66 6c  ..scratch_overfl
2890: 6f 77 3a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ow:.  if( sqlite
28a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d  3GlobalConfig.bM
28b0: 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 73 71  emstat ){.    sq
28c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
28d0: 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  r(mem0.mutex);. 
28e0: 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73     sqlite3Status
28f0: 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55  Set(SQLITE_STATU
2900: 53 5f 53 43 52 41 54 43 48 5f 53 49 5a 45 2c 20  S_SCRATCH_SIZE, 
2910: 6e 29 3b 0a 20 20 20 20 6e 20 3d 20 6d 61 6c 6c  n);.    n = mall
2920: 6f 63 57 69 74 68 41 6c 61 72 6d 28 6e 2c 20 26  ocWithAlarm(n, &
2930: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  p);.    if( p ) 
2940: 73 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 64  sqlite3StatusAdd
2950: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53  (SQLITE_STATUS_S
2960: 43 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57 2c  CRATCH_OVERFLOW,
2970: 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
2980: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
2990: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73  0.mutex);.  }els
29a0: 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e{.    p = sqlit
29b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
29c0: 2e 78 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d  .xMalloc(n);.  }
29d0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
29e0: 41 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65  ADSAFE==0 && !de
29f0: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20  fined(NDEBUG).  
2a00: 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 20  scratchAllocOut 
2a10: 3d 20 70 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 20  = p!=0;.#endif. 
2a20: 20 72 65 74 75 72 6e 20 70 3b 20 20 20 20 0a 7d   return p;    .}
2a30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 63 72  .void sqlite3Scr
2a40: 61 74 63 68 46 72 65 65 28 76 6f 69 64 20 2a 70  atchFree(void *p
2a50: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 0a 23  ){.  if( p ){..#
2a60: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2a70: 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65 66 69  SAFE==0 && !defi
2a80: 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20 20 20  ned(NDEBUG).    
2a90: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 6e  /* Verify that n
2aa0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2ab0: 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69  scratch allocati
2ac0: 6f 6e 20 70 65 72 20 74 68 72 65 61 64 0a 20 20  on per thread.  
2ad0: 20 20 2a 2a 20 69 73 20 6f 75 74 73 74 61 6e 64    ** is outstand
2ae0: 69 6e 67 20 61 74 20 6f 6e 65 20 74 69 6d 65 2e  ing at one time.
2af0: 20 20 28 54 68 69 73 20 69 73 20 6f 6e 6c 79 20    (This is only 
2b00: 63 68 65 63 6b 65 64 20 69 6e 20 74 68 65 0a 20  checked in the. 
2b10: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 2d 74 68 72     ** single-thr
2b20: 65 61 64 65 64 20 63 61 73 65 20 73 69 6e 63 65  eaded case since
2b30: 20 63 68 65 63 6b 69 6e 67 20 69 6e 20 74 68 65   checking in the
2b40: 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20   multi-threaded 
2b50: 63 61 73 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  case.    ** woul
2b60: 64 20 62 65 20 6d 75 63 68 20 6d 6f 72 65 20 63  d be much more c
2b70: 6f 6d 70 6c 69 63 61 74 65 64 2e 29 20 2a 2f 0a  omplicated.) */.
2b80: 20 20 20 20 61 73 73 65 72 74 28 20 73 63 72 61      assert( scra
2b90: 74 63 68 41 6c 6c 6f 63 4f 75 74 3d 3d 31 20 29  tchAllocOut==1 )
2ba0: 3b 0a 20 20 20 20 73 63 72 61 74 63 68 41 6c 6c  ;.    scratchAll
2bb0: 6f 63 4f 75 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ocOut = 0;.#endi
2bc0: 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  f..    if( sqlit
2bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2be0: 53 63 72 61 74 63 68 3d 3d 30 0a 20 20 20 20 20  Scratch==0.     
2bf0: 20 20 20 20 20 20 7c 7c 20 70 3c 73 71 6c 69 74        || p<sqlit
2c00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2c10: 53 63 72 61 74 63 68 0a 20 20 20 20 20 20 20 20  Scratch.        
2c20: 20 20 20 7c 7c 20 70 3e 3d 28 76 6f 69 64 2a 29     || p>=(void*)
2c30: 6d 65 6d 30 2e 61 53 63 72 61 74 63 68 46 72 65  mem0.aScratchFre
2c40: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  e ){.      if( s
2c50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2c60: 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20  ig.bMemstat ){. 
2c70: 20 20 20 20 20 20 20 69 6e 74 20 69 53 69 7a 65         int iSize
2c80: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2c90: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20  Size(p);.       
2ca0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2cb0: 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29  nter(mem0.mutex)
2cc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2cd0: 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54  3StatusAdd(SQLIT
2ce0: 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48  E_STATUS_SCRATCH
2cf0: 5f 4f 56 45 52 46 4c 4f 57 2c 20 2d 69 53 69 7a  _OVERFLOW, -iSiz
2d00: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2d10: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
2d20: 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
2d30: 59 5f 55 53 45 44 2c 20 2d 69 53 69 7a 65 29 3b  Y_USED, -iSize);
2d40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
2d60: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  Free(p);.       
2d70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2d80: 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29  eave(mem0.mutex)
2d90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2da0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
2db0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46 72  obalConfig.m.xFr
2dc0: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ee(p);.      }. 
2dd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2de0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 20 3d  int i;.      i =
2df0: 20 28 69 6e 74 29 28 28 75 38 2a 29 70 20 2d 20   (int)((u8*)p - 
2e00: 28 75 38 2a 29 73 71 6c 69 74 65 33 47 6c 6f 62  (u8*)sqlite3Glob
2e10: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
2e20: 68 29 3b 0a 20 20 20 20 20 20 69 20 2f 3d 20 73  h);.      i /= s
2e30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2e40: 69 67 2e 73 7a 53 63 72 61 74 63 68 3b 0a 20 20  ig.szScratch;.  
2e50: 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30      assert( i>=0
2e60: 20 26 26 20 69 3c 73 71 6c 69 74 65 33 47 6c 6f   && i<sqlite3Glo
2e70: 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74  balConfig.nScrat
2e80: 63 68 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ch );.      sqli
2e90: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2ea0: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20  mem0.mutex);.   
2eb0: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 30 2e     assert( mem0.
2ec0: 6e 53 63 72 61 74 63 68 46 72 65 65 3c 28 75 33  nScratchFree<(u3
2ed0: 32 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  2)sqlite3GlobalC
2ee0: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 29  onfig.nScratch )
2ef0: 3b 0a 20 20 20 20 20 20 6d 65 6d 30 2e 61 53 63  ;.      mem0.aSc
2f00: 72 61 74 63 68 46 72 65 65 5b 6d 65 6d 30 2e 6e  ratchFree[mem0.n
2f10: 53 63 72 61 74 63 68 46 72 65 65 2b 2b 5d 20 3d  ScratchFree++] =
2f20: 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
2f30: 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54  3StatusAdd(SQLIT
2f40: 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48  E_STATUS_SCRATCH
2f50: 5f 55 53 45 44 2c 20 2d 31 29 3b 0a 20 20 20 20  _USED, -1);.    
2f60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2f70: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
2f80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2f90: 2f 2a 0a 2a 2a 20 54 52 55 45 20 69 66 20 70 20  /*.** TRUE if p 
2fa0: 69 73 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  is a lookaside m
2fb0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2fc0: 20 66 72 6f 6d 20 64 62 0a 2a 2f 0a 23 69 66 6e   from db.*/.#ifn
2fd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2fe0: 4c 4f 4f 4b 41 53 49 44 45 0a 73 74 61 74 69 63  LOOKASIDE.static
2ff0: 20 69 6e 74 20 69 73 4c 6f 6f 6b 61 73 69 64 65   int isLookaside
3000: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
3010: 69 64 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  id *p){.  return
3020: 20 64 62 20 26 26 20 70 20 26 26 20 70 3e 3d 64   db && p && p>=d
3030: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
3040: 61 72 74 20 26 26 20 70 3c 64 62 2d 3e 6c 6f 6f  art && p<db->loo
3050: 6b 61 73 69 64 65 2e 70 45 6e 64 3b 0a 7d 0a 23  kaside.pEnd;.}.#
3060: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 69 73 4c  else.#define isL
3070: 6f 6f 6b 61 73 69 64 65 28 41 2c 42 29 20 30 0a  ookaside(A,B) 0.
3080: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
3090: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
30a0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
30b0: 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  tion previously 
30c0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
30d0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
30e0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   or sqlite3_mall
30f0: 6f 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oc()..*/.int sql
3100: 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 76  ite3MallocSize(v
3110: 6f 69 64 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  oid *p){.  retur
3120: 6e 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  n sqlite3GlobalC
3130: 6f 6e 66 69 67 2e 6d 2e 78 53 69 7a 65 28 70 29  onfig.m.xSize(p)
3140: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  ;.}.int sqlite3D
3150: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 73 71 6c 69  bMallocSize(sqli
3160: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
3170: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 3d  ){.  assert( db=
3180: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
3190: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
31a0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  ex) );.  if( p==
31b0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
31c0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  0;.  }else if( i
31d0: 73 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70  sLookaside(db, p
31e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
31f0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
3200: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3210: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 6c 6f  eturn sqlite3Glo
3220: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53 69 7a  balConfig.m.xSiz
3230: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
3240: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 70  ** Free memory p
3250: 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e  reviously obtain
3260: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4d  ed from sqlite3M
3270: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64  alloc()..*/.void
3280: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 76 6f   sqlite3_free(vo
3290: 69 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  id *p){.  if( p=
32a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
32b0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
32c0: 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20  Config.bMemstat 
32d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
32e0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e  utex_enter(mem0.
32f0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  mutex);.    sqli
3300: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
3310: 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
3320: 59 5f 55 53 45 44 2c 20 2d 73 71 6c 69 74 65 33  Y_USED, -sqlite3
3330: 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 29 29 3b 0a  MallocSize(p));.
3340: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3350: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28  lConfig.m.xFree(
3360: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
3370: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30  mutex_leave(mem0
3380: 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65  .mutex);.  }else
3390: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
33a0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46 72 65  balConfig.m.xFre
33b0: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
33c0: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 74  ** Free memory t
33d0: 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 73 73  hat might be ass
33e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
33f0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
3400: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
3410: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3420: 33 44 62 46 72 65 65 28 73 71 6c 69 74 65 33 20  3DbFree(sqlite3 
3430: 2a 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20  *db, void *p){. 
3440: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c   assert( db==0 |
3450: 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
3460: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
3470: 29 3b 0a 20 20 69 66 28 20 69 73 4c 6f 6f 6b 61  );.  if( isLooka
3480: 73 69 64 65 28 64 62 2c 20 70 29 20 29 7b 0a 20  side(db, p) ){. 
3490: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
34a0: 20 2a 70 42 75 66 20 3d 20 28 4c 6f 6f 6b 61 73   *pBuf = (Lookas
34b0: 69 64 65 53 6c 6f 74 2a 29 70 3b 0a 20 20 20 20  ideSlot*)p;.    
34c0: 70 42 75 66 2d 3e 70 4e 65 78 74 20 3d 20 64 62  pBuf->pNext = db
34d0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
34e0: 65 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  e;.    db->looka
34f0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 42 75  side.pFree = pBu
3500: 66 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  f;.    db->looka
3510: 73 69 64 65 2e 6e 4f 75 74 2d 2d 3b 0a 20 20 7d  side.nOut--;.  }
3520: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
3530: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
3540: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3550: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78  he size of an ex
3560: 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  isting memory al
3570: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  location.*/.void
3580: 20 2a 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63   *sqlite3Realloc
3590: 28 76 6f 69 64 20 2a 70 4f 6c 64 2c 20 69 6e 74  (void *pOld, int
35a0: 20 6e 42 79 74 65 73 29 7b 0a 20 20 69 6e 74 20   nBytes){.  int 
35b0: 6e 4f 6c 64 2c 20 6e 4e 65 77 3b 0a 20 20 76 6f  nOld, nNew;.  vo
35c0: 69 64 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  id *pNew;.  if( 
35d0: 70 4f 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pOld==0 ){.    r
35e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 61 6c  eturn sqlite3Mal
35f0: 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20 20 7d  loc(nBytes);.  }
3600: 0a 20 20 69 66 28 20 6e 42 79 74 65 73 3c 3d 30  .  if( nBytes<=0
3610: 20 7c 7c 20 4e 45 56 45 52 28 6e 42 79 74 65 73   || NEVER(nBytes
3620: 3e 3d 30 78 37 66 66 66 66 66 30 30 29 20 29 7b  >=0x7fffff00) ){
3630: 0a 20 20 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  .    /* The NEVE
3640: 52 28 2e 2e 2e 29 20 74 65 72 6d 20 69 73 20 65  R(...) term is e
3650: 78 70 6c 61 69 6e 65 64 20 69 6e 20 63 6f 6d 6d  xplained in comm
3660: 65 6e 74 73 20 6f 6e 20 73 71 6c 69 74 65 33 4d  ents on sqlite3M
3670: 61 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 73  alloc() */.    s
3680: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 6c 64  qlite3_free(pOld
3690: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
36a0: 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 73 71  .  }.  nOld = sq
36b0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28  lite3MallocSize(
36c0: 70 4f 6c 64 29 3b 0a 20 20 69 66 28 20 73 71 6c  pOld);.  if( sql
36d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
36e0: 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20  .bMemstat ){.   
36f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
3700: 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29  nter(mem0.mutex)
3710: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61  ;.    sqlite3Sta
3720: 74 75 73 53 65 74 28 53 51 4c 49 54 45 5f 53 54  tusSet(SQLITE_ST
3730: 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45  ATUS_MALLOC_SIZE
3740: 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 6e  , nBytes);.    n
3750: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  New = sqlite3Glo
3760: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 6f 75  balConfig.m.xRou
3770: 6e 64 75 70 28 6e 42 79 74 65 73 29 3b 0a 20 20  ndup(nBytes);.  
3780: 20 20 69 66 28 20 6e 4f 6c 64 3d 3d 6e 4e 65 77    if( nOld==nNew
3790: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
37a0: 20 70 4f 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65   pOld;.    }else
37b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
37c0: 74 65 33 53 74 61 74 75 73 56 61 6c 75 65 28 53  te3StatusValue(S
37d0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d  QLITE_STATUS_MEM
37e0: 4f 52 59 5f 55 53 45 44 29 2b 6e 4e 65 77 2d 6e  ORY_USED)+nNew-n
37f0: 4f 6c 64 20 3e 3d 20 0a 20 20 20 20 20 20 20 20  Old >= .        
3800: 20 20 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 54 68      mem0.alarmTh
3810: 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20  reshold ){.     
3820: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
3830: 41 6c 61 72 6d 28 6e 4e 65 77 2d 6e 4f 6c 64 29  Alarm(nNew-nOld)
3840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3850: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 47 6c  pNew = sqlite3Gl
3860: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 65  obalConfig.m.xRe
3870: 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 4e 65 77  alloc(pOld, nNew
3880: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
3890: 77 3d 3d 30 20 26 26 20 6d 65 6d 30 2e 61 6c 61  w==0 && mem0.ala
38a0: 72 6d 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  rmCallback ){.  
38b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c        sqlite3Mal
38c0: 6c 6f 63 41 6c 61 72 6d 28 6e 42 79 74 65 73 29  locAlarm(nBytes)
38d0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
38e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
38f0: 6e 66 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63 28  nfig.m.xRealloc(
3900: 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  pOld, nNew);.   
3910: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
3920: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  New ){.        n
3930: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  New = sqlite3Mal
3940: 6c 6f 63 53 69 7a 65 28 70 4e 65 77 29 3b 0a 20  locSize(pNew);. 
3950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
3960: 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53  atusAdd(SQLITE_S
3970: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
3980: 44 2c 20 6e 4e 65 77 2d 6e 4f 6c 64 29 3b 0a 20  D, nNew-nOld);. 
3990: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
39a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
39b0: 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29  eave(mem0.mutex)
39c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
39d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  New = sqlite3Glo
39e0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 65 61  balConfig.m.xRea
39f0: 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 42 79 74 65  lloc(pOld, nByte
3a00: 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
3a10: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
3a20: 54 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72  The public inter
3a30: 66 61 63 65 20 74 6f 20 73 71 6c 69 74 65 33 52  face to sqlite3R
3a40: 65 61 6c 6c 6f 63 2e 20 20 4d 61 6b 65 20 73 75  ealloc.  Make su
3a50: 72 65 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  re that the memo
3a60: 72 79 0a 2a 2a 20 73 75 62 73 79 73 74 65 6d 20  ry.** subsystem 
3a70: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 70  is initialized p
3a80: 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
3a90: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 2e 0a   sqliteRealloc..
3aa0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
3ab0: 5f 72 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  _realloc(void *p
3ac0: 4f 6c 64 2c 20 69 6e 74 20 6e 29 7b 0a 23 69 66  Old, int n){.#if
3ad0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3ae0: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20  _AUTOINIT.  if( 
3af0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
3b00: 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ze() ) return 0;
3b10: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
3b20: 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28   sqlite3Realloc(
3b30: 70 4f 6c 64 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a  pOld, n);.}.../*
3b40: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
3b50: 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   zero memory..*/
3b60: 20 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d   .void *sqlite3M
3b70: 61 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74 20 6e 29  allocZero(int n)
3b80: 7b 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 73 71  {.  void *p = sq
3b90: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a  lite3Malloc(n);.
3ba0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6d    if( p ){.    m
3bb0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 29 3b 0a  emset(p, 0, n);.
3bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
3bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
3be0: 65 20 61 6e 64 20 7a 65 72 6f 20 6d 65 6d 6f 72  e and zero memor
3bf0: 79 2e 20 20 49 66 20 74 68 65 20 61 6c 6c 6f 63  y.  If the alloc
3c00: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 6d 61 6b  ation fails, mak
3c10: 65 0a 2a 2a 20 74 68 65 20 6d 61 6c 6c 6f 63 46  e.** the mallocF
3c20: 61 69 6c 65 64 20 66 6c 61 67 20 69 6e 20 74 68  ailed flag in th
3c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69  e connection poi
3c40: 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  nter..*/.void *s
3c50: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
3c60: 72 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ro(sqlite3 *db, 
3c70: 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a  int n){.  void *
3c80: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
3c90: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 29 3b 0a 20  locRaw(db, n);. 
3ca0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6d 65   if( p ){.    me
3cb0: 6d 73 65 74 28 70 2c 20 30 2c 20 6e 29 3b 0a 20  mset(p, 0, n);. 
3cc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
3cd0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
3ce0: 20 61 6e 64 20 7a 65 72 6f 20 6d 65 6d 6f 72 79   and zero memory
3cf0: 2e 20 20 49 66 20 74 68 65 20 61 6c 6c 6f 63 61  .  If the alloca
3d00: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 6d 61 6b 65  tion fails, make
3d10: 0a 2a 2a 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61  .** the mallocFa
3d20: 69 6c 65 64 20 66 6c 61 67 20 69 6e 20 74 68 65  iled flag in the
3d30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e   connection poin
3d40: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 62  ter..**.** If db
3d50: 21 3d 30 20 61 6e 64 20 64 62 2d 3e 6d 61 6c 6c  !=0 and db->mall
3d60: 6f 63 46 61 69 6c 65 64 20 69 73 20 74 72 75 65  ocFailed is true
3d70: 20 28 69 6e 64 69 63 61 74 69 6e 67 20 61 20 70   (indicating a p
3d80: 72 69 6f 72 20 6d 61 6c 6c 6f 63 0a 2a 2a 20 66  rior malloc.** f
3d90: 61 69 6c 75 72 65 20 6f 6e 20 74 68 65 20 73 61  ailure on the sa
3da0: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
3db0: 65 63 74 69 6f 6e 29 20 74 68 65 6e 20 61 6c 77  ection) then alw
3dc0: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ays return 0..**
3dd0: 20 48 65 6e 63 65 20 66 6f 72 20 61 20 70 61 72   Hence for a par
3de0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
3df0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 6f 6e 63   connection, onc
3e00: 65 20 6d 61 6c 6c 6f 63 20 73 74 61 72 74 73 0a  e malloc starts.
3e10: 2a 2a 20 66 61 69 6c 69 6e 67 2c 20 69 74 20 66  ** failing, it f
3e20: 61 69 6c 73 20 63 6f 6e 73 69 73 74 65 6e 74 6c  ails consistentl
3e30: 79 20 75 6e 74 69 6c 20 6d 61 6c 6c 6f 63 46 61  y until mallocFa
3e40: 69 6c 65 64 20 69 73 20 72 65 73 65 74 2e 0a 2a  iled is reset..*
3e50: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6d 70  * This is an imp
3e60: 6f 72 74 61 6e 74 20 61 73 73 75 6d 70 74 69 6f  ortant assumptio
3e70: 6e 2e 20 20 54 68 65 72 65 20 61 72 65 20 6d 61  n.  There are ma
3e80: 6e 79 20 70 6c 61 63 65 73 20 69 6e 20 74 68 65  ny places in the
3e90: 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 64 6f  .** code that do
3ea0: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 68 69   things like thi
3eb0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
3ec0: 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29   int *a = (int*)
3ed0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
3ee0: 61 77 28 64 62 2c 20 31 30 30 29 3b 0a 2a 2a 20  aw(db, 100);.** 
3ef0: 20 20 20 20 20 20 20 20 69 6e 74 20 2a 62 20 3d          int *b =
3f00: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62   (int*)sqlite3Db
3f10: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 32 30  MallocRaw(db, 20
3f20: 30 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  0);.**         i
3f30: 66 28 20 62 20 29 20 61 5b 31 30 5d 20 3d 20 39  f( b ) a[10] = 9
3f40: 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ;.**.** In other
3f50: 20 77 6f 72 64 73 2c 20 69 66 20 61 20 73 75 62   words, if a sub
3f60: 73 65 71 75 65 6e 74 20 6d 61 6c 6c 6f 63 20 28  sequent malloc (
3f70: 65 78 3a 20 22 62 22 29 20 77 6f 72 6b 65 64 2c  ex: "b") worked,
3f80: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 0a 2a   it is assumed.*
3f90: 2a 20 74 68 61 74 20 61 6c 6c 20 70 72 69 6f 72  * that all prior
3fa0: 20 6d 61 6c 6c 6f 63 73 20 28 65 78 3a 20 22 61   mallocs (ex: "a
3fb0: 22 29 20 77 6f 72 6b 65 64 20 74 6f 6f 2e 0a 2a  ") worked too..*
3fc0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44  /.void *sqlite3D
3fd0: 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74  bMallocRaw(sqlit
3fe0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 29 7b 0a  e3 *db, int n){.
3ff0: 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 61 73 73    void *p;.  ass
4000: 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71  ert( db==0 || sq
4010: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4020: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 23  (db->mutex) );.#
4030: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4040: 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 69  IT_LOOKASIDE.  i
4050: 66 28 20 64 62 20 29 7b 0a 20 20 20 20 4c 6f 6f  f( db ){.    Loo
4060: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 42 75 66  kasideSlot *pBuf
4070: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
4080: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
4090: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
40a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
40b0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
40c0: 65 64 20 26 26 20 6e 3c 3d 64 62 2d 3e 6c 6f 6f  ed && n<=db->loo
40d0: 6b 61 73 69 64 65 2e 73 7a 0a 20 20 20 20 20 20  kaside.sz.      
40e0: 20 20 20 26 26 20 28 70 42 75 66 20 3d 20 64 62     && (pBuf = db
40f0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
4100: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  e)!=0 ){.      d
4110: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72  b->lookaside.pFr
4120: 65 65 20 3d 20 70 42 75 66 2d 3e 70 4e 65 78 74  ee = pBuf->pNext
4130: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
4140: 61 73 69 64 65 2e 6e 4f 75 74 2b 2b 3b 0a 20 20  aside.nOut++;.  
4150: 20 20 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b      if( db->look
4160: 61 73 69 64 65 2e 6e 4f 75 74 3e 64 62 2d 3e 6c  aside.nOut>db->l
4170: 6f 6f 6b 61 73 69 64 65 2e 6d 78 4f 75 74 20 29  ookaside.mxOut )
4180: 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f  {.        db->lo
4190: 6f 6b 61 73 69 64 65 2e 6d 78 4f 75 74 20 3d 20  okaside.mxOut = 
41a0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
41b0: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
41c0: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
41d0: 70 42 75 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBuf;.    }.  }.
41e0: 23 65 6c 73 65 0a 20 20 69 66 28 20 64 62 20 26  #else.  if( db &
41f0: 26 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  & db->mallocFail
4200: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
4210: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
4220: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
4230: 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 21 70 20  oc(n);.  if( !p 
4240: 26 26 20 64 62 20 29 7b 0a 20 20 20 20 64 62 2d  && db ){.    db-
4250: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
4260: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4270: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69  p;.}../*.** Resi
4280: 7a 65 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20  ze the block of 
4290: 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 64 20 74  memory pointed t
42a0: 6f 20 62 79 20 70 20 74 6f 20 6e 20 62 79 74 65  o by p to n byte
42b0: 73 2e 20 49 66 20 74 68 65 0a 2a 2a 20 72 65 73  s. If the.** res
42c0: 69 7a 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ize fails, set t
42d0: 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  he mallocFailed 
42e0: 66 6c 61 67 20 69 6e 20 74 68 65 20 63 6f 6e 6e  flag in the conn
42f0: 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a 2a  ection object..*
4300: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44  /.void *sqlite3D
4310: 62 52 65 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33  bRealloc(sqlite3
4320: 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 2c 20 69   *db, void *p, i
4330: 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70  nt n){.  void *p
4340: 4e 65 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  New = 0;.  asser
4350: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
4360: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4370: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
4380: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ex) );.  if( db-
4390: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
43a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   ){.    if( p==0
43b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
43c0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
43d0: 52 61 77 28 64 62 2c 20 6e 29 3b 0a 20 20 20 20  Raw(db, n);.    
43e0: 7d 0a 20 20 20 20 69 66 28 20 69 73 4c 6f 6f 6b  }.    if( isLook
43f0: 61 73 69 64 65 28 64 62 2c 20 70 29 20 29 7b 0a  aside(db, p) ){.
4400: 20 20 20 20 20 20 69 66 28 20 6e 3c 3d 64 62 2d        if( n<=db-
4410: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 29 7b  >lookaside.sz ){
4420: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4430: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
4440: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
4450: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
4460: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
4470: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  w ){.        mem
4480: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 64 62 2d  cpy(pNew, p, db-
4490: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 29 3b 0a  >lookaside.sz);.
44a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
44b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
44c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
44d0: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
44e0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2c  lite3_realloc(p,
44f0: 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   n);.      if( !
4500: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
4510: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4520: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
4530: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4540: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
4550: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 61 6c 6c  Attempt to reall
4560: 6f 63 61 74 65 20 70 2e 20 20 49 66 20 74 68 65  ocate p.  If the
4570: 20 72 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61   reallocation fa
4580: 69 6c 73 2c 20 74 68 65 6e 20 66 72 65 65 20 70  ils, then free p
4590: 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 68 65 20  .** and set the 
45a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
45b0: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
45c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
45d0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62  .void *sqlite3Db
45e0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 73 71  ReallocOrFree(sq
45f0: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
4600: 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f  *p, int n){.  vo
4610: 69 64 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  id *pNew;.  pNew
4620: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
4630: 6c 6f 63 28 64 62 2c 20 70 2c 20 6e 29 3b 0a 20  loc(db, p, n);. 
4640: 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
4650: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4660: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 72 65  db, p);.  }.  re
4670: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4680: 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  .** Make a copy 
4690: 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  of a string in m
46a0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
46b0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
46c0: 28 29 2e 20 54 68 65 73 65 20 0a 2a 2a 20 66 75  (). These .** fu
46d0: 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 20 73 71 6c  nctions call sql
46e0: 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 29 20  ite3MallocRaw() 
46f0: 64 69 72 65 63 74 6c 79 20 69 6e 73 74 65 61 64  directly instead
4700: 20 6f 66 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63   of sqliteMalloc
4710: 28 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 62  (). This.** is b
4720: 65 63 61 75 73 65 20 77 68 65 6e 20 6d 65 6d 6f  ecause when memo
4730: 72 79 20 64 65 62 75 67 67 69 6e 67 20 69 73 20  ry debugging is 
4740: 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 73 65  turned on, these
4750: 20 74 77 6f 20 66 75 6e 63 74 69 6f 6e 73 20 61   two functions a
4760: 72 65 20 0a 2a 2a 20 63 61 6c 6c 65 64 20 76 69  re .** called vi
4770: 61 20 6d 61 63 72 6f 73 20 74 68 61 74 20 72 65  a macros that re
4780: 63 6f 72 64 20 74 68 65 20 63 75 72 72 65 6e 74  cord the current
4790: 20 66 69 6c 65 20 61 6e 64 20 6c 69 6e 65 20 6e   file and line n
47a0: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  umber in the.** 
47b0: 54 68 72 65 61 64 44 61 74 61 20 73 74 72 75 63  ThreadData struc
47c0: 74 75 72 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  ture..*/.char *s
47d0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 73  qlite3DbStrDup(s
47e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
47f0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68  t char *z){.  ch
4800: 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 73 69 7a 65  ar *zNew;.  size
4810: 5f 74 20 6e 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  _t n;.  if( z==0
4820: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4830: 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69  ;.  }.  n = sqli
4840: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b  te3Strlen30(z) +
4850: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e   1;.  assert( (n
4860: 26 30 78 37 66 66 66 66 66 66 66 29 3d 3d 6e 20  &0x7fffffff)==n 
4870: 29 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69  );.  zNew = sqli
4880: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
4890: 62 2c 20 28 69 6e 74 29 6e 29 3b 0a 20 20 69 66  b, (int)n);.  if
48a0: 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( zNew ){.    me
48b0: 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29  mcpy(zNew, z, n)
48c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
48d0: 4e 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c  New;.}.char *sql
48e0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 73 71  ite3DbStrNDup(sq
48f0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
4900: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
4910: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a  {.  char *zNew;.
4920: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
4930: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4940: 20 20 61 73 73 65 72 74 28 20 28 6e 26 30 78 37    assert( (n&0x7
4950: 66 66 66 66 66 66 66 29 3d 3d 6e 20 29 3b 0a 20  fffffff)==n );. 
4960: 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   zNew = sqlite3D
4970: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
4980: 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20  +1);.  if( zNew 
4990: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e  ){.    memcpy(zN
49a0: 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a  ew, z, n);.    z
49b0: 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  New[n] = 0;.  }.
49c0: 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d    return zNew;.}
49d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
49e0: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65   string from the
49f0: 20 7a 46 72 6f 6d 61 74 20 61 72 67 75 6d 65 6e   zFromat argumen
4a00: 74 20 61 6e 64 20 74 68 65 20 76 61 5f 6c 69 73  t and the va_lis
4a10: 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a  t that follows..
4a20: 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 73 74 72  ** Store the str
4a30: 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ing in memory ob
4a40: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4a50: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
4a60: 61 6b 65 20 2a 70 7a 0a 2a 2a 20 70 6f 69 6e 74  ake *pz.** point
4a70: 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e   to that string.
4a80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4a90: 53 65 74 53 74 72 69 6e 67 28 63 68 61 72 20 2a  SetString(char *
4aa0: 2a 70 7a 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  *pz, sqlite3 *db
4ab0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
4ac0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
4ad0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
4ae0: 72 20 2a 7a 3b 0a 0a 20 20 76 61 5f 73 74 61 72  r *z;..  va_star
4af0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
4b00: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50    z = sqlite3VMP
4b10: 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61  rintf(db, zForma
4b20: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
4b30: 28 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  (ap);.  sqlite3D
4b40: 62 46 72 65 65 28 64 62 2c 20 2a 70 7a 29 3b 0a  bFree(db, *pz);.
4b50: 20 20 2a 70 7a 20 3d 20 7a 3b 0a 7d 0a 0a 0a 2f    *pz = z;.}.../
4b60: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4b70: 6f 6e 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  on must be calle
4b80: 64 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  d before exiting
4b90: 20 61 6e 79 20 41 50 49 20 66 75 6e 63 74 69 6f   any API functio
4ba0: 6e 20 28 69 2e 65 2e 20 0a 2a 2a 20 72 65 74 75  n (i.e. .** retu
4bb0: 72 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f  rning control to
4bc0: 20 74 68 65 20 75 73 65 72 29 20 74 68 61 74 20   the user) that 
4bd0: 68 61 73 20 63 61 6c 6c 65 64 20 73 71 6c 69 74  has called sqlit
4be0: 65 33 5f 6d 61 6c 6c 6f 63 20 6f 72 0a 2a 2a 20  e3_malloc or.** 
4bf0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 2e  sqlite3_realloc.
4c00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
4c10: 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 72  ned value is nor
4c20: 6d 61 6c 6c 79 20 61 20 63 6f 70 79 20 6f 66 20  mally a copy of 
4c30: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4c40: 65 6e 74 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66  ent to this.** f
4c50: 75 6e 63 74 69 6f 6e 2e 20 48 6f 77 65 76 65 72  unction. However
4c60: 2c 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  , if a malloc() 
4c70: 66 61 69 6c 75 72 65 20 68 61 73 20 6f 63 63 75  failure has occu
4c80: 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 70  rred since the p
4c90: 72 65 76 69 6f 75 73 0a 2a 2a 20 69 6e 76 6f 63  revious.** invoc
4ca0: 61 74 69 6f 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  ation SQLITE_NOM
4cb0: 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  EM is returned i
4cc0: 6e 73 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 49  nstead. .**.** I
4cd0: 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
4ce0: 6d 65 6e 74 2c 20 64 62 2c 20 69 73 20 6e 6f 74  ment, db, is not
4cf0: 20 4e 55 4c 4c 20 61 6e 64 20 61 20 6d 61 6c 6c   NULL and a mall
4d00: 6f 63 28 29 20 65 72 72 6f 72 20 68 61 73 20 6f  oc() error has o
4d10: 63 63 75 72 72 65 64 2c 0a 2a 2a 20 74 68 65 6e  ccurred,.** then
4d20: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
4d30: 65 72 72 6f 72 2d 63 6f 64 65 20 28 74 68 65 20  error-code (the 
4d40: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
4d50: 79 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  y sqlite3_errcod
4d60: 65 28 29 29 0a 2a 2a 20 69 73 20 73 65 74 20 74  e()).** is set t
4d70: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  o SQLITE_NOMEM..
4d80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 70  */.int sqlite3Ap
4d90: 69 45 78 69 74 28 73 71 6c 69 74 65 33 2a 20 64  iExit(sqlite3* d
4da0: 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 2f 2a  b, int rc){.  /*
4db0: 20 49 66 20 74 68 65 20 64 62 20 68 61 6e 64 6c   If the db handl
4dc0: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
4dd0: 68 65 6e 20 77 65 20 6d 75 73 74 20 68 6f 6c 64  hen we must hold
4de0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
4df0: 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 6d 75 74 65  handle.  ** mute
4e00: 78 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  x here. Otherwis
4e10: 65 20 74 68 65 20 72 65 61 64 20 28 61 6e 64 20  e the read (and 
4e20: 70 6f 73 73 69 62 6c 65 20 77 72 69 74 65 29 20  possible write) 
4e30: 6f 66 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  of db->mallocFai
4e40: 6c 65 64 20 0a 20 20 2a 2a 20 69 73 20 75 6e 73  led .  ** is uns
4e50: 61 66 65 2c 20 61 73 20 69 73 20 74 68 65 20 63  afe, as is the c
4e60: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 72  all to sqlite3Er
4e70: 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ror()..  */.  as
4e80: 73 65 72 74 28 20 21 64 62 20 7c 7c 20 73 71 6c  sert( !db || sql
4e90: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4ea0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
4eb0: 69 66 28 20 64 62 20 26 26 20 28 64 62 2d 3e 6d  if( db && (db->m
4ec0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 72  allocFailed || r
4ed0: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
4ee0: 4e 4f 4d 45 4d 29 20 29 7b 0a 20 20 20 20 73 71  NOMEM) ){.    sq
4ef0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 30 29 3b  QLITE_NOMEM, 0);
4f10: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
4f20: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 72  ailed = 0;.    r
4f30: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4f40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4f50: 63 20 26 20 28 64 62 20 3f 20 64 62 2d 3e 65 72  c & (db ? db->er
4f60: 72 4d 61 73 6b 20 3a 20 30 78 66 66 29 3b 0a 7d  rMask : 0xff);.}
4f70: 0a                                               .