/ Hex Artifact Content
Login

Artifact fb23bfbcc5c93180b787bd746c7387289028d482:


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 39 20 32 30 30 38  oc.c,v 1.39 2008
01d0: 2f 30 39 2f 30 32 20 31 30 3a 32 32 3a 30 31 20  /09/02 10:22:01 
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 53 51 4c  m..*/.static SQL
0740: 49 54 45 5f 57 53 44 20 73 74 72 75 63 74 20 4d  ITE_WSD struct M
0750: 65 6d 30 47 6c 6f 62 61 6c 20 7b 0a 20 20 73 71  em0Global {.  sq
0760: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
0770: 65 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ex;         /* M
0780: 75 74 65 78 20 74 6f 20 73 65 72 69 61 6c 69 7a  utex to serializ
0790: 65 20 61 63 63 65 73 73 20 2a 2f 0a 0a 20 20 2f  e access */..  /
07a0: 2a 0a 20 20 2a 2a 20 54 68 65 20 61 6c 61 72 6d  *.  ** The alarm
07b0: 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 69 74   callback and it
07c0: 73 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  s arguments.  Th
07d0: 65 20 6d 65 6d 30 2e 6d 75 74 65 78 20 6c 6f 63  e mem0.mutex loc
07e0: 6b 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 68  k will.  ** be h
07f0: 65 6c 64 20 77 68 69 6c 65 20 74 68 65 20 63 61  eld while the ca
0800: 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e  llback is runnin
0810: 67 2e 20 20 52 65 63 75 72 73 69 76 65 20 63 61  g.  Recursive ca
0820: 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  lls into.  ** th
0830: 65 20 6d 65 6d 6f 72 79 20 73 75 62 73 79 73 74  e memory subsyst
0840: 65 6d 20 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20  em are allowed, 
0850: 62 75 74 20 6e 6f 20 6e 65 77 20 63 61 6c 6c 62  but no new callb
0860: 61 63 6b 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a  acks will be.  *
0870: 2a 20 69 73 73 75 65 64 2e 20 20 54 68 65 20 61  * issued.  The a
0880: 6c 61 72 6d 42 75 73 79 20 76 61 72 69 61 62 6c  larmBusy variabl
0890: 65 20 69 73 20 73 65 74 20 74 6f 20 70 72 65 76  e is set to prev
08a0: 65 6e 74 20 72 65 63 75 72 73 69 76 65 0a 20 20  ent recursive.  
08b0: 2a 2a 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  ** callbacks..  
08c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
08d0: 36 34 20 61 6c 61 72 6d 54 68 72 65 73 68 6f 6c  64 alarmThreshol
08e0: 64 3b 0a 20 20 76 6f 69 64 20 28 2a 61 6c 61 72  d;.  void (*alar
08f0: 6d 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  mCallback)(void*
0900: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c  , sqlite3_int64,
0910: 69 6e 74 29 3b 0a 20 20 76 6f 69 64 20 2a 61 6c  int);.  void *al
0920: 61 72 6d 41 72 67 3b 0a 20 20 69 6e 74 20 61 6c  armArg;.  int al
0930: 61 72 6d 42 75 73 79 3b 0a 0a 20 20 2f 2a 0a 20  armBusy;..  /*. 
0940: 20 2a 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   ** Pointers to 
0950: 74 68 65 20 65 6e 64 20 6f 66 20 73 71 6c 69 74  the end of sqlit
0960: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
0970: 53 63 72 61 74 63 68 20 61 6e 64 0a 20 20 2a 2a  Scratch and.  **
0980: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
0990: 6e 66 69 67 2e 70 50 61 67 65 20 74 6f 20 61 20  nfig.pPage to a 
09a0: 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
09b0: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 20 20 2a  that records.  *
09c0: 2a 20 77 68 69 63 68 20 70 61 67 65 73 20 61 72  * which pages ar
09d0: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 2a  e available..  *
09e0: 2f 0a 20 20 75 33 32 20 2a 61 53 63 72 61 74 63  /.  u32 *aScratc
09f0: 68 46 72 65 65 3b 0a 20 20 75 33 32 20 2a 61 50  hFree;.  u32 *aP
0a00: 61 67 65 46 72 65 65 3b 0a 0a 20 20 2f 2a 20 4e  ageFree;..  /* N
0a10: 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
0a20: 67 65 73 20 66 6f 72 20 73 63 72 61 74 63 68 20  ges for scratch 
0a30: 61 6e 64 20 70 61 67 65 2d 63 61 63 68 65 20 6d  and page-cache m
0a40: 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 33 32 20 6e  emory */.  u32 n
0a50: 53 63 72 61 74 63 68 46 72 65 65 3b 0a 20 20 75  ScratchFree;.  u
0a60: 33 32 20 6e 50 61 67 65 46 72 65 65 3b 0a 7d 20  32 nPageFree;.} 
0a70: 6d 65 6d 30 20 3d 20 7b 7d 3b 0a 0a 23 64 65 66  mem0 = {};..#def
0a80: 69 6e 65 20 6d 65 6d 30 20 47 4c 4f 42 41 4c 28  ine mem0 GLOBAL(
0a90: 73 74 72 75 63 74 20 4d 65 6d 30 47 6c 6f 62 61  struct Mem0Globa
0aa0: 6c 2c 20 6d 65 6d 30 29 0a 0a 2f 2a 0a 2a 2a 20  l, mem0)../*.** 
0ab0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  Initialize the m
0ac0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0ad0: 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a 69   subsystem..*/.i
0ae0: 6e 74 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  nt sqlite3Malloc
0af0: 49 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 66  Init(void){.  if
0b00: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
0b10: 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d  onfig.m.xMalloc=
0b20: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0b30: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
0b40: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
0b50: 6d 65 6d 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28  mem0, 0, sizeof(
0b60: 6d 65 6d 30 29 29 3b 0a 20 20 69 66 28 20 73 71  mem0));.  if( sq
0b70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0b80: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
0b90: 20 20 20 20 6d 65 6d 30 2e 6d 75 74 65 78 20 3d      mem0.mutex =
0ba0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
0bb0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
0bc0: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 0a 20 20 7d  STATIC_MEM);.  }
0bd0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
0be0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61  obalConfig.pScra
0bf0: 74 63 68 20 26 26 20 73 71 6c 69 74 65 33 47 6c  tch && sqlite3Gl
0c00: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72  obalConfig.szScr
0c10: 61 74 63 68 3e 3d 31 30 30 0a 20 20 20 20 20 20  atch>=100.      
0c20: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
0c30: 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 3e  Config.nScratch>
0c40: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
0c50: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
0c60: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  alConfig.szScrat
0c70: 63 68 20 2d 3d 20 34 3b 0a 20 20 20 20 6d 65 6d  ch -= 4;.    mem
0c80: 30 2e 61 53 63 72 61 74 63 68 46 72 65 65 20 3d  0.aScratchFree =
0c90: 20 28 75 33 32 2a 29 26 28 28 63 68 61 72 2a 29   (u32*)&((char*)
0ca0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0cb0: 66 69 67 2e 70 53 63 72 61 74 63 68 29 0a 20 20  fig.pScratch).  
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 5b 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  [sqlite3GlobalCo
0ce0: 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 2a 73  nfig.szScratch*s
0cf0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
0d00: 69 67 2e 6e 53 63 72 61 74 63 68 5d 3b 0a 20 20  ig.nScratch];.  
0d10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c    for(i=0; i<sql
0d20: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0d30: 2e 6e 53 63 72 61 74 63 68 3b 20 69 2b 2b 29 7b  .nScratch; i++){
0d40: 20 6d 65 6d 30 2e 61 53 63 72 61 74 63 68 46 72   mem0.aScratchFr
0d50: 65 65 5b 69 5d 20 3d 20 69 3b 20 7d 0a 20 20 20  ee[i] = i; }.   
0d60: 20 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46 72   mem0.nScratchFr
0d70: 65 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ee = sqlite3Glob
0d80: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
0d90: 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
0da0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0db0: 66 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20 30  fig.pScratch = 0
0dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
0dd0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
0de0: 74 63 68 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  tch = 0;.  }.  i
0df0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
0e00: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 26 26 20  Config.pPage && 
0e10: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0e20: 66 69 67 2e 73 7a 50 61 67 65 3e 3d 35 31 32 0a  fig.szPage>=512.
0e30: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
0e40: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
0e50: 67 65 3e 3d 31 20 29 7b 0a 20 20 20 20 69 6e 74  ge>=1 ){.    int
0e60: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6f 76 65 72   i;.    int over
0e70: 68 65 61 64 3b 0a 20 20 20 20 69 6e 74 20 73 7a  head;.    int sz
0e80: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
0e90: 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 3b 0a 20  Config.szPage;. 
0ea0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
0eb0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
0ec0: 50 61 67 65 3b 0a 20 20 20 20 6f 76 65 72 68 65  Page;.    overhe
0ed0: 61 64 20 3d 20 28 34 2a 6e 20 2b 20 73 7a 20 2d  ad = (4*n + sz -
0ee0: 20 31 29 2f 73 7a 3b 0a 20 20 20 20 73 71 6c 69   1)/sz;.    sqli
0ef0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0f00: 6e 50 61 67 65 20 2d 3d 20 6f 76 65 72 68 65 61  nPage -= overhea
0f10: 64 3b 0a 20 20 20 20 6d 65 6d 30 2e 61 50 61 67  d;.    mem0.aPag
0f20: 65 46 72 65 65 20 3d 20 28 75 33 32 2a 29 26 28  eFree = (u32*)&(
0f30: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 47 6c  (char*)sqlite3Gl
0f40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
0f50: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0f60: 20 20 20 20 5b 73 71 6c 69 74 65 33 47 6c 6f 62      [sqlite3Glob
0f70: 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2a  alConfig.szPage*
0f80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0f90: 66 69 67 2e 6e 50 61 67 65 5d 3b 0a 20 20 20 20  fig.nPage];.    
0fa0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c 69 74  for(i=0; i<sqlit
0fb0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
0fc0: 50 61 67 65 3b 20 69 2b 2b 29 7b 20 6d 65 6d 30  Page; i++){ mem0
0fd0: 2e 61 50 61 67 65 46 72 65 65 5b 69 5d 20 3d 20  .aPageFree[i] = 
0fe0: 69 3b 20 7d 0a 20 20 20 20 6d 65 6d 30 2e 6e 50  i; }.    mem0.nP
0ff0: 61 67 65 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ageFree = sqlite
1000: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
1010: 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1020: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1030: 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 30 3b  onfig.pPage = 0;
1040: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1050: 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20  alConfig.szPage 
1060: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1070: 6e 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  n sqlite3GlobalC
1080: 6f 6e 66 69 67 2e 6d 2e 78 49 6e 69 74 28 73 71  onfig.m.xInit(sq
1090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
10a0: 67 2e 6d 2e 70 41 70 70 44 61 74 61 29 3b 0a 7d  g.m.pAppData);.}
10b0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61  ../*.** Deinitia
10c0: 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
10d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79  allocation subsy
10e0: 73 74 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  stem..*/.void sq
10f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 76  lite3MallocEnd(v
1100: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 47  oid){.  sqlite3G
1110: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53  lobalConfig.m.xS
1120: 68 75 74 64 6f 77 6e 28 73 71 6c 69 74 65 33 47  hutdown(sqlite3G
1130: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 70 41  lobalConfig.m.pA
1140: 70 70 44 61 74 61 29 3b 0a 20 20 6d 65 6d 73 65  ppData);.  memse
1150: 74 28 26 6d 65 6d 30 2c 20 30 2c 20 73 69 7a 65  t(&mem0, 0, size
1160: 6f 66 28 6d 65 6d 30 29 29 3b 0a 7d 0a 0a 2f 2a  of(mem0));.}../*
1170: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
1180: 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
1190: 63 75 72 72 65 6e 74 6c 79 20 63 68 65 63 6b 65  currently checke
11a0: 64 20 6f 75 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65  d out..*/.sqlite
11b0: 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
11c0: 6d 65 6d 6f 72 79 5f 75 73 65 64 28 76 6f 69 64  memory_used(void
11d0: 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 6d 78 3b 0a  ){.  int n, mx;.
11e0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
11f0: 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  res;.  sqlite3_s
1200: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
1210: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c  TUS_MEMORY_USED,
1220: 20 26 6e 2c 20 26 6d 78 2c 20 30 29 3b 0a 20 20   &n, &mx, 0);.  
1230: 72 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  res = (sqlite3_i
1240: 6e 74 36 34 29 6e 3b 20 20 2f 2a 20 57 6f 72 6b  nt64)n;  /* Work
1250: 20 61 72 6f 75 6e 64 20 62 75 67 20 69 6e 20 42   around bug in B
1260: 6f 72 6c 61 6e 64 20 43 2e 20 54 69 63 6b 65 74  orland C. Ticket
1270: 20 23 33 32 31 36 20 2a 2f 0a 20 20 72 65 74 75   #3216 */.  retu
1280: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
1290: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
12a0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  mum amount of me
12b0: 6d 6f 72 79 20 74 68 61 74 20 68 61 73 20 65 76  mory that has ev
12c0: 65 72 20 62 65 65 6e 0a 2a 2a 20 63 68 65 63 6b  er been.** check
12d0: 65 64 20 6f 75 74 20 73 69 6e 63 65 20 65 69 74  ed out since eit
12e0: 68 65 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  her the beginnin
12f0: 67 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 73  g of this proces
1300: 73 0a 2a 2a 20 6f 72 20 73 69 6e 63 65 20 74 68  s.** or since th
1310: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 72 65  e most recent re
1320: 73 65 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  set..*/.sqlite3_
1330: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6d 65  int64 sqlite3_me
1340: 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 28 69  mory_highwater(i
1350: 6e 74 20 72 65 73 65 74 46 6c 61 67 29 7b 0a 20  nt resetFlag){. 
1360: 20 69 6e 74 20 6e 2c 20 6d 78 3b 0a 20 20 73 71   int n, mx;.  sq
1370: 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 65 73 3b  lite3_int64 res;
1380: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75  .  sqlite3_statu
1390: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
13a0: 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 6e 2c  MEMORY_USED, &n,
13b0: 20 26 6d 78 2c 20 72 65 73 65 74 46 6c 61 67 29   &mx, resetFlag)
13c0: 3b 0a 20 20 72 65 73 20 3d 20 28 73 71 6c 69 74  ;.  res = (sqlit
13d0: 65 33 5f 69 6e 74 36 34 29 6d 78 3b 20 20 2f 2a  e3_int64)mx;  /*
13e0: 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   Work around bug
13f0: 20 69 6e 20 42 6f 72 6c 61 6e 64 20 43 2e 20 54   in Borland C. T
1400: 69 63 6b 65 74 20 23 33 32 31 36 20 2a 2f 0a 20  icket #3216 */. 
1410: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1420: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1430: 20 61 6c 61 72 6d 20 63 61 6c 6c 62 61 63 6b 0a   alarm callback.
1440: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  */.int sqlite3_m
1450: 65 6d 6f 72 79 5f 61 6c 61 72 6d 28 0a 20 20 76  emory_alarm(.  v
1460: 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  oid(*xCallback)(
1470: 76 6f 69 64 20 2a 70 41 72 67 2c 20 73 71 6c 69  void *pArg, sqli
1480: 74 65 33 5f 69 6e 74 36 34 20 75 73 65 64 2c 69  te3_int64 used,i
1490: 6e 74 20 4e 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt N),.  void *p
14a0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  Arg,.  sqlite3_i
14b0: 6e 74 36 34 20 69 54 68 72 65 73 68 6f 6c 64 0a  nt64 iThreshold.
14c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
14d0: 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75  ex_enter(mem0.mu
14e0: 74 65 78 29 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61  tex);.  mem0.ala
14f0: 72 6d 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  rmCallback = xCa
1500: 6c 6c 62 61 63 6b 3b 0a 20 20 6d 65 6d 30 2e 61  llback;.  mem0.a
1510: 6c 61 72 6d 41 72 67 20 3d 20 70 41 72 67 3b 0a  larmArg = pArg;.
1520: 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 54 68 72 65    mem0.alarmThre
1530: 73 68 6f 6c 64 20 3d 20 69 54 68 72 65 73 68 6f  shold = iThresho
1540: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
1550: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d  tex_leave(mem0.m
1560: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1570: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1580: 0a 2a 2a 20 54 72 69 67 67 65 72 20 74 68 65 20  .** Trigger the 
1590: 61 6c 61 72 6d 20 0a 2a 2f 0a 73 74 61 74 69 63  alarm .*/.static
15a0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 6c   void sqlite3Mal
15b0: 6c 6f 63 41 6c 61 72 6d 28 69 6e 74 20 6e 42 79  locAlarm(int nBy
15c0: 74 65 29 7b 0a 20 20 76 6f 69 64 20 28 2a 78 43  te){.  void (*xC
15d0: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 73  allback)(void*,s
15e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 69 6e 74  qlite3_int64,int
15f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  );.  sqlite3_int
1600: 36 34 20 6e 6f 77 55 73 65 64 3b 0a 20 20 76 6f  64 nowUsed;.  vo
1610: 69 64 20 2a 70 41 72 67 3b 0a 20 20 69 66 28 20  id *pArg;.  if( 
1620: 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61  mem0.alarmCallba
1630: 63 6b 3d 3d 30 20 7c 7c 20 6d 65 6d 30 2e 61 6c  ck==0 || mem0.al
1640: 61 72 6d 42 75 73 79 20 20 29 20 72 65 74 75 72  armBusy  ) retur
1650: 6e 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 42  n;.  mem0.alarmB
1660: 75 73 79 20 3d 20 31 3b 0a 20 20 78 43 61 6c 6c  usy = 1;.  xCall
1670: 62 61 63 6b 20 3d 20 6d 65 6d 30 2e 61 6c 61 72  back = mem0.alar
1680: 6d 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 6e 6f 77  mCallback;.  now
1690: 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 53 74  Used = sqlite3St
16a0: 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49 54 45  atusValue(SQLITE
16b0: 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
16c0: 53 45 44 29 3b 0a 20 20 70 41 72 67 20 3d 20 6d  SED);.  pArg = m
16d0: 65 6d 30 2e 61 6c 61 72 6d 41 72 67 3b 0a 20 20  em0.alarmArg;.  
16e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
16f0: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
1700: 0a 20 20 78 43 61 6c 6c 62 61 63 6b 28 70 41 72  .  xCallback(pAr
1710: 67 2c 20 6e 6f 77 55 73 65 64 2c 20 6e 42 79 74  g, nowUsed, nByt
1720: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e);.  sqlite3_mu
1730: 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d  tex_enter(mem0.m
1740: 75 74 65 78 29 3b 0a 20 20 6d 65 6d 30 2e 61 6c  utex);.  mem0.al
1750: 61 72 6d 42 75 73 79 20 3d 20 30 3b 0a 7d 0a 0a  armBusy = 0;.}..
1760: 2f 2a 0a 2a 2a 20 44 6f 20 61 20 6d 65 6d 6f 72  /*.** Do a memor
1770: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 69 74  y allocation wit
1780: 68 20 73 74 61 74 69 73 74 69 63 73 20 61 6e 64  h statistics and
1790: 20 61 6c 61 72 6d 73 2e 20 20 41 73 73 75 6d 65   alarms.  Assume
17a0: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20   the.** lock is 
17b0: 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 2a 2f  already held..*/
17c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6c 6c  .static int mall
17d0: 6f 63 57 69 74 68 41 6c 61 72 6d 28 69 6e 74 20  ocWithAlarm(int 
17e0: 6e 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 20  n, void **pp){. 
17f0: 20 69 6e 74 20 6e 46 75 6c 6c 3b 0a 20 20 76 6f   int nFull;.  vo
1800: 69 64 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  id *p;.  assert(
1810: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1820: 65 6c 64 28 6d 65 6d 30 2e 6d 75 74 65 78 29 20  eld(mem0.mutex) 
1830: 29 3b 0a 20 20 6e 46 75 6c 6c 20 3d 20 73 71 6c  );.  nFull = sql
1840: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1850: 2e 6d 2e 78 52 6f 75 6e 64 75 70 28 6e 29 3b 0a  .m.xRoundup(n);.
1860: 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 53    sqlite3StatusS
1870: 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  et(SQLITE_STATUS
1880: 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 6e 29  _MALLOC_SIZE, n)
1890: 3b 0a 20 20 69 66 28 20 6d 65 6d 30 2e 61 6c 61  ;.  if( mem0.ala
18a0: 72 6d 43 61 6c 6c 62 61 63 6b 21 3d 30 20 29 7b  rmCallback!=0 ){
18b0: 0a 20 20 20 20 69 6e 74 20 6e 55 73 65 64 20 3d  .    int nUsed =
18c0: 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 56 61   sqlite3StatusVa
18d0: 6c 75 65 28 53 51 4c 49 54 45 5f 53 54 41 54 55  lue(SQLITE_STATU
18e0: 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 29 3b 0a  S_MEMORY_USED);.
18f0: 20 20 20 20 69 66 28 20 6e 55 73 65 64 2b 6e 46      if( nUsed+nF
1900: 75 6c 6c 20 3e 3d 20 6d 65 6d 30 2e 61 6c 61 72  ull >= mem0.alar
1910: 6d 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20  mThreshold ){.  
1920: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f      sqlite3Mallo
1930: 63 41 6c 61 72 6d 28 6e 46 75 6c 6c 29 3b 0a 20  cAlarm(nFull);. 
1940: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 73     }.  }.  p = s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 46 75  ig.m.xMalloc(nFu
1970: 6c 6c 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ll);.  if( p==0 
1980: 26 26 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c  && mem0.alarmCal
1990: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  lback ){.    sql
19a0: 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28  ite3MallocAlarm(
19b0: 6e 46 75 6c 6c 29 3b 0a 20 20 20 20 70 20 3d 20  nFull);.    p = 
19c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
19d0: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 46  fig.m.xMalloc(nF
19e0: 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ull);.  }.  if( 
19f0: 70 20 29 7b 0a 20 20 20 20 6e 46 75 6c 6c 20 3d  p ){.    nFull =
1a00: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69   sqlite3MallocSi
1a10: 7a 65 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ze(p);.    sqlit
1a20: 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49  e3StatusAdd(SQLI
1a30: 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
1a40: 5f 55 53 45 44 2c 20 6e 46 75 6c 6c 29 3b 0a 20  _USED, nFull);. 
1a50: 20 7d 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20   }.  *pp = p;.  
1a60: 72 65 74 75 72 6e 20 6e 46 75 6c 6c 3b 0a 7d 0a  return nFull;.}.
1a70: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1a80: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 72 6f  memory.  This ro
1a90: 75 74 69 6e 65 20 69 73 20 6c 69 6b 65 20 73 71  utine is like sq
1aa0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 65  lite3_malloc() e
1ab0: 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
1ac0: 20 61 73 73 75 6d 65 73 20 74 68 65 20 6d 65 6d   assumes the mem
1ad0: 6f 72 79 20 73 75 62 73 79 73 74 65 6d 20 68 61  ory subsystem ha
1ae0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
1af0: 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2f 0a 76  nitialized..*/.v
1b00: 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 61 6c 6c  oid *sqlite3Mall
1b10: 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69  oc(int n){.  voi
1b20: 64 20 2a 70 3b 0a 20 20 69 66 28 20 6e 3c 3d 30  d *p;.  if( n<=0
1b30: 20 29 7b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20   ){.    p = 0;. 
1b40: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
1b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1b60: 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 73  Memstat ){.    s
1b70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1b80: 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a  er(mem0.mutex);.
1b90: 20 20 20 20 6d 61 6c 6c 6f 63 57 69 74 68 41 6c      mallocWithAl
1ba0: 61 72 6d 28 6e 2c 20 26 70 29 3b 0a 20 20 20 20  arm(n, &p);.    
1bb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1bc0: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
1bd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
1be0: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
1bf0: 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28  onfig.m.xMalloc(
1c00: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
1c10: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   p;.}../*.** Thi
1c20: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  s version of the
1c30: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1c40: 6f 6e 20 69 73 20 66 6f 72 20 75 73 65 20 62 79  on is for use by
1c50: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
1c60: 2e 0a 2a 2a 20 46 69 72 73 74 20 6d 61 6b 65 20  ..** First make 
1c70: 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  sure the memory 
1c80: 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69  subsystem is ini
1c90: 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 64  tialized, then d
1ca0: 6f 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  o the.** allocat
1cb0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
1cc0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 69 6e 74  lite3_malloc(int
1cd0: 20 6e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c   n){.#ifndef SQL
1ce0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
1cf0: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
1d00: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
1d10: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
1d20: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1d30: 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 7d 0a 0a 2f 2a  Malloc(n);.}../*
1d40: 0a 2a 2a 20 45 61 63 68 20 74 68 72 65 61 64 20  .** Each thread 
1d50: 6d 61 79 20 6f 6e 6c 79 20 68 61 76 65 20 61 20  may only have a 
1d60: 73 69 6e 67 6c 65 20 6f 75 74 73 74 61 6e 64 69  single outstandi
1d70: 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 72  ng allocation fr
1d80: 6f 6d 0a 2a 2a 20 78 53 63 72 61 74 63 68 4d 61  om.** xScratchMa
1d90: 6c 6c 6f 63 28 29 2e 20 20 57 65 20 76 65 72 69  lloc().  We veri
1da0: 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  fy this constrai
1db0: 6e 74 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65  nt in the single
1dc0: 2d 74 68 72 65 61 64 65 64 0a 2a 2a 20 63 61 73  -threaded.** cas
1dd0: 65 20 62 79 20 73 65 74 74 69 6e 67 20 73 63 72  e by setting scr
1de0: 61 74 63 68 41 6c 6c 6f 63 4f 75 74 20 74 6f 20  atchAllocOut to 
1df0: 31 20 77 68 65 6e 20 61 6e 20 61 6c 6c 6f 63 61  1 when an alloca
1e00: 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 75 74 73 74  tion.** is outst
1e10: 61 6e 64 69 6e 67 20 63 6c 65 61 72 69 6e 67 20  anding clearing 
1e20: 69 74 20 77 68 65 6e 20 74 68 65 20 61 6c 6c 6f  it when the allo
1e30: 63 61 74 69 6f 6e 20 69 73 20 66 72 65 65 64 2e  cation is freed.
1e40: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
1e50: 48 52 45 41 44 53 41 46 45 3d 3d 30 20 26 26 20  HREADSAFE==0 && 
1e60: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
1e70: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 72 61  .static int scra
1e80: 74 63 68 41 6c 6c 6f 63 4f 75 74 20 3d 20 30 3b  tchAllocOut = 0;
1e90: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1ea0: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
1eb0: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 75 73  that is to be us
1ec0: 65 64 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  ed and released 
1ed0: 72 69 67 68 74 20 61 77 61 79 2e 0a 2a 2a 20 54  right away..** T
1ee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 73  his routine is s
1ef0: 69 6d 69 6c 61 72 20 74 6f 20 61 6c 6c 6f 63 61  imilar to alloca
1f00: 28 29 20 69 6e 20 74 68 61 74 20 69 74 20 69 73  () in that it is
1f10: 20 6e 6f 74 20 69 6e 74 65 6e 64 65 64 0a 2a 2a   not intended.**
1f20: 20 66 6f 72 20 73 69 74 75 61 74 69 6f 6e 73 20   for situations 
1f30: 77 68 65 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  where the memory
1f40: 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20 6c   might be held l
1f50: 6f 6e 67 2d 74 65 72 6d 2e 20 20 54 68 69 73 0a  ong-term.  This.
1f60: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  ** routine is in
1f70: 74 65 6e 64 65 64 20 74 6f 20 67 65 74 20 6d 65  tended to get me
1f80: 6d 6f 72 79 20 74 6f 20 6f 6c 64 20 6c 61 72 67  mory to old larg
1f90: 65 20 74 72 61 6e 73 69 65 6e 74 20 64 61 74 61  e transient data
1fa0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 74  .** structures t
1fb0: 68 61 74 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 6f  hat would not no
1fc0: 72 6d 61 6c 6c 79 20 66 69 74 20 6f 6e 20 74 68  rmally fit on th
1fd0: 65 20 73 74 61 63 6b 20 6f 66 20 61 6e 0a 2a 2a  e stack of an.**
1fe0: 20 65 6d 62 65 64 64 65 64 20 70 72 6f 63 65 73   embedded proces
1ff0: 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  sor..*/.void *sq
2000: 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
2010: 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69  oc(int n){.  voi
2020: 64 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  d *p;.  assert( 
2030: 6e 3e 30 20 29 3b 0a 0a 23 69 66 20 53 51 4c 49  n>0 );..#if SQLI
2040: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30  TE_THREADSAFE==0
2050: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 44 45   && !defined(NDE
2060: 42 55 47 29 0a 20 20 2f 2a 20 56 65 72 69 66 79  BUG).  /* Verify
2070: 20 74 68 61 74 20 6e 6f 20 6d 6f 72 65 20 74 68   that no more th
2080: 61 6e 20 6f 6e 65 20 73 63 72 61 74 63 68 20 61  an one scratch a
2090: 6c 6c 6f 63 61 74 69 6f 6e 20 70 65 72 20 74 68  llocation per th
20a0: 72 65 61 64 0a 20 20 2a 2a 20 69 73 20 6f 75 74  read.  ** is out
20b0: 73 74 61 6e 64 69 6e 67 20 61 74 20 6f 6e 65 20  standing at one 
20c0: 74 69 6d 65 2e 20 20 28 54 68 69 73 20 69 73 20  time.  (This is 
20d0: 6f 6e 6c 79 20 63 68 65 63 6b 65 64 20 69 6e 20  only checked in 
20e0: 74 68 65 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 2d  the.  ** single-
20f0: 74 68 72 65 61 64 65 64 20 63 61 73 65 20 73 69  threaded case si
2100: 6e 63 65 20 63 68 65 63 6b 69 6e 67 20 69 6e 20  nce checking in 
2110: 74 68 65 20 6d 75 6c 74 69 2d 74 68 72 65 61 64  the multi-thread
2120: 65 64 20 63 61 73 65 0a 20 20 2a 2a 20 77 6f 75  ed case.  ** wou
2130: 6c 64 20 62 65 20 6d 75 63 68 20 6d 6f 72 65 20  ld be much more 
2140: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 29 20 2a 2f  complicated.) */
2150: 0a 20 20 61 73 73 65 72 74 28 20 73 63 72 61 74  .  assert( scrat
2160: 63 68 41 6c 6c 6f 63 4f 75 74 3d 3d 30 20 29 3b  chAllocOut==0 );
2170: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
2180: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2190: 69 67 2e 73 7a 53 63 72 61 74 63 68 3c 6e 20 29  ig.szScratch<n )
21a0: 7b 0a 20 20 20 20 67 6f 74 6f 20 73 63 72 61 74  {.    goto scrat
21b0: 63 68 5f 6f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d  ch_overflow;.  }
21c0: 65 6c 73 65 7b 20 20 0a 20 20 20 20 73 71 6c 69  else{  .    sqli
21d0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
21e0: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20  mem0.mutex);.   
21f0: 20 69 66 28 20 6d 65 6d 30 2e 6e 53 63 72 61 74   if( mem0.nScrat
2200: 63 68 46 72 65 65 3d 3d 30 20 29 7b 0a 20 20 20  chFree==0 ){.   
2210: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2220: 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65  _leave(mem0.mute
2230: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  x);.      goto s
2240: 63 72 61 74 63 68 5f 6f 76 65 72 66 6c 6f 77 3b  cratch_overflow;
2250: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2260: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
2270: 20 3d 20 6d 65 6d 30 2e 61 53 63 72 61 74 63 68   = mem0.aScratch
2280: 46 72 65 65 5b 2d 2d 6d 65 6d 30 2e 6e 53 63 72  Free[--mem0.nScr
2290: 61 74 63 68 46 72 65 65 5d 3b 0a 20 20 20 20 20  atchFree];.     
22a0: 20 69 20 2a 3d 20 73 71 6c 69 74 65 33 47 6c 6f   i *= sqlite3Glo
22b0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
22c0: 74 63 68 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tch;.      sqlit
22d0: 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49  e3StatusAdd(SQLI
22e0: 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43  TE_STATUS_SCRATC
22f0: 48 5f 55 53 45 44 2c 20 31 29 3b 0a 20 20 20 20  H_USED, 1);.    
2300: 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 53    sqlite3StatusS
2310: 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  et(SQLITE_STATUS
2320: 5f 53 43 52 41 54 43 48 5f 53 49 5a 45 2c 20 6e  _SCRATCH_SIZE, n
2330: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2340: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
2350: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  0.mutex);.      
2360: 70 20 3d 20 28 76 6f 69 64 2a 29 26 28 28 63 68  p = (void*)&((ch
2370: 61 72 2a 29 73 71 6c 69 74 65 33 47 6c 6f 62 61  ar*)sqlite3Globa
2380: 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68  lConfig.pScratch
2390: 29 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )[i];.    }.  }.
23a0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
23b0: 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65 66  DSAFE==0 && !def
23c0: 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20 73  ined(NDEBUG).  s
23d0: 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 20 3d  cratchAllocOut =
23e0: 20 70 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20   p!=0;.#endif.. 
23f0: 20 72 65 74 75 72 6e 20 70 3b 0a 0a 73 63 72 61   return p;..scra
2400: 74 63 68 5f 6f 76 65 72 66 6c 6f 77 3a 0a 20 20  tch_overflow:.  
2410: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2420: 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74  lConfig.bMemstat
2430: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2440: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30  mutex_enter(mem0
2450: 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c  .mutex);.    sql
2460: 69 74 65 33 53 74 61 74 75 73 53 65 74 28 53 51  ite3StatusSet(SQ
2470: 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41  LITE_STATUS_SCRA
2480: 54 43 48 5f 53 49 5a 45 2c 20 6e 29 3b 0a 20 20  TCH_SIZE, n);.  
2490: 20 20 6e 20 3d 20 6d 61 6c 6c 6f 63 57 69 74 68    n = mallocWith
24a0: 41 6c 61 72 6d 28 6e 2c 20 26 70 29 3b 0a 20 20  Alarm(n, &p);.  
24b0: 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65    if( p ) sqlite
24c0: 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54  3StatusAdd(SQLIT
24d0: 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48  E_STATUS_SCRATCH
24e0: 5f 4f 56 45 52 46 4c 4f 57 2c 20 6e 29 3b 0a 20  _OVERFLOW, n);. 
24f0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2500: 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65  _leave(mem0.mute
2510: 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
2520: 20 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62   p = sqlite3Glob
2530: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
2540: 6f 63 28 6e 29 3b 0a 20 20 7d 0a 23 69 66 20 53  oc(n);.  }.#if S
2550: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2560: 3d 3d 30 20 26 26 20 21 64 65 66 69 6e 65 64 28  ==0 && !defined(
2570: 4e 44 45 42 55 47 29 0a 20 20 73 63 72 61 74 63  NDEBUG).  scratc
2580: 68 41 6c 6c 6f 63 4f 75 74 20 3d 20 70 21 3d 30  hAllocOut = p!=0
2590: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
25a0: 6e 20 70 3b 20 20 20 20 0a 7d 0a 76 6f 69 64 20  n p;    .}.void 
25b0: 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
25c0: 65 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 69  ee(void *p){.  i
25d0: 66 28 20 70 20 29 7b 0a 0a 23 69 66 20 53 51 4c  f( p ){..#if SQL
25e0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
25f0: 30 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 44  0 && !defined(ND
2600: 45 42 55 47 29 0a 20 20 20 20 2f 2a 20 56 65 72  EBUG).    /* Ver
2610: 69 66 79 20 74 68 61 74 20 6e 6f 20 6d 6f 72 65  ify that no more
2620: 20 74 68 61 6e 20 6f 6e 65 20 73 63 72 61 74 63   than one scratc
2630: 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 65 72  h allocation per
2640: 20 74 68 72 65 61 64 0a 20 20 20 20 2a 2a 20 69   thread.    ** i
2650: 73 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 74  s outstanding at
2660: 20 6f 6e 65 20 74 69 6d 65 2e 20 20 28 54 68 69   one time.  (Thi
2670: 73 20 69 73 20 6f 6e 6c 79 20 63 68 65 63 6b 65  s is only checke
2680: 64 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  d in the.    ** 
2690: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
26a0: 63 61 73 65 20 73 69 6e 63 65 20 63 68 65 63 6b  case since check
26b0: 69 6e 67 20 69 6e 20 74 68 65 20 6d 75 6c 74 69  ing in the multi
26c0: 2d 74 68 72 65 61 64 65 64 20 63 61 73 65 0a 20  -threaded case. 
26d0: 20 20 20 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d     ** would be m
26e0: 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63  uch more complic
26f0: 61 74 65 64 2e 29 20 2a 2f 0a 20 20 20 20 61 73  ated.) */.    as
2700: 73 65 72 74 28 20 73 63 72 61 74 63 68 41 6c 6c  sert( scratchAll
2710: 6f 63 4f 75 74 3d 3d 31 20 29 3b 0a 20 20 20 20  ocOut==1 );.    
2720: 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 20  scratchAllocOut 
2730: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
2740: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2750: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
2760: 68 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  h==0.           
2770: 7c 7c 20 70 3c 73 71 6c 69 74 65 33 47 6c 6f 62  || p<sqlite3Glob
2780: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
2790: 68 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  h.           || 
27a0: 70 3e 3d 28 76 6f 69 64 2a 29 6d 65 6d 30 2e 61  p>=(void*)mem0.a
27b0: 53 63 72 61 74 63 68 46 72 65 65 20 29 7b 0a 20  ScratchFree ){. 
27c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
27d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
27e0: 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 20 20 20  mstat ){.       
27f0: 20 69 6e 74 20 69 53 69 7a 65 20 3d 20 73 71 6c   int iSize = sql
2800: 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  ite3MallocSize(p
2810: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2820: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
2830: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20  em0.mutex);.    
2840: 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75      sqlite3Statu
2850: 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54  sAdd(SQLITE_STAT
2860: 55 53 5f 53 43 52 41 54 43 48 5f 4f 56 45 52 46  US_SCRATCH_OVERF
2870: 4c 4f 57 2c 20 2d 69 53 69 7a 65 29 3b 0a 20 20  LOW, -iSize);.  
2880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61        sqlite3Sta
2890: 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54  tusAdd(SQLITE_ST
28a0: 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
28b0: 2c 20 2d 69 53 69 7a 65 29 3b 0a 20 20 20 20 20  , -iSize);.     
28c0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
28d0: 43 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70  Config.m.xFree(p
28e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28f0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
2900: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20  em0.mutex);.    
2910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2930: 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b  nfig.m.xFree(p);
2940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2950: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
2960: 0a 20 20 20 20 20 20 69 20 3d 20 28 75 38 20 2a  .      i = (u8 *
2970: 29 70 20 2d 20 28 75 38 20 2a 29 73 71 6c 69 74  )p - (u8 *)sqlit
2980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2990: 53 63 72 61 74 63 68 3b 0a 20 20 20 20 20 20 69  Scratch;.      i
29a0: 20 2f 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   /= sqlite3Globa
29b0: 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63  lConfig.szScratc
29c0: 68 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  h;.      assert(
29d0: 20 69 3e 3d 30 20 26 26 20 69 3c 73 71 6c 69 74   i>=0 && i<sqlit
29e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
29f0: 53 63 72 61 74 63 68 20 29 3b 0a 20 20 20 20 20  Scratch );.     
2a00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2a10: 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29  nter(mem0.mutex)
2a20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2a30: 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46 72 65  mem0.nScratchFre
2a40: 65 3c 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e<sqlite3GlobalC
2a50: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 29  onfig.nScratch )
2a60: 3b 0a 20 20 20 20 20 20 6d 65 6d 30 2e 61 53 63  ;.      mem0.aSc
2a70: 72 61 74 63 68 46 72 65 65 5b 6d 65 6d 30 2e 6e  ratchFree[mem0.n
2a80: 53 63 72 61 74 63 68 46 72 65 65 2b 2b 5d 20 3d  ScratchFree++] =
2a90: 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
2aa0: 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54  3StatusAdd(SQLIT
2ab0: 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48  E_STATUS_SCRATCH
2ac0: 5f 55 53 45 44 2c 20 2d 31 29 3b 0a 20 20 20 20  _USED, -1);.    
2ad0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2ae0: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
2af0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2b00: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  /*.** Allocate m
2b10: 65 6d 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64  emory to be used
2b20: 20 62 79 20 74 68 65 20 70 61 67 65 20 63 61 63   by the page cac
2b30: 68 65 2e 20 20 4d 61 6b 65 20 75 73 65 20 6f 66  he.  Make use of
2b40: 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 62   the.** memory b
2b50: 75 66 66 65 72 20 70 72 6f 76 69 64 65 64 20 62  uffer provided b
2b60: 79 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  y SQLITE_CONFIG_
2b70: 50 41 47 45 43 41 43 48 45 20 69 66 20 74 68 65  PAGECACHE if the
2b80: 72 65 20 69 73 20 6f 6e 65 0a 2a 2a 20 61 6e 64  re is one.** and
2b90: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 69 73 20   that memory is 
2ba0: 6f 66 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  of the right siz
2bb0: 65 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6d  e and is not com
2bc0: 70 6c 65 74 65 6c 79 0a 2a 2a 20 63 6f 6e 73 75  pletely.** consu
2bd0: 6d 65 64 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  med.  Otherwise,
2be0: 20 66 61 69 6c 6f 76 65 72 20 74 6f 20 73 71 6c   failover to sql
2bf0: 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  ite3Malloc()..*/
2c00: 0a 23 69 66 20 30 0a 76 6f 69 64 20 2a 73 71 6c  .#if 0.void *sql
2c10: 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 69  ite3PageMalloc(i
2c20: 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70  nt n){.  void *p
2c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
2c40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 20  );.  assert( (n 
2c50: 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20  & (n-1))==0 );. 
2c60: 20 61 73 73 65 72 74 28 20 6e 3e 3d 35 31 32 20   assert( n>=512 
2c70: 26 26 20 6e 3c 3d 33 32 37 36 38 20 29 3b 0a 0a  && n<=32768 );..
2c80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2c90: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
2ca0: 3c 6e 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70  <n ){.    goto p
2cb0: 61 67 65 5f 6f 76 65 72 66 6c 6f 77 3b 0a 20 20  age_overflow;.  
2cc0: 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 73 71 6c  }else{  .    sql
2cd0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2ce0: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
2cf0: 20 20 69 66 28 20 6d 65 6d 30 2e 6e 50 61 67 65    if( mem0.nPage
2d00: 46 72 65 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Free==0 ){.     
2d10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2d20: 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29  eave(mem0.mutex)
2d30: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
2d40: 65 5f 6f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  e_overflow;.    
2d50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2d60: 20 69 3b 0a 20 20 20 20 20 20 69 20 3d 20 6d 65   i;.      i = me
2d70: 6d 30 2e 61 50 61 67 65 46 72 65 65 5b 2d 2d 6d  m0.aPageFree[--m
2d80: 65 6d 30 2e 6e 50 61 67 65 46 72 65 65 5d 3b 0a  em0.nPageFree];.
2d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
2da0: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d  tex_leave(mem0.m
2db0: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 69 20 2a  utex);.      i *
2dc0: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2dd0: 6f 6e 66 69 67 2e 73 7a 50 61 67 65 3b 0a 20 20  onfig.szPage;.  
2de0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75      sqlite3Statu
2df0: 73 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54  sSet(SQLITE_STAT
2e00: 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49 5a  US_PAGECACHE_SIZ
2e10: 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  E, n);.      sql
2e20: 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51  ite3StatusAdd(SQ
2e30: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
2e40: 43 41 43 48 45 5f 55 53 45 44 2c 20 31 29 3b 0a  CACHE_USED, 1);.
2e50: 20 20 20 20 20 20 70 20 3d 20 28 76 6f 69 64 2a        p = (void*
2e60: 29 26 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  )&((char*)sqlite
2e70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50  3GlobalConfig.pP
2e80: 61 67 65 29 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  age)[i];.    }. 
2e90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a   }.  return p;..
2ea0: 70 61 67 65 5f 6f 76 65 72 66 6c 6f 77 3a 0a 20  page_overflow:. 
2eb0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2ec0: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
2ed0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2ee0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d  _mutex_enter(mem
2ef0: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  0.mutex);.    sq
2f00: 6c 69 74 65 33 53 74 61 74 75 73 53 65 74 28 53  lite3StatusSet(S
2f10: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
2f20: 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 6e 29 3b  ECACHE_SIZE, n);
2f30: 0a 20 20 20 20 6e 20 3d 20 6d 61 6c 6c 6f 63 57  .    n = mallocW
2f40: 69 74 68 41 6c 61 72 6d 28 6e 2c 20 26 70 29 3b  ithAlarm(n, &p);
2f50: 0a 20 20 20 20 69 66 28 20 70 20 29 20 73 71 6c  .    if( p ) sql
2f60: 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51  ite3StatusAdd(SQ
2f70: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
2f80: 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20  CACHE_OVERFLOW, 
2f90: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
2fa0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30  mutex_leave(mem0
2fb0: 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65  .mutex);.  }else
2fc0: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
2fd0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
2fe0: 78 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d 0a  xMalloc(n);.  }.
2ff0: 20 20 72 65 74 75 72 6e 20 70 3b 20 20 20 20 0a    return p;    .
3000: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  }.void sqlite3Pa
3010: 67 65 46 72 65 65 28 76 6f 69 64 20 2a 70 29 7b  geFree(void *p){
3020: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
3030: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3040: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 3d 3d 30  lConfig.pPage==0
3050: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
3060: 3c 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  <sqlite3GlobalCo
3070: 6e 66 69 67 2e 70 50 61 67 65 0a 20 20 20 20 20  nfig.pPage.     
3080: 20 20 20 20 20 20 7c 7c 20 70 3e 3d 28 76 6f 69        || p>=(voi
3090: 64 2a 29 6d 65 6d 30 2e 61 50 61 67 65 46 72 65  d*)mem0.aPageFre
30a0: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  e ){.      /* In
30b0: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
30c0: 70 61 67 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  page allocation 
30d0: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
30e0: 6d 20 61 20 72 65 67 75 6c 61 72 20 0a 20 20 20  m a regular .   
30f0: 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71     ** call to sq
3100: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
3110: 73 2e 78 4d 61 6c 6c 6f 63 28 29 20 28 61 20 70  s.xMalloc() (a p
3120: 61 67 65 2d 63 61 63 68 65 2d 6d 65 6d 6f 72 79  age-cache-memory
3130: 20 0a 20 20 20 20 20 20 2a 2a 20 22 6f 76 65 72   .      ** "over
3140: 66 6c 6f 77 22 29 2e 20 46 72 65 65 20 74 68 65  flow"). Free the
3150: 20 62 6c 6f 63 6b 20 77 69 74 68 20 73 71 6c 69   block with sqli
3160: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2e  te3_mem_methods.
3170: 78 46 72 65 65 28 29 2e 0a 20 20 20 20 20 20 2a  xFree()..      *
3180: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
3190: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
31a0: 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20  bMemstat ){.    
31b0: 20 20 20 20 69 6e 74 20 69 53 69 7a 65 20 3d 20      int iSize = 
31c0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
31d0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(p);.        sq
31e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
31f0: 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  r(mem0.mutex);. 
3200: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
3210: 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53  atusAdd(SQLITE_S
3220: 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
3230: 4f 56 45 52 46 4c 4f 57 2c 20 2d 69 53 69 7a 65  OVERFLOW, -iSize
3240: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3250: 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49  e3StatusAdd(SQLI
3260: 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
3270: 5f 55 53 45 44 2c 20 2d 69 53 69 7a 65 29 3b 0a  _USED, -iSize);.
3280: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
3290: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46  lobalConfig.m.xF
32a0: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
32b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
32c0: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
32d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
32f0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46 72 65  balConfig.m.xFre
3300: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(p);.      }.  
3310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
3320: 2a 20 54 68 65 20 70 61 67 65 20 61 6c 6c 6f 63  * The page alloc
3330: 61 74 69 6f 6e 20 77 61 73 20 61 6c 6c 6f 63 61  ation was alloca
3340: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ted from the sql
3350: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3360: 2e 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  .pPage.      ** 
3370: 62 75 66 66 65 72 2e 20 49 6e 20 74 68 69 73 20  buffer. In this 
3380: 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73  case all that is
3390: 20 61 64 64 20 74 68 65 20 69 6e 64 65 78 20 6f   add the index o
33a0: 66 20 74 68 65 20 70 61 67 65 20 69 6e 0a 20 20  f the page in.  
33b0: 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74      ** the sqlit
33c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
33d0: 50 61 67 65 20 61 72 72 61 79 20 74 6f 20 74 68  Page array to th
33e0: 65 20 73 65 74 20 6f 66 20 66 72 65 65 20 69 6e  e set of free in
33f0: 64 65 78 65 73 20 73 74 6f 72 65 64 0a 20 20 20  dexes stored.   
3400: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 65 6d     ** in the mem
3410: 30 2e 61 50 61 67 65 46 72 65 65 5b 5d 20 61 72  0.aPageFree[] ar
3420: 72 61 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ray..      */.  
3430: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
3440: 20 69 20 3d 20 28 75 38 20 2a 29 70 20 2d 20 28   i = (u8 *)p - (
3450: 75 38 20 2a 29 73 71 6c 69 74 65 33 47 6c 6f 62  u8 *)sqlite3Glob
3460: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 3b 0a  alConfig.pPage;.
3470: 20 20 20 20 20 20 69 20 2f 3d 20 73 71 6c 69 74        i /= sqlit
3480: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
3490: 7a 50 61 67 65 3b 0a 20 20 20 20 20 20 61 73 73  zPage;.      ass
34a0: 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 73  ert( i>=0 && i<s
34b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
34c0: 69 67 2e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  ig.nPage );.    
34d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
34e0: 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78  enter(mem0.mutex
34f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3500: 20 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65 3c   mem0.nPageFree<
3510: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3520: 66 69 67 2e 6e 50 61 67 65 20 29 3b 0a 20 20 20  fig.nPage );.   
3530: 20 20 20 6d 65 6d 30 2e 61 50 61 67 65 46 72 65     mem0.aPageFre
3540: 65 5b 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65  e[mem0.nPageFree
3550: 2b 2b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 73  ++] = i;.      s
3560: 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28  qlite3StatusAdd(
3570: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
3580: 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 2d 31  GECACHE_USED, -1
3590: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
35a0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
35b0: 30 2e 6d 75 74 65 78 29 3b 0a 23 69 66 20 21 64  0.mutex);.#if !d
35c0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
35d0: 26 20 30 0a 20 20 20 20 20 20 2f 2a 20 41 73 73  & 0.      /* Ass
35e0: 65 72 74 20 74 68 61 74 20 61 20 64 75 70 6c 69  ert that a dupli
35f0: 63 61 74 65 20 77 61 73 20 6e 6f 74 20 6a 75 73  cate was not jus
3600: 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  t inserted into 
3610: 61 50 61 67 65 46 72 65 65 5b 5d 2e 20 2a 2f 0a  aPageFree[]. */.
3620: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3630: 3c 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65 2d  <mem0.nPageFree-
3640: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  1; i++){.       
3650: 20 61 73 73 65 72 74 28 20 6d 65 6d 30 2e 61 50   assert( mem0.aP
3660: 61 67 65 46 72 65 65 5b 69 5d 21 3d 6d 65 6d 30  ageFree[i]!=mem0
3670: 2e 61 50 61 67 65 46 72 65 65 5b 6d 65 6d 30 2e  .aPageFree[mem0.
3680: 6e 50 61 67 65 46 72 65 65 2d 31 5d 20 29 3b 0a  nPageFree-1] );.
3690: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
36a0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
36b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 52 55 45 20 69 66  f../*.** TRUE if
36c0: 20 70 20 69 73 20 61 20 6c 6f 6f 6b 61 73 69 64   p is a lookasid
36d0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
36e0: 69 6f 6e 20 66 72 6f 6d 20 64 62 0a 2a 2f 0a 73  ion from db.*/.s
36f0: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 6f 6f 6b  tatic int isLook
3700: 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64  aside(sqlite3 *d
3710: 62 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 72  b, void *p){.  r
3720: 65 74 75 72 6e 20 64 62 20 26 26 20 70 20 26 26  eturn db && p &&
3730: 20 70 3e 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64   p>=db->lookasid
3740: 65 2e 70 53 74 61 72 74 20 26 26 20 70 3c 64 62  e.pStart && p<db
3750: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
3760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3770: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
3780: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3790: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 62 74  n previously obt
37a0: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
37b0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 6f 72  lite3Malloc() or
37c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
37d0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
37e0: 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 76 6f 69 64  3MallocSize(void
37f0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
3800: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3810: 69 67 2e 6d 2e 78 53 69 7a 65 28 70 29 3b 0a 7d  ig.m.xSize(p);.}
3820: 0a 69 6e 74 20 73 71 6c 69 74 65 33 44 62 4d 61  .int sqlite3DbMa
3830: 6c 6c 6f 63 53 69 7a 65 28 73 71 6c 69 74 65 33  llocSize(sqlite3
3840: 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b 0a   *db, void *p){.
3850: 20 20 69 66 28 20 69 73 4c 6f 6f 6b 61 73 69 64    if( isLookasid
3860: 65 28 64 62 2c 20 70 29 20 29 7b 0a 20 20 20 20  e(db, p) ){.    
3870: 72 65 74 75 72 6e 20 64 62 2d 3e 6c 6f 6f 6b 61  return db->looka
3880: 73 69 64 65 2e 73 7a 3b 0a 20 20 7d 65 6c 73 65  side.sz;.  }else
3890: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
38a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
38b0: 2e 6d 2e 78 53 69 7a 65 28 70 29 3b 0a 20 20 7d  .m.xSize(p);.  }
38c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d  .}../*.** Free m
38d0: 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c 79  emory previously
38e0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
38f0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 0a  qlite3Malloc()..
3900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
3910: 66 72 65 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  free(void *p){. 
3920: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3930: 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
3940: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d  3GlobalConfig.bM
3950: 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 73 71  emstat ){.    sq
3960: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
3970: 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  r(mem0.mutex);. 
3980: 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73     sqlite3Status
3990: 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54 55  Add(SQLITE_STATU
39a0: 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 2d  S_MEMORY_USED, -
39b0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
39c0: 65 28 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(p));.    sqlit
39d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
39e0: 2e 78 46 72 65 65 28 70 29 3b 0a 20 20 20 20 73  .xFree(p);.    s
39f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
3a00: 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a  ve(mem0.mutex);.
3a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
3a20: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3a30: 2e 6d 2e 78 46 72 65 65 28 70 29 3b 0a 20 20 7d  .m.xFree(p);.  }
3a40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d  .}../*.** Free m
3a50: 65 6d 6f 72 79 20 74 68 61 74 20 6d 69 67 68 74  emory that might
3a60: 20 62 65 20 61 73 73 6f 63 69 61 74 65 64 20 77   be associated w
3a70: 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72  ith a particular
3a80: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
3a90: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
3aa0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 73   sqlite3DbFree(s
3ab0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
3ac0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 69 73 4c 6f   *p){.  if( isLo
3ad0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 29 20 29  okaside(db, p) )
3ae0: 7b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53  {.    LookasideS
3af0: 6c 6f 74 20 2a 70 42 75 66 20 3d 20 28 4c 6f 6f  lot *pBuf = (Loo
3b00: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 3b 0a 20  kasideSlot*)p;. 
3b10: 20 20 20 70 42 75 66 2d 3e 70 4e 65 78 74 20 3d     pBuf->pNext =
3b20: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
3b30: 46 72 65 65 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  Free;.    db->lo
3b40: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20  okaside.pFree = 
3b50: 70 42 75 66 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  pBuf;.    db->lo
3b60: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 2d 2d 3b 0a  okaside.nOut--;.
3b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
3b80: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
3b90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3ba0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  e the size of an
3bb0: 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79   existing memory
3bc0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 76   allocation.*/.v
3bd0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 52 65 61 6c  oid *sqlite3Real
3be0: 6c 6f 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c 20  loc(void *pOld, 
3bf0: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 69  int nBytes){.  i
3c00: 6e 74 20 6e 4f 6c 64 2c 20 6e 4e 65 77 3b 0a 20  nt nOld, nNew;. 
3c10: 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 69   void *pNew;.  i
3c20: 66 28 20 70 4f 6c 64 3d 3d 30 20 29 7b 0a 20 20  f( pOld==0 ){.  
3c30: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3c40: 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a  Malloc(nBytes);.
3c50: 20 20 7d 0a 20 20 69 66 28 20 6e 42 79 74 65 73    }.  if( nBytes
3c60: 3c 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  <=0 ){.    sqlit
3c70: 65 33 5f 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20  e3_free(pOld);. 
3c80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3c90: 0a 20 20 6e 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  nOld = sqlite
3ca0: 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4f 6c 64  3MallocSize(pOld
3cb0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
3cc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3cd0: 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 73 71 6c  mstat ){.    sql
3ce0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
3cf0: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
3d00: 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 53    sqlite3StatusS
3d10: 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  et(SQLITE_STATUS
3d20: 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 6e 42  _MALLOC_SIZE, nB
3d30: 79 74 65 73 29 3b 0a 20 20 20 20 6e 4e 65 77 20  ytes);.    nNew 
3d40: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3d50: 6f 6e 66 69 67 2e 6d 2e 78 52 6f 75 6e 64 75 70  onfig.m.xRoundup
3d60: 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 69 66  (nBytes);.    if
3d70: 28 20 6e 4f 6c 64 3d 3d 6e 4e 65 77 20 29 7b 0a  ( nOld==nNew ){.
3d80: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 6c        pNew = pOl
3d90: 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
3da0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
3db0: 74 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49 54  tatusValue(SQLIT
3dc0: 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
3dd0: 55 53 45 44 29 2b 6e 4e 65 77 2d 6e 4f 6c 64 20  USED)+nNew-nOld 
3de0: 3e 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  >= .            
3df0: 6d 65 6d 30 2e 61 6c 61 72 6d 54 68 72 65 73 68  mem0.alarmThresh
3e00: 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73  old ){.        s
3e10: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72  qlite3MallocAlar
3e20: 6d 28 6e 4e 65 77 2d 6e 4f 6c 64 29 3b 0a 20 20  m(nNew-nOld);.  
3e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
3e40: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
3e50: 43 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f  Config.m.xReallo
3e60: 63 28 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b 0a 20  c(pOld, nNew);. 
3e70: 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
3e80: 20 26 26 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61   && mem0.alarmCa
3e90: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
3ea0: 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41    sqlite3MallocA
3eb0: 6c 61 72 6d 28 6e 42 79 74 65 73 29 3b 0a 20 20  larm(nBytes);.  
3ec0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
3ed0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3ee0: 2e 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 4f 6c 64  .m.xRealloc(pOld
3ef0: 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , nNew);.      }
3f00: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
3f10: 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20  ){.        nNew 
3f20: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
3f30: 69 7a 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ize(pNew);.     
3f40: 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73     sqlite3Status
3f50: 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54 55  Add(SQLITE_STATU
3f60: 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 6e  S_MEMORY_USED, n
3f70: 4e 65 77 2d 6e 4f 6c 64 29 3b 0a 20 20 20 20 20  New-nOld);.     
3f80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
3f90: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
3fa0: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
3fb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20  }else{.    pNew 
3fc0: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3fd0: 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63  onfig.m.xRealloc
3fe0: 28 70 4f 6c 64 2c 20 6e 42 79 74 65 73 29 3b 0a  (pOld, nBytes);.
3ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
4000: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  w;.}../*.** The 
4010: 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65  public interface
4020: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 61 6c 6c   to sqlite3Reall
4030: 6f 63 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  oc.  Make sure t
4040: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a  hat the memory.*
4050: 2a 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69  * subsystem is i
4060: 6e 69 74 69 61 6c 69 7a 65 64 20 70 72 69 6f 72  nitialized prior
4070: 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 73 71 6c   to invoking sql
4080: 69 74 65 52 65 61 6c 6c 6f 63 2e 0a 2a 2f 0a 76  iteRealloc..*/.v
4090: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 65 61  oid *sqlite3_rea
40a0: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c  lloc(void *pOld,
40b0: 20 69 6e 74 20 6e 29 7b 0a 23 69 66 6e 64 65 66   int n){.#ifndef
40c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
40d0: 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69  OINIT.  if( sqli
40e0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
40f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
4100: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  dif.  return sql
4110: 69 74 65 33 52 65 61 6c 6c 6f 63 28 70 4f 6c 64  ite3Realloc(pOld
4120: 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , n);.}.../*.** 
4130: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72  Allocate and zer
4140: 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 20 0a 76 6f  o memory..*/ .vo
4150: 69 64 20 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  id *sqlite3Mallo
4160: 63 5a 65 72 6f 28 69 6e 74 20 6e 29 7b 0a 20 20  cZero(int n){.  
4170: 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69 74 65  void *p = sqlite
4180: 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 69 66  3Malloc(n);.  if
4190: 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ( p ){.    memse
41a0: 74 28 70 2c 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a  t(p, 0, n);.  }.
41b0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
41c0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
41d0: 64 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 20 20  d zero memory.  
41e0: 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  If the allocatio
41f0: 6e 20 66 61 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a  n fails, make.**
4200: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
4210: 64 20 66 6c 61 67 20 69 6e 20 74 68 65 20 63 6f  d flag in the co
4220: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4230: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
4240: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  e3DbMallocZero(s
4250: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4260: 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20  n){.  void *p = 
4270: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4280: 61 77 28 64 62 2c 20 6e 29 3b 0a 20 20 69 66 28  aw(db, n);.  if(
4290: 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74   p ){.    memset
42a0: 28 70 2c 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a 20  (p, 0, n);.  }. 
42b0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
42c0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
42d0: 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 20 20 49   zero memory.  I
42e0: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
42f0: 20 66 61 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a 20   fails, make.** 
4300: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
4310: 20 66 6c 61 67 20 69 6e 20 74 68 65 20 63 6f 6e   flag in the con
4320: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  nection pointer.
4330: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
4340: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c  3DbMallocRaw(sql
4350: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 29  ite3 *db, int n)
4360: 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 69  {.  void *p;.  i
4370: 66 28 20 64 62 20 29 7b 0a 20 20 20 20 4c 6f 6f  f( db ){.    Loo
4380: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 42 75 66  kasideSlot *pBuf
4390: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
43a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
43b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
43c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
43d0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
43e0: 65 64 20 26 26 20 6e 3c 3d 64 62 2d 3e 6c 6f 6f  ed && n<=db->loo
43f0: 6b 61 73 69 64 65 2e 73 7a 0a 20 20 20 20 20 20  kaside.sz.      
4400: 20 20 20 26 26 20 28 70 42 75 66 20 3d 20 64 62     && (pBuf = db
4410: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
4420: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  e)!=0 ){.      d
4430: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72  b->lookaside.pFr
4440: 65 65 20 3d 20 70 42 75 66 2d 3e 70 4e 65 78 74  ee = pBuf->pNext
4450: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
4460: 61 73 69 64 65 2e 6e 4f 75 74 2b 2b 3b 0a 20 20  aside.nOut++;.  
4470: 20 20 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b      if( db->look
4480: 61 73 69 64 65 2e 6e 4f 75 74 3e 64 62 2d 3e 6c  aside.nOut>db->l
4490: 6f 6f 6b 61 73 69 64 65 2e 6d 78 4f 75 74 20 29  ookaside.mxOut )
44a0: 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f  {.        db->lo
44b0: 6f 6b 61 73 69 64 65 2e 6d 78 4f 75 74 20 3d 20  okaside.mxOut = 
44c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
44d0: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
44e0: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
44f0: 70 42 75 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBuf;.    }.  }.
4500: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
4510: 6c 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 21 70  loc(n);.  if( !p
4520: 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20 64 62   && db ){.    db
4530: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
4540: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4550: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73   p;.}../*.** Res
4560: 69 7a 65 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66  ize the block of
4570: 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 64 20   memory pointed 
4580: 74 6f 20 62 79 20 70 20 74 6f 20 6e 20 62 79 74  to by p to n byt
4590: 65 73 2e 20 49 66 20 74 68 65 0a 2a 2a 20 72 65  es. If the.** re
45a0: 73 69 7a 65 20 66 61 69 6c 73 2c 20 73 65 74 20  size fails, set 
45b0: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
45c0: 20 66 6c 61 67 20 69 6e 20 74 68 65 20 63 6f 6e   flag in the con
45d0: 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a  nection object..
45e0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
45f0: 44 62 52 65 61 6c 6c 6f 63 28 73 71 6c 69 74 65  DbRealloc(sqlite
4600: 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 2c 20  3 *db, void *p, 
4610: 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a  int n){.  void *
4620: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66 28 20  pNew = 0;.  if( 
4630: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4640: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
4650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
4660: 75 72 6e 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  urn sqlite3DbMal
4670: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 29 3b 0a 20  locRaw(db, n);. 
4680: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4c     }.    if( isL
4690: 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 29 20  ookaside(db, p) 
46a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3c 3d  ){.      if( n<=
46b0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
46c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
46d0: 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn p;.      }.  
46e0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
46f0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
4700: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
4710: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
4720: 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20  memcpy(pNew, p, 
4730: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
4740: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4750: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
4760: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4770: 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  se{.      pNew =
4780: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
4790: 28 70 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  (p, n);.      if
47a0: 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !pNew ){.     
47b0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
47c0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  led = 1;.      }
47d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
47e0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
47f0: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65  ** Attempt to re
4800: 61 6c 6c 6f 63 61 74 65 20 70 2e 20 20 49 66 20  allocate p.  If 
4810: 74 68 65 20 72 65 61 6c 6c 6f 63 61 74 69 6f 6e  the reallocation
4820: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 66 72 65   fails, then fre
4830: 65 20 70 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74  e p.** and set t
4840: 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  he mallocFailed 
4850: 66 6c 61 67 20 69 6e 20 74 68 65 20 64 61 74 61  flag in the data
4860: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4870: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
4880: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
4890: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
48a0: 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  id *p, int n){. 
48b0: 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 70   void *pNew;.  p
48c0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
48d0: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 2c 20 6e 29  ealloc(db, p, n)
48e0: 3b 0a 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b  ;.  if( !pNew ){
48f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4900: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20  ee(db, p);.  }. 
4910: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
4920: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  ./*.** Make a co
4930: 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69  py of a string i
4940: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
4950: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
4960: 6c 6f 63 28 29 2e 20 54 68 65 73 65 20 0a 2a 2a  loc(). These .**
4970: 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 20   functions call 
4980: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77  sqlite3MallocRaw
4990: 28 29 20 64 69 72 65 63 74 6c 79 20 69 6e 73 74  () directly inst
49a0: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 4d 61 6c  ead of sqliteMal
49b0: 6c 6f 63 28 29 2e 20 54 68 69 73 0a 2a 2a 20 69  loc(). This.** i
49c0: 73 20 62 65 63 61 75 73 65 20 77 68 65 6e 20 6d  s because when m
49d0: 65 6d 6f 72 79 20 64 65 62 75 67 67 69 6e 67 20  emory debugging 
49e0: 69 73 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68  is turned on, th
49f0: 65 73 65 20 74 77 6f 20 66 75 6e 63 74 69 6f 6e  ese two function
4a00: 73 20 61 72 65 20 0a 2a 2a 20 63 61 6c 6c 65 64  s are .** called
4a10: 20 76 69 61 20 6d 61 63 72 6f 73 20 74 68 61 74   via macros that
4a20: 20 72 65 63 6f 72 64 20 74 68 65 20 63 75 72 72   record the curr
4a30: 65 6e 74 20 66 69 6c 65 20 61 6e 64 20 6c 69 6e  ent file and lin
4a40: 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a  e number in the.
4a50: 2a 2a 20 54 68 72 65 61 64 44 61 74 61 20 73 74  ** ThreadData st
4a60: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 63 68 61 72  ructure..*/.char
4a70: 20 2a 73 71 6c 69 74 65 33 44 62 53 74 72 44 75   *sqlite3DbStrDu
4a80: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  p(sqlite3 *db, c
4a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
4aa0: 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 73   char *zNew;.  s
4ab0: 69 7a 65 5f 74 20 6e 3b 0a 20 20 69 66 28 20 7a  ize_t n;.  if( z
4ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
4ad0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  n 0;.  }.  n = s
4ae0: 74 72 6c 65 6e 28 7a 29 2b 31 3b 0a 20 20 61 73  trlen(z)+1;.  as
4af0: 73 65 72 74 28 20 28 6e 26 30 78 37 66 66 66 66  sert( (n&0x7ffff
4b00: 66 66 66 29 3d 3d 6e 20 29 3b 0a 20 20 7a 4e 65  fff)==n );.  zNe
4b10: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
4b20: 6c 6f 63 52 61 77 28 64 62 2c 20 28 69 6e 74 29  locRaw(db, (int)
4b30: 6e 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29  n);.  if( zNew )
4b40: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65  {.    memcpy(zNe
4b50: 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20  w, z, n);.  }.  
4b60: 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 63  return zNew;.}.c
4b70: 68 61 72 20 2a 73 71 6c 69 74 65 33 44 62 53 74  har *sqlite3DbSt
4b80: 72 4e 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  rNDup(sqlite3 *d
4b90: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4ba0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 63 68 61 72  , int n){.  char
4bb0: 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d   *zNew;.  if( z=
4bc0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
4bd0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
4be0: 28 20 28 6e 26 30 78 37 66 66 66 66 66 66 66 29  ( (n&0x7fffffff)
4bf0: 3d 3d 6e 20 29 3b 0a 20 20 7a 4e 65 77 20 3d 20  ==n );.  zNew = 
4c00: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4c10: 61 77 28 64 62 2c 20 6e 2b 31 29 3b 0a 20 20 69  aw(db, n+1);.  i
4c20: 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( zNew ){.    m
4c30: 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e  emcpy(zNew, z, n
4c40: 29 3b 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20 3d  );.    zNew[n] =
4c50: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
4c60: 20 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zNew;.}../*.** 
4c70: 43 72 65 61 74 65 20 61 20 73 74 72 69 6e 67 20  Create a string 
4c80: 66 72 6f 6d 20 74 68 65 20 7a 46 72 6f 6d 61 74  from the zFromat
4c90: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 74 68   argument and th
4ca0: 65 20 76 61 5f 6c 69 73 74 20 74 68 61 74 20 66  e va_list that f
4cb0: 6f 6c 6c 6f 77 73 2e 0a 2a 2a 20 53 74 6f 72 65  ollows..** Store
4cc0: 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 6d   the string in m
4cd0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4ce0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
4cf0: 28 29 20 61 6e 64 20 6d 61 6b 65 20 2a 70 7a 0a  () and make *pz.
4d00: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  ** point to that
4d10: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64   string..*/.void
4d20: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
4d30: 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20 73 71 6c  g(char **pz, sql
4d40: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
4d50: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
4d60: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
4d70: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  p;.  char *z;.. 
4d80: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
4d90: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71  ormat);.  z = sq
4da0: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62  lite3VMPrintf(db
4db0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
4dc0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
4dd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4de0: 2c 20 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20  , *pz);.  *pz = 
4df0: 7a 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  z;.}.../*.** Thi
4e00: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
4e10: 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
4e20: 20 65 78 69 74 69 6e 67 20 61 6e 79 20 41 50 49   exiting any API
4e30: 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20   function (i.e. 
4e40: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20 63 6f  .** returning co
4e50: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 73 65  ntrol to the use
4e60: 72 29 20 74 68 61 74 20 68 61 73 20 63 61 6c 6c  r) that has call
4e70: 65 64 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ed sqlite3_mallo
4e80: 63 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  c or.** sqlite3_
4e90: 72 65 61 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20 54  realloc..**.** T
4ea0: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
4eb0: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  e is normally a 
4ec0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
4ed0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
4ee0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
4ef0: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 61 20 6d   However, if a m
4f00: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20  alloc() failure 
4f10: 68 61 73 20 6f 63 63 75 72 65 64 20 73 69 6e 63  has occured sinc
4f20: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  e the previous.*
4f30: 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 53 51 4c  * invocation SQL
4f40: 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
4f50: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 20 0a  urned instead. .
4f60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 72  **.** If the fir
4f70: 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 64 62 2c  st argument, db,
4f80: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
4f90: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f   a malloc() erro
4fa0: 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c 0a 2a  r has occured,.*
4fb0: 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 6e 65  * then the conne
4fc0: 63 74 69 6f 6e 20 65 72 72 6f 72 2d 63 6f 64 65  ction error-code
4fd0: 20 28 74 68 65 20 76 61 6c 75 65 20 72 65 74 75   (the value retu
4fe0: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  rned by sqlite3_
4ff0: 65 72 72 63 6f 64 65 28 29 29 0a 2a 2a 20 69 73  errcode()).** is
5000: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
5010: 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OMEM..*/.int sql
5020: 69 74 65 33 41 70 69 45 78 69 74 28 73 71 6c 69  ite3ApiExit(sqli
5030: 74 65 33 2a 20 64 62 2c 20 69 6e 74 20 72 63 29  te3* db, int rc)
5040: 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  {.  /* If the db
5050: 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20 4e   handle is not N
5060: 55 4c 4c 2c 20 74 68 65 6e 20 77 65 20 6d 75 73  ULL, then we mus
5070: 74 20 68 6f 6c 64 20 74 68 65 20 63 6f 6e 6e 65  t hold the conne
5080: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 0a 20 20 2a  ction handle.  *
5090: 2a 20 6d 75 74 65 78 20 68 65 72 65 2e 20 4f 74  * mutex here. Ot
50a0: 68 65 72 77 69 73 65 20 74 68 65 20 72 65 61 64  herwise the read
50b0: 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 65 20 77   (and possible w
50c0: 72 69 74 65 29 20 6f 66 20 64 62 2d 3e 6d 61 6c  rite) of db->mal
50d0: 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 2a 2a 20  locFailed .  ** 
50e0: 69 73 20 75 6e 73 61 66 65 2c 20 61 73 20 69 73  is unsafe, as is
50f0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
5100: 69 74 65 33 45 72 72 6f 72 28 29 2e 0a 20 20 2a  ite3Error()..  *
5110: 2f 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 20  /.  assert( !db 
5120: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
5130: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
5140: 20 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20   );.  if( db && 
5150: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5160: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5170: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
5180: 4e 4f 4d 45 4d 2c 20 30 29 3b 0a 20 20 20 20 64  NOMEM, 0);.    d
5190: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
51a0: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 0;.    rc = SQ
51b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
51c0: 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 28 64    return rc & (d
51d0: 62 20 3f 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  b ? db->errMask 
51e0: 3a 20 30 78 66 66 29 3b 0a 7d 0a                 : 0xff);.}.