/ Hex Artifact Content
Login

Artifact 2ffd62fb4a299cf3945e50a4c53d27ec1813f8b1:


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 38 20 32 30 30 38  oc.c,v 1.38 2008
01d0: 2f 30 39 2f 30 31 20 31 38 3a 33 34 3a 32 30 20  /09/01 18:34:20 
01e0: 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20  danielk1977 Exp 
01f0: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0200: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0210: 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a  lude <stdarg.h>.
0220: 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e  #include <ctype.
0230: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  h>../*.** This r
0240: 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e  outine runs when
0250: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
0260: 63 61 74 6f 72 20 73 65 65 73 20 74 68 61 74 20  cator sees that 
0270: 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6d 65 6d  the.** total mem
0280: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
0290: 73 20 61 62 6f 75 74 20 74 6f 20 65 78 63 65 65  s about to excee
02a0: 64 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 0a  d the soft heap.
02b0: 2a 2a 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 73 74 61  ** limit..*/.sta
02c0: 74 69 63 20 76 6f 69 64 20 73 6f 66 74 48 65 61  tic void softHea
02d0: 70 4c 69 6d 69 74 45 6e 66 6f 72 63 65 72 28 0a  pLimitEnforcer(.
02e0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
02f0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   .  sqlite3_int6
0300: 34 20 69 6e 55 73 65 2c 0a 20 20 69 6e 74 20 61  4 inUse,.  int a
0310: 6c 6c 6f 63 53 69 7a 65 0a 29 7b 0a 20 20 73 71  llocSize.){.  sq
0320: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
0330: 6d 6f 72 79 28 61 6c 6c 6f 63 53 69 7a 65 29 3b  mory(allocSize);
0340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
0350: 65 20 73 6f 66 74 20 68 65 61 70 2d 73 69 7a 65  e soft heap-size
0360: 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65 20 6c   limit for the l
0370: 69 62 72 61 72 79 2e 20 50 61 73 73 69 6e 67 20  ibrary. Passing 
0380: 61 20 7a 65 72 6f 20 6f 72 20 0a 2a 2a 20 6e 65  a zero or .** ne
0390: 67 61 74 69 76 65 20 76 61 6c 75 65 20 69 6e 64  gative value ind
03a0: 69 63 61 74 65 73 20 6e 6f 20 6c 69 6d 69 74 2e  icates no limit.
03b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
03c0: 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
03d0: 28 69 6e 74 20 6e 29 7b 0a 20 20 73 71 6c 69 74  (int n){.  sqlit
03e0: 65 33 5f 75 69 6e 74 36 34 20 69 4c 69 6d 69 74  e3_uint64 iLimit
03f0: 3b 0a 20 20 69 6e 74 20 6f 76 65 72 61 67 65 3b  ;.  int overage;
0400: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
0410: 20 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20    iLimit = 0;.  
0420: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4c 69 6d 69  }else{.    iLimi
0430: 74 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = n;.  }.  sql
0440: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
0450: 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e  );.  if( iLimit>
0460: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
0470: 5f 6d 65 6d 6f 72 79 5f 61 6c 61 72 6d 28 73 6f  _memory_alarm(so
0480: 66 74 48 65 61 70 4c 69 6d 69 74 45 6e 66 6f 72  ftHeapLimitEnfor
0490: 63 65 72 2c 20 30 2c 20 69 4c 69 6d 69 74 29 3b  cer, 0, iLimit);
04a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
04b0: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 61 6c 61  lite3_memory_ala
04c0: 72 6d 28 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  rm(0, 0, 0);.  }
04d0: 0a 20 20 6f 76 65 72 61 67 65 20 3d 20 73 71 6c  .  overage = sql
04e0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
04f0: 28 29 20 2d 20 6e 3b 0a 20 20 69 66 28 20 6f 76  () - n;.  if( ov
0500: 65 72 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 73  erage>0 ){.    s
0510: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
0520: 65 6d 6f 72 79 28 6f 76 65 72 61 67 65 29 3b 0a  emory(overage);.
0530: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
0540: 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20  empt to release 
0550: 75 70 20 74 6f 20 6e 20 62 79 74 65 73 20 6f 66  up to n bytes of
0560: 20 6e 6f 6e 2d 65 73 73 65 6e 74 69 61 6c 20 6d   non-essential m
0570: 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 0a  emory currently.
0580: 2a 2a 20 68 65 6c 64 20 62 79 20 53 51 4c 69 74  ** held by SQLit
0590: 65 2e 20 41 6e 20 65 78 61 6d 70 6c 65 20 6f 66  e. An example of
05a0: 20 6e 6f 6e 2d 65 73 73 65 6e 74 69 61 6c 20 6d   non-essential m
05b0: 65 6d 6f 72 79 20 69 73 20 6d 65 6d 6f 72 79 20  emory is memory 
05c0: 75 73 65 64 20 74 6f 0a 2a 2a 20 63 61 63 68 65  used to.** cache
05d0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20   database pages 
05e0: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 75 72  that are not cur
05f0: 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a  rently in use..*
0600: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65  /.int sqlite3_re
0610: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74  lease_memory(int
0620: 20 6e 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49   n){.#ifdef SQLI
0630: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
0640: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 6e  _MANAGEMENT.  in
0650: 74 20 6e 52 65 74 20 3d 20 30 3b 0a 23 69 66 20  t nRet = 0;.#if 
0660: 30 0a 20 20 6e 52 65 74 20 2b 3d 20 73 71 6c 69  0.  nRet += sqli
0670: 74 65 33 56 64 62 65 52 65 6c 65 61 73 65 4d 65  te3VdbeReleaseMe
0680: 6d 6f 72 79 28 6e 29 3b 0a 23 65 6e 64 69 66 0a  mory(n);.#endif.
0690: 20 20 6e 52 65 74 20 2b 3d 20 73 71 6c 69 74 65    nRet += sqlite
06a0: 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 4d 65  3PcacheReleaseMe
06b0: 6d 6f 72 79 28 6e 2d 6e 52 65 74 29 3b 0a 20 20  mory(n-nRet);.  
06c0: 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 23 65 6c  return nRet;.#el
06d0: 73 65 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  se.  return SQLI
06e0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  TE_OK;.#endif.}.
06f0: 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66  ./*.** State inf
0700: 6f 72 6d 61 74 69 6f 6e 20 6c 6f 63 61 6c 20 74  ormation local t
0710: 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  o the memory all
0720: 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65  ocation subsyste
0730: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  m..*/.static str
0740: 75 63 74 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  uct {.  sqlite3_
0750: 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
0760: 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
0770: 6f 20 73 65 72 69 61 6c 69 7a 65 20 61 63 63 65  o serialize acce
0780: 73 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ss */..  /*.  **
0790: 20 54 68 65 20 61 6c 61 72 6d 20 63 61 6c 6c 62   The alarm callb
07a0: 61 63 6b 20 61 6e 64 20 69 74 73 20 61 72 67 75  ack and its argu
07b0: 6d 65 6e 74 73 2e 20 20 54 68 65 20 6d 65 6d 30  ments.  The mem0
07c0: 2e 6d 75 74 65 78 20 6c 6f 63 6b 20 77 69 6c 6c  .mutex lock will
07d0: 0a 20 20 2a 2a 20 62 65 20 68 65 6c 64 20 77 68  .  ** be held wh
07e0: 69 6c 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ile the callback
07f0: 20 69 73 20 72 75 6e 6e 69 6e 67 2e 20 20 52 65   is running.  Re
0800: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e  cursive calls in
0810: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f  to.  ** the memo
0820: 72 79 20 73 75 62 73 79 73 74 65 6d 20 61 72 65  ry subsystem are
0830: 20 61 6c 6c 6f 77 65 64 2c 20 62 75 74 20 6e 6f   allowed, but no
0840: 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 73 20 77   new callbacks w
0850: 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 69 73 73 75  ill be.  ** issu
0860: 65 64 2e 20 20 54 68 65 20 61 6c 61 72 6d 42 75  ed.  The alarmBu
0870: 73 79 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  sy variable is s
0880: 65 74 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  et to prevent re
0890: 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 63 61 6c  cursive.  ** cal
08a0: 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73  lbacks..  */.  s
08b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6c 61  qlite3_int64 ala
08c0: 72 6d 54 68 72 65 73 68 6f 6c 64 3b 0a 20 20 76  rmThreshold;.  v
08d0: 6f 69 64 20 28 2a 61 6c 61 72 6d 43 61 6c 6c 62  oid (*alarmCallb
08e0: 61 63 6b 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69  ack)(void*, sqli
08f0: 74 65 33 5f 69 6e 74 36 34 2c 69 6e 74 29 3b 0a  te3_int64,int);.
0900: 20 20 76 6f 69 64 20 2a 61 6c 61 72 6d 41 72 67    void *alarmArg
0910: 3b 0a 20 20 69 6e 74 20 61 6c 61 72 6d 42 75 73  ;.  int alarmBus
0920: 79 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 6f  y;..  /*.  ** Po
0930: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 65 6e  inters to the en
0940: 64 20 6f 66 20 73 71 6c 69 74 65 33 47 6c 6f 62  d of sqlite3Glob
0950: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
0960: 68 20 61 6e 64 0a 20 20 2a 2a 20 73 71 6c 69 74  h and.  ** sqlit
0970: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
0980: 50 61 67 65 20 74 6f 20 61 20 62 6c 6f 63 6b 20  Page to a block 
0990: 6f 66 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 72  of memory that r
09a0: 65 63 6f 72 64 73 0a 20 20 2a 2a 20 77 68 69 63  ecords.  ** whic
09b0: 68 20 70 61 67 65 73 20 61 72 65 20 61 76 61 69  h pages are avai
09c0: 6c 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 75 33  lable..  */.  u3
09d0: 32 20 2a 61 53 63 72 61 74 63 68 46 72 65 65 3b  2 *aScratchFree;
09e0: 0a 20 20 75 33 32 20 2a 61 50 61 67 65 46 72 65  .  u32 *aPageFre
09f0: 65 3b 0a 0a 20 20 2f 2a 20 4e 75 6d 62 65 72 20  e;..  /* Number 
0a00: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 66 6f  of free pages fo
0a10: 72 20 73 63 72 61 74 63 68 20 61 6e 64 20 70 61  r scratch and pa
0a20: 67 65 2d 63 61 63 68 65 20 6d 65 6d 6f 72 79 20  ge-cache memory 
0a30: 2a 2f 0a 20 20 75 33 32 20 6e 53 63 72 61 74 63  */.  u32 nScratc
0a40: 68 46 72 65 65 3b 0a 20 20 75 33 32 20 6e 50 61  hFree;.  u32 nPa
0a50: 67 65 46 72 65 65 3b 0a 7d 20 6d 65 6d 30 3b 0a  geFree;.} mem0;.
0a60: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0a70: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
0a80: 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65  ocation subsyste
0a90: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
0aa0: 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 76 6f 69 64  3MallocInit(void
0ab0: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
0ac0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
0ad0: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20  Malloc==0 ){.   
0ae0: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
0af0: 66 61 75 6c 74 28 29 3b 0a 20 20 7d 0a 20 20 6d  fault();.  }.  m
0b00: 65 6d 73 65 74 28 26 6d 65 6d 30 2c 20 30 2c 20  emset(&mem0, 0, 
0b10: 73 69 7a 65 6f 66 28 6d 65 6d 30 29 29 3b 0a 20  sizeof(mem0));. 
0b20: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
0b30: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
0b40: 74 65 78 20 29 7b 0a 20 20 20 20 6d 65 6d 30 2e  tex ){.    mem0.
0b50: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
0b60: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
0b70: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
0b80: 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  M);.  }.  if( sq
0b90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0ba0: 67 2e 70 53 63 72 61 74 63 68 20 26 26 20 73 71  g.pScratch && sq
0bb0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0bc0: 67 2e 73 7a 53 63 72 61 74 63 68 3e 3d 31 30 30  g.szScratch>=100
0bd0: 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  .      && sqlite
0be0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53  3GlobalConfig.nS
0bf0: 63 72 61 74 63 68 3e 3d 30 20 29 7b 0a 20 20 20  cratch>=0 ){.   
0c00: 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69   int i;.    sqli
0c10: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0c20: 73 7a 53 63 72 61 74 63 68 20 2d 3d 20 34 3b 0a  szScratch -= 4;.
0c30: 20 20 20 20 6d 65 6d 30 2e 61 53 63 72 61 74 63      mem0.aScratc
0c40: 68 46 72 65 65 20 3d 20 28 75 33 32 2a 29 26 28  hFree = (u32*)&(
0c50: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 47 6c  (char*)sqlite3Gl
0c60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61  obalConfig.pScra
0c70: 74 63 68 29 0a 20 20 20 20 20 20 20 20 20 20 20  tch).           
0c80: 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33 47         [sqlite3G
0c90: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63  lobalConfig.szSc
0ca0: 72 61 74 63 68 2a 73 71 6c 69 74 65 33 47 6c 6f  ratch*sqlite3Glo
0cb0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74  balConfig.nScrat
0cc0: 63 68 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ch];.    for(i=0
0cd0: 3b 20 69 3c 73 71 6c 69 74 65 33 47 6c 6f 62 61  ; i<sqlite3Globa
0ce0: 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68  lConfig.nScratch
0cf0: 3b 20 69 2b 2b 29 7b 20 6d 65 6d 30 2e 61 53 63  ; i++){ mem0.aSc
0d00: 72 61 74 63 68 46 72 65 65 5b 69 5d 20 3d 20 69  ratchFree[i] = i
0d10: 3b 20 7d 0a 20 20 20 20 6d 65 6d 30 2e 6e 53 63  ; }.    mem0.nSc
0d20: 72 61 74 63 68 46 72 65 65 20 3d 20 73 71 6c 69  ratchFree = sqli
0d30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0d40: 6e 53 63 72 61 74 63 68 3b 0a 20 20 7d 65 6c 73  nScratch;.  }els
0d50: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  e{.    sqlite3Gl
0d60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61  obalConfig.pScra
0d70: 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  tch = 0;.    sql
0d80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0d90: 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 30 3b 0a  .szScratch = 0;.
0da0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
0db0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50  3GlobalConfig.pP
0dc0: 61 67 65 20 26 26 20 73 71 6c 69 74 65 33 47 6c  age && sqlite3Gl
0dd0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67  obalConfig.szPag
0de0: 65 3e 3d 35 31 32 0a 20 20 20 20 20 20 26 26 20  e>=512.      && 
0df0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0e00: 66 69 67 2e 6e 50 61 67 65 3e 3d 31 20 29 7b 0a  fig.nPage>=1 ){.
0e10: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
0e20: 6e 74 20 6f 76 65 72 68 65 61 64 3b 0a 20 20 20  nt overhead;.   
0e30: 20 69 6e 74 20 73 7a 20 3d 20 73 71 6c 69 74 65   int sz = sqlite
0e40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
0e50: 50 61 67 65 3b 0a 20 20 20 20 69 6e 74 20 6e 20  Page;.    int n 
0e60: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
0e70: 6f 6e 66 69 67 2e 6e 50 61 67 65 3b 0a 20 20 20  onfig.nPage;.   
0e80: 20 6f 76 65 72 68 65 61 64 20 3d 20 28 34 2a 6e   overhead = (4*n
0e90: 20 2b 20 73 7a 20 2d 20 31 29 2f 73 7a 3b 0a 20   + sz - 1)/sz;. 
0ea0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
0eb0: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 2d 3d 20  Config.nPage -= 
0ec0: 6f 76 65 72 68 65 61 64 3b 0a 20 20 20 20 6d 65  overhead;.    me
0ed0: 6d 30 2e 61 50 61 67 65 46 72 65 65 20 3d 20 28  m0.aPageFree = (
0ee0: 75 33 32 2a 29 26 28 28 63 68 61 72 2a 29 73 71  u32*)&((char*)sq
0ef0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0f00: 67 2e 70 50 61 67 65 29 0a 20 20 20 20 20 20 20  g.pPage).       
0f10: 20 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 69             [sqli
0f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0f30: 73 7a 50 61 67 65 2a 73 71 6c 69 74 65 33 47 6c  szPage*sqlite3Gl
0f40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
0f50: 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ];.    for(i=0; 
0f60: 69 3c 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  i<sqlite3GlobalC
0f70: 6f 6e 66 69 67 2e 6e 50 61 67 65 3b 20 69 2b 2b  onfig.nPage; i++
0f80: 29 7b 20 6d 65 6d 30 2e 61 50 61 67 65 46 72 65  ){ mem0.aPageFre
0f90: 65 5b 69 5d 20 3d 20 69 3b 20 7d 0a 20 20 20 20  e[i] = i; }.    
0fa0: 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65 20 3d  mem0.nPageFree =
0fb0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
0fc0: 6e 66 69 67 2e 6e 50 61 67 65 3b 0a 20 20 7d 65  nfig.nPage;.  }e
0fd0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
0fe0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
0ff0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ge = 0;.    sqli
1000: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1010: 73 7a 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  szPage = 0;.  }.
1020: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1030: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
1040: 49 6e 69 74 28 73 71 6c 69 74 65 33 47 6c 6f 62  Init(sqlite3Glob
1050: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 70 41 70 70 44  alConfig.m.pAppD
1060: 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ata);.}../*.** D
1070: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  einitialize the 
1080: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1090: 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a  n subsystem..*/.
10a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c  void sqlite3Mall
10b0: 6f 63 45 6e 64 28 76 6f 69 64 29 7b 0a 20 20 73  ocEnd(void){.  s
10c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
10d0: 69 67 2e 6d 2e 78 53 68 75 74 64 6f 77 6e 28 73  ig.m.xShutdown(s
10e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
10f0: 69 67 2e 6d 2e 70 41 70 70 44 61 74 61 29 3b 0a  ig.m.pAppData);.
1100: 20 20 6d 65 6d 73 65 74 28 26 6d 65 6d 30 2c 20    memset(&mem0, 
1110: 30 2c 20 73 69 7a 65 6f 66 28 6d 65 6d 30 29 29  0, sizeof(mem0))
1120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1130: 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
1140: 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79  memory currently
1150: 20 63 68 65 63 6b 65 64 20 6f 75 74 2e 0a 2a 2f   checked out..*/
1160: 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1170: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
1180: 65 64 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  ed(void){.  int 
1190: 6e 2c 20 6d 78 3b 0a 20 20 73 71 6c 69 74 65 33  n, mx;.  sqlite3
11a0: 5f 69 6e 74 36 34 20 72 65 73 3b 0a 20 20 73 71  _int64 res;.  sq
11b0: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
11c0: 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
11d0: 59 5f 55 53 45 44 2c 20 26 6e 2c 20 26 6d 78 2c  Y_USED, &n, &mx,
11e0: 20 30 29 3b 0a 20 20 72 65 73 20 3d 20 28 73 71   0);.  res = (sq
11f0: 6c 69 74 65 33 5f 69 6e 74 36 34 29 6e 3b 20 20  lite3_int64)n;  
1200: 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 62  /* Work around b
1210: 75 67 20 69 6e 20 42 6f 72 6c 61 6e 64 20 43 2e  ug in Borland C.
1220: 20 54 69 63 6b 65 74 20 23 33 32 31 36 20 2a 2f   Ticket #3216 */
1230: 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
1240: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1250: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
1260: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 74 68 61 74  t of memory that
1270: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 0a 2a   has ever been.*
1280: 2a 20 63 68 65 63 6b 65 64 20 6f 75 74 20 73 69  * checked out si
1290: 6e 63 65 20 65 69 74 68 65 72 20 74 68 65 20 62  nce either the b
12a0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
12b0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 6f 72 20 73   process.** or s
12c0: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
12d0: 63 65 6e 74 20 72 65 73 65 74 2e 0a 2a 2f 0a 73  cent reset..*/.s
12e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
12f0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68  ite3_memory_high
1300: 77 61 74 65 72 28 69 6e 74 20 72 65 73 65 74 46  water(int resetF
1310: 6c 61 67 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 6d  lag){.  int n, m
1320: 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  x;.  sqlite3_int
1330: 36 34 20 72 65 73 3b 0a 20 20 73 71 6c 69 74 65  64 res;.  sqlite
1340: 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f  3_status(SQLITE_
1350: 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53  STATUS_MEMORY_US
1360: 45 44 2c 20 26 6e 2c 20 26 6d 78 2c 20 72 65 73  ED, &n, &mx, res
1370: 65 74 46 6c 61 67 29 3b 0a 20 20 72 65 73 20 3d  etFlag);.  res =
1380: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1390: 6d 78 3b 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f  mx;  /* Work aro
13a0: 75 6e 64 20 62 75 67 20 69 6e 20 42 6f 72 6c 61  und bug in Borla
13b0: 6e 64 20 43 2e 20 54 69 63 6b 65 74 20 23 33 32  nd C. Ticket #32
13c0: 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  16 */.  return r
13d0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  es;.}../*.** Cha
13e0: 6e 67 65 20 74 68 65 20 61 6c 61 72 6d 20 63 61  nge the alarm ca
13f0: 6c 6c 62 61 63 6b 0a 2a 2f 0a 69 6e 74 20 73 71  llback.*/.int sq
1400: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 61 6c 61  lite3_memory_ala
1410: 72 6d 28 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c  rm(.  void(*xCal
1420: 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 70 41 72  lback)(void *pAr
1430: 67 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  g, sqlite3_int64
1440: 20 75 73 65 64 2c 69 6e 74 20 4e 29 2c 0a 20 20   used,int N),.  
1450: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 73 71  void *pArg,.  sq
1460: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 54 68 72  lite3_int64 iThr
1470: 65 73 68 6f 6c 64 0a 29 7b 0a 20 20 73 71 6c 69  eshold.){.  sqli
1480: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1490: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 6d  mem0.mutex);.  m
14a0: 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63  em0.alarmCallbac
14b0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
14c0: 20 6d 65 6d 30 2e 61 6c 61 72 6d 41 72 67 20 3d   mem0.alarmArg =
14d0: 20 70 41 72 67 3b 0a 20 20 6d 65 6d 30 2e 61 6c   pArg;.  mem0.al
14e0: 61 72 6d 54 68 72 65 73 68 6f 6c 64 20 3d 20 69  armThreshold = i
14f0: 54 68 72 65 73 68 6f 6c 64 3b 0a 20 20 73 71 6c  Threshold;.  sql
1500: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1510: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
1520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67  ;.}../*.** Trigg
1540: 65 72 20 74 68 65 20 61 6c 61 72 6d 20 0a 2a 2f  er the alarm .*/
1550: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1560: 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28  ite3MallocAlarm(
1570: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f  int nByte){.  vo
1580: 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  id (*xCallback)(
1590: 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 5f 69 6e  void*,sqlite3_in
15a0: 74 36 34 2c 69 6e 74 29 3b 0a 20 20 73 71 6c 69  t64,int);.  sqli
15b0: 74 65 33 5f 69 6e 74 36 34 20 6e 6f 77 55 73 65  te3_int64 nowUse
15c0: 64 3b 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 3b  d;.  void *pArg;
15d0: 0a 20 20 69 66 28 20 6d 65 6d 30 2e 61 6c 61 72  .  if( mem0.alar
15e0: 6d 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20  mCallback==0 || 
15f0: 6d 65 6d 30 2e 61 6c 61 72 6d 42 75 73 79 20 20  mem0.alarmBusy  
1600: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 30  ) return;.  mem0
1610: 2e 61 6c 61 72 6d 42 75 73 79 20 3d 20 31 3b 0a  .alarmBusy = 1;.
1620: 20 20 78 43 61 6c 6c 62 61 63 6b 20 3d 20 6d 65    xCallback = me
1630: 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b  m0.alarmCallback
1640: 3b 0a 20 20 6e 6f 77 55 73 65 64 20 3d 20 73 71  ;.  nowUsed = sq
1650: 6c 69 74 65 33 53 74 61 74 75 73 56 61 6c 75 65  lite3StatusValue
1660: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
1670: 45 4d 4f 52 59 5f 55 53 45 44 29 3b 0a 20 20 70  EMORY_USED);.  p
1680: 41 72 67 20 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d  Arg = mem0.alarm
1690: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
16a0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e  utex_leave(mem0.
16b0: 6d 75 74 65 78 29 3b 0a 20 20 78 43 61 6c 6c 62  mutex);.  xCallb
16c0: 61 63 6b 28 70 41 72 67 2c 20 6e 6f 77 55 73 65  ack(pArg, nowUse
16d0: 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 73 71 6c  d, nByte);.  sql
16e0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
16f0: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
1700: 6d 65 6d 30 2e 61 6c 61 72 6d 42 75 73 79 20 3d  mem0.alarmBusy =
1710: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20   0;.}../*.** Do 
1720: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
1730: 69 6f 6e 20 77 69 74 68 20 73 74 61 74 69 73 74  ion with statist
1740: 69 63 73 20 61 6e 64 20 61 6c 61 72 6d 73 2e 20  ics and alarms. 
1750: 20 41 73 73 75 6d 65 20 74 68 65 0a 2a 2a 20 6c   Assume the.** l
1760: 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
1770: 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eld..*/.static i
1780: 6e 74 20 6d 61 6c 6c 6f 63 57 69 74 68 41 6c 61  nt mallocWithAla
1790: 72 6d 28 69 6e 74 20 6e 2c 20 76 6f 69 64 20 2a  rm(int n, void *
17a0: 2a 70 70 29 7b 0a 20 20 69 6e 74 20 6e 46 75 6c  *pp){.  int nFul
17b0: 6c 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20  l;.  void *p;.  
17c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17d0: 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d 30 2e  mutex_held(mem0.
17e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 46 75 6c  mutex) );.  nFul
17f0: 6c 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  l = sqlite3Globa
1800: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 6f 75 6e 64  lConfig.m.xRound
1810: 75 70 28 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  up(n);.  sqlite3
1820: 53 74 61 74 75 73 53 65 74 28 53 51 4c 49 54 45  StatusSet(SQLITE
1830: 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53  _STATUS_MALLOC_S
1840: 49 5a 45 2c 20 6e 29 3b 0a 20 20 69 66 28 20 6d  IZE, n);.  if( m
1850: 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63  em0.alarmCallbac
1860: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  k!=0 ){.    int 
1870: 6e 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 53  nUsed = sqlite3S
1880: 74 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49 54  tatusValue(SQLIT
1890: 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
18a0: 55 53 45 44 29 3b 0a 20 20 20 20 69 66 28 20 6e  USED);.    if( n
18b0: 55 73 65 64 2b 6e 46 75 6c 6c 20 3e 3d 20 6d 65  Used+nFull >= me
18c0: 6d 30 2e 61 6c 61 72 6d 54 68 72 65 73 68 6f 6c  m0.alarmThreshol
18d0: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
18e0: 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 46  e3MallocAlarm(nF
18f0: 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ull);.    }.  }.
1900: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f    p = sqlite3Glo
1910: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c  balConfig.m.xMal
1920: 6c 6f 63 28 6e 46 75 6c 6c 29 3b 0a 20 20 69 66  loc(nFull);.  if
1930: 28 20 70 3d 3d 30 20 26 26 20 6d 65 6d 30 2e 61  ( p==0 && mem0.a
1940: 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  larmCallback ){.
1950: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f      sqlite3Mallo
1960: 63 41 6c 61 72 6d 28 6e 46 75 6c 6c 29 3b 0a 20  cAlarm(nFull);. 
1970: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 47 6c     p = sqlite3Gl
1980: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
1990: 6c 6c 6f 63 28 6e 46 75 6c 6c 29 3b 0a 20 20 7d  lloc(nFull);.  }
19a0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
19b0: 6e 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d  nFull = sqlite3M
19c0: 61 6c 6c 6f 63 53 69 7a 65 28 70 29 3b 0a 20 20  allocSize(p);.  
19d0: 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 41    sqlite3StatusA
19e0: 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  dd(SQLITE_STATUS
19f0: 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 6e 46  _MEMORY_USED, nF
1a00: 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 20  ull);.  }.  *pp 
1a10: 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 6e 46  = p;.  return nF
1a20: 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ull;.}../*.** Al
1a30: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 20 20  locate memory.  
1a40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1a50: 6c 69 6b 65 20 73 71 6c 69 74 65 33 5f 6d 61 6c  like sqlite3_mal
1a60: 6c 6f 63 28 29 20 65 78 63 65 70 74 20 74 68 61  loc() except tha
1a70: 74 20 69 74 0a 2a 2a 20 61 73 73 75 6d 65 73 20  t it.** assumes 
1a80: 74 68 65 20 6d 65 6d 6f 72 79 20 73 75 62 73 79  the memory subsy
1a90: 73 74 65 6d 20 68 61 73 20 61 6c 72 65 61 64 79  stem has already
1aa0: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
1ab0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29  te3Malloc(int n)
1ad0: 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 69  {.  void *p;.  i
1ae0: 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 70  f( n<=0 ){.    p
1af0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
1b00: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1b10: 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29  onfig.bMemstat )
1b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
1b30: 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d  tex_enter(mem0.m
1b40: 75 74 65 78 29 3b 0a 20 20 20 20 6d 61 6c 6c 6f  utex);.    mallo
1b50: 63 57 69 74 68 41 6c 61 72 6d 28 6e 2c 20 26 70  cWithAlarm(n, &p
1b60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
1b70: 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e  utex_leave(mem0.
1b80: 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b  mutex);.  }else{
1b90: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1ba0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
1bb0: 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d 0a 20  Malloc(n);.  }. 
1bc0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1bd0: 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
1be0: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   of the memory a
1bf0: 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 66 6f 72  llocation is for
1c00: 20 75 73 65 20 62 79 20 74 68 65 20 61 70 70 6c   use by the appl
1c10: 69 63 61 74 69 6f 6e 2e 0a 2a 2a 20 46 69 72 73  ication..** Firs
1c20: 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  t make sure the 
1c30: 6d 65 6d 6f 72 79 20 73 75 62 73 79 73 74 65 6d  memory subsystem
1c40: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c   is initialized,
1c50: 20 74 68 65 6e 20 64 6f 20 74 68 65 0a 2a 2a 20   then do the.** 
1c60: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  allocation..*/.v
1c70: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 6d 61 6c  oid *sqlite3_mal
1c80: 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 23 69 66 6e  loc(int n){.#ifn
1c90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ca0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73  AUTOINIT.  if( s
1cb0: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1cc0: 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  e() ) return 0;.
1cd0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1ce0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 29  sqlite3Malloc(n)
1cf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ;.}../*.** Each 
1d00: 74 68 72 65 61 64 20 6d 61 79 20 6f 6e 6c 79 20  thread may only 
1d10: 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 75  have a single ou
1d20: 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61  tstanding alloca
1d30: 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 78 53 63  tion from.** xSc
1d40: 72 61 74 63 68 4d 61 6c 6c 6f 63 28 29 2e 20 20  ratchMalloc().  
1d50: 57 65 20 76 65 72 69 66 79 20 74 68 69 73 20 63  We verify this c
1d60: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
1d70: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
1d80: 0a 2a 2a 20 63 61 73 65 20 62 79 20 73 65 74 74  .** case by sett
1d90: 69 6e 67 20 73 63 72 61 74 63 68 41 6c 6c 6f 63  ing scratchAlloc
1da0: 4f 75 74 20 74 6f 20 31 20 77 68 65 6e 20 61 6e  Out to 1 when an
1db0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 69   allocation.** i
1dc0: 73 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 6c  s outstanding cl
1dd0: 65 61 72 69 6e 67 20 69 74 20 77 68 65 6e 20 74  earing it when t
1de0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
1df0: 20 66 72 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53   freed..*/.#if S
1e00: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
1e10: 3d 3d 30 20 26 26 20 21 64 65 66 69 6e 65 64 28  ==0 && !defined(
1e20: 4e 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 69  NDEBUG).static i
1e30: 6e 74 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f  nt scratchAllocO
1e40: 75 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ut = 0;.#endif..
1e50: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1e60: 6d 65 6d 6f 72 79 20 74 68 61 74 20 69 73 20 74  memory that is t
1e70: 6f 20 62 65 20 75 73 65 64 20 61 6e 64 20 72 65  o be used and re
1e80: 6c 65 61 73 65 64 20 72 69 67 68 74 20 61 77 61  leased right awa
1e90: 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  y..** This routi
1ea0: 6e 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ne is similar to
1eb0: 20 61 6c 6c 6f 63 61 28 29 20 69 6e 20 74 68 61   alloca() in tha
1ec0: 74 20 69 74 20 69 73 20 6e 6f 74 20 69 6e 74 65  t it is not inte
1ed0: 6e 64 65 64 0a 2a 2a 20 66 6f 72 20 73 69 74 75  nded.** for situ
1ee0: 61 74 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  ations where the
1ef0: 20 6d 65 6d 6f 72 79 20 6d 69 67 68 74 20 62 65   memory might be
1f00: 20 68 65 6c 64 20 6c 6f 6e 67 2d 74 65 72 6d 2e   held long-term.
1f10: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
1f20: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
1f30: 20 67 65 74 20 6d 65 6d 6f 72 79 20 74 6f 20 6f   get memory to o
1f40: 6c 64 20 6c 61 72 67 65 20 74 72 61 6e 73 69 65  ld large transie
1f50: 6e 74 20 64 61 74 61 0a 2a 2a 20 73 74 72 75 63  nt data.** struc
1f60: 74 75 72 65 73 20 74 68 61 74 20 77 6f 75 6c 64  tures that would
1f70: 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 66 69   not normally fi
1f80: 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 6f  t on the stack o
1f90: 66 20 61 6e 0a 2a 2a 20 65 6d 62 65 64 64 65 64  f an.** embedded
1fa0: 20 70 72 6f 63 65 73 73 6f 72 2e 0a 2a 2f 0a 76   processor..*/.v
1fb0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 53 63 72 61  oid *sqlite3Scra
1fc0: 74 63 68 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29  tchMalloc(int n)
1fd0: 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 61  {.  void *p;.  a
1fe0: 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 0a 23  ssert( n>0 );..#
1ff0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2000: 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65 66 69  SAFE==0 && !defi
2010: 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20 2f 2a  ned(NDEBUG).  /*
2020: 20 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20   Verify that no 
2030: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73 63  more than one sc
2040: 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  ratch allocation
2050: 20 70 65 72 20 74 68 72 65 61 64 0a 20 20 2a 2a   per thread.  **
2060: 20 69 73 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   is outstanding 
2070: 61 74 20 6f 6e 65 20 74 69 6d 65 2e 20 20 28 54  at one time.  (T
2080: 68 69 73 20 69 73 20 6f 6e 6c 79 20 63 68 65 63  his is only chec
2090: 6b 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ked in the.  ** 
20a0: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
20b0: 63 61 73 65 20 73 69 6e 63 65 20 63 68 65 63 6b  case since check
20c0: 69 6e 67 20 69 6e 20 74 68 65 20 6d 75 6c 74 69  ing in the multi
20d0: 2d 74 68 72 65 61 64 65 64 20 63 61 73 65 0a 20  -threaded case. 
20e0: 20 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 75 63   ** would be muc
20f0: 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74  h more complicat
2100: 65 64 2e 29 20 2a 2f 0a 20 20 61 73 73 65 72 74  ed.) */.  assert
2110: 28 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75  ( scratchAllocOu
2120: 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  t==0 );.#endif..
2130: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2140: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
2150: 74 63 68 3c 6e 20 29 7b 0a 20 20 20 20 67 6f 74  tch<n ){.    got
2160: 6f 20 73 63 72 61 74 63 68 5f 6f 76 65 72 66 6c  o scratch_overfl
2170: 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
2180: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2190: 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65  _enter(mem0.mute
21a0: 78 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 30  x);.    if( mem0
21b0: 2e 6e 53 63 72 61 74 63 68 46 72 65 65 3d 3d 30  .nScratchFree==0
21c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
21e0: 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  m0.mutex);.     
21f0: 20 67 6f 74 6f 20 73 63 72 61 74 63 68 5f 6f 76   goto scratch_ov
2200: 65 72 66 6c 6f 77 3b 0a 20 20 20 20 7d 65 6c 73  erflow;.    }els
2210: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
2220: 20 20 20 20 20 20 69 20 3d 20 6d 65 6d 30 2e 61        i = mem0.a
2230: 53 63 72 61 74 63 68 46 72 65 65 5b 2d 2d 6d 65  ScratchFree[--me
2240: 6d 30 2e 6e 53 63 72 61 74 63 68 46 72 65 65 5d  m0.nScratchFree]
2250: 3b 0a 20 20 20 20 20 20 69 20 2a 3d 20 73 71 6c  ;.      i *= sql
2260: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2270: 2e 73 7a 53 63 72 61 74 63 68 3b 0a 20 20 20 20  .szScratch;.    
2280: 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 41    sqlite3StatusA
2290: 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  dd(SQLITE_STATUS
22a0: 5f 53 43 52 41 54 43 48 5f 55 53 45 44 2c 20 31  _SCRATCH_USED, 1
22b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22c0: 53 74 61 74 75 73 53 65 74 28 53 51 4c 49 54 45  StatusSet(SQLITE
22d0: 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f  _STATUS_SCRATCH_
22e0: 53 49 5a 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  SIZE, n);.      
22f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2300: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
2310: 0a 20 20 20 20 20 20 70 20 3d 20 28 76 6f 69 64  .      p = (void
2320: 2a 29 26 28 28 63 68 61 72 2a 29 73 71 6c 69 74  *)&((char*)sqlit
2330: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2340: 53 63 72 61 74 63 68 29 5b 69 5d 3b 0a 20 20 20  Scratch)[i];.   
2350: 20 7d 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54   }.  }.#if SQLIT
2360: 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 20  E_THREADSAFE==0 
2370: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  && !defined(NDEB
2380: 55 47 29 0a 20 20 73 63 72 61 74 63 68 41 6c 6c  UG).  scratchAll
2390: 6f 63 4f 75 74 20 3d 20 70 21 3d 30 3b 0a 23 65  ocOut = p!=0;.#e
23a0: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70  ndif..  return p
23b0: 3b 0a 0a 73 63 72 61 74 63 68 5f 6f 76 65 72 66  ;..scratch_overf
23c0: 6c 6f 77 3a 0a 20 20 69 66 28 20 73 71 6c 69 74  low:.  if( sqlit
23d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
23e0: 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 73  Memstat ){.    s
23f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2400: 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a  er(mem0.mutex);.
2410: 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75      sqlite3Statu
2420: 73 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54  sSet(SQLITE_STAT
2430: 55 53 5f 53 43 52 41 54 43 48 5f 53 49 5a 45 2c  US_SCRATCH_SIZE,
2440: 20 6e 29 3b 0a 20 20 20 20 6e 20 3d 20 6d 61 6c   n);.    n = mal
2450: 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28 6e 2c 20  locWithAlarm(n, 
2460: 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  &p);.    if( p )
2470: 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 41 64   sqlite3StatusAd
2480: 64 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  d(SQLITE_STATUS_
2490: 53 43 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57  SCRATCH_OVERFLOW
24a0: 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
24b0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
24c0: 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c  m0.mutex);.  }el
24d0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  se{.    p = sqli
24e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24f0: 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20  m.xMalloc(n);.  
2500: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
2510: 45 41 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64  EADSAFE==0 && !d
2520: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20  efined(NDEBUG). 
2530: 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74   scratchAllocOut
2540: 20 3d 20 70 21 3d 30 3b 0a 23 65 6e 64 69 66 0a   = p!=0;.#endif.
2550: 20 20 72 65 74 75 72 6e 20 70 3b 20 20 20 20 0a    return p;    .
2560: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 63  }.void sqlite3Sc
2570: 72 61 74 63 68 46 72 65 65 28 76 6f 69 64 20 2a  ratchFree(void *
2580: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 0a  p){.  if( p ){..
2590: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
25a0: 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65 66  DSAFE==0 && !def
25b0: 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20 20  ined(NDEBUG).   
25c0: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
25d0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
25e0: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
25f0: 69 6f 6e 20 70 65 72 20 74 68 72 65 61 64 0a 20  ion per thread. 
2600: 20 20 20 2a 2a 20 69 73 20 6f 75 74 73 74 61 6e     ** is outstan
2610: 64 69 6e 67 20 61 74 20 6f 6e 65 20 74 69 6d 65  ding at one time
2620: 2e 20 20 28 54 68 69 73 20 69 73 20 6f 6e 6c 79  .  (This is only
2630: 20 63 68 65 63 6b 65 64 20 69 6e 20 74 68 65 0a   checked in the.
2640: 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 2d 74 68      ** single-th
2650: 72 65 61 64 65 64 20 63 61 73 65 20 73 69 6e 63  readed case sinc
2660: 65 20 63 68 65 63 6b 69 6e 67 20 69 6e 20 74 68  e checking in th
2670: 65 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64  e multi-threaded
2680: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 77 6f 75   case.    ** wou
2690: 6c 64 20 62 65 20 6d 75 63 68 20 6d 6f 72 65 20  ld be much more 
26a0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 29 20 2a 2f  complicated.) */
26b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 63 72  .    assert( scr
26c0: 61 74 63 68 41 6c 6c 6f 63 4f 75 74 3d 3d 31 20  atchAllocOut==1 
26d0: 29 3b 0a 20 20 20 20 73 63 72 61 74 63 68 41 6c  );.    scratchAl
26e0: 6c 6f 63 4f 75 74 20 3d 20 30 3b 0a 23 65 6e 64  locOut = 0;.#end
26f0: 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  if..    if( sqli
2700: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2710: 70 53 63 72 61 74 63 68 3d 3d 30 0a 20 20 20 20  pScratch==0.    
2720: 20 20 20 20 20 20 20 7c 7c 20 70 3c 73 71 6c 69         || p<sqli
2730: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2740: 70 53 63 72 61 74 63 68 0a 20 20 20 20 20 20 20  pScratch.       
2750: 20 20 20 20 7c 7c 20 70 3e 3d 28 76 6f 69 64 2a      || p>=(void*
2760: 29 6d 65 6d 30 2e 61 53 63 72 61 74 63 68 46 72  )mem0.aScratchFr
2770: 65 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ee ){.      if( 
2780: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2790: 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a  fig.bMemstat ){.
27a0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 69 7a          int iSiz
27b0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
27c0: 63 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  cSize(p);.      
27d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
27e0: 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78  enter(mem0.mutex
27f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2800: 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49  e3StatusAdd(SQLI
2810: 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43  TE_STATUS_SCRATC
2820: 48 5f 4f 56 45 52 46 4c 4f 57 2c 20 2d 69 53 69  H_OVERFLOW, -iSi
2830: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ze);.        sql
2840: 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51  ite3StatusAdd(SQ
2850: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f  LITE_STATUS_MEMO
2860: 52 59 5f 55 53 45 44 2c 20 2d 69 53 69 7a 65 29  RY_USED, -iSize)
2870: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2880: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
2890: 78 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  xFree(p);.      
28a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
28b0: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
28c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
28e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46  lobalConfig.m.xF
28f0: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ree(p);.      }.
2900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2910: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 20   int i;.      i 
2920: 3d 20 28 75 38 20 2a 29 70 20 2d 20 28 75 38 20  = (u8 *)p - (u8 
2930: 2a 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  *)sqlite3GlobalC
2940: 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 3b 0a  onfig.pScratch;.
2950: 20 20 20 20 20 20 69 20 2f 3d 20 73 71 6c 69 74        i /= sqlit
2960: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
2970: 7a 53 63 72 61 74 63 68 3b 0a 20 20 20 20 20 20  zScratch;.      
2980: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
2990: 69 3c 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  i<sqlite3GlobalC
29a0: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 29  onfig.nScratch )
29b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30  mutex_enter(mem0
29d0: 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61  .mutex);.      a
29e0: 73 73 65 72 74 28 20 6d 65 6d 30 2e 6e 53 63 72  ssert( mem0.nScr
29f0: 61 74 63 68 46 72 65 65 3c 73 71 6c 69 74 65 33  atchFree<sqlite3
2a00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
2a10: 72 61 74 63 68 20 29 3b 0a 20 20 20 20 20 20 6d  ratch );.      m
2a20: 65 6d 30 2e 61 53 63 72 61 74 63 68 46 72 65 65  em0.aScratchFree
2a30: 5b 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46 72  [mem0.nScratchFr
2a40: 65 65 2b 2b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ee++] = i;.     
2a50: 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 41 64   sqlite3StatusAd
2a60: 64 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  d(SQLITE_STATUS_
2a70: 53 43 52 41 54 43 48 5f 55 53 45 44 2c 20 2d 31  SCRATCH_USED, -1
2a80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a90: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
2aa0: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  0.mutex);.    }.
2ab0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
2ac0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 74 6f 20  ocate memory to 
2ad0: 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  be used by the p
2ae0: 61 67 65 20 63 61 63 68 65 2e 20 20 4d 61 6b 65  age cache.  Make
2af0: 20 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6d   use of the.** m
2b00: 65 6d 6f 72 79 20 62 75 66 66 65 72 20 70 72 6f  emory buffer pro
2b10: 76 69 64 65 64 20 62 79 20 53 51 4c 49 54 45 5f  vided by SQLITE_
2b20: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
2b30: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
2b40: 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 6d 65 6d  .** and that mem
2b50: 6f 72 79 20 69 73 20 6f 66 20 74 68 65 20 72 69  ory is of the ri
2b60: 67 68 74 20 73 69 7a 65 20 61 6e 64 20 69 73 20  ght size and is 
2b70: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a  not completely.*
2b80: 2a 20 63 6f 6e 73 75 6d 65 64 2e 20 20 4f 74 68  * consumed.  Oth
2b90: 65 72 77 69 73 65 2c 20 66 61 69 6c 6f 76 65 72  erwise, failover
2ba0: 20 74 6f 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   to sqlite3Mallo
2bb0: 63 28 29 2e 0a 2a 2f 0a 23 69 66 20 30 0a 76 6f  c()..*/.#if 0.vo
2bc0: 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 4d  id *sqlite3PageM
2bd0: 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20  alloc(int n){.  
2be0: 76 6f 69 64 20 2a 70 3b 0a 20 20 61 73 73 65 72  void *p;.  asser
2bf0: 74 28 20 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65  t( n>0 );.  asse
2c00: 72 74 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d  rt( (n & (n-1))=
2c10: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c20: 6e 3e 3d 35 31 32 20 26 26 20 6e 3c 3d 33 32 37  n>=512 && n<=327
2c30: 36 38 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  68 );..  if( sql
2c40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c50: 2e 73 7a 50 61 67 65 3c 6e 20 29 7b 0a 20 20 20  .szPage<n ){.   
2c60: 20 67 6f 74 6f 20 70 61 67 65 5f 6f 76 65 72 66   goto page_overf
2c70: 6c 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  low;.  }else{  .
2c80: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2c90: 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74  x_enter(mem0.mut
2ca0: 65 78 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ex);.    if( mem
2cb0: 30 2e 6e 50 61 67 65 46 72 65 65 3d 3d 30 20 29  0.nPageFree==0 )
2cc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2cd0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30  mutex_leave(mem0
2ce0: 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 67  .mutex);.      g
2cf0: 6f 74 6f 20 70 61 67 65 5f 6f 76 65 72 66 6c 6f  oto page_overflo
2d00: 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  w;.    }else{.  
2d10: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2d20: 20 69 20 3d 20 6d 65 6d 30 2e 61 50 61 67 65 46   i = mem0.aPageF
2d30: 72 65 65 5b 2d 2d 6d 65 6d 30 2e 6e 50 61 67 65  ree[--mem0.nPage
2d40: 46 72 65 65 5d 3b 0a 20 20 20 20 20 20 73 71 6c  Free];.      sql
2d50: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2d60: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
2d70: 20 20 20 20 69 20 2a 3d 20 73 71 6c 69 74 65 33      i *= sqlite3
2d80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50  GlobalConfig.szP
2d90: 61 67 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  age;.      sqlit
2da0: 65 33 53 74 61 74 75 73 53 65 74 28 53 51 4c 49  e3StatusSet(SQLI
2db0: 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
2dc0: 43 48 45 5f 53 49 5a 45 2c 20 6e 29 3b 0a 20 20  CHE_SIZE, n);.  
2dd0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75      sqlite3Statu
2de0: 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54  sAdd(SQLITE_STAT
2df0: 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55 53 45  US_PAGECACHE_USE
2e00: 44 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 20 3d  D, 1);.      p =
2e10: 20 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a   (void*)&((char*
2e20: 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  )sqlite3GlobalCo
2e30: 6e 66 69 67 2e 70 50 61 67 65 29 5b 69 5d 3b 0a  nfig.pPage)[i];.
2e40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2e50: 72 6e 20 70 3b 0a 0a 70 61 67 65 5f 6f 76 65 72  rn p;..page_over
2e60: 66 6c 6f 77 3a 0a 20 20 69 66 28 20 73 71 6c 69  flow:.  if( sqli
2e70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2e80: 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20  bMemstat ){.    
2e90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2ea0: 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ter(mem0.mutex);
2eb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74  .    sqlite3Stat
2ec0: 75 73 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41  usSet(SQLITE_STA
2ed0: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49  TUS_PAGECACHE_SI
2ee0: 5a 45 2c 20 6e 29 3b 0a 20 20 20 20 6e 20 3d 20  ZE, n);.    n = 
2ef0: 6d 61 6c 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28  mallocWithAlarm(
2f00: 6e 2c 20 26 70 29 3b 0a 20 20 20 20 69 66 28 20  n, &p);.    if( 
2f10: 70 20 29 20 73 71 6c 69 74 65 33 53 74 61 74 75  p ) sqlite3Statu
2f20: 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54  sAdd(SQLITE_STAT
2f30: 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45  US_PAGECACHE_OVE
2f40: 52 46 4c 4f 57 2c 20 6e 29 3b 0a 20 20 20 20 73  RFLOW, n);.    s
2f50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2f60: 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a  ve(mem0.mutex);.
2f70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
2f80: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f90: 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e  nfig.m.xMalloc(n
2fa0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2fb0: 70 3b 20 20 20 20 0a 7d 0a 76 6f 69 64 20 73 71  p;    .}.void sq
2fc0: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 76 6f  lite3PageFree(vo
2fd0: 69 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  id *p){.  if( p 
2fe0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
2ff0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3000: 50 61 67 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  Page==0.        
3010: 20 20 20 7c 7c 20 70 3c 73 71 6c 69 74 65 33 47     || p<sqlite3G
3020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
3030: 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  e.           || 
3040: 70 3e 3d 28 76 6f 69 64 2a 29 6d 65 6d 30 2e 61  p>=(void*)mem0.a
3050: 50 61 67 65 46 72 65 65 20 29 7b 0a 20 20 20 20  PageFree ){.    
3060: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
3070: 65 2c 20 74 68 65 20 70 61 67 65 20 61 6c 6c 6f  e, the page allo
3080: 63 61 74 69 6f 6e 20 77 61 73 20 6f 62 74 61 69  cation was obtai
3090: 6e 65 64 20 66 72 6f 6d 20 61 20 72 65 67 75 6c  ned from a regul
30a0: 61 72 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ar .      ** cal
30b0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d 65 6d  l to sqlite3_mem
30c0: 5f 6d 65 74 68 6f 64 73 2e 78 4d 61 6c 6c 6f 63  _methods.xMalloc
30d0: 28 29 20 28 61 20 70 61 67 65 2d 63 61 63 68 65  () (a page-cache
30e0: 2d 6d 65 6d 6f 72 79 20 0a 20 20 20 20 20 20 2a  -memory .      *
30f0: 2a 20 22 6f 76 65 72 66 6c 6f 77 22 29 2e 20 46  * "overflow"). F
3100: 72 65 65 20 74 68 65 20 62 6c 6f 63 6b 20 77 69  ree the block wi
3110: 74 68 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  th sqlite3_mem_m
3120: 65 74 68 6f 64 73 2e 78 46 72 65 65 28 29 2e 0a  ethods.xFree()..
3130: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
3140: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3150: 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20  Config.bMemstat 
3160: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
3170: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  Size = sqlite3Ma
3180: 6c 6c 6f 63 53 69 7a 65 28 70 29 3b 0a 20 20 20  llocSize(p);.   
3190: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
31a0: 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75  ex_enter(mem0.mu
31b0: 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tex);.        sq
31c0: 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53  lite3StatusAdd(S
31d0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
31e0: 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c  ECACHE_OVERFLOW,
31f0: 20 2d 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20   -iSize);.      
3200: 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 41    sqlite3StatusA
3210: 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  dd(SQLITE_STATUS
3220: 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 2d 69  _MEMORY_USED, -i
3230: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 73  Size);.        s
3240: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3250: 69 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b 0a 20  ig.m.xFree(p);. 
3260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
3270: 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e  utex_leave(mem0.
3280: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 7d 65  mutex);.      }e
3290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
32a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
32b0: 2e 6d 2e 78 46 72 65 65 28 70 29 3b 0a 20 20 20  .m.xFree(p);.   
32c0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
32d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
32e0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73  e allocation was
32f0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20   allocated from 
3300: 74 68 65 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  the sqlite3Globa
3310: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 0a 20 20  lConfig.pPage.  
3320: 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49      ** buffer. I
3330: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
3340: 74 68 61 74 20 69 73 20 61 64 64 20 74 68 65 20  that is add the 
3350: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 70 61 67  index of the pag
3360: 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  e in.      ** th
3370: 65 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e sqlite3GlobalC
3380: 6f 6e 66 69 67 2e 70 50 61 67 65 20 61 72 72 61  onfig.pPage arra
3390: 79 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  y to the set of 
33a0: 66 72 65 65 20 69 6e 64 65 78 65 73 20 73 74 6f  free indexes sto
33b0: 72 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  red.      ** in 
33c0: 74 68 65 20 6d 65 6d 30 2e 61 50 61 67 65 46 72  the mem0.aPageFr
33d0: 65 65 5b 5d 20 61 72 72 61 79 2e 0a 20 20 20 20  ee[] array..    
33e0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69    */.      int i
33f0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 28 75 38 20  ;.      i = (u8 
3400: 2a 29 70 20 2d 20 28 75 38 20 2a 29 73 71 6c 69  *)p - (u8 *)sqli
3410: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3420: 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 20 2f  pPage;.      i /
3430: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3440: 6f 6e 66 69 67 2e 73 7a 50 61 67 65 3b 0a 20 20  onfig.szPage;.  
3450: 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30      assert( i>=0
3460: 20 26 26 20 69 3c 73 71 6c 69 74 65 33 47 6c 6f   && i<sqlite3Glo
3470: 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20  balConfig.nPage 
3480: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3490: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d  _mutex_enter(mem
34a0: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  0.mutex);.      
34b0: 61 73 73 65 72 74 28 20 6d 65 6d 30 2e 6e 50 61  assert( mem0.nPa
34c0: 67 65 46 72 65 65 3c 73 71 6c 69 74 65 33 47 6c  geFree<sqlite3Gl
34d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
34e0: 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 30 2e 61   );.      mem0.a
34f0: 50 61 67 65 46 72 65 65 5b 6d 65 6d 30 2e 6e 50  PageFree[mem0.nP
3500: 61 67 65 46 72 65 65 2b 2b 5d 20 3d 20 69 3b 0a  ageFree++] = i;.
3510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61        sqlite3Sta
3520: 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54  tusAdd(SQLITE_ST
3530: 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55  ATUS_PAGECACHE_U
3540: 53 45 44 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  SED, -1);.      
3550: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
3560: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
3570: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
3580: 45 42 55 47 29 20 26 26 20 30 0a 20 20 20 20 20  EBUG) && 0.     
3590: 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
35a0: 61 20 64 75 70 6c 69 63 61 74 65 20 77 61 73 20  a duplicate was 
35b0: 6e 6f 74 20 6a 75 73 74 20 69 6e 73 65 72 74 65  not just inserte
35c0: 64 20 69 6e 74 6f 20 61 50 61 67 65 46 72 65 65  d into aPageFree
35d0: 5b 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  []. */.      for
35e0: 28 69 3d 30 3b 20 69 3c 6d 65 6d 30 2e 6e 50 61  (i=0; i<mem0.nPa
35f0: 67 65 46 72 65 65 2d 31 3b 20 69 2b 2b 29 7b 0a  geFree-1; i++){.
3600: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3610: 6d 65 6d 30 2e 61 50 61 67 65 46 72 65 65 5b 69  mem0.aPageFree[i
3620: 5d 21 3d 6d 65 6d 30 2e 61 50 61 67 65 46 72 65  ]!=mem0.aPageFre
3630: 65 5b 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65  e[mem0.nPageFree
3640: 2d 31 5d 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  -1] );.      }.#
3650: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
3660: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3670: 54 52 55 45 20 69 66 20 70 20 69 73 20 61 20 6c  TRUE if p is a l
3680: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
3690: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 72 6f 6d 20  allocation from 
36a0: 64 62 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  db.*/.static int
36b0: 20 69 73 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c   isLookaside(sql
36c0: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
36d0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 20  p){.  return db 
36e0: 26 26 20 70 20 26 26 20 70 3e 3d 64 62 2d 3e 6c  && p && p>=db->l
36f0: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
3700: 26 26 20 70 3c 64 62 2d 3e 6c 6f 6f 6b 61 73 69  && p<db->lookasi
3710: 64 65 2e 70 45 6e 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  de.pEnd;.}../*.*
3720: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
3730: 65 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  e of a memory al
3740: 6c 6f 63 61 74 69 6f 6e 20 70 72 65 76 69 6f 75  location previou
3750: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  sly obtained fro
3760: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c  m.** sqlite3Mall
3770: 6f 63 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  oc() or sqlite3_
3780: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 69 6e 74  malloc()..*/.int
3790: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69   sqlite3MallocSi
37a0: 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 72  ze(void *p){.  r
37b0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 6c 6f  eturn sqlite3Glo
37c0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53 69 7a  balConfig.m.xSiz
37d0: 65 28 70 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  e(p);.}.int sqli
37e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
37f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
3800: 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 69 73 4c  d *p){.  if( isL
3810: 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 29 20  ookaside(db, p) 
3820: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 64 62  ){.    return db
3830: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 3b 0a  ->lookaside.sz;.
3840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
3850: 75 72 6e 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  urn sqlite3Globa
3860: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53 69 7a 65 28  lConfig.m.xSize(
3870: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3880: 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 70 72 65   Free memory pre
3890: 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64  viously obtained
38a0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4d 61 6c   from sqlite3Mal
38b0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  loc()..*/.void s
38c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 76 6f 69 64  qlite3_free(void
38d0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
38e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
38f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3900: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b  nfig.bMemstat ){
3910: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
3920: 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75  ex_enter(mem0.mu
3930: 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tex);.    sqlite
3940: 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54  3StatusAdd(SQLIT
3950: 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
3960: 55 53 45 44 2c 20 2d 73 71 6c 69 74 65 33 4d 61  USED, -sqlite3Ma
3970: 6c 6c 6f 63 53 69 7a 65 28 70 29 29 3b 0a 20 20  llocSize(p));.  
3980: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3990: 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29  onfig.m.xFree(p)
39a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
39b0: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d  tex_leave(mem0.m
39c0: 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  utex);.  }else{.
39d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
39e0: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28  lConfig.m.xFree(
39f0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3a00: 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 74 68 61   Free memory tha
3a10: 74 20 6d 69 67 68 74 20 62 65 20 61 73 73 6f 63  t might be assoc
3a20: 69 61 74 65 64 20 77 69 74 68 20 61 20 70 61 72  iated with a par
3a30: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
3a40: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
3a50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3a60: 62 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  bFree(sqlite3 *d
3a70: 62 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 69  b, void *p){.  i
3a80: 66 28 20 69 73 4c 6f 6f 6b 61 73 69 64 65 28 64  f( isLookaside(d
3a90: 62 2c 20 70 29 20 29 7b 0a 20 20 20 20 4c 6f 6f  b, p) ){.    Loo
3aa0: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 42 75 66  kasideSlot *pBuf
3ab0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
3ac0: 74 2a 29 70 3b 0a 20 20 20 20 70 42 75 66 2d 3e  t*)p;.    pBuf->
3ad0: 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  pNext = db->look
3ae0: 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20  aside.pFree;.   
3af0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
3b00: 46 72 65 65 20 3d 20 70 42 75 66 3b 0a 20 20 20  Free = pBuf;.   
3b10: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
3b20: 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
3b30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3b40: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3b50: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
3b60: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
3b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
3b80: 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  on.*/.void *sqli
3b90: 74 65 33 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20  te3Realloc(void 
3ba0: 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e 42 79 74 65  *pOld, int nByte
3bb0: 73 29 7b 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20  s){.  int nOld, 
3bc0: 6e 4e 65 77 3b 0a 20 20 76 6f 69 64 20 2a 70 4e  nNew;.  void *pN
3bd0: 65 77 3b 0a 20 20 69 66 28 20 70 4f 6c 64 3d 3d  ew;.  if( pOld==
3be0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3bf0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 42  sqlite3Malloc(nB
3c00: 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ytes);.  }.  if(
3c10: 20 6e 42 79 74 65 73 3c 3d 30 20 29 7b 0a 20 20   nBytes<=0 ){.  
3c20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3c30: 4f 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Old);.    return
3c40: 20 30 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d   0;.  }.  nOld =
3c50: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69   sqlite3MallocSi
3c60: 7a 65 28 70 4f 6c 64 29 3b 0a 20 20 69 66 28 20  ze(pOld);.  if( 
3c70: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3c80: 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a  fig.bMemstat ){.
3c90: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
3ca0: 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74  x_enter(mem0.mut
3cb0: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
3cc0: 53 74 61 74 75 73 53 65 74 28 53 51 4c 49 54 45  StatusSet(SQLITE
3cd0: 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53  _STATUS_MALLOC_S
3ce0: 49 5a 45 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20  IZE, nBytes);.  
3cf0: 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    nNew = sqlite3
3d00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3d10: 52 6f 75 6e 64 75 70 28 6e 42 79 74 65 73 29 3b  Roundup(nBytes);
3d20: 0a 20 20 20 20 69 66 28 20 6e 4f 6c 64 3d 3d 6e  .    if( nOld==n
3d30: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
3d40: 77 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 7d 65  w = pOld;.    }e
3d50: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73  lse{.      if( s
3d60: 71 6c 69 74 65 33 53 74 61 74 75 73 56 61 6c 75  qlite3StatusValu
3d70: 65 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  e(SQLITE_STATUS_
3d80: 4d 45 4d 4f 52 59 5f 55 53 45 44 29 2b 6e 4e 65  MEMORY_USED)+nNe
3d90: 77 2d 6e 4f 6c 64 20 3e 3d 20 0a 20 20 20 20 20  w-nOld >= .     
3da0: 20 20 20 20 20 20 20 6d 65 6d 30 2e 61 6c 61 72         mem0.alar
3db0: 6d 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20  mThreshold ){.  
3dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c        sqlite3Mal
3dd0: 6c 6f 63 41 6c 61 72 6d 28 6e 4e 65 77 2d 6e 4f  locAlarm(nNew-nO
3de0: 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ld);.      }.   
3df0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
3e00: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
3e10: 78 52 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e  xRealloc(pOld, n
3e20: 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
3e30: 70 4e 65 77 3d 3d 30 20 26 26 20 6d 65 6d 30 2e  pNew==0 && mem0.
3e40: 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20 29 7b  alarmCallback ){
3e50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3e60: 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 42 79 74  MallocAlarm(nByt
3e70: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  es);.        pNe
3e80: 77 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  w = sqlite3Globa
3e90: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c 6c  lConfig.m.xReall
3ea0: 6f 63 28 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b 0a  oc(pOld, nNew);.
3eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3ec0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
3ed0: 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    nNew = sqlite3
3ee0: 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4e 65 77 29  MallocSize(pNew)
3ef0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3f00: 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54  3StatusAdd(SQLIT
3f10: 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
3f20: 55 53 45 44 2c 20 6e 4e 65 77 2d 6e 4f 6c 64 29  USED, nNew-nOld)
3f30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
3f50: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
3f60: 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ex);.  }else{.  
3f70: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
3f80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3f90: 52 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 42  Realloc(pOld, nB
3fa0: 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ytes);.  }.  ret
3fb0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
3fc0: 2a 2a 20 54 68 65 20 70 75 62 6c 69 63 20 69 6e  ** The public in
3fd0: 74 65 72 66 61 63 65 20 74 6f 20 73 71 6c 69 74  terface to sqlit
3fe0: 65 33 52 65 61 6c 6c 6f 63 2e 20 20 4d 61 6b 65  e3Realloc.  Make
3ff0: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6d   sure that the m
4000: 65 6d 6f 72 79 0a 2a 2a 20 73 75 62 73 79 73 74  emory.** subsyst
4010: 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  em is initialize
4020: 64 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  d prior to invok
4030: 69 6e 67 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  ing sqliteReallo
4040: 63 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  c..*/.void *sqli
4050: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 76 6f 69 64  te3_realloc(void
4060: 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e 29 7b 0a   *pOld, int n){.
4070: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4080: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
4090: 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  f( sqlite3_initi
40a0: 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e  alize() ) return
40b0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
40c0: 75 72 6e 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  urn sqlite3Reall
40d0: 6f 63 28 70 4f 6c 64 2c 20 6e 29 3b 0a 7d 0a 0a  oc(pOld, n);.}..
40e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
40f0: 61 6e 64 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e  and zero memory.
4100: 0a 2a 2f 20 0a 76 6f 69 64 20 2a 73 71 6c 69 74  .*/ .void *sqlit
4110: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74  e3MallocZero(int
4120: 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 20 3d   n){.  void *p =
4130: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
4140: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
4150: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e    memset(p, 0, n
4160: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4170: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  p;.}../*.** Allo
4180: 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 6d 65  cate and zero me
4190: 6d 6f 72 79 2e 20 20 49 66 20 74 68 65 20 61 6c  mory.  If the al
41a0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
41b0: 6d 61 6b 65 0a 2a 2a 20 74 68 65 20 6d 61 6c 6c  make.** the mall
41c0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 69 6e  ocFailed flag in
41d0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
41e0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  pointer..*/.void
41f0: 20 2a 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   *sqlite3DbMallo
4200: 63 5a 65 72 6f 28 73 71 6c 69 74 65 33 20 2a 64  cZero(sqlite3 *d
4210: 62 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69  b, int n){.  voi
4220: 64 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  d *p = sqlite3Db
4230: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 29  MallocRaw(db, n)
4240: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
4250: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 29   memset(p, 0, n)
4260: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4270: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
4280: 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 6d 65 6d  ate and zero mem
4290: 6f 72 79 2e 20 20 49 66 20 74 68 65 20 61 6c 6c  ory.  If the all
42a0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 6d  ocation fails, m
42b0: 61 6b 65 0a 2a 2a 20 74 68 65 20 6d 61 6c 6c 6f  ake.** the mallo
42c0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 69 6e 20  cFailed flag in 
42d0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
42e0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  ointer..*/.void 
42f0: 2a 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  *sqlite3DbMalloc
4300: 52 61 77 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Raw(sqlite3 *db,
4310: 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20   int n){.  void 
4320: 2a 70 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  *p;.  if( db ){.
4330: 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f      LookasideSlo
4340: 74 20 2a 70 42 75 66 3b 0a 20 20 20 20 69 66 28  t *pBuf;.    if(
4350: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4360: 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
4370: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
4380: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4390: 2e 62 45 6e 61 62 6c 65 64 20 26 26 20 6e 3c 3d  .bEnabled && n<=
43a0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
43b0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 42  .         && (pB
43c0: 75 66 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  uf = db->lookasi
43d0: 64 65 2e 70 46 72 65 65 29 21 3d 30 20 29 7b 0a  de.pFree)!=0 ){.
43e0: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
43f0: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 42 75 66  ide.pFree = pBuf
4400: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 64  ->pNext;.      d
4410: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
4420: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t++;.      if( d
4430: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
4440: 74 3e 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  t>db->lookaside.
4450: 6d 78 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  mxOut ){.       
4460: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6d   db->lookaside.m
4470: 78 4f 75 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  xOut = db->looka
4480: 73 69 64 65 2e 6e 4f 75 74 3b 0a 20 20 20 20 20  side.nOut;.     
4490: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
44a0: 28 76 6f 69 64 2a 29 70 42 75 66 3b 0a 20 20 20  (void*)pBuf;.   
44b0: 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c   }.  }.  p = sql
44c0: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20  ite3Malloc(n);. 
44d0: 20 69 66 28 20 21 70 20 26 26 20 64 62 20 29 7b   if( !p && db ){
44e0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
44f0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  ailed = 1;.  }. 
4500: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
4510: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 62  .** Resize the b
4520: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 70  lock of memory p
4530: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 20 74  ointed to by p t
4540: 6f 20 6e 20 62 79 74 65 73 2e 20 49 66 20 74 68  o n bytes. If th
4550: 65 0a 2a 2a 20 72 65 73 69 7a 65 20 66 61 69 6c  e.** resize fail
4560: 73 2c 20 73 65 74 20 74 68 65 20 6d 61 6c 6c 6f  s, set the mallo
4570: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 69 6e 20  cFailed flag in 
4580: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
4590: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  bject..*/.void *
45a0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
45b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
45c0: 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  id *p, int n){. 
45d0: 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b   void *pNew = 0;
45e0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
45f0: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
4600: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
4610: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
4620: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
4630: 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
4640: 69 66 28 20 69 73 4c 6f 6f 6b 61 73 69 64 65 28  if( isLookaside(
4650: 64 62 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  db, p) ){.      
4660: 69 66 28 20 6e 3c 3d 64 62 2d 3e 6c 6f 6f 6b 61  if( n<=db->looka
4670: 73 69 64 65 2e 73 7a 20 29 7b 0a 20 20 20 20 20  side.sz ){.     
4680: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
4690: 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 20     }.      pNew 
46a0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
46b0: 63 52 61 77 28 64 62 2c 20 6e 29 3b 0a 20 20 20  cRaw(db, n);.   
46c0: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
46d0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
46e0: 65 77 2c 20 70 2c 20 64 62 2d 3e 6c 6f 6f 6b 61  ew, p, db->looka
46f0: 73 69 64 65 2e 73 7a 29 3b 0a 20 20 20 20 20 20  side.sz);.      
4700: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4710: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a  db, p);.      }.
4720: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4730: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
4740: 72 65 61 6c 6c 6f 63 28 70 2c 20 6e 29 3b 0a 20  realloc(p, n);. 
4750: 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
4760: 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61  {.        db->ma
4770: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
4780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4790: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
47a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
47b0: 74 20 74 6f 20 72 65 61 6c 6c 6f 63 61 74 65 20  t to reallocate 
47c0: 70 2e 20 20 49 66 20 74 68 65 20 72 65 61 6c 6c  p.  If the reall
47d0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
47e0: 68 65 6e 20 66 72 65 65 20 70 0a 2a 2a 20 61 6e  hen free p.** an
47f0: 64 20 73 65 74 20 74 68 65 20 6d 61 6c 6c 6f 63  d set the malloc
4800: 46 61 69 6c 65 64 20 66 6c 61 67 20 69 6e 20 74  Failed flag in t
4810: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
4820: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
4830: 2a 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f  *sqlite3DbReallo
4840: 63 4f 72 46 72 65 65 28 73 71 6c 69 74 65 33 20  cOrFree(sqlite3 
4850: 2a 64 62 2c 20 76 6f 69 64 20 2a 70 2c 20 69 6e  *db, void *p, in
4860: 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4e  t n){.  void *pN
4870: 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  ew;.  pNew = sql
4880: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
4890: 2c 20 70 2c 20 6e 29 3b 0a 20 20 69 66 28 20 21  , p, n);.  if( !
48a0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69  pNew ){.    sqli
48b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
48c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
48d0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  New;.}../*.** Ma
48e0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 61 20 73  ke a copy of a s
48f0: 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20  tring in memory 
4900: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4910: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54 68  liteMalloc(). Th
4920: 65 73 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ese .** function
4930: 73 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4d 61  s call sqlite3Ma
4940: 6c 6c 6f 63 52 61 77 28 29 20 64 69 72 65 63 74  llocRaw() direct
4950: 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71  ly instead of sq
4960: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54 68  liteMalloc(). Th
4970: 69 73 0a 2a 2a 20 69 73 20 62 65 63 61 75 73 65  is.** is because
4980: 20 77 68 65 6e 20 6d 65 6d 6f 72 79 20 64 65 62   when memory deb
4990: 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65 64  ugging is turned
49a0: 20 6f 6e 2c 20 74 68 65 73 65 20 74 77 6f 20 66   on, these two f
49b0: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a  unctions are .**
49c0: 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72   called via macr
49d0: 6f 73 20 74 68 61 74 20 72 65 63 6f 72 64 20 74  os that record t
49e0: 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20  he current file 
49f0: 61 6e 64 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  and line number 
4a00: 69 6e 20 74 68 65 0a 2a 2a 20 54 68 72 65 61 64  in the.** Thread
4a10: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 0a  Data structure..
4a20: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
4a30: 44 62 53 74 72 44 75 70 28 73 71 6c 69 74 65 33  DbStrDup(sqlite3
4a40: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
4a50: 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e   *z){.  char *zN
4a60: 65 77 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a  ew;.  size_t n;.
4a70: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
4a80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4a90: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 2b    n = strlen(z)+
4aa0: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 26  1;.  assert( (n&
4ab0: 30 78 37 66 66 66 66 66 66 66 29 3d 3d 6e 20 29  0x7fffffff)==n )
4ac0: 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  zNew = sqlit
4ad0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
4ae0: 2c 20 28 69 6e 74 29 6e 29 3b 0a 20 20 69 66 28  , (int)n);.  if(
4af0: 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   zNew ){.    mem
4b00: 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b  cpy(zNew, z, n);
4b10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
4b20: 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c 69  ew;.}.char *sqli
4b30: 74 65 33 44 62 53 74 72 4e 44 75 70 28 73 71 6c  te3DbStrNDup(sql
4b40: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
4b50: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
4b60: 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20  .  char *zNew;. 
4b70: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
4b80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4b90: 20 61 73 73 65 72 74 28 20 28 6e 26 30 78 37 66   assert( (n&0x7f
4ba0: 66 66 66 66 66 66 29 3d 3d 6e 20 29 3b 0a 20 20  ffffff)==n );.  
4bb0: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  zNew = sqlite3Db
4bc0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 2b  MallocRaw(db, n+
4bd0: 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29  1);.  if( zNew )
4be0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65  {.    memcpy(zNe
4bf0: 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 4e  w, z, n);.    zN
4c00: 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ew[n] = 0;.  }. 
4c10: 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a   return zNew;.}.
4c20: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
4c30: 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  string from the 
4c40: 7a 46 72 6f 6d 61 74 20 61 72 67 75 6d 65 6e 74  zFromat argument
4c50: 20 61 6e 64 20 74 68 65 20 76 61 5f 6c 69 73 74   and the va_list
4c60: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 2a   that follows..*
4c70: 2a 20 53 74 6f 72 65 20 74 68 65 20 73 74 72 69  * Store the stri
4c80: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
4c90: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4ca0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 61  eMalloc() and ma
4cb0: 6b 65 20 2a 70 7a 0a 2a 2a 20 70 6f 69 6e 74 20  ke *pz.** point 
4cc0: 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a  to that string..
4cd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
4ce0: 65 74 53 74 72 69 6e 67 28 63 68 61 72 20 2a 2a  etString(char **
4cf0: 70 7a 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  pz, sqlite3 *db,
4d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
4d10: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
4d20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
4d30: 20 2a 7a 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74   *z;..  va_start
4d40: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
4d50: 20 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72   z = sqlite3VMPr
4d60: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
4d70: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
4d80: 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ap);.  sqlite3Db
4d90: 46 72 65 65 28 64 62 2c 20 2a 70 7a 29 3b 0a 20  Free(db, *pz);. 
4da0: 20 2a 70 7a 20 3d 20 7a 3b 0a 7d 0a 0a 0a 2f 2a   *pz = z;.}.../*
4db0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4dc0: 6e 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  n must be called
4dd0: 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
4de0: 61 6e 79 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  any API function
4df0: 20 28 69 2e 65 2e 20 0a 2a 2a 20 72 65 74 75 72   (i.e. .** retur
4e00: 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  ning control to 
4e10: 74 68 65 20 75 73 65 72 29 20 74 68 61 74 20 68  the user) that h
4e20: 61 73 20 63 61 6c 6c 65 64 20 73 71 6c 69 74 65  as called sqlite
4e30: 33 5f 6d 61 6c 6c 6f 63 20 6f 72 0a 2a 2a 20 73  3_malloc or.** s
4e40: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 2e 0a  qlite3_realloc..
4e50: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
4e60: 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 72 6d  ed value is norm
4e70: 61 6c 6c 79 20 61 20 63 6f 70 79 20 6f 66 20 74  ally a copy of t
4e80: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4e90: 6e 74 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75  nt to this.** fu
4ea0: 6e 63 74 69 6f 6e 2e 20 48 6f 77 65 76 65 72 2c  nction. However,
4eb0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
4ec0: 61 69 6c 75 72 65 20 68 61 73 20 6f 63 63 75 72  ailure has occur
4ed0: 65 64 20 73 69 6e 63 65 20 74 68 65 20 70 72 65  ed since the pre
4ee0: 76 69 6f 75 73 0a 2a 2a 20 69 6e 76 6f 63 61 74  vious.** invocat
4ef0: 69 6f 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ion SQLITE_NOMEM
4f00: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
4f10: 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tead. .**.** If 
4f20: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
4f30: 6e 74 2c 20 64 62 2c 20 69 73 20 6e 6f 74 20 4e  nt, db, is not N
4f40: 55 4c 4c 20 61 6e 64 20 61 20 6d 61 6c 6c 6f 63  ULL and a malloc
4f50: 28 29 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  () error has occ
4f60: 75 72 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ured,.** then th
4f70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 72 72  e connection err
4f80: 6f 72 2d 63 6f 64 65 20 28 74 68 65 20 76 61 6c  or-code (the val
4f90: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
4fa0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
4fb0: 29 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  ).** is set to S
4fc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
4fd0: 69 6e 74 20 73 71 6c 69 74 65 33 41 70 69 45 78  int sqlite3ApiEx
4fe0: 69 74 28 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  it(sqlite3* db, 
4ff0: 69 6e 74 20 72 63 29 7b 0a 20 20 2f 2a 20 49 66  int rc){.  /* If
5000: 20 74 68 65 20 64 62 20 68 61 6e 64 6c 65 20 69   the db handle i
5010: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
5020: 20 77 65 20 6d 75 73 74 20 68 6f 6c 64 20 74 68   we must hold th
5030: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
5040: 64 6c 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 68  dle.  ** mutex h
5050: 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ere. Otherwise t
5060: 68 65 20 72 65 61 64 20 28 61 6e 64 20 70 6f 73  he read (and pos
5070: 73 69 62 6c 65 20 77 72 69 74 65 29 20 6f 66 20  sible write) of 
5080: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5090: 20 0a 20 20 2a 2a 20 69 73 20 75 6e 73 61 66 65   .  ** is unsafe
50a0: 2c 20 61 73 20 69 73 20 74 68 65 20 63 61 6c 6c  , as is the call
50b0: 20 74 6f 20 73 71 6c 69 74 65 33 45 72 72 6f 72   to sqlite3Error
50c0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
50d0: 74 28 20 21 64 62 20 7c 7c 20 73 71 6c 69 74 65  t( !db || sqlite
50e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
50f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
5100: 20 64 62 20 26 26 20 64 62 2d 3e 6d 61 6c 6c 6f   db && db->mallo
5110: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
5120: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
5130: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 30 29  SQLITE_NOMEM, 0)
5140: 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
5150: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
5160: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5170: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
5180: 72 63 20 26 20 28 64 62 20 3f 20 64 62 2d 3e 65  rc & (db ? db->e
5190: 72 72 4d 61 73 6b 20 3a 20 30 78 66 66 29 3b 0a  rrMask : 0xff);.
51a0: 7d 0a                                            }.