/ Hex Artifact Content
Login

Artifact 9be4e645f2fb411e5a04cf97e91f68b4faa6dc81:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 65 6d  ******.**.** Mem
0180: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
0190: 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 74 68  unctions used th
01a0: 72 6f 75 67 68 6f 75 74 20 73 71 6c 69 74 65 2e  roughout sqlite.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
01d0: 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 0a  ude <stdarg.h>..
01e0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
01f0: 20 72 65 6c 65 61 73 65 20 75 70 20 74 6f 20 6e   release up to n
0200: 20 62 79 74 65 73 20 6f 66 20 6e 6f 6e 2d 65 73   bytes of non-es
0210: 73 65 6e 74 69 61 6c 20 6d 65 6d 6f 72 79 20 63  sential memory c
0220: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 68 65 6c 64  urrently.** held
0230: 20 62 79 20 53 51 4c 69 74 65 2e 20 41 6e 20 65   by SQLite. An e
0240: 78 61 6d 70 6c 65 20 6f 66 20 6e 6f 6e 2d 65 73  xample of non-es
0250: 73 65 6e 74 69 61 6c 20 6d 65 6d 6f 72 79 20 69  sential memory i
0260: 73 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f  s memory used to
0270: 0a 2a 2a 20 63 61 63 68 65 20 64 61 74 61 62 61  .** cache databa
0280: 73 65 20 70 61 67 65 73 20 74 68 61 74 20 61 72  se pages that ar
0290: 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  e not currently 
02a0: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  in use..*/.int s
02b0: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
02c0: 65 6d 6f 72 79 28 69 6e 74 20 6e 29 7b 0a 23 69  emory(int n){.#i
02d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02e0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
02f0: 4d 45 4e 54 0a 20 20 72 65 74 75 72 6e 20 73 71  MENT.  return sq
0300: 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
0310: 73 65 4d 65 6d 6f 72 79 28 6e 29 3b 0a 23 65 6c  seMemory(n);.#el
0320: 73 65 0a 20 20 2f 2a 20 49 4d 50 4c 45 4d 45 4e  se.  /* IMPLEMEN
0330: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 33  TATION-OF: R-343
0340: 39 31 2d 32 34 39 32 31 20 54 68 65 20 73 71 6c  91-24921 The sql
0350: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
0360: 6f 72 79 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ory() routine.  
0370: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 72 65  ** is a no-op re
0380: 74 75 72 6e 69 6e 67 20 7a 65 72 6f 20 69 66 20  turning zero if 
0390: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 63 6f  SQLite is not co
03a0: 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  mpiled with.  **
03b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
03c0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
03d0: 2e 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  . */.  UNUSED_PA
03e0: 52 41 4d 45 54 45 52 28 6e 29 3b 0a 20 20 72 65  RAMETER(n);.  re
03f0: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
0400: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0410: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0420: 77 69 6e 67 20 6f 62 6a 65 63 74 20 72 65 63 6f  wing object reco
0430: 72 64 73 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  rds the location
0440: 20 6f 66 0a 2a 2a 20 65 61 63 68 20 75 6e 75 73   of.** each unus
0450: 65 64 20 73 63 72 61 74 63 68 20 62 75 66 66 65  ed scratch buffe
0460: 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  r..*/.typedef st
0470: 72 75 63 74 20 53 63 72 61 74 63 68 46 72 65 65  ruct ScratchFree
0480: 73 6c 6f 74 20 7b 0a 20 20 73 74 72 75 63 74 20  slot {.  struct 
0490: 53 63 72 61 74 63 68 46 72 65 65 73 6c 6f 74 20  ScratchFreeslot 
04a0: 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78  *pNext;   /* Nex
04b0: 74 20 75 6e 75 73 65 64 20 73 63 72 61 74 63 68  t unused scratch
04c0: 20 62 75 66 66 65 72 20 2a 2f 0a 7d 20 53 63 72   buffer */.} Scr
04d0: 61 74 63 68 46 72 65 65 73 6c 6f 74 3b 0a 0a 2f  atchFreeslot;../
04e0: 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f 72  *.** State infor
04f0: 6d 61 74 69 6f 6e 20 6c 6f 63 61 6c 20 74 6f 20  mation local to 
0500: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0510: 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e  ation subsystem.
0520: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
0530: 45 5f 57 53 44 20 73 74 72 75 63 74 20 4d 65 6d  E_WSD struct Mem
0540: 30 47 6c 6f 62 61 6c 20 7b 0a 20 20 73 71 6c 69  0Global {.  sqli
0550: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
0560: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74  ;         /* Mut
0570: 65 78 20 74 6f 20 73 65 72 69 61 6c 69 7a 65 20  ex to serialize 
0580: 61 63 63 65 73 73 20 2a 2f 0a 0a 20 20 2f 2a 0a  access */..  /*.
0590: 20 20 2a 2a 20 54 68 65 20 61 6c 61 72 6d 20 63    ** The alarm c
05a0: 61 6c 6c 62 61 63 6b 20 61 6e 64 20 69 74 73 20  allback and its 
05b0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20  arguments.  The 
05c0: 6d 65 6d 30 2e 6d 75 74 65 78 20 6c 6f 63 6b 20  mem0.mutex lock 
05d0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 68 65 6c  will.  ** be hel
05e0: 64 20 77 68 69 6c 65 20 74 68 65 20 63 61 6c 6c  d while the call
05f0: 62 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2e  back is running.
0600: 20 20 52 65 63 75 72 73 69 76 65 20 63 61 6c 6c    Recursive call
0610: 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  s into.  ** the 
0620: 6d 65 6d 6f 72 79 20 73 75 62 73 79 73 74 65 6d  memory subsystem
0630: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20 62 75   are allowed, bu
0640: 74 20 6e 6f 20 6e 65 77 20 63 61 6c 6c 62 61 63  t no new callbac
0650: 6b 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  ks will be.  ** 
0660: 69 73 73 75 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  issued..  */.  s
0670: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6c 61  qlite3_int64 ala
0680: 72 6d 54 68 72 65 73 68 6f 6c 64 3b 0a 20 20 76  rmThreshold;.  v
0690: 6f 69 64 20 28 2a 61 6c 61 72 6d 43 61 6c 6c 62  oid (*alarmCallb
06a0: 61 63 6b 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69  ack)(void*, sqli
06b0: 74 65 33 5f 69 6e 74 36 34 2c 69 6e 74 29 3b 0a  te3_int64,int);.
06c0: 20 20 76 6f 69 64 20 2a 61 6c 61 72 6d 41 72 67    void *alarmArg
06d0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 6f 69  ;..  /*.  ** Poi
06e0: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 65 6e 64  nters to the end
06f0: 20 6f 66 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   of sqlite3Globa
0700: 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68  lConfig.pScratch
0710: 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 28 73 6f   memory.  ** (so
0720: 20 74 68 61 74 20 61 20 72 61 6e 67 65 20 74 65   that a range te
0730: 73 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  st can be used t
0740: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
0750: 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 20 20 2a  n allocation.  *
0760: 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 63 61  * being freed ca
0770: 6d 65 20 66 72 6f 6d 20 70 53 63 72 61 74 63 68  me from pScratch
0780: 29 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  ) and a pointer 
0790: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20  to the list of. 
07a0: 20 2a 2a 20 75 6e 75 73 65 64 20 73 63 72 61 74   ** unused scrat
07b0: 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a  ch allocations..
07c0: 20 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 53 63    */.  void *pSc
07d0: 72 61 74 63 68 45 6e 64 3b 0a 20 20 53 63 72 61  ratchEnd;.  Scra
07e0: 74 63 68 46 72 65 65 73 6c 6f 74 20 2a 70 53 63  tchFreeslot *pSc
07f0: 72 61 74 63 68 46 72 65 65 3b 0a 20 20 75 33 32  ratchFree;.  u32
0800: 20 6e 53 63 72 61 74 63 68 46 72 65 65 3b 0a 0a   nScratchFree;..
0810: 20 20 2f 2a 0a 20 20 2a 2a 20 54 72 75 65 20 69    /*.  ** True i
0820: 66 20 68 65 61 70 20 69 73 20 6e 65 61 72 6c 79  f heap is nearly
0830: 20 22 66 75 6c 6c 22 20 77 68 65 72 65 20 22 66   "full" where "f
0840: 75 6c 6c 22 20 69 73 20 64 65 66 69 6e 65 64 20  ull" is defined 
0850: 62 79 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  by the.  ** sqli
0860: 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
0870: 6d 69 74 28 29 20 73 65 74 74 69 6e 67 2e 0a 20  mit() setting.. 
0880: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 61 72 6c 79   */.  int nearly
0890: 46 75 6c 6c 3b 0a 7d 20 6d 65 6d 30 20 3d 20 7b  Full;.} mem0 = {
08a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
08b0: 30 2c 20 30 2c 20 30 20 7d 3b 0a 0a 23 64 65 66  0, 0, 0 };..#def
08c0: 69 6e 65 20 6d 65 6d 30 20 47 4c 4f 42 41 4c 28  ine mem0 GLOBAL(
08d0: 73 74 72 75 63 74 20 4d 65 6d 30 47 6c 6f 62 61  struct Mem0Globa
08e0: 6c 2c 20 6d 65 6d 30 29 0a 0a 2f 2a 0a 2a 2a 20  l, mem0)../*.** 
08f0: 52 65 74 75 72 6e 20 74 68 65 20 6d 65 6d 6f 72  Return the memor
0900: 79 20 61 6c 6c 6f 63 61 74 6f 72 20 6d 75 74 65  y allocator mute
0910: 78 2e 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75  x. sqlite3_statu
0920: 73 28 29 20 6e 65 65 64 73 20 69 74 2e 0a 2a 2f  s() needs it..*/
0930: 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  .sqlite3_mutex *
0940: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 4d 75 74  sqlite3MallocMut
0950: 65 78 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ex(void){.  retu
0960: 72 6e 20 6d 65 6d 30 2e 6d 75 74 65 78 3b 0a 7d  rn mem0.mutex;.}
0970: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0980: 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74  tine runs when t
0990: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
09a0: 74 6f 72 20 73 65 65 73 20 74 68 61 74 20 74 68  tor sees that th
09b0: 65 0a 2a 2a 20 74 6f 74 61 6c 20 6d 65 6d 6f 72  e.** total memor
09c0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
09d0: 61 62 6f 75 74 20 74 6f 20 65 78 63 65 65 64 20  about to exceed 
09e0: 74 68 65 20 73 6f 66 74 20 68 65 61 70 0a 2a 2a  the soft heap.**
09f0: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   limit..*/.stati
0a00: 63 20 76 6f 69 64 20 73 6f 66 74 48 65 61 70 4c  c void softHeapL
0a10: 69 6d 69 74 45 6e 66 6f 72 63 65 72 28 0a 20 20  imitEnforcer(.  
0a20: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 0a  void *NotUsed, .
0a30: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0a40: 4e 6f 74 55 73 65 64 32 2c 0a 20 20 69 6e 74 20  NotUsed2,.  int 
0a50: 61 6c 6c 6f 63 53 69 7a 65 0a 29 7b 0a 20 20 55  allocSize.){.  U
0a60: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
0a70: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
0a80: 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  d2);.  sqlite3_r
0a90: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 61 6c  elease_memory(al
0aa0: 6c 6f 63 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a  locSize);.}../*.
0ab0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 61 6c  ** Change the al
0ac0: 61 72 6d 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a  arm callback.*/.
0ad0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
0ae0: 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d 28 0a 20  e3MemoryAlarm(. 
0af0: 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b   void(*xCallback
0b00: 29 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 73 71  )(void *pArg, sq
0b10: 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 73 65 64  lite3_int64 used
0b20: 2c 69 6e 74 20 4e 29 2c 0a 20 20 76 6f 69 64 20  ,int N),.  void 
0b30: 2a 70 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33  *pArg,.  sqlite3
0b40: 5f 69 6e 74 36 34 20 69 54 68 72 65 73 68 6f 6c  _int64 iThreshol
0b50: 64 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  d.){.  sqlite3_i
0b60: 6e 74 36 34 20 6e 55 73 65 64 3b 0a 20 20 73 71  nt64 nUsed;.  sq
0b70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
0b80: 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  r(mem0.mutex);. 
0b90: 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62   mem0.alarmCallb
0ba0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
0bb0: 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 41 72 67  .  mem0.alarmArg
0bc0: 20 3d 20 70 41 72 67 3b 0a 20 20 6d 65 6d 30 2e   = pArg;.  mem0.
0bd0: 61 6c 61 72 6d 54 68 72 65 73 68 6f 6c 64 20 3d  alarmThreshold =
0be0: 20 69 54 68 72 65 73 68 6f 6c 64 3b 0a 20 20 6e   iThreshold;.  n
0bf0: 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 53 74  Used = sqlite3St
0c00: 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49 54 45  atusValue(SQLITE
0c10: 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
0c20: 53 45 44 29 3b 0a 20 20 6d 65 6d 30 2e 6e 65 61  SED);.  mem0.nea
0c30: 72 6c 79 46 75 6c 6c 20 3d 20 28 69 54 68 72 65  rlyFull = (iThre
0c40: 73 68 6f 6c 64 3e 30 20 26 26 20 69 54 68 72 65  shold>0 && iThre
0c50: 73 68 6f 6c 64 3c 3d 6e 55 73 65 64 29 3b 0a 20  shold<=nUsed);. 
0c60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
0c70: 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29  eave(mem0.mutex)
0c80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
0c90: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
0ca0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
0cb0: 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 44 65  RECATED./*.** De
0cc0: 70 72 65 63 61 74 65 64 20 65 78 74 65 72 6e 61  precated externa
0cd0: 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 49 6e  l interface.  In
0ce0: 74 65 72 6e 61 6c 2f 63 6f 72 65 20 53 51 4c 69  ternal/core SQLi
0cf0: 74 65 20 63 6f 64 65 0a 2a 2a 20 73 68 6f 75 6c  te code.** shoul
0d00: 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4d 65  d call sqlite3Me
0d10: 6d 6f 72 79 41 6c 61 72 6d 2e 0a 2a 2f 0a 69 6e  moryAlarm..*/.in
0d20: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  t sqlite3_memory
0d30: 5f 61 6c 61 72 6d 28 0a 20 20 76 6f 69 64 28 2a  _alarm(.  void(*
0d40: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20  xCallback)(void 
0d50: 2a 70 41 72 67 2c 20 73 71 6c 69 74 65 33 5f 69  *pArg, sqlite3_i
0d60: 6e 74 36 34 20 75 73 65 64 2c 69 6e 74 20 4e 29  nt64 used,int N)
0d70: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  ,.  void *pArg,.
0d80: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0d90: 69 54 68 72 65 73 68 6f 6c 64 0a 29 7b 0a 20 20  iThreshold.){.  
0da0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 65  return sqlite3Me
0db0: 6d 6f 72 79 41 6c 61 72 6d 28 78 43 61 6c 6c 62  moryAlarm(xCallb
0dc0: 61 63 6b 2c 20 70 41 72 67 2c 20 69 54 68 72 65  ack, pArg, iThre
0dd0: 73 68 6f 6c 64 29 3b 0a 7d 0a 23 65 6e 64 69 66  shold);.}.#endif
0de0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
0df0: 73 6f 66 74 20 68 65 61 70 2d 73 69 7a 65 20 6c  soft heap-size l
0e00: 69 6d 69 74 20 66 6f 72 20 74 68 65 20 6c 69 62  imit for the lib
0e10: 72 61 72 79 2e 20 50 61 73 73 69 6e 67 20 61 20  rary. Passing a 
0e20: 7a 65 72 6f 20 6f 72 20 0a 2a 2a 20 6e 65 67 61  zero or .** nega
0e30: 74 69 76 65 20 76 61 6c 75 65 20 69 6e 64 69 63  tive value indic
0e40: 61 74 65 73 20 6e 6f 20 6c 69 6d 69 74 2e 0a 2a  ates no limit..*
0e50: 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
0e60: 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
0e70: 70 5f 6c 69 6d 69 74 36 34 28 73 71 6c 69 74 65  p_limit64(sqlite
0e80: 33 5f 69 6e 74 36 34 20 6e 29 7b 0a 20 20 73 71  3_int64 n){.  sq
0e90: 6c 69 74 65 33 5f 69 6e 74 36 34 20 70 72 69 6f  lite3_int64 prio
0ea0: 72 4c 69 6d 69 74 3b 0a 20 20 73 71 6c 69 74 65  rLimit;.  sqlite
0eb0: 33 5f 69 6e 74 36 34 20 65 78 63 65 73 73 3b 0a  3_int64 excess;.
0ec0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0ed0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
0ee0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
0ef0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
0f00: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
0f10: 2d 31 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  -1;.#endif.  sql
0f20: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
0f30: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
0f40: 70 72 69 6f 72 4c 69 6d 69 74 20 3d 20 6d 65 6d  priorLimit = mem
0f50: 30 2e 61 6c 61 72 6d 54 68 72 65 73 68 6f 6c 64  0.alarmThreshold
0f60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
0f70: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
0f80: 65 78 29 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29  ex);.  if( n<0 )
0f90: 20 72 65 74 75 72 6e 20 70 72 69 6f 72 4c 69 6d   return priorLim
0fa0: 69 74 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b  it;.  if( n>0 ){
0fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f  .    sqlite3Memo
0fc0: 72 79 41 6c 61 72 6d 28 73 6f 66 74 48 65 61 70  ryAlarm(softHeap
0fd0: 4c 69 6d 69 74 45 6e 66 6f 72 63 65 72 2c 20 30  LimitEnforcer, 0
0fe0: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , n);.  }else{. 
0ff0: 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79     sqlite3Memory
1000: 41 6c 61 72 6d 28 30 2c 20 30 2c 20 30 29 3b 0a  Alarm(0, 0, 0);.
1010: 20 20 7d 0a 20 20 65 78 63 65 73 73 20 3d 20 73    }.  excess = s
1020: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
1030: 65 64 28 29 20 2d 20 6e 3b 0a 20 20 69 66 28 20  ed() - n;.  if( 
1040: 65 78 63 65 73 73 3e 30 20 29 20 73 71 6c 69 74  excess>0 ) sqlit
1050: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
1060: 79 28 28 69 6e 74 29 28 65 78 63 65 73 73 20 26  y((int)(excess &
1070: 20 30 78 37 66 66 66 66 66 66 66 29 29 3b 0a 20   0x7fffffff));. 
1080: 20 72 65 74 75 72 6e 20 70 72 69 6f 72 4c 69 6d   return priorLim
1090: 69 74 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  it;.}.void sqlit
10a0: 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
10b0: 69 74 28 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28  it(int n){.  if(
10c0: 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20   n<0 ) n = 0;.  
10d0: 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
10e0: 70 5f 6c 69 6d 69 74 36 34 28 6e 29 3b 0a 7d 0a  p_limit64(n);.}.
10f0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1100: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
1110: 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65  ocation subsyste
1120: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
1130: 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 76 6f 69 64  3MallocInit(void
1140: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1150: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1160: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
1170: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1180: 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28  e3MemSetDefault(
1190: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  );.  }.  memset(
11a0: 26 6d 65 6d 30 2c 20 30 2c 20 73 69 7a 65 6f 66  &mem0, 0, sizeof
11b0: 28 6d 65 6d 30 29 29 3b 0a 20 20 69 66 28 20 73  (mem0));.  if( s
11c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
11d0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
11e0: 0a 20 20 20 20 6d 65 6d 30 2e 6d 75 74 65 78 20  .    mem0.mutex 
11f0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
1200: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1210: 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 0a 20 20  _STATIC_MEM);.  
1220: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
1230: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72  lobalConfig.pScr
1240: 61 74 63 68 20 26 26 20 73 71 6c 69 74 65 33 47  atch && sqlite3G
1250: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63  lobalConfig.szSc
1260: 72 61 74 63 68 3e 3d 31 30 30 0a 20 20 20 20 20  ratch>=100.     
1270: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
1280: 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68  lConfig.nScratch
1290: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  >0 ){.    int i,
12a0: 20 6e 2c 20 73 7a 3b 0a 20 20 20 20 53 63 72 61   n, sz;.    Scra
12b0: 74 63 68 46 72 65 65 73 6c 6f 74 20 2a 70 53 6c  tchFreeslot *pSl
12c0: 6f 74 3b 0a 20 20 20 20 73 7a 20 3d 20 52 4f 55  ot;.    sz = ROU
12d0: 4e 44 44 4f 57 4e 38 28 73 71 6c 69 74 65 33 47  NDDOWN8(sqlite3G
12e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63  lobalConfig.szSc
12f0: 72 61 74 63 68 29 3b 0a 20 20 20 20 73 71 6c 69  ratch);.    sqli
1300: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1310: 73 7a 53 63 72 61 74 63 68 20 3d 20 73 7a 3b 0a  szScratch = sz;.
1320: 20 20 20 20 70 53 6c 6f 74 20 3d 20 28 53 63 72      pSlot = (Scr
1330: 61 74 63 68 46 72 65 65 73 6c 6f 74 2a 29 73 71  atchFreeslot*)sq
1340: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1350: 67 2e 70 53 63 72 61 74 63 68 3b 0a 20 20 20 20  g.pScratch;.    
1360: 6e 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  n = sqlite3Globa
1370: 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68  lConfig.nScratch
1380: 3b 0a 20 20 20 20 6d 65 6d 30 2e 70 53 63 72 61  ;.    mem0.pScra
1390: 74 63 68 46 72 65 65 20 3d 20 70 53 6c 6f 74 3b  tchFree = pSlot;
13a0: 0a 20 20 20 20 6d 65 6d 30 2e 6e 53 63 72 61 74  .    mem0.nScrat
13b0: 63 68 46 72 65 65 20 3d 20 6e 3b 0a 20 20 20 20  chFree = n;.    
13c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 2d 31 3b 20  for(i=0; i<n-1; 
13d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 6c 6f  i++){.      pSlo
13e0: 74 2d 3e 70 4e 65 78 74 20 3d 20 28 53 63 72 61  t->pNext = (Scra
13f0: 74 63 68 46 72 65 65 73 6c 6f 74 2a 29 28 73 7a  tchFreeslot*)(sz
1400: 2b 28 63 68 61 72 2a 29 70 53 6c 6f 74 29 3b 0a  +(char*)pSlot);.
1410: 20 20 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 53        pSlot = pS
1420: 6c 6f 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  lot->pNext;.    
1430: 7d 0a 20 20 20 20 70 53 6c 6f 74 2d 3e 70 4e 65  }.    pSlot->pNe
1440: 78 74 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 30  xt = 0;.    mem0
1450: 2e 70 53 63 72 61 74 63 68 45 6e 64 20 3d 20 28  .pScratchEnd = (
1460: 76 6f 69 64 2a 29 26 70 53 6c 6f 74 5b 31 5d 3b  void*)&pSlot[1];
1470: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
1480: 6d 30 2e 70 53 63 72 61 74 63 68 45 6e 64 20 3d  m0.pScratchEnd =
1490: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47   0;.    sqlite3G
14a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72  lobalConfig.pScr
14b0: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 73 71  atch = 0;.    sq
14c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
14d0: 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 30 3b  g.szScratch = 0;
14e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
14f0: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
1500: 68 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  h = 0;.  }.  if(
1510: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1520: 6e 66 69 67 2e 70 50 61 67 65 3d 3d 30 20 7c 7c  nfig.pPage==0 ||
1530: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1540: 6e 66 69 67 2e 73 7a 50 61 67 65 3c 35 31 32 0a  nfig.szPage<512.
1550: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
1570: 67 65 3c 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  ge<1 ){.    sqli
1580: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1590: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 73  pPage = 0;.    s
15a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15b0: 69 67 2e 73 7a 50 61 67 65 20 3d 20 30 3b 0a 20  ig.szPage = 0;. 
15c0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
15d0: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 30  Config.nPage = 0
15e0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
15f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1600: 2e 6d 2e 78 49 6e 69 74 28 73 71 6c 69 74 65 33  .m.xInit(sqlite3
1610: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 70  GlobalConfig.m.p
1620: 41 70 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20  AppData);.  if( 
1630: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1640: 6d 65 6d 73 65 74 28 26 6d 65 6d 30 2c 20 30 2c  memset(&mem0, 0,
1650: 20 73 69 7a 65 6f 66 28 6d 65 6d 30 29 29 3b 0a   sizeof(mem0));.
1660: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1670: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1680: 65 20 69 66 20 74 68 65 20 68 65 61 70 20 69 73  e if the heap is
1690: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
16a0: 20 6d 65 6d 6f 72 79 20 70 72 65 73 73 75 72 65   memory pressure
16b0: 20 2d 20 69 6e 20 6f 74 68 65 72 0a 2a 2a 20 77   - in other.** w
16c0: 6f 72 64 73 20 69 66 20 74 68 65 20 61 6d 6f 75  ords if the amou
16d0: 6e 74 20 6f 66 20 68 65 61 70 20 75 73 65 64 20  nt of heap used 
16e0: 69 73 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  is close to the 
16f0: 6c 69 6d 69 74 20 73 65 74 20 62 79 0a 2a 2a 20  limit set by.** 
1700: 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
1710: 70 5f 6c 69 6d 69 74 28 29 2e 0a 2a 2f 0a 69 6e  p_limit()..*/.in
1720: 74 20 73 71 6c 69 74 65 33 48 65 61 70 4e 65 61  t sqlite3HeapNea
1730: 72 6c 79 46 75 6c 6c 28 76 6f 69 64 29 7b 0a 20  rlyFull(void){. 
1740: 20 72 65 74 75 72 6e 20 6d 65 6d 30 2e 6e 65 61   return mem0.nea
1750: 72 6c 79 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  rlyFull;.}../*.*
1760: 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  * Deinitialize t
1770: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
1780: 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a  tion subsystem..
1790: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
17a0: 61 6c 6c 6f 63 45 6e 64 28 76 6f 69 64 29 7b 0a  allocEnd(void){.
17b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
17c0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53 68 75  balConfig.m.xShu
17d0: 74 64 6f 77 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tdown ){.    sql
17e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17f0: 2e 6d 2e 78 53 68 75 74 64 6f 77 6e 28 73 71 6c  .m.xShutdown(sql
1800: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1810: 2e 6d 2e 70 41 70 70 44 61 74 61 29 3b 0a 20 20  .m.pAppData);.  
1820: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 65 6d 30  }.  memset(&mem0
1830: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 65 6d 30  , 0, sizeof(mem0
1840: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
1850: 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
1860: 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74  f memory current
1870: 6c 79 20 63 68 65 63 6b 65 64 20 6f 75 74 2e 0a  ly checked out..
1880: 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
1890: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
18a0: 75 73 65 64 28 76 6f 69 64 29 7b 0a 20 20 73 71  used(void){.  sq
18b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 65 73 2c  lite3_int64 res,
18c0: 20 6d 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   mx;.  sqlite3_s
18d0: 74 61 74 75 73 36 34 28 53 51 4c 49 54 45 5f 53  tatus64(SQLITE_S
18e0: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
18f0: 44 2c 20 26 72 65 73 2c 20 26 6d 78 2c 20 30 29  D, &res, &mx, 0)
1900: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
1910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1920: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
1930: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 74 68 61  nt of memory tha
1940: 74 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 0a  t has ever been.
1950: 2a 2a 20 63 68 65 63 6b 65 64 20 6f 75 74 20 73  ** checked out s
1960: 69 6e 63 65 20 65 69 74 68 65 72 20 74 68 65 20  ince either the 
1970: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
1980: 73 20 70 72 6f 63 65 73 73 0a 2a 2a 20 6f 72 20  s process.** or 
1990: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
19a0: 65 63 65 6e 74 20 72 65 73 65 74 2e 0a 2a 2f 0a  ecent reset..*/.
19b0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
19c0: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67  lite3_memory_hig
19d0: 68 77 61 74 65 72 28 69 6e 74 20 72 65 73 65 74  hwater(int reset
19e0: 46 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  Flag){.  sqlite3
19f0: 5f 69 6e 74 36 34 20 72 65 73 2c 20 6d 78 3b 0a  _int64 res, mx;.
1a00: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
1a10: 36 34 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  64(SQLITE_STATUS
1a20: 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 72  _MEMORY_USED, &r
1a30: 65 73 2c 20 26 6d 78 2c 20 72 65 73 65 74 46 6c  es, &mx, resetFl
1a40: 61 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 78  ag);.  return mx
1a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67  ;.}../*.** Trigg
1a60: 65 72 20 74 68 65 20 61 6c 61 72 6d 20 0a 2a 2f  er the alarm .*/
1a70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1a80: 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28  ite3MallocAlarm(
1a90: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f  int nByte){.  vo
1aa0: 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  id (*xCallback)(
1ab0: 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 5f 69 6e  void*,sqlite3_in
1ac0: 74 36 34 2c 69 6e 74 29 3b 0a 20 20 73 71 6c 69  t64,int);.  sqli
1ad0: 74 65 33 5f 69 6e 74 36 34 20 6e 6f 77 55 73 65  te3_int64 nowUse
1ae0: 64 3b 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 3b  d;.  void *pArg;
1af0: 0a 20 20 69 66 28 20 6d 65 6d 30 2e 61 6c 61 72  .  if( mem0.alar
1b00: 6d 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 20 72  mCallback==0 ) r
1b10: 65 74 75 72 6e 3b 0a 20 20 78 43 61 6c 6c 62 61  eturn;.  xCallba
1b20: 63 6b 20 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d 43  ck = mem0.alarmC
1b30: 61 6c 6c 62 61 63 6b 3b 0a 20 20 6e 6f 77 55 73  allback;.  nowUs
1b40: 65 64 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  ed = sqlite3Stat
1b50: 75 73 56 61 6c 75 65 28 53 51 4c 49 54 45 5f 53  usValue(SQLITE_S
1b60: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
1b70: 44 29 3b 0a 20 20 70 41 72 67 20 3d 20 6d 65 6d  D);.  pArg = mem
1b80: 30 2e 61 6c 61 72 6d 41 72 67 3b 0a 20 20 6d 65  0.alarmArg;.  me
1b90: 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b  m0.alarmCallback
1ba0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1bb0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30  mutex_leave(mem0
1bc0: 2e 6d 75 74 65 78 29 3b 0a 20 20 78 43 61 6c 6c  .mutex);.  xCall
1bd0: 62 61 63 6b 28 70 41 72 67 2c 20 6e 6f 77 55 73  back(pArg, nowUs
1be0: 65 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 73 71  ed, nByte);.  sq
1bf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c00: 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  r(mem0.mutex);. 
1c10: 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62   mem0.alarmCallb
1c20: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
1c30: 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 41 72 67  .  mem0.alarmArg
1c40: 20 3d 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a   = pArg;.}../*.*
1c50: 2a 20 44 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * Do a memory al
1c60: 6c 6f 63 61 74 69 6f 6e 20 77 69 74 68 20 73 74  location with st
1c70: 61 74 69 73 74 69 63 73 20 61 6e 64 20 61 6c 61  atistics and ala
1c80: 72 6d 73 2e 20 20 41 73 73 75 6d 65 20 74 68 65  rms.  Assume the
1c90: 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  .** lock is alre
1ca0: 61 64 79 20 68 65 6c 64 2e 0a 2a 2f 0a 73 74 61  ady held..*/.sta
1cb0: 74 69 63 20 69 6e 74 20 6d 61 6c 6c 6f 63 57 69  tic int mallocWi
1cc0: 74 68 41 6c 61 72 6d 28 69 6e 74 20 6e 2c 20 76  thAlarm(int n, v
1cd0: 6f 69 64 20 2a 2a 70 70 29 7b 0a 20 20 69 6e 74  oid **pp){.  int
1ce0: 20 6e 46 75 6c 6c 3b 0a 20 20 76 6f 69 64 20 2a   nFull;.  void *
1cf0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
1d00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d10: 6d 65 6d 30 2e 6d 75 74 65 78 29 20 29 3b 0a 20  mem0.mutex) );. 
1d20: 20 6e 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33   nFull = sqlite3
1d30: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
1d40: 52 6f 75 6e 64 75 70 28 6e 29 3b 0a 20 20 73 71  Roundup(n);.  sq
1d50: 6c 69 74 65 33 53 74 61 74 75 73 53 65 74 28 53  lite3StatusSet(S
1d60: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
1d70: 4c 4f 43 5f 53 49 5a 45 2c 20 6e 29 3b 0a 20 20  LOC_SIZE, n);.  
1d80: 69 66 28 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61  if( mem0.alarmCa
1d90: 6c 6c 62 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20  llback!=0 ){.   
1da0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1db0: 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 53 74  Used = sqlite3St
1dc0: 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49 54 45  atusValue(SQLITE
1dd0: 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
1de0: 53 45 44 29 3b 0a 20 20 20 20 69 66 28 20 6e 55  SED);.    if( nU
1df0: 73 65 64 20 3e 3d 20 6d 65 6d 30 2e 61 6c 61 72  sed >= mem0.alar
1e00: 6d 54 68 72 65 73 68 6f 6c 64 20 2d 20 6e 46 75  mThreshold - nFu
1e10: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 30  ll ){.      mem0
1e20: 2e 6e 65 61 72 6c 79 46 75 6c 6c 20 3d 20 31 3b  .nearlyFull = 1;
1e30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61  .      sqlite3Ma
1e40: 6c 6c 6f 63 41 6c 61 72 6d 28 6e 46 75 6c 6c 29  llocAlarm(nFull)
1e50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e60: 20 20 20 6d 65 6d 30 2e 6e 65 61 72 6c 79 46 75     mem0.nearlyFu
1e70: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
1e80: 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 47  }.  p = sqlite3G
1e90: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d  lobalConfig.m.xM
1ea0: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 29 3b 0a 23 69  alloc(nFull);.#i
1eb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ec0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
1ed0: 4d 45 4e 54 0a 20 20 69 66 28 20 70 3d 3d 30 20  MENT.  if( p==0 
1ee0: 26 26 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c  && mem0.alarmCal
1ef0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  lback ){.    sql
1f00: 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28  ite3MallocAlarm(
1f10: 6e 46 75 6c 6c 29 3b 0a 20 20 20 20 70 20 3d 20  nFull);.    p = 
1f20: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1f30: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 46  fig.m.xMalloc(nF
1f40: 75 6c 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ull);.  }.#endif
1f50: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1f60: 6e 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d  nFull = sqlite3M
1f70: 61 6c 6c 6f 63 53 69 7a 65 28 70 29 3b 0a 20 20  allocSize(p);.  
1f80: 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 55    sqlite3StatusU
1f90: 70 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  p(SQLITE_STATUS_
1fa0: 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 6e 46 75  MEMORY_USED, nFu
1fb0: 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1fc0: 53 74 61 74 75 73 55 70 28 53 51 4c 49 54 45 5f  StatusUp(SQLITE_
1fd0: 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f  STATUS_MALLOC_CO
1fe0: 55 4e 54 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 2a  UNT, 1);.  }.  *
1ff0: 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e  pp = p;.  return
2000: 20 6e 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nFull;.}../*.**
2010: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
2020: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2030: 69 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 5f  is like sqlite3_
2040: 6d 61 6c 6c 6f 63 28 29 20 65 78 63 65 70 74 20  malloc() except 
2050: 74 68 61 74 20 69 74 0a 2a 2a 20 61 73 73 75 6d  that it.** assum
2060: 65 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 75  es the memory su
2070: 62 73 79 73 74 65 6d 20 68 61 73 20 61 6c 72 65  bsystem has alre
2080: 61 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ady been initial
2090: 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ized..*/.void *s
20a0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 75 36 34  qlite3Malloc(u64
20b0: 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a   n){.  void *p;.
20c0: 20 20 69 66 28 20 6e 3d 3d 30 20 7c 7c 20 6e 3e    if( n==0 || n>
20d0: 3d 30 78 37 66 66 66 66 66 30 30 20 29 7b 0a 20  =0x7fffff00 ){. 
20e0: 20 20 20 2f 2a 20 41 20 6d 65 6d 6f 72 79 20 61     /* A memory a
20f0: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 6e  llocation of a n
2100: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
2110: 68 69 63 68 20 69 73 20 6e 65 61 72 20 74 68 65  hich is near the
2120: 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   maximum.    ** 
2130: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76  signed integer v
2140: 61 6c 75 65 20 6d 69 67 68 74 20 63 61 75 73 65  alue might cause
2150: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 76 65 72   an integer over
2160: 66 6c 6f 77 20 69 6e 73 69 64 65 20 6f 66 20 74  flow inside of t
2170: 68 65 0a 20 20 20 20 2a 2a 20 78 4d 61 6c 6c 6f  he.    ** xMallo
2180: 63 28 29 2e 20 20 48 65 6e 63 65 20 77 65 20 6c  c().  Hence we l
2190: 69 6d 69 74 20 74 68 65 20 6d 61 78 69 6d 75 6d  imit the maximum
21a0: 20 73 69 7a 65 20 74 6f 20 30 78 37 66 66 66 66   size to 0x7ffff
21b0: 66 30 30 2c 20 67 69 76 69 6e 67 0a 20 20 20 20  f00, giving.    
21c0: 2a 2a 20 32 35 35 20 62 79 74 65 73 20 6f 66 20  ** 255 bytes of 
21d0: 6f 76 65 72 68 65 61 64 2e 20 20 53 51 4c 69 74  overhead.  SQLit
21e0: 65 20 69 74 73 65 6c 66 20 77 69 6c 6c 20 6e 65  e itself will ne
21f0: 76 65 72 20 75 73 65 20 61 6e 79 74 68 69 6e 67  ver use anything
2200: 20 6e 65 61 72 0a 20 20 20 20 2a 2a 20 74 68 69   near.    ** thi
2210: 73 20 61 6d 6f 75 6e 74 2e 20 20 54 68 65 20 6f  s amount.  The o
2220: 6e 6c 79 20 77 61 79 20 74 6f 20 72 65 61 63 68  nly way to reach
2230: 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20 77 69   the limit is wi
2240: 74 68 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  th sqlite3_mallo
2250: 63 28 29 20 2a 2f 0a 20 20 20 20 70 20 3d 20 30  c() */.    p = 0
2260: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
2270: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2280: 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20  g.bMemstat ){.  
2290: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
22a0: 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78  enter(mem0.mutex
22b0: 29 3b 0a 20 20 20 20 6d 61 6c 6c 6f 63 57 69 74  );.    mallocWit
22c0: 68 41 6c 61 72 6d 28 28 69 6e 74 29 6e 2c 20 26  hAlarm((int)n, &
22d0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
22e0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30  mutex_leave(mem0
22f0: 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65  .mutex);.  }else
2300: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
2310: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
2320: 78 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 29 3b  xMalloc((int)n);
2330: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
2340: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2350: 45 4e 54 28 70 29 20 29 3b 20 20 2f 2a 20 49 4d  ENT(p) );  /* IM
2360: 50 3a 20 52 2d 31 31 31 34 38 2d 34 30 39 39 35  P: R-11148-40995
2370: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   */.  return p;.
2380: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  }../*.** This ve
2390: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65 6d  rsion of the mem
23a0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
23b0: 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  s for use by the
23c0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 2a 2a   application..**
23d0: 20 46 69 72 73 74 20 6d 61 6b 65 20 73 75 72 65   First make sure
23e0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 75 62 73   the memory subs
23f0: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
2400: 69 7a 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  ized, then do th
2410: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
2420: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
2430: 33 5f 6d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b  3_malloc(int n){
2440: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2450: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
2460: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  if( sqlite3_init
2470: 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72  ialize() ) retur
2480: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  n 0;.#endif.  re
2490: 74 75 72 6e 20 6e 3c 3d 30 20 3f 20 30 20 3a 20  turn n<=0 ? 0 : 
24a0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 29  sqlite3Malloc(n)
24b0: 3b 0a 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  ;.}.void *sqlite
24c0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 71 6c 69 74  3_malloc64(sqlit
24d0: 65 33 5f 75 69 6e 74 36 34 20 6e 29 7b 0a 23 69  e3_uint64 n){.#i
24e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24f0: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28  T_AUTOINIT.  if(
2500: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
2510: 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30  ize() ) return 0
2520: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
2530: 6e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  n sqlite3Malloc(
2540: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  n);.}../*.** Eac
2550: 68 20 74 68 72 65 61 64 20 6d 61 79 20 6f 6e 6c  h thread may onl
2560: 79 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  y have a single 
2570: 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f  outstanding allo
2580: 63 61 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 78  cation from.** x
2590: 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 29 2e  ScratchMalloc().
25a0: 20 20 57 65 20 76 65 72 69 66 79 20 74 68 69 73    We verify this
25b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74   constraint in t
25c0: 68 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64  he single-thread
25d0: 65 64 0a 2a 2a 20 63 61 73 65 20 62 79 20 73 65  ed.** case by se
25e0: 74 74 69 6e 67 20 73 63 72 61 74 63 68 41 6c 6c  tting scratchAll
25f0: 6f 63 4f 75 74 20 74 6f 20 31 20 77 68 65 6e 20  ocOut to 1 when 
2600: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
2610: 20 69 73 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   is outstanding 
2620: 63 6c 65 61 72 69 6e 67 20 69 74 20 77 68 65 6e  clearing it when
2630: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
2640: 69 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 23 69 66  is freed..*/.#if
2650: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
2660: 46 45 3d 3d 30 20 26 26 20 21 64 65 66 69 6e 65  FE==0 && !define
2670: 64 28 4e 44 45 42 55 47 29 0a 73 74 61 74 69 63  d(NDEBUG).static
2680: 20 69 6e 74 20 73 63 72 61 74 63 68 41 6c 6c 6f   int scratchAllo
2690: 63 4f 75 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cOut = 0;.#endif
26a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
26b0: 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 69 73  e memory that is
26c0: 20 74 6f 20 62 65 20 75 73 65 64 20 61 6e 64 20   to be used and 
26d0: 72 65 6c 65 61 73 65 64 20 72 69 67 68 74 20 61  released right a
26e0: 77 61 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  way..** This rou
26f0: 74 69 6e 65 20 69 73 20 73 69 6d 69 6c 61 72 20  tine is similar 
2700: 74 6f 20 61 6c 6c 6f 63 61 28 29 20 69 6e 20 74  to alloca() in t
2710: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 69 6e  hat it is not in
2720: 74 65 6e 64 65 64 0a 2a 2a 20 66 6f 72 20 73 69  tended.** for si
2730: 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 74  tuations where t
2740: 68 65 20 6d 65 6d 6f 72 79 20 6d 69 67 68 74 20  he memory might 
2750: 62 65 20 68 65 6c 64 20 6c 6f 6e 67 2d 74 65 72  be held long-ter
2760: 6d 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  m.  This.** rout
2770: 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ine is intended 
2780: 74 6f 20 67 65 74 20 6d 65 6d 6f 72 79 20 74 6f  to get memory to
2790: 20 6f 6c 64 20 6c 61 72 67 65 20 74 72 61 6e 73   old large trans
27a0: 69 65 6e 74 20 64 61 74 61 0a 2a 2a 20 73 74 72  ient data.** str
27b0: 75 63 74 75 72 65 73 20 74 68 61 74 20 77 6f 75  uctures that wou
27c0: 6c 64 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20  ld not normally 
27d0: 66 69 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  fit on the stack
27e0: 20 6f 66 20 61 6e 0a 2a 2a 20 65 6d 62 65 64 64   of an.** embedd
27f0: 65 64 20 70 72 6f 63 65 73 73 6f 72 2e 0a 2a 2f  ed processor..*/
2800: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 53 63  .void *sqlite3Sc
2810: 72 61 74 63 68 4d 61 6c 6c 6f 63 28 69 6e 74 20  ratchMalloc(int 
2820: 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  n){.  void *p;. 
2830: 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
2840: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2850: 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65  _enter(mem0.mute
2860: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 61  x);.  sqlite3Sta
2870: 74 75 73 53 65 74 28 53 51 4c 49 54 45 5f 53 54  tusSet(SQLITE_ST
2880: 41 54 55 53 5f 53 43 52 41 54 43 48 5f 53 49 5a  ATUS_SCRATCH_SIZ
2890: 45 2c 20 6e 29 3b 0a 20 20 69 66 28 20 6d 65 6d  E, n);.  if( mem
28a0: 30 2e 6e 53 63 72 61 74 63 68 46 72 65 65 20 26  0.nScratchFree &
28b0: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
28c0: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 3e  onfig.szScratch>
28d0: 3d 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  =n ){.    p = me
28e0: 6d 30 2e 70 53 63 72 61 74 63 68 46 72 65 65 3b  m0.pScratchFree;
28f0: 0a 20 20 20 20 6d 65 6d 30 2e 70 53 63 72 61 74  .    mem0.pScrat
2900: 63 68 46 72 65 65 20 3d 20 6d 65 6d 30 2e 70 53  chFree = mem0.pS
2910: 63 72 61 74 63 68 46 72 65 65 2d 3e 70 4e 65 78  cratchFree->pNex
2920: 74 3b 0a 20 20 20 20 6d 65 6d 30 2e 6e 53 63 72  t;.    mem0.nScr
2930: 61 74 63 68 46 72 65 65 2d 2d 3b 0a 20 20 20 20  atchFree--;.    
2940: 73 71 6c 69 74 65 33 53 74 61 74 75 73 55 70 28  sqlite3StatusUp(
2950: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43  SQLITE_STATUS_SC
2960: 52 41 54 43 48 5f 55 53 45 44 2c 20 31 29 3b 0a  RATCH_USED, 1);.
2970: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2980: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
2990: 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ex);.  }else{.  
29a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
29b0: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
29c0: 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
29d0: 65 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20  e3Malloc(n);.   
29e0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
29f0: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
2a00: 74 20 26 26 20 70 20 29 7b 0a 20 20 20 20 20 20  t && p ){.      
2a10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2a20: 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ter(mem0.mutex);
2a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
2a40: 61 74 75 73 55 70 28 53 51 4c 49 54 45 5f 53 54  atusUp(SQLITE_ST
2a50: 41 54 55 53 5f 53 43 52 41 54 43 48 5f 4f 56 45  ATUS_SCRATCH_OVE
2a60: 52 46 4c 4f 57 2c 20 73 71 6c 69 74 65 33 4d 61  RFLOW, sqlite3Ma
2a70: 6c 6c 6f 63 53 69 7a 65 28 70 29 29 3b 0a 20 20  llocSize(p));.  
2a80: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2a90: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
2aa0: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ex);.    }.    s
2ab0: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65  qlite3MemdebugSe
2ac0: 74 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45  tType(p, MEMTYPE
2ad0: 5f 53 43 52 41 54 43 48 29 3b 0a 20 20 7d 0a 20  _SCRATCH);.  }. 
2ae0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2af0: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 6d  _mutex_notheld(m
2b00: 65 6d 30 2e 6d 75 74 65 78 29 20 29 3b 0a 0a 0a  em0.mutex) );...
2b10: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
2b20: 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65 66  DSAFE==0 && !def
2b30: 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20 2f  ined(NDEBUG).  /
2b40: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2b50: 2d 31 32 39 37 30 2d 30 35 38 38 30 20 53 51 4c  -12970-05880 SQL
2b60: 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 73 65  ite will not use
2b70: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73   more than one s
2b80: 63 72 61 74 63 68 0a 20 20 2a 2a 20 62 75 66 66  cratch.  ** buff
2b90: 65 72 73 20 70 65 72 20 74 68 72 65 61 64 2e 0a  ers per thread..
2ba0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
2bb0: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 65 63 6b  an only be check
2bc0: 65 64 20 69 6e 20 73 69 6e 67 6c 65 2d 74 68 72  ed in single-thr
2bd0: 65 61 64 65 64 20 6d 6f 64 65 2e 0a 20 20 2a 2f  eaded mode..  */
2be0: 0a 20 20 61 73 73 65 72 74 28 20 73 63 72 61 74  .  assert( scrat
2bf0: 63 68 41 6c 6c 6f 63 4f 75 74 3d 3d 30 20 29 3b  chAllocOut==0 );
2c00: 0a 20 20 69 66 28 20 70 20 29 20 73 63 72 61 74  .  if( p ) scrat
2c10: 63 68 41 6c 6c 6f 63 4f 75 74 2b 2b 3b 0a 23 65  chAllocOut++;.#e
2c20: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70  ndif..  return p
2c30: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
2c40: 53 63 72 61 74 63 68 46 72 65 65 28 76 6f 69 64  ScratchFree(void
2c50: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
2c60: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  ..#if SQLITE_THR
2c70: 45 41 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64  EADSAFE==0 && !d
2c80: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20  efined(NDEBUG). 
2c90: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
2ca0: 74 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74  t no more than t
2cb0: 77 6f 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63  wo scratch alloc
2cc0: 61 74 69 6f 6e 20 70 65 72 20 74 68 72 65 61 64  ation per thread
2cd0: 0a 20 20 20 20 2a 2a 20 69 73 20 6f 75 74 73 74  .    ** is outst
2ce0: 61 6e 64 69 6e 67 20 61 74 20 6f 6e 65 20 74 69  anding at one ti
2cf0: 6d 65 2e 20 20 28 54 68 69 73 20 69 73 20 6f 6e  me.  (This is on
2d00: 6c 79 20 63 68 65 63 6b 65 64 20 69 6e 20 74 68  ly checked in th
2d10: 65 0a 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 2d  e.    ** single-
2d20: 74 68 72 65 61 64 65 64 20 63 61 73 65 20 73 69  threaded case si
2d30: 6e 63 65 20 63 68 65 63 6b 69 6e 67 20 69 6e 20  nce checking in 
2d40: 74 68 65 20 6d 75 6c 74 69 2d 74 68 72 65 61 64  the multi-thread
2d50: 65 64 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 77  ed case.    ** w
2d60: 6f 75 6c 64 20 62 65 20 6d 75 63 68 20 6d 6f 72  ould be much mor
2d70: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 29 20  e complicated.) 
2d80: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
2d90: 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 3e 3d  cratchAllocOut>=
2da0: 31 20 26 26 20 73 63 72 61 74 63 68 41 6c 6c 6f  1 && scratchAllo
2db0: 63 4f 75 74 3c 3d 32 20 29 3b 0a 20 20 20 20 73  cOut<=2 );.    s
2dc0: 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 2d 2d  cratchAllocOut--
2dd0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ;.#endif..    if
2de0: 28 20 70 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62  ( p>=sqlite3Glob
2df0: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
2e00: 68 20 26 26 20 70 3c 6d 65 6d 30 2e 70 53 63 72  h && p<mem0.pScr
2e10: 61 74 63 68 45 6e 64 20 29 7b 0a 20 20 20 20 20  atchEnd ){.     
2e20: 20 2f 2a 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f   /* Release memo
2e30: 72 79 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49  ry from the SQLI
2e40: 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43  TE_CONFIG_SCRATC
2e50: 48 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  H allocation */.
2e60: 20 20 20 20 20 20 53 63 72 61 74 63 68 46 72 65        ScratchFre
2e70: 65 73 6c 6f 74 20 2a 70 53 6c 6f 74 3b 0a 20 20  eslot *pSlot;.  
2e80: 20 20 20 20 70 53 6c 6f 74 20 3d 20 28 53 63 72      pSlot = (Scr
2e90: 61 74 63 68 46 72 65 65 73 6c 6f 74 2a 29 70 3b  atchFreeslot*)p;
2ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
2eb0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e  utex_enter(mem0.
2ec0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70 53  mutex);.      pS
2ed0: 6c 6f 74 2d 3e 70 4e 65 78 74 20 3d 20 6d 65 6d  lot->pNext = mem
2ee0: 30 2e 70 53 63 72 61 74 63 68 46 72 65 65 3b 0a  0.pScratchFree;.
2ef0: 20 20 20 20 20 20 6d 65 6d 30 2e 70 53 63 72 61        mem0.pScra
2f00: 74 63 68 46 72 65 65 20 3d 20 70 53 6c 6f 74 3b  tchFree = pSlot;
2f10: 0a 20 20 20 20 20 20 6d 65 6d 30 2e 6e 53 63 72  .      mem0.nScr
2f20: 61 74 63 68 46 72 65 65 2b 2b 3b 0a 20 20 20 20  atchFree++;.    
2f30: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 30 2e 6e    assert( mem0.n
2f40: 53 63 72 61 74 63 68 46 72 65 65 20 3c 3d 20 28  ScratchFree <= (
2f50: 75 33 32 29 73 71 6c 69 74 65 33 47 6c 6f 62 61  u32)sqlite3Globa
2f60: 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68  lConfig.nScratch
2f70: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
2f80: 33 53 74 61 74 75 73 44 6f 77 6e 28 53 51 4c 49  3StatusDown(SQLI
2f90: 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43  TE_STATUS_SCRATC
2fa0: 48 5f 55 53 45 44 2c 20 31 29 3b 0a 20 20 20 20  H_USED, 1);.    
2fb0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2fc0: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
2fd0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2fe0: 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 6d      /* Release m
2ff0: 65 6d 6f 72 79 20 62 61 63 6b 20 74 6f 20 74 68  emory back to th
3000: 65 20 68 65 61 70 20 2a 2f 0a 20 20 20 20 20 20  e heap */.      
3010: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d  assert( sqlite3M
3020: 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 70  emdebugHasType(p
3030: 2c 20 4d 45 4d 54 59 50 45 5f 53 43 52 41 54 43  , MEMTYPE_SCRATC
3040: 48 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  H) );.      asse
3050: 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  rt( sqlite3Memde
3060: 62 75 67 4e 6f 54 79 70 65 28 70 2c 20 28 75 38  bugNoType(p, (u8
3070: 29 7e 4d 45 4d 54 59 50 45 5f 53 43 52 41 54 43  )~MEMTYPE_SCRATC
3080: 48 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  H) );.      sqli
3090: 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74 54 79  te3MemdebugSetTy
30a0: 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 48 45  pe(p, MEMTYPE_HE
30b0: 41 50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  AP);.      if( s
30c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
30d0: 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20  ig.bMemstat ){. 
30e0: 20 20 20 20 20 20 20 69 6e 74 20 69 53 69 7a 65         int iSize
30f0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
3100: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20  Size(p);.       
3110: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
3120: 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29  nter(mem0.mutex)
3130: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3140: 33 53 74 61 74 75 73 44 6f 77 6e 28 53 51 4c 49  3StatusDown(SQLI
3150: 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43  TE_STATUS_SCRATC
3160: 48 5f 4f 56 45 52 46 4c 4f 57 2c 20 69 53 69 7a  H_OVERFLOW, iSiz
3170: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
3180: 74 65 33 53 74 61 74 75 73 44 6f 77 6e 28 53 51  te3StatusDown(SQ
3190: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f  LITE_STATUS_MEMO
31a0: 52 59 5f 55 53 45 44 2c 20 69 53 69 7a 65 29 3b  RY_USED, iSize);
31b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31c0: 53 74 61 74 75 73 44 6f 77 6e 28 53 51 4c 49 54  StatusDown(SQLIT
31d0: 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f  E_STATUS_MALLOC_
31e0: 43 4f 55 4e 54 2c 20 31 29 3b 0a 20 20 20 20 20  COUNT, 1);.     
31f0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3200: 43 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70  Config.m.xFree(p
3210: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3220: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
3230: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20  em0.mutex);.    
3240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3250: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3260: 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b  nfig.m.xFree(p);
3270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3280: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 52 55 45   }.}../*.** TRUE
3290: 20 69 66 20 70 20 69 73 20 61 20 6c 6f 6f 6b 61   if p is a looka
32a0: 73 69 64 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  side memory allo
32b0: 63 61 74 69 6f 6e 20 66 72 6f 6d 20 64 62 0a 2a  cation from db.*
32c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
32d0: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a  _OMIT_LOOKASIDE.
32e0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 6f 6f  static int isLoo
32f0: 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a  kaside(sqlite3 *
3300: 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20  db, void *p){.  
3310: 72 65 74 75 72 6e 20 70 3e 3d 64 62 2d 3e 6c 6f  return p>=db->lo
3320: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 26  okaside.pStart &
3330: 26 20 70 3c 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  & p<db->lookasid
3340: 65 2e 70 45 6e 64 3b 0a 7d 0a 23 65 6c 73 65 0a  e.pEnd;.}.#else.
3350: 23 64 65 66 69 6e 65 20 69 73 4c 6f 6f 6b 61 73  #define isLookas
3360: 69 64 65 28 41 2c 42 29 20 30 0a 23 65 6e 64 69  ide(A,B) 0.#endi
3370: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
3380: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6d 65  the size of a me
3390: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
33a0: 70 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69  previously obtai
33b0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
33c0: 74 65 33 4d 61 6c 6c 6f 63 28 29 20 6f 72 20 73  te3Malloc() or s
33d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
33e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
33f0: 61 6c 6c 6f 63 53 69 7a 65 28 76 6f 69 64 20 2a  allocSize(void *
3400: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
3410: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73  lite3MemdebugHas
3420: 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f  Type(p, MEMTYPE_
3430: 48 45 41 50 29 20 29 3b 0a 20 20 72 65 74 75 72  HEAP) );.  retur
3440: 6e 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  n sqlite3GlobalC
3450: 6f 6e 66 69 67 2e 6d 2e 78 53 69 7a 65 28 70 29  onfig.m.xSize(p)
3460: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  ;.}.int sqlite3D
3470: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 73 71 6c 69  bMallocSize(sqli
3480: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
3490: 29 7b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  ){.  if( db==0 )
34a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
34b0: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 4e 6f 54  lite3MemdebugNoT
34c0: 79 70 65 28 70 2c 20 28 75 38 29 7e 4d 45 4d 54  ype(p, (u8)~MEMT
34d0: 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 20  YPE_HEAP) );.   
34e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34f0: 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28  MemdebugHasType(
3500: 70 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29  p, MEMTYPE_HEAP)
3510: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   );.    return s
3520: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65  qlite3MallocSize
3530: 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (p);.  }else{.  
3540: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3550: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
3560: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 69  >mutex) );.    i
3570: 66 28 20 69 73 4c 6f 6f 6b 61 73 69 64 65 28 64  f( isLookaside(d
3580: 62 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 72  b, p) ){.      r
3590: 65 74 75 72 6e 20 64 62 2d 3e 6c 6f 6f 6b 61 73  eturn db->lookas
35a0: 69 64 65 2e 73 7a 3b 0a 20 20 20 20 7d 65 6c 73  ide.sz;.    }els
35b0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
35c0: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
35d0: 48 61 73 54 79 70 65 28 70 2c 20 28 4d 45 4d 54  HasType(p, (MEMT
35e0: 59 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 7c 4d 45  YPE_LOOKASIDE|ME
35f0: 4d 54 59 50 45 5f 48 45 41 50 29 29 20 29 3b 0a  MTYPE_HEAP)) );.
3600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
3610: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 4e 6f 54  lite3MemdebugNoT
3620: 79 70 65 28 70 2c 20 28 75 38 29 7e 28 4d 45 4d  ype(p, (u8)~(MEM
3630: 54 59 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 7c 4d  TYPE_LOOKASIDE|M
3640: 45 4d 54 59 50 45 5f 48 45 41 50 29 29 20 29 3b  EMTYPE_HEAP)) );
3650: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
3660: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3670: 67 2e 6d 2e 78 53 69 7a 65 28 70 29 3b 0a 20 20  g.m.xSize(p);.  
3680: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 71 6c 69 74 65    }.  }.}.sqlite
3690: 33 5f 75 69 6e 74 36 34 20 73 71 6c 69 74 65 33  3_uint64 sqlite3
36a0: 5f 6d 73 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b  _msize(void *p){
36b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36c0: 65 33 4d 65 6d 64 65 62 75 67 4e 6f 54 79 70 65  e3MemdebugNoType
36d0: 28 70 2c 20 28 75 38 29 7e 4d 45 4d 54 59 50 45  (p, (u8)~MEMTYPE
36e0: 5f 48 45 41 50 29 20 29 3b 0a 20 20 61 73 73 65  _HEAP) );.  asse
36f0: 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  rt( sqlite3Memde
3700: 62 75 67 48 61 73 54 79 70 65 28 70 2c 20 4d 45  bugHasType(p, ME
3710: 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20  MTYPE_HEAP) );. 
3720: 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33   return (sqlite3
3730: 5f 75 69 6e 74 36 34 29 73 71 6c 69 74 65 33 47  _uint64)sqlite3G
3740: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53  lobalConfig.m.xS
3750: 69 7a 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ize(p);.}../*.**
3760: 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 70 72 65   Free memory pre
3770: 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64  viously obtained
3780: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4d 61 6c   from sqlite3Mal
3790: 6c 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  loc()..*/.void s
37a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 76 6f 69 64  qlite3_free(void
37b0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
37c0: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 49   ) return;  /* I
37d0: 4d 50 3a 20 52 2d 34 39 30 35 33 2d 35 34 35 35  MP: R-49053-5455
37e0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  4 */.  assert( s
37f0: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61  qlite3MemdebugHa
3800: 73 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45  sType(p, MEMTYPE
3810: 5f 48 45 41 50 29 20 29 3b 0a 20 20 61 73 73 65  _HEAP) );.  asse
3820: 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  rt( sqlite3Memde
3830: 62 75 67 4e 6f 54 79 70 65 28 70 2c 20 28 75 38  bugNoType(p, (u8
3840: 29 7e 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20  )~MEMTYPE_HEAP) 
3850: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
3860: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3870: 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 73 71 6c  mstat ){.    sql
3880: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
3890: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
38a0: 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 44    sqlite3StatusD
38b0: 6f 77 6e 28 53 51 4c 49 54 45 5f 53 54 41 54 55  own(SQLITE_STATU
38c0: 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 73  S_MEMORY_USED, s
38d0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65  qlite3MallocSize
38e0: 28 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (p));.    sqlite
38f0: 33 53 74 61 74 75 73 44 6f 77 6e 28 53 51 4c 49  3StatusDown(SQLI
3900: 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43  TE_STATUS_MALLOC
3910: 5f 43 4f 55 4e 54 2c 20 31 29 3b 0a 20 20 20 20  _COUNT, 1);.    
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 46 72 65 65 28 70 29 3b 0a  fig.m.xFree(p);.
3940: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
3950: 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74  x_leave(mem0.mut
3960: 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ex);.  }else{.  
3970: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3980: 6f 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29  onfig.m.xFree(p)
3990: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
39a0: 64 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 6d  dd the size of m
39b0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
39c0: 20 22 70 22 20 74 6f 20 74 68 65 20 63 6f 75 6e   "p" to the coun
39d0: 74 20 69 6e 0a 2a 2a 20 2a 64 62 2d 3e 70 6e 42  t in.** *db->pnB
39e0: 79 74 65 73 46 72 65 65 64 2e 0a 2a 2f 0a 73 74  ytesFreed..*/.st
39f0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
3a00: 4c 49 4e 45 20 76 6f 69 64 20 6d 65 61 73 75 72  LINE void measur
3a10: 65 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 28  eAllocationSize(
3a20: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
3a30: 64 20 2a 70 29 7b 0a 20 20 2a 64 62 2d 3e 70 6e  d *p){.  *db->pn
3a40: 42 79 74 65 73 46 72 65 65 64 20 2b 3d 20 73 71  BytesFreed += sq
3a50: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
3a60: 65 28 64 62 2c 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(db,p);.}../*.*
3a70: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 74 68  * Free memory th
3a80: 61 74 20 6d 69 67 68 74 20 62 65 20 61 73 73 6f  at might be asso
3a90: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70 61  ciated with a pa
3aa0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
3ab0: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
3ac0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3ad0: 44 62 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  DbFree(sqlite3 *
3ae0: 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20  db, void *p){.  
3af0: 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c  assert( db==0 ||
3b00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3b10: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
3b20: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3b30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 20  eturn;.  if( db 
3b40: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70  ){.    if( db->p
3b50: 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20  nBytesFreed ){. 
3b60: 20 20 20 20 20 6d 65 61 73 75 72 65 41 6c 6c 6f       measureAllo
3b70: 63 61 74 69 6f 6e 53 69 7a 65 28 64 62 2c 20 70  cationSize(db, p
3b80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
3b90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
3ba0: 73 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70  sLookaside(db, p
3bb0: 29 20 29 7b 0a 20 20 20 20 20 20 4c 6f 6f 6b 61  ) ){.      Looka
3bc0: 73 69 64 65 53 6c 6f 74 20 2a 70 42 75 66 20 3d  sideSlot *pBuf =
3bd0: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
3be0: 29 70 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  )p;.#if SQLITE_D
3bf0: 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 72  EBUG.      /* Tr
3c00: 61 73 68 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  ash all content 
3c10: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 62 65  in the buffer be
3c20: 69 6e 67 20 66 72 65 65 64 20 2a 2f 0a 20 20 20  ing freed */.   
3c30: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 78 61     memset(p, 0xa
3c40: 61 2c 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  a, db->lookaside
3c50: 2e 73 7a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  .sz);.#endif.   
3c60: 20 20 20 70 42 75 66 2d 3e 70 4e 65 78 74 20 3d     pBuf->pNext =
3c70: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
3c80: 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Free;.      db->
3c90: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
3ca0: 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 64 62  = pBuf;.      db
3cb0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74  ->lookaside.nOut
3cc0: 2d 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  --;.      return
3cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
3ce0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d  sert( sqlite3Mem
3cf0: 64 65 62 75 67 48 61 73 54 79 70 65 28 70 2c 20  debugHasType(p, 
3d00: 28 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 49  (MEMTYPE_LOOKASI
3d10: 44 45 7c 4d 45 4d 54 59 50 45 5f 48 45 41 50 29  DE|MEMTYPE_HEAP)
3d20: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
3d30: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 4e 6f  qlite3MemdebugNo
3d40: 54 79 70 65 28 70 2c 20 28 75 38 29 7e 28 4d 45  Type(p, (u8)~(ME
3d50: 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 7c  MTYPE_LOOKASIDE|
3d60: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 29 20 29  MEMTYPE_HEAP)) )
3d70: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
3d80: 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64  0 || sqlite3Memd
3d90: 65 62 75 67 4e 6f 54 79 70 65 28 70 2c 20 4d 45  ebugNoType(p, ME
3da0: 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 29  MTYPE_LOOKASIDE)
3db0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d   );.  sqlite3Mem
3dc0: 64 65 62 75 67 53 65 74 54 79 70 65 28 70 2c 20  debugSetType(p, 
3dd0: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 3b 0a 20  MEMTYPE_HEAP);. 
3de0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
3df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
3e00: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  e the size of an
3e10: 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79   existing memory
3e20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 76   allocation.*/.v
3e30: 6f 69 64 20 2a 73 71 6c 69 74 65 33 52 65 61 6c  oid *sqlite3Real
3e40: 6c 6f 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c 20  loc(void *pOld, 
3e50: 75 36 34 20 6e 42 79 74 65 73 29 7b 0a 20 20 69  u64 nBytes){.  i
3e60: 6e 74 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e  nt nOld, nNew, n
3e70: 44 69 66 66 3b 0a 20 20 76 6f 69 64 20 2a 70 4e  Diff;.  void *pN
3e80: 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ew;.  assert( sq
3e90: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73  lite3MemdebugHas
3ea0: 54 79 70 65 28 70 4f 6c 64 2c 20 4d 45 4d 54 59  Type(pOld, MEMTY
3eb0: 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 61 73  PE_HEAP) );.  as
3ec0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d  sert( sqlite3Mem
3ed0: 64 65 62 75 67 4e 6f 54 79 70 65 28 70 4f 6c 64  debugNoType(pOld
3ee0: 2c 20 28 75 38 29 7e 4d 45 4d 54 59 50 45 5f 48  , (u8)~MEMTYPE_H
3ef0: 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70 4f  EAP) );.  if( pO
3f00: 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ld==0 ){.    ret
3f10: 75 72 6e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  urn sqlite3Mallo
3f20: 63 28 6e 42 79 74 65 73 29 3b 20 2f 2a 20 49 4d  c(nBytes); /* IM
3f30: 50 3a 20 52 2d 30 34 33 30 30 2d 35 36 37 31 32  P: R-04300-56712
3f40: 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42   */.  }.  if( nB
3f50: 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ytes==0 ){.    s
3f60: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 6c 64  qlite3_free(pOld
3f70: 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 35  ); /* IMP: R-265
3f80: 30 37 2d 34 37 34 33 31 20 2a 2f 0a 20 20 20 20  07-47431 */.    
3f90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3fa0: 69 66 28 20 6e 42 79 74 65 73 3e 3d 30 78 37 66  if( nBytes>=0x7f
3fb0: 66 66 66 66 30 30 20 29 7b 0a 20 20 20 20 2f 2a  ffff00 ){.    /*
3fc0: 20 54 68 65 20 30 78 37 66 66 66 66 30 30 20 6c   The 0x7ffff00 l
3fd0: 69 6d 69 74 20 74 65 72 6d 20 69 73 20 65 78 70  imit term is exp
3fe0: 6c 61 69 6e 65 64 20 69 6e 20 63 6f 6d 6d 65 6e  lained in commen
3ff0: 74 73 20 6f 6e 20 73 71 6c 69 74 65 33 4d 61 6c  ts on sqlite3Mal
4000: 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 72 65 74  loc() */.    ret
4010: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 4f 6c  urn 0;.  }.  nOl
4020: 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  d = sqlite3Mallo
4030: 63 53 69 7a 65 28 70 4f 6c 64 29 3b 0a 20 20 2f  cSize(pOld);.  /
4040: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
4050: 2d 4f 46 3a 20 52 2d 34 36 31 39 39 2d 33 30 32  -OF: R-46199-302
4060: 34 39 20 53 51 4c 69 74 65 20 67 75 61 72 61 6e  49 SQLite guaran
4070: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 73 65  tees that the se
4080: 63 6f 6e 64 0a 20 20 2a 2a 20 61 72 67 75 6d 65  cond.  ** argume
4090: 6e 74 20 74 6f 20 78 52 65 61 6c 6c 6f 63 20 69  nt to xRealloc i
40a0: 73 20 61 6c 77 61 79 73 20 61 20 76 61 6c 75 65  s always a value
40b0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
40c0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 0a 20 20 2a  rior call to.  *
40d0: 2a 20 78 52 6f 75 6e 64 75 70 2e 20 2a 2f 0a 20  * xRoundup. */. 
40e0: 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 47   nNew = sqlite3G
40f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52  lobalConfig.m.xR
4100: 6f 75 6e 64 75 70 28 28 69 6e 74 29 6e 42 79 74  oundup((int)nByt
4110: 65 73 29 3b 0a 20 20 69 66 28 20 6e 4f 6c 64 3d  es);.  if( nOld=
4120: 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65  =nNew ){.    pNe
4130: 77 20 3d 20 70 4f 6c 64 3b 0a 20 20 7d 65 6c 73  w = pOld;.  }els
4140: 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f  e if( sqlite3Glo
4150: 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74  balConfig.bMemst
4160: 61 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  at ){.    sqlite
4170: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65  3_mutex_enter(me
4180: 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 73  m0.mutex);.    s
4190: 71 6c 69 74 65 33 53 74 61 74 75 73 53 65 74 28  qlite3StatusSet(
41a0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41  SQLITE_STATUS_MA
41b0: 4c 4c 4f 43 5f 53 49 5a 45 2c 20 28 69 6e 74 29  LLOC_SIZE, (int)
41c0: 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 6e 44 69  nBytes);.    nDi
41d0: 66 66 20 3d 20 6e 4e 65 77 20 2d 20 6e 4f 6c 64  ff = nNew - nOld
41e0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
41f0: 33 53 74 61 74 75 73 56 61 6c 75 65 28 53 51 4c  3StatusValue(SQL
4200: 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
4210: 59 5f 55 53 45 44 29 20 3e 3d 20 0a 20 20 20 20  Y_USED) >= .    
4220: 20 20 20 20 20 20 6d 65 6d 30 2e 61 6c 61 72 6d        mem0.alarm
4230: 54 68 72 65 73 68 6f 6c 64 2d 6e 44 69 66 66 20  Threshold-nDiff 
4240: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4250: 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 44 69 66  MallocAlarm(nDif
4260: 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  f);.    }.    pN
4270: 65 77 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ew = sqlite3Glob
4280: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c  alConfig.m.xReal
4290: 6c 6f 63 28 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b  loc(pOld, nNew);
42a0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
42b0: 20 26 26 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61   && mem0.alarmCa
42c0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
42d0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61  sqlite3MallocAla
42e0: 72 6d 28 28 69 6e 74 29 6e 42 79 74 65 73 29 3b  rm((int)nBytes);
42f0: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
4300: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4310: 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 4f 6c  g.m.xRealloc(pOl
4320: 64 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 7d 0a  d, nNew);.    }.
4330: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
4340: 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c        nNew = sql
4350: 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  ite3MallocSize(p
4360: 4e 65 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  New);.      sqli
4370: 74 65 33 53 74 61 74 75 73 55 70 28 53 51 4c 49  te3StatusUp(SQLI
4380: 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
4390: 5f 55 53 45 44 2c 20 6e 4e 65 77 2d 6e 4f 6c 64  _USED, nNew-nOld
43a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
43b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
43c0: 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem0.mutex);.  
43d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20  }else{.    pNew 
43e0: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
43f0: 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63  onfig.m.xRealloc
4400: 28 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b 0a 20 20  (pOld, nNew);.  
4410: 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
4420: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
4430: 28 70 4e 65 77 29 20 29 3b 20 2f 2a 20 49 4d 50  (pNew) ); /* IMP
4440: 3a 20 52 2d 31 31 31 34 38 2d 34 30 39 39 35 20  : R-11148-40995 
4450: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  */.  return pNew
4460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
4470: 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20  ublic interface 
4480: 74 6f 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  to sqlite3Reallo
4490: 63 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  c.  Make sure th
44a0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a  at the memory.**
44b0: 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e   subsystem is in
44c0: 69 74 69 61 6c 69 7a 65 64 20 70 72 69 6f 72 20  itialized prior 
44d0: 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 73 71 6c 69  to invoking sqli
44e0: 74 65 52 65 61 6c 6c 6f 63 2e 0a 2a 2f 0a 76 6f  teRealloc..*/.vo
44f0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 65 61 6c  id *sqlite3_real
4500: 6c 6f 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c 20  loc(void *pOld, 
4510: 69 6e 74 20 6e 29 7b 0a 23 69 66 6e 64 65 66 20  int n){.#ifndef 
4520: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
4530: 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74  INIT.  if( sqlit
4540: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
4550: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
4560: 69 66 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e  if.  if( n<0 ) n
4570: 20 3d 20 30 3b 20 20 2f 2a 20 49 4d 50 3a 20 52   = 0;  /* IMP: R
4580: 2d 32 36 35 30 37 2d 34 37 34 33 31 20 2a 2f 0a  -26507-47431 */.
4590: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
45a0: 52 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 29  Realloc(pOld, n)
45b0: 3b 0a 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  ;.}.void *sqlite
45c0: 33 5f 72 65 61 6c 6c 6f 63 36 34 28 76 6f 69 64  3_realloc64(void
45d0: 20 2a 70 4f 6c 64 2c 20 73 71 6c 69 74 65 33 5f   *pOld, sqlite3_
45e0: 75 69 6e 74 36 34 20 6e 29 7b 0a 23 69 66 6e 64  uint64 n){.#ifnd
45f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4600: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
4610: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4620: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
4630: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73  endif.  return s
4640: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 70 4f  qlite3Realloc(pO
4650: 6c 64 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ld, n);.}.../*.*
4660: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a  * Allocate and z
4670: 65 72 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 20 0a  ero memory..*/ .
4680: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 61 6c  void *sqlite3Mal
4690: 6c 6f 63 5a 65 72 6f 28 75 36 34 20 6e 29 7b 0a  locZero(u64 n){.
46a0: 20 20 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69    void *p = sqli
46b0: 74 65 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20  te3Malloc(n);.  
46c0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d  if( p ){.    mem
46d0: 73 65 74 28 70 2c 20 30 2c 20 28 73 69 7a 65 5f  set(p, 0, (size_
46e0: 74 29 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  t)n);.  }.  retu
46f0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn p;.}../*.** A
4700: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f  llocate and zero
4710: 20 6d 65 6d 6f 72 79 2e 20 20 49 66 20 74 68 65   memory.  If the
4720: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
4730: 73 2c 20 6d 61 6b 65 0a 2a 2a 20 74 68 65 20 6d  s, make.** the m
4740: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
4750: 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   in the connecti
4760: 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76  on pointer..*/.v
4770: 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62 4d 61  oid *sqlite3DbMa
4780: 6c 6c 6f 63 5a 65 72 6f 28 73 71 6c 69 74 65 33  llocZero(sqlite3
4790: 20 2a 64 62 2c 20 75 36 34 20 6e 29 7b 0a 20 20   *db, u64 n){.  
47a0: 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69 74 65  void *p = sqlite
47b0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
47c0: 20 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   n);.  if( p ){.
47d0: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
47e0: 20 28 73 69 7a 65 5f 74 29 6e 29 3b 0a 20 20 7d   (size_t)n);.  }
47f0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
4800: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
4810: 6e 64 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 20  nd zero memory. 
4820: 20 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   If the allocati
4830: 6f 6e 20 66 61 69 6c 73 2c 20 6d 61 6b 65 0a 2a  on fails, make.*
4840: 2a 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c  * the mallocFail
4850: 65 64 20 66 6c 61 67 20 69 6e 20 74 68 65 20 63  ed flag in the c
4860: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
4870: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 62 21 3d  r..**.** If db!=
4880: 30 20 61 6e 64 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0 and db->malloc
4890: 46 61 69 6c 65 64 20 69 73 20 74 72 75 65 20 28  Failed is true (
48a0: 69 6e 64 69 63 61 74 69 6e 67 20 61 20 70 72 69  indicating a pri
48b0: 6f 72 20 6d 61 6c 6c 6f 63 0a 2a 2a 20 66 61 69  or malloc.** fai
48c0: 6c 75 72 65 20 6f 6e 20 74 68 65 20 73 61 6d 65  lure on the same
48d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
48e0: 74 69 6f 6e 29 20 74 68 65 6e 20 61 6c 77 61 79  tion) then alway
48f0: 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 48  s return 0..** H
4900: 65 6e 63 65 20 66 6f 72 20 61 20 70 61 72 74 69  ence for a parti
4910: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 63  cular database c
4920: 6f 6e 6e 65 63 74 69 6f 6e 2c 20 6f 6e 63 65 20  onnection, once 
4930: 6d 61 6c 6c 6f 63 20 73 74 61 72 74 73 0a 2a 2a  malloc starts.**
4940: 20 66 61 69 6c 69 6e 67 2c 20 69 74 20 66 61 69   failing, it fai
4950: 6c 73 20 63 6f 6e 73 69 73 74 65 6e 74 6c 79 20  ls consistently 
4960: 75 6e 74 69 6c 20 6d 61 6c 6c 6f 63 46 61 69 6c  until mallocFail
4970: 65 64 20 69 73 20 72 65 73 65 74 2e 0a 2a 2a 20  ed is reset..** 
4980: 54 68 69 73 20 69 73 20 61 6e 20 69 6d 70 6f 72  This is an impor
4990: 74 61 6e 74 20 61 73 73 75 6d 70 74 69 6f 6e 2e  tant assumption.
49a0: 20 20 54 68 65 72 65 20 61 72 65 20 6d 61 6e 79    There are many
49b0: 20 70 6c 61 63 65 73 20 69 6e 20 74 68 65 0a 2a   places in the.*
49c0: 2a 20 63 6f 64 65 20 74 68 61 74 20 64 6f 20 74  * code that do t
49d0: 68 69 6e 67 73 20 6c 69 6b 65 20 74 68 69 73 3a  hings like this:
49e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  .**.**         i
49f0: 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 73 71  nt *a = (int*)sq
4a00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
4a10: 28 64 62 2c 20 31 30 30 29 3b 0a 2a 2a 20 20 20  (db, 100);.**   
4a20: 20 20 20 20 20 20 69 6e 74 20 2a 62 20 3d 20 28        int *b = (
4a30: 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  int*)sqlite3DbMa
4a40: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 32 30 30 29  llocRaw(db, 200)
4a50: 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28  ;.**         if(
4a60: 20 62 20 29 20 61 5b 31 30 5d 20 3d 20 39 3b 0a   b ) a[10] = 9;.
4a70: 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
4a80: 6f 72 64 73 2c 20 69 66 20 61 20 73 75 62 73 65  ords, if a subse
4a90: 71 75 65 6e 74 20 6d 61 6c 6c 6f 63 20 28 65 78  quent malloc (ex
4aa0: 3a 20 22 62 22 29 20 77 6f 72 6b 65 64 2c 20 69  : "b") worked, i
4ab0: 74 20 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20  t is assumed.** 
4ac0: 74 68 61 74 20 61 6c 6c 20 70 72 69 6f 72 20 6d  that all prior m
4ad0: 61 6c 6c 6f 63 73 20 28 65 78 3a 20 22 61 22 29  allocs (ex: "a")
4ae0: 20 77 6f 72 6b 65 64 20 74 6f 6f 2e 0a 2a 2f 0a   worked too..*/.
4af0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62 4d  void *sqlite3DbM
4b00: 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33  allocRaw(sqlite3
4b10: 20 2a 64 62 2c 20 75 36 34 20 6e 29 7b 0a 20 20   *db, u64 n){.  
4b20: 76 6f 69 64 20 2a 70 3b 0a 20 20 61 73 73 65 72  void *p;.  asser
4b30: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
4b40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
4b50: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
4b60: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4b70: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4b80: 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
4b90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41  QLITE_OMIT_LOOKA
4ba0: 53 49 44 45 0a 20 20 69 66 28 20 64 62 20 29 7b  SIDE.  if( db ){
4bb0: 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c  .    LookasideSl
4bc0: 6f 74 20 2a 70 42 75 66 3b 0a 20 20 20 20 69 66  ot *pBuf;.    if
4bd0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
4be0: 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
4bf0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
4c00: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
4c10: 65 2e 62 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  e.bEnabled ){.  
4c20: 20 20 20 20 69 66 28 20 6e 3e 64 62 2d 3e 6c 6f      if( n>db->lo
4c30: 6f 6b 61 73 69 64 65 2e 73 7a 20 29 7b 0a 20 20  okaside.sz ){.  
4c40: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
4c50: 69 64 65 2e 61 6e 53 74 61 74 5b 31 5d 2b 2b 3b  ide.anStat[1]++;
4c60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4c70: 20 28 70 42 75 66 20 3d 20 64 62 2d 3e 6c 6f 6f   (pBuf = db->loo
4c80: 6b 61 73 69 64 65 2e 70 46 72 65 65 29 3d 3d 30  kaside.pFree)==0
4c90: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   ){.        db->
4ca0: 6c 6f 6f 6b 61 73 69 64 65 2e 61 6e 53 74 61 74  lookaside.anStat
4cb0: 5b 32 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  [2]++;.      }el
4cc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  se{.        db->
4cd0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
4ce0: 3d 20 70 42 75 66 2d 3e 70 4e 65 78 74 3b 0a 20  = pBuf->pNext;. 
4cf0: 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61         db->looka
4d00: 73 69 64 65 2e 6e 4f 75 74 2b 2b 3b 0a 20 20 20  side.nOut++;.   
4d10: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
4d20: 64 65 2e 61 6e 53 74 61 74 5b 30 5d 2b 2b 3b 0a  de.anStat[0]++;.
4d30: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
4d40: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3e 64  lookaside.nOut>d
4d50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6d 78 4f  b->lookaside.mxO
4d60: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
4d70: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6d 78  db->lookaside.mx
4d80: 4f 75 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  Out = db->lookas
4d90: 69 64 65 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  ide.nOut;.      
4da0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
4db0: 72 6e 20 28 76 6f 69 64 2a 29 70 42 75 66 3b 0a  rn (void*)pBuf;.
4dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4dd0: 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 64 62  }.#else.  if( db
4de0: 20 26 26 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   && db->mallocFa
4df0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
4e00: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
4e10: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
4e20: 6c 6c 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 21  lloc(n);.  if( !
4e30: 70 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20 64  p && db ){.    d
4e40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4e50: 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
4e60: 65 33 4d 65 6d 64 65 62 75 67 53 65 74 54 79 70  e3MemdebugSetTyp
4e70: 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 28  e(p, .         (
4e80: 64 62 20 26 26 20 64 62 2d 3e 6c 6f 6f 6b 61 73  db && db->lookas
4e90: 69 64 65 2e 62 45 6e 61 62 6c 65 64 29 20 3f 20  ide.bEnabled) ? 
4ea0: 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 49 44  MEMTYPE_LOOKASID
4eb0: 45 20 3a 20 4d 45 4d 54 59 50 45 5f 48 45 41 50  E : MEMTYPE_HEAP
4ec0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
4ed0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
4ee0: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  he block of memo
4ef0: 72 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ry pointed to by
4f00: 20 70 20 74 6f 20 6e 20 62 79 74 65 73 2e 20 49   p to n bytes. I
4f10: 66 20 74 68 65 0a 2a 2a 20 72 65 73 69 7a 65 20  f the.** resize 
4f20: 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 6d  fails, set the m
4f30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
4f40: 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   in the connecti
4f50: 6f 6e 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  on object..*/.vo
4f60: 69 64 20 2a 73 71 6c 69 74 65 33 44 62 52 65 61  id *sqlite3DbRea
4f70: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62  lloc(sqlite3 *db
4f80: 2c 20 76 6f 69 64 20 2a 70 2c 20 75 36 34 20 6e  , void *p, u64 n
4f90: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  ){.  void *pNew 
4fa0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64  = 0;.  assert( d
4fb0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
4fc0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
4fd0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
4fe0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
4ff0: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
5000: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
5010: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
5020: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
5030: 64 62 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  db, n);.    }.  
5040: 20 20 69 66 28 20 69 73 4c 6f 6f 6b 61 73 69 64    if( isLookasid
5050: 65 28 64 62 2c 20 70 29 20 29 7b 0a 20 20 20 20  e(db, p) ){.    
5060: 20 20 69 66 28 20 6e 3c 3d 64 62 2d 3e 6c 6f 6f    if( n<=db->loo
5070: 6b 61 73 69 64 65 2e 73 7a 20 29 7b 0a 20 20 20  kaside.sz ){.   
5080: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
5090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
50a0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
50b0: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 29 3b 0a 20  locRaw(db, n);. 
50c0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
50d0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
50e0: 70 4e 65 77 2c 20 70 2c 20 64 62 2d 3e 6c 6f 6f  pNew, p, db->loo
50f0: 6b 61 73 69 64 65 2e 73 7a 29 3b 0a 20 20 20 20  kaside.sz);.    
5100: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5110: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
5120: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5130: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
5140: 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70  e3MemdebugHasTyp
5150: 65 28 70 2c 20 28 4d 45 4d 54 59 50 45 5f 4c 4f  e(p, (MEMTYPE_LO
5160: 4f 4b 41 53 49 44 45 7c 4d 45 4d 54 59 50 45 5f  OKASIDE|MEMTYPE_
5170: 48 45 41 50 29 29 20 29 3b 0a 20 20 20 20 20 20  HEAP)) );.      
5180: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d  assert( sqlite3M
5190: 65 6d 64 65 62 75 67 4e 6f 54 79 70 65 28 70 2c  emdebugNoType(p,
51a0: 20 28 75 38 29 7e 28 4d 45 4d 54 59 50 45 5f 4c   (u8)~(MEMTYPE_L
51b0: 4f 4f 4b 41 53 49 44 45 7c 4d 45 4d 54 59 50 45  OOKASIDE|MEMTYPE
51c0: 5f 48 45 41 50 29 29 20 29 3b 0a 20 20 20 20 20  _HEAP)) );.     
51d0: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
51e0: 53 65 74 54 79 70 65 28 70 2c 20 4d 45 4d 54 59  SetType(p, MEMTY
51f0: 50 45 5f 48 45 41 50 29 3b 0a 20 20 20 20 20 20  PE_HEAP);.      
5200: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
5210: 65 61 6c 6c 6f 63 36 34 28 70 2c 20 6e 29 3b 0a  ealloc64(p, n);.
5220: 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
5230: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  ){.        db->m
5240: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
5250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
5260: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65  qlite3MemdebugSe
5270: 74 54 79 70 65 28 70 4e 65 77 2c 0a 20 20 20 20  tType(pNew,.    
5280: 20 20 20 20 20 20 20 20 28 64 62 2d 3e 6c 6f 6f          (db->loo
5290: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
52a0: 3f 20 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53  ? MEMTYPE_LOOKAS
52b0: 49 44 45 20 3a 20 4d 45 4d 54 59 50 45 5f 48 45  IDE : MEMTYPE_HE
52c0: 41 50 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  AP));.    }.  }.
52d0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
52e0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
52f0: 74 6f 20 72 65 61 6c 6c 6f 63 61 74 65 20 70 2e  to reallocate p.
5300: 20 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63    If the realloc
5310: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
5320: 6e 20 66 72 65 65 20 70 0a 2a 2a 20 61 6e 64 20  n free p.** and 
5330: 73 65 74 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61  set the mallocFa
5340: 69 6c 65 64 20 66 6c 61 67 20 69 6e 20 74 68 65  iled flag in the
5350: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5360: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
5370: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
5380: 72 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  rFree(sqlite3 *d
5390: 62 2c 20 76 6f 69 64 20 2a 70 2c 20 75 36 34 20  b, void *p, u64 
53a0: 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77  n){.  void *pNew
53b0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
53c0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
53d0: 70 2c 20 6e 29 3b 0a 20 20 69 66 28 20 21 70 4e  p, n);.  if( !pN
53e0: 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ew ){.    sqlite
53f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
5400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
5410: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  w;.}../*.** Make
5420: 20 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72   a copy of a str
5430: 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ing in memory ob
5440: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5450: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54 68 65 73  teMalloc(). Thes
5460: 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  e .** functions 
5470: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  call sqlite3Mall
5480: 6f 63 52 61 77 28 29 20 64 69 72 65 63 74 6c 79  ocRaw() directly
5490: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69   instead of sqli
54a0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73  teMalloc(). This
54b0: 0a 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 77  .** is because w
54c0: 68 65 6e 20 6d 65 6d 6f 72 79 20 64 65 62 75 67  hen memory debug
54d0: 67 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f  ging is turned o
54e0: 6e 2c 20 74 68 65 73 65 20 74 77 6f 20 66 75 6e  n, these two fun
54f0: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 63  ctions are .** c
5500: 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 73  alled via macros
5510: 20 74 68 61 74 20 72 65 63 6f 72 64 20 74 68 65   that record the
5520: 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 61 6e   current file an
5530: 64 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e  d line number in
5540: 20 74 68 65 0a 2a 2a 20 54 68 72 65 61 64 44 61   the.** ThreadDa
5550: 74 61 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ta structure..*/
5560: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 44 62  .char *sqlite3Db
5570: 53 74 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  StrDup(sqlite3 *
5580: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
5590: 7a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77  z){.  char *zNew
55a0: 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20  ;.  size_t n;.  
55b0: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
55c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
55d0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
55e0: 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 61 73  n30(z) + 1;.  as
55f0: 73 65 72 74 28 20 28 6e 26 30 78 37 66 66 66 66  sert( (n&0x7ffff
5600: 66 66 66 29 3d 3d 6e 20 29 3b 0a 20 20 7a 4e 65  fff)==n );.  zNe
5610: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
5620: 6c 6f 63 52 61 77 28 64 62 2c 20 28 69 6e 74 29  locRaw(db, (int)
5630: 6e 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29  n);.  if( zNew )
5640: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65  {.    memcpy(zNe
5650: 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20  w, z, n);.  }.  
5660: 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 63  return zNew;.}.c
5670: 68 61 72 20 2a 73 71 6c 69 74 65 33 44 62 53 74  har *sqlite3DbSt
5680: 72 4e 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  rNDup(sqlite3 *d
5690: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
56a0: 2c 20 75 36 34 20 6e 29 7b 0a 20 20 63 68 61 72  , u64 n){.  char
56b0: 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d   *zNew;.  if( z=
56c0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
56d0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
56e0: 28 20 28 6e 26 30 78 37 66 66 66 66 66 66 66 29  ( (n&0x7fffffff)
56f0: 3d 3d 6e 20 29 3b 0a 20 20 7a 4e 65 77 20 3d 20  ==n );.  zNew = 
5700: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
5710: 61 77 28 64 62 2c 20 6e 2b 31 29 3b 0a 20 20 69  aw(db, n+1);.  i
5720: 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( zNew ){.    m
5730: 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 28  emcpy(zNew, z, (
5740: 73 69 7a 65 5f 74 29 6e 29 3b 0a 20 20 20 20 7a  size_t)n);.    z
5750: 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  New[n] = 0;.  }.
5760: 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d    return zNew;.}
5770: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
5780: 20 70 72 69 6f 72 20 63 6f 6e 74 65 6e 74 20 69   prior content i
5790: 6e 20 2a 70 7a 20 61 6e 64 20 72 65 70 6c 61 63  n *pz and replac
57a0: 65 20 69 74 20 77 69 74 68 20 61 20 63 6f 70 79  e it with a copy
57b0: 20 6f 66 20 7a 4e 65 77 2e 0a 2a 2f 0a 76 6f 69   of zNew..*/.voi
57c0: 64 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69  d sqlite3SetStri
57d0: 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20 73 71  ng(char **pz, sq
57e0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
57f0: 20 63 68 61 72 20 2a 7a 4e 65 77 29 7b 0a 20 20   char *zNew){.  
5800: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5810: 2c 20 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20  , *pz);.  *pz = 
5820: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
5830: 64 62 2c 20 7a 4e 65 77 29 3b 0a 7d 0a 0a 2f 2a  db, zNew);.}../*
5840: 0a 2a 2a 20 54 61 6b 65 20 61 63 74 69 6f 6e 73  .** Take actions
5850: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
5860: 6e 20 41 50 49 20 63 61 6c 6c 20 74 6f 20 69 6e  n API call to in
5870: 64 69 63 61 74 65 20 61 6e 20 4f 4f 4d 20 65 72  dicate an OOM er
5880: 72 6f 72 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ror.*/.static SQ
5890: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
58a0: 74 20 61 70 69 4f 6f 6d 45 72 72 6f 72 28 73 71  t apiOomError(sq
58b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
58c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
58d0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72   0;.  sqlite3Err
58e0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4e 4f  or(db, SQLITE_NO
58f0: 4d 45 4d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  MEM);.  return S
5900: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 7d 0a 0a  QLITE_NOMEM;.}..
5910: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
5920: 69 6f 6e 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ion must be call
5930: 65 64 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  ed before exitin
5940: 67 20 61 6e 79 20 41 50 49 20 66 75 6e 63 74 69  g any API functi
5950: 6f 6e 20 28 69 2e 65 2e 20 0a 2a 2a 20 72 65 74  on (i.e. .** ret
5960: 75 72 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74  urning control t
5970: 6f 20 74 68 65 20 75 73 65 72 29 20 74 68 61 74  o the user) that
5980: 20 68 61 73 20 63 61 6c 6c 65 64 20 73 71 6c 69   has called sqli
5990: 74 65 33 5f 6d 61 6c 6c 6f 63 20 6f 72 0a 2a 2a  te3_malloc or.**
59a0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
59b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
59c0: 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f  rned value is no
59d0: 72 6d 61 6c 6c 79 20 61 20 63 6f 70 79 20 6f 66  rmally a copy of
59e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
59f0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 0a 2a 2a 20  ment to this.** 
5a00: 66 75 6e 63 74 69 6f 6e 2e 20 48 6f 77 65 76 65  function. Howeve
5a10: 72 2c 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r, if a malloc()
5a20: 20 66 61 69 6c 75 72 65 20 68 61 73 20 6f 63 63   failure has occ
5a30: 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20  urred since the 
5a40: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 69 6e 76 6f  previous.** invo
5a50: 63 61 74 69 6f 6e 20 53 51 4c 49 54 45 5f 4e 4f  cation SQLITE_NO
5a60: 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
5a70: 69 6e 73 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20  instead. .**.** 
5a80: 49 66 20 61 6e 20 4f 4f 4d 20 61 73 20 6f 63 63  If an OOM as occ
5a90: 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
5aa0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 72 72 6f 72  connection error
5ab0: 2d 63 6f 64 65 20 28 74 68 65 20 76 61 6c 75 65  -code (the value
5ac0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20  .** returned by 
5ad0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
5ae0: 29 29 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  )) is set to SQL
5af0: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e  ITE_NOMEM..*/.in
5b00: 74 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  t sqlite3ApiExit
5b10: 28 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 69 6e  (sqlite3* db, in
5b20: 74 20 72 63 29 7b 0a 20 20 2f 2a 20 49 66 20 74  t rc){.  /* If t
5b30: 68 65 20 64 62 20 68 61 6e 64 6c 65 20 6d 75 73  he db handle mus
5b40: 74 20 68 6f 6c 64 20 74 68 65 20 63 6f 6e 6e 65  t hold the conne
5b50: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 6d 75 74  ction handle mut
5b60: 65 78 20 68 65 72 65 2e 0a 20 20 2a 2a 20 4f 74  ex here..  ** Ot
5b70: 68 65 72 77 69 73 65 20 74 68 65 20 72 65 61 64  herwise the read
5b80: 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 65 20 77   (and possible w
5b90: 72 69 74 65 29 20 6f 66 20 64 62 2d 3e 6d 61 6c  rite) of db->mal
5ba0: 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 2a 2a 20  locFailed .  ** 
5bb0: 69 73 20 75 6e 73 61 66 65 2c 20 61 73 20 69 73  is unsafe, as is
5bc0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
5bd0: 69 74 65 33 45 72 72 6f 72 28 29 2e 0a 20 20 2a  ite3Error()..  *
5be0: 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  /.  assert( db!=
5bf0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
5c00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5c10: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
5c20: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
5c30: 46 61 69 6c 65 64 20 7c 7c 20 72 63 3d 3d 53 51  Failed || rc==SQ
5c40: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
5c50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   ){.    return a
5c60: 70 69 4f 6f 6d 45 72 72 6f 72 28 64 62 29 3b 0a  piOomError(db);.
5c70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 20    }.  return rc 
5c80: 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
5c90: 0a                                               .