/ Hex Artifact Content
Login

Artifact 6c3bcae8ee8885f1705f36306062f82a64d96118:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 65 6d  ******.**.** Mem
0180: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
0190: 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 74 68  unctions used th
01a0: 72 6f 75 67 68 6f 75 74 20 73 71 6c 69 74 65 2e  roughout sqlite.
01b0: 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 6d 61 6c 6c  .**.** $Id: mall
01c0: 6f 63 2e 63 2c 76 20 31 2e 34 31 20 32 30 30 38  oc.c,v 1.41 2008
01d0: 2f 30 39 2f 30 34 20 30 34 3a 33 32 3a 34 39 20  /09/04 04:32:49 
01e0: 73 68 61 6e 65 20 45 78 70 20 24 0a 2a 2f 0a 23  shane Exp $.*/.#
01f0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0200: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0210: 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75  stdarg.h>.#inclu
0220: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a  de <ctype.h>../*
0230: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0240: 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 6d   runs when the m
0250: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20  emory allocator 
0260: 73 65 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  sees that the.**
0270: 20 74 6f 74 61 6c 20 6d 65 6d 6f 72 79 20 61 6c   total memory al
0280: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 61 62 6f 75  location is abou
0290: 74 20 74 6f 20 65 78 63 65 65 64 20 74 68 65 20  t to exceed the 
02a0: 73 6f 66 74 20 68 65 61 70 0a 2a 2a 20 6c 69 6d  soft heap.** lim
02b0: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
02c0: 69 64 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74  id softHeapLimit
02d0: 45 6e 66 6f 72 63 65 72 28 0a 20 20 76 6f 69 64  Enforcer(.  void
02e0: 20 2a 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71   *NotUsed, .  sq
02f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 55 73  lite3_int64 inUs
0300: 65 2c 0a 20 20 69 6e 74 20 61 6c 6c 6f 63 53 69  e,.  int allocSi
0310: 7a 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ze.){.  sqlite3_
0320: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 61  release_memory(a
0330: 6c 6c 6f 63 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  llocSize);.}../*
0340: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 66 74  .** Set the soft
0350: 20 68 65 61 70 2d 73 69 7a 65 20 6c 69 6d 69 74   heap-size limit
0360: 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61 72 79   for the library
0370: 2e 20 50 61 73 73 69 6e 67 20 61 20 7a 65 72 6f  . Passing a zero
0380: 20 6f 72 20 0a 2a 2a 20 6e 65 67 61 74 69 76 65   or .** negative
0390: 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
03a0: 20 6e 6f 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 76 6f   no limit..*/.vo
03b0: 69 64 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  id sqlite3_soft_
03c0: 68 65 61 70 5f 6c 69 6d 69 74 28 69 6e 74 20 6e  heap_limit(int n
03d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  ){.  sqlite3_uin
03e0: 74 36 34 20 69 4c 69 6d 69 74 3b 0a 20 20 69 6e  t64 iLimit;.  in
03f0: 74 20 6f 76 65 72 61 67 65 3b 0a 20 20 69 66 28  t overage;.  if(
0400: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 69 4c 69 6d   n<0 ){.    iLim
0410: 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
0420: 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 6e 3b  .    iLimit = n;
0430: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 69  .  }.  sqlite3_i
0440: 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
0450: 66 28 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  f( iLimit>0 ){. 
0460: 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79     sqlite3Memory
0470: 41 6c 61 72 6d 28 73 6f 66 74 48 65 61 70 4c 69  Alarm(softHeapLi
0480: 6d 69 74 45 6e 66 6f 72 63 65 72 2c 20 30 2c 20  mitEnforcer, 0, 
0490: 69 4c 69 6d 69 74 29 3b 0a 20 20 7d 65 6c 73 65  iLimit);.  }else
04a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d  {.    sqlite3Mem
04b0: 6f 72 79 41 6c 61 72 6d 28 30 2c 20 30 2c 20 30  oryAlarm(0, 0, 0
04c0: 29 3b 0a 20 20 7d 0a 20 20 6f 76 65 72 61 67 65  );.  }.  overage
04d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72   = sqlite3_memor
04e0: 79 5f 75 73 65 64 28 29 20 2d 20 6e 3b 0a 20 20  y_used() - n;.  
04f0: 69 66 28 20 6f 76 65 72 61 67 65 3e 30 20 29 7b  if( overage>0 ){
0500: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6c  .    sqlite3_rel
0510: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 6f 76 65 72  ease_memory(over
0520: 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
0530: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65  ** Attempt to re
0540: 6c 65 61 73 65 20 75 70 20 74 6f 20 6e 20 62 79  lease up to n by
0550: 74 65 73 20 6f 66 20 6e 6f 6e 2d 65 73 73 65 6e  tes of non-essen
0560: 74 69 61 6c 20 6d 65 6d 6f 72 79 20 63 75 72 72  tial memory curr
0570: 65 6e 74 6c 79 0a 2a 2a 20 68 65 6c 64 20 62 79  ently.** held by
0580: 20 53 51 4c 69 74 65 2e 20 41 6e 20 65 78 61 6d   SQLite. An exam
0590: 70 6c 65 20 6f 66 20 6e 6f 6e 2d 65 73 73 65 6e  ple of non-essen
05a0: 74 69 61 6c 20 6d 65 6d 6f 72 79 20 69 73 20 6d  tial memory is m
05b0: 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 0a 2a 2a  emory used to.**
05c0: 20 63 61 63 68 65 20 64 61 74 61 62 61 73 65 20   cache database 
05d0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 6e  pages that are n
05e0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ot currently in 
05f0: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
0600: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
0610: 72 79 28 69 6e 74 20 6e 29 7b 0a 23 69 66 64 65  ry(int n){.#ifde
0620: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0630: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
0640: 54 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30  T.  int nRet = 0
0650: 3b 0a 23 69 66 20 30 0a 20 20 6e 52 65 74 20 2b  ;.#if 0.  nRet +
0660: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 6c  = sqlite3VdbeRel
0670: 65 61 73 65 4d 65 6d 6f 72 79 28 6e 29 3b 0a 23  easeMemory(n);.#
0680: 65 6e 64 69 66 0a 20 20 6e 52 65 74 20 2b 3d 20  endif.  nRet += 
0690: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
06a0: 65 61 73 65 4d 65 6d 6f 72 79 28 6e 2d 6e 52 65  easeMemory(n-nRe
06b0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65  t);.  return nRe
06c0: 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  t;.#else.  retur
06d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
06e0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  dif.}../*.** Sta
06f0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c  te information l
0700: 6f 63 61 6c 20 74 6f 20 74 68 65 20 6d 65 6d 6f  ocal to the memo
0710: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75  ry allocation su
0720: 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a 73 74 61 74  bsystem..*/.stat
0730: 69 63 20 53 51 4c 49 54 45 5f 57 53 44 20 73 74  ic SQLITE_WSD st
0740: 72 75 63 74 20 4d 65 6d 30 47 6c 6f 62 61 6c 20  ruct Mem0Global 
0750: 7b 0a 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  {.  /* Number of
0760: 20 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20   free pages for 
0770: 73 63 72 61 74 63 68 20 61 6e 64 20 70 61 67 65  scratch and page
0780: 2d 63 61 63 68 65 20 6d 65 6d 6f 72 79 20 2a 2f  -cache memory */
0790: 0a 20 20 75 33 32 20 6e 53 63 72 61 74 63 68 46  .  u32 nScratchF
07a0: 72 65 65 3b 0a 20 20 75 33 32 20 6e 50 61 67 65  ree;.  u32 nPage
07b0: 46 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Free;..  sqlite3
07c0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
07d0: 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20         /* Mutex 
07e0: 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 61 63 63  to serialize acc
07f0: 65 73 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ess */..  /*.  *
0800: 2a 20 54 68 65 20 61 6c 61 72 6d 20 63 61 6c 6c  * The alarm call
0810: 62 61 63 6b 20 61 6e 64 20 69 74 73 20 61 72 67  back and its arg
0820: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 6d 65 6d  uments.  The mem
0830: 30 2e 6d 75 74 65 78 20 6c 6f 63 6b 20 77 69 6c  0.mutex lock wil
0840: 6c 0a 20 20 2a 2a 20 62 65 20 68 65 6c 64 20 77  l.  ** be held w
0850: 68 69 6c 65 20 74 68 65 20 63 61 6c 6c 62 61 63  hile the callbac
0860: 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2e 20 20 52  k is running.  R
0870: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69  ecursive calls i
0880: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  nto.  ** the mem
0890: 6f 72 79 20 73 75 62 73 79 73 74 65 6d 20 61 72  ory subsystem ar
08a0: 65 20 61 6c 6c 6f 77 65 64 2c 20 62 75 74 20 6e  e allowed, but n
08b0: 6f 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 73 20  o new callbacks 
08c0: 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 69 73 73  will be.  ** iss
08d0: 75 65 64 2e 20 20 54 68 65 20 61 6c 61 72 6d 42  ued.  The alarmB
08e0: 75 73 79 20 76 61 72 69 61 62 6c 65 20 69 73 20  usy variable is 
08f0: 73 65 74 20 74 6f 20 70 72 65 76 65 6e 74 20 72  set to prevent r
0900: 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 63 61  ecursive.  ** ca
0910: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
0920: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6c  sqlite3_int64 al
0930: 61 72 6d 54 68 72 65 73 68 6f 6c 64 3b 0a 20 20  armThreshold;.  
0940: 76 6f 69 64 20 28 2a 61 6c 61 72 6d 43 61 6c 6c  void (*alarmCall
0950: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 20 73 71 6c  back)(void*, sql
0960: 69 74 65 33 5f 69 6e 74 36 34 2c 69 6e 74 29 3b  ite3_int64,int);
0970: 0a 20 20 76 6f 69 64 20 2a 61 6c 61 72 6d 41 72  .  void *alarmAr
0980: 67 3b 0a 20 20 69 6e 74 20 61 6c 61 72 6d 42 75  g;.  int alarmBu
0990: 73 79 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50  sy;..  /*.  ** P
09a0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 65  ointers to the e
09b0: 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 47 6c 6f  nd of sqlite3Glo
09c0: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
09d0: 63 68 20 61 6e 64 0a 20 20 2a 2a 20 73 71 6c 69  ch and.  ** sqli
09e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
09f0: 70 50 61 67 65 20 74 6f 20 61 20 62 6c 6f 63 6b  pPage to a block
0a00: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   of memory that 
0a10: 72 65 63 6f 72 64 73 0a 20 20 2a 2a 20 77 68 69  records.  ** whi
0a20: 63 68 20 70 61 67 65 73 20 61 72 65 20 61 76 61  ch pages are ava
0a30: 69 6c 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 75  ilable..  */.  u
0a40: 33 32 20 2a 61 53 63 72 61 74 63 68 46 72 65 65  32 *aScratchFree
0a50: 3b 0a 20 20 75 33 32 20 2a 61 50 61 67 65 46 72  ;.  u32 *aPageFr
0a60: 65 65 3b 0a 7d 20 6d 65 6d 30 20 3d 20 7b 20 36  ee;.} mem0 = { 6
0a70: 32 35 36 30 39 35 35 20 7d 3b 0a 0a 23 64 65 66  2560955 };..#def
0a80: 69 6e 65 20 6d 65 6d 30 20 47 4c 4f 42 41 4c 28  ine mem0 GLOBAL(
0a90: 73 74 72 75 63 74 20 4d 65 6d 30 47 6c 6f 62 61  struct Mem0Globa
0aa0: 6c 2c 20 6d 65 6d 30 29 0a 0a 2f 2a 0a 2a 2a 20  l, mem0)../*.** 
0ab0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  Initialize the m
0ac0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0ad0: 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a 69   subsystem..*/.i
0ae0: 6e 74 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  nt sqlite3Malloc
0af0: 49 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 66  Init(void){.  if
0b00: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
0b10: 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d  onfig.m.xMalloc=
0b20: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0b30: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
0b40: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
0b50: 6d 65 6d 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28  mem0, 0, sizeof(
0b60: 6d 65 6d 30 29 29 3b 0a 20 20 69 66 28 20 73 71  mem0));.  if( sq
0b70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0b80: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
0b90: 20 20 20 20 6d 65 6d 30 2e 6d 75 74 65 78 20 3d      mem0.mutex =
0ba0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
0bb0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
0bc0: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 0a 20 20 7d  STATIC_MEM);.  }
0bd0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
0be0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61  obalConfig.pScra
0bf0: 74 63 68 20 26 26 20 73 71 6c 69 74 65 33 47 6c  tch && sqlite3Gl
0c00: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72  obalConfig.szScr
0c10: 61 74 63 68 3e 3d 31 30 30 0a 20 20 20 20 20 20  atch>=100.      
0c20: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
0c30: 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 3e  Config.nScratch>
0c40: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
0c50: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
0c60: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  alConfig.szScrat
0c70: 63 68 20 2d 3d 20 34 3b 0a 20 20 20 20 6d 65 6d  ch -= 4;.    mem
0c80: 30 2e 61 53 63 72 61 74 63 68 46 72 65 65 20 3d  0.aScratchFree =
0c90: 20 28 75 33 32 2a 29 26 28 28 63 68 61 72 2a 29   (u32*)&((char*)
0ca0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0cb0: 66 69 67 2e 70 53 63 72 61 74 63 68 29 0a 20 20  fig.pScratch).  
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 5b 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  [sqlite3GlobalCo
0ce0: 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 2a 73  nfig.szScratch*s
0cf0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
0d00: 69 67 2e 6e 53 63 72 61 74 63 68 5d 3b 0a 20 20  ig.nScratch];.  
0d10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c    for(i=0; i<sql
0d20: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0d30: 2e 6e 53 63 72 61 74 63 68 3b 20 69 2b 2b 29 7b  .nScratch; i++){
0d40: 20 6d 65 6d 30 2e 61 53 63 72 61 74 63 68 46 72   mem0.aScratchFr
0d50: 65 65 5b 69 5d 20 3d 20 69 3b 20 7d 0a 20 20 20  ee[i] = i; }.   
0d60: 20 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46 72   mem0.nScratchFr
0d70: 65 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ee = sqlite3Glob
0d80: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
0d90: 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
0da0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0db0: 66 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20 30  fig.pScratch = 0
0dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
0dd0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
0de0: 74 63 68 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  tch = 0;.  }.  i
0df0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
0e00: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 26 26 20  Config.pPage && 
0e10: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0e20: 66 69 67 2e 73 7a 50 61 67 65 3e 3d 35 31 32 0a  fig.szPage>=512.
0e30: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
0e40: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
0e50: 67 65 3e 3d 31 20 29 7b 0a 20 20 20 20 69 6e 74  ge>=1 ){.    int
0e60: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6f 76 65 72   i;.    int over
0e70: 68 65 61 64 3b 0a 20 20 20 20 69 6e 74 20 73 7a  head;.    int sz
0e80: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
0e90: 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 3b 0a 20  Config.szPage;. 
0ea0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
0eb0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
0ec0: 50 61 67 65 3b 0a 20 20 20 20 6f 76 65 72 68 65  Page;.    overhe
0ed0: 61 64 20 3d 20 28 34 2a 6e 20 2b 20 73 7a 20 2d  ad = (4*n + sz -
0ee0: 20 31 29 2f 73 7a 3b 0a 20 20 20 20 73 71 6c 69   1)/sz;.    sqli
0ef0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0f00: 6e 50 61 67 65 20 2d 3d 20 6f 76 65 72 68 65 61  nPage -= overhea
0f10: 64 3b 0a 20 20 20 20 6d 65 6d 30 2e 61 50 61 67  d;.    mem0.aPag
0f20: 65 46 72 65 65 20 3d 20 28 75 33 32 2a 29 26 28  eFree = (u32*)&(
0f30: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 47 6c  (char*)sqlite3Gl
0f40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
0f50: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0f60: 20 20 20 20 5b 73 71 6c 69 74 65 33 47 6c 6f 62      [sqlite3Glob
0f70: 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2a  alConfig.szPage*
0f80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
0f90: 66 69 67 2e 6e 50 61 67 65 5d 3b 0a 20 20 20 20  fig.nPage];.    
0fa0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c 69 74  for(i=0; i<sqlit
0fb0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
0fc0: 50 61 67 65 3b 20 69 2b 2b 29 7b 20 6d 65 6d 30  Page; i++){ mem0
0fd0: 2e 61 50 61 67 65 46 72 65 65 5b 69 5d 20 3d 20  .aPageFree[i] = 
0fe0: 69 3b 20 7d 0a 20 20 20 20 6d 65 6d 30 2e 6e 50  i; }.    mem0.nP
0ff0: 61 67 65 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ageFree = sqlite
1000: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
1010: 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1020: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1030: 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 30 3b  onfig.pPage = 0;
1040: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1050: 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20  alConfig.szPage 
1060: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1070: 6e 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  n sqlite3GlobalC
1080: 6f 6e 66 69 67 2e 6d 2e 78 49 6e 69 74 28 73 71  onfig.m.xInit(sq
1090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
10a0: 67 2e 6d 2e 70 41 70 70 44 61 74 61 29 3b 0a 7d  g.m.pAppData);.}
10b0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61  ../*.** Deinitia
10c0: 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
10d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79  allocation subsy
10e0: 73 74 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  stem..*/.void sq
10f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 76  lite3MallocEnd(v
1100: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 47  oid){.  sqlite3G
1110: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53  lobalConfig.m.xS
1120: 68 75 74 64 6f 77 6e 28 73 71 6c 69 74 65 33 47  hutdown(sqlite3G
1130: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 70 41  lobalConfig.m.pA
1140: 70 70 44 61 74 61 29 3b 0a 20 20 6d 65 6d 73 65  ppData);.  memse
1150: 74 28 26 6d 65 6d 30 2c 20 30 2c 20 73 69 7a 65  t(&mem0, 0, size
1160: 6f 66 28 6d 65 6d 30 29 29 3b 0a 7d 0a 0a 2f 2a  of(mem0));.}../*
1170: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
1180: 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
1190: 63 75 72 72 65 6e 74 6c 79 20 63 68 65 63 6b 65  currently checke
11a0: 64 20 6f 75 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65  d out..*/.sqlite
11b0: 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
11c0: 6d 65 6d 6f 72 79 5f 75 73 65 64 28 76 6f 69 64  memory_used(void
11d0: 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 6d 78 3b 0a  ){.  int n, mx;.
11e0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
11f0: 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  res;.  sqlite3_s
1200: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
1210: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c  TUS_MEMORY_USED,
1220: 20 26 6e 2c 20 26 6d 78 2c 20 30 29 3b 0a 20 20   &n, &mx, 0);.  
1230: 72 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  res = (sqlite3_i
1240: 6e 74 36 34 29 6e 3b 20 20 2f 2a 20 57 6f 72 6b  nt64)n;  /* Work
1250: 20 61 72 6f 75 6e 64 20 62 75 67 20 69 6e 20 42   around bug in B
1260: 6f 72 6c 61 6e 64 20 43 2e 20 54 69 63 6b 65 74  orland C. Ticket
1270: 20 23 33 32 31 36 20 2a 2f 0a 20 20 72 65 74 75   #3216 */.  retu
1280: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
1290: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
12a0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  mum amount of me
12b0: 6d 6f 72 79 20 74 68 61 74 20 68 61 73 20 65 76  mory that has ev
12c0: 65 72 20 62 65 65 6e 0a 2a 2a 20 63 68 65 63 6b  er been.** check
12d0: 65 64 20 6f 75 74 20 73 69 6e 63 65 20 65 69 74  ed out since eit
12e0: 68 65 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  her the beginnin
12f0: 67 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 73  g of this proces
1300: 73 0a 2a 2a 20 6f 72 20 73 69 6e 63 65 20 74 68  s.** or since th
1310: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 72 65  e most recent re
1320: 73 65 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  set..*/.sqlite3_
1330: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6d 65  int64 sqlite3_me
1340: 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 28 69  mory_highwater(i
1350: 6e 74 20 72 65 73 65 74 46 6c 61 67 29 7b 0a 20  nt resetFlag){. 
1360: 20 69 6e 74 20 6e 2c 20 6d 78 3b 0a 20 20 73 71   int n, mx;.  sq
1370: 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 65 73 3b  lite3_int64 res;
1380: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75  .  sqlite3_statu
1390: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
13a0: 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 6e 2c  MEMORY_USED, &n,
13b0: 20 26 6d 78 2c 20 72 65 73 65 74 46 6c 61 67 29   &mx, resetFlag)
13c0: 3b 0a 20 20 72 65 73 20 3d 20 28 73 71 6c 69 74  ;.  res = (sqlit
13d0: 65 33 5f 69 6e 74 36 34 29 6d 78 3b 20 20 2f 2a  e3_int64)mx;  /*
13e0: 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   Work around bug
13f0: 20 69 6e 20 42 6f 72 6c 61 6e 64 20 43 2e 20 54   in Borland C. T
1400: 69 63 6b 65 74 20 23 33 32 31 36 20 2a 2f 0a 20  icket #3216 */. 
1410: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1420: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1430: 20 61 6c 61 72 6d 20 63 61 6c 6c 62 61 63 6b 0a   alarm callback.
1440: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
1450: 6d 6f 72 79 41 6c 61 72 6d 28 0a 20 20 76 6f 69  moryAlarm(.  voi
1460: 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  d(*xCallback)(vo
1470: 69 64 20 2a 70 41 72 67 2c 20 73 71 6c 69 74 65  id *pArg, sqlite
1480: 33 5f 69 6e 74 36 34 20 75 73 65 64 2c 69 6e 74  3_int64 used,int
1490: 20 4e 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72   N),.  void *pAr
14a0: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  g,.  sqlite3_int
14b0: 36 34 20 69 54 68 72 65 73 68 6f 6c 64 0a 29 7b  64 iThreshold.){
14c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
14d0: 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65  _enter(mem0.mute
14e0: 78 29 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d  x);.  mem0.alarm
14f0: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
1500: 62 61 63 6b 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61  back;.  mem0.ala
1510: 72 6d 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  rmArg = pArg;.  
1520: 6d 65 6d 30 2e 61 6c 61 72 6d 54 68 72 65 73 68  mem0.alarmThresh
1530: 6f 6c 64 20 3d 20 69 54 68 72 65 73 68 6f 6c 64  old = iThreshold
1540: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1550: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
1560: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
1570: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1580: 2a 20 44 65 70 72 65 63 61 74 65 64 20 65 78 74  * Deprecated ext
1590: 65 72 6e 61 6c 20 69 6e 74 65 72 66 61 63 65 2e  ernal interface.
15a0: 20 20 49 6e 74 65 72 6e 61 6c 2f 63 6f 72 65 20    Internal/core 
15b0: 53 51 4c 69 74 65 20 63 6f 64 65 0a 2a 2a 20 73  SQLite code.** s
15c0: 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74  hould call sqlit
15d0: 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d 2e 0a 2a  e3MemoryAlarm..*
15e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65  /.int sqlite3_me
15f0: 6d 6f 72 79 5f 61 6c 61 72 6d 28 0a 20 20 76 6f  mory_alarm(.  vo
1600: 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  id(*xCallback)(v
1610: 6f 69 64 20 2a 70 41 72 67 2c 20 73 71 6c 69 74  oid *pArg, sqlit
1620: 65 33 5f 69 6e 74 36 34 20 75 73 65 64 2c 69 6e  e3_int64 used,in
1630: 74 20 4e 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t N),.  void *pA
1640: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  rg,.  sqlite3_in
1650: 74 36 34 20 69 54 68 72 65 73 68 6f 6c 64 0a 29  t64 iThreshold.)
1660: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1670: 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d 28 78 43  e3MemoryAlarm(xC
1680: 61 6c 6c 62 61 63 6b 2c 20 70 41 72 67 2c 20 69  allback, pArg, i
1690: 54 68 72 65 73 68 6f 6c 64 29 3b 0a 7d 0a 0a 2f  Threshold);.}../
16a0: 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 74 68 65  *.** Trigger the
16b0: 20 61 6c 61 72 6d 20 0a 2a 2f 0a 73 74 61 74 69   alarm .*/.stati
16c0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61  c void sqlite3Ma
16d0: 6c 6c 6f 63 41 6c 61 72 6d 28 69 6e 74 20 6e 42  llocAlarm(int nB
16e0: 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 28 2a 78  yte){.  void (*x
16f0: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
1700: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 69 6e  sqlite3_int64,in
1710: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  t);.  sqlite3_in
1720: 74 36 34 20 6e 6f 77 55 73 65 64 3b 0a 20 20 76  t64 nowUsed;.  v
1730: 6f 69 64 20 2a 70 41 72 67 3b 0a 20 20 69 66 28  oid *pArg;.  if(
1740: 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62   mem0.alarmCallb
1750: 61 63 6b 3d 3d 30 20 7c 7c 20 6d 65 6d 30 2e 61  ack==0 || mem0.a
1760: 6c 61 72 6d 42 75 73 79 20 20 29 20 72 65 74 75  larmBusy  ) retu
1770: 72 6e 3b 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d  rn;.  mem0.alarm
1780: 42 75 73 79 20 3d 20 31 3b 0a 20 20 78 43 61 6c  Busy = 1;.  xCal
1790: 6c 62 61 63 6b 20 3d 20 6d 65 6d 30 2e 61 6c 61  lback = mem0.ala
17a0: 72 6d 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 6e 6f  rmCallback;.  no
17b0: 77 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 53  wUsed = sqlite3S
17c0: 74 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49 54  tatusValue(SQLIT
17d0: 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
17e0: 55 53 45 44 29 3b 0a 20 20 70 41 72 67 20 3d 20  USED);.  pArg = 
17f0: 6d 65 6d 30 2e 61 6c 61 72 6d 41 72 67 3b 0a 20  mem0.alarmArg;. 
1800: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1810: 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29  eave(mem0.mutex)
1820: 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b 28 70 41  ;.  xCallback(pA
1830: 72 67 2c 20 6e 6f 77 55 73 65 64 2c 20 6e 42 79  rg, nowUsed, nBy
1840: 74 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  te);.  sqlite3_m
1850: 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e  utex_enter(mem0.
1860: 6d 75 74 65 78 29 3b 0a 20 20 6d 65 6d 30 2e 61  mutex);.  mem0.a
1870: 6c 61 72 6d 42 75 73 79 20 3d 20 30 3b 0a 7d 0a  larmBusy = 0;.}.
1880: 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 6d 65 6d 6f  ./*.** Do a memo
1890: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 69  ry allocation wi
18a0: 74 68 20 73 74 61 74 69 73 74 69 63 73 20 61 6e  th statistics an
18b0: 64 20 61 6c 61 72 6d 73 2e 20 20 41 73 73 75 6d  d alarms.  Assum
18c0: 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73  e the.** lock is
18d0: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 2a   already held..*
18e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6c  /.static int mal
18f0: 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28 69 6e 74  locWithAlarm(int
1900: 20 6e 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a   n, void **pp){.
1910: 20 20 69 6e 74 20 6e 46 75 6c 6c 3b 0a 20 20 76    int nFull;.  v
1920: 6f 69 64 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  oid *p;.  assert
1930: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1940: 68 65 6c 64 28 6d 65 6d 30 2e 6d 75 74 65 78 29  held(mem0.mutex)
1950: 20 29 3b 0a 20 20 6e 46 75 6c 6c 20 3d 20 73 71   );.  nFull = sq
1960: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1970: 67 2e 6d 2e 78 52 6f 75 6e 64 75 70 28 6e 29 3b  g.m.xRoundup(n);
1980: 0a 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73  .  sqlite3Status
1990: 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55  Set(SQLITE_STATU
19a0: 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 6e  S_MALLOC_SIZE, n
19b0: 29 3b 0a 20 20 69 66 28 20 6d 65 6d 30 2e 61 6c  );.  if( mem0.al
19c0: 61 72 6d 43 61 6c 6c 62 61 63 6b 21 3d 30 20 29  armCallback!=0 )
19d0: 7b 0a 20 20 20 20 69 6e 74 20 6e 55 73 65 64 20  {.    int nUsed 
19e0: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 56  = sqlite3StatusV
19f0: 61 6c 75 65 28 53 51 4c 49 54 45 5f 53 54 41 54  alue(SQLITE_STAT
1a00: 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 29 3b  US_MEMORY_USED);
1a10: 0a 20 20 20 20 69 66 28 20 6e 55 73 65 64 2b 6e  .    if( nUsed+n
1a20: 46 75 6c 6c 20 3e 3d 20 6d 65 6d 30 2e 61 6c 61  Full >= mem0.ala
1a30: 72 6d 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a 20  rmThreshold ){. 
1a40: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c       sqlite3Mall
1a50: 6f 63 41 6c 61 72 6d 28 6e 46 75 6c 6c 29 3b 0a  ocAlarm(nFull);.
1a60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20      }.  }.  p = 
1a70: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1a80: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 46  fig.m.xMalloc(nF
1a90: 75 6c 6c 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ull);.  if( p==0
1aa0: 20 26 26 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61   && mem0.alarmCa
1ab0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71  llback ){.    sq
1ac0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d  lite3MallocAlarm
1ad0: 28 6e 46 75 6c 6c 29 3b 0a 20 20 20 20 70 20 3d  (nFull);.    p =
1ae0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1af0: 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e  nfig.m.xMalloc(n
1b00: 46 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Full);.  }.  if(
1b10: 20 70 20 29 7b 0a 20 20 20 20 6e 46 75 6c 6c 20   p ){.    nFull 
1b20: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
1b30: 69 7a 65 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ize(p);.    sqli
1b40: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
1b50: 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
1b60: 59 5f 55 53 45 44 2c 20 6e 46 75 6c 6c 29 3b 0a  Y_USED, nFull);.
1b70: 20 20 7d 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20    }.  *pp = p;. 
1b80: 20 72 65 74 75 72 6e 20 6e 46 75 6c 6c 3b 0a 7d   return nFull;.}
1b90: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1ba0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 72   memory.  This r
1bb0: 6f 75 74 69 6e 65 20 69 73 20 6c 69 6b 65 20 73  outine is like s
1bc0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
1bd0: 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
1be0: 2a 20 61 73 73 75 6d 65 73 20 74 68 65 20 6d 65  * assumes the me
1bf0: 6d 6f 72 79 20 73 75 62 73 79 73 74 65 6d 20 68  mory subsystem h
1c00: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1c10: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2f 0a  initialized..*/.
1c20: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 61 6c  void *sqlite3Mal
1c30: 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f  loc(int n){.  vo
1c40: 69 64 20 2a 70 3b 0a 20 20 69 66 28 20 6e 3c 3d  id *p;.  if( n<=
1c50: 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 30 3b 0a  0 ){.    p = 0;.
1c60: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1c70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c80: 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20  bMemstat ){.    
1c90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1ca0: 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ter(mem0.mutex);
1cb0: 0a 20 20 20 20 6d 61 6c 6c 6f 63 57 69 74 68 41  .    mallocWithA
1cc0: 6c 61 72 6d 28 6e 2c 20 26 70 29 3b 0a 20 20 20  larm(n, &p);.   
1cd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1ce0: 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29  eave(mem0.mutex)
1cf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d00: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
1d10: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
1d20: 28 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (n);.  }.  retur
1d30: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n p;.}../*.** Th
1d40: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  is version of th
1d50: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
1d60: 69 6f 6e 20 69 73 20 66 6f 72 20 75 73 65 20 62  ion is for use b
1d70: 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
1d80: 6e 2e 0a 2a 2a 20 46 69 72 73 74 20 6d 61 6b 65  n..** First make
1d90: 20 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79   sure the memory
1da0: 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e   subsystem is in
1db0: 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20  itialized, then 
1dc0: 64 6f 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  do the.** alloca
1dd0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
1de0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 69 6e  qlite3_malloc(in
1df0: 74 20 6e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  t n){.#ifndef SQ
1e00: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
1e10: 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  IT.  if( sqlite3
1e20: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20  _initialize() ) 
1e30: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
1e40: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1e50: 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 7d 0a 0a 2f  3Malloc(n);.}../
1e60: 2a 0a 2a 2a 20 45 61 63 68 20 74 68 72 65 61 64  *.** Each thread
1e70: 20 6d 61 79 20 6f 6e 6c 79 20 68 61 76 65 20 61   may only have a
1e80: 20 73 69 6e 67 6c 65 20 6f 75 74 73 74 61 6e 64   single outstand
1e90: 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ing allocation f
1ea0: 72 6f 6d 0a 2a 2a 20 78 53 63 72 61 74 63 68 4d  rom.** xScratchM
1eb0: 61 6c 6c 6f 63 28 29 2e 20 20 57 65 20 76 65 72  alloc().  We ver
1ec0: 69 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61  ify this constra
1ed0: 69 6e 74 20 69 6e 20 74 68 65 20 73 69 6e 67 6c  int in the singl
1ee0: 65 2d 74 68 72 65 61 64 65 64 0a 2a 2a 20 63 61  e-threaded.** ca
1ef0: 73 65 20 62 79 20 73 65 74 74 69 6e 67 20 73 63  se by setting sc
1f00: 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 20 74 6f  ratchAllocOut to
1f10: 20 31 20 77 68 65 6e 20 61 6e 20 61 6c 6c 6f 63   1 when an alloc
1f20: 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 75 74 73  ation.** is outs
1f30: 74 61 6e 64 69 6e 67 20 63 6c 65 61 72 69 6e 67  tanding clearing
1f40: 20 69 74 20 77 68 65 6e 20 74 68 65 20 61 6c 6c   it when the all
1f50: 6f 63 61 74 69 6f 6e 20 69 73 20 66 72 65 65 64  ocation is freed
1f60: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
1f70: 54 48 52 45 41 44 53 41 46 45 3d 3d 30 20 26 26  THREADSAFE==0 &&
1f80: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
1f90: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 72  ).static int scr
1fa0: 61 74 63 68 41 6c 6c 6f 63 4f 75 74 20 3d 20 30  atchAllocOut = 0
1fb0: 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
1fc0: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
1fd0: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 75   that is to be u
1fe0: 73 65 64 20 61 6e 64 20 72 65 6c 65 61 73 65 64  sed and released
1ff0: 20 72 69 67 68 74 20 61 77 61 79 2e 0a 2a 2a 20   right away..** 
2000: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2010: 73 69 6d 69 6c 61 72 20 74 6f 20 61 6c 6c 6f 63  similar to alloc
2020: 61 28 29 20 69 6e 20 74 68 61 74 20 69 74 20 69  a() in that it i
2030: 73 20 6e 6f 74 20 69 6e 74 65 6e 64 65 64 0a 2a  s not intended.*
2040: 2a 20 66 6f 72 20 73 69 74 75 61 74 69 6f 6e 73  * for situations
2050: 20 77 68 65 72 65 20 74 68 65 20 6d 65 6d 6f 72   where the memor
2060: 79 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20  y might be held 
2070: 6c 6f 6e 67 2d 74 65 72 6d 2e 20 20 54 68 69 73  long-term.  This
2080: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 69  .** routine is i
2090: 6e 74 65 6e 64 65 64 20 74 6f 20 67 65 74 20 6d  ntended to get m
20a0: 65 6d 6f 72 79 20 74 6f 20 6f 6c 64 20 6c 61 72  emory to old lar
20b0: 67 65 20 74 72 61 6e 73 69 65 6e 74 20 64 61 74  ge transient dat
20c0: 61 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  a.** structures 
20d0: 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 74 20 6e  that would not n
20e0: 6f 72 6d 61 6c 6c 79 20 66 69 74 20 6f 6e 20 74  ormally fit on t
20f0: 68 65 20 73 74 61 63 6b 20 6f 66 20 61 6e 0a 2a  he stack of an.*
2100: 2a 20 65 6d 62 65 64 64 65 64 20 70 72 6f 63 65  * embedded proce
2110: 73 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ssor..*/.void *s
2120: 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
2130: 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f  loc(int n){.  vo
2140: 69 64 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  id *p;.  assert(
2150: 20 6e 3e 30 20 29 3b 0a 0a 23 69 66 20 53 51 4c   n>0 );..#if SQL
2160: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
2170: 30 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 44  0 && !defined(ND
2180: 45 42 55 47 29 0a 20 20 2f 2a 20 56 65 72 69 66  EBUG).  /* Verif
2190: 79 20 74 68 61 74 20 6e 6f 20 6d 6f 72 65 20 74  y that no more t
21a0: 68 61 6e 20 6f 6e 65 20 73 63 72 61 74 63 68 20  han one scratch 
21b0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 65 72 20 74  allocation per t
21c0: 68 72 65 61 64 0a 20 20 2a 2a 20 69 73 20 6f 75  hread.  ** is ou
21d0: 74 73 74 61 6e 64 69 6e 67 20 61 74 20 6f 6e 65  tstanding at one
21e0: 20 74 69 6d 65 2e 20 20 28 54 68 69 73 20 69 73   time.  (This is
21f0: 20 6f 6e 6c 79 20 63 68 65 63 6b 65 64 20 69 6e   only checked in
2200: 20 74 68 65 0a 20 20 2a 2a 20 73 69 6e 67 6c 65   the.  ** single
2210: 2d 74 68 72 65 61 64 65 64 20 63 61 73 65 20 73  -threaded case s
2220: 69 6e 63 65 20 63 68 65 63 6b 69 6e 67 20 69 6e  ince checking in
2230: 20 74 68 65 20 6d 75 6c 74 69 2d 74 68 72 65 61   the multi-threa
2240: 64 65 64 20 63 61 73 65 0a 20 20 2a 2a 20 77 6f  ded case.  ** wo
2250: 75 6c 64 20 62 65 20 6d 75 63 68 20 6d 6f 72 65  uld be much more
2260: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 29 20 2a   complicated.) *
2270: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 63 72 61  /.  assert( scra
2280: 74 63 68 41 6c 6c 6f 63 4f 75 74 3d 3d 30 20 29  tchAllocOut==0 )
2290: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
22a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
22b0: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 3c 6e 20  fig.szScratch<n 
22c0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 63 72 61  ){.    goto scra
22d0: 74 63 68 5f 6f 76 65 72 66 6c 6f 77 3b 0a 20 20  tch_overflow;.  
22e0: 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 73 71 6c  }else{  .    sql
22f0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2300: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
2310: 20 20 69 66 28 20 6d 65 6d 30 2e 6e 53 63 72 61    if( mem0.nScra
2320: 74 63 68 46 72 65 65 3d 3d 30 20 29 7b 0a 20 20  tchFree==0 ){.  
2330: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2340: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
2350: 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ex);.      goto 
2360: 73 63 72 61 74 63 68 5f 6f 76 65 72 66 6c 6f 77  scratch_overflow
2370: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2380: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2390: 69 20 3d 20 6d 65 6d 30 2e 61 53 63 72 61 74 63  i = mem0.aScratc
23a0: 68 46 72 65 65 5b 2d 2d 6d 65 6d 30 2e 6e 53 63  hFree[--mem0.nSc
23b0: 72 61 74 63 68 46 72 65 65 5d 3b 0a 20 20 20 20  ratchFree];.    
23c0: 20 20 69 20 2a 3d 20 73 71 6c 69 74 65 33 47 6c    i *= sqlite3Gl
23d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72  obalConfig.szScr
23e0: 61 74 63 68 3b 0a 20 20 20 20 20 20 73 71 6c 69  atch;.      sqli
23f0: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
2400: 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54  ITE_STATUS_SCRAT
2410: 43 48 5f 55 53 45 44 2c 20 31 29 3b 0a 20 20 20  CH_USED, 1);.   
2420: 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73     sqlite3Status
2430: 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55  Set(SQLITE_STATU
2440: 53 5f 53 43 52 41 54 43 48 5f 53 49 5a 45 2c 20  S_SCRATCH_SIZE, 
2450: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
2460: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
2470: 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  m0.mutex);.     
2480: 20 70 20 3d 20 28 76 6f 69 64 2a 29 26 28 28 63   p = (void*)&((c
2490: 68 61 72 2a 29 73 71 6c 69 74 65 33 47 6c 6f 62  har*)sqlite3Glob
24a0: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
24b0: 68 29 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  h)[i];.    }.  }
24c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
24d0: 41 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65  ADSAFE==0 && !de
24e0: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20  fined(NDEBUG).  
24f0: 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 20  scratchAllocOut 
2500: 3d 20 70 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  = p!=0;.#endif..
2510: 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 73 63 72    return p;..scr
2520: 61 74 63 68 5f 6f 76 65 72 66 6c 6f 77 3a 0a 20  atch_overflow:. 
2530: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2540: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
2550: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2560: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d  _mutex_enter(mem
2570: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  0.mutex);.    sq
2580: 6c 69 74 65 33 53 74 61 74 75 73 53 65 74 28 53  lite3StatusSet(S
2590: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52  QLITE_STATUS_SCR
25a0: 41 54 43 48 5f 53 49 5a 45 2c 20 6e 29 3b 0a 20  ATCH_SIZE, n);. 
25b0: 20 20 20 6e 20 3d 20 6d 61 6c 6c 6f 63 57 69 74     n = mallocWit
25c0: 68 41 6c 61 72 6d 28 6e 2c 20 26 70 29 3b 0a 20  hAlarm(n, &p);. 
25d0: 20 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74     if( p ) sqlit
25e0: 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49  e3StatusAdd(SQLI
25f0: 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43  TE_STATUS_SCRATC
2600: 48 5f 4f 56 45 52 46 4c 4f 57 2c 20 6e 29 3b 0a  H_OVERFLOW, n);.
2610: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2620: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
2630: 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ex);.  }else{.  
2640: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f    p = sqlite3Glo
2650: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c  balConfig.m.xMal
2660: 6c 6f 63 28 6e 29 3b 0a 20 20 7d 0a 23 69 66 20  loc(n);.  }.#if 
2670: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2680: 45 3d 3d 30 20 26 26 20 21 64 65 66 69 6e 65 64  E==0 && !defined
2690: 28 4e 44 45 42 55 47 29 0a 20 20 73 63 72 61 74  (NDEBUG).  scrat
26a0: 63 68 41 6c 6c 6f 63 4f 75 74 20 3d 20 70 21 3d  chAllocOut = p!=
26b0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
26c0: 72 6e 20 70 3b 20 20 20 20 0a 7d 0a 76 6f 69 64  rn p;    .}.void
26d0: 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
26e0: 72 65 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20  ree(void *p){.  
26f0: 69 66 28 20 70 20 29 7b 0a 0a 23 69 66 20 53 51  if( p ){..#if SQ
2700: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d  LITE_THREADSAFE=
2710: 3d 30 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  =0 && !defined(N
2720: 44 45 42 55 47 29 0a 20 20 20 20 2f 2a 20 56 65  DEBUG).    /* Ve
2730: 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6d 6f 72  rify that no mor
2740: 65 20 74 68 61 6e 20 6f 6e 65 20 73 63 72 61 74  e than one scrat
2750: 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 65  ch allocation pe
2760: 72 20 74 68 72 65 61 64 0a 20 20 20 20 2a 2a 20  r thread.    ** 
2770: 69 73 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61  is outstanding a
2780: 74 20 6f 6e 65 20 74 69 6d 65 2e 20 20 28 54 68  t one time.  (Th
2790: 69 73 20 69 73 20 6f 6e 6c 79 20 63 68 65 63 6b  is is only check
27a0: 65 64 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ed in the.    **
27b0: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
27c0: 20 63 61 73 65 20 73 69 6e 63 65 20 63 68 65 63   case since chec
27d0: 6b 69 6e 67 20 69 6e 20 74 68 65 20 6d 75 6c 74  king in the mult
27e0: 69 2d 74 68 72 65 61 64 65 64 20 63 61 73 65 0a  i-threaded case.
27f0: 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 62 65 20      ** would be 
2800: 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69  much more compli
2810: 63 61 74 65 64 2e 29 20 2a 2f 0a 20 20 20 20 61  cated.) */.    a
2820: 73 73 65 72 74 28 20 73 63 72 61 74 63 68 41 6c  ssert( scratchAl
2830: 6c 6f 63 4f 75 74 3d 3d 31 20 29 3b 0a 20 20 20  locOut==1 );.   
2840: 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74   scratchAllocOut
2850: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
2860: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2870: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
2880: 63 68 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ch==0.          
2890: 20 7c 7c 20 70 3c 73 71 6c 69 74 65 33 47 6c 6f   || p<sqlite3Glo
28a0: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
28b0: 63 68 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ch.           ||
28c0: 20 70 3e 3d 28 76 6f 69 64 2a 29 6d 65 6d 30 2e   p>=(void*)mem0.
28d0: 61 53 63 72 61 74 63 68 46 72 65 65 20 29 7b 0a  aScratchFree ){.
28e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
28f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d  3GlobalConfig.bM
2900: 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 20 20  emstat ){.      
2910: 20 20 69 6e 74 20 69 53 69 7a 65 20 3d 20 73 71    int iSize = sq
2920: 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28  lite3MallocSize(
2930: 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
2940: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2950: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20  mem0.mutex);.   
2960: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74       sqlite3Stat
2970: 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41  usAdd(SQLITE_STA
2980: 54 55 53 5f 53 43 52 41 54 43 48 5f 4f 56 45 52  TUS_SCRATCH_OVER
2990: 46 4c 4f 57 2c 20 2d 69 53 69 7a 65 29 3b 0a 20  FLOW, -iSize);. 
29a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
29b0: 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53  atusAdd(SQLITE_S
29c0: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
29d0: 44 2c 20 2d 69 53 69 7a 65 29 3b 0a 20 20 20 20  D, -iSize);.    
29e0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
29f0: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28  lConfig.m.xFree(
2a00: 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
2a10: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2a20: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20  mem0.mutex);.   
2a30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a40: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2a50: 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29  onfig.m.xFree(p)
2a60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2a70: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
2a80: 3b 0a 20 20 20 20 20 20 69 20 3d 20 28 75 38 20  ;.      i = (u8 
2a90: 2a 29 70 20 2d 20 28 75 38 20 2a 29 73 71 6c 69  *)p - (u8 *)sqli
2aa0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2ab0: 70 53 63 72 61 74 63 68 3b 0a 20 20 20 20 20 20  pScratch;.      
2ac0: 69 20 2f 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  i /= sqlite3Glob
2ad0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  alConfig.szScrat
2ae0: 63 68 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ch;.      assert
2af0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 73 71 6c 69  ( i>=0 && i<sqli
2b00: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2b10: 6e 53 63 72 61 74 63 68 20 29 3b 0a 20 20 20 20  nScratch );.    
2b20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2b30: 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78  enter(mem0.mutex
2b40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2b50: 20 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46 72   mem0.nScratchFr
2b60: 65 65 3c 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ee<sqlite3Global
2b70: 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20  Config.nScratch 
2b80: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 30 2e 61 53  );.      mem0.aS
2b90: 63 72 61 74 63 68 46 72 65 65 5b 6d 65 6d 30 2e  cratchFree[mem0.
2ba0: 6e 53 63 72 61 74 63 68 46 72 65 65 2b 2b 5d 20  nScratchFree++] 
2bb0: 3d 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = i;.      sqlit
2bc0: 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49  e3StatusAdd(SQLI
2bd0: 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43  TE_STATUS_SCRATC
2be0: 48 5f 55 53 45 44 2c 20 2d 31 29 3b 0a 20 20 20  H_USED, -1);.   
2bf0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2c00: 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65  _leave(mem0.mute
2c10: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  x);.    }.  }.}.
2c20: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2c30: 6d 65 6d 6f 72 79 20 74 6f 20 62 65 20 75 73 65  memory to be use
2c40: 64 20 62 79 20 74 68 65 20 70 61 67 65 20 63 61  d by the page ca
2c50: 63 68 65 2e 20 20 4d 61 6b 65 20 75 73 65 20 6f  che.  Make use o
2c60: 66 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  f the.** memory 
2c70: 62 75 66 66 65 72 20 70 72 6f 76 69 64 65 64 20  buffer provided 
2c80: 62 79 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  by SQLITE_CONFIG
2c90: 5f 50 41 47 45 43 41 43 48 45 20 69 66 20 74 68  _PAGECACHE if th
2ca0: 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2a 20 61 6e  ere is one.** an
2cb0: 64 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 69 73  d that memory is
2cc0: 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 73 69   of the right si
2cd0: 7a 65 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f  ze and is not co
2ce0: 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 63 6f 6e 73  mpletely.** cons
2cf0: 75 6d 65 64 2e 20 20 4f 74 68 65 72 77 69 73 65  umed.  Otherwise
2d00: 2c 20 66 61 69 6c 6f 76 65 72 20 74 6f 20 73 71  , failover to sq
2d10: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 0a 2a  lite3Malloc()..*
2d20: 2f 0a 23 69 66 20 30 0a 76 6f 69 64 20 2a 73 71  /.#if 0.void *sq
2d30: 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
2d40: 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a  int n){.  void *
2d50: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  p;.  assert( n>0
2d60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e   );.  assert( (n
2d70: 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 3b 0a   & (n-1))==0 );.
2d80: 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 35 31 32    assert( n>=512
2d90: 20 26 26 20 6e 3c 3d 33 32 37 36 38 20 29 3b 0a   && n<=32768 );.
2da0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2db0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67  obalConfig.szPag
2dc0: 65 3c 6e 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  e<n ){.    goto 
2dd0: 70 61 67 65 5f 6f 76 65 72 66 6c 6f 77 3b 0a 20  page_overflow;. 
2de0: 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 73 71   }else{  .    sq
2df0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2e00: 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  r(mem0.mutex);. 
2e10: 20 20 20 69 66 28 20 6d 65 6d 30 2e 6e 50 61 67     if( mem0.nPag
2e20: 65 46 72 65 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eFree==0 ){.    
2e30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2e40: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
2e50: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  );.      goto pa
2e60: 67 65 5f 6f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ge_overflow;.   
2e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
2e80: 74 20 69 3b 0a 20 20 20 20 20 20 69 20 3d 20 6d  t i;.      i = m
2e90: 65 6d 30 2e 61 50 61 67 65 46 72 65 65 5b 2d 2d  em0.aPageFree[--
2ea0: 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65 5d 3b  mem0.nPageFree];
2eb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
2ec0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e  utex_leave(mem0.
2ed0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 69 20  mutex);.      i 
2ee0: 2a 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  *= sqlite3Global
2ef0: 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 3b 0a 20  Config.szPage;. 
2f00: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74       sqlite3Stat
2f10: 75 73 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41  usSet(SQLITE_STA
2f20: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49  TUS_PAGECACHE_SI
2f30: 5a 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71  ZE, n);.      sq
2f40: 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53  lite3StatusAdd(S
2f50: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
2f60: 45 43 41 43 48 45 5f 55 53 45 44 2c 20 31 29 3b  ECACHE_USED, 1);
2f70: 0a 20 20 20 20 20 20 70 20 3d 20 28 76 6f 69 64  .      p = (void
2f80: 2a 29 26 28 28 63 68 61 72 2a 29 73 71 6c 69 74  *)&((char*)sqlit
2f90: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2fa0: 50 61 67 65 29 5b 69 5d 3b 0a 20 20 20 20 7d 0a  Page)[i];.    }.
2fb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
2fc0: 0a 70 61 67 65 5f 6f 76 65 72 66 6c 6f 77 3a 0a  .page_overflow:.
2fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2fe0: 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74  balConfig.bMemst
2ff0: 61 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  at ){.    sqlite
3000: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65  3_mutex_enter(me
3010: 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 73  m0.mutex);.    s
3020: 71 6c 69 74 65 33 53 74 61 74 75 73 53 65 74 28  qlite3StatusSet(
3030: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
3040: 47 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 6e 29  GECACHE_SIZE, n)
3050: 3b 0a 20 20 20 20 6e 20 3d 20 6d 61 6c 6c 6f 63  ;.    n = malloc
3060: 57 69 74 68 41 6c 61 72 6d 28 6e 2c 20 26 70 29  WithAlarm(n, &p)
3070: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 73 71  ;.    if( p ) sq
3080: 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53  lite3StatusAdd(S
3090: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
30a0: 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c  ECACHE_OVERFLOW,
30b0: 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
30c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
30d0: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73  0.mutex);.  }els
30e0: 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e{.    p = sqlit
30f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3100: 2e 78 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d  .xMalloc(n);.  }
3110: 0a 20 20 72 65 74 75 72 6e 20 70 3b 20 20 20 20  .  return p;    
3120: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
3130: 61 67 65 46 72 65 65 28 76 6f 69 64 20 2a 70 29  ageFree(void *p)
3140: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
3150: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3160: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 3d 3d  alConfig.pPage==
3170: 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
3180: 70 3c 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  p<sqlite3GlobalC
3190: 6f 6e 66 69 67 2e 70 50 61 67 65 0a 20 20 20 20  onfig.pPage.    
31a0: 20 20 20 20 20 20 20 7c 7c 20 70 3e 3d 28 76 6f         || p>=(vo
31b0: 69 64 2a 29 6d 65 6d 30 2e 61 50 61 67 65 46 72  id*)mem0.aPageFr
31c0: 65 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ee ){.      /* I
31d0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
31e0: 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 69 6f 6e   page allocation
31f0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
3200: 6f 6d 20 61 20 72 65 67 75 6c 61 72 20 0a 20 20  om a regular .  
3210: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73      ** call to s
3220: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3230: 64 73 2e 78 4d 61 6c 6c 6f 63 28 29 20 28 61 20  ds.xMalloc() (a 
3240: 70 61 67 65 2d 63 61 63 68 65 2d 6d 65 6d 6f 72  page-cache-memor
3250: 79 20 0a 20 20 20 20 20 20 2a 2a 20 22 6f 76 65  y .      ** "ove
3260: 72 66 6c 6f 77 22 29 2e 20 46 72 65 65 20 74 68  rflow"). Free th
3270: 65 20 62 6c 6f 63 6b 20 77 69 74 68 20 73 71 6c  e block with sql
3280: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3290: 2e 78 46 72 65 65 28 29 2e 0a 20 20 20 20 20 20  .xFree()..      
32a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
32b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
32c0: 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20  .bMemstat ){.   
32d0: 20 20 20 20 20 69 6e 74 20 69 53 69 7a 65 20 3d       int iSize =
32e0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69   sqlite3MallocSi
32f0: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 73  ze(p);.        s
3300: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
3310: 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a  er(mem0.mutex);.
3320: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
3330: 74 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f  tatusAdd(SQLITE_
3340: 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
3350: 5f 4f 56 45 52 46 4c 4f 57 2c 20 2d 69 53 69 7a  _OVERFLOW, -iSiz
3360: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
3370: 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c  te3StatusAdd(SQL
3380: 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
3390: 59 5f 55 53 45 44 2c 20 2d 69 53 69 7a 65 29 3b  Y_USED, -iSize);
33a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
33c0: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  Free(p);.       
33d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
33e0: 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29  eave(mem0.mutex)
33f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
3410: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 46 72  obalConfig.m.xFr
3420: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ee(p);.      }. 
3430: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3440: 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6c 6c 6f  /* The page allo
3450: 63 61 74 69 6f 6e 20 77 61 73 20 61 6c 6c 6f 63  cation was alloc
3460: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 71  ated from the sq
3470: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3480: 67 2e 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  g.pPage.      **
3490: 20 62 75 66 66 65 72 2e 20 49 6e 20 74 68 69 73   buffer. In this
34a0: 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
34b0: 73 20 61 64 64 20 74 68 65 20 69 6e 64 65 78 20  s add the index 
34c0: 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 0a 20  of the page in. 
34d0: 20 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69       ** the sqli
34e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
34f0: 70 50 61 67 65 20 61 72 72 61 79 20 74 6f 20 74  pPage array to t
3500: 68 65 20 73 65 74 20 6f 66 20 66 72 65 65 20 69  he set of free i
3510: 6e 64 65 78 65 73 20 73 74 6f 72 65 64 0a 20 20  ndexes stored.  
3520: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 65      ** in the me
3530: 6d 30 2e 61 50 61 67 65 46 72 65 65 5b 5d 20 61  m0.aPageFree[] a
3540: 72 72 61 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rray..      */. 
3550: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
3560: 20 20 69 20 3d 20 28 75 38 20 2a 29 70 20 2d 20    i = (u8 *)p - 
3570: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 47 6c 6f  (u8 *)sqlite3Glo
3580: 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 3b  balConfig.pPage;
3590: 0a 20 20 20 20 20 20 69 20 2f 3d 20 73 71 6c 69  .      i /= sqli
35a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
35b0: 73 7a 50 61 67 65 3b 0a 20 20 20 20 20 20 61 73  szPage;.      as
35c0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
35d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
35e0: 66 69 67 2e 6e 50 61 67 65 20 29 3b 0a 20 20 20  fig.nPage );.   
35f0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
3600: 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65  _enter(mem0.mute
3610: 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  x);.      assert
3620: 28 20 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65  ( mem0.nPageFree
3630: 3c 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  <sqlite3GlobalCo
3640: 6e 66 69 67 2e 6e 50 61 67 65 20 29 3b 0a 20 20  nfig.nPage );.  
3650: 20 20 20 20 6d 65 6d 30 2e 61 50 61 67 65 46 72      mem0.aPageFr
3660: 65 65 5b 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65  ee[mem0.nPageFre
3670: 65 2b 2b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  e++] = i;.      
3680: 73 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 64  sqlite3StatusAdd
3690: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50  (SQLITE_STATUS_P
36a0: 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 2d  AGECACHE_USED, -
36b0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
36c0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
36d0: 6d 30 2e 6d 75 74 65 78 29 3b 0a 23 69 66 20 21  m0.mutex);.#if !
36e0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
36f0: 26 26 20 30 0a 20 20 20 20 20 20 2f 2a 20 41 73  && 0.      /* As
3700: 73 65 72 74 20 74 68 61 74 20 61 20 64 75 70 6c  sert that a dupl
3710: 69 63 61 74 65 20 77 61 73 20 6e 6f 74 20 6a 75  icate was not ju
3720: 73 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  st inserted into
3730: 20 61 50 61 67 65 46 72 65 65 5b 5d 2e 20 2a 2f   aPageFree[]. */
3740: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
3750: 69 3c 6d 65 6d 30 2e 6e 50 61 67 65 46 72 65 65  i<mem0.nPageFree
3760: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
3770: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 30 2e 61    assert( mem0.a
3780: 50 61 67 65 46 72 65 65 5b 69 5d 21 3d 6d 65 6d  PageFree[i]!=mem
3790: 30 2e 61 50 61 67 65 46 72 65 65 5b 6d 65 6d 30  0.aPageFree[mem0
37a0: 2e 6e 50 61 67 65 46 72 65 65 2d 31 5d 20 29 3b  .nPageFree-1] );
37b0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
37c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
37d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 52 55 45 20 69  if../*.** TRUE i
37e0: 66 20 70 20 69 73 20 61 20 6c 6f 6f 6b 61 73 69  f p is a lookasi
37f0: 64 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  de memory alloca
3800: 74 69 6f 6e 20 66 72 6f 6d 20 64 62 0a 2a 2f 0a  tion from db.*/.
3810: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 6f 6f  static int isLoo
3820: 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a  kaside(sqlite3 *
3830: 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20  db, void *p){.  
3840: 72 65 74 75 72 6e 20 64 62 20 26 26 20 70 20 26  return db && p &
3850: 26 20 70 3e 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69  & p>=db->lookasi
3860: 64 65 2e 70 53 74 61 72 74 20 26 26 20 70 3c 64  de.pStart && p<d
3870: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e  b->lookaside.pEn
3880: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
3890: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
38a0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
38b0: 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 62  on previously ob
38c0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
38d0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 6f  qlite3Malloc() o
38e0: 72 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  r sqlite3_malloc
38f0: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
3900: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 76 6f 69  e3MallocSize(voi
3910: 64 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  d *p){.  return 
3920: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3930: 66 69 67 2e 6d 2e 78 53 69 7a 65 28 70 29 3b 0a  fig.m.xSize(p);.
3940: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 44 62 4d  }.int sqlite3DbM
3950: 61 6c 6c 6f 63 53 69 7a 65 28 73 71 6c 69 74 65  allocSize(sqlite
3960: 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b  3 *db, void *p){
3970: 0a 20 20 69 66 28 20 69 73 4c 6f 6f 6b 61 73 69  .  if( isLookasi
3980: 64 65 28 64 62 2c 20 70 29 20 29 7b 0a 20 20 20  de(db, p) ){.   
3990: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 6f 6f 6b   return db->look
39a0: 61 73 69 64 65 2e 73 7a 3b 0a 20 20 7d 65 6c 73  aside.sz;.  }els
39b0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
39c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
39d0: 67 2e 6d 2e 78 53 69 7a 65 28 70 29 3b 0a 20 20  g.m.xSize(p);.  
39e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
39f0: 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c  memory previousl
3a00: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
3a10: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e  sqlite3Malloc().
3a20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3a30: 5f 66 72 65 65 28 76 6f 69 64 20 2a 70 29 7b 0a  _free(void *p){.
3a40: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3a50: 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
3a60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3a70: 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 73  Memstat ){.    s
3a80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
3a90: 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a  er(mem0.mutex);.
3aa0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75      sqlite3Statu
3ab0: 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54  sAdd(SQLITE_STAT
3ac0: 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20  US_MEMORY_USED, 
3ad0: 2d 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69  -sqlite3MallocSi
3ae0: 7a 65 28 70 29 29 3b 0a 20 20 20 20 73 71 6c 69  ze(p));.    sqli
3af0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3b00: 6d 2e 78 46 72 65 65 28 70 29 3b 0a 20 20 20 20  m.xFree(p);.    
3b10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
3b20: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
3b30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
3b40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3b50: 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b 0a 20 20  g.m.xFree(p);.  
3b60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
3b70: 6d 65 6d 6f 72 79 20 74 68 61 74 20 6d 69 67 68  memory that migh
3b80: 74 20 62 65 20 61 73 73 6f 63 69 61 74 65 64 20  t be associated 
3b90: 77 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61  with a particula
3ba0: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  r database.** co
3bb0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
3bc0: 64 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  d sqlite3DbFree(
3bd0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
3be0: 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 69 73 4c  d *p){.  if( isL
3bf0: 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 29 20  ookaside(db, p) 
3c00: 29 7b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  ){.    Lookaside
3c10: 53 6c 6f 74 20 2a 70 42 75 66 20 3d 20 28 4c 6f  Slot *pBuf = (Lo
3c20: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 3b 0a  okasideSlot*)p;.
3c30: 20 20 20 20 70 42 75 66 2d 3e 70 4e 65 78 74 20      pBuf->pNext 
3c40: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
3c50: 70 46 72 65 65 3b 0a 20 20 20 20 64 62 2d 3e 6c  pFree;.    db->l
3c60: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d  ookaside.pFree =
3c70: 20 70 42 75 66 3b 0a 20 20 20 20 64 62 2d 3e 6c   pBuf;.    db->l
3c80: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 2d 2d 3b  ookaside.nOut--;
3c90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
3ca0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
3cb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3cc0: 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  ge the size of a
3cd0: 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72  n existing memor
3ce0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  y allocation.*/.
3cf0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 52 65 61  void *sqlite3Rea
3d00: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c  lloc(void *pOld,
3d10: 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20   int nBytes){.  
3d20: 69 6e 74 20 6e 4f 6c 64 2c 20 6e 4e 65 77 3b 0a  int nOld, nNew;.
3d30: 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20    void *pNew;.  
3d40: 69 66 28 20 70 4f 6c 64 3d 3d 30 20 29 7b 0a 20  if( pOld==0 ){. 
3d50: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
3d60: 33 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b  3Malloc(nBytes);
3d70: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42 79 74 65  .  }.  if( nByte
3d80: 73 3c 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  s<=0 ){.    sqli
3d90: 74 65 33 5f 66 72 65 65 28 70 4f 6c 64 29 3b 0a  te3_free(pOld);.
3da0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3db0: 7d 0a 20 20 6e 4f 6c 64 20 3d 20 73 71 6c 69 74  }.  nOld = sqlit
3dc0: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4f 6c  e3MallocSize(pOl
3dd0: 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  d);.  if( sqlite
3de0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d  3GlobalConfig.bM
3df0: 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 73 71  emstat ){.    sq
3e00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
3e10: 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  r(mem0.mutex);. 
3e20: 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73     sqlite3Status
3e30: 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55  Set(SQLITE_STATU
3e40: 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 6e  S_MALLOC_SIZE, n
3e50: 42 79 74 65 73 29 3b 0a 20 20 20 20 6e 4e 65 77  Bytes);.    nNew
3e60: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
3e70: 43 6f 6e 66 69 67 2e 6d 2e 78 52 6f 75 6e 64 75  Config.m.xRoundu
3e80: 70 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 69  p(nBytes);.    i
3e90: 66 28 20 6e 4f 6c 64 3d 3d 6e 4e 65 77 20 29 7b  f( nOld==nNew ){
3ea0: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f  .      pNew = pO
3eb0: 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ld;.    }else{. 
3ec0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3ed0: 53 74 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49  StatusValue(SQLI
3ee0: 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
3ef0: 5f 55 53 45 44 29 2b 6e 4e 65 77 2d 6e 4f 6c 64  _USED)+nNew-nOld
3f00: 20 3e 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20   >= .           
3f10: 20 6d 65 6d 30 2e 61 6c 61 72 6d 54 68 72 65 73   mem0.alarmThres
3f20: 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  hold ){.        
3f30: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61  sqlite3MallocAla
3f40: 72 6d 28 6e 4e 65 77 2d 6e 4f 6c 64 29 3b 0a 20  rm(nNew-nOld);. 
3f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
3f60: 77 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  w = sqlite3Globa
3f70: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c 6c  lConfig.m.xReall
3f80: 6f 63 28 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b 0a  oc(pOld, nNew);.
3f90: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
3fa0: 30 20 26 26 20 6d 65 6d 30 2e 61 6c 61 72 6d 43  0 && mem0.alarmC
3fb0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
3fc0: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
3fd0: 41 6c 61 72 6d 28 6e 42 79 74 65 73 29 3b 0a 20  Alarm(nBytes);. 
3fe0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
3ff0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4000: 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 4f 6c  g.m.xRealloc(pOl
4010: 64 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  d, nNew);.      
4020: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  }.      if( pNew
4030: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77   ){.        nNew
4040: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
4050: 53 69 7a 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Size(pNew);.    
4060: 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 75      sqlite3Statu
4070: 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 54  sAdd(SQLITE_STAT
4080: 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20  US_MEMORY_USED, 
4090: 6e 4e 65 77 2d 6e 4f 6c 64 29 3b 0a 20 20 20 20  nNew-nOld);.    
40a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
40b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
40c0: 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  e(mem0.mutex);. 
40d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
40e0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
40f0: 43 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f  Config.m.xReallo
4100: 63 28 70 4f 6c 64 2c 20 6e 42 79 74 65 73 29 3b  c(pOld, nBytes);
4110: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
4120: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ew;.}../*.** The
4130: 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63   public interfac
4140: 65 20 74 6f 20 73 71 6c 69 74 65 33 52 65 61 6c  e to sqlite3Real
4150: 6c 6f 63 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  loc.  Make sure 
4160: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 0a  that the memory.
4170: 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 69 73 20  ** subsystem is 
4180: 69 6e 69 74 69 61 6c 69 7a 65 64 20 70 72 69 6f  initialized prio
4190: 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 73 71  r to invoking sq
41a0: 6c 69 74 65 52 65 61 6c 6c 6f 63 2e 0a 2a 2f 0a  liteRealloc..*/.
41b0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 65  void *sqlite3_re
41c0: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 4f 6c 64  alloc(void *pOld
41d0: 2c 20 69 6e 74 20 6e 29 7b 0a 23 69 66 6e 64 65  , int n){.#ifnde
41e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
41f0: 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c  TOINIT.  if( sql
4200: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
4210: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
4220: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73 71  ndif.  return sq
4230: 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 70 4f 6c  lite3Realloc(pOl
4240: 64 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  d, n);.}.../*.**
4250: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65   Allocate and ze
4260: 72 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 20 0a 76  ro memory..*/ .v
4270: 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 61 6c 6c  oid *sqlite3Mall
4280: 6f 63 5a 65 72 6f 28 69 6e 74 20 6e 29 7b 0a 20  ocZero(int n){. 
4290: 20 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69 74   void *p = sqlit
42a0: 65 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 69  e3Malloc(n);.  i
42b0: 66 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73  f( p ){.    mems
42c0: 65 74 28 70 2c 20 30 2c 20 6e 29 3b 0a 20 20 7d  et(p, 0, n);.  }
42d0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
42e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
42f0: 6e 64 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 20  nd zero memory. 
4300: 20 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   If the allocati
4310: 6f 6e 20 66 61 69 6c 73 2c 20 6d 61 6b 65 0a 2a  on fails, make.*
4320: 2a 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c  * the mallocFail
4330: 65 64 20 66 6c 61 67 20 69 6e 20 74 68 65 20 63  ed flag in the c
4340: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
4350: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  r..*/.void *sqli
4360: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
4370: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
4380: 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 20 3d   n){.  void *p =
4390: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
43a0: 52 61 77 28 64 62 2c 20 6e 29 3b 0a 20 20 69 66  Raw(db, n);.  if
43b0: 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ( p ){.    memse
43c0: 74 28 70 2c 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a  t(p, 0, n);.  }.
43d0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
43e0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
43f0: 64 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 20 20  d zero memory.  
4400: 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  If the allocatio
4410: 6e 20 66 61 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a  n fails, make.**
4420: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
4430: 64 20 66 6c 61 67 20 69 6e 20 74 68 65 20 63 6f  d flag in the co
4440: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4450: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
4460: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
4470: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
4480: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20  ){.  void *p;.  
4490: 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 4c 6f  if( db ){.    Lo
44a0: 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 42 75  okasideSlot *pBu
44b0: 66 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  f;.    if( db->m
44c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
44d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
44e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
44f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
4500: 6c 65 64 20 26 26 20 6e 3c 3d 64 62 2d 3e 6c 6f  led && n<=db->lo
4510: 6f 6b 61 73 69 64 65 2e 73 7a 0a 20 20 20 20 20  okaside.sz.     
4520: 20 20 20 20 26 26 20 28 70 42 75 66 20 3d 20 64      && (pBuf = d
4530: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72  b->lookaside.pFr
4540: 65 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ee)!=0 ){.      
4550: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
4560: 72 65 65 20 3d 20 70 42 75 66 2d 3e 70 4e 65 78  ree = pBuf->pNex
4570: 74 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f  t;.      db->loo
4580: 6b 61 73 69 64 65 2e 6e 4f 75 74 2b 2b 3b 0a 20  kaside.nOut++;. 
4590: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f       if( db->loo
45a0: 6b 61 73 69 64 65 2e 6e 4f 75 74 3e 64 62 2d 3e  kaside.nOut>db->
45b0: 6c 6f 6f 6b 61 73 69 64 65 2e 6d 78 4f 75 74 20  lookaside.mxOut 
45c0: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6c  ){.        db->l
45d0: 6f 6f 6b 61 73 69 64 65 2e 6d 78 4f 75 74 20 3d  ookaside.mxOut =
45e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
45f0: 4f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Out;.      }.   
4600: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a     return (void*
4610: 29 70 42 75 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  )pBuf;.    }.  }
4620: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
4630: 6c 6c 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 21  lloc(n);.  if( !
4640: 70 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20 64  p && db ){.    d
4650: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4660: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
4670: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
4680: 73 69 7a 65 20 74 68 65 20 62 6c 6f 63 6b 20 6f  size the block o
4690: 66 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 64  f memory pointed
46a0: 20 74 6f 20 62 79 20 70 20 74 6f 20 6e 20 62 79   to by p to n by
46b0: 74 65 73 2e 20 49 66 20 74 68 65 0a 2a 2a 20 72  tes. If the.** r
46c0: 65 73 69 7a 65 20 66 61 69 6c 73 2c 20 73 65 74  esize fails, set
46d0: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
46e0: 64 20 66 6c 61 67 20 69 6e 20 74 68 65 20 63 6f  d flag in the co
46f0: 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 2e  nnection object.
4700: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
4710: 33 44 62 52 65 61 6c 6c 6f 63 28 73 71 6c 69 74  3DbRealloc(sqlit
4720: 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 2c  e3 *db, void *p,
4730: 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20   int n){.  void 
4740: 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66 28  *pNew = 0;.  if(
4750: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4760: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d==0 ){.    if( 
4770: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  p==0 ){.      re
4780: 74 75 72 6e 20 73 71 6c 69 74 65 33 44 62 4d 61  turn sqlite3DbMa
4790: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 29 3b 0a  llocRaw(db, n);.
47a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
47b0: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 29  Lookaside(db, p)
47c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3c   ){.      if( n<
47d0: 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73  =db->lookaside.s
47e0: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  z ){.        ret
47f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
4800: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
4810: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
4820: 62 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  b, n);.      if(
4830: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
4840: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c   memcpy(pNew, p,
4850: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73   db->lookaside.s
4860: 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  z);.        sqli
4870: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
4880: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
4890: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  lse{.      pNew 
48a0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
48b0: 63 28 70 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  c(p, n);.      i
48c0: 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20  f( !pNew ){.    
48d0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
48e0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
48f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
4900: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4910: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72  .** Attempt to r
4920: 65 61 6c 6c 6f 63 61 74 65 20 70 2e 20 20 49 66  eallocate p.  If
4930: 20 74 68 65 20 72 65 61 6c 6c 6f 63 61 74 69 6f   the reallocatio
4940: 6e 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 66 72  n fails, then fr
4950: 65 65 20 70 0a 2a 2a 20 61 6e 64 20 73 65 74 20  ee p.** and set 
4960: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
4970: 20 66 6c 61 67 20 69 6e 20 74 68 65 20 64 61 74   flag in the dat
4980: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
4990: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
49a0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
49b0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
49c0: 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oid *p, int n){.
49d0: 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20    void *pNew;.  
49e0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
49f0: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 2c 20 6e  Realloc(db, p, n
4a00: 29 3b 0a 20 20 69 66 28 20 21 70 4e 65 77 20 29  );.  if( !pNew )
4a10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
4a20: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
4a30: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
4a40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63  ../*.** Make a c
4a50: 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20  opy of a string 
4a60: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4a70: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
4a80: 6c 6c 6f 63 28 29 2e 20 54 68 65 73 65 20 0a 2a  lloc(). These .*
4a90: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6c 6c  * functions call
4aa0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61   sqlite3MallocRa
4ab0: 77 28 29 20 64 69 72 65 63 74 6c 79 20 69 6e 73  w() directly ins
4ac0: 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 4d 61  tead of sqliteMa
4ad0: 6c 6c 6f 63 28 29 2e 20 54 68 69 73 0a 2a 2a 20  lloc(). This.** 
4ae0: 69 73 20 62 65 63 61 75 73 65 20 77 68 65 6e 20  is because when 
4af0: 6d 65 6d 6f 72 79 20 64 65 62 75 67 67 69 6e 67  memory debugging
4b00: 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74   is turned on, t
4b10: 68 65 73 65 20 74 77 6f 20 66 75 6e 63 74 69 6f  hese two functio
4b20: 6e 73 20 61 72 65 20 0a 2a 2a 20 63 61 6c 6c 65  ns are .** calle
4b30: 64 20 76 69 61 20 6d 61 63 72 6f 73 20 74 68 61  d via macros tha
4b40: 74 20 72 65 63 6f 72 64 20 74 68 65 20 63 75 72  t record the cur
4b50: 72 65 6e 74 20 66 69 6c 65 20 61 6e 64 20 6c 69  rent file and li
4b60: 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ne number in the
4b70: 0a 2a 2a 20 54 68 72 65 61 64 44 61 74 61 20 73  .** ThreadData s
4b80: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 63 68 61  tructure..*/.cha
4b90: 72 20 2a 73 71 6c 69 74 65 33 44 62 53 74 72 44  r *sqlite3DbStrD
4ba0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
4bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
4bc0: 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20    char *zNew;.  
4bd0: 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 69 66 28 20  size_t n;.  if( 
4be0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  z==0 ){.    retu
4bf0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  rn 0;.  }.  n = 
4c00: 73 74 72 6c 65 6e 28 7a 29 2b 31 3b 0a 20 20 61  strlen(z)+1;.  a
4c10: 73 73 65 72 74 28 20 28 6e 26 30 78 37 66 66 66  ssert( (n&0x7fff
4c20: 66 66 66 66 29 3d 3d 6e 20 29 3b 0a 20 20 7a 4e  ffff)==n );.  zN
4c30: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
4c40: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 28 69 6e 74  llocRaw(db, (int
4c50: 29 6e 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20  )n);.  if( zNew 
4c60: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e  ){.    memcpy(zN
4c70: 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 20  ew, z, n);.  }. 
4c80: 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a   return zNew;.}.
4c90: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 44 62 53  char *sqlite3DbS
4ca0: 74 72 4e 44 75 70 28 73 71 6c 69 74 65 33 20 2a  trNDup(sqlite3 *
4cb0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
4cc0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 63 68 61  z, int n){.  cha
4cd0: 72 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a  r *zNew;.  if( z
4ce0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
4cf0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 0;.  }.  asser
4d00: 74 28 20 28 6e 26 30 78 37 66 66 66 66 66 66 66  t( (n&0x7fffffff
4d10: 29 3d 3d 6e 20 29 3b 0a 20 20 7a 4e 65 77 20 3d  )==n );.  zNew =
4d20: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4d30: 52 61 77 28 64 62 2c 20 6e 2b 31 29 3b 0a 20 20  Raw(db, n+1);.  
4d40: 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20  if( zNew ){.    
4d50: 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20  memcpy(zNew, z, 
4d60: 6e 29 3b 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20  n);.    zNew[n] 
4d70: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4d80: 6e 20 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zNew;.}../*.**
4d90: 20 43 72 65 61 74 65 20 61 20 73 74 72 69 6e 67   Create a string
4da0: 20 66 72 6f 6d 20 74 68 65 20 7a 46 72 6f 6d 61   from the zFroma
4db0: 74 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 74  t argument and t
4dc0: 68 65 20 76 61 5f 6c 69 73 74 20 74 68 61 74 20  he va_list that 
4dd0: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 20 53 74 6f 72  follows..** Stor
4de0: 65 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20  e the string in 
4df0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
4e00: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
4e10: 63 28 29 20 61 6e 64 20 6d 61 6b 65 20 2a 70 7a  c() and make *pz
4e20: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 61  .** point to tha
4e30: 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  t string..*/.voi
4e40: 64 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69  d sqlite3SetStri
4e50: 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20 73 71  ng(char **pz, sq
4e60: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
4e70: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
4e80: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
4e90: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ap;.  char *z;..
4ea0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
4eb0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73  Format);.  z = s
4ec0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64  qlite3VMPrintf(d
4ed0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
4ee0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
4ef0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4f00: 62 2c 20 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d  b, *pz);.  *pz =
4f10: 20 7a 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   z;.}.../*.** Th
4f20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
4f30: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
4f40: 65 20 65 78 69 74 69 6e 67 20 61 6e 79 20 41 50  e exiting any AP
4f50: 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  I function (i.e.
4f60: 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20 63   .** returning c
4f70: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 73  ontrol to the us
4f80: 65 72 29 20 74 68 61 74 20 68 61 73 20 63 61 6c  er) that has cal
4f90: 6c 65 64 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  led sqlite3_mall
4fa0: 6f 63 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 33  oc or.** sqlite3
4fb0: 5f 72 65 61 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20  _realloc..**.** 
4fc0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
4fd0: 75 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  ue is normally a
4fe0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
4ff0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
5000: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
5010: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 61 20  . However, if a 
5020: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
5030: 20 68 61 73 20 6f 63 63 75 72 65 64 20 73 69 6e   has occured sin
5040: 63 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  ce the previous.
5050: 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 53 51  ** invocation SQ
5060: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
5070: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 20  turned instead. 
5080: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
5090: 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 64 62  rst argument, db
50a0: 2c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  , is not NULL an
50b0: 64 20 61 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72  d a malloc() err
50c0: 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c 0a  or has occured,.
50d0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 6e  ** then the conn
50e0: 65 63 74 69 6f 6e 20 65 72 72 6f 72 2d 63 6f 64  ection error-cod
50f0: 65 20 28 74 68 65 20 76 61 6c 75 65 20 72 65 74  e (the value ret
5100: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
5110: 5f 65 72 72 63 6f 64 65 28 29 29 0a 2a 2a 20 69  _errcode()).** i
5120: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
5130: 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  NOMEM..*/.int sq
5140: 6c 69 74 65 33 41 70 69 45 78 69 74 28 73 71 6c  lite3ApiExit(sql
5150: 69 74 65 33 2a 20 64 62 2c 20 69 6e 74 20 72 63  ite3* db, int rc
5160: 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ){.  /* If the d
5170: 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20  b handle is not 
5180: 4e 55 4c 4c 2c 20 74 68 65 6e 20 77 65 20 6d 75  NULL, then we mu
5190: 73 74 20 68 6f 6c 64 20 74 68 65 20 63 6f 6e 6e  st hold the conn
51a0: 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 0a 20 20  ection handle.  
51b0: 2a 2a 20 6d 75 74 65 78 20 68 65 72 65 2e 20 4f  ** mutex here. O
51c0: 74 68 65 72 77 69 73 65 20 74 68 65 20 72 65 61  therwise the rea
51d0: 64 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 65 20  d (and possible 
51e0: 77 72 69 74 65 29 20 6f 66 20 64 62 2d 3e 6d 61  write) of db->ma
51f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 2a 2a  llocFailed .  **
5200: 20 69 73 20 75 6e 73 61 66 65 2c 20 61 73 20 69   is unsafe, as i
5210: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  s the call to sq
5220: 6c 69 74 65 33 45 72 72 6f 72 28 29 2e 0a 20 20  lite3Error()..  
5230: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  */.  assert( !db
5240: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
5250: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
5260: 29 20 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26  ) );.  if( db &&
5270: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5280: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
5290: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
52a0: 5f 4e 4f 4d 45 4d 2c 20 30 29 3b 0a 20 20 20 20  _NOMEM, 0);.    
52b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
52c0: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 0;.    rc = S
52d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
52e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 28  .  return rc & (
52f0: 64 62 20 3f 20 64 62 2d 3e 65 72 72 4d 61 73 6b  db ? db->errMask
5300: 20 3a 20 30 78 66 66 29 3b 0a 7d 0a               : 0xff);.}.