/ Hex Artifact Content
Login

Artifact f0ad28008351cac2337ef502a3fdc8ffd3e5d9a9:


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 33 33 20 32 30 30 38  oc.c,v 1.33 2008
01d0: 2f 30 38 2f 30 31 20 31 36 3a 33 31 3a 31 34 20  /08/01 16:31:14 
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 23 69 6e 63 6c 75 64 65  darg.h>.#include
0220: 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a   <ctype.h>../*.*
0230: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
0240: 75 6e 73 20 77 68 65 6e 20 74 68 65 20 6d 65 6d  uns when the mem
0250: 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 73 65  ory allocator se
0260: 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74  es that the.** t
0270: 6f 74 61 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  otal memory allo
0280: 63 61 74 69 6f 6e 20 69 73 20 61 62 6f 75 74 20  cation is about 
0290: 74 6f 20 65 78 63 65 65 64 20 74 68 65 20 73 6f  to exceed the so
02a0: 66 74 20 68 65 61 70 0a 2a 2a 20 6c 69 6d 69 74  ft heap.** limit
02b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
02c0: 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 45 6e   softHeapLimitEn
02d0: 66 6f 72 63 65 72 28 0a 20 20 76 6f 69 64 20 2a  forcer(.  void *
02e0: 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69  NotUsed, .  sqli
02f0: 74 65 33 5f 69 6e 74 36 34 20 69 6e 55 73 65 2c  te3_int64 inUse,
0300: 0a 20 20 69 6e 74 20 61 6c 6c 6f 63 53 69 7a 65  .  int allocSize
0310: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  .){.  sqlite3_re
0320: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 61 6c 6c  lease_memory(all
0330: 6f 63 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ocSize);.}../*.*
0340: 2a 20 53 65 74 20 74 68 65 20 73 6f 66 74 20 68  * Set the soft h
0350: 65 61 70 2d 73 69 7a 65 20 6c 69 6d 69 74 20 66  eap-size limit f
0360: 6f 72 20 74 68 65 20 6c 69 62 72 61 72 79 2e 20  or the library. 
0370: 50 61 73 73 69 6e 67 20 61 20 7a 65 72 6f 20 6f  Passing a zero o
0380: 72 20 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 76  r .** negative v
0390: 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 6e  alue indicates n
03a0: 6f 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 76 6f 69 64  o limit..*/.void
03b0: 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
03c0: 61 70 5f 6c 69 6d 69 74 28 69 6e 74 20 6e 29 7b  ap_limit(int n){
03d0: 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  .  sqlite3_uint6
03e0: 34 20 69 4c 69 6d 69 74 3b 0a 20 20 69 6e 74 20  4 iLimit;.  int 
03f0: 6f 76 65 72 61 67 65 3b 0a 20 20 69 66 28 20 6e  overage;.  if( n
0400: 3c 30 20 29 7b 0a 20 20 20 20 69 4c 69 6d 69 74  <0 ){.    iLimit
0410: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
0420: 20 20 20 69 4c 69 6d 69 74 20 3d 20 6e 3b 0a 20     iLimit = n;. 
0430: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 69   }.  sqlite3_ini
0440: 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
0450: 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20   iLimit>0 ){.   
0460: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
0470: 61 6c 61 72 6d 28 73 6f 66 74 48 65 61 70 4c 69  alarm(softHeapLi
0480: 6d 69 74 45 6e 66 6f 72 63 65 72 2c 20 30 2c 20  mitEnforcer, 0, 
0490: 69 4c 69 6d 69 74 29 3b 0a 20 20 7d 65 6c 73 65  iLimit);.  }else
04a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65  {.    sqlite3_me
04b0: 6d 6f 72 79 5f 61 6c 61 72 6d 28 30 2c 20 30 2c  mory_alarm(0, 0,
04c0: 20 30 29 3b 0a 20 20 7d 0a 20 20 6f 76 65 72 61   0);.  }.  overa
04d0: 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 65 6d  ge = sqlite3_mem
04e0: 6f 72 79 5f 75 73 65 64 28 29 20 2d 20 6e 3b 0a  ory_used() - n;.
04f0: 20 20 69 66 28 20 6f 76 65 72 61 67 65 3e 30 20    if( overage>0 
0500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
0510: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 6f 76  elease_memory(ov
0520: 65 72 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  erage);.  }.}../
0530: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
0540: 72 65 6c 65 61 73 65 20 75 70 20 74 6f 20 6e 20  release up to n 
0550: 62 79 74 65 73 20 6f 66 20 6e 6f 6e 2d 65 73 73  bytes of non-ess
0560: 65 6e 74 69 61 6c 20 6d 65 6d 6f 72 79 20 63 75  ential memory cu
0570: 72 72 65 6e 74 6c 79 0a 2a 2a 20 68 65 6c 64 20  rrently.** held 
0580: 62 79 20 53 51 4c 69 74 65 2e 20 41 6e 20 65 78  by SQLite. An ex
0590: 61 6d 70 6c 65 20 6f 66 20 6e 6f 6e 2d 65 73 73  ample of non-ess
05a0: 65 6e 74 69 61 6c 20 6d 65 6d 6f 72 79 20 69 73  ential memory is
05b0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 0a   memory used to.
05c0: 2a 2a 20 63 61 63 68 65 20 64 61 74 61 62 61 73  ** cache databas
05d0: 65 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  e pages that are
05e0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 69   not currently i
05f0: 6e 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  n use..*/.int sq
0600: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
0610: 6d 6f 72 79 28 69 6e 74 20 6e 29 7b 0a 23 69 66  mory(int n){.#if
0620: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
0630: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
0640: 45 4e 54 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d  ENT.  int nRet =
0650: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 6c 65   sqlite3VdbeRele
0660: 61 73 65 4d 65 6d 6f 72 79 28 6e 29 3b 0a 20 20  aseMemory(n);.  
0670: 6e 52 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 50  nRet += sqlite3P
0680: 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72  agerReleaseMemor
0690: 79 28 6e 2d 6e 52 65 74 29 3b 0a 20 20 72 65 74  y(n-nRet);.  ret
06a0: 75 72 6e 20 6e 52 65 74 3b 0a 23 65 6c 73 65 0a  urn nRet;.#else.
06b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
06c0: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  OK;.#endif.}../*
06d0: 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d  .** State inform
06e0: 61 74 69 6f 6e 20 6c 6f 63 61 6c 20 74 6f 20 74  ation local to t
06f0: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0700: 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a  tion subsystem..
0710: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
0720: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   {.  sqlite3_mut
0730: 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
0740: 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 73     /* Mutex to s
0750: 65 72 69 61 6c 69 7a 65 20 61 63 63 65 73 73 20  erialize access 
0760: 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  */..  /*.  ** Th
0770: 65 20 61 6c 61 72 6d 20 63 61 6c 6c 62 61 63 6b  e alarm callback
0780: 20 61 6e 64 20 69 74 73 20 61 72 67 75 6d 65 6e   and its argumen
0790: 74 73 2e 20 20 54 68 65 20 6d 65 6d 30 2e 6d 75  ts.  The mem0.mu
07a0: 74 65 78 20 6c 6f 63 6b 20 77 69 6c 6c 0a 20 20  tex lock will.  
07b0: 2a 2a 20 62 65 20 68 65 6c 64 20 77 68 69 6c 65  ** be held while
07c0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73   the callback is
07d0: 20 72 75 6e 6e 69 6e 67 2e 20 20 52 65 63 75 72   running.  Recur
07e0: 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a  sive calls into.
07f0: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
0800: 73 75 62 73 79 73 74 65 6d 20 61 72 65 20 61 6c  subsystem are al
0810: 6c 6f 77 65 64 2c 20 62 75 74 20 6e 6f 20 6e 65  lowed, but no ne
0820: 77 20 63 61 6c 6c 62 61 63 6b 73 20 77 69 6c 6c  w callbacks will
0830: 20 62 65 0a 20 20 2a 2a 20 69 73 73 75 65 64 2e   be.  ** issued.
0840: 20 20 54 68 65 20 61 6c 61 72 6d 42 75 73 79 20    The alarmBusy 
0850: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
0860: 74 6f 20 70 72 65 76 65 6e 74 20 72 65 63 75 72  to prevent recur
0870: 73 69 76 65 0a 20 20 2a 2a 20 63 61 6c 6c 62 61  sive.  ** callba
0880: 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  cks..  */.  sqli
0890: 74 65 33 5f 69 6e 74 36 34 20 61 6c 61 72 6d 54  te3_int64 alarmT
08a0: 68 72 65 73 68 6f 6c 64 3b 0a 20 20 76 6f 69 64  hreshold;.  void
08b0: 20 28 2a 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b   (*alarmCallback
08c0: 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33  )(void*, sqlite3
08d0: 5f 69 6e 74 36 34 2c 69 6e 74 29 3b 0a 20 20 76  _int64,int);.  v
08e0: 6f 69 64 20 2a 61 6c 61 72 6d 41 72 67 3b 0a 20  oid *alarmArg;. 
08f0: 20 69 6e 74 20 61 6c 61 72 6d 42 75 73 79 3b 0a   int alarmBusy;.
0900: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 6f 69 6e 74  .  /*.  ** Point
0910: 65 72 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ers to the end o
0920: 66 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  f sqlite3Config.
0930: 70 53 63 72 61 74 63 68 20 61 6e 64 0a 20 20 2a  pScratch and.  *
0940: 2a 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  * sqlite3Config.
0950: 70 50 61 67 65 20 74 6f 20 61 20 62 6c 6f 63 6b  pPage to a block
0960: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   of memory that 
0970: 72 65 63 6f 72 64 73 0a 20 20 2a 2a 20 77 68 69  records.  ** whi
0980: 63 68 20 70 61 67 65 73 20 61 72 65 20 61 76 61  ch pages are ava
0990: 69 6c 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 75  ilable..  */.  u
09a0: 33 32 20 2a 61 53 63 72 61 74 63 68 46 72 65 65  32 *aScratchFree
09b0: 3b 0a 20 20 75 33 32 20 2a 61 50 61 67 65 46 72  ;.  u32 *aPageFr
09c0: 65 65 3b 0a 0a 20 20 2f 2a 20 4e 75 6d 62 65 72  ee;..  /* Number
09d0: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 66   of free pages f
09e0: 6f 72 20 73 63 72 61 74 63 68 20 61 6e 64 20 70  or scratch and p
09f0: 61 67 65 2d 63 61 63 68 65 20 6d 65 6d 6f 72 79  age-cache memory
0a00: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 63 72 61 74   */.  u32 nScrat
0a10: 63 68 46 72 65 65 3b 0a 20 20 75 33 32 20 6e 50  chFree;.  u32 nP
0a20: 61 67 65 46 72 65 65 3b 0a 7d 20 6d 65 6d 30 3b  ageFree;.} mem0;
0a30: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0a40: 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ze the memory al
0a50: 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74  location subsyst
0a60: 65 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  em..*/.int sqlit
0a70: 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 76 6f 69  e3MallocInit(voi
0a80: 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  d){.  if( sqlite
0a90: 33 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f  3Config.m.xMallo
0aa0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c==0 ){.    sqli
0ab0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
0ac0: 28 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ();.  }.  memset
0ad0: 28 26 6d 65 6d 30 2c 20 30 2c 20 73 69 7a 65 6f  (&mem0, 0, sizeo
0ae0: 66 28 6d 65 6d 30 29 29 3b 0a 20 20 69 66 28 20  f(mem0));.  if( 
0af0: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 43  sqlite3Config.bC
0b00: 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
0b10: 6d 65 6d 30 2e 6d 75 74 65 78 20 3d 20 73 71 6c  mem0.mutex = sql
0b20: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
0b30: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
0b40: 49 43 5f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69  IC_MEM);.  }.  i
0b50: 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  f( sqlite3Config
0b60: 2e 70 53 63 72 61 74 63 68 20 26 26 20 73 71 6c  .pScratch && sql
0b70: 69 74 65 33 43 6f 6e 66 69 67 2e 73 7a 53 63 72  ite3Config.szScr
0b80: 61 74 63 68 3e 3d 31 30 30 0a 20 20 20 20 20 20  atch>=100.      
0b90: 26 26 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  && sqlite3Config
0ba0: 2e 6e 53 63 72 61 74 63 68 3e 3d 30 20 29 7b 0a  .nScratch>=0 ){.
0bb0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
0bc0: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 73 7a 53  qlite3Config.szS
0bd0: 63 72 61 74 63 68 20 2d 3d 20 34 3b 0a 20 20 20  cratch -= 4;.   
0be0: 20 6d 65 6d 30 2e 61 53 63 72 61 74 63 68 46 72   mem0.aScratchFr
0bf0: 65 65 20 3d 20 28 75 33 32 2a 29 26 28 28 63 68  ee = (u32*)&((ch
0c00: 61 72 2a 29 73 71 6c 69 74 65 33 43 6f 6e 66 69  ar*)sqlite3Confi
0c10: 67 2e 70 53 63 72 61 74 63 68 29 0a 20 20 20 20  g.pScratch).    
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
0c30: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 73 7a 53  qlite3Config.szS
0c40: 63 72 61 74 63 68 2a 73 71 6c 69 74 65 33 43 6f  cratch*sqlite3Co
0c50: 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 5d 3b 0a  nfig.nScratch];.
0c60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
0c70: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 63  qlite3Config.nSc
0c80: 72 61 74 63 68 3b 20 69 2b 2b 29 7b 20 6d 65 6d  ratch; i++){ mem
0c90: 30 2e 61 53 63 72 61 74 63 68 46 72 65 65 5b 69  0.aScratchFree[i
0ca0: 5d 20 3d 20 69 3b 20 7d 0a 20 20 20 20 6d 65 6d  ] = i; }.    mem
0cb0: 30 2e 6e 53 63 72 61 74 63 68 46 72 65 65 20 3d  0.nScratchFree =
0cc0: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e   sqlite3Config.n
0cd0: 53 63 72 61 74 63 68 3b 0a 20 20 7d 65 6c 73 65  Scratch;.  }else
0ce0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
0cf0: 66 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20 30  fig.pScratch = 0
0d00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  ;.    sqlite3Con
0d10: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20  fig.szScratch = 
0d20: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
0d30: 69 74 65 33 43 6f 6e 66 69 67 2e 70 50 61 67 65  ite3Config.pPage
0d40: 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6e 66 69   && sqlite3Confi
0d50: 67 2e 73 7a 50 61 67 65 3e 3d 35 31 32 0a 20 20  g.szPage>=512.  
0d60: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f      && sqlite3Co
0d70: 6e 66 69 67 2e 6e 50 61 67 65 3e 3d 31 20 29 7b  nfig.nPage>=1 ){
0d80: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
0d90: 69 6e 74 20 6f 76 65 72 68 65 61 64 3b 0a 20 20  int overhead;.  
0da0: 20 20 69 6e 74 20 73 7a 20 3d 20 73 71 6c 69 74    int sz = sqlit
0db0: 65 33 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 3b  e3Config.szPage;
0dc0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c  .    int n = sql
0dd0: 69 74 65 33 43 6f 6e 66 69 67 2e 6e 50 61 67 65  ite3Config.nPage
0de0: 3b 0a 20 20 20 20 6f 76 65 72 68 65 61 64 20 3d  ;.    overhead =
0df0: 20 28 34 2a 6e 20 2b 20 73 7a 20 2d 20 31 29 2f   (4*n + sz - 1)/
0e00: 73 7a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  sz;.    sqlite3C
0e10: 6f 6e 66 69 67 2e 6e 50 61 67 65 20 2d 3d 20 6f  onfig.nPage -= o
0e20: 76 65 72 68 65 61 64 3b 0a 20 20 20 20 6d 65 6d  verhead;.    mem
0e30: 30 2e 61 50 61 67 65 46 72 65 65 20 3d 20 28 75  0.aPageFree = (u
0e40: 33 32 2a 29 26 28 28 63 68 61 72 2a 29 73 71 6c  32*)&((char*)sql
0e50: 69 74 65 33 43 6f 6e 66 69 67 2e 70 50 61 67 65  ite3Config.pPage
0e60: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0e70: 20 20 20 20 5b 73 71 6c 69 74 65 33 43 6f 6e 66      [sqlite3Conf
0e80: 69 67 2e 73 7a 50 61 67 65 2a 73 71 6c 69 74 65  ig.szPage*sqlite
0e90: 33 43 6f 6e 66 69 67 2e 6e 50 61 67 65 5d 3b 0a  3Config.nPage];.
0ea0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
0eb0: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 50 61  qlite3Config.nPa
0ec0: 67 65 3b 20 69 2b 2b 29 7b 20 6d 65 6d 30 2e 61  ge; i++){ mem0.a
0ed0: 50 61 67 65 46 72 65 65 5b 69 5d 20 3d 20 69 3b  PageFree[i] = i;
0ee0: 20 7d 0a 20 20 20 20 6d 65 6d 30 2e 6e 50 61 67   }.    mem0.nPag
0ef0: 65 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 43  eFree = sqlite3C
0f00: 6f 6e 66 69 67 2e 6e 50 61 67 65 3b 0a 20 20 7d  onfig.nPage;.  }
0f10: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
0f20: 33 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20  3Config.pPage = 
0f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  0;.    sqlite3Co
0f40: 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 30 3b  nfig.szPage = 0;
0f50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
0f60: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 2e 78 49  lite3Config.m.xI
0f70: 6e 69 74 28 73 71 6c 69 74 65 33 43 6f 6e 66 69  nit(sqlite3Confi
0f80: 67 2e 6d 2e 70 41 70 70 44 61 74 61 29 3b 0a 7d  g.m.pAppData);.}
0f90: 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61  ../*.** Deinitia
0fa0: 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
0fb0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79  allocation subsy
0fc0: 73 74 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  stem..*/.void sq
0fd0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 76  lite3MallocEnd(v
0fe0: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 43  oid){.  sqlite3C
0ff0: 6f 6e 66 69 67 2e 6d 2e 78 53 68 75 74 64 6f 77  onfig.m.xShutdow
1000: 6e 28 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  n(sqlite3Config.
1010: 6d 2e 70 41 70 70 44 61 74 61 29 3b 0a 20 20 6d  m.pAppData);.  m
1020: 65 6d 73 65 74 28 26 6d 65 6d 30 2c 20 30 2c 20  emset(&mem0, 0, 
1030: 73 69 7a 65 6f 66 28 6d 65 6d 30 29 29 3b 0a 7d  sizeof(mem0));.}
1040: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1050: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
1060: 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 63 68  ory currently ch
1070: 65 63 6b 65 64 20 6f 75 74 2e 0a 2a 2f 0a 73 71  ecked out..*/.sq
1080: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1090: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28  te3_memory_used(
10a0: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6e 2c 20  void){.  int n, 
10b0: 6d 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mx;.  sqlite3_in
10c0: 74 36 34 20 72 65 73 3b 0a 20 20 73 71 6c 69 74  t64 res;.  sqlit
10d0: 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45  e3_status(SQLITE
10e0: 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
10f0: 53 45 44 2c 20 26 6e 2c 20 26 6d 78 2c 20 30 29  SED, &n, &mx, 0)
1100: 3b 0a 20 20 72 65 73 20 3d 20 28 73 71 6c 69 74  ;.  res = (sqlit
1110: 65 33 5f 69 6e 74 36 34 29 6e 3b 20 20 2f 2a 20  e3_int64)n;  /* 
1120: 57 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 20  Work around bug 
1130: 69 6e 20 42 6f 72 6c 61 6e 64 20 43 2e 20 54 69  in Borland C. Ti
1140: 63 6b 65 74 20 23 33 32 31 36 20 2a 2f 0a 20 20  cket #3216 */.  
1150: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1160: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1170: 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
1180: 66 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 68 61  f memory that ha
1190: 73 20 65 76 65 72 20 62 65 65 6e 0a 2a 2a 20 63  s ever been.** c
11a0: 68 65 63 6b 65 64 20 6f 75 74 20 73 69 6e 63 65  hecked out since
11b0: 20 65 69 74 68 65 72 20 74 68 65 20 62 65 67 69   either the begi
11c0: 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 70 72  nning of this pr
11d0: 6f 63 65 73 73 0a 2a 2a 20 6f 72 20 73 69 6e 63  ocess.** or sinc
11e0: 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
11f0: 74 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 71 6c 69  t reset..*/.sqli
1200: 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1210: 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74  3_memory_highwat
1220: 65 72 28 69 6e 74 20 72 65 73 65 74 46 6c 61 67  er(int resetFlag
1230: 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 6d 78 3b 0a  ){.  int n, mx;.
1240: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1250: 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  res;.  sqlite3_s
1260: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
1270: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c  TUS_MEMORY_USED,
1280: 20 26 6e 2c 20 26 6d 78 2c 20 72 65 73 65 74 46   &n, &mx, resetF
1290: 6c 61 67 29 3b 0a 20 20 72 65 73 20 3d 20 28 73  lag);.  res = (s
12a0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 6d 78 3b  qlite3_int64)mx;
12b0: 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64    /* Work around
12c0: 20 62 75 67 20 69 6e 20 42 6f 72 6c 61 6e 64 20   bug in Borland 
12d0: 43 2e 20 54 69 63 6b 65 74 20 23 33 32 31 36 20  C. Ticket #3216 
12e0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  */.  return res;
12f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
1300: 20 74 68 65 20 61 6c 61 72 6d 20 63 61 6c 6c 62   the alarm callb
1310: 61 63 6b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ack.*/.int sqlit
1320: 65 33 5f 6d 65 6d 6f 72 79 5f 61 6c 61 72 6d 28  e3_memory_alarm(
1330: 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61  .  void(*xCallba
1340: 63 6b 29 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ck)(void *pArg, 
1350: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 73  sqlite3_int64 us
1360: 65 64 2c 69 6e 74 20 4e 29 2c 0a 20 20 76 6f 69  ed,int N),.  voi
1370: 64 20 2a 70 41 72 67 2c 0a 20 20 73 71 6c 69 74  d *pArg,.  sqlit
1380: 65 33 5f 69 6e 74 36 34 20 69 54 68 72 65 73 68  e3_int64 iThresh
1390: 6f 6c 64 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  old.){.  sqlite3
13a0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d  _mutex_enter(mem
13b0: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 6d 65 6d 30  0.mutex);.  mem0
13c0: 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20 3d  .alarmCallback =
13d0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 6d 65   xCallback;.  me
13e0: 6d 30 2e 61 6c 61 72 6d 41 72 67 20 3d 20 70 41  m0.alarmArg = pA
13f0: 72 67 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d  rg;.  mem0.alarm
1400: 54 68 72 65 73 68 6f 6c 64 20 3d 20 69 54 68 72  Threshold = iThr
1410: 65 73 68 6f 6c 64 3b 0a 20 20 73 71 6c 69 74 65  eshold;.  sqlite
1420: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
1430: 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  m0.mutex);.  ret
1440: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1450: 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20  ../*.** Trigger 
1460: 74 68 65 20 61 6c 61 72 6d 20 0a 2a 2f 0a 73 74  the alarm .*/.st
1470: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
1480: 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 69 6e 74  3MallocAlarm(int
1490: 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20   nByte){.  void 
14a0: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
14b0: 64 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d*,sqlite3_int64
14c0: 2c 69 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ,int);.  sqlite3
14d0: 5f 69 6e 74 36 34 20 6e 6f 77 55 73 65 64 3b 0a  _int64 nowUsed;.
14e0: 20 20 76 6f 69 64 20 2a 70 41 72 67 3b 0a 20 20    void *pArg;.  
14f0: 69 66 28 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61  if( mem0.alarmCa
1500: 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20 6d 65 6d  llback==0 || mem
1510: 30 2e 61 6c 61 72 6d 42 75 73 79 20 20 29 20 72  0.alarmBusy  ) r
1520: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 30 2e 61 6c  eturn;.  mem0.al
1530: 61 72 6d 42 75 73 79 20 3d 20 31 3b 0a 20 20 78  armBusy = 1;.  x
1540: 43 61 6c 6c 62 61 63 6b 20 3d 20 6d 65 6d 30 2e  Callback = mem0.
1550: 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 3b 0a 20  alarmCallback;. 
1560: 20 6e 6f 77 55 73 65 64 20 3d 20 73 71 6c 69 74   nowUsed = sqlit
1570: 65 33 53 74 61 74 75 73 56 61 6c 75 65 28 53 51  e3StatusValue(SQ
1580: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f  LITE_STATUS_MEMO
1590: 52 59 5f 55 53 45 44 29 3b 0a 20 20 70 41 72 67  RY_USED);.  pArg
15a0: 20 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d 41 72 67   = mem0.alarmArg
15b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
15c0: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
15d0: 65 78 29 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b  ex);.  xCallback
15e0: 28 70 41 72 67 2c 20 6e 6f 77 55 73 65 64 2c 20  (pArg, nowUsed, 
15f0: 6e 42 79 74 65 29 3b 0a 20 20 73 71 6c 69 74 65  nByte);.  sqlite
1600: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65  3_mutex_enter(me
1610: 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 6d 65 6d  m0.mutex);.  mem
1620: 30 2e 61 6c 61 72 6d 42 75 73 79 20 3d 20 30 3b  0.alarmBusy = 0;
1630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 6d  .}../*.** Do a m
1640: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1650: 20 77 69 74 68 20 73 74 61 74 69 73 74 69 63 73   with statistics
1660: 20 61 6e 64 20 61 6c 61 72 6d 73 2e 20 20 41 73   and alarms.  As
1670: 73 75 6d 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  sume the.** lock
1680: 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
1690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16a0: 6d 61 6c 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28  mallocWithAlarm(
16b0: 69 6e 74 20 6e 2c 20 76 6f 69 64 20 2a 2a 70 70  int n, void **pp
16c0: 29 7b 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 3b 0a  ){.  int nFull;.
16d0: 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 61 73 73    void *p;.  ass
16e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16f0: 65 78 5f 68 65 6c 64 28 6d 65 6d 30 2e 6d 75 74  ex_held(mem0.mut
1700: 65 78 29 20 29 3b 0a 20 20 6e 46 75 6c 6c 20 3d  ex) );.  nFull =
1710: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d   sqlite3Config.m
1720: 2e 78 52 6f 75 6e 64 75 70 28 6e 29 3b 0a 20 20  .xRoundup(n);.  
1730: 73 71 6c 69 74 65 33 53 74 61 74 75 73 53 65 74  sqlite3StatusSet
1740: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
1750: 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 6e 29 3b 0a  ALLOC_SIZE, n);.
1760: 20 20 69 66 28 20 6d 65 6d 30 2e 61 6c 61 72 6d    if( mem0.alarm
1770: 43 61 6c 6c 62 61 63 6b 21 3d 30 20 29 7b 0a 20  Callback!=0 ){. 
1780: 20 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 73     int nUsed = s
1790: 71 6c 69 74 65 33 53 74 61 74 75 73 56 61 6c 75  qlite3StatusValu
17a0: 65 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  e(SQLITE_STATUS_
17b0: 4d 45 4d 4f 52 59 5f 55 53 45 44 29 3b 0a 20 20  MEMORY_USED);.  
17c0: 20 20 69 66 28 20 6e 55 73 65 64 2b 6e 46 75 6c    if( nUsed+nFul
17d0: 6c 20 3e 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d 54  l >= mem0.alarmT
17e0: 68 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20  hreshold ){.    
17f0: 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41    sqlite3MallocA
1800: 6c 61 72 6d 28 6e 46 75 6c 6c 29 3b 0a 20 20 20  larm(nFull);.   
1810: 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c   }.  }.  p = sql
1820: 69 74 65 33 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  ite3Config.m.xMa
1830: 6c 6c 6f 63 28 6e 46 75 6c 6c 29 3b 0a 20 20 69  lloc(nFull);.  i
1840: 66 28 20 70 3d 3d 30 20 26 26 20 6d 65 6d 30 2e  f( p==0 && mem0.
1850: 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20 29 7b  alarmCallback ){
1860: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
1870: 6f 63 41 6c 61 72 6d 28 6e 46 75 6c 6c 29 3b 0a  ocAlarm(nFull);.
1880: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43      p = sqlite3C
1890: 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28  onfig.m.xMalloc(
18a0: 6e 46 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  nFull);.  }.  if
18b0: 28 20 70 20 29 7b 0a 20 20 20 20 6e 46 75 6c 6c  ( p ){.    nFull
18c0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
18d0: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 73 71 6c  Size(p);.    sql
18e0: 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51  ite3StatusAdd(SQ
18f0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f  LITE_STATUS_MEMO
1900: 52 59 5f 55 53 45 44 2c 20 6e 46 75 6c 6c 29 3b  RY_USED, nFull);
1910: 0a 20 20 7d 0a 20 20 2a 70 70 20 3d 20 70 3b 0a  .  }.  *pp = p;.
1920: 20 20 72 65 74 75 72 6e 20 6e 46 75 6c 6c 3b 0a    return nFull;.
1930: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1940: 65 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  e memory.  This 
1950: 72 6f 75 74 69 6e 65 20 69 73 20 6c 69 6b 65 20  routine is like 
1960: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
1970: 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
1980: 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 65 20 6d  ** assumes the m
1990: 65 6d 6f 72 79 20 73 75 62 73 79 73 74 65 6d 20  emory subsystem 
19a0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
19b0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2f   initialized..*/
19c0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 61  .void *sqlite3Ma
19d0: 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20 76  lloc(int n){.  v
19e0: 6f 69 64 20 2a 70 3b 0a 20 20 69 66 28 20 6e 3c  oid *p;.  if( n<
19f0: 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 30 3b  =0 ){.    p = 0;
1a00: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1a10: 69 74 65 33 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  ite3Config.bMems
1a20: 74 61 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tat ){.    sqlit
1a30: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
1a40: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20  em0.mutex);.    
1a50: 6d 61 6c 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28  mallocWithAlarm(
1a60: 6e 2c 20 26 70 29 3b 0a 20 20 20 20 73 71 6c 69  n, &p);.    sqli
1a70: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1a80: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 7d  mem0.mutex);.  }
1a90: 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71  else{.    p = sq
1aa0: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 2e 78 4d  lite3Config.m.xM
1ab0: 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d 0a 20 20  alloc(n);.  }.  
1ac0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1ad0: 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
1ae0: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  of the memory al
1af0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 66 6f 72 20  location is for 
1b00: 75 73 65 20 62 79 20 74 68 65 20 61 70 70 6c 69  use by the appli
1b10: 63 61 74 69 6f 6e 2e 0a 2a 2a 20 46 69 72 73 74  cation..** First
1b20: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d   make sure the m
1b30: 65 6d 6f 72 79 20 73 75 62 73 79 73 74 65 6d 20  emory subsystem 
1b40: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  is initialized, 
1b50: 74 68 65 6e 20 64 6f 20 74 68 65 0a 2a 2a 20 61  then do the.** a
1b60: 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  llocation..*/.vo
1b70: 69 64 20 2a 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  id *sqlite3_mall
1b80: 6f 63 28 69 6e 74 20 6e 29 7b 0a 23 69 66 6e 64  oc(int n){.#ifnd
1b90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ba0: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
1bb0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1bc0: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
1bd0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73  endif.  return s
1be0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 29 3b  qlite3Malloc(n);
1bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 74  .}../*.** Each t
1c00: 68 72 65 61 64 20 6d 61 79 20 6f 6e 6c 79 20 68  hread may only h
1c10: 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 75 74  ave a single out
1c20: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
1c30: 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 78 53 63 72  ion from.** xScr
1c40: 61 74 63 68 4d 61 6c 6c 6f 63 28 29 2e 20 20 57  atchMalloc().  W
1c50: 65 20 76 65 72 69 66 79 20 74 68 69 73 20 63 6f  e verify this co
1c60: 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20  nstraint in the 
1c70: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a  single-threaded.
1c80: 2a 2a 20 63 61 73 65 20 62 79 20 73 65 74 74 69  ** case by setti
1c90: 6e 67 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f  ng scratchAllocO
1ca0: 75 74 20 74 6f 20 31 20 77 68 65 6e 20 61 6e 20  ut to 1 when an 
1cb0: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 69 73  allocation.** is
1cc0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 6c 65   outstanding cle
1cd0: 61 72 69 6e 67 20 69 74 20 77 68 65 6e 20 74 68  aring it when th
1ce0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
1cf0: 66 72 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51  freed..*/.#if SQ
1d00: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d  LITE_THREADSAFE=
1d10: 3d 30 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  =0 && !defined(N
1d20: 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 69 6e  DEBUG).static in
1d30: 74 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75  t scratchAllocOu
1d40: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a  t = 0;.#endif...
1d50: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  /*.** Allocate m
1d60: 65 6d 6f 72 79 20 74 68 61 74 20 69 73 20 74 6f  emory that is to
1d70: 20 62 65 20 75 73 65 64 20 61 6e 64 20 72 65 6c   be used and rel
1d80: 65 61 73 65 64 20 72 69 67 68 74 20 61 77 61 79  eased right away
1d90: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1da0: 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  e is similar to 
1db0: 61 6c 6c 6f 63 61 28 29 20 69 6e 20 74 68 61 74  alloca() in that
1dc0: 20 69 74 20 69 73 20 6e 6f 74 20 69 6e 74 65 6e   it is not inten
1dd0: 64 65 64 0a 2a 2a 20 66 6f 72 20 73 69 74 75 61  ded.** for situa
1de0: 74 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65 20  tions where the 
1df0: 6d 65 6d 6f 72 79 20 6d 69 67 68 74 20 62 65 20  memory might be 
1e00: 68 65 6c 64 20 6c 6f 6e 67 2d 74 65 72 6d 2e 20  held long-term. 
1e10: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
1e20: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
1e30: 67 65 74 20 6d 65 6d 6f 72 79 20 74 6f 20 6f 6c  get memory to ol
1e40: 64 20 6c 61 72 67 65 20 74 72 61 6e 73 69 65 6e  d large transien
1e50: 74 20 64 61 74 61 0a 2a 2a 20 73 74 72 75 63 74  t data.** struct
1e60: 75 72 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20  ures that would 
1e70: 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 66 69 74  not normally fit
1e80: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 6f 66   on the stack of
1e90: 20 61 6e 0a 2a 2a 20 65 6d 62 65 64 64 65 64 20   an.** embedded 
1ea0: 70 72 6f 63 65 73 73 6f 72 2e 0a 2a 2f 0a 76 6f  processor..*/.vo
1eb0: 69 64 20 2a 73 71 6c 69 74 65 33 53 63 72 61 74  id *sqlite3Scrat
1ec0: 63 68 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b  chMalloc(int n){
1ed0: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 61 73  .  void *p;.  as
1ee0: 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 0a 23 69  sert( n>0 );..#i
1ef0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
1f00: 41 46 45 3d 3d 30 20 26 26 20 21 64 65 66 69 6e  AFE==0 && !defin
1f10: 65 64 28 4e 44 45 42 55 47 29 0a 20 20 2f 2a 20  ed(NDEBUG).  /* 
1f20: 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6d  Verify that no m
1f30: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73 63 72  ore than one scr
1f40: 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  atch allocation 
1f50: 70 65 72 20 74 68 72 65 61 64 0a 20 20 2a 2a 20  per thread.  ** 
1f60: 69 73 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61  is outstanding a
1f70: 74 20 6f 6e 65 20 74 69 6d 65 2e 20 20 28 54 68  t one time.  (Th
1f80: 69 73 20 69 73 20 6f 6e 6c 79 20 63 68 65 63 6b  is is only check
1f90: 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 73  ed in the.  ** s
1fa0: 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 63  ingle-threaded c
1fb0: 61 73 65 20 73 69 6e 63 65 20 63 68 65 63 6b 69  ase since checki
1fc0: 6e 67 20 69 6e 20 74 68 65 20 6d 75 6c 74 69 2d  ng in the multi-
1fd0: 74 68 72 65 61 64 65 64 20 63 61 73 65 0a 20 20  threaded case.  
1fe0: 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 75 63 68  ** would be much
1ff0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65   more complicate
2000: 64 2e 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  d.) */.  assert(
2010: 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74   scratchAllocOut
2020: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
2030: 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66   if( sqlite3Conf
2040: 69 67 2e 73 7a 53 63 72 61 74 63 68 3c 6e 20 29  ig.szScratch<n )
2050: 7b 0a 20 20 20 20 67 6f 74 6f 20 73 63 72 61 74  {.    goto scrat
2060: 63 68 5f 6f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d  ch_overflow;.  }
2070: 65 6c 73 65 7b 20 20 0a 20 20 20 20 73 71 6c 69  else{  .    sqli
2080: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2090: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20  mem0.mutex);.   
20a0: 20 69 66 28 20 6d 65 6d 30 2e 6e 53 63 72 61 74   if( mem0.nScrat
20b0: 63 68 46 72 65 65 3d 3d 30 20 29 7b 0a 20 20 20  chFree==0 ){.   
20c0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
20d0: 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65  _leave(mem0.mute
20e0: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  x);.      goto s
20f0: 63 72 61 74 63 68 5f 6f 76 65 72 66 6c 6f 77 3b  cratch_overflow;
2100: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2110: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
2120: 20 3d 20 6d 65 6d 30 2e 61 53 63 72 61 74 63 68   = mem0.aScratch
2130: 46 72 65 65 5b 2d 2d 6d 65 6d 30 2e 6e 53 63 72  Free[--mem0.nScr
2140: 61 74 63 68 46 72 65 65 5d 3b 0a 20 20 20 20 20  atchFree];.     
2150: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2160: 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29  eave(mem0.mutex)
2170: 3b 0a 20 20 20 20 20 20 69 20 2a 3d 20 73 71 6c  ;.      i *= sql
2180: 69 74 65 33 43 6f 6e 66 69 67 2e 73 7a 53 63 72  ite3Config.szScr
2190: 61 74 63 68 3b 0a 20 20 20 20 20 20 73 71 6c 69  atch;.      sqli
21a0: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
21b0: 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54  ITE_STATUS_SCRAT
21c0: 43 48 5f 55 53 45 44 2c 20 31 29 3b 0a 20 20 20  CH_USED, 1);.   
21d0: 20 20 20 70 20 3d 20 28 76 6f 69 64 2a 29 26 28     p = (void*)&(
21e0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 43 6f  (char*)sqlite3Co
21f0: 6e 66 69 67 2e 70 53 63 72 61 74 63 68 29 5b 69  nfig.pScratch)[i
2200: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  ];.    }.  }.#if
2210: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
2220: 46 45 3d 3d 30 20 26 26 20 21 64 65 66 69 6e 65  FE==0 && !define
2230: 64 28 4e 44 45 42 55 47 29 0a 20 20 73 63 72 61  d(NDEBUG).  scra
2240: 74 63 68 41 6c 6c 6f 63 4f 75 74 20 3d 20 70 21  tchAllocOut = p!
2250: 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  =0;.#endif..  re
2260: 74 75 72 6e 20 70 3b 0a 0a 73 63 72 61 74 63 68  turn p;..scratch
2270: 5f 6f 76 65 72 66 6c 6f 77 3a 0a 20 20 69 66 28  _overflow:.  if(
2280: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62   sqlite3Config.b
2290: 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 73  Memstat ){.    s
22a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
22b0: 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a  er(mem0.mutex);.
22c0: 20 20 20 20 6e 20 3d 20 6d 61 6c 6c 6f 63 57 69      n = mallocWi
22d0: 74 68 41 6c 61 72 6d 28 6e 2c 20 26 70 29 3b 0a  thAlarm(n, &p);.
22e0: 20 20 20 20 69 66 28 20 70 20 29 20 73 71 6c 69      if( p ) sqli
22f0: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
2300: 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54  ITE_STATUS_SCRAT
2310: 43 48 5f 4f 56 45 52 46 4c 4f 57 2c 20 6e 29 3b  CH_OVERFLOW, n);
2320: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
2330: 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75  ex_leave(mem0.mu
2340: 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tex);.  }else{. 
2350: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43 6f     p = sqlite3Co
2360: 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e  nfig.m.xMalloc(n
2370: 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  );.  }.#if SQLIT
2380: 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 20  E_THREADSAFE==0 
2390: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  && !defined(NDEB
23a0: 55 47 29 0a 20 20 73 63 72 61 74 63 68 41 6c 6c  UG).  scratchAll
23b0: 6f 63 4f 75 74 20 3d 20 70 21 3d 30 3b 0a 23 65  ocOut = p!=0;.#e
23c0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 3b  ndif.  return p;
23d0: 20 20 20 20 0a 7d 0a 76 6f 69 64 20 73 71 6c 69      .}.void sqli
23e0: 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 76  te3ScratchFree(v
23f0: 6f 69 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oid *p){.  if( p
2400: 20 29 7b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   ){..#if SQLITE_
2410: 54 48 52 45 41 44 53 41 46 45 3d 3d 30 20 26 26  THREADSAFE==0 &&
2420: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
2430: 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ).    /* Verify 
2440: 74 68 61 74 20 6e 6f 20 6d 6f 72 65 20 74 68 61  that no more tha
2450: 6e 20 6f 6e 65 20 73 63 72 61 74 63 68 20 61 6c  n one scratch al
2460: 6c 6f 63 61 74 69 6f 6e 20 70 65 72 20 74 68 72  location per thr
2470: 65 61 64 0a 20 20 20 20 2a 2a 20 69 73 20 6f 75  ead.    ** is ou
2480: 74 73 74 61 6e 64 69 6e 67 20 61 74 20 6f 6e 65  tstanding at one
2490: 20 74 69 6d 65 2e 20 20 28 54 68 69 73 20 69 73   time.  (This is
24a0: 20 6f 6e 6c 79 20 63 68 65 63 6b 65 64 20 69 6e   only checked in
24b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 69 6e 67   the.    ** sing
24c0: 6c 65 2d 74 68 72 65 61 64 65 64 20 63 61 73 65  le-threaded case
24d0: 20 73 69 6e 63 65 20 63 68 65 63 6b 69 6e 67 20   since checking 
24e0: 69 6e 20 74 68 65 20 6d 75 6c 74 69 2d 74 68 72  in the multi-thr
24f0: 65 61 64 65 64 20 63 61 73 65 0a 20 20 20 20 2a  eaded case.    *
2500: 2a 20 77 6f 75 6c 64 20 62 65 20 6d 75 63 68 20  * would be much 
2510: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
2520: 2e 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .) */.    assert
2530: 28 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75  ( scratchAllocOu
2540: 74 3d 3d 31 20 29 3b 0a 20 20 20 20 73 63 72 61  t==1 );.    scra
2550: 74 63 68 41 6c 6c 6f 63 4f 75 74 20 3d 20 30 3b  tchAllocOut = 0;
2560: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
2570: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70   sqlite3Config.p
2580: 53 63 72 61 74 63 68 3d 3d 30 0a 20 20 20 20 20  Scratch==0.     
2590: 20 20 20 20 20 20 7c 7c 20 70 3c 73 71 6c 69 74        || p<sqlit
25a0: 65 33 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  e3Config.pScratc
25b0: 68 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  h.           || 
25c0: 70 3e 3d 28 76 6f 69 64 2a 29 6d 65 6d 30 2e 61  p>=(void*)mem0.a
25d0: 53 63 72 61 74 63 68 46 72 65 65 20 29 7b 0a 20  ScratchFree ){. 
25e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25f0: 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20  Config.bMemstat 
2600: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
2610: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  Size = sqlite3Ma
2620: 6c 6c 6f 63 53 69 7a 65 28 70 29 3b 0a 20 20 20  llocSize(p);.   
2630: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
2640: 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75  ex_enter(mem0.mu
2650: 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tex);.        sq
2660: 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53  lite3StatusAdd(S
2670: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52  QLITE_STATUS_SCR
2680: 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57 2c 20 2d  ATCH_OVERFLOW, -
2690: 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  iSize);.        
26a0: 73 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 64  sqlite3StatusAdd
26b0: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
26c0: 45 4d 4f 52 59 5f 55 53 45 44 2c 20 2d 69 53 69  EMORY_USED, -iSi
26d0: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ze);.        sql
26e0: 69 74 65 33 43 6f 6e 66 69 67 2e 6d 2e 78 46 72  ite3Config.m.xFr
26f0: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 73  ee(p);.        s
2700: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2710: 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a  ve(mem0.mutex);.
2720: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2730: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66       sqlite3Conf
2740: 69 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b 0a 20  ig.m.xFree(p);. 
2750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2760: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
2770: 20 20 20 20 20 69 20 3d 20 28 75 38 20 2a 29 70       i = (u8 *)p
2780: 20 2d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   - (u8 *)sqlite3
2790: 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 3b  Config.pScratch;
27a0: 0a 20 20 20 20 20 20 69 20 2f 3d 20 73 71 6c 69  .      i /= sqli
27b0: 74 65 33 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  te3Config.szScra
27c0: 74 63 68 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tch;.      asser
27d0: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 73 71 6c  t( i>=0 && i<sql
27e0: 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 63 72 61  ite3Config.nScra
27f0: 74 63 68 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  tch );.      sql
2800: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2810: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
2820: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 30      assert( mem0
2830: 2e 6e 53 63 72 61 74 63 68 46 72 65 65 3c 73 71  .nScratchFree<sq
2840: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 63 72  lite3Config.nScr
2850: 61 74 63 68 20 29 3b 0a 20 20 20 20 20 20 6d 65  atch );.      me
2860: 6d 30 2e 61 53 63 72 61 74 63 68 46 72 65 65 5b  m0.aScratchFree[
2870: 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46 72 65  mem0.nScratchFre
2880: 65 2b 2b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  e++] = i;.      
2890: 73 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 64  sqlite3StatusAdd
28a0: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53  (SQLITE_STATUS_S
28b0: 43 52 41 54 43 48 5f 55 53 45 44 2c 20 2d 31 29  CRATCH_USED, -1)
28c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28d0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30  mutex_leave(mem0
28e0: 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  .mutex);.    }. 
28f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
2900: 63 61 74 65 20 6d 65 6d 6f 72 79 20 74 6f 20 62  cate memory to b
2910: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 61  e used by the pa
2920: 67 65 20 63 61 63 68 65 2e 20 20 4d 61 6b 65 20  ge cache.  Make 
2930: 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6d 65  use of the.** me
2940: 6d 6f 72 79 20 62 75 66 66 65 72 20 70 72 6f 76  mory buffer prov
2950: 69 64 65 64 20 62 79 20 53 51 4c 49 54 45 5f 43  ided by SQLITE_C
2960: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 20  ONFIG_PAGECACHE 
2970: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a  if there is one.
2980: 2a 2a 20 61 6e 64 20 74 68 61 74 20 6d 65 6d 6f  ** and that memo
2990: 72 79 20 69 73 20 6f 66 20 74 68 65 20 72 69 67  ry is of the rig
29a0: 68 74 20 73 69 7a 65 20 61 6e 64 20 69 73 20 6e  ht size and is n
29b0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a  ot completely.**
29c0: 20 63 6f 6e 73 75 6d 65 64 2e 20 20 4f 74 68 65   consumed.  Othe
29d0: 72 77 69 73 65 2c 20 66 61 69 6c 6f 76 65 72 20  rwise, failover 
29e0: 74 6f 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  to sqlite3Malloc
29f0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ()..*/.void *sql
2a00: 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 69  ite3PageMalloc(i
2a10: 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70  nt n){.  void *p
2a20: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
2a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 20  );.  assert( (n 
2a40: 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20  & (n-1))==0 );. 
2a50: 20 61 73 73 65 72 74 28 20 6e 3e 3d 35 31 32 20   assert( n>=512 
2a60: 26 26 20 6e 3c 3d 33 32 37 36 38 20 29 3b 0a 0a  && n<=32768 );..
2a70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6e    if( sqlite3Con
2a80: 66 69 67 2e 73 7a 50 61 67 65 3c 6e 20 29 7b 0a  fig.szPage<n ){.
2a90: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 5f 6f 76      goto page_ov
2aa0: 65 72 66 6c 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  erflow;.  }else{
2ab0: 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d    .    sqlite3_m
2ac0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e  utex_enter(mem0.
2ad0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66 28 20  mutex);.    if( 
2ae0: 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65 3d 3d  mem0.nPageFree==
2af0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2b00: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
2b10: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20  em0.mutex);.    
2b20: 20 20 67 6f 74 6f 20 70 61 67 65 5f 6f 76 65 72    goto page_over
2b30: 66 6c 6f 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  flow;.    }else{
2b40: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2b50: 20 20 20 20 69 20 3d 20 6d 65 6d 30 2e 61 50 61      i = mem0.aPa
2b60: 67 65 46 72 65 65 5b 2d 2d 6d 65 6d 30 2e 6e 50  geFree[--mem0.nP
2b70: 61 67 65 46 72 65 65 5d 3b 0a 20 20 20 20 20 20  ageFree];.      
2b80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2b90: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
2ba0: 0a 20 20 20 20 20 20 69 20 2a 3d 20 73 71 6c 69  .      i *= sqli
2bb0: 74 65 33 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  te3Config.szPage
2bc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2bd0: 74 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f  tatusAdd(SQLITE_
2be0: 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
2bf0: 5f 55 53 45 44 2c 20 31 29 3b 0a 20 20 20 20 20  _USED, 1);.     
2c00: 20 70 20 3d 20 28 76 6f 69 64 2a 29 26 28 28 63   p = (void*)&((c
2c10: 68 61 72 2a 29 73 71 6c 69 74 65 33 43 6f 6e 66  har*)sqlite3Conf
2c20: 69 67 2e 70 50 61 67 65 29 5b 69 5d 3b 0a 20 20  ig.pPage)[i];.  
2c30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2c40: 20 70 3b 0a 0a 70 61 67 65 5f 6f 76 65 72 66 6c   p;..page_overfl
2c50: 6f 77 3a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ow:.  if( sqlite
2c60: 33 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74  3Config.bMemstat
2c70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2c80: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30  mutex_enter(mem0
2c90: 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 6e 20 3d  .mutex);.    n =
2ca0: 20 6d 61 6c 6c 6f 63 57 69 74 68 41 6c 61 72 6d   mallocWithAlarm
2cb0: 28 6e 2c 20 26 70 29 3b 0a 20 20 20 20 69 66 28  (n, &p);.    if(
2cc0: 20 70 20 29 20 73 71 6c 69 74 65 33 53 74 61 74   p ) sqlite3Stat
2cd0: 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41  usAdd(SQLITE_STA
2ce0: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56  TUS_PAGECACHE_OV
2cf0: 45 52 46 4c 4f 57 2c 20 6e 29 3b 0a 20 20 20 20  ERFLOW, n);.    
2d00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2d10: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
2d20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
2d30: 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  = sqlite3Config.
2d40: 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20  m.xMalloc(n);.  
2d50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 20 20 20  }.  return p;   
2d60: 20 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33   .}.void sqlite3
2d70: 50 61 67 65 46 72 65 65 28 76 6f 69 64 20 2a 70  PageFree(void *p
2d80: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2d90: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6e    if( sqlite3Con
2da0: 66 69 67 2e 70 50 61 67 65 3d 3d 30 0a 20 20 20  fig.pPage==0.   
2db0: 20 20 20 20 20 20 20 20 7c 7c 20 70 3c 73 71 6c          || p<sql
2dc0: 69 74 65 33 43 6f 6e 66 69 67 2e 70 50 61 67 65  ite3Config.pPage
2dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
2de0: 3e 3d 28 76 6f 69 64 2a 29 6d 65 6d 30 2e 61 50  >=(void*)mem0.aP
2df0: 61 67 65 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ageFree ){.     
2e00: 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
2e10: 2c 20 74 68 65 20 70 61 67 65 20 61 6c 6c 6f 63  , the page alloc
2e20: 61 74 69 6f 6e 20 77 61 73 20 6f 62 74 61 69 6e  ation was obtain
2e30: 65 64 20 66 72 6f 6d 20 61 20 72 65 67 75 6c 61  ed from a regula
2e40: 72 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  r .      ** call
2e50: 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f   to sqlite3_mem_
2e60: 6d 65 74 68 6f 64 73 2e 78 4d 61 6c 6c 6f 63 28  methods.xMalloc(
2e70: 29 20 28 61 20 70 61 67 65 2d 63 61 63 68 65 2d  ) (a page-cache-
2e80: 6d 65 6d 6f 72 79 20 0a 20 20 20 20 20 20 2a 2a  memory .      **
2e90: 20 22 6f 76 65 72 66 6c 6f 77 22 29 2e 20 46 72   "overflow"). Fr
2ea0: 65 65 20 74 68 65 20 62 6c 6f 63 6b 20 77 69 74  ee the block wit
2eb0: 68 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  h sqlite3_mem_me
2ec0: 74 68 6f 64 73 2e 78 46 72 65 65 28 29 2e 0a 20  thods.xFree().. 
2ed0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2ee0: 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  ( sqlite3Config.
2ef0: 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20  bMemstat ){.    
2f00: 20 20 20 20 69 6e 74 20 69 53 69 7a 65 20 3d 20      int iSize = 
2f10: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
2f20: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(p);.        sq
2f30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2f40: 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  r(mem0.mutex);. 
2f50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
2f60: 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53  atusAdd(SQLITE_S
2f70: 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
2f80: 4f 56 45 52 46 4c 4f 57 2c 20 2d 69 53 69 7a 65  OVERFLOW, -iSize
2f90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2fa0: 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49  e3StatusAdd(SQLI
2fb0: 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
2fc0: 5f 55 53 45 44 2c 20 2d 69 53 69 7a 65 29 3b 0a  _USED, -iSize);.
2fd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
2fe0: 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29  onfig.m.xFree(p)
2ff0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3000: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
3010: 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  m0.mutex);.     
3020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3030: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 2e  sqlite3Config.m.
3040: 78 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  xFree(p);.      
3050: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
3060: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61     /* The page a
3070: 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 61 6c  llocation was al
3080: 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 74 68 65  located from the
3090: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70   sqlite3Config.p
30a0: 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 75  Page.      ** bu
30b0: 66 66 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ffer. In this ca
30c0: 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73 20 61  se all that is a
30d0: 64 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  dd the index of 
30e0: 74 68 65 20 70 61 67 65 20 69 6e 0a 20 20 20 20  the page in.    
30f0: 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
3100: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 61 72 72  Config.pPage arr
3110: 61 79 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ay to the set of
3120: 20 66 72 65 65 20 69 6e 64 65 78 65 73 20 73 74   free indexes st
3130: 6f 72 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ored.      ** in
3140: 20 74 68 65 20 6d 65 6d 30 2e 61 50 61 67 65 46   the mem0.aPageF
3150: 72 65 65 5b 5d 20 61 72 72 61 79 2e 0a 20 20 20  ree[] array..   
3160: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
3170: 69 3b 0a 20 20 20 20 20 20 69 20 3d 20 28 75 38  i;.      i = (u8
3180: 20 2a 29 70 20 2d 20 28 75 38 20 2a 29 73 71 6c   *)p - (u8 *)sql
3190: 69 74 65 33 43 6f 6e 66 69 67 2e 70 50 61 67 65  ite3Config.pPage
31a0: 3b 0a 20 20 20 20 20 20 69 20 2f 3d 20 73 71 6c  ;.      i /= sql
31b0: 69 74 65 33 43 6f 6e 66 69 67 2e 73 7a 50 61 67  ite3Config.szPag
31c0: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
31d0: 20 69 3e 3d 30 20 26 26 20 69 3c 73 71 6c 69 74   i>=0 && i<sqlit
31e0: 65 33 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 29  e3Config.nPage )
31f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
3200: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30  mutex_enter(mem0
3210: 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61  .mutex);.      a
3220: 73 73 65 72 74 28 20 6d 65 6d 30 2e 6e 50 61 67  ssert( mem0.nPag
3230: 65 46 72 65 65 3c 73 71 6c 69 74 65 33 43 6f 6e  eFree<sqlite3Con
3240: 66 69 67 2e 6e 50 61 67 65 20 29 3b 0a 20 20 20  fig.nPage );.   
3250: 20 20 20 6d 65 6d 30 2e 61 50 61 67 65 46 72 65     mem0.aPageFre
3260: 65 5b 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65  e[mem0.nPageFree
3270: 2b 2b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 73  ++] = i;.      s
3280: 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28  qlite3StatusAdd(
3290: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
32a0: 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 2d 31  GECACHE_USED, -1
32b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
32d0: 30 2e 6d 75 74 65 78 29 3b 0a 23 69 66 20 21 64  0.mutex);.#if !d
32e0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
32f0: 26 20 30 0a 20 20 20 20 20 20 2f 2a 20 41 73 73  & 0.      /* Ass
3300: 65 72 74 20 74 68 61 74 20 61 20 64 75 70 6c 69  ert that a dupli
3310: 63 61 74 65 20 77 61 73 20 6e 6f 74 20 6a 75 73  cate was not jus
3320: 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  t inserted into 
3330: 61 50 61 67 65 46 72 65 65 5b 5d 2e 20 2a 2f 0a  aPageFree[]. */.
3340: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3350: 3c 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65 2d  <mem0.nPageFree-
3360: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  1; i++){.       
3370: 20 61 73 73 65 72 74 28 20 6d 65 6d 30 2e 61 50   assert( mem0.aP
3380: 61 67 65 46 72 65 65 5b 69 5d 21 3d 6d 65 6d 30  ageFree[i]!=mem0
3390: 2e 61 50 61 67 65 46 72 65 65 5b 6d 65 6d 30 2e  .aPageFree[mem0.
33a0: 6e 50 61 67 65 46 72 65 65 2d 31 5d 20 29 3b 0a  nPageFree-1] );.
33b0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
33c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
33d0: 2a 20 54 52 55 45 20 69 66 20 70 20 69 73 20 61  * TRUE if p is a
33e0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
33f0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 72 6f  y allocation fro
3400: 6d 20 64 62 0a 2a 2f 0a 73 74 61 74 69 63 20 69  m db.*/.static i
3410: 6e 74 20 69 73 4c 6f 6f 6b 61 73 69 64 65 28 73  nt isLookaside(s
3420: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
3430: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 64   *p){.  return d
3440: 62 20 26 26 20 70 20 26 26 20 70 3e 3d 64 62 2d  b && p && p>=db-
3450: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
3460: 74 20 26 26 20 70 3c 64 62 2d 3e 6c 6f 6f 6b 61  t && p<db->looka
3470: 73 69 64 65 2e 70 45 6e 64 3b 0a 7d 0a 0a 2f 2a  side.pEnd;.}../*
3480: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
3490: 69 7a 65 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  ize of a memory 
34a0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 72 65 76 69  allocation previ
34b0: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 66  ously obtained f
34c0: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 4d 61  rom.** sqlite3Ma
34d0: 6c 6c 6f 63 28 29 20 6f 72 20 73 71 6c 69 74 65  lloc() or sqlite
34e0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 69  3_malloc()..*/.i
34f0: 6e 74 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  nt sqlite3Malloc
3500: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  Size(void *p){. 
3510: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43   return sqlite3C
3520: 6f 6e 66 69 67 2e 6d 2e 78 53 69 7a 65 28 70 29  onfig.m.xSize(p)
3530: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  ;.}.int sqlite3D
3540: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 73 71 6c 69  bMallocSize(sqli
3550: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
3560: 29 7b 0a 20 20 69 66 28 20 69 73 4c 6f 6f 6b 61  ){.  if( isLooka
3570: 73 69 64 65 28 64 62 2c 20 70 29 20 29 7b 0a 20  side(db, p) ){. 
3580: 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 6f     return db->lo
3590: 6f 6b 61 73 69 64 65 2e 73 7a 3b 0a 20 20 7d 65  okaside.sz;.  }e
35a0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
35b0: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 2e  sqlite3Config.m.
35c0: 78 53 69 7a 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  xSize(p);.  }.}.
35d0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f  ./*.** Free memo
35e0: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 62  ry previously ob
35f0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
3600: 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  te3Malloc()..*/.
3610: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 66 72 65  void sqlite3_fre
3620: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 69 66  e(void *p){.  if
3630: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
3640: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f  .  if( sqlite3Co
3650: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b  nfig.bMemstat ){
3660: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
3670: 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75  ex_enter(mem0.mu
3680: 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tex);.    sqlite
3690: 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54  3StatusAdd(SQLIT
36a0: 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
36b0: 55 53 45 44 2c 20 2d 73 71 6c 69 74 65 33 4d 61  USED, -sqlite3Ma
36c0: 6c 6c 6f 63 53 69 7a 65 28 70 29 29 3b 0a 20 20  llocSize(p));.  
36d0: 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e    sqlite3Config.
36e0: 6d 2e 78 46 72 65 65 28 70 29 3b 0a 20 20 20 20  m.xFree(p);.    
36f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
3700: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
3710: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
3720: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 2e 78 46  lite3Config.m.xF
3730: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
3740: 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79  *.** Free memory
3750: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
3760: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
3770: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
3780: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
3790: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
37a0: 74 65 33 44 62 46 72 65 65 28 73 71 6c 69 74 65  te3DbFree(sqlite
37b0: 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b  3 *db, void *p){
37c0: 0a 20 20 69 66 28 20 69 73 4c 6f 6f 6b 61 73 69  .  if( isLookasi
37d0: 64 65 28 64 62 2c 20 70 29 20 29 7b 0a 20 20 20  de(db, p) ){.   
37e0: 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a   LookasideSlot *
37f0: 70 42 75 66 20 3d 20 28 4c 6f 6f 6b 61 73 69 64  pBuf = (Lookasid
3800: 65 53 6c 6f 74 2a 29 70 3b 0a 20 20 20 20 70 42  eSlot*)p;.    pB
3810: 75 66 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e  uf->pNext = db->
3820: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b  lookaside.pFree;
3830: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
3840: 64 65 2e 70 46 72 65 65 20 3d 20 70 42 75 66 3b  de.pFree = pBuf;
3850: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
3860: 64 65 2e 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  de.nOut--;.  }el
3870: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
3880: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
3890: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
38a0: 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73   size of an exis
38b0: 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ting memory allo
38c0: 63 61 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 2a  cation.*/.void *
38d0: 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 76  sqlite3Realloc(v
38e0: 6f 69 64 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e  oid *pOld, int n
38f0: 42 79 74 65 73 29 7b 0a 20 20 69 6e 74 20 6e 4f  Bytes){.  int nO
3900: 6c 64 2c 20 6e 4e 65 77 3b 0a 20 20 76 6f 69 64  ld, nNew;.  void
3910: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 4f   *pNew;.  if( pO
3920: 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ld==0 ){.    ret
3930: 75 72 6e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  urn sqlite3Mallo
3940: 63 28 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20  c(nBytes);.  }. 
3950: 20 69 66 28 20 6e 42 79 74 65 73 3c 3d 30 20 29   if( nBytes<=0 )
3960: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
3970: 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20 72 65  ee(pOld);.    re
3980: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 4f  turn 0;.  }.  nO
3990: 6c 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ld = sqlite3Mall
39a0: 6f 63 53 69 7a 65 28 70 4f 6c 64 29 3b 0a 20 20  ocSize(pOld);.  
39b0: 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69  if( sqlite3Confi
39c0: 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20  g.bMemstat ){.  
39d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
39e0: 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78  enter(mem0.mutex
39f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  );.    sqlite3St
3a00: 61 74 75 73 53 65 74 28 53 51 4c 49 54 45 5f 53  atusSet(SQLITE_S
3a10: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a  TATUS_MALLOC_SIZ
3a20: 45 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 20 20  E, nBytes);.    
3a30: 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 43 6f  nNew = sqlite3Co
3a40: 6e 66 69 67 2e 6d 2e 78 52 6f 75 6e 64 75 70 28  nfig.m.xRoundup(
3a50: 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 69 66 28  nBytes);.    if(
3a60: 20 6e 4f 6c 64 3d 3d 6e 4e 65 77 20 29 7b 0a 20   nOld==nNew ){. 
3a70: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 6c 64       pNew = pOld
3a80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3a90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3aa0: 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49 54 45  atusValue(SQLITE
3ab0: 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
3ac0: 53 45 44 29 2b 6e 4e 65 77 2d 6e 4f 6c 64 20 3e  SED)+nNew-nOld >
3ad0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  = .            m
3ae0: 65 6d 30 2e 61 6c 61 72 6d 54 68 72 65 73 68 6f  em0.alarmThresho
3af0: 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ld ){.        sq
3b00: 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d  lite3MallocAlarm
3b10: 28 6e 4e 65 77 2d 6e 4f 6c 64 29 3b 0a 20 20 20  (nNew-nOld);.   
3b20: 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 20     }.      pNew 
3b30: 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  = sqlite3Config.
3b40: 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c  m.xRealloc(pOld,
3b50: 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   nNew);.      if
3b60: 28 20 70 4e 65 77 3d 3d 30 20 26 26 20 6d 65 6d  ( pNew==0 && mem
3b70: 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20  0.alarmCallback 
3b80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3b90: 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 42  e3MallocAlarm(nB
3ba0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 70  ytes);.        p
3bb0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e  New = sqlite3Con
3bc0: 66 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63 28 70  fig.m.xRealloc(p
3bd0: 4f 6c 64 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  Old, nNew);.    
3be0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4e    }.      if( pN
3bf0: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e  ew ){.        nN
3c00: 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ew = sqlite3Mall
3c10: 6f 63 53 69 7a 65 28 70 4e 65 77 29 3b 0a 20 20  ocSize(pNew);.  
3c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61        sqlite3Sta
3c30: 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54  tusAdd(SQLITE_ST
3c40: 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
3c50: 2c 20 6e 4e 65 77 2d 6e 4f 6c 64 29 3b 0a 20 20  , nNew-nOld);.  
3c60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3c70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
3c80: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
3c90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
3ca0: 65 77 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66  ew = sqlite3Conf
3cb0: 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 4f  ig.m.xRealloc(pO
3cc0: 6c 64 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 7d  ld, nBytes);.  }
3cd0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 75 62  }../*.** The pub
3cf0: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 74 6f  lic interface to
3d00: 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 2e   sqlite3Realloc.
3d10: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74    Make sure that
3d20: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73   the memory.** s
3d30: 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74  ubsystem is init
3d40: 69 61 6c 69 7a 65 64 20 70 72 69 6f 72 20 74 6f  ialized prior to
3d50: 20 69 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65   invoking sqlite
3d60: 52 65 61 6c 6c 6f 63 2e 0a 2a 2f 0a 76 6f 69 64  Realloc..*/.void
3d70: 20 2a 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f   *sqlite3_reallo
3d80: 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c 20 69 6e  c(void *pOld, in
3d90: 74 20 6e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  t n){.#ifndef SQ
3da0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
3db0: 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  IT.  if( sqlite3
3dc0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20  _initialize() ) 
3dd0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
3de0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3df0: 33 52 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e  3Realloc(pOld, n
3e00: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  );.}.../*.** All
3e10: 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 6d  ocate and zero m
3e20: 65 6d 6f 72 79 2e 0a 2a 2f 20 0a 76 6f 69 64 20  emory..*/ .void 
3e30: 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  *sqlite3MallocZe
3e40: 72 6f 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69  ro(int n){.  voi
3e50: 64 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  d *p = sqlite3Ma
3e60: 6c 6c 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 70  lloc(n);.  if( p
3e70: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
3e80: 2c 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72  , 0, n);.  }.  r
3e90: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
3ea0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a  * Allocate and z
3eb0: 65 72 6f 20 6d 65 6d 6f 72 79 2e 20 20 49 66 20  ero memory.  If 
3ec0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
3ed0: 61 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a 20 74 68  ails, make.** th
3ee0: 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  e mallocFailed f
3ef0: 6c 61 67 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65  lag in the conne
3f00: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
3f10: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44  /.void *sqlite3D
3f20: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 71 6c 69  bMallocZero(sqli
3f30: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 29 7b  te3 *db, int n){
3f40: 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c  .  void *p = sql
3f50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
3f60: 64 62 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70 20  db, n);.  if( p 
3f70: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c  ){.    memset(p,
3f80: 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65   0, n);.  }.  re
3f90: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3fa0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65   Allocate and ze
3fb0: 72 6f 20 6d 65 6d 6f 72 79 2e 20 20 49 66 20 74  ro memory.  If t
3fc0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  he allocation fa
3fd0: 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a 20 74 68 65  ils, make.** the
3fe0: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
3ff0: 61 67 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63  ag in the connec
4000: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  tion pointer..*/
4010: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62  .void *sqlite3Db
4020: 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65  MallocRaw(sqlite
4030: 33 20 2a 64 62 2c 20 69 6e 74 20 6e 29 7b 0a 20  3 *db, int n){. 
4040: 20 76 6f 69 64 20 2a 70 3b 0a 20 20 69 66 28 20   void *p;.  if( 
4050: 64 62 20 29 7b 0a 20 20 20 20 4c 6f 6f 6b 61 73  db ){.    Lookas
4060: 69 64 65 53 6c 6f 74 20 2a 70 42 75 66 3b 0a 20  ideSlot *pBuf;. 
4070: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
4080: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
4090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
40a0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  .    if( db->loo
40b0: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
40c0: 26 26 20 6e 3c 3d 64 62 2d 3e 6c 6f 6f 6b 61 73  && n<=db->lookas
40d0: 69 64 65 2e 73 7a 0a 20 20 20 20 20 20 20 20 20  ide.sz.         
40e0: 26 26 20 28 70 42 75 66 20 3d 20 64 62 2d 3e 6c  && (pBuf = db->l
40f0: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 29 21  ookaside.pFree)!
4100: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  =0 ){.      db->
4110: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
4120: 3d 20 70 42 75 66 2d 3e 70 4e 65 78 74 3b 0a 20  = pBuf->pNext;. 
4130: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
4140: 64 65 2e 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 20  de.nOut++;.     
4150: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
4160: 64 65 2e 6e 4f 75 74 3e 64 62 2d 3e 6c 6f 6f 6b  de.nOut>db->look
4170: 61 73 69 64 65 2e 6d 78 4f 75 74 20 29 7b 0a 20  aside.mxOut ){. 
4180: 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61         db->looka
4190: 73 69 64 65 2e 6d 78 4f 75 74 20 3d 20 64 62 2d  side.mxOut = db-
41a0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3b  >lookaside.nOut;
41b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
41c0: 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 42 75  eturn (void*)pBu
41d0: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  f;.    }.  }.  p
41e0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
41f0: 28 6e 29 3b 0a 20 20 69 66 28 20 21 70 20 26 26  (n);.  if( !p &&
4200: 20 64 62 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d   db ){.    db->m
4210: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
4220: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
4230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65  .}../*.** Resize
4240: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65   the block of me
4250: 6d 6f 72 79 20 70 6f 69 6e 74 65 64 20 74 6f 20  mory pointed to 
4260: 62 79 20 70 20 74 6f 20 6e 20 62 79 74 65 73 2e  by p to n bytes.
4270: 20 49 66 20 74 68 65 0a 2a 2a 20 72 65 73 69 7a   If the.** resiz
4280: 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
4290: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
42a0: 61 67 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63  ag in the connec
42b0: 74 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  tion object..*/.
42c0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62 52  void *sqlite3DbR
42d0: 65 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  ealloc(sqlite3 *
42e0: 64 62 2c 20 76 6f 69 64 20 2a 70 2c 20 69 6e 74  db, void *p, int
42f0: 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4e 65   n){.  void *pNe
4300: 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 2d  w = 0;.  if( db-
4310: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
4320: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   ){.    if( p==0
4330: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
4340: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4350: 52 61 77 28 64 62 2c 20 6e 29 3b 0a 20 20 20 20  Raw(db, n);.    
4360: 7d 0a 20 20 20 20 69 66 28 20 69 73 4c 6f 6f 6b  }.    if( isLook
4370: 61 73 69 64 65 28 64 62 2c 20 70 29 20 29 7b 0a  aside(db, p) ){.
4380: 20 20 20 20 20 20 69 66 28 20 6e 3c 3d 64 62 2d        if( n<=db-
4390: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 29 7b  >lookaside.sz ){
43a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
43b0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
43c0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
43d0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
43e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
43f0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  w ){.        mem
4400: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 64 62 2d  cpy(pNew, p, db-
4410: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 29 3b 0a  >lookaside.sz);.
4420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4430: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
4440: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4450: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
4460: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2c  lite3_realloc(p,
4470: 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   n);.      if( !
4480: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
4490: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
44a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
44b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
44c0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
44d0: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 61 6c 6c  Attempt to reall
44e0: 6f 63 61 74 65 20 70 2e 20 20 49 66 20 74 68 65  ocate p.  If the
44f0: 20 72 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61   reallocation fa
4500: 69 6c 73 2c 20 74 68 65 6e 20 66 72 65 65 20 70  ils, then free p
4510: 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 68 65 20  .** and set the 
4520: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
4530: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
4540: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
4550: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62  .void *sqlite3Db
4560: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 73 71  ReallocOrFree(sq
4570: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
4580: 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f  *p, int n){.  vo
4590: 69 64 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  id *pNew;.  pNew
45a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
45b0: 6c 6f 63 28 64 62 2c 20 70 2c 20 6e 29 3b 0a 20  loc(db, p, n);. 
45c0: 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
45d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
45e0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 72 65  db, p);.  }.  re
45f0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4600: 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  .** Make a copy 
4610: 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  of a string in m
4620: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4630: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
4640: 28 29 2e 20 54 68 65 73 65 20 0a 2a 2a 20 66 75  (). These .** fu
4650: 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 20 73 71 6c  nctions call sql
4660: 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 29 20  ite3MallocRaw() 
4670: 64 69 72 65 63 74 6c 79 20 69 6e 73 74 65 61 64  directly instead
4680: 20 6f 66 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63   of sqliteMalloc
4690: 28 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 62  (). This.** is b
46a0: 65 63 61 75 73 65 20 77 68 65 6e 20 6d 65 6d 6f  ecause when memo
46b0: 72 79 20 64 65 62 75 67 67 69 6e 67 20 69 73 20  ry debugging is 
46c0: 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 73 65  turned on, these
46d0: 20 74 77 6f 20 66 75 6e 63 74 69 6f 6e 73 20 61   two functions a
46e0: 72 65 20 0a 2a 2a 20 63 61 6c 6c 65 64 20 76 69  re .** called vi
46f0: 61 20 6d 61 63 72 6f 73 20 74 68 61 74 20 72 65  a macros that re
4700: 63 6f 72 64 20 74 68 65 20 63 75 72 72 65 6e 74  cord the current
4710: 20 66 69 6c 65 20 61 6e 64 20 6c 69 6e 65 20 6e   file and line n
4720: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  umber in the.** 
4730: 54 68 72 65 61 64 44 61 74 61 20 73 74 72 75 63  ThreadData struc
4740: 74 75 72 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  ture..*/.char *s
4750: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 73  qlite3DbStrDup(s
4760: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
4770: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68  t char *z){.  ch
4780: 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 73 69 7a 65  ar *zNew;.  size
4790: 5f 74 20 6e 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  _t n;.  if( z==0
47a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
47b0: 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 74 72 6c  ;.  }.  n = strl
47c0: 65 6e 28 7a 29 2b 31 3b 0a 20 20 61 73 73 65 72  en(z)+1;.  asser
47d0: 74 28 20 28 6e 26 30 78 37 66 66 66 66 66 66 66  t( (n&0x7fffffff
47e0: 29 3d 3d 6e 20 29 3b 0a 20 20 7a 4e 65 77 20 3d  )==n );.  zNew =
47f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4800: 52 61 77 28 64 62 2c 20 28 69 6e 74 29 6e 29 3b  Raw(db, (int)n);
4810: 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20  .  if( zNew ){. 
4820: 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20     memcpy(zNew, 
4830: 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  z, n);.  }.  ret
4840: 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 63 68 61 72  urn zNew;.}.char
4850: 20 2a 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44   *sqlite3DbStrND
4860: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
4870: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
4880: 6e 74 20 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a  nt n){.  char *z
4890: 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  New;.  if( z==0 
48a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
48b0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
48c0: 6e 26 30 78 37 66 66 66 66 66 66 66 29 3d 3d 6e  n&0x7fffffff)==n
48d0: 20 29 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c   );.  zNew = sql
48e0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
48f0: 64 62 2c 20 6e 2b 31 29 3b 0a 20 20 69 66 28 20  db, n+1);.  if( 
4900: 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 63  zNew ){.    memc
4910: 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b 0a  py(zNew, z, n);.
4920: 20 20 20 20 7a 4e 65 77 5b 6e 5d 20 3d 20 30 3b      zNew[n] = 0;
4930: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
4940: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ew;.}../*.** Cre
4950: 61 74 65 20 61 20 73 74 72 69 6e 67 20 66 72 6f  ate a string fro
4960: 6d 20 74 68 65 20 7a 46 72 6f 6d 61 74 20 61 72  m the zFromat ar
4970: 67 75 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 76  gument and the v
4980: 61 5f 6c 69 73 74 20 74 68 61 74 20 66 6f 6c 6c  a_list that foll
4990: 6f 77 73 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68  ows..** Store th
49a0: 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f  e string in memo
49b0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
49c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
49d0: 61 6e 64 20 6d 61 6b 65 20 2a 70 7a 0a 2a 2a 20  and make *pz.** 
49e0: 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 74  point to that st
49f0: 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ring..*/.void sq
4a00: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 63  lite3SetString(c
4a10: 68 61 72 20 2a 2a 70 7a 2c 20 73 71 6c 69 74 65  har **pz, sqlite
4a20: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
4a30: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
4a40: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
4a50: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 76 61    char *z;..  va
4a60: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
4a70: 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  at);.  z = sqlit
4a80: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
4a90: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
4aa0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c  a_end(ap);.  sql
4ab0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 2a  ite3DbFree(db, *
4ac0: 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20 7a 3b 0a  pz);.  *pz = z;.
4ad0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
4ae0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
4af0: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 65 78  called before ex
4b00: 69 74 69 6e 67 20 61 6e 79 20 41 50 49 20 66 75  iting any API fu
4b10: 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 0a 2a 2a  nction (i.e. .**
4b20: 20 72 65 74 75 72 6e 69 6e 67 20 63 6f 6e 74 72   returning contr
4b30: 6f 6c 20 74 6f 20 74 68 65 20 75 73 65 72 29 20  ol to the user) 
4b40: 74 68 61 74 20 68 61 73 20 63 61 6c 6c 65 64 20  that has called 
4b50: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 6f  sqlite3_malloc o
4b60: 72 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 61  r.** sqlite3_rea
4b70: 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lloc..**.** The 
4b80: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
4b90: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 63 6f 70  s normally a cop
4ba0: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
4bb0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
4bc0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 48 6f  .** function. Ho
4bd0: 77 65 76 65 72 2c 20 69 66 20 61 20 6d 61 6c 6c  wever, if a mall
4be0: 6f 63 28 29 20 66 61 69 6c 75 72 65 20 68 61 73  oc() failure has
4bf0: 20 6f 63 63 75 72 65 64 20 73 69 6e 63 65 20 74   occured since t
4c00: 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 69  he previous.** i
4c10: 6e 76 6f 63 61 74 69 6f 6e 20 53 51 4c 49 54 45  nvocation SQLITE
4c20: 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
4c30: 65 64 20 69 6e 73 74 65 61 64 2e 20 0a 2a 2a 0a  ed instead. .**.
4c40: 2a 2a 20 49 66 20 74 68 65 20 66 69 72 73 74 20  ** If the first 
4c50: 61 72 67 75 6d 65 6e 74 2c 20 64 62 2c 20 69 73  argument, db, is
4c60: 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 61 20   not NULL and a 
4c70: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 68  malloc() error h
4c80: 61 73 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 74  as occured,.** t
4c90: 68 65 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  hen the connecti
4ca0: 6f 6e 20 65 72 72 6f 72 2d 63 6f 64 65 20 28 74  on error-code (t
4cb0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4cc0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 65 72 72  d by sqlite3_err
4cd0: 63 6f 64 65 28 29 29 0a 2a 2a 20 69 73 20 73 65  code()).** is se
4ce0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
4cf0: 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  M..*/.int sqlite
4d00: 33 41 70 69 45 78 69 74 28 73 71 6c 69 74 65 33  3ApiExit(sqlite3
4d10: 2a 20 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20  * db, int rc){. 
4d20: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 20 68 61   /* If the db ha
4d30: 6e 64 6c 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ndle is not NULL
4d40: 2c 20 74 68 65 6e 20 77 65 20 6d 75 73 74 20 68  , then we must h
4d50: 6f 6c 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  old the connecti
4d60: 6f 6e 20 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 6d  on handle.  ** m
4d70: 75 74 65 78 20 68 65 72 65 2e 20 4f 74 68 65 72  utex here. Other
4d80: 77 69 73 65 20 74 68 65 20 72 65 61 64 20 28 61  wise the read (a
4d90: 6e 64 20 70 6f 73 73 69 62 6c 65 20 77 72 69 74  nd possible writ
4da0: 65 29 20 6f 66 20 64 62 2d 3e 6d 61 6c 6c 6f 63  e) of db->malloc
4db0: 46 61 69 6c 65 64 20 0a 20 20 2a 2a 20 69 73 20  Failed .  ** is 
4dc0: 75 6e 73 61 66 65 2c 20 61 73 20 69 73 20 74 68  unsafe, as is th
4dd0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
4de0: 33 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  3Error()..  */. 
4df0: 20 61 73 73 65 72 74 28 20 21 64 62 20 7c 7c 20   assert( !db || 
4e00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4e10: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
4e20: 0a 20 20 69 66 28 20 64 62 20 26 26 20 64 62 2d  .  if( db && db-
4e30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
4e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4e50: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  r(db, SQLITE_NOM
4e60: 45 4d 2c 20 30 29 3b 0a 20 20 20 20 64 62 2d 3e  EM, 0);.    db->
4e70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
4e80: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
4e90: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
4ea0: 65 74 75 72 6e 20 72 63 20 26 20 28 64 62 20 3f  eturn rc & (db ?
4eb0: 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3a 20 30   db->errMask : 0
4ec0: 78 66 66 29 3b 0a 7d 0a                          xff);.}.