/ Hex Artifact Content
Login

Artifact 19461e159bccf0e2cf06a50e867963d0a7b124a8:


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 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ge<=0 ){.    sql
1580: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1590: 2e 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  .pPage = 0;.    
15a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
15b0: 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 30 3b 0a  fig.szPage = 0;.
15c0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
15d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
15e0: 2e 78 49 6e 69 74 28 73 71 6c 69 74 65 33 47 6c  .xInit(sqlite3Gl
15f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 70 41 70  obalConfig.m.pAp
1600: 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63  pData);.  if( rc
1610: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 6d 65  !=SQLITE_OK ) me
1620: 6d 73 65 74 28 26 6d 65 6d 30 2c 20 30 2c 20 73  mset(&mem0, 0, s
1630: 69 7a 65 6f 66 28 6d 65 6d 30 29 29 3b 0a 20 20  izeof(mem0));.  
1640: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1650: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1660: 69 66 20 74 68 65 20 68 65 61 70 20 69 73 20 63  if the heap is c
1670: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 6d  urrently under m
1680: 65 6d 6f 72 79 20 70 72 65 73 73 75 72 65 20 2d  emory pressure -
1690: 20 69 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   in other.** wor
16a0: 64 73 20 69 66 20 74 68 65 20 61 6d 6f 75 6e 74  ds if the amount
16b0: 20 6f 66 20 68 65 61 70 20 75 73 65 64 20 69 73   of heap used is
16c0: 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 6c 69   close to the li
16d0: 6d 69 74 20 73 65 74 20 62 79 0a 2a 2a 20 73 71  mit set by.** sq
16e0: 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
16f0: 6c 69 6d 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20  limit()..*/.int 
1700: 73 71 6c 69 74 65 33 48 65 61 70 4e 65 61 72 6c  sqlite3HeapNearl
1710: 79 46 75 6c 6c 28 76 6f 69 64 29 7b 0a 20 20 72  yFull(void){.  r
1720: 65 74 75 72 6e 20 6d 65 6d 30 2e 6e 65 61 72 6c  eturn mem0.nearl
1730: 79 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  yFull;.}../*.** 
1740: 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  Deinitialize the
1750: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1760: 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f  on subsystem..*/
1770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 6c  .void sqlite3Mal
1780: 6c 6f 63 45 6e 64 28 76 6f 69 64 29 7b 0a 20 20  locEnd(void){.  
1790: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
17a0: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53 68 75 74 64  lConfig.m.xShutd
17b0: 6f 77 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  own ){.    sqlit
17c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
17d0: 2e 78 53 68 75 74 64 6f 77 6e 28 73 71 6c 69 74  .xShutdown(sqlit
17e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
17f0: 2e 70 41 70 70 44 61 74 61 29 3b 0a 20 20 7d 0a  .pAppData);.  }.
1800: 20 20 6d 65 6d 73 65 74 28 26 6d 65 6d 30 2c 20    memset(&mem0, 
1810: 30 2c 20 73 69 7a 65 6f 66 28 6d 65 6d 30 29 29  0, sizeof(mem0))
1820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1830: 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
1840: 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79  memory currently
1850: 20 63 68 65 63 6b 65 64 20 6f 75 74 2e 0a 2a 2f   checked out..*/
1860: 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1870: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
1880: 65 64 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ed(void){.  sqli
1890: 74 65 33 5f 69 6e 74 36 34 20 72 65 73 2c 20 6d  te3_int64 res, m
18a0: 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  x;.  sqlite3_sta
18b0: 74 75 73 36 34 28 53 51 4c 49 54 45 5f 53 54 41  tus64(SQLITE_STA
18c0: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c  TUS_MEMORY_USED,
18d0: 20 26 72 65 73 2c 20 26 6d 78 2c 20 30 29 3b 0a   &res, &mx, 0);.
18e0: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
18f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1900: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
1910: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   of memory that 
1920: 68 61 73 20 65 76 65 72 20 62 65 65 6e 0a 2a 2a  has ever been.**
1930: 20 63 68 65 63 6b 65 64 20 6f 75 74 20 73 69 6e   checked out sin
1940: 63 65 20 65 69 74 68 65 72 20 74 68 65 20 62 65  ce either the be
1950: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
1960: 70 72 6f 63 65 73 73 0a 2a 2a 20 6f 72 20 73 69  process.** or si
1970: 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  nce the most rec
1980: 65 6e 74 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 71  ent reset..*/.sq
1990: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
19a0: 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77  te3_memory_highw
19b0: 61 74 65 72 28 69 6e 74 20 72 65 73 65 74 46 6c  ater(int resetFl
19c0: 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ag){.  sqlite3_i
19d0: 6e 74 36 34 20 72 65 73 2c 20 6d 78 3b 0a 20 20  nt64 res, mx;.  
19e0: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36 34  sqlite3_status64
19f0: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
1a00: 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 72 65 73  EMORY_USED, &res
1a10: 2c 20 26 6d 78 2c 20 72 65 73 65 74 46 6c 61 67  , &mx, resetFlag
1a20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 78 3b 0a  );.  return mx;.
1a30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72  }../*.** Trigger
1a40: 20 74 68 65 20 61 6c 61 72 6d 20 0a 2a 2f 0a 73   the alarm .*/.s
1a50: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1a60: 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 69 6e  e3MallocAlarm(in
1a70: 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64  t nByte){.  void
1a80: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
1a90: 69 64 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  id*,sqlite3_int6
1aa0: 34 2c 69 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65  4,int);.  sqlite
1ab0: 33 5f 69 6e 74 36 34 20 6e 6f 77 55 73 65 64 3b  3_int64 nowUsed;
1ac0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 3b 0a 20  .  void *pArg;. 
1ad0: 20 69 66 28 20 6d 65 6d 30 2e 61 6c 61 72 6d 43   if( mem0.alarmC
1ae0: 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 20 72 65 74  allback==0 ) ret
1af0: 75 72 6e 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b  urn;.  xCallback
1b00: 20 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c   = mem0.alarmCal
1b10: 6c 62 61 63 6b 3b 0a 20 20 6e 6f 77 55 73 65 64  lback;.  nowUsed
1b20: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 75 73   = sqlite3Status
1b30: 56 61 6c 75 65 28 53 51 4c 49 54 45 5f 53 54 41  Value(SQLITE_STA
1b40: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 29  TUS_MEMORY_USED)
1b50: 3b 0a 20 20 70 41 72 67 20 3d 20 6d 65 6d 30 2e  ;.  pArg = mem0.
1b60: 61 6c 61 72 6d 41 72 67 3b 0a 20 20 6d 65 6d 30  alarmArg;.  mem0
1b70: 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20 3d  .alarmCallback =
1b80: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
1b90: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d  tex_leave(mem0.m
1ba0: 75 74 65 78 29 3b 0a 20 20 78 43 61 6c 6c 62 61  utex);.  xCallba
1bb0: 63 6b 28 70 41 72 67 2c 20 6e 6f 77 55 73 65 64  ck(pArg, nowUsed
1bc0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 73 71 6c 69  , nByte);.  sqli
1bd0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1be0: 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 6d  mem0.mutex);.  m
1bf0: 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63  em0.alarmCallbac
1c00: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
1c10: 20 6d 65 6d 30 2e 61 6c 61 72 6d 41 72 67 20 3d   mem0.alarmArg =
1c20: 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pArg;.}../*.** 
1c30: 44 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  Do a memory allo
1c40: 63 61 74 69 6f 6e 20 77 69 74 68 20 73 74 61 74  cation with stat
1c50: 69 73 74 69 63 73 20 61 6e 64 20 61 6c 61 72 6d  istics and alarm
1c60: 73 2e 20 20 41 73 73 75 6d 65 20 74 68 65 0a 2a  s.  Assume the.*
1c70: 2a 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  * lock is alread
1c80: 79 20 68 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69  y held..*/.stati
1c90: 63 20 69 6e 74 20 6d 61 6c 6c 6f 63 57 69 74 68  c int mallocWith
1ca0: 41 6c 61 72 6d 28 69 6e 74 20 6e 2c 20 76 6f 69  Alarm(int n, voi
1cb0: 64 20 2a 2a 70 70 29 7b 0a 20 20 69 6e 74 20 6e  d **pp){.  int n
1cc0: 46 75 6c 6c 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Full;.  void *p;
1cd0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ce0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65  e3_mutex_held(me
1cf0: 6d 30 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  m0.mutex) );.  n
1d00: 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 6c  Full = sqlite3Gl
1d10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 6f  obalConfig.m.xRo
1d20: 75 6e 64 75 70 28 6e 29 3b 0a 20 20 73 71 6c 69  undup(n);.  sqli
1d30: 74 65 33 53 74 61 74 75 73 53 65 74 28 53 51 4c  te3StatusSet(SQL
1d40: 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
1d50: 43 5f 53 49 5a 45 2c 20 6e 29 3b 0a 20 20 69 66  C_SIZE, n);.  if
1d60: 28 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c  ( mem0.alarmCall
1d70: 62 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 73  back!=0 ){.    s
1d80: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 55 73  qlite3_int64 nUs
1d90: 65 64 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  ed = sqlite3Stat
1da0: 75 73 56 61 6c 75 65 28 53 51 4c 49 54 45 5f 53  usValue(SQLITE_S
1db0: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
1dc0: 44 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 73 65  D);.    if( nUse
1dd0: 64 20 3e 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d 54  d >= mem0.alarmT
1de0: 68 72 65 73 68 6f 6c 64 20 2d 20 6e 46 75 6c 6c  hreshold - nFull
1df0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 30 2e 6e   ){.      mem0.n
1e00: 65 61 72 6c 79 46 75 6c 6c 20 3d 20 31 3b 0a 20  earlyFull = 1;. 
1e10: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c       sqlite3Mall
1e20: 6f 63 41 6c 61 72 6d 28 6e 46 75 6c 6c 29 3b 0a  ocAlarm(nFull);.
1e30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e40: 20 6d 65 6d 30 2e 6e 65 61 72 6c 79 46 75 6c 6c   mem0.nearlyFull
1e50: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1e60: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f    p = sqlite3Glo
1e70: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c  balConfig.m.xMal
1e80: 6c 6f 63 28 6e 46 75 6c 6c 29 3b 0a 23 69 66 64  loc(nFull);.#ifd
1e90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1ea0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
1eb0: 4e 54 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26  NT.  if( p==0 &&
1ec0: 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62   mem0.alarmCallb
1ed0: 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ack ){.    sqlit
1ee0: 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 46  e3MallocAlarm(nF
1ef0: 75 6c 6c 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  ull);.    p = sq
1f00: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f10: 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 46 75 6c  g.m.xMalloc(nFul
1f20: 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  l);.  }.#endif. 
1f30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 46   if( p ){.    nF
1f40: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ull = sqlite3Mal
1f50: 6c 6f 63 53 69 7a 65 28 70 29 3b 0a 20 20 20 20  locSize(p);.    
1f60: 73 71 6c 69 74 65 33 53 74 61 74 75 73 55 70 28  sqlite3StatusUp(
1f70: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45  SQLITE_STATUS_ME
1f80: 4d 4f 52 59 5f 55 53 45 44 2c 20 6e 46 75 6c 6c  MORY_USED, nFull
1f90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  );.    sqlite3St
1fa0: 61 74 75 73 55 70 28 53 51 4c 49 54 45 5f 53 54  atusUp(SQLITE_ST
1fb0: 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e  ATUS_MALLOC_COUN
1fc0: 54 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  T, 1);.  }.  *pp
1fd0: 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 6e   = p;.  return n
1fe0: 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Full;.}../*.** A
1ff0: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 20  llocate memory. 
2000: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2010: 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 5f 6d 61   like sqlite3_ma
2020: 6c 6c 6f 63 28 29 20 65 78 63 65 70 74 20 74 68  lloc() except th
2030: 61 74 20 69 74 0a 2a 2a 20 61 73 73 75 6d 65 73  at it.** assumes
2040: 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 75 62 73   the memory subs
2050: 79 73 74 65 6d 20 68 61 73 20 61 6c 72 65 61 64  ystem has alread
2060: 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  y been initializ
2070: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
2080: 69 74 65 33 4d 61 6c 6c 6f 63 28 75 36 34 20 6e  ite3Malloc(u64 n
2090: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20  ){.  void *p;.  
20a0: 69 66 28 20 6e 3d 3d 30 20 7c 7c 20 6e 3e 3d 30  if( n==0 || n>=0
20b0: 78 37 66 66 66 66 66 30 30 20 29 7b 0a 20 20 20  x7fffff00 ){.   
20c0: 20 2f 2a 20 41 20 6d 65 6d 6f 72 79 20 61 6c 6c   /* A memory all
20d0: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 6e 75 6d  ocation of a num
20e0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 68 69  ber of bytes whi
20f0: 63 68 20 69 73 20 6e 65 61 72 20 74 68 65 20 6d  ch is near the m
2100: 61 78 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 73 69  aximum.    ** si
2110: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
2120: 75 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61  ue might cause a
2130: 6e 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c  n integer overfl
2140: 6f 77 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  ow inside of the
2150: 0a 20 20 20 20 2a 2a 20 78 4d 61 6c 6c 6f 63 28  .    ** xMalloc(
2160: 29 2e 20 20 48 65 6e 63 65 20 77 65 20 6c 69 6d  ).  Hence we lim
2170: 69 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  it the maximum s
2180: 69 7a 65 20 74 6f 20 30 78 37 66 66 66 66 66 30  ize to 0x7fffff0
2190: 30 2c 20 67 69 76 69 6e 67 0a 20 20 20 20 2a 2a  0, giving.    **
21a0: 20 32 35 35 20 62 79 74 65 73 20 6f 66 20 6f 76   255 bytes of ov
21b0: 65 72 68 65 61 64 2e 20 20 53 51 4c 69 74 65 20  erhead.  SQLite 
21c0: 69 74 73 65 6c 66 20 77 69 6c 6c 20 6e 65 76 65  itself will neve
21d0: 72 20 75 73 65 20 61 6e 79 74 68 69 6e 67 20 6e  r use anything n
21e0: 65 61 72 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ear.    ** this 
21f0: 61 6d 6f 75 6e 74 2e 20 20 54 68 65 20 6f 6e 6c  amount.  The onl
2200: 79 20 77 61 79 20 74 6f 20 72 65 61 63 68 20 74  y way to reach t
2210: 68 65 20 6c 69 6d 69 74 20 69 73 20 77 69 74 68  he limit is with
2220: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2230: 29 20 2a 2f 0a 20 20 20 20 70 20 3d 20 30 3b 0a  ) */.    p = 0;.
2240: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
2250: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2260: 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20 20  bMemstat ){.    
2270: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2280: 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ter(mem0.mutex);
2290: 0a 20 20 20 20 6d 61 6c 6c 6f 63 57 69 74 68 41  .    mallocWithA
22a0: 6c 61 72 6d 28 28 69 6e 74 29 6e 2c 20 26 70 29  larm((int)n, &p)
22b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
22c0: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d  tex_leave(mem0.m
22d0: 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  utex);.  }else{.
22e0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 47      p = sqlite3G
22f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d  lobalConfig.m.xM
2300: 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 29 3b 0a 20  alloc((int)n);. 
2310: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47   }.  assert( EIG
2320: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2330: 54 28 70 29 20 29 3b 20 20 2f 2a 20 49 4d 50 3a  T(p) );  /* IMP:
2340: 20 52 2d 31 31 31 34 38 2d 34 30 39 39 35 20 2a   R-11148-40995 *
2350: 2f 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  /.  return p;.}.
2360: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
2370: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72  ion of the memor
2380: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
2390: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 61  for use by the a
23a0: 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 2a 2a 20 46  pplication..** F
23b0: 69 72 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  irst make sure t
23c0: 68 65 20 6d 65 6d 6f 72 79 20 73 75 62 73 79 73  he memory subsys
23d0: 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tem is initializ
23e0: 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 0a  ed, then do the.
23f0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ** allocation..*
2400: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
2410: 6d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 23  malloc(int n){.#
2420: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2430: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66  IT_AUTOINIT.  if
2440: 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  ( sqlite3_initia
2450: 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20  lize() ) return 
2460: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
2470: 72 6e 20 6e 3c 3d 30 20 3f 20 30 20 3a 20 73 71  rn n<=0 ? 0 : sq
2480: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a  lite3Malloc(n);.
2490: 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  }.void *sqlite3_
24a0: 6d 61 6c 6c 6f 63 36 34 28 73 71 6c 69 74 65 33  malloc64(sqlite3
24b0: 5f 75 69 6e 74 36 34 20 6e 29 7b 0a 23 69 66 6e  _uint64 n){.#ifn
24c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24d0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73  AUTOINIT.  if( s
24e0: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
24f0: 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  e() ) return 0;.
2500: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2510: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 29  sqlite3Malloc(n)
2520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ;.}../*.** Each 
2530: 74 68 72 65 61 64 20 6d 61 79 20 6f 6e 6c 79 20  thread may only 
2540: 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 75  have a single ou
2550: 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61  tstanding alloca
2560: 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 78 53 63  tion from.** xSc
2570: 72 61 74 63 68 4d 61 6c 6c 6f 63 28 29 2e 20 20  ratchMalloc().  
2580: 57 65 20 76 65 72 69 66 79 20 74 68 69 73 20 63  We verify this c
2590: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
25a0: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
25b0: 0a 2a 2a 20 63 61 73 65 20 62 79 20 73 65 74 74  .** case by sett
25c0: 69 6e 67 20 73 63 72 61 74 63 68 41 6c 6c 6f 63  ing scratchAlloc
25d0: 4f 75 74 20 74 6f 20 31 20 77 68 65 6e 20 61 6e  Out to 1 when an
25e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 69   allocation.** i
25f0: 73 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 6c  s outstanding cl
2600: 65 61 72 69 6e 67 20 69 74 20 77 68 65 6e 20 74  earing it when t
2610: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
2620: 20 66 72 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53   freed..*/.#if S
2630: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2640: 3d 3d 30 20 26 26 20 21 64 65 66 69 6e 65 64 28  ==0 && !defined(
2650: 4e 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 69  NDEBUG).static i
2660: 6e 74 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f  nt scratchAllocO
2670: 75 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ut = 0;.#endif..
2680: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2690: 6d 65 6d 6f 72 79 20 74 68 61 74 20 69 73 20 74  memory that is t
26a0: 6f 20 62 65 20 75 73 65 64 20 61 6e 64 20 72 65  o be used and re
26b0: 6c 65 61 73 65 64 20 72 69 67 68 74 20 61 77 61  leased right awa
26c0: 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  y..** This routi
26d0: 6e 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ne is similar to
26e0: 20 61 6c 6c 6f 63 61 28 29 20 69 6e 20 74 68 61   alloca() in tha
26f0: 74 20 69 74 20 69 73 20 6e 6f 74 20 69 6e 74 65  t it is not inte
2700: 6e 64 65 64 0a 2a 2a 20 66 6f 72 20 73 69 74 75  nded.** for situ
2710: 61 74 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  ations where the
2720: 20 6d 65 6d 6f 72 79 20 6d 69 67 68 74 20 62 65   memory might be
2730: 20 68 65 6c 64 20 6c 6f 6e 67 2d 74 65 72 6d 2e   held long-term.
2740: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
2750: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
2760: 20 67 65 74 20 6d 65 6d 6f 72 79 20 74 6f 20 6f   get memory to o
2770: 6c 64 20 6c 61 72 67 65 20 74 72 61 6e 73 69 65  ld large transie
2780: 6e 74 20 64 61 74 61 0a 2a 2a 20 73 74 72 75 63  nt data.** struc
2790: 74 75 72 65 73 20 74 68 61 74 20 77 6f 75 6c 64  tures that would
27a0: 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 66 69   not normally fi
27b0: 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 6f  t on the stack o
27c0: 66 20 61 6e 0a 2a 2a 20 65 6d 62 65 64 64 65 64  f an.** embedded
27d0: 20 70 72 6f 63 65 73 73 6f 72 2e 0a 2a 2f 0a 76   processor..*/.v
27e0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 53 63 72 61  oid *sqlite3Scra
27f0: 74 63 68 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29  tchMalloc(int n)
2800: 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 61  {.  void *p;.  a
2810: 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 0a 20  ssert( n>0 );.. 
2820: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2830: 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29  nter(mem0.mutex)
2840: 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 61 74 75  ;.  sqlite3Statu
2850: 73 53 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54  sSet(SQLITE_STAT
2860: 55 53 5f 53 43 52 41 54 43 48 5f 53 49 5a 45 2c  US_SCRATCH_SIZE,
2870: 20 6e 29 3b 0a 20 20 69 66 28 20 6d 65 6d 30 2e   n);.  if( mem0.
2880: 6e 53 63 72 61 74 63 68 46 72 65 65 20 26 26 20  nScratchFree && 
2890: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
28a0: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 3e 3d 6e  fig.szScratch>=n
28b0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 6d 30   ){.    p = mem0
28c0: 2e 70 53 63 72 61 74 63 68 46 72 65 65 3b 0a 20  .pScratchFree;. 
28d0: 20 20 20 6d 65 6d 30 2e 70 53 63 72 61 74 63 68     mem0.pScratch
28e0: 46 72 65 65 20 3d 20 6d 65 6d 30 2e 70 53 63 72  Free = mem0.pScr
28f0: 61 74 63 68 46 72 65 65 2d 3e 70 4e 65 78 74 3b  atchFree->pNext;
2900: 0a 20 20 20 20 6d 65 6d 30 2e 6e 53 63 72 61 74  .    mem0.nScrat
2910: 63 68 46 72 65 65 2d 2d 3b 0a 20 20 20 20 73 71  chFree--;.    sq
2920: 6c 69 74 65 33 53 74 61 74 75 73 55 70 28 53 51  lite3StatusUp(SQ
2930: 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41  LITE_STATUS_SCRA
2940: 54 43 48 5f 55 53 45 44 2c 20 31 29 3b 0a 20 20  TCH_USED, 1);.  
2950: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2960: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
2970: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2980: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2990: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
29a0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
29b0: 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20 69  Malloc(n);.    i
29c0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
29d0: 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20  Config.bMemstat 
29e0: 26 26 20 70 20 29 7b 0a 20 20 20 20 20 20 73 71  && p ){.      sq
29f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2a00: 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20  r(mem0.mutex);. 
2a10: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74       sqlite3Stat
2a20: 75 73 55 70 28 53 51 4c 49 54 45 5f 53 54 41 54  usUp(SQLITE_STAT
2a30: 55 53 5f 53 43 52 41 54 43 48 5f 4f 56 45 52 46  US_SCRATCH_OVERF
2a40: 4c 4f 57 2c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  LOW, sqlite3Mall
2a50: 6f 63 53 69 7a 65 28 70 29 29 3b 0a 20 20 20 20  ocSize(p));.    
2a60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2a70: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
2a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2a90: 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74 54  ite3MemdebugSetT
2aa0: 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 53  ype(p, MEMTYPE_S
2ab0: 43 52 41 54 43 48 29 3b 0a 20 20 7d 0a 20 20 61  CRATCH);.  }.  a
2ac0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2ad0: 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 6d 65 6d  utex_notheld(mem
2ae0: 30 2e 6d 75 74 65 78 29 20 29 3b 0a 0a 0a 23 69  0.mutex) );...#i
2af0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
2b00: 41 46 45 3d 3d 30 20 26 26 20 21 64 65 66 69 6e  AFE==0 && !defin
2b10: 65 64 28 4e 44 45 42 55 47 29 0a 20 20 2f 2a 20  ed(NDEBUG).  /* 
2b20: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
2b30: 32 39 37 30 2d 30 35 38 38 30 20 53 51 4c 69 74  2970-05880 SQLit
2b40: 65 20 77 69 6c 6c 20 6e 6f 74 20 75 73 65 20 6d  e will not use m
2b50: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73 63 72  ore than one scr
2b60: 61 74 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72  atch.  ** buffer
2b70: 73 20 70 65 72 20 74 68 72 65 61 64 2e 0a 20 20  s per thread..  
2b80: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 6e  **.  ** This can
2b90: 20 6f 6e 6c 79 20 62 65 20 63 68 65 63 6b 65 64   only be checked
2ba0: 20 69 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61   in single-threa
2bb0: 64 65 64 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ded mode..  */. 
2bc0: 20 61 73 73 65 72 74 28 20 73 63 72 61 74 63 68   assert( scratch
2bd0: 41 6c 6c 6f 63 4f 75 74 3d 3d 30 20 29 3b 0a 20  AllocOut==0 );. 
2be0: 20 69 66 28 20 70 20 29 20 73 63 72 61 74 63 68   if( p ) scratch
2bf0: 41 6c 6c 6f 63 4f 75 74 2b 2b 3b 0a 23 65 6e 64  AllocOut++;.#end
2c00: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  if..  return p;.
2c10: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 63  }.void sqlite3Sc
2c20: 72 61 74 63 68 46 72 65 65 28 76 6f 69 64 20 2a  ratchFree(void *
2c30: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 0a  p){.  if( p ){..
2c40: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
2c50: 44 53 41 46 45 3d 3d 30 20 26 26 20 21 64 65 66  DSAFE==0 && !def
2c60: 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20 20  ined(NDEBUG).   
2c70: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
2c80: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 77 6f  no more than two
2c90: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
2ca0: 69 6f 6e 20 70 65 72 20 74 68 72 65 61 64 0a 20  ion per thread. 
2cb0: 20 20 20 2a 2a 20 69 73 20 6f 75 74 73 74 61 6e     ** is outstan
2cc0: 64 69 6e 67 20 61 74 20 6f 6e 65 20 74 69 6d 65  ding at one time
2cd0: 2e 20 20 28 54 68 69 73 20 69 73 20 6f 6e 6c 79  .  (This is only
2ce0: 20 63 68 65 63 6b 65 64 20 69 6e 20 74 68 65 0a   checked in the.
2cf0: 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 2d 74 68      ** single-th
2d00: 72 65 61 64 65 64 20 63 61 73 65 20 73 69 6e 63  readed case sinc
2d10: 65 20 63 68 65 63 6b 69 6e 67 20 69 6e 20 74 68  e checking in th
2d20: 65 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64  e multi-threaded
2d30: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 77 6f 75   case.    ** wou
2d40: 6c 64 20 62 65 20 6d 75 63 68 20 6d 6f 72 65 20  ld be much more 
2d50: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 29 20 2a 2f  complicated.) */
2d60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 63 72  .    assert( scr
2d70: 61 74 63 68 41 6c 6c 6f 63 4f 75 74 3e 3d 31 20  atchAllocOut>=1 
2d80: 26 26 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f  && scratchAllocO
2d90: 75 74 3c 3d 32 20 29 3b 0a 20 20 20 20 73 63 72  ut<=2 );.    scr
2da0: 61 74 63 68 41 6c 6c 6f 63 4f 75 74 2d 2d 3b 0a  atchAllocOut--;.
2db0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
2dc0: 70 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  p>=sqlite3Global
2dd0: 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20  Config.pScratch 
2de0: 26 26 20 70 3c 6d 65 6d 30 2e 70 53 63 72 61 74  && p<mem0.pScrat
2df0: 63 68 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f  chEnd ){.      /
2e00: 2a 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  * Release memory
2e10: 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45   from the SQLITE
2e20: 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 20  _CONFIG_SCRATCH 
2e30: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
2e40: 20 20 20 20 53 63 72 61 74 63 68 46 72 65 65 73      ScratchFrees
2e50: 6c 6f 74 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20  lot *pSlot;.    
2e60: 20 20 70 53 6c 6f 74 20 3d 20 28 53 63 72 61 74    pSlot = (Scrat
2e70: 63 68 46 72 65 65 73 6c 6f 74 2a 29 70 3b 0a 20  chFreeslot*)p;. 
2e80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
2e90: 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75  ex_enter(mem0.mu
2ea0: 74 65 78 29 3b 0a 20 20 20 20 20 20 70 53 6c 6f  tex);.      pSlo
2eb0: 74 2d 3e 70 4e 65 78 74 20 3d 20 6d 65 6d 30 2e  t->pNext = mem0.
2ec0: 70 53 63 72 61 74 63 68 46 72 65 65 3b 0a 20 20  pScratchFree;.  
2ed0: 20 20 20 20 6d 65 6d 30 2e 70 53 63 72 61 74 63      mem0.pScratc
2ee0: 68 46 72 65 65 20 3d 20 70 53 6c 6f 74 3b 0a 20  hFree = pSlot;. 
2ef0: 20 20 20 20 20 6d 65 6d 30 2e 6e 53 63 72 61 74       mem0.nScrat
2f00: 63 68 46 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20  chFree++;.      
2f10: 61 73 73 65 72 74 28 20 6d 65 6d 30 2e 6e 53 63  assert( mem0.nSc
2f20: 72 61 74 63 68 46 72 65 65 20 3c 3d 20 28 75 33  ratchFree <= (u3
2f30: 32 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  2)sqlite3GlobalC
2f40: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 29  onfig.nScratch )
2f50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2f60: 74 61 74 75 73 44 6f 77 6e 28 53 51 4c 49 54 45  tatusDown(SQLITE
2f70: 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f  _STATUS_SCRATCH_
2f80: 55 53 45 44 2c 20 31 29 3b 0a 20 20 20 20 20 20  USED, 1);.      
2f90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2fa0: 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b  ave(mem0.mutex);
2fb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fc0: 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 6d 65 6d    /* Release mem
2fd0: 6f 72 79 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ory back to the 
2fe0: 68 65 61 70 20 2a 2f 0a 20 20 20 20 20 20 61 73  heap */.      as
2ff0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d  sert( sqlite3Mem
3000: 64 65 62 75 67 48 61 73 54 79 70 65 28 70 2c 20  debugHasType(p, 
3010: 4d 45 4d 54 59 50 45 5f 53 43 52 41 54 43 48 29  MEMTYPE_SCRATCH)
3020: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
3030: 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  ( sqlite3Memdebu
3040: 67 4e 6f 54 79 70 65 28 70 2c 20 28 75 38 29 7e  gNoType(p, (u8)~
3050: 4d 45 4d 54 59 50 45 5f 53 43 52 41 54 43 48 29  MEMTYPE_SCRATCH)
3060: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
3070: 33 4d 65 6d 64 65 62 75 67 53 65 74 54 79 70 65  3MemdebugSetType
3080: 28 70 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50  (p, MEMTYPE_HEAP
3090: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
30a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
30b0: 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20 20 20  .bMemstat ){.   
30c0: 20 20 20 20 20 69 6e 74 20 69 53 69 7a 65 20 3d       int iSize =
30d0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69   sqlite3MallocSi
30e0: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 73  ze(p);.        s
30f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
3100: 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0a  er(mem0.mutex);.
3110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
3120: 74 61 74 75 73 44 6f 77 6e 28 53 51 4c 49 54 45  tatusDown(SQLITE
3130: 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f  _STATUS_SCRATCH_
3140: 4f 56 45 52 46 4c 4f 57 2c 20 69 53 69 7a 65 29  OVERFLOW, iSize)
3150: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3160: 33 53 74 61 74 75 73 44 6f 77 6e 28 53 51 4c 49  3StatusDown(SQLI
3170: 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
3180: 5f 55 53 45 44 2c 20 69 53 69 7a 65 29 3b 0a 20  _USED, iSize);. 
3190: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
31a0: 61 74 75 73 44 6f 77 6e 28 53 51 4c 49 54 45 5f  atusDown(SQLITE_
31b0: 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f  STATUS_MALLOC_CO
31c0: 55 4e 54 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  UNT, 1);.       
31d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
31e0: 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b  nfig.m.xFree(p);
31f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3200: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
3210: 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  0.mutex);.      
3220: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
3230: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3240: 69 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b 0a 20  ig.m.xFree(p);. 
3250: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 52 55 45 20 69  .}../*.** TRUE i
3270: 66 20 70 20 69 73 20 61 20 6c 6f 6f 6b 61 73 69  f p is a lookasi
3280: 64 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  de memory alloca
3290: 74 69 6f 6e 20 66 72 6f 6d 20 64 62 0a 2a 2f 0a  tion from db.*/.
32a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32b0: 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 73 74  MIT_LOOKASIDE.st
32c0: 61 74 69 63 20 69 6e 74 20 69 73 4c 6f 6f 6b 61  atic int isLooka
32d0: 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  side(sqlite3 *db
32e0: 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 72 65  , void *p){.  re
32f0: 74 75 72 6e 20 70 3e 3d 64 62 2d 3e 6c 6f 6f 6b  turn p>=db->look
3300: 61 73 69 64 65 2e 70 53 74 61 72 74 20 26 26 20  aside.pStart && 
3310: 70 3c 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  p<db->lookaside.
3320: 70 45 6e 64 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  pEnd;.}.#else.#d
3330: 65 66 69 6e 65 20 69 73 4c 6f 6f 6b 61 73 69 64  efine isLookasid
3340: 65 28 41 2c 42 29 20 30 0a 23 65 6e 64 69 66 0a  e(A,B) 0.#endif.
3350: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3360: 65 20 73 69 7a 65 20 6f 66 20 61 20 6d 65 6d 6f  e size of a memo
3370: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 72  ry allocation pr
3380: 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65  eviously obtaine
3390: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
33a0: 33 4d 61 6c 6c 6f 63 28 29 20 6f 72 20 73 71 6c  3Malloc() or sql
33b0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
33c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 61 6c  /.int sqlite3Mal
33d0: 6c 6f 63 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  locSize(void *p)
33e0: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
33f0: 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79  te3MemdebugHasTy
3400: 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 48 45  pe(p, MEMTYPE_HE
3410: 41 50 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  AP) );.  return 
3420: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3430: 66 69 67 2e 6d 2e 78 53 69 7a 65 28 70 29 3b 0a  fig.m.xSize(p);.
3440: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 44 62 4d  }.int sqlite3DbM
3450: 61 6c 6c 6f 63 53 69 7a 65 28 73 71 6c 69 74 65  allocSize(sqlite
3460: 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b  3 *db, void *p){
3470: 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 7b 0a  .  if( db==0 ){.
3480: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3490: 74 65 33 4d 65 6d 64 65 62 75 67 4e 6f 54 79 70  te3MemdebugNoTyp
34a0: 65 28 70 2c 20 28 75 38 29 7e 4d 45 4d 54 59 50  e(p, (u8)~MEMTYP
34b0: 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 20 20 61  E_HEAP) );.    a
34c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65  ssert( sqlite3Me
34d0: 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 70 2c  mdebugHasType(p,
34e0: 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29   MEMTYPE_HEAP) )
34f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
3500: 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  ite3MallocSize(p
3510: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3520: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
3530: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
3540: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 69 66 28  utex) );.    if(
3550: 20 69 73 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c   isLookaside(db,
3560: 20 70 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   p) ){.      ret
3570: 75 72 6e 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  urn db->lookasid
3580: 65 2e 73 7a 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e.sz;.    }else{
3590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
35a0: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61  qlite3MemdebugHa
35b0: 73 54 79 70 65 28 70 2c 20 28 4d 45 4d 54 59 50  sType(p, (MEMTYP
35c0: 45 5f 4c 4f 4f 4b 41 53 49 44 45 7c 4d 45 4d 54  E_LOOKASIDE|MEMT
35d0: 59 50 45 5f 48 45 41 50 29 29 20 29 3b 0a 20 20  YPE_HEAP)) );.  
35e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
35f0: 74 65 33 4d 65 6d 64 65 62 75 67 4e 6f 54 79 70  te3MemdebugNoTyp
3600: 65 28 70 2c 20 28 75 38 29 7e 28 4d 45 4d 54 59  e(p, (u8)~(MEMTY
3610: 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 7c 4d 45 4d  PE_LOOKASIDE|MEM
3620: 54 59 50 45 5f 48 45 41 50 29 29 20 29 3b 0a 20  TYPE_HEAP)) );. 
3630: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
3640: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3650: 6d 2e 78 53 69 7a 65 28 70 29 3b 0a 20 20 20 20  m.xSize(p);.    
3660: 7d 0a 20 20 7d 0a 7d 0a 73 71 6c 69 74 65 33 5f  }.  }.}.sqlite3_
3670: 75 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6d  uint64 sqlite3_m
3680: 73 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  size(void *p){. 
3690: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36a0: 4d 65 6d 64 65 62 75 67 4e 6f 54 79 70 65 28 70  MemdebugNoType(p
36b0: 2c 20 28 75 38 29 7e 4d 45 4d 54 59 50 45 5f 48  , (u8)~MEMTYPE_H
36c0: 45 41 50 29 20 29 3b 0a 20 20 61 73 73 65 72 74  EAP) );.  assert
36d0: 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  ( sqlite3Memdebu
36e0: 67 48 61 73 54 79 70 65 28 70 2c 20 4d 45 4d 54  gHasType(p, MEMT
36f0: 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 72  YPE_HEAP) );.  r
3700: 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 5f 75  eturn (sqlite3_u
3710: 69 6e 74 36 34 29 73 71 6c 69 74 65 33 47 6c 6f  int64)sqlite3Glo
3720: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53 69 7a  balConfig.m.xSiz
3730: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  e(p);.}../*.** F
3740: 72 65 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 69  ree memory previ
3750: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 66  ously obtained f
3760: 72 6f 6d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  rom sqlite3Mallo
3770: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
3780: 69 74 65 33 5f 66 72 65 65 28 76 6f 69 64 20 2a  ite3_free(void *
3790: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
37a0: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 49 4d 50   return;  /* IMP
37b0: 3a 20 52 2d 34 39 30 35 33 2d 35 34 35 35 34 20  : R-49053-54554 
37c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
37d0: 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54  ite3MemdebugHasT
37e0: 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 48  ype(p, MEMTYPE_H
37f0: 45 41 50 29 20 29 3b 0a 20 20 61 73 73 65 72 74  EAP) );.  assert
3800: 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  ( sqlite3Memdebu
3810: 67 4e 6f 54 79 70 65 28 70 2c 20 28 75 38 29 7e  gNoType(p, (u8)~
3820: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b  MEMTYPE_HEAP) );
3830: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
3840: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  obalConfig.bMems
3850: 74 61 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tat ){.    sqlit
3860: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
3870: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20  em0.mutex);.    
3880: 73 71 6c 69 74 65 33 53 74 61 74 75 73 44 6f 77  sqlite3StatusDow
3890: 6e 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  n(SQLITE_STATUS_
38a0: 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 73 71 6c  MEMORY_USED, sql
38b0: 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  ite3MallocSize(p
38c0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ));.    sqlite3S
38d0: 74 61 74 75 73 44 6f 77 6e 28 53 51 4c 49 54 45  tatusDown(SQLITE
38e0: 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43  _STATUS_MALLOC_C
38f0: 4f 55 4e 54 2c 20 31 29 3b 0a 20 20 20 20 73 71  OUNT, 1);.    sq
3900: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3910: 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b 0a 20 20  g.m.xFree(p);.  
3920: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
3930: 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78  leave(mem0.mutex
3940: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3950: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3960: 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b 0a  fig.m.xFree(p);.
3970: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
3980: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 6d 65 6d   the size of mem
3990: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 22  ory allocation "
39a0: 70 22 20 74 6f 20 74 68 65 20 63 6f 75 6e 74 20  p" to the count 
39b0: 69 6e 0a 2a 2a 20 2a 64 62 2d 3e 70 6e 42 79 74  in.** *db->pnByt
39c0: 65 73 46 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  esFreed..*/.stat
39d0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
39e0: 4e 45 20 76 6f 69 64 20 6d 65 61 73 75 72 65 41  NE void measureA
39f0: 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 28 73 71  llocationSize(sq
3a00: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
3a10: 2a 70 29 7b 0a 20 20 2a 64 62 2d 3e 70 6e 42 79  *p){.  *db->pnBy
3a20: 74 65 73 46 72 65 65 64 20 2b 3d 20 73 71 6c 69  tesFreed += sqli
3a30: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
3a40: 64 62 2c 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  db,p);.}../*.** 
3a50: 46 72 65 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  Free memory that
3a60: 20 6d 69 67 68 74 20 62 65 20 61 73 73 6f 63 69   might be associ
3a70: 61 74 65 64 20 77 69 74 68 20 61 20 70 61 72 74  ated with a part
3a80: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
3a90: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
3aa0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 62  /.void sqlite3Db
3ab0: 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
3ac0: 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 61 73  , void *p){.  as
3ad0: 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73  sert( db==0 || s
3ae0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3af0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
3b00: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3b10: 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 20 29 7b  urn;.  if( db ){
3b20: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
3b30: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
3b40: 20 20 20 6d 65 61 73 75 72 65 41 6c 6c 6f 63 61     measureAlloca
3b50: 74 69 6f 6e 53 69 7a 65 28 64 62 2c 20 70 29 3b  tionSize(db, p);
3b60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
3b70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4c     }.    if( isL
3b80: 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 29 20  ookaside(db, p) 
3b90: 29 7b 0a 20 20 20 20 20 20 4c 6f 6f 6b 61 73 69  ){.      Lookasi
3ba0: 64 65 53 6c 6f 74 20 2a 70 42 75 66 20 3d 20 28  deSlot *pBuf = (
3bb0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70  LookasideSlot*)p
3bc0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ;.#if SQLITE_DEB
3bd0: 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 73  UG.      /* Tras
3be0: 68 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e  h all content in
3bf0: 20 74 68 65 20 62 75 66 66 65 72 20 62 65 69 6e   the buffer bein
3c00: 67 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  g freed */.     
3c10: 20 6d 65 6d 73 65 74 28 70 2c 20 30 78 61 61 2c   memset(p, 0xaa,
3c20: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73   db->lookaside.s
3c30: 7a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  z);.#endif.     
3c40: 20 70 42 75 66 2d 3e 70 4e 65 78 74 20 3d 20 64   pBuf->pNext = d
3c50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72  b->lookaside.pFr
3c60: 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f  ee;.      db->lo
3c70: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20  okaside.pFree = 
3c80: 70 42 75 66 3b 0a 20 20 20 20 20 20 64 62 2d 3e  pBuf;.      db->
3c90: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 2d 2d  lookaside.nOut--
3ca0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
3cb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
3cc0: 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  rt( sqlite3Memde
3cd0: 62 75 67 48 61 73 54 79 70 65 28 70 2c 20 28 4d  bugHasType(p, (M
3ce0: 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 49 44 45  EMTYPE_LOOKASIDE
3cf0: 7c 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 29 20  |MEMTYPE_HEAP)) 
3d00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
3d10: 69 74 65 33 4d 65 6d 64 65 62 75 67 4e 6f 54 79  ite3MemdebugNoTy
3d20: 70 65 28 70 2c 20 28 75 38 29 7e 28 4d 45 4d 54  pe(p, (u8)~(MEMT
3d30: 59 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 7c 4d 45  YPE_LOOKASIDE|ME
3d40: 4d 54 59 50 45 5f 48 45 41 50 29 29 20 29 3b 0a  MTYPE_HEAP)) );.
3d50: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
3d60: 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  || sqlite3Memdeb
3d70: 75 67 4e 6f 54 79 70 65 28 70 2c 20 4d 45 4d 54  ugNoType(p, MEMT
3d80: 59 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 29 20 29  YPE_LOOKASIDE) )
3d90: 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  ;.  sqlite3Memde
3da0: 62 75 67 53 65 74 54 79 70 65 28 70 2c 20 4d 45  bugSetType(p, ME
3db0: 4d 54 59 50 45 5f 48 45 41 50 29 3b 0a 20 20 73  MTYPE_HEAP);.  s
3dc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
3dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3de0: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65  the size of an e
3df0: 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61  xisting memory a
3e00: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  llocation.*/.voi
3e10: 64 20 2a 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  d *sqlite3Reallo
3e20: 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c 20 75 36  c(void *pOld, u6
3e30: 34 20 6e 42 79 74 65 73 29 7b 0a 20 20 69 6e 74  4 nBytes){.  int
3e40: 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 44 69   nOld, nNew, nDi
3e50: 66 66 3b 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77  ff;.  void *pNew
3e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3e70: 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79  te3MemdebugHasTy
3e80: 70 65 28 70 4f 6c 64 2c 20 4d 45 4d 54 59 50 45  pe(pOld, MEMTYPE
3e90: 5f 48 45 41 50 29 20 29 3b 0a 20 20 61 73 73 65  _HEAP) );.  asse
3ea0: 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  rt( sqlite3Memde
3eb0: 62 75 67 4e 6f 54 79 70 65 28 70 4f 6c 64 2c 20  bugNoType(pOld, 
3ec0: 28 75 38 29 7e 4d 45 4d 54 59 50 45 5f 48 45 41  (u8)~MEMTYPE_HEA
3ed0: 50 29 20 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64  P) );.  if( pOld
3ee0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
3ef0: 6e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  n sqlite3Malloc(
3f00: 6e 42 79 74 65 73 29 3b 20 2f 2a 20 49 4d 50 3a  nBytes); /* IMP:
3f10: 20 52 2d 30 34 33 30 30 2d 35 36 37 31 32 20 2a   R-04300-56712 *
3f20: 2f 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42 79 74  /.  }.  if( nByt
3f30: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  es==0 ){.    sql
3f40: 69 74 65 33 5f 66 72 65 65 28 70 4f 6c 64 29 3b  ite3_free(pOld);
3f50: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 35 30 37   /* IMP: R-26507
3f60: 2d 34 37 34 33 31 20 2a 2f 0a 20 20 20 20 72 65  -47431 */.    re
3f70: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
3f80: 28 20 6e 42 79 74 65 73 3e 3d 30 78 37 66 66 66  ( nBytes>=0x7fff
3f90: 66 66 30 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ff00 ){.    /* T
3fa0: 68 65 20 30 78 37 66 66 66 66 30 30 20 6c 69 6d  he 0x7ffff00 lim
3fb0: 69 74 20 74 65 72 6d 20 69 73 20 65 78 70 6c 61  it term is expla
3fc0: 69 6e 65 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73  ined in comments
3fd0: 20 6f 6e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   on sqlite3Mallo
3fe0: 63 28 29 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  c() */.    retur
3ff0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20  n 0;.  }.  nOld 
4000: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
4010: 69 7a 65 28 70 4f 6c 64 29 3b 0a 20 20 2f 2a 20  ize(pOld);.  /* 
4020: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
4030: 46 3a 20 52 2d 34 36 31 39 39 2d 33 30 32 34 39  F: R-46199-30249
4040: 20 53 51 4c 69 74 65 20 67 75 61 72 61 6e 74 65   SQLite guarante
4050: 65 73 20 74 68 61 74 20 74 68 65 20 73 65 63 6f  es that the seco
4060: 6e 64 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74  nd.  ** argument
4070: 20 74 6f 20 78 52 65 61 6c 6c 6f 63 20 69 73 20   to xRealloc is 
4080: 61 6c 77 61 79 73 20 61 20 76 61 6c 75 65 20 72  always a value r
4090: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 72 69  eturned by a pri
40a0: 6f 72 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20  or call to.  ** 
40b0: 78 52 6f 75 6e 64 75 70 2e 20 2a 2f 0a 20 20 6e  xRoundup. */.  n
40c0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  New = sqlite3Glo
40d0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 6f 75  balConfig.m.xRou
40e0: 6e 64 75 70 28 28 69 6e 74 29 6e 42 79 74 65 73  ndup((int)nBytes
40f0: 29 3b 0a 20 20 69 66 28 20 6e 4f 6c 64 3d 3d 6e  );.  if( nOld==n
4100: 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  New ){.    pNew 
4110: 3d 20 70 4f 6c 64 3b 0a 20 20 7d 65 6c 73 65 20  = pOld;.  }else 
4120: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
4130: 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74  lConfig.bMemstat
4140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4150: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30  mutex_enter(mem0
4160: 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c  .mutex);.    sql
4170: 69 74 65 33 53 74 61 74 75 73 53 65 74 28 53 51  ite3StatusSet(SQ
4180: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
4190: 4f 43 5f 53 49 5a 45 2c 20 28 69 6e 74 29 6e 42  OC_SIZE, (int)nB
41a0: 79 74 65 73 29 3b 0a 20 20 20 20 6e 44 69 66 66  ytes);.    nDiff
41b0: 20 3d 20 6e 4e 65 77 20 2d 20 6e 4f 6c 64 3b 0a   = nNew - nOld;.
41c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
41d0: 74 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49 54  tatusValue(SQLIT
41e0: 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
41f0: 55 53 45 44 29 20 3e 3d 20 0a 20 20 20 20 20 20  USED) >= .      
4200: 20 20 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 54 68      mem0.alarmTh
4210: 72 65 73 68 6f 6c 64 2d 6e 44 69 66 66 20 29 7b  reshold-nDiff ){
4220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61  .      sqlite3Ma
4230: 6c 6c 6f 63 41 6c 61 72 6d 28 6e 44 69 66 66 29  llocAlarm(nDiff)
4240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
4250: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
4260: 43 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f  Config.m.xReallo
4270: 63 28 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b 0a 20  c(pOld, nNew);. 
4280: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 26     if( pNew==0 &
4290: 26 20 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c  & mem0.alarmCall
42a0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  back ){.      sq
42b0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d  lite3MallocAlarm
42c0: 28 28 69 6e 74 29 6e 42 79 74 65 73 29 3b 0a 20  ((int)nBytes);. 
42d0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
42e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
42f0: 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c  m.xRealloc(pOld,
4300: 20 6e 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20   nNew);.    }.  
4310: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
4320: 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74      nNew = sqlit
4330: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4e 65  e3MallocSize(pNe
4340: 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
4350: 33 53 74 61 74 75 73 55 70 28 53 51 4c 49 54 45  3StatusUp(SQLITE
4360: 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
4370: 53 45 44 2c 20 6e 4e 65 77 2d 6e 4f 6c 64 29 3b  SED, nNew-nOld);
4380: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4390: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
43a0: 65 6d 30 2e 6d 75 74 65 78 29 3b 0a 20 20 7d 65  em0.mutex);.  }e
43b0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  lse{.    pNew = 
43c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
43d0: 66 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63 28 70  fig.m.xRealloc(p
43e0: 4f 6c 64 2c 20 6e 4e 65 77 29 3b 0a 20 20 7d 0a  Old, nNew);.  }.
43f0: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
4400: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
4410: 4e 65 77 29 20 29 3b 20 2f 2a 20 49 4d 50 3a 20  New) ); /* IMP: 
4420: 52 2d 31 31 31 34 38 2d 34 30 39 39 35 20 2a 2f  R-11148-40995 */
4430: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4440: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 75 62  }../*.** The pub
4450: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 74 6f  lic interface to
4460: 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 2e   sqlite3Realloc.
4470: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74    Make sure that
4480: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73   the memory.** s
4490: 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74  ubsystem is init
44a0: 69 61 6c 69 7a 65 64 20 70 72 69 6f 72 20 74 6f  ialized prior to
44b0: 20 69 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65   invoking sqlite
44c0: 52 65 61 6c 6c 6f 63 2e 0a 2a 2f 0a 76 6f 69 64  Realloc..*/.void
44d0: 20 2a 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f   *sqlite3_reallo
44e0: 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c 20 69 6e  c(void *pOld, in
44f0: 74 20 6e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  t n){.#ifndef SQ
4500: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
4510: 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  IT.  if( sqlite3
4520: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20  _initialize() ) 
4530: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
4540: 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d  .  if( n<0 ) n =
4550: 20 30 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32   0;  /* IMP: R-2
4560: 36 35 30 37 2d 34 37 34 33 31 20 2a 2f 0a 20 20  6507-47431 */.  
4570: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65  return sqlite3Re
4580: 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 29 3b 0a  alloc(pOld, n);.
4590: 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  }.void *sqlite3_
45a0: 72 65 61 6c 6c 6f 63 36 34 28 76 6f 69 64 20 2a  realloc64(void *
45b0: 70 4f 6c 64 2c 20 73 71 6c 69 74 65 33 5f 75 69  pOld, sqlite3_ui
45c0: 6e 74 36 34 20 6e 29 7b 0a 23 69 66 6e 64 65 66  nt64 n){.#ifndef
45d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
45e0: 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69  OINIT.  if( sqli
45f0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
4600: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
4610: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  dif.  return sql
4620: 69 74 65 33 52 65 61 6c 6c 6f 63 28 70 4f 6c 64  ite3Realloc(pOld
4630: 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , n);.}.../*.** 
4640: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72  Allocate and zer
4650: 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 20 0a 76 6f  o memory..*/ .vo
4660: 69 64 20 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  id *sqlite3Mallo
4670: 63 5a 65 72 6f 28 75 36 34 20 6e 29 7b 0a 20 20  cZero(u64 n){.  
4680: 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69 74 65  void *p = sqlite
4690: 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 69 66  3Malloc(n);.  if
46a0: 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ( p ){.    memse
46b0: 74 28 70 2c 20 30 2c 20 28 73 69 7a 65 5f 74 29  t(p, 0, (size_t)
46c0: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
46d0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   p;.}../*.** All
46e0: 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 6d  ocate and zero m
46f0: 65 6d 6f 72 79 2e 20 20 49 66 20 74 68 65 20 61  emory.  If the a
4700: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
4710: 20 6d 61 6b 65 0a 2a 2a 20 74 68 65 20 6d 61 6c   make.** the mal
4720: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 69  locFailed flag i
4730: 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
4740: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69   pointer..*/.voi
4750: 64 20 2a 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  d *sqlite3DbMall
4760: 6f 63 5a 65 72 6f 28 73 71 6c 69 74 65 33 20 2a  ocZero(sqlite3 *
4770: 64 62 2c 20 75 36 34 20 6e 29 7b 0a 20 20 76 6f  db, u64 n){.  vo
4780: 69 64 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44  id *p = sqlite3D
4790: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
47a0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
47b0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 28    memset(p, 0, (
47c0: 73 69 7a 65 5f 74 29 6e 29 3b 0a 20 20 7d 0a 20  size_t)n);.  }. 
47d0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
47e0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
47f0: 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 20 20 49   zero memory.  I
4800: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
4810: 20 66 61 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a 20   fails, make.** 
4820: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
4830: 20 66 6c 61 67 20 69 6e 20 74 68 65 20 63 6f 6e   flag in the con
4840: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  nection pointer.
4850: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 62 21 3d 30 20  .**.** If db!=0 
4860: 61 6e 64 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  and db->mallocFa
4870: 69 6c 65 64 20 69 73 20 74 72 75 65 20 28 69 6e  iled is true (in
4880: 64 69 63 61 74 69 6e 67 20 61 20 70 72 69 6f 72  dicating a prior
4890: 20 6d 61 6c 6c 6f 63 0a 2a 2a 20 66 61 69 6c 75   malloc.** failu
48a0: 72 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64  re on the same d
48b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
48c0: 6f 6e 29 20 74 68 65 6e 20 61 6c 77 61 79 73 20  on) then always 
48d0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 48 65 6e  return 0..** Hen
48e0: 63 65 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ce for a particu
48f0: 6c 61 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  lar database con
4900: 6e 65 63 74 69 6f 6e 2c 20 6f 6e 63 65 20 6d 61  nection, once ma
4910: 6c 6c 6f 63 20 73 74 61 72 74 73 0a 2a 2a 20 66  lloc starts.** f
4920: 61 69 6c 69 6e 67 2c 20 69 74 20 66 61 69 6c 73  ailing, it fails
4930: 20 63 6f 6e 73 69 73 74 65 6e 74 6c 79 20 75 6e   consistently un
4940: 74 69 6c 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  til mallocFailed
4950: 20 69 73 20 72 65 73 65 74 2e 0a 2a 2a 20 54 68   is reset..** Th
4960: 69 73 20 69 73 20 61 6e 20 69 6d 70 6f 72 74 61  is is an importa
4970: 6e 74 20 61 73 73 75 6d 70 74 69 6f 6e 2e 20 20  nt assumption.  
4980: 54 68 65 72 65 20 61 72 65 20 6d 61 6e 79 20 70  There are many p
4990: 6c 61 63 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  laces in the.** 
49a0: 63 6f 64 65 20 74 68 61 74 20 64 6f 20 74 68 69  code that do thi
49b0: 6e 67 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ngs like this:.*
49c0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 74  *.**         int
49d0: 20 2a 61 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69   *a = (int*)sqli
49e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
49f0: 62 2c 20 31 30 30 29 3b 0a 2a 2a 20 20 20 20 20  b, 100);.**     
4a00: 20 20 20 20 69 6e 74 20 2a 62 20 3d 20 28 69 6e      int *b = (in
4a10: 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  t*)sqlite3DbMall
4a20: 6f 63 52 61 77 28 64 62 2c 20 32 30 30 29 3b 0a  ocRaw(db, 200);.
4a30: 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 62  **         if( b
4a40: 20 29 20 61 5b 31 30 5d 20 3d 20 39 3b 0a 2a 2a   ) a[10] = 9;.**
4a50: 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
4a60: 64 73 2c 20 69 66 20 61 20 73 75 62 73 65 71 75  ds, if a subsequ
4a70: 65 6e 74 20 6d 61 6c 6c 6f 63 20 28 65 78 3a 20  ent malloc (ex: 
4a80: 22 62 22 29 20 77 6f 72 6b 65 64 2c 20 69 74 20  "b") worked, it 
4a90: 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20 74 68  is assumed.** th
4aa0: 61 74 20 61 6c 6c 20 70 72 69 6f 72 20 6d 61 6c  at all prior mal
4ab0: 6c 6f 63 73 20 28 65 78 3a 20 22 61 22 29 20 77  locs (ex: "a") w
4ac0: 6f 72 6b 65 64 20 74 6f 6f 2e 0a 2a 2f 0a 76 6f  orked too..*/.vo
4ad0: 69 64 20 2a 73 71 6c 69 74 65 33 44 62 4d 61 6c  id *sqlite3DbMal
4ae0: 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 20 2a  locRaw(sqlite3 *
4af0: 64 62 2c 20 75 36 34 20 6e 29 7b 0a 20 20 76 6f  db, u64 n){.  vo
4b00: 69 64 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  id *p;.  assert(
4b10: 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65   db==0 || sqlite
4b20: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
4b30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
4b40: 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 64 62  ert( db==0 || db
4b50: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4b60: 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
4b70: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49  ITE_OMIT_LOOKASI
4b80: 44 45 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  DE.  if( db ){. 
4b90: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
4ba0: 20 2a 70 42 75 66 3b 0a 20 20 20 20 69 66 28 20   *pBuf;.    if( 
4bb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4bc0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
4bd0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
4be0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
4bf0: 62 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  bEnabled ){.    
4c00: 20 20 69 66 28 20 6e 3e 64 62 2d 3e 6c 6f 6f 6b    if( n>db->look
4c10: 61 73 69 64 65 2e 73 7a 20 29 7b 0a 20 20 20 20  aside.sz ){.    
4c20: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4c30: 65 2e 61 6e 53 74 61 74 5b 31 5d 2b 2b 3b 0a 20  e.anStat[1]++;. 
4c40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
4c50: 70 42 75 66 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  pBuf = db->looka
4c60: 73 69 64 65 2e 70 46 72 65 65 29 3d 3d 30 20 29  side.pFree)==0 )
4c70: 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f  {.        db->lo
4c80: 6f 6b 61 73 69 64 65 2e 61 6e 53 74 61 74 5b 32  okaside.anStat[2
4c90: 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]++;.      }else
4ca0: 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f  {.        db->lo
4cb0: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20  okaside.pFree = 
4cc0: 70 42 75 66 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pBuf->pNext;.   
4cd0: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
4ce0: 64 65 2e 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 20  de.nOut++;.     
4cf0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4d00: 2e 61 6e 53 74 61 74 5b 30 5d 2b 2b 3b 0a 20 20  .anStat[0]++;.  
4d10: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6c 6f        if( db->lo
4d20: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3e 64 62 2d  okaside.nOut>db-
4d30: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6d 78 4f 75 74  >lookaside.mxOut
4d40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62   ){.          db
4d50: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6d 78 4f 75  ->lookaside.mxOu
4d60: 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  t = db->lookasid
4d70: 65 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  e.nOut;.        
4d80: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
4d90: 20 28 76 6f 69 64 2a 29 70 42 75 66 3b 0a 20 20   (void*)pBuf;.  
4da0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4db0: 23 65 6c 73 65 0a 20 20 69 66 28 20 64 62 20 26  #else.  if( db &
4dc0: 26 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  & db->mallocFail
4dd0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
4de0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
4df0: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
4e00: 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 21 70 20  oc(n);.  if( !p 
4e10: 26 26 20 64 62 20 29 7b 0a 20 20 20 20 64 62 2d  && db ){.    db-
4e20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
4e30: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
4e40: 4d 65 6d 64 65 62 75 67 53 65 74 54 79 70 65 28  MemdebugSetType(
4e50: 70 2c 20 0a 20 20 20 20 20 20 20 20 20 28 64 62  p, .         (db
4e60: 20 26 26 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64   && db->lookasid
4e70: 65 2e 62 45 6e 61 62 6c 65 64 29 20 3f 20 4d 45  e.bEnabled) ? ME
4e80: 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 20  MTYPE_LOOKASIDE 
4e90: 3a 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 3b  : MEMTYPE_HEAP);
4ea0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
4eb0: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
4ec0: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
4ed0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
4ee0: 20 74 6f 20 6e 20 62 79 74 65 73 2e 20 49 66 20   to n bytes. If 
4ef0: 74 68 65 0a 2a 2a 20 72 65 73 69 7a 65 20 66 61  the.** resize fa
4f00: 69 6c 73 2c 20 73 65 74 20 74 68 65 20 6d 61 6c  ils, set the mal
4f10: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 69  locFailed flag i
4f20: 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
4f30: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
4f40: 20 2a 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c   *sqlite3DbReall
4f50: 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oc(sqlite3 *db, 
4f60: 76 6f 69 64 20 2a 70 2c 20 75 36 34 20 6e 29 7b  void *p, u64 n){
4f70: 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20  .  void *pNew = 
4f80: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  0;.  assert( db!
4f90: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
4fa0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4fb0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
4fc0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
4fd0: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
4fe0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
4ff0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
5000: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
5010: 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
5020: 69 66 28 20 69 73 4c 6f 6f 6b 61 73 69 64 65 28  if( isLookaside(
5030: 64 62 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  db, p) ){.      
5040: 69 66 28 20 6e 3c 3d 64 62 2d 3e 6c 6f 6f 6b 61  if( n<=db->looka
5050: 73 69 64 65 2e 73 7a 20 29 7b 0a 20 20 20 20 20  side.sz ){.     
5060: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
5070: 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 20     }.      pNew 
5080: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
5090: 63 52 61 77 28 64 62 2c 20 6e 29 3b 0a 20 20 20  cRaw(db, n);.   
50a0: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
50b0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
50c0: 65 77 2c 20 70 2c 20 64 62 2d 3e 6c 6f 6f 6b 61  ew, p, db->looka
50d0: 73 69 64 65 2e 73 7a 29 3b 0a 20 20 20 20 20 20  side.sz);.      
50e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
50f0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a  db, p);.      }.
5100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5110: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5120: 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28  MemdebugHasType(
5130: 70 2c 20 28 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b  p, (MEMTYPE_LOOK
5140: 41 53 49 44 45 7c 4d 45 4d 54 59 50 45 5f 48 45  ASIDE|MEMTYPE_HE
5150: 41 50 29 29 20 29 3b 0a 20 20 20 20 20 20 61 73  AP)) );.      as
5160: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d  sert( sqlite3Mem
5170: 64 65 62 75 67 4e 6f 54 79 70 65 28 70 2c 20 28  debugNoType(p, (
5180: 75 38 29 7e 28 4d 45 4d 54 59 50 45 5f 4c 4f 4f  u8)~(MEMTYPE_LOO
5190: 4b 41 53 49 44 45 7c 4d 45 4d 54 59 50 45 5f 48  KASIDE|MEMTYPE_H
51a0: 45 41 50 29 29 20 29 3b 0a 20 20 20 20 20 20 73  EAP)) );.      s
51b0: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65  qlite3MemdebugSe
51c0: 74 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45  tType(p, MEMTYPE
51d0: 5f 48 45 41 50 29 3b 0a 20 20 20 20 20 20 70 4e  _HEAP);.      pN
51e0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
51f0: 6c 6c 6f 63 36 34 28 70 2c 20 6e 29 3b 0a 20 20  lloc64(p, n);.  
5200: 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b      if( !pNew ){
5210: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  .        db->mal
5220: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
5230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
5240: 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74 54  ite3MemdebugSetT
5250: 79 70 65 28 70 4e 65 77 2c 0a 20 20 20 20 20 20  ype(pNew,.      
5260: 20 20 20 20 20 20 28 64 62 2d 3e 6c 6f 6f 6b 61        (db->looka
5270: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3f 20  side.bEnabled ? 
5280: 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 49 44  MEMTYPE_LOOKASID
5290: 45 20 3a 20 4d 45 4d 54 59 50 45 5f 48 45 41 50  E : MEMTYPE_HEAP
52a0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
52b0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
52c0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
52d0: 20 72 65 61 6c 6c 6f 63 61 74 65 20 70 2e 20 20   reallocate p.  
52e0: 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 61 74  If the reallocat
52f0: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ion fails, then 
5300: 66 72 65 65 20 70 0a 2a 2a 20 61 6e 64 20 73 65  free p.** and se
5310: 74 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c  t the mallocFail
5320: 65 64 20 66 6c 61 67 20 69 6e 20 74 68 65 20 64  ed flag in the d
5330: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5340: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
5350: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
5360: 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
5370: 20 76 6f 69 64 20 2a 70 2c 20 75 36 34 20 6e 29   void *p, u64 n)
5380: 7b 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a  {.  void *pNew;.
5390: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
53a0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 2c  DbRealloc(db, p,
53b0: 20 6e 29 3b 0a 20 20 69 66 28 20 21 70 4e 65 77   n);.  if( !pNew
53c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
53d0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
53e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
53f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
5400: 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e   copy of a strin
5410: 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  g in memory obta
5420: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
5430: 4d 61 6c 6c 6f 63 28 29 2e 20 54 68 65 73 65 20  Malloc(). These 
5440: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  .** functions ca
5450: 6c 6c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ll sqlite3Malloc
5460: 52 61 77 28 29 20 64 69 72 65 63 74 6c 79 20 69  Raw() directly i
5470: 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65  nstead of sqlite
5480: 4d 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73 0a 2a  Malloc(). This.*
5490: 2a 20 69 73 20 62 65 63 61 75 73 65 20 77 68 65  * is because whe
54a0: 6e 20 6d 65 6d 6f 72 79 20 64 65 62 75 67 67 69  n memory debuggi
54b0: 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 2c  ng is turned on,
54c0: 20 74 68 65 73 65 20 74 77 6f 20 66 75 6e 63 74   these two funct
54d0: 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 63 61 6c  ions are .** cal
54e0: 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 73 20 74  led via macros t
54f0: 68 61 74 20 72 65 63 6f 72 64 20 74 68 65 20 63  hat record the c
5500: 75 72 72 65 6e 74 20 66 69 6c 65 20 61 6e 64 20  urrent file and 
5510: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 74  line number in t
5520: 68 65 0a 2a 2a 20 54 68 72 65 61 64 44 61 74 61  he.** ThreadData
5530: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 63   structure..*/.c
5540: 68 61 72 20 2a 73 71 6c 69 74 65 33 44 62 53 74  har *sqlite3DbSt
5550: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
5560: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
5570: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a  {.  char *zNew;.
5580: 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 69 66    size_t n;.  if
5590: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ( z==0 ){.    re
55a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20  turn 0;.  }.  n 
55b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
55c0: 30 28 7a 29 20 2b 20 31 3b 0a 20 20 61 73 73 65  0(z) + 1;.  asse
55d0: 72 74 28 20 28 6e 26 30 78 37 66 66 66 66 66 66  rt( (n&0x7ffffff
55e0: 66 29 3d 3d 6e 20 29 3b 0a 20 20 7a 4e 65 77 20  f)==n );.  zNew 
55f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
5600: 63 52 61 77 28 64 62 2c 20 28 69 6e 74 29 6e 29  cRaw(db, (int)n)
5610: 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 7b 0a  ;.  if( zNew ){.
5620: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c      memcpy(zNew,
5630: 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65   z, n);.  }.  re
5640: 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 63 68 61  turn zNew;.}.cha
5650: 72 20 2a 73 71 6c 69 74 65 33 44 62 53 74 72 4e  r *sqlite3DbStrN
5660: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
5670: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
5680: 75 36 34 20 6e 29 7b 0a 20 20 63 68 61 72 20 2a  u64 n){.  char *
5690: 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  zNew;.  if( z==0
56a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
56b0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
56c0: 28 6e 26 30 78 37 66 66 66 66 66 66 66 29 3d 3d  (n&0x7fffffff)==
56d0: 6e 20 29 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71  n );.  zNew = sq
56e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
56f0: 28 64 62 2c 20 6e 2b 31 29 3b 0a 20 20 69 66 28  (db, n+1);.  if(
5700: 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   zNew ){.    mem
5710: 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 28 73 69  cpy(zNew, z, (si
5720: 7a 65 5f 74 29 6e 29 3b 0a 20 20 20 20 7a 4e 65  ze_t)n);.    zNe
5730: 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  w[n] = 0;.  }.  
5740: 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 0a  return zNew;.}..
5750: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 70  /*.** Free any p
5760: 72 69 6f 72 20 63 6f 6e 74 65 6e 74 20 69 6e 20  rior content in 
5770: 2a 70 7a 20 61 6e 64 20 72 65 70 6c 61 63 65 20  *pz and replace 
5780: 69 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  it with a copy o
5790: 66 20 7a 4e 65 77 2e 0a 2a 2f 0a 76 6f 69 64 20  f zNew..*/.void 
57a0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
57b0: 28 63 68 61 72 20 2a 2a 70 7a 2c 20 73 71 6c 69  (char **pz, sqli
57c0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
57d0: 68 61 72 20 2a 7a 4e 65 77 29 7b 0a 20 20 73 71  har *zNew){.  sq
57e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
57f0: 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20 73 71  *pz);.  *pz = sq
5800: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
5810: 2c 20 7a 4e 65 77 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zNew);.}../*.*
5820: 2a 20 54 61 6b 65 20 61 63 74 69 6f 6e 73 20 61  * Take actions a
5830: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  t the end of an 
5840: 41 50 49 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69  API call to indi
5850: 63 61 74 65 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  cate an OOM erro
5860: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  r.*/.static SQLI
5870: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
5880: 61 70 69 4f 6f 6d 45 72 72 6f 72 28 73 71 6c 69  apiOomError(sqli
5890: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
58a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
58b0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
58c0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  (db, SQLITE_NOME
58d0: 4d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  M);.  return SQL
58e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 7d 0a 0a 2f 2a  ITE_NOMEM;.}../*
58f0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5900: 6e 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  n must be called
5910: 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
5920: 61 6e 79 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  any API function
5930: 20 28 69 2e 65 2e 20 0a 2a 2a 20 72 65 74 75 72   (i.e. .** retur
5940: 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  ning control to 
5950: 74 68 65 20 75 73 65 72 29 20 74 68 61 74 20 68  the user) that h
5960: 61 73 20 63 61 6c 6c 65 64 20 73 71 6c 69 74 65  as called sqlite
5970: 33 5f 6d 61 6c 6c 6f 63 20 6f 72 0a 2a 2a 20 73  3_malloc or.** s
5980: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 2e 0a  qlite3_realloc..
5990: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
59a0: 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 72 6d  ed value is norm
59b0: 61 6c 6c 79 20 61 20 63 6f 70 79 20 6f 66 20 74  ally a copy of t
59c0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
59d0: 6e 74 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75  nt to this.** fu
59e0: 6e 63 74 69 6f 6e 2e 20 48 6f 77 65 76 65 72 2c  nction. However,
59f0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
5a00: 61 69 6c 75 72 65 20 68 61 73 20 6f 63 63 75 72  ailure has occur
5a10: 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 70 72  red since the pr
5a20: 65 76 69 6f 75 73 0a 2a 2a 20 69 6e 76 6f 63 61  evious.** invoca
5a30: 74 69 6f 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  tion SQLITE_NOME
5a40: 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  M is returned in
5a50: 73 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  stead. .**.** If
5a60: 20 61 6e 20 4f 4f 4d 20 61 73 20 6f 63 63 75 72   an OOM as occur
5a70: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  red, then the co
5a80: 6e 6e 65 63 74 69 6f 6e 20 65 72 72 6f 72 2d 63  nnection error-c
5a90: 6f 64 65 20 28 74 68 65 20 76 61 6c 75 65 0a 2a  ode (the value.*
5aa0: 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  * returned by sq
5ab0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 29  lite3_errcode())
5ac0: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
5ad0: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20  E_NOMEM..*/.int 
5ae0: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 73  sqlite3ApiExit(s
5af0: 71 6c 69 74 65 33 2a 20 64 62 2c 20 69 6e 74 20  qlite3* db, int 
5b00: 72 63 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  rc){.  /* If the
5b10: 20 64 62 20 68 61 6e 64 6c 65 20 6d 75 73 74 20   db handle must 
5b20: 68 6f 6c 64 20 74 68 65 20 63 6f 6e 6e 65 63 74  hold the connect
5b30: 69 6f 6e 20 68 61 6e 64 6c 65 20 6d 75 74 65 78  ion handle mutex
5b40: 20 68 65 72 65 2e 0a 20 20 2a 2a 20 4f 74 68 65   here..  ** Othe
5b50: 72 77 69 73 65 20 74 68 65 20 72 65 61 64 20 28  rwise the read (
5b60: 61 6e 64 20 70 6f 73 73 69 62 6c 65 20 77 72 69  and possible wri
5b70: 74 65 29 20 6f 66 20 64 62 2d 3e 6d 61 6c 6c 6f  te) of db->mallo
5b80: 63 46 61 69 6c 65 64 20 0a 20 20 2a 2a 20 69 73  cFailed .  ** is
5b90: 20 75 6e 73 61 66 65 2c 20 61 73 20 69 73 20 74   unsafe, as is t
5ba0: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
5bb0: 65 33 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  e3Error()..  */.
5bc0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
5bd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5be0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5bf0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
5c00: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
5c10: 69 6c 65 64 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  iled || rc==SQLI
5c20: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
5c30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 70 69  {.    return api
5c40: 4f 6f 6d 45 72 72 6f 72 28 64 62 29 3b 0a 20 20  OomError(db);.  
5c50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20  }.  return rc & 
5c60: 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a     db->errMask;.}.