/ Hex Artifact Content
Login

Artifact 8b67cb6ba7853ad166fd6909ca5f702bf063c053:


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 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
01d0: 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 0a  ude <stdarg.h>..
01e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
01f0: 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65  ne runs when the
0200: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f   memory allocato
0210: 72 20 73 65 65 73 20 74 68 61 74 20 74 68 65 0a  r sees that the.
0220: 2a 2a 20 74 6f 74 61 6c 20 6d 65 6d 6f 72 79 20  ** total memory 
0230: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 61 62  allocation is ab
0240: 6f 75 74 20 74 6f 20 65 78 63 65 65 64 20 74 68  out to exceed th
0250: 65 20 73 6f 66 74 20 68 65 61 70 0a 2a 2a 20 6c  e soft heap.** l
0260: 69 6d 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  imit..*/.static 
0270: 76 6f 69 64 20 73 6f 66 74 48 65 61 70 4c 69 6d  void softHeapLim
0280: 69 74 45 6e 66 6f 72 63 65 72 28 0a 20 20 76 6f  itEnforcer(.  vo
0290: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 0a 20 20  id *NotUsed, .  
02a0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 6f  sqlite3_int64 No
02b0: 74 55 73 65 64 32 2c 0a 20 20 69 6e 74 20 61 6c  tUsed2,.  int al
02c0: 6c 6f 63 53 69 7a 65 0a 29 7b 0a 20 20 55 4e 55  locSize.){.  UNU
02d0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
02e0: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
02f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6c  );.  sqlite3_rel
0300: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 61 6c 6c 6f  ease_memory(allo
0310: 63 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  cSize);.}../*.**
0320: 20 53 65 74 20 74 68 65 20 73 6f 66 74 20 68 65   Set the soft he
0330: 61 70 2d 73 69 7a 65 20 6c 69 6d 69 74 20 66 6f  ap-size limit fo
0340: 72 20 74 68 65 20 6c 69 62 72 61 72 79 2e 20 50  r the library. P
0350: 61 73 73 69 6e 67 20 61 20 7a 65 72 6f 20 6f 72  assing a zero or
0360: 20 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 76 61   .** negative va
0370: 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  lue indicates no
0380: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20   limit..*/.void 
0390: 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
03a0: 70 5f 6c 69 6d 69 74 28 69 6e 74 20 6e 29 7b 0a  p_limit(int n){.
03b0: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
03c0: 20 69 4c 69 6d 69 74 3b 0a 20 20 69 6e 74 20 6f   iLimit;.  int o
03d0: 76 65 72 61 67 65 3b 0a 20 20 69 66 28 20 6e 3c  verage;.  if( n<
03e0: 30 20 29 7b 0a 20 20 20 20 69 4c 69 6d 69 74 20  0 ){.    iLimit 
03f0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
0400: 20 20 69 4c 69 6d 69 74 20 3d 20 6e 3b 0a 20 20    iLimit = n;.  
0410: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
0420: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
0430: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
0440: 69 7a 65 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ize();.#endif.  
0450: 69 66 28 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a  if( iLimit>0 ){.
0460: 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72      sqlite3Memor
0470: 79 41 6c 61 72 6d 28 73 6f 66 74 48 65 61 70 4c  yAlarm(softHeapL
0480: 69 6d 69 74 45 6e 66 6f 72 63 65 72 2c 20 30 2c  imitEnforcer, 0,
0490: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 7d 65 6c 73   iLimit);.  }els
04a0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65  e{.    sqlite3Me
04b0: 6d 6f 72 79 41 6c 61 72 6d 28 30 2c 20 30 2c 20  moryAlarm(0, 0, 
04c0: 30 29 3b 0a 20 20 7d 0a 20 20 6f 76 65 72 61 67  0);.  }.  overag
04d0: 65 20 3d 20 28 69 6e 74 29 28 73 71 6c 69 74 65  e = (int)(sqlite
04e0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 20  3_memory_used() 
04f0: 2d 20 28 69 36 34 29 6e 29 3b 0a 20 20 69 66 28  - (i64)n);.  if(
0500: 20 6f 76 65 72 61 67 65 3e 30 20 29 7b 0a 20 20   overage>0 ){.  
0510: 20 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73    sqlite3_releas
0520: 65 5f 6d 65 6d 6f 72 79 28 6f 76 65 72 61 67 65  e_memory(overage
0530: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0540: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
0550: 73 65 20 75 70 20 74 6f 20 6e 20 62 79 74 65 73  se up to n bytes
0560: 20 6f 66 20 6e 6f 6e 2d 65 73 73 65 6e 74 69 61   of non-essentia
0570: 6c 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74  l memory current
0580: 6c 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 53 51  ly.** held by SQ
0590: 4c 69 74 65 2e 20 41 6e 20 65 78 61 6d 70 6c 65  Lite. An example
05a0: 20 6f 66 20 6e 6f 6e 2d 65 73 73 65 6e 74 69 61   of non-essentia
05b0: 6c 20 6d 65 6d 6f 72 79 20 69 73 20 6d 65 6d 6f  l memory is memo
05c0: 72 79 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 61  ry used to.** ca
05d0: 63 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  che database pag
05e0: 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
05f0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
0600: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0610: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
0620: 69 6e 74 20 6e 29 7b 0a 23 69 66 64 65 66 20 53  int n){.#ifdef S
0630: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
0640: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
0650: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
0660: 63 61 63 68 65 52 65 6c 65 61 73 65 4d 65 6d 6f  cacheReleaseMemo
0670: 72 79 28 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 2f  ry(n);.#else.  /
0680: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0690: 2d 4f 46 3a 20 52 2d 33 34 33 39 31 2d 32 34 39  -OF: R-34391-249
06a0: 32 31 20 54 68 65 20 73 71 6c 69 74 65 33 5f 72  21 The sqlite3_r
06b0: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
06c0: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
06d0: 61 20 6e 6f 2d 6f 70 20 72 65 74 75 72 6e 69 6e  a no-op returnin
06e0: 67 20 7a 65 72 6f 20 69 66 20 53 51 4c 69 74 65  g zero if SQLite
06f0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 64   is not compiled
0700: 20 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c 49 54   with.  ** SQLIT
0710: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
0720: 4d 41 4e 41 47 45 4d 45 4e 54 2e 20 2a 2f 0a 20  MANAGEMENT. */. 
0730: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
0740: 52 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  R(n);.  return 0
0750: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
0760: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0770: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0780: 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20 74 68  bject records th
0790: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 0a 2a 2a  e location of.**
07a0: 20 65 61 63 68 20 75 6e 75 73 65 64 20 73 63 72   each unused scr
07b0: 61 74 63 68 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  atch buffer..*/.
07c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
07d0: 63 72 61 74 63 68 46 72 65 65 73 6c 6f 74 20 7b  cratchFreeslot {
07e0: 0a 20 20 73 74 72 75 63 74 20 53 63 72 61 74 63  .  struct Scratc
07f0: 68 46 72 65 65 73 6c 6f 74 20 2a 70 4e 65 78 74  hFreeslot *pNext
0800: 3b 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73  ;   /* Next unus
0810: 65 64 20 73 63 72 61 74 63 68 20 62 75 66 66 65  ed scratch buffe
0820: 72 20 2a 2f 0a 7d 20 53 63 72 61 74 63 68 46 72  r */.} ScratchFr
0830: 65 65 73 6c 6f 74 3b 0a 0a 2f 2a 0a 2a 2a 20 53  eeslot;../*.** S
0840: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
0850: 20 6c 6f 63 61 6c 20 74 6f 20 74 68 65 20 6d 65   local to the me
0860: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0870: 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a 73 74  subsystem..*/.st
0880: 61 74 69 63 20 53 51 4c 49 54 45 5f 57 53 44 20  atic SQLITE_WSD 
0890: 73 74 72 75 63 74 20 4d 65 6d 30 47 6c 6f 62 61  struct Mem0Globa
08a0: 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  l {.  sqlite3_mu
08b0: 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
08c0: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
08d0: 73 65 72 69 61 6c 69 7a 65 20 61 63 63 65 73 73  serialize access
08e0: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54   */..  /*.  ** T
08f0: 68 65 20 61 6c 61 72 6d 20 63 61 6c 6c 62 61 63  he alarm callbac
0900: 6b 20 61 6e 64 20 69 74 73 20 61 72 67 75 6d 65  k and its argume
0910: 6e 74 73 2e 20 20 54 68 65 20 6d 65 6d 30 2e 6d  nts.  The mem0.m
0920: 75 74 65 78 20 6c 6f 63 6b 20 77 69 6c 6c 0a 20  utex lock will. 
0930: 20 2a 2a 20 62 65 20 68 65 6c 64 20 77 68 69 6c   ** be held whil
0940: 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69  e the callback i
0950: 73 20 72 75 6e 6e 69 6e 67 2e 20 20 52 65 63 75  s running.  Recu
0960: 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f  rsive calls into
0970: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
0980: 20 73 75 62 73 79 73 74 65 6d 20 61 72 65 20 61   subsystem are a
0990: 6c 6c 6f 77 65 64 2c 20 62 75 74 20 6e 6f 20 6e  llowed, but no n
09a0: 65 77 20 63 61 6c 6c 62 61 63 6b 73 20 77 69 6c  ew callbacks wil
09b0: 6c 20 62 65 0a 20 20 2a 2a 20 69 73 73 75 65 64  l be.  ** issued
09c0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
09d0: 5f 69 6e 74 36 34 20 61 6c 61 72 6d 54 68 72 65  _int64 alarmThre
09e0: 73 68 6f 6c 64 3b 0a 20 20 76 6f 69 64 20 28 2a  shold;.  void (*
09f0: 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 29 28 76  alarmCallback)(v
0a00: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  oid*, sqlite3_in
0a10: 74 36 34 2c 69 6e 74 29 3b 0a 20 20 76 6f 69 64  t64,int);.  void
0a20: 20 2a 61 6c 61 72 6d 41 72 67 3b 0a 0a 20 20 2f   *alarmArg;..  /
0a30: 2a 0a 20 20 2a 2a 20 50 6f 69 6e 74 65 72 73 20  *.  ** Pointers 
0a40: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 73 71  to the end of sq
0a50: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0a60: 67 2e 70 53 63 72 61 74 63 68 20 6d 65 6d 6f 72  g.pScratch memor
0a70: 79 0a 20 20 2a 2a 20 28 73 6f 20 74 68 61 74 20  y.  ** (so that 
0a80: 61 20 72 61 6e 67 65 20 74 65 73 74 20 63 61 6e  a range test can
0a90: 20 62 65 20 75 73 65 64 20 74 6f 20 64 65 74 65   be used to dete
0aa0: 72 6d 69 6e 65 20 69 66 20 61 6e 20 61 6c 6c 6f  rmine if an allo
0ab0: 63 61 74 69 6f 6e 0a 20 20 2a 2a 20 62 65 69 6e  cation.  ** bein
0ac0: 67 20 66 72 65 65 64 20 63 61 6d 65 20 66 72 6f  g freed came fro
0ad0: 6d 20 70 53 63 72 61 74 63 68 29 20 61 6e 64 20  m pScratch) and 
0ae0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
0af0: 20 6c 69 73 74 20 6f 66 0a 20 20 2a 2a 20 75 6e   list of.  ** un
0b00: 75 73 65 64 20 73 63 72 61 74 63 68 20 61 6c 6c  used scratch all
0b10: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
0b20: 20 76 6f 69 64 20 2a 70 53 63 72 61 74 63 68 45   void *pScratchE
0b30: 6e 64 3b 0a 20 20 53 63 72 61 74 63 68 46 72 65  nd;.  ScratchFre
0b40: 65 73 6c 6f 74 20 2a 70 53 63 72 61 74 63 68 46  eslot *pScratchF
0b50: 72 65 65 3b 0a 20 20 75 33 32 20 6e 53 63 72 61  ree;.  u32 nScra
0b60: 74 63 68 46 72 65 65 3b 0a 0a 20 20 2f 2a 0a 20  tchFree;..  /*. 
0b70: 20 2a 2a 20 54 72 75 65 20 69 66 20 68 65 61 70   ** True if heap
0b80: 20 69 73 20 6e 65 61 72 6c 79 20 22 66 75 6c 6c   is nearly "full
0b90: 22 20 77 68 65 72 65 20 22 66 75 6c 6c 22 20 69  " where "full" i
0ba0: 73 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65  s defined by the
0bb0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f  .  ** sqlite3_so
0bc0: 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 29 20  ft_heap_limit() 
0bd0: 73 65 74 74 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  setting..  */.  
0be0: 69 6e 74 20 6e 65 61 72 6c 79 46 75 6c 6c 3b 0a  int nearlyFull;.
0bf0: 7d 20 6d 65 6d 30 20 3d 20 7b 20 30 2c 20 30 2c  } mem0 = { 0, 0,
0c00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
0c10: 3b 0a 0a 23 64 65 66 69 6e 65 20 6d 65 6d 30 20  ;..#define mem0 
0c20: 47 4c 4f 42 41 4c 28 73 74 72 75 63 74 20 4d 65  GLOBAL(struct Me
0c30: 6d 30 47 6c 6f 62 61 6c 2c 20 6d 65 6d 30 29 0a  m0Global, mem0).
0c40: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0c50: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
0c60: 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65  ocation subsyste
0c70: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
0c80: 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 76 6f 69 64  3MallocInit(void
0c90: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
0ca0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
0cb0: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20  Malloc==0 ){.   
0cc0: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
0cd0: 66 61 75 6c 74 28 29 3b 0a 20 20 7d 0a 20 20 6d  fault();.  }.  m
0ce0: 65 6d 73 65 74 28 26 6d 65 6d 30 2c 20 30 2c 20  emset(&mem0, 0, 
0cf0: 73 69 7a 65 6f 66 28 6d 65 6d 30 29 29 3b 0a 20  sizeof(mem0));. 
0d00: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
0d10: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
0d20: 74 65 78 20 29 7b 0a 20 20 20 20 6d 65 6d 30 2e  tex ){.    mem0.
0d30: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
0d40: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
0d50: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
0d60: 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  M);.  }.  if( sq
0d70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0d80: 67 2e 70 53 63 72 61 74 63 68 20 26 26 20 73 71  g.pScratch && sq
0d90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0da0: 67 2e 73 7a 53 63 72 61 74 63 68 3e 3d 31 30 30  g.szScratch>=100
0db0: 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  .      && sqlite
0dc0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53  3GlobalConfig.nS
0dd0: 63 72 61 74 63 68 3e 3d 30 20 29 7b 0a 20 20 20  cratch>=0 ){.   
0de0: 20 69 6e 74 20 69 2c 20 6e 2c 20 73 7a 3b 0a 20   int i, n, sz;. 
0df0: 20 20 20 53 63 72 61 74 63 68 46 72 65 65 73 6c     ScratchFreesl
0e00: 6f 74 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73  ot *pSlot;.    s
0e10: 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73  z = ROUNDDOWN8(s
0e20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
0e30: 69 67 2e 73 7a 53 63 72 61 74 63 68 29 3b 0a 20  ig.szScratch);. 
0e40: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
0e50: 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68  Config.szScratch
0e60: 20 3d 20 73 7a 3b 0a 20 20 20 20 70 53 6c 6f 74   = sz;.    pSlot
0e70: 20 3d 20 28 53 63 72 61 74 63 68 46 72 65 65 73   = (ScratchFrees
0e80: 6c 6f 74 2a 29 73 71 6c 69 74 65 33 47 6c 6f 62  lot*)sqlite3Glob
0e90: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
0ea0: 68 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  h;.    n = sqlit
0eb0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
0ec0: 53 63 72 61 74 63 68 3b 0a 20 20 20 20 6d 65 6d  Scratch;.    mem
0ed0: 30 2e 70 53 63 72 61 74 63 68 46 72 65 65 20 3d  0.pScratchFree =
0ee0: 20 70 53 6c 6f 74 3b 0a 20 20 20 20 6d 65 6d 30   pSlot;.    mem0
0ef0: 2e 6e 53 63 72 61 74 63 68 46 72 65 65 20 3d 20  .nScratchFree = 
0f00: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
0f10: 69 3c 6e 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<n-1; i++){.   
0f20: 20 20 20 70 53 6c 6f 74 2d 3e 70 4e 65 78 74 20     pSlot->pNext 
0f30: 3d 20 28 53 63 72 61 74 63 68 46 72 65 65 73 6c  = (ScratchFreesl
0f40: 6f 74 2a 29 28 73 7a 2b 28 63 68 61 72 2a 29 70  ot*)(sz+(char*)p
0f50: 53 6c 6f 74 29 3b 0a 20 20 20 20 20 20 70 53 6c  Slot);.      pSl
0f60: 6f 74 20 3d 20 70 53 6c 6f 74 2d 3e 70 4e 65 78  ot = pSlot->pNex
0f70: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 6c  t;.    }.    pSl
0f80: 6f 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ot->pNext = 0;. 
0f90: 20 20 20 6d 65 6d 30 2e 70 53 63 72 61 74 63 68     mem0.pScratch
0fa0: 45 6e 64 20 3d 20 28 76 6f 69 64 2a 29 26 70 53  End = (void*)&pS
0fb0: 6c 6f 74 5b 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b  lot[1];.  }else{
0fc0: 0a 20 20 20 20 6d 65 6d 30 2e 70 53 63 72 61 74  .    mem0.pScrat
0fd0: 63 68 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 73  chEnd = 0;.    s
0fe0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
0ff0: 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20 30 3b  ig.pScratch = 0;
1000: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1010: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  alConfig.szScrat
1020: 63 68 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ch = 0;.    sqli
1030: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1040: 6e 53 63 72 61 74 63 68 20 3d 20 30 3b 0a 20 20  nScratch = 0;.  
1050: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
1060: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
1070: 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47  e==0 || sqlite3G
1080: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
1090: 67 65 3c 35 31 32 0a 20 20 20 20 20 20 7c 7c 20  ge<512.      || 
10a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
10b0: 66 69 67 2e 6e 50 61 67 65 3c 31 20 29 7b 0a 20  fig.nPage<1 ){. 
10c0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
10d0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 30  Config.pPage = 0
10e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
10f0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
1100: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1110: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
1120: 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
1130: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 6c 6f  eturn sqlite3Glo
1140: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 49 6e 69  balConfig.m.xIni
1150: 74 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  t(sqlite3GlobalC
1160: 6f 6e 66 69 67 2e 6d 2e 70 41 70 70 44 61 74 61  onfig.m.pAppData
1170: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1180: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 68  rn true if the h
1190: 65 61 70 20 69 73 20 63 75 72 72 65 6e 74 6c 79  eap is currently
11a0: 20 75 6e 64 65 72 20 6d 65 6d 6f 72 79 20 70 72   under memory pr
11b0: 65 73 73 75 72 65 20 2d 20 69 6e 20 6f 74 68 65  essure - in othe
11c0: 72 0a 2a 2a 20 77 6f 72 64 73 20 69 66 20 74 68  r.** words if th
11d0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 68 65 61 70  e amount of heap
11e0: 20 75 73 65 64 20 69 73 20 63 6c 6f 73 65 20 74   used is close t
11f0: 6f 20 74 68 65 20 6c 69 6d 69 74 20 73 65 74 20  o the limit set 
1200: 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f  by.** sqlite3_so
1210: 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 29 2e  ft_heap_limit().
1220: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 48  .*/.int sqlite3H
1230: 65 61 70 4e 65 61 72 6c 79 46 75 6c 6c 28 76 6f  eapNearlyFull(vo
1240: 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 6d 65  id){.  return me
1250: 6d 30 2e 6e 65 61 72 6c 79 46 75 6c 6c 3b 0a 7d  m0.nearlyFull;.}
1260: 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61  ../*.** Deinitia
1270: 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
1280: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79  allocation subsy
1290: 73 74 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  stem..*/.void sq
12a0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 76  lite3MallocEnd(v
12b0: 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  oid){.  if( sqli
12c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
12d0: 6d 2e 78 53 68 75 74 64 6f 77 6e 20 29 7b 0a 20  m.xShutdown ){. 
12e0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
12f0: 43 6f 6e 66 69 67 2e 6d 2e 78 53 68 75 74 64 6f  Config.m.xShutdo
1300: 77 6e 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  wn(sqlite3Global
1310: 43 6f 6e 66 69 67 2e 6d 2e 70 41 70 70 44 61 74  Config.m.pAppDat
1320: 61 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  a);.  }.  memset
1330: 28 26 6d 65 6d 30 2c 20 30 2c 20 73 69 7a 65 6f  (&mem0, 0, sizeo
1340: 66 28 6d 65 6d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  f(mem0));.}../*.
1350: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  ** Return the am
1360: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63  ount of memory c
1370: 75 72 72 65 6e 74 6c 79 20 63 68 65 63 6b 65 64  urrently checked
1380: 20 6f 75 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33   out..*/.sqlite3
1390: 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6d  _int64 sqlite3_m
13a0: 65 6d 6f 72 79 5f 75 73 65 64 28 76 6f 69 64 29  emory_used(void)
13b0: 7b 0a 20 20 69 6e 74 20 6e 2c 20 6d 78 3b 0a 20  {.  int n, mx;. 
13c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 72   sqlite3_int64 r
13d0: 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  es;.  sqlite3_st
13e0: 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54  atus(SQLITE_STAT
13f0: 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20  US_MEMORY_USED, 
1400: 26 6e 2c 20 26 6d 78 2c 20 30 29 3b 0a 20 20 72  &n, &mx, 0);.  r
1410: 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  es = (sqlite3_in
1420: 74 36 34 29 6e 3b 20 20 2f 2a 20 57 6f 72 6b 20  t64)n;  /* Work 
1430: 61 72 6f 75 6e 64 20 62 75 67 20 69 6e 20 42 6f  around bug in Bo
1440: 72 6c 61 6e 64 20 43 2e 20 54 69 63 6b 65 74 20  rland C. Ticket 
1450: 23 33 32 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  #3216 */.  retur
1460: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
1470: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  Return the maxim
1480: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  um amount of mem
1490: 6f 72 79 20 74 68 61 74 20 68 61 73 20 65 76 65  ory that has eve
14a0: 72 20 62 65 65 6e 0a 2a 2a 20 63 68 65 63 6b 65  r been.** checke
14b0: 64 20 6f 75 74 20 73 69 6e 63 65 20 65 69 74 68  d out since eith
14c0: 65 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  er the beginning
14d0: 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 73 73   of this process
14e0: 0a 2a 2a 20 6f 72 20 73 69 6e 63 65 20 74 68 65  .** or since the
14f0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 72 65 73   most recent res
1500: 65 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  et..*/.sqlite3_i
1510: 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6d 65 6d  nt64 sqlite3_mem
1520: 6f 72 79 5f 68 69 67 68 77 61 74 65 72 28 69 6e  ory_highwater(in
1530: 74 20 72 65 73 65 74 46 6c 61 67 29 7b 0a 20 20  t resetFlag){.  
1540: 69 6e 74 20 6e 2c 20 6d 78 3b 0a 20 20 73 71 6c  int n, mx;.  sql
1550: 69 74 65 33 5f 69 6e 74 36 34 20 72 65 73 3b 0a  ite3_int64 res;.
1560: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
1570: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
1580: 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 6e 2c 20  EMORY_USED, &n, 
1590: 26 6d 78 2c 20 72 65 73 65 74 46 6c 61 67 29 3b  &mx, resetFlag);
15a0: 0a 20 20 72 65 73 20 3d 20 28 73 71 6c 69 74 65  .  res = (sqlite
15b0: 33 5f 69 6e 74 36 34 29 6d 78 3b 20 20 2f 2a 20  3_int64)mx;  /* 
15c0: 57 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 20  Work around bug 
15d0: 69 6e 20 42 6f 72 6c 61 6e 64 20 43 2e 20 54 69  in Borland C. Ti
15e0: 63 6b 65 74 20 23 33 32 31 36 20 2a 2f 0a 20 20  cket #3216 */.  
15f0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1600: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1610: 61 6c 61 72 6d 20 63 61 6c 6c 62 61 63 6b 0a 2a  alarm callback.*
1620: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  /.int sqlite3Mem
1630: 6f 72 79 41 6c 61 72 6d 28 0a 20 20 76 6f 69 64  oryAlarm(.  void
1640: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
1650: 64 20 2a 70 41 72 67 2c 20 73 71 6c 69 74 65 33  d *pArg, sqlite3
1660: 5f 69 6e 74 36 34 20 75 73 65 64 2c 69 6e 74 20  _int64 used,int 
1670: 4e 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  N),.  void *pArg
1680: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
1690: 34 20 69 54 68 72 65 73 68 6f 6c 64 0a 29 7b 0a  4 iThreshold.){.
16a0: 20 20 69 6e 74 20 6e 55 73 65 64 3b 0a 20 20 73    int nUsed;.  s
16b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
16c0: 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a  er(mem0.mutex);.
16d0: 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c    mem0.alarmCall
16e0: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
16f0: 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 41 72  ;.  mem0.alarmAr
1700: 67 20 3d 20 70 41 72 67 3b 0a 20 20 6d 65 6d 30  g = pArg;.  mem0
1710: 2e 61 6c 61 72 6d 54 68 72 65 73 68 6f 6c 64 20  .alarmThreshold 
1720: 3d 20 69 54 68 72 65 73 68 6f 6c 64 3b 0a 20 20  = iThreshold;.  
1730: 6e 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 53  nUsed = sqlite3S
1740: 74 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49 54  tatusValue(SQLIT
1750: 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
1760: 55 53 45 44 29 3b 0a 20 20 6d 65 6d 30 2e 6e 65  USED);.  mem0.ne
1770: 61 72 6c 79 46 75 6c 6c 20 3d 20 28 69 54 68 72  arlyFull = (iThr
1780: 65 73 68 6f 6c 64 3e 30 20 26 26 20 69 54 68 72  eshold>0 && iThr
1790: 65 73 68 6f 6c 64 3c 3d 6e 55 73 65 64 29 3b 0a  eshold<=nUsed);.
17a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17b0: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
17c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
17e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
17f0: 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 44  PRECATED./*.** D
1800: 65 70 72 65 63 61 74 65 64 20 65 78 74 65 72 6e  eprecated extern
1810: 61 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 49  al interface.  I
1820: 6e 74 65 72 6e 61 6c 2f 63 6f 72 65 20 53 51 4c  nternal/core SQL
1830: 69 74 65 20 63 6f 64 65 0a 2a 2a 20 73 68 6f 75  ite code.** shou
1840: 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4d  ld call sqlite3M
1850: 65 6d 6f 72 79 41 6c 61 72 6d 2e 0a 2a 2f 0a 69  emoryAlarm..*/.i
1860: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  nt sqlite3_memor
1870: 79 5f 61 6c 61 72 6d 28 0a 20 20 76 6f 69 64 28  y_alarm(.  void(
1880: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
1890: 20 2a 70 41 72 67 2c 20 73 71 6c 69 74 65 33 5f   *pArg, sqlite3_
18a0: 69 6e 74 36 34 20 75 73 65 64 2c 69 6e 74 20 4e  int64 used,int N
18b0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c  ),.  void *pArg,
18c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
18d0: 20 69 54 68 72 65 73 68 6f 6c 64 0a 29 7b 0a 20   iThreshold.){. 
18e0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d   return sqlite3M
18f0: 65 6d 6f 72 79 41 6c 61 72 6d 28 78 43 61 6c 6c  emoryAlarm(xCall
1900: 62 61 63 6b 2c 20 70 41 72 67 2c 20 69 54 68 72  back, pArg, iThr
1910: 65 73 68 6f 6c 64 29 3b 0a 7d 0a 23 65 6e 64 69  eshold);.}.#endi
1920: 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72  f../*.** Trigger
1930: 20 74 68 65 20 61 6c 61 72 6d 20 0a 2a 2f 0a 73   the alarm .*/.s
1940: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1950: 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 69 6e  e3MallocAlarm(in
1960: 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64  t nByte){.  void
1970: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
1980: 69 64 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  id*,sqlite3_int6
1990: 34 2c 69 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65  4,int);.  sqlite
19a0: 33 5f 69 6e 74 36 34 20 6e 6f 77 55 73 65 64 3b  3_int64 nowUsed;
19b0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 3b 0a 20  .  void *pArg;. 
19c0: 20 69 66 28 20 6d 65 6d 30 2e 61 6c 61 72 6d 43   if( mem0.alarmC
19d0: 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 20 72 65 74  allback==0 ) ret
19e0: 75 72 6e 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b  urn;.  xCallback
19f0: 20 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c   = mem0.alarmCal
1a00: 6c 62 61 63 6b 3b 0a 20 20 6e 6f 77 55 73 65 64  lback;.  nowUsed
1a10: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 75 73   = sqlite3Status
1a20: 56 61 6c 75 65 28 53 51 4c 49 54 45 5f 53 54 41  Value(SQLITE_STA
1a30: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 29  TUS_MEMORY_USED)
1a40: 3b 0a 20 20 70 41 72 67 20 3d 20 6d 65 6d 30 2e  ;.  pArg = mem0.
1a50: 61 6c 61 72 6d 41 72 67 3b 0a 20 20 6d 65 6d 30  alarmArg;.  mem0
1a60: 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20 3d  .alarmCallback =
1a70: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
1a80: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d  tex_leave(mem0.m
1a90: 75 74 65 78 29 3b 0a 20 20 78 43 61 6c 6c 62 61  utex);.  xCallba
1aa0: 63 6b 28 70 41 72 67 2c 20 6e 6f 77 55 73 65 64  ck(pArg, nowUsed
1ab0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 73 71 6c 69  , nByte);.  sqli
1ac0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1ad0: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 6d  mem0.mutex);.  m
1ae0: 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63  em0.alarmCallbac
1af0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
1b00: 20 6d 65 6d 30 2e 61 6c 61 72 6d 41 72 67 20 3d   mem0.alarmArg =
1b10: 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pArg;.}../*.** 
1b20: 44 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  Do a memory allo
1b30: 63 61 74 69 6f 6e 20 77 69 74 68 20 73 74 61 74  cation with stat
1b40: 69 73 74 69 63 73 20 61 6e 64 20 61 6c 61 72 6d  istics and alarm
1b50: 73 2e 20 20 41 73 73 75 6d 65 20 74 68 65 0a 2a  s.  Assume the.*
1b60: 2a 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  * lock is alread
1b70: 79 20 68 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69  y held..*/.stati
1b80: 63 20 69 6e 74 20 6d 61 6c 6c 6f 63 57 69 74 68  c int mallocWith
1b90: 41 6c 61 72 6d 28 69 6e 74 20 6e 2c 20 76 6f 69  Alarm(int n, voi
1ba0: 64 20 2a 2a 70 70 29 7b 0a 20 20 69 6e 74 20 6e  d **pp){.  int n
1bb0: 46 75 6c 6c 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Full;.  void *p;
1bc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1bd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65  e3_mutex_held(me
1be0: 6d 30 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  m0.mutex) );.  n
1bf0: 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 6c  Full = sqlite3Gl
1c00: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 6f  obalConfig.m.xRo
1c10: 75 6e 64 75 70 28 6e 29 3b 0a 20 20 73 71 6c 69  undup(n);.  sqli
1c20: 74 65 33 53 74 61 74 75 73 53 65 74 28 53 51 4c  te3StatusSet(SQL
1c30: 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
1c40: 43 5f 53 49 5a 45 2c 20 6e 29 3b 0a 20 20 69 66  C_SIZE, n);.  if
1c50: 28 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c  ( mem0.alarmCall
1c60: 62 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 69  back!=0 ){.    i
1c70: 6e 74 20 6e 55 73 65 64 20 3d 20 73 71 6c 69 74  nt nUsed = sqlit
1c80: 65 33 53 74 61 74 75 73 56 61 6c 75 65 28 53 51  e3StatusValue(SQ
1c90: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f  LITE_STATUS_MEMO
1ca0: 52 59 5f 55 53 45 44 29 3b 0a 20 20 20 20 69 66  RY_USED);.    if
1cb0: 28 20 6e 55 73 65 64 2b 6e 46 75 6c 6c 20 3e 3d  ( nUsed+nFull >=
1cc0: 20 6d 65 6d 30 2e 61 6c 61 72 6d 54 68 72 65 73   mem0.alarmThres
1cd0: 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 6d 65  hold ){.      me
1ce0: 6d 30 2e 6e 65 61 72 6c 79 46 75 6c 6c 20 3d 20  m0.nearlyFull = 
1cf0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
1d00: 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 46 75 6c  MallocAlarm(nFul
1d10: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
1d20: 20 20 20 20 20 6d 65 6d 30 2e 6e 65 61 72 6c 79       mem0.nearly
1d30: 46 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Full = 0;.    }.
1d40: 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    }.  p = sqlite
1d50: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
1d60: 78 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 29 3b 0a  xMalloc(nFull);.
1d70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1d80: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
1d90: 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 70 3d 3d  GEMENT.  if( p==
1da0: 30 20 26 26 20 6d 65 6d 30 2e 61 6c 61 72 6d 43  0 && mem0.alarmC
1db0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  allback ){.    s
1dc0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72  qlite3MallocAlar
1dd0: 6d 28 6e 46 75 6c 6c 29 3b 0a 20 20 20 20 70 20  m(nFull);.    p 
1de0: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
1df0: 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28  onfig.m.xMalloc(
1e00: 6e 46 75 6c 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  nFull);.  }.#end
1e10: 69 66 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  if.  if( p ){.  
1e20: 20 20 6e 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65    nFull = sqlite
1e30: 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 29 3b 0a  3MallocSize(p);.
1e40: 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75      sqlite3Statu
1e50: 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54  sAdd(SQLITE_STAT
1e60: 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20  US_MEMORY_USED, 
1e70: 6e 46 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  nFull);.    sqli
1e80: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
1e90: 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
1ea0: 43 5f 43 4f 55 4e 54 2c 20 31 29 3b 0a 20 20 7d  C_COUNT, 1);.  }
1eb0: 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65  .  *pp = p;.  re
1ec0: 74 75 72 6e 20 6e 46 75 6c 6c 3b 0a 7d 0a 0a 2f  turn nFull;.}../
1ed0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65  *.** Allocate me
1ee0: 6d 6f 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74  mory.  This rout
1ef0: 69 6e 65 20 69 73 20 6c 69 6b 65 20 73 71 6c 69  ine is like sqli
1f00: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 65 78 63  te3_malloc() exc
1f10: 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 61  ept that it.** a
1f20: 73 73 75 6d 65 73 20 74 68 65 20 6d 65 6d 6f 72  ssumes the memor
1f30: 79 20 73 75 62 73 79 73 74 65 6d 20 68 61 73 20  y subsystem has 
1f40: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69  already been ini
1f50: 74 69 61 6c 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69  tialized..*/.voi
1f60: 64 20 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  d *sqlite3Malloc
1f70: 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20  (int n){.  void 
1f80: 2a 70 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 7c  *p;.  if( n<=0 |
1f90: 7c 20 6e 3e 3d 30 78 37 66 66 66 66 66 30 30 20  | n>=0x7fffff00 
1fa0: 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 65 6d 6f  ){.    /* A memo
1fb0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  ry allocation of
1fc0: 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74   a number of byt
1fd0: 65 73 20 77 68 69 63 68 20 69 73 20 6e 65 61 72  es which is near
1fe0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20   the maximum.   
1ff0: 20 2a 2a 20 73 69 67 6e 65 64 20 69 6e 74 65 67   ** signed integ
2000: 65 72 20 76 61 6c 75 65 20 6d 69 67 68 74 20 63  er value might c
2010: 61 75 73 65 20 61 6e 20 69 6e 74 65 67 65 72 20  ause an integer 
2020: 6f 76 65 72 66 6c 6f 77 20 69 6e 73 69 64 65 20  overflow inside 
2030: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 78 4d  of the.    ** xM
2040: 61 6c 6c 6f 63 28 29 2e 20 20 48 65 6e 63 65 20  alloc().  Hence 
2050: 77 65 20 6c 69 6d 69 74 20 74 68 65 20 6d 61 78  we limit the max
2060: 69 6d 75 6d 20 73 69 7a 65 20 74 6f 20 30 78 37  imum size to 0x7
2070: 66 66 66 66 66 30 30 2c 20 67 69 76 69 6e 67 0a  fffff00, giving.
2080: 20 20 20 20 2a 2a 20 32 35 35 20 62 79 74 65 73      ** 255 bytes
2090: 20 6f 66 20 6f 76 65 72 68 65 61 64 2e 20 20 53   of overhead.  S
20a0: 51 4c 69 74 65 20 69 74 73 65 6c 66 20 77 69 6c  QLite itself wil
20b0: 6c 20 6e 65 76 65 72 20 75 73 65 20 61 6e 79 74  l never use anyt
20c0: 68 69 6e 67 20 6e 65 61 72 0a 20 20 20 20 2a 2a  hing near.    **
20d0: 20 74 68 69 73 20 61 6d 6f 75 6e 74 2e 20 20 54   this amount.  T
20e0: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72  he only way to r
20f0: 65 61 63 68 20 74 68 65 20 6c 69 6d 69 74 20 69  each the limit i
2100: 73 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 6d  s with sqlite3_m
2110: 61 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 70  alloc() */.    p
2120: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
2130: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2140: 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29  onfig.bMemstat )
2150: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
2160: 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d  tex_enter(mem0.m
2170: 75 74 65 78 29 3b 0a 20 20 20 20 6d 61 6c 6c 6f  utex);.    mallo
2180: 63 57 69 74 68 41 6c 61 72 6d 28 6e 2c 20 26 70  cWithAlarm(n, &p
2190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
21a0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e  utex_leave(mem0.
21b0: 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b  mutex);.  }else{
21c0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
21d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
21e0: 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d 0a 20  Malloc(n);.  }. 
21f0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2200: 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
2210: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   of the memory a
2220: 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 66 6f 72  llocation is for
2230: 20 75 73 65 20 62 79 20 74 68 65 20 61 70 70 6c   use by the appl
2240: 69 63 61 74 69 6f 6e 2e 0a 2a 2a 20 46 69 72 73  ication..** Firs
2250: 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  t make sure the 
2260: 6d 65 6d 6f 72 79 20 73 75 62 73 79 73 74 65 6d  memory subsystem
2270: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c   is initialized,
2280: 20 74 68 65 6e 20 64 6f 20 74 68 65 0a 2a 2a 20   then do the.** 
2290: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  allocation..*/.v
22a0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 6d 61 6c  oid *sqlite3_mal
22b0: 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 23 69 66 6e  loc(int n){.#ifn
22c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22d0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73  AUTOINIT.  if( s
22e0: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
22f0: 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  e() ) return 0;.
2300: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2310: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 29  sqlite3Malloc(n)
2320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ;.}../*.** Each 
2330: 74 68 72 65 61 64 20 6d 61 79 20 6f 6e 6c 79 20  thread may only 
2340: 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 75  have a single ou
2350: 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61  tstanding alloca
2360: 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 78 53 63  tion from.** xSc
2370: 72 61 74 63 68 4d 61 6c 6c 6f 63 28 29 2e 20 20  ratchMalloc().  
2380: 57 65 20 76 65 72 69 66 79 20 74 68 69 73 20 63  We verify this c
2390: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
23a0: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
23b0: 0a 2a 2a 20 63 61 73 65 20 62 79 20 73 65 74 74  .** case by sett
23c0: 69 6e 67 20 73 63 72 61 74 63 68 41 6c 6c 6f 63  ing scratchAlloc
23d0: 4f 75 74 20 74 6f 20 31 20 77 68 65 6e 20 61 6e  Out to 1 when an
23e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 69   allocation.** i
23f0: 73 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 6c  s outstanding cl
2400: 65 61 72 69 6e 67 20 69 74 20 77 68 65 6e 20 74  earing it when t
2410: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
2420: 20 66 72 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53   freed..*/.#if S
2430: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2440: 3d 3d 30 20 26 26 20 21 64 65 66 69 6e 65 64 28  ==0 && !defined(
2450: 4e 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 69  NDEBUG).static i
2460: 6e 74 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f  nt scratchAllocO
2470: 75 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ut = 0;.#endif..
2480: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2490: 6d 65 6d 6f 72 79 20 74 68 61 74 20 69 73 20 74  memory that is t
24a0: 6f 20 62 65 20 75 73 65 64 20 61 6e 64 20 72 65  o be used and re
24b0: 6c 65 61 73 65 64 20 72 69 67 68 74 20 61 77 61  leased right awa
24c0: 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  y..** This routi
24d0: 6e 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ne is similar to
24e0: 20 61 6c 6c 6f 63 61 28 29 20 69 6e 20 74 68 61   alloca() in tha
24f0: 74 20 69 74 20 69 73 20 6e 6f 74 20 69 6e 74 65  t it is not inte
2500: 6e 64 65 64 0a 2a 2a 20 66 6f 72 20 73 69 74 75  nded.** for situ
2510: 61 74 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  ations where the
2520: 20 6d 65 6d 6f 72 79 20 6d 69 67 68 74 20 62 65   memory might be
2530: 20 68 65 6c 64 20 6c 6f 6e 67 2d 74 65 72 6d 2e   held long-term.
2540: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
2550: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
2560: 20 67 65 74 20 6d 65 6d 6f 72 79 20 74 6f 20 6f   get memory to o
2570: 6c 64 20 6c 61 72 67 65 20 74 72 61 6e 73 69 65  ld large transie
2580: 6e 74 20 64 61 74 61 0a 2a 2a 20 73 74 72 75 63  nt data.** struc
2590: 74 75 72 65 73 20 74 68 61 74 20 77 6f 75 6c 64  tures that would
25a0: 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 66 69   not normally fi
25b0: 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 6f  t on the stack o
25c0: 66 20 61 6e 0a 2a 2a 20 65 6d 62 65 64 64 65 64  f an.** embedded
25d0: 20 70 72 6f 63 65 73 73 6f 72 2e 0a 2a 2f 0a 76   processor..*/.v
25e0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 53 63 72 61  oid *sqlite3Scra
25f0: 74 63 68 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29  tchMalloc(int n)
2600: 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 61  {.  void *p;.  a
2610: 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 0a 20  ssert( n>0 );.. 
2620: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2630: 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29  nter(mem0.mutex)
2640: 3b 0a 20 20 69 66 28 20 6d 65 6d 30 2e 6e 53 63  ;.  if( mem0.nSc
2650: 72 61 74 63 68 46 72 65 65 20 26 26 20 73 71 6c  ratchFree && sql
2660: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2670: 2e 73 7a 53 63 72 61 74 63 68 3e 3d 6e 20 29 7b  .szScratch>=n ){
2680: 0a 20 20 20 20 70 20 3d 20 6d 65 6d 30 2e 70 53  .    p = mem0.pS
2690: 63 72 61 74 63 68 46 72 65 65 3b 0a 20 20 20 20  cratchFree;.    
26a0: 6d 65 6d 30 2e 70 53 63 72 61 74 63 68 46 72 65  mem0.pScratchFre
26b0: 65 20 3d 20 6d 65 6d 30 2e 70 53 63 72 61 74 63  e = mem0.pScratc
26c0: 68 46 72 65 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  hFree->pNext;.  
26d0: 20 20 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46    mem0.nScratchF
26e0: 72 65 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  ree--;.    sqlit
26f0: 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49  e3StatusAdd(SQLI
2700: 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43  TE_STATUS_SCRATC
2710: 48 5f 55 53 45 44 2c 20 31 29 3b 0a 20 20 20 20  H_USED, 1);.    
2720: 73 71 6c 69 74 65 33 53 74 61 74 75 73 53 65 74  sqlite3StatusSet
2730: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53  (SQLITE_STATUS_S
2740: 43 52 41 54 43 48 5f 53 49 5a 45 2c 20 6e 29 3b  CRATCH_SIZE, n);
2750: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
2760: 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75  ex_leave(mem0.mu
2770: 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tex);.  }else{. 
2780: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
2790: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  obalConfig.bMems
27a0: 74 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tat ){.      sql
27b0: 69 74 65 33 53 74 61 74 75 73 53 65 74 28 53 51  ite3StatusSet(SQ
27c0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41  LITE_STATUS_SCRA
27d0: 54 43 48 5f 53 49 5a 45 2c 20 6e 29 3b 0a 20 20  TCH_SIZE, n);.  
27e0: 20 20 20 20 6e 20 3d 20 6d 61 6c 6c 6f 63 57 69      n = mallocWi
27f0: 74 68 41 6c 61 72 6d 28 6e 2c 20 26 70 29 3b 0a  thAlarm(n, &p);.
2800: 20 20 20 20 20 20 69 66 28 20 70 20 29 20 73 71        if( p ) sq
2810: 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53  lite3StatusAdd(S
2820: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52  QLITE_STATUS_SCR
2830: 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57 2c 20 6e  ATCH_OVERFLOW, n
2840: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2850: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
2860: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 65  0.mutex);.    }e
2870: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2880: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
2890: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20  em0.mutex);.    
28a0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f    p = sqlite3Glo
28b0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c  balConfig.m.xMal
28c0: 6c 6f 63 28 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  loc(n);.    }.  
28d0: 20 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75    sqlite3Memdebu
28e0: 67 53 65 74 54 79 70 65 28 70 2c 20 4d 45 4d 54  gSetType(p, MEMT
28f0: 59 50 45 5f 53 43 52 41 54 43 48 29 3b 0a 20 20  YPE_SCRATCH);.  
2900: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  }.  assert( !sql
2910: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2920: 6d 65 6d 30 2e 6d 75 74 65 78 29 20 29 3b 0a 0a  mem0.mutex) );..
2930: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2940: 41 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65  ADSAFE==0 && !de
2950: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20  fined(NDEBUG).  
2960: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 6e  /* Verify that n
2970: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 77 6f 20  o more than two 
2980: 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69  scratch allocati
2990: 6f 6e 73 20 70 65 72 20 74 68 72 65 61 64 0a 20  ons per thread. 
29a0: 20 2a 2a 20 61 72 65 20 6f 75 74 73 74 61 6e 64   ** are outstand
29b0: 69 6e 67 20 61 74 20 6f 6e 65 20 74 69 6d 65 2e  ing at one time.
29c0: 20 20 28 54 68 69 73 20 69 73 20 6f 6e 6c 79 20    (This is only 
29d0: 63 68 65 63 6b 65 64 20 69 6e 20 74 68 65 0a 20  checked in the. 
29e0: 20 2a 2a 20 73 69 6e 67 6c 65 2d 74 68 72 65 61   ** single-threa
29f0: 64 65 64 20 63 61 73 65 20 73 69 6e 63 65 20 63  ded case since c
2a00: 68 65 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 6d  hecking in the m
2a10: 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 63 61  ulti-threaded ca
2a20: 73 65 0a 20 20 2a 2a 20 77 6f 75 6c 64 20 62 65  se.  ** would be
2a30: 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
2a40: 69 63 61 74 65 64 2e 29 20 2a 2f 0a 20 20 61 73  icated.) */.  as
2a50: 73 65 72 74 28 20 73 63 72 61 74 63 68 41 6c 6c  sert( scratchAll
2a60: 6f 63 4f 75 74 3c 3d 31 20 29 3b 0a 20 20 69 66  ocOut<=1 );.  if
2a70: 28 20 70 20 29 20 73 63 72 61 74 63 68 41 6c 6c  ( p ) scratchAll
2a80: 6f 63 4f 75 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ocOut++;.#endif.
2a90: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 76  .  return p;.}.v
2aa0: 6f 69 64 20 73 71 6c 69 74 65 33 53 63 72 61 74  oid sqlite3Scrat
2ab0: 63 68 46 72 65 65 28 76 6f 69 64 20 2a 70 29 7b  chFree(void *p){
2ac0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 0a 23 69 66  .  if( p ){..#if
2ad0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
2ae0: 46 45 3d 3d 30 20 26 26 20 21 64 65 66 69 6e 65  FE==0 && !define
2af0: 64 28 4e 44 45 42 55 47 29 0a 20 20 20 20 2f 2a  d(NDEBUG).    /*
2b00: 20 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20   Verify that no 
2b10: 6d 6f 72 65 20 74 68 61 6e 20 74 77 6f 20 73 63  more than two sc
2b20: 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  ratch allocation
2b30: 20 70 65 72 20 74 68 72 65 61 64 0a 20 20 20 20   per thread.    
2b40: 2a 2a 20 69 73 20 6f 75 74 73 74 61 6e 64 69 6e  ** is outstandin
2b50: 67 20 61 74 20 6f 6e 65 20 74 69 6d 65 2e 20 20  g at one time.  
2b60: 28 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 63 68  (This is only ch
2b70: 65 63 6b 65 64 20 69 6e 20 74 68 65 0a 20 20 20  ecked in the.   
2b80: 20 2a 2a 20 73 69 6e 67 6c 65 2d 74 68 72 65 61   ** single-threa
2b90: 64 65 64 20 63 61 73 65 20 73 69 6e 63 65 20 63  ded case since c
2ba0: 68 65 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 6d  hecking in the m
2bb0: 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 63 61  ulti-threaded ca
2bc0: 73 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  se.    ** would 
2bd0: 62 65 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  be much more com
2be0: 70 6c 69 63 61 74 65 64 2e 29 20 2a 2f 0a 20 20  plicated.) */.  
2bf0: 20 20 61 73 73 65 72 74 28 20 73 63 72 61 74 63    assert( scratc
2c00: 68 41 6c 6c 6f 63 4f 75 74 3e 3d 31 20 26 26 20  hAllocOut>=1 && 
2c10: 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 3c  scratchAllocOut<
2c20: 3d 32 20 29 3b 0a 20 20 20 20 73 63 72 61 74 63  =2 );.    scratc
2c30: 68 41 6c 6c 6f 63 4f 75 74 2d 2d 3b 0a 23 65 6e  hAllocOut--;.#en
2c40: 64 69 66 0a 0a 20 20 20 20 69 66 28 20 70 3e 3d  dif..    if( p>=
2c50: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2c60: 66 69 67 2e 70 53 63 72 61 74 63 68 20 26 26 20  fig.pScratch && 
2c70: 70 3c 6d 65 6d 30 2e 70 53 63 72 61 74 63 68 45  p<mem0.pScratchE
2c80: 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52  nd ){.      /* R
2c90: 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 66 72  elease memory fr
2ca0: 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 43 4f  om the SQLITE_CO
2cb0: 4e 46 49 47 5f 53 43 52 41 54 43 48 20 61 6c 6c  NFIG_SCRATCH all
2cc0: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ocation */.     
2cd0: 20 53 63 72 61 74 63 68 46 72 65 65 73 6c 6f 74   ScratchFreeslot
2ce0: 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 20 20 70   *pSlot;.      p
2cf0: 53 6c 6f 74 20 3d 20 28 53 63 72 61 74 63 68 46  Slot = (ScratchF
2d00: 72 65 65 73 6c 6f 74 2a 29 70 3b 0a 20 20 20 20  reeslot*)p;.    
2d10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2d20: 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78  enter(mem0.mutex
2d30: 29 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 2d 3e  );.      pSlot->
2d40: 70 4e 65 78 74 20 3d 20 6d 65 6d 30 2e 70 53 63  pNext = mem0.pSc
2d50: 72 61 74 63 68 46 72 65 65 3b 0a 20 20 20 20 20  ratchFree;.     
2d60: 20 6d 65 6d 30 2e 70 53 63 72 61 74 63 68 46 72   mem0.pScratchFr
2d70: 65 65 20 3d 20 70 53 6c 6f 74 3b 0a 20 20 20 20  ee = pSlot;.    
2d80: 20 20 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46    mem0.nScratchF
2d90: 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  ree++;.      ass
2da0: 65 72 74 28 20 6d 65 6d 30 2e 6e 53 63 72 61 74  ert( mem0.nScrat
2db0: 63 68 46 72 65 65 3c 3d 73 71 6c 69 74 65 33 47  chFree<=sqlite3G
2dc0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72  lobalConfig.nScr
2dd0: 61 74 63 68 20 29 3b 0a 20 20 20 20 20 20 73 71  atch );.      sq
2de0: 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53  lite3StatusAdd(S
2df0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52  QLITE_STATUS_SCR
2e00: 41 54 43 48 5f 55 53 45 44 2c 20 2d 31 29 3b 0a  ATCH_USED, -1);.
2e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
2e20: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d  tex_leave(mem0.m
2e30: 75 74 65 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  utex);.    }else
2e40: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61  {.      /* Relea
2e50: 73 65 20 6d 65 6d 6f 72 79 20 62 61 63 6b 20 74  se memory back t
2e60: 6f 20 74 68 65 20 68 65 61 70 20 2a 2f 0a 20 20  o the heap */.  
2e70: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2e80: 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79  te3MemdebugHasTy
2e90: 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 53 43  pe(p, MEMTYPE_SC
2ea0: 52 41 54 43 48 29 20 29 3b 0a 20 20 20 20 20 20  RATCH) );.      
2eb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d  assert( sqlite3M
2ec0: 65 6d 64 65 62 75 67 4e 6f 54 79 70 65 28 70 2c  emdebugNoType(p,
2ed0: 20 7e 4d 45 4d 54 59 50 45 5f 53 43 52 41 54 43   ~MEMTYPE_SCRATC
2ee0: 48 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  H) );.      sqli
2ef0: 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74 54 79  te3MemdebugSetTy
2f00: 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 48 45  pe(p, MEMTYPE_HE
2f10: 41 50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  AP);.      if( s
2f20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2f30: 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20  ig.bMemstat ){. 
2f40: 20 20 20 20 20 20 20 69 6e 74 20 69 53 69 7a 65         int iSize
2f50: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2f60: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20  Size(p);.       
2f70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2f80: 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29  nter(mem0.mutex)
2f90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fa0: 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54  3StatusAdd(SQLIT
2fb0: 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48  E_STATUS_SCRATCH
2fc0: 5f 4f 56 45 52 46 4c 4f 57 2c 20 2d 69 53 69 7a  _OVERFLOW, -iSiz
2fd0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2fe0: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
2ff0: 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
3000: 59 5f 55 53 45 44 2c 20 2d 69 53 69 7a 65 29 3b  Y_USED, -iSize);
3010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3020: 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54 45  StatusAdd(SQLITE
3030: 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43  _STATUS_MALLOC_C
3040: 4f 55 4e 54 2c 20 2d 31 29 3b 0a 20 20 20 20 20  OUNT, -1);.     
3050: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3060: 43 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70  Config.m.xFree(p
3070: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3080: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
3090: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20  em0.mutex);.    
30a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
30c0: 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b  nfig.m.xFree(p);
30d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 52 55 45   }.}../*.** TRUE
30f0: 20 69 66 20 70 20 69 73 20 61 20 6c 6f 6f 6b 61   if p is a looka
3100: 73 69 64 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  side memory allo
3110: 63 61 74 69 6f 6e 20 66 72 6f 6d 20 64 62 0a 2a  cation from db.*
3120: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
3130: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a  _OMIT_LOOKASIDE.
3140: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 6f 6f  static int isLoo
3150: 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a  kaside(sqlite3 *
3160: 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20  db, void *p){.  
3170: 72 65 74 75 72 6e 20 70 20 26 26 20 70 3e 3d 64  return p && p>=d
3180: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
3190: 61 72 74 20 26 26 20 70 3c 64 62 2d 3e 6c 6f 6f  art && p<db->loo
31a0: 6b 61 73 69 64 65 2e 70 45 6e 64 3b 0a 7d 0a 23  kaside.pEnd;.}.#
31b0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 69 73 4c  else.#define isL
31c0: 6f 6f 6b 61 73 69 64 65 28 41 2c 42 29 20 30 0a  ookaside(A,B) 0.
31d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
31e0: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
31f0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
3200: 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  tion previously 
3210: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
3220: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
3230: 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   or sqlite3_mall
3240: 6f 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oc()..*/.int sql
3250: 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 76  ite3MallocSize(v
3260: 6f 69 64 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  oid *p){.  asser
3270: 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  t( sqlite3Memdeb
3280: 75 67 48 61 73 54 79 70 65 28 70 2c 20 4d 45 4d  ugHasType(p, MEM
3290: 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20  TYPE_HEAP) );.  
32a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d  assert( sqlite3M
32b0: 65 6d 64 65 62 75 67 4e 6f 54 79 70 65 28 70 2c  emdebugNoType(p,
32c0: 20 4d 45 4d 54 59 50 45 5f 44 42 29 20 29 3b 0a   MEMTYPE_DB) );.
32d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
32e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
32f0: 53 69 7a 65 28 70 29 3b 0a 7d 0a 69 6e 74 20 73  Size(p);.}.int s
3300: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
3310: 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ze(sqlite3 *db, 
3320: 76 6f 69 64 20 2a 70 29 7b 0a 20 20 61 73 73 65  void *p){.  asse
3330: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
3340: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3350: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
3360: 69 66 28 20 64 62 20 26 26 20 69 73 4c 6f 6f 6b  if( db && isLook
3370: 61 73 69 64 65 28 64 62 2c 20 70 29 20 29 7b 0a  aside(db, p) ){.
3380: 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c      return db->l
3390: 6f 6f 6b 61 73 69 64 65 2e 73 7a 3b 0a 20 20 7d  ookaside.sz;.  }
33a0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
33b0: 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  ( sqlite3Memdebu
33c0: 67 48 61 73 54 79 70 65 28 70 2c 20 4d 45 4d 54  gHasType(p, MEMT
33d0: 59 50 45 5f 44 42 29 20 29 3b 0a 20 20 20 20 61  YPE_DB) );.    a
33e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65  ssert( sqlite3Me
33f0: 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 70 2c  mdebugHasType(p,
3400: 20 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 49   MEMTYPE_LOOKASI
3410: 44 45 7c 4d 45 4d 54 59 50 45 5f 48 45 41 50 29  DE|MEMTYPE_HEAP)
3420: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3430: 64 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db!=0 || sqlite3
3440: 4d 65 6d 64 65 62 75 67 4e 6f 54 79 70 65 28 70  MemdebugNoType(p
3450: 2c 20 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53  , MEMTYPE_LOOKAS
3460: 49 44 45 29 20 29 3b 0a 20 20 20 20 72 65 74 75  IDE) );.    retu
3470: 72 6e 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  rn sqlite3Global
3480: 43 6f 6e 66 69 67 2e 6d 2e 78 53 69 7a 65 28 70  Config.m.xSize(p
3490: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
34a0: 46 72 65 65 20 6d 65 6d 6f 72 79 20 70 72 65 76  Free memory prev
34b0: 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20  iously obtained 
34c0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  from sqlite3Mall
34d0: 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oc()..*/.void sq
34e0: 6c 69 74 65 33 5f 66 72 65 65 28 76 6f 69 64 20  lite3_free(void 
34f0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
3500: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
3510: 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  rt( sqlite3Memde
3520: 62 75 67 4e 6f 54 79 70 65 28 70 2c 20 4d 45 4d  bugNoType(p, MEM
3530: 54 59 50 45 5f 44 42 29 20 29 3b 0a 20 20 61 73  TYPE_DB) );.  as
3540: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d  sert( sqlite3Mem
3550: 64 65 62 75 67 48 61 73 54 79 70 65 28 70 2c 20  debugHasType(p, 
3560: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b  MEMTYPE_HEAP) );
3570: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
3580: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  obalConfig.bMems
3590: 74 61 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tat ){.    sqlit
35a0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
35b0: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20  em0.mutex);.    
35c0: 73 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 64  sqlite3StatusAdd
35d0: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
35e0: 45 4d 4f 52 59 5f 55 53 45 44 2c 20 2d 73 71 6c  EMORY_USED, -sql
35f0: 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  ite3MallocSize(p
3600: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ));.    sqlite3S
3610: 74 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f  tatusAdd(SQLITE_
3620: 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f  STATUS_MALLOC_CO
3630: 55 4e 54 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  UNT, -1);.    sq
3640: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3650: 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b 0a 20 20  g.m.xFree(p);.  
3660: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
3670: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
3680: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3690: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
36a0: 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b 0a  fig.m.xFree(p);.
36b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
36c0: 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 6d 69  e memory that mi
36d0: 67 68 74 20 62 65 20 61 73 73 6f 63 69 61 74 65  ght be associate
36e0: 64 20 77 69 74 68 20 61 20 70 61 72 74 69 63 75  d with a particu
36f0: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
3700: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
3710: 6f 69 64 20 73 71 6c 69 74 65 33 44 62 46 72 65  oid sqlite3DbFre
3720: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
3730: 6f 69 64 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  oid *p){.  asser
3740: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
3750: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
3760: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
3770: 66 28 20 64 62 20 29 7b 0a 20 20 20 20 69 66 28  f( db ){.    if(
3780: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
3790: 64 20 29 7b 0a 20 20 20 20 20 20 2a 64 62 2d 3e  d ){.      *db->
37a0: 70 6e 42 79 74 65 73 46 72 65 65 64 20 2b 3d 20  pnBytesFreed += 
37b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
37c0: 69 7a 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ize(db, p);.    
37d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
37e0: 20 20 20 20 69 66 28 20 69 73 4c 6f 6f 6b 61 73      if( isLookas
37f0: 69 64 65 28 64 62 2c 20 70 29 20 29 7b 0a 20 20  ide(db, p) ){.  
3800: 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f      LookasideSlo
3810: 74 20 2a 70 42 75 66 20 3d 20 28 4c 6f 6f 6b 61  t *pBuf = (Looka
3820: 73 69 64 65 53 6c 6f 74 2a 29 70 3b 0a 20 20 20  sideSlot*)p;.   
3830: 20 20 20 70 42 75 66 2d 3e 70 4e 65 78 74 20 3d     pBuf->pNext =
3840: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
3850: 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Free;.      db->
3860: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
3870: 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 64 62  = pBuf;.      db
3880: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74  ->lookaside.nOut
3890: 2d 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  --;.      return
38a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
38b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d  sert( sqlite3Mem
38c0: 64 65 62 75 67 48 61 73 54 79 70 65 28 70 2c 20  debugHasType(p, 
38d0: 4d 45 4d 54 59 50 45 5f 44 42 29 20 29 3b 0a 20  MEMTYPE_DB) );. 
38e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
38f0: 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28  MemdebugHasType(
3900: 70 2c 20 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41  p, MEMTYPE_LOOKA
3910: 53 49 44 45 7c 4d 45 4d 54 59 50 45 5f 48 45 41  SIDE|MEMTYPE_HEA
3920: 50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  P) );.  assert( 
3930: 64 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db!=0 || sqlite3
3940: 4d 65 6d 64 65 62 75 67 4e 6f 54 79 70 65 28 70  MemdebugNoType(p
3950: 2c 20 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53  , MEMTYPE_LOOKAS
3960: 49 44 45 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  IDE) );.  sqlite
3970: 33 4d 65 6d 64 65 62 75 67 53 65 74 54 79 70 65  3MemdebugSetType
3980: 28 70 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50  (p, MEMTYPE_HEAP
3990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
39a0: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  e(p);.}../*.** C
39b0: 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
39c0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65  f an existing me
39d0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
39e0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
39f0: 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 4f  Realloc(void *pO
3a00: 6c 64 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b  ld, int nBytes){
3a10: 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e 4e 65  .  int nOld, nNe
3a20: 77 3b 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b  w;.  void *pNew;
3a30: 0a 20 20 69 66 28 20 70 4f 6c 64 3d 3d 30 20 29  .  if( pOld==0 )
3a40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
3a50: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 42 79 74 65  ite3Malloc(nByte
3a60: 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42  s);.  }.  if( nB
3a70: 79 74 65 73 3c 3d 30 20 29 7b 0a 20 20 20 20 73  ytes<=0 ){.    s
3a80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 6c 64  qlite3_free(pOld
3a90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
3aa0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42 79 74 65  .  }.  if( nByte
3ab0: 73 3e 3d 30 78 37 66 66 66 66 66 30 30 20 29 7b  s>=0x7fffff00 ){
3ac0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 30 78 37 66  .    /* The 0x7f
3ad0: 66 66 66 30 30 20 6c 69 6d 69 74 20 74 65 72 6d  fff00 limit term
3ae0: 20 69 73 20 65 78 70 6c 61 69 6e 65 64 20 69 6e   is explained in
3af0: 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 73 71 6c   comments on sql
3b00: 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 2a 2f 0a  ite3Malloc() */.
3b10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3b20: 7d 0a 20 20 6e 4f 6c 64 20 3d 20 73 71 6c 69 74  }.  nOld = sqlit
3b30: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4f 6c  e3MallocSize(pOl
3b40: 64 29 3b 0a 20 20 2f 2a 20 49 4d 50 4c 45 4d 45  d);.  /* IMPLEME
3b50: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36  NTATION-OF: R-46
3b60: 31 39 39 2d 33 30 32 34 39 20 53 51 4c 69 74 65  199-30249 SQLite
3b70: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
3b80: 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
3b90: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 52 65   argument to xRe
3ba0: 61 6c 6c 6f 63 20 69 73 20 61 6c 77 61 79 73 20  alloc is always 
3bb0: 61 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  a value returned
3bc0: 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   by a prior call
3bd0: 20 74 6f 0a 20 20 2a 2a 20 78 52 6f 75 6e 64 75   to.  ** xRoundu
3be0: 70 2e 20 2a 2f 0a 20 20 6e 4e 65 77 20 3d 20 73  p. */.  nNew = s
3bf0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3c00: 69 67 2e 6d 2e 78 52 6f 75 6e 64 75 70 28 6e 42  ig.m.xRoundup(nB
3c10: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 6e 4f 6c  ytes);.  if( nOl
3c20: 64 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 70  d==nNew ){.    p
3c30: 4e 65 77 20 3d 20 70 4f 6c 64 3b 0a 20 20 7d 65  New = pOld;.  }e
3c40: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47  lse if( sqlite3G
3c50: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d  lobalConfig.bMem
3c60: 73 74 61 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  stat ){.    sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
3c80: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20  mem0.mutex);.   
3c90: 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 53 65   sqlite3StatusSe
3ca0: 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  t(SQLITE_STATUS_
3cb0: 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 6e 42 79  MALLOC_SIZE, nBy
3cc0: 74 65 73 29 3b 0a 20 20 20 20 69 66 28 20 73 71  tes);.    if( sq
3cd0: 6c 69 74 65 33 53 74 61 74 75 73 56 61 6c 75 65  lite3StatusValue
3ce0: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
3cf0: 45 4d 4f 52 59 5f 55 53 45 44 29 2b 6e 4e 65 77  EMORY_USED)+nNew
3d00: 2d 6e 4f 6c 64 20 3e 3d 20 0a 20 20 20 20 20 20  -nOld >= .      
3d10: 20 20 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 54 68      mem0.alarmTh
3d20: 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20  reshold ){.     
3d30: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c   sqlite3MallocAl
3d40: 61 72 6d 28 6e 4e 65 77 2d 6e 4f 6c 64 29 3b 0a  arm(nNew-nOld);.
3d50: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
3d60: 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  ( sqlite3Memdebu
3d70: 67 48 61 73 54 79 70 65 28 70 4f 6c 64 2c 20 4d  gHasType(pOld, M
3d80: 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a  EMTYPE_HEAP) );.
3d90: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3da0: 74 65 33 4d 65 6d 64 65 62 75 67 4e 6f 54 79 70  te3MemdebugNoTyp
3db0: 65 28 70 4f 6c 64 2c 20 7e 4d 45 4d 54 59 50 45  e(pOld, ~MEMTYPE
3dc0: 5f 48 45 41 50 29 20 29 3b 0a 20 20 20 20 70 4e  _HEAP) );.    pN
3dd0: 65 77 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ew = sqlite3Glob
3de0: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c  alConfig.m.xReal
3df0: 6c 6f 63 28 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b  loc(pOld, nNew);
3e00: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
3e10: 20 26 26 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61   && mem0.alarmCa
3e20: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
3e30: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61  sqlite3MallocAla
3e40: 72 6d 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20  rm(nBytes);.    
3e50: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
3e60: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3e70: 52 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 4e  Realloc(pOld, nN
3e80: 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ew);.    }.    i
3e90: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
3ea0: 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   nNew = sqlite3M
3eb0: 61 6c 6c 6f 63 53 69 7a 65 28 70 4e 65 77 29 3b  allocSize(pNew);
3ec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
3ed0: 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53  atusAdd(SQLITE_S
3ee0: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
3ef0: 44 2c 20 6e 4e 65 77 2d 6e 4f 6c 64 29 3b 0a 20  D, nNew-nOld);. 
3f00: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3f10: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
3f20: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73  0.mutex);.  }els
3f30: 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  e{.    pNew = sq
3f40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3f50: 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 4f 6c  g.m.xRealloc(pOl
3f60: 64 2c 20 6e 4e 65 77 29 3b 0a 20 20 7d 0a 20 20  d, nNew);.  }.  
3f70: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
3f80: 2f 2a 0a 2a 2a 20 54 68 65 20 70 75 62 6c 69 63  /*.** The public
3f90: 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 73 71   interface to sq
3fa0: 6c 69 74 65 33 52 65 61 6c 6c 6f 63 2e 20 20 4d  lite3Realloc.  M
3fb0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
3fc0: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 75 62 73  e memory.** subs
3fd0: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
3fe0: 69 7a 65 64 20 70 72 69 6f 72 20 74 6f 20 69 6e  ized prior to in
3ff0: 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 52 65 61  voking sqliteRea
4000: 6c 6c 6f 63 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  lloc..*/.void *s
4010: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 76  qlite3_realloc(v
4020: 6f 69 64 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e  oid *pOld, int n
4030: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
4040: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
4050: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e    if( sqlite3_in
4060: 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74  itialize() ) ret
4070: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
4080: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65  return sqlite3Re
4090: 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 29 3b 0a  alloc(pOld, n);.
40a0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
40b0: 74 65 20 61 6e 64 20 7a 65 72 6f 20 6d 65 6d 6f  te and zero memo
40c0: 72 79 2e 0a 2a 2f 20 0a 76 6f 69 64 20 2a 73 71  ry..*/ .void *sq
40d0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
40e0: 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a  int n){.  void *
40f0: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
4100: 63 28 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  c(n);.  if( p ){
4110: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  .    memset(p, 0
4120: 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , n);.  }.  retu
4130: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn p;.}../*.** A
4140: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f  llocate and zero
4150: 20 6d 65 6d 6f 72 79 2e 20 20 49 66 20 74 68 65   memory.  If the
4160: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
4170: 73 2c 20 6d 61 6b 65 0a 2a 2a 20 74 68 65 20 6d  s, make.** the m
4180: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
4190: 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   in the connecti
41a0: 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76  on pointer..*/.v
41b0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62 4d 61  oid *sqlite3DbMa
41c0: 6c 6c 6f 63 5a 65 72 6f 28 73 71 6c 69 74 65 33  llocZero(sqlite3
41d0: 20 2a 64 62 2c 20 69 6e 74 20 6e 29 7b 0a 20 20   *db, int n){.  
41e0: 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69 74 65  void *p = sqlite
41f0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
4200: 20 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   n);.  if( p ){.
4210: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
4220: 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   n);.  }.  retur
4230: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n p;.}../*.** Al
4240: 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20  locate and zero 
4250: 6d 65 6d 6f 72 79 2e 20 20 49 66 20 74 68 65 20  memory.  If the 
4260: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
4270: 2c 20 6d 61 6b 65 0a 2a 2a 20 74 68 65 20 6d 61  , make.** the ma
4280: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
4290: 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  in the connectio
42a0: 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  n pointer..**.**
42b0: 20 49 66 20 64 62 21 3d 30 20 61 6e 64 20 64 62   If db!=0 and db
42c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 69  ->mallocFailed i
42d0: 73 20 74 72 75 65 20 28 69 6e 64 69 63 61 74 69  s true (indicati
42e0: 6e 67 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ng a prior mallo
42f0: 63 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 6e 20  c.** failure on 
4300: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
4310: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 74 68  e connection) th
4320: 65 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  en always return
4330: 20 30 2e 0a 2a 2a 20 48 65 6e 63 65 20 66 6f 72   0..** Hence for
4340: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
4350: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4360: 6e 2c 20 6f 6e 63 65 20 6d 61 6c 6c 6f 63 20 73  n, once malloc s
4370: 74 61 72 74 73 0a 2a 2a 20 66 61 69 6c 69 6e 67  tarts.** failing
4380: 2c 20 69 74 20 66 61 69 6c 73 20 63 6f 6e 73 69  , it fails consi
4390: 73 74 65 6e 74 6c 79 20 75 6e 74 69 6c 20 6d 61  stently until ma
43a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 69 73 20 72 65  llocFailed is re
43b0: 73 65 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  set..** This is 
43c0: 61 6e 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 73  an important ass
43d0: 75 6d 70 74 69 6f 6e 2e 20 20 54 68 65 72 65 20  umption.  There 
43e0: 61 72 65 20 6d 61 6e 79 20 70 6c 61 63 65 73 20  are many places 
43f0: 69 6e 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 74  in the.** code t
4400: 68 61 74 20 64 6f 20 74 68 69 6e 67 73 20 6c 69  hat do things li
4410: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
4420: 20 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20         int *a = 
4430: 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d  (int*)sqlite3DbM
4440: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 31 30 30  allocRaw(db, 100
4450: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 6e  );.**         in
4460: 74 20 2a 62 20 3d 20 28 69 6e 74 2a 29 73 71 6c  t *b = (int*)sql
4470: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
4480: 64 62 2c 20 32 30 30 29 3b 0a 2a 2a 20 20 20 20  db, 200);.**    
4490: 20 20 20 20 20 69 66 28 20 62 20 29 20 61 5b 31       if( b ) a[1
44a0: 30 5d 20 3d 20 39 3b 0a 2a 2a 0a 2a 2a 20 49 6e  0] = 9;.**.** In
44b0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
44c0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6d 61   a subsequent ma
44d0: 6c 6c 6f 63 20 28 65 78 3a 20 22 62 22 29 20 77  lloc (ex: "b") w
44e0: 6f 72 6b 65 64 2c 20 69 74 20 69 73 20 61 73 73  orked, it is ass
44f0: 75 6d 65 64 0a 2a 2a 20 74 68 61 74 20 61 6c 6c  umed.** that all
4500: 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 73 20 28   prior mallocs (
4510: 65 78 3a 20 22 61 22 29 20 77 6f 72 6b 65 64 20  ex: "a") worked 
4520: 74 6f 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  too..*/.void *sq
4530: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
4540: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
4550: 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b  t n){.  void *p;
4560: 0a 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30  .  assert( db==0
4570: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
4580: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
4590: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
45a0: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  b==0 || db->pnBy
45b0: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 3b 0a 23  tesFreed==0 );.#
45c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
45d0: 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 69  IT_LOOKASIDE.  i
45e0: 66 28 20 64 62 20 29 7b 0a 20 20 20 20 4c 6f 6f  f( db ){.    Loo
45f0: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 42 75 66  kasideSlot *pBuf
4600: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
4610: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
4620: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4630: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
4640: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4650: 65 64 20 26 26 20 6e 3c 3d 64 62 2d 3e 6c 6f 6f  ed && n<=db->loo
4660: 6b 61 73 69 64 65 2e 73 7a 0a 20 20 20 20 20 20  kaside.sz.      
4670: 20 20 20 26 26 20 28 70 42 75 66 20 3d 20 64 62     && (pBuf = db
4680: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
4690: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  e)!=0 ){.      d
46a0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72  b->lookaside.pFr
46b0: 65 65 20 3d 20 70 42 75 66 2d 3e 70 4e 65 78 74  ee = pBuf->pNext
46c0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
46d0: 61 73 69 64 65 2e 6e 4f 75 74 2b 2b 3b 0a 20 20  aside.nOut++;.  
46e0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b      if( db->look
46f0: 61 73 69 64 65 2e 6e 4f 75 74 3e 64 62 2d 3e 6c  aside.nOut>db->l
4700: 6f 6f 6b 61 73 69 64 65 2e 6d 78 4f 75 74 20 29  ookaside.mxOut )
4710: 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f  {.        db->lo
4720: 6f 6b 61 73 69 64 65 2e 6d 78 4f 75 74 20 3d 20  okaside.mxOut = 
4730: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
4740: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
4750: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
4760: 70 42 75 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBuf;.    }.  }.
4770: 23 65 6c 73 65 0a 20 20 69 66 28 20 64 62 20 26  #else.  if( db &
4780: 26 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  & db->mallocFail
4790: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
47a0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
47b0: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
47c0: 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 21 70 20  oc(n);.  if( !p 
47d0: 26 26 20 64 62 20 29 7b 0a 20 20 20 20 64 62 2d  && db ){.    db-
47e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
47f0: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
4800: 4d 65 6d 64 65 62 75 67 53 65 74 54 79 70 65 28  MemdebugSetType(
4810: 70 2c 20 4d 45 4d 54 59 50 45 5f 44 42 20 7c 0a  p, MEMTYPE_DB |.
4820: 20 20 20 20 20 20 20 20 20 28 28 64 62 20 26 26           ((db &&
4830: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4840: 45 6e 61 62 6c 65 64 29 20 3f 20 4d 45 4d 54 59  Enabled) ? MEMTY
4850: 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 20 3a 20 4d  PE_LOOKASIDE : M
4860: 45 4d 54 59 50 45 5f 48 45 41 50 29 29 3b 0a 20  EMTYPE_HEAP));. 
4870: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
4880: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 62  .** Resize the b
4890: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 70  lock of memory p
48a0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 20 74  ointed to by p t
48b0: 6f 20 6e 20 62 79 74 65 73 2e 20 49 66 20 74 68  o n bytes. If th
48c0: 65 0a 2a 2a 20 72 65 73 69 7a 65 20 66 61 69 6c  e.** resize fail
48d0: 73 2c 20 73 65 74 20 74 68 65 20 6d 61 6c 6c 6f  s, set the mallo
48e0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 69 6e 20  cFailed flag in 
48f0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
4900: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  bject..*/.void *
4910: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
4920: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
4930: 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  id *p, int n){. 
4940: 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b   void *pNew = 0;
4950: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
4960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
4970: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4980: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
4990: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
49a0: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
49b0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
49c0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
49d0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
49e0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
49f0: 28 20 69 73 4c 6f 6f 6b 61 73 69 64 65 28 64 62  ( isLookaside(db
4a00: 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 69 66  , p) ){.      if
4a10: 28 20 6e 3c 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ( n<=db->lookasi
4a20: 64 65 2e 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  de.sz ){.       
4a30: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20   return p;.     
4a40: 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20   }.      pNew = 
4a50: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4a60: 61 77 28 64 62 2c 20 6e 29 3b 0a 20 20 20 20 20  aw(db, n);.     
4a70: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
4a80: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77       memcpy(pNew
4a90: 2c 20 70 2c 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  , p, db->lookasi
4aa0: 64 65 2e 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  de.sz);.        
4ab0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4ac0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , p);.      }.  
4ad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
4ae0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65  ssert( sqlite3Me
4af0: 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 70 2c  mdebugHasType(p,
4b00: 20 4d 45 4d 54 59 50 45 5f 44 42 29 20 29 3b 0a   MEMTYPE_DB) );.
4b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
4b20: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73  lite3MemdebugHas
4b30: 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f  Type(p, MEMTYPE_
4b40: 4c 4f 4f 4b 41 53 49 44 45 7c 4d 45 4d 54 59 50  LOOKASIDE|MEMTYP
4b50: 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 20 20 20  E_HEAP) );.     
4b60: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
4b70: 53 65 74 54 79 70 65 28 70 2c 20 4d 45 4d 54 59  SetType(p, MEMTY
4b80: 50 45 5f 48 45 41 50 29 3b 0a 20 20 20 20 20 20  PE_HEAP);.      
4b90: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
4ba0: 65 61 6c 6c 6f 63 28 70 2c 20 6e 29 3b 0a 20 20  ealloc(p, n);.  
4bb0: 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b      if( !pNew ){
4bc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4bd0: 4d 65 6d 64 65 62 75 67 53 65 74 54 79 70 65 28  MemdebugSetType(
4be0: 70 2c 20 4d 45 4d 54 59 50 45 5f 44 42 7c 4d 45  p, MEMTYPE_DB|ME
4bf0: 4d 54 59 50 45 5f 48 45 41 50 29 3b 0a 20 20 20  MTYPE_HEAP);.   
4c00: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
4c10: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
4c20: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
4c30: 4d 65 6d 64 65 62 75 67 53 65 74 54 79 70 65 28  MemdebugSetType(
4c40: 70 4e 65 77 2c 20 4d 45 4d 54 59 50 45 5f 44 42  pNew, MEMTYPE_DB
4c50: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
4c60: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62  (db->lookaside.b
4c70: 45 6e 61 62 6c 65 64 20 3f 20 4d 45 4d 54 59 50  Enabled ? MEMTYP
4c80: 45 5f 4c 4f 4f 4b 41 53 49 44 45 20 3a 20 4d 45  E_LOOKASIDE : ME
4c90: 4d 54 59 50 45 5f 48 45 41 50 29 29 3b 0a 20 20  MTYPE_HEAP));.  
4ca0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4cb0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
4cc0: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 61 6c 6c  Attempt to reall
4cd0: 6f 63 61 74 65 20 70 2e 20 20 49 66 20 74 68 65  ocate p.  If the
4ce0: 20 72 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61   reallocation fa
4cf0: 69 6c 73 2c 20 74 68 65 6e 20 66 72 65 65 20 70  ils, then free p
4d00: 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 68 65 20  .** and set the 
4d10: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
4d20: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
4d30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
4d40: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62  .void *sqlite3Db
4d50: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 73 71  ReallocOrFree(sq
4d60: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
4d70: 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f  *p, int n){.  vo
4d80: 69 64 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  id *pNew;.  pNew
4d90: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
4da0: 6c 6f 63 28 64 62 2c 20 70 2c 20 6e 29 3b 0a 20  loc(db, p, n);. 
4db0: 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
4dc0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4dd0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 72 65  db, p);.  }.  re
4de0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4df0: 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  .** Make a copy 
4e00: 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  of a string in m
4e10: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4e20: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
4e30: 28 29 2e 20 54 68 65 73 65 20 0a 2a 2a 20 66 75  (). These .** fu
4e40: 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 20 73 71 6c  nctions call sql
4e50: 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 29 20  ite3MallocRaw() 
4e60: 64 69 72 65 63 74 6c 79 20 69 6e 73 74 65 61 64  directly instead
4e70: 20 6f 66 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63   of sqliteMalloc
4e80: 28 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 62  (). This.** is b
4e90: 65 63 61 75 73 65 20 77 68 65 6e 20 6d 65 6d 6f  ecause when memo
4ea0: 72 79 20 64 65 62 75 67 67 69 6e 67 20 69 73 20  ry debugging is 
4eb0: 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 73 65  turned on, these
4ec0: 20 74 77 6f 20 66 75 6e 63 74 69 6f 6e 73 20 61   two functions a
4ed0: 72 65 20 0a 2a 2a 20 63 61 6c 6c 65 64 20 76 69  re .** called vi
4ee0: 61 20 6d 61 63 72 6f 73 20 74 68 61 74 20 72 65  a macros that re
4ef0: 63 6f 72 64 20 74 68 65 20 63 75 72 72 65 6e 74  cord the current
4f00: 20 66 69 6c 65 20 61 6e 64 20 6c 69 6e 65 20 6e   file and line n
4f10: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  umber in the.** 
4f20: 54 68 72 65 61 64 44 61 74 61 20 73 74 72 75 63  ThreadData struc
4f30: 74 75 72 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  ture..*/.char *s
4f40: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 73  qlite3DbStrDup(s
4f50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
4f60: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68  t char *z){.  ch
4f70: 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 73 69 7a 65  ar *zNew;.  size
4f80: 5f 74 20 6e 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  _t n;.  if( z==0
4f90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4fa0: 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69  ;.  }.  n = sqli
4fb0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b  te3Strlen30(z) +
4fc0: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e   1;.  assert( (n
4fd0: 26 30 78 37 66 66 66 66 66 66 66 29 3d 3d 6e 20  &0x7fffffff)==n 
4fe0: 29 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69  );.  zNew = sqli
4ff0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
5000: 62 2c 20 28 69 6e 74 29 6e 29 3b 0a 20 20 69 66  b, (int)n);.  if
5010: 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( zNew ){.    me
5020: 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29  mcpy(zNew, z, n)
5030: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
5040: 4e 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c  New;.}.char *sql
5050: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 73 71  ite3DbStrNDup(sq
5060: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
5070: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
5080: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a  {.  char *zNew;.
5090: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
50a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
50b0: 20 20 61 73 73 65 72 74 28 20 28 6e 26 30 78 37    assert( (n&0x7
50c0: 66 66 66 66 66 66 66 29 3d 3d 6e 20 29 3b 0a 20  fffffff)==n );. 
50d0: 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   zNew = sqlite3D
50e0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
50f0: 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20  +1);.  if( zNew 
5100: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e  ){.    memcpy(zN
5110: 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a  ew, z, n);.    z
5120: 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  New[n] = 0;.  }.
5130: 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d    return zNew;.}
5140: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
5150: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65   string from the
5160: 20 7a 46 72 6f 6d 61 74 20 61 72 67 75 6d 65 6e   zFromat argumen
5170: 74 20 61 6e 64 20 74 68 65 20 76 61 5f 6c 69 73  t and the va_lis
5180: 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a  t that follows..
5190: 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 73 74 72  ** Store the str
51a0: 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ing in memory ob
51b0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
51c0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
51d0: 61 6b 65 20 2a 70 7a 0a 2a 2a 20 70 6f 69 6e 74  ake *pz.** point
51e0: 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e   to that string.
51f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5200: 53 65 74 53 74 72 69 6e 67 28 63 68 61 72 20 2a  SetString(char *
5210: 2a 70 7a 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  *pz, sqlite3 *db
5220: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
5230: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
5240: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
5250: 72 20 2a 7a 3b 0a 0a 20 20 76 61 5f 73 74 61 72  r *z;..  va_star
5260: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
5270: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50    z = sqlite3VMP
5280: 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61  rintf(db, zForma
5290: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
52a0: 28 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  (ap);.  sqlite3D
52b0: 62 46 72 65 65 28 64 62 2c 20 2a 70 7a 29 3b 0a  bFree(db, *pz);.
52c0: 20 20 2a 70 7a 20 3d 20 7a 3b 0a 7d 0a 0a 0a 2f    *pz = z;.}.../
52d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
52e0: 6f 6e 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  on must be calle
52f0: 64 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  d before exiting
5300: 20 61 6e 79 20 41 50 49 20 66 75 6e 63 74 69 6f   any API functio
5310: 6e 20 28 69 2e 65 2e 20 0a 2a 2a 20 72 65 74 75  n (i.e. .** retu
5320: 72 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f  rning control to
5330: 20 74 68 65 20 75 73 65 72 29 20 74 68 61 74 20   the user) that 
5340: 68 61 73 20 63 61 6c 6c 65 64 20 73 71 6c 69 74  has called sqlit
5350: 65 33 5f 6d 61 6c 6c 6f 63 20 6f 72 0a 2a 2a 20  e3_malloc or.** 
5360: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 2e  sqlite3_realloc.
5370: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
5380: 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 72  ned value is nor
5390: 6d 61 6c 6c 79 20 61 20 63 6f 70 79 20 6f 66 20  mally a copy of 
53a0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
53b0: 65 6e 74 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66  ent to this.** f
53c0: 75 6e 63 74 69 6f 6e 2e 20 48 6f 77 65 76 65 72  unction. However
53d0: 2c 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  , if a malloc() 
53e0: 66 61 69 6c 75 72 65 20 68 61 73 20 6f 63 63 75  failure has occu
53f0: 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 70  rred since the p
5400: 72 65 76 69 6f 75 73 0a 2a 2a 20 69 6e 76 6f 63  revious.** invoc
5410: 61 74 69 6f 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  ation SQLITE_NOM
5420: 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  EM is returned i
5430: 6e 73 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 49  nstead. .**.** I
5440: 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
5450: 6d 65 6e 74 2c 20 64 62 2c 20 69 73 20 6e 6f 74  ment, db, is not
5460: 20 4e 55 4c 4c 20 61 6e 64 20 61 20 6d 61 6c 6c   NULL and a mall
5470: 6f 63 28 29 20 65 72 72 6f 72 20 68 61 73 20 6f  oc() error has o
5480: 63 63 75 72 72 65 64 2c 0a 2a 2a 20 74 68 65 6e  ccurred,.** then
5490: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
54a0: 65 72 72 6f 72 2d 63 6f 64 65 20 28 74 68 65 20  error-code (the 
54b0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
54c0: 79 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  y sqlite3_errcod
54d0: 65 28 29 29 0a 2a 2a 20 69 73 20 73 65 74 20 74  e()).** is set t
54e0: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  o SQLITE_NOMEM..
54f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 70  */.int sqlite3Ap
5500: 69 45 78 69 74 28 73 71 6c 69 74 65 33 2a 20 64  iExit(sqlite3* d
5510: 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 2f 2a  b, int rc){.  /*
5520: 20 49 66 20 74 68 65 20 64 62 20 68 61 6e 64 6c   If the db handl
5530: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
5540: 68 65 6e 20 77 65 20 6d 75 73 74 20 68 6f 6c 64  hen we must hold
5550: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
5560: 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 6d 75 74 65  handle.  ** mute
5570: 78 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  x here. Otherwis
5580: 65 20 74 68 65 20 72 65 61 64 20 28 61 6e 64 20  e the read (and 
5590: 70 6f 73 73 69 62 6c 65 20 77 72 69 74 65 29 20  possible write) 
55a0: 6f 66 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  of db->mallocFai
55b0: 6c 65 64 20 0a 20 20 2a 2a 20 69 73 20 75 6e 73  led .  ** is uns
55c0: 61 66 65 2c 20 61 73 20 69 73 20 74 68 65 20 63  afe, as is the c
55d0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 72  all to sqlite3Er
55e0: 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ror()..  */.  as
55f0: 73 65 72 74 28 20 21 64 62 20 7c 7c 20 73 71 6c  sert( !db || sql
5600: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5610: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
5620: 69 66 28 20 64 62 20 26 26 20 28 64 62 2d 3e 6d  if( db && (db->m
5630: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 72  allocFailed || r
5640: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
5650: 4e 4f 4d 45 4d 29 20 29 7b 0a 20 20 20 20 73 71  NOMEM) ){.    sq
5660: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
5670: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 30 29 3b  QLITE_NOMEM, 0);
5680: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
5690: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 72  ailed = 0;.    r
56a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
56b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
56c0: 63 20 26 20 28 64 62 20 3f 20 64 62 2d 3e 65 72  c & (db ? db->er
56d0: 72 4d 61 73 6b 20 3a 20 30 78 66 66 29 3b 0a 7d  rMask : 0xff);.}
56e0: 0a                                               .