/ Hex Artifact Content
Login

Artifact bec719bda3db0ea797b03c5e6536b125d0e618ff:


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 20 4d 65 6d 6f 72 79  ******.** Memory
0180: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63   allocation func
0190: 74 69 6f 6e 73 20 75 73 65 64 20 74 68 72 6f 75  tions used throu
01a0: 67 68 6f 75 74 20 73 71 6c 69 74 65 2e 0a 2a 2a  ghout sqlite..**
01b0: 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 6d 61 6c 6c  .**.** $Id: mall
01c0: 6f 63 2e 63 2c 76 20 31 2e 35 20 32 30 30 37 2f  oc.c,v 1.5 2007/
01d0: 30 38 2f 31 36 20 30 34 3a 33 30 3a 34 30 20 64  08/16 04:30:40 d
01e0: 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  rh Exp $.*/.#inc
01f0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0200: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  h".#include "os.
0210: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0220: 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  arg.h>.#include 
0230: 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  <ctype.h>../*.**
0240: 20 53 65 74 20 74 68 65 20 73 6f 66 74 20 68 65   Set the soft he
0250: 61 70 2d 73 69 7a 65 20 6c 69 6d 69 74 20 66 6f  ap-size limit fo
0260: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  r the current th
0270: 72 65 61 64 2e 20 50 61 73 73 69 6e 67 20 61 20  read. Passing a 
0280: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 76 61 6c 75  negative.** valu
0290: 65 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 20 6c  e indicates no l
02a0: 69 6d 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  imit..*/.void sq
02b0: 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
02c0: 6c 69 6d 69 74 28 69 6e 74 20 6e 29 7b 0a 20 20  limit(int n){.  
02d0: 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 64 20  ThreadData *pTd 
02e0: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
02f0: 61 74 61 28 29 3b 0a 20 20 69 66 28 20 70 54 64  ata();.  if( pTd
0300: 20 29 7b 0a 20 20 20 20 70 54 64 2d 3e 6e 53 6f   ){.    pTd->nSo
0310: 66 74 48 65 61 70 4c 69 6d 69 74 20 3d 20 6e 3b  ftHeapLimit = n;
0320: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
0330: 6c 65 61 73 65 54 68 72 65 61 64 44 61 74 61 28  leaseThreadData(
0340: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
0350: 61 73 65 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20  ase memory held 
0360: 62 79 20 53 51 4c 69 74 65 20 69 6e 73 74 61 6e  by SQLite instan
0370: 63 65 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ces created by t
0380: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
0390: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
03a0: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
03b0: 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72  (int n){.  retur
03c0: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  n sqlite3PagerRe
03d0: 6c 65 61 73 65 4d 65 6d 6f 72 79 28 6e 29 3b 0a  leaseMemory(n);.
03e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
03f0: 74 65 20 61 6e 64 20 7a 65 72 6f 20 6d 65 6d 6f  te and zero memo
0400: 72 79 2e 0a 2a 2f 20 0a 76 6f 69 64 20 2a 73 71  ry..*/ .void *sq
0410: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
0420: 75 6e 73 69 67 6e 65 64 20 6e 29 7b 0a 20 20 76  unsigned n){.  v
0430: 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  oid *p = sqlite3
0440: 5f 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 69 66  _malloc(n);.  if
0450: 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ( p ){.    memse
0460: 74 28 70 2c 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a  t(p, 0, n);.  }.
0470: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
0480: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
0490: 64 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 20 20  d zero memory.  
04a0: 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  If the allocatio
04b0: 6e 20 66 61 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a  n fails, make.**
04c0: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
04d0: 64 20 66 6c 61 67 20 69 6e 20 74 68 65 20 63 6f  d flag in the co
04e0: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
04f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
0500: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  e3DbMallocZero(s
0510: 71 6c 69 74 65 33 20 2a 64 62 2c 20 75 6e 73 69  qlite3 *db, unsi
0520: 67 6e 65 64 20 6e 29 7b 0a 20 20 76 6f 69 64 20  gned n){.  void 
0530: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  *p = sqlite3_mal
0540: 6c 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 70 20  loc(n);.  if( p 
0550: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c  ){.    memset(p,
0560: 20 30 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b   0, n);.  }else{
0570: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
0580: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  ailed = 1;.  }. 
0590: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
05a0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
05b0: 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 20 20 49   zero memory.  I
05c0: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
05d0: 20 66 61 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a 20   fails, make.** 
05e0: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
05f0: 20 66 6c 61 67 20 69 6e 20 74 68 65 20 63 6f 6e   flag in the con
0600: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  nection pointer.
0610: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
0620: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c  3DbMallocRaw(sql
0630: 69 74 65 33 20 2a 64 62 2c 20 75 6e 73 69 67 6e  ite3 *db, unsign
0640: 65 64 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70  ed n){.  void *p
0650: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
0660: 63 28 6e 29 3b 0a 20 20 69 66 28 20 21 70 20 29  c(n);.  if( !p )
0670: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
0680: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
0690: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
06a0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
06b0: 72 65 61 6c 6c 6f 63 61 74 65 20 70 2e 20 20 49  reallocate p.  I
06c0: 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 61 74 69  f the reallocati
06d0: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 66  on fails, then f
06e0: 72 65 65 20 70 0a 2a 2a 20 61 6e 64 20 73 65 74  ree p.** and set
06f0: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
0700: 64 20 66 6c 61 67 20 69 6e 20 74 68 65 20 64 61  d flag in the da
0710: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
0720: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
0730: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
0740: 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
0750: 76 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  void *p, int n){
0760: 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20  .  void *pNew;. 
0770: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
0780: 72 65 61 6c 6c 6f 63 28 70 2c 20 6e 29 3b 0a 20  realloc(p, n);. 
0790: 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
07a0: 20 20 73 71 6c 69 74 65 33 46 72 65 65 58 28 70    sqlite3FreeX(p
07b0: 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  );.    db->mallo
07c0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
07d0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
07e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  }.../*.** Make a
07f0: 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e   copy of a strin
0800: 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  g in memory obta
0810: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
0820: 4d 61 6c 6c 6f 63 28 29 2e 20 54 68 65 73 65 20  Malloc(). These 
0830: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  .** functions ca
0840: 6c 6c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ll sqlite3Malloc
0850: 52 61 77 28 29 20 64 69 72 65 63 74 6c 79 20 69  Raw() directly i
0860: 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65  nstead of sqlite
0870: 4d 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73 0a 2a  Malloc(). This.*
0880: 2a 20 69 73 20 62 65 63 61 75 73 65 20 77 68 65  * is because whe
0890: 6e 20 6d 65 6d 6f 72 79 20 64 65 62 75 67 67 69  n memory debuggi
08a0: 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 2c  ng is turned on,
08b0: 20 74 68 65 73 65 20 74 77 6f 20 66 75 6e 63 74   these two funct
08c0: 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 63 61 6c  ions are .** cal
08d0: 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 73 20 74  led via macros t
08e0: 68 61 74 20 72 65 63 6f 72 64 20 74 68 65 20 63  hat record the c
08f0: 75 72 72 65 6e 74 20 66 69 6c 65 20 61 6e 64 20  urrent file and 
0900: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 74  line number in t
0910: 68 65 0a 2a 2a 20 54 68 72 65 61 64 44 61 74 61  he.** ThreadData
0920: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 63   structure..*/.c
0930: 68 61 72 20 2a 73 71 6c 69 74 65 33 53 74 72 44  har *sqlite3StrD
0940: 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  up(const char *z
0950: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  ){.  char *zNew;
0960: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20  .  int n;.  if( 
0970: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  z==0 ) return 0;
0980: 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29  .  n = strlen(z)
0990: 2b 31 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c  +1;.  zNew = sql
09a0: 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 6e 2c  ite3MallocRaw(n,
09b0: 20 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20   1);.  if( zNew 
09c0: 29 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a  ) memcpy(zNew, z
09d0: 2c 20 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  , n);.  return z
09e0: 4e 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c  New;.}.char *sql
09f0: 69 74 65 33 53 74 72 4e 44 75 70 28 63 6f 6e 73  ite3StrNDup(cons
0a00: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
0a10: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  ){.  char *zNew;
0a20: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
0a30: 74 75 72 6e 20 30 3b 0a 20 20 7a 4e 65 77 20 3d  turn 0;.  zNew =
0a40: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61   sqlite3MallocRa
0a50: 77 28 6e 2b 31 2c 20 31 29 3b 0a 20 20 69 66 28  w(n+1, 1);.  if(
0a60: 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   zNew ){.    mem
0a70: 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b  cpy(zNew, z, n);
0a80: 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20 3d 20 30  .    zNew[n] = 0
0a90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
0aa0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
0ab0: 65 61 74 65 20 61 20 73 74 72 69 6e 67 20 66 72  eate a string fr
0ac0: 6f 6d 20 74 68 65 20 32 6e 64 20 61 6e 64 20 73  om the 2nd and s
0ad0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
0ae0: 6e 74 73 20 28 75 70 20 74 6f 20 74 68 65 0a 2a  nts (up to the.*
0af0: 2a 20 66 69 72 73 74 20 4e 55 4c 4c 20 61 72 67  * first NULL arg
0b00: 75 6d 65 6e 74 29 2c 20 73 74 6f 72 65 20 74 68  ument), store th
0b10: 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f  e string in memo
0b20: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
0b30: 0a 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  .** sqliteMalloc
0b40: 28 29 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20  () and make the 
0b50: 70 6f 69 6e 74 65 72 20 69 6e 64 69 63 61 74 65  pointer indicate
0b60: 64 20 62 79 20 74 68 65 20 31 73 74 20 61 72 67  d by the 1st arg
0b70: 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 20 74  ument.** point t
0b80: 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20  o that string.  
0b90: 54 68 65 20 31 73 74 20 61 72 67 75 6d 65 6e 74  The 1st argument
0ba0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 20   must either be 
0bb0: 4e 55 4c 4c 20 6f 72 20 0a 2a 2a 20 70 6f 69 6e  NULL or .** poin
0bc0: 74 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t to memory obta
0bd0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
0be0: 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69  Malloc()..*/.voi
0bf0: 64 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69  d sqlite3SetStri
0c00: 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20 2e 2e  ng(char **pz, ..
0c10: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
0c20: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
0c30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
0c40: 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b    char *zResult;
0c50: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 7a 21 3d  ..  assert( pz!=
0c60: 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 31  0 );.  nByte = 1
0c70: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
0c80: 20 70 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 28   pz);.  while( (
0c90: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
0ca0: 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d 30 20  onst char*))!=0 
0cb0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
0cc0: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 7d 0a 20  strlen(z);.  }. 
0cd0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73   va_end(ap);.  s
0ce0: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 29 3b 0a  qliteFree(*pz);.
0cf0: 20 20 2a 70 7a 20 3d 20 7a 52 65 73 75 6c 74 20    *pz = zResult 
0d00: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
0d10: 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  w( nByte );.  if
0d20: 28 20 7a 52 65 73 75 6c 74 3d 3d 30 20 29 7b 0a  ( zResult==0 ){.
0d30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
0d40: 20 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a    *zResult = 0;.
0d50: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70    va_start(ap, p
0d60: 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20  z);.  while( (z 
0d70: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
0d80: 73 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b  st char*))!=0 ){
0d90: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  .    int n = str
0da0: 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 6d 65 6d 63  len(z);.    memc
0db0: 70 79 28 7a 52 65 73 75 6c 74 2c 20 7a 2c 20 6e  py(zResult, z, n
0dc0: 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 2b  );.    zResult +
0dd0: 3d 20 6e 3b 0a 20 20 7d 0a 20 20 7a 52 65 73 75  = n;.  }.  zResu
0de0: 6c 74 5b 30 5d 20 3d 20 30 3b 0a 20 20 76 61 5f  lt[0] = 0;.  va_
0df0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  end(ap);.}.../*.
0e00: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
0e10: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
0e20: 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 61  before exiting a
0e30: 6e 79 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  ny API function 
0e40: 28 69 2e 65 2e 20 0a 2a 2a 20 72 65 74 75 72 6e  (i.e. .** return
0e50: 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  ing control to t
0e60: 68 65 20 75 73 65 72 29 20 74 68 61 74 20 68 61  he user) that ha
0e70: 73 20 63 61 6c 6c 65 64 20 73 71 6c 69 74 65 33  s called sqlite3
0e80: 5f 6d 61 6c 6c 6f 63 20 6f 72 0a 2a 2a 20 73 71  _malloc or.** sq
0e90: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 2e 0a 2a  lite3_realloc..*
0ea0: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
0eb0: 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 72 6d 61  d value is norma
0ec0: 6c 6c 79 20 61 20 63 6f 70 79 20 6f 66 20 74 68  lly a copy of th
0ed0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
0ee0: 74 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75 6e  t to this.** fun
0ef0: 63 74 69 6f 6e 2e 20 48 6f 77 65 76 65 72 2c 20  ction. However, 
0f00: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
0f10: 69 6c 75 72 65 20 68 61 73 20 6f 63 63 75 72 65  ilure has occure
0f20: 64 20 73 69 6e 63 65 20 74 68 65 20 70 72 65 76  d since the prev
0f30: 69 6f 75 73 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  ious.** invocati
0f40: 6f 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  on SQLITE_NOMEM 
0f50: 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
0f60: 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ead. .**.** If t
0f70: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
0f80: 74 2c 20 64 62 2c 20 69 73 20 6e 6f 74 20 4e 55  t, db, is not NU
0f90: 4c 4c 20 61 6e 64 20 61 20 6d 61 6c 6c 6f 63 28  LL and a malloc(
0fa0: 29 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  ) error has occu
0fb0: 72 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  red,.** then the
0fc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 72 72 6f   connection erro
0fd0: 72 2d 63 6f 64 65 20 28 74 68 65 20 76 61 6c 75  r-code (the valu
0fe0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
0ff0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 29  lite3_errcode())
1000: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
1010: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69  LITE_NOMEM..*/.i
1020: 6e 74 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  nt sqlite3ApiExi
1030: 74 28 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 69  t(sqlite3* db, i
1040: 6e 74 20 72 63 29 7b 0a 20 20 69 66 28 20 64 62  nt rc){.  if( db
1050: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1070: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4e 4f  or(db, SQLITE_NO
1080: 4d 45 4d 2c 20 30 29 3b 0a 20 20 20 20 64 62 2d  MEM, 0);.    db-
1090: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
10a0: 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  0;.    rc = SQLI
10b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
10c0: 72 65 74 75 72 6e 20 72 63 20 26 20 28 64 62 20  return rc & (db 
10d0: 3f 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3a 20  ? db->errMask : 
10e0: 30 78 66 66 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  0xff);.}..#ifdef
10f0: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
1100: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1110: 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c 61 67  tion sets a flag
1120: 20 69 6e 20 74 68 65 20 74 68 72 65 61 64 2d 73   in the thread-s
1130: 70 65 63 69 66 69 63 2d 64 61 74 61 20 73 74 72  pecific-data str
1140: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
1150: 0a 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73  .** cause an ass
1160: 65 72 74 20 74 6f 20 66 61 69 6c 20 69 66 20 73  ert to fail if s
1170: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 6f 72  qliteMalloc() or
1180: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 29   sqliteRealloc()
1190: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 76   is called..*/.v
11a0: 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  oid sqlite3Mallo
11b0: 63 44 69 73 61 6c 6c 6f 77 28 29 7b 0a 23 69 66  cDisallow(){.#if
11c0: 20 30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   0.  assert( sql
11d0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 44 69 73 61 6c  ite3_mallocDisal
11e0: 6c 6f 77 65 64 3e 3d 30 20 29 3b 0a 20 20 73 71  lowed>=0 );.  sq
11f0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 44 69 73 61  lite3_mallocDisa
1200: 6c 6c 6f 77 65 64 2b 2b 3b 0a 23 65 6e 64 69 66  llowed++;.#endif
1210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1220: 75 6e 63 74 69 6f 6e 20 63 6c 65 61 72 73 20 74  unction clears t
1230: 68 65 20 66 6c 61 67 20 73 65 74 20 69 6e 20 74  he flag set in t
1240: 68 65 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  he thread-specif
1250: 69 63 2d 64 61 74 61 20 73 74 72 75 63 74 75 72  ic-data structur
1260: 65 20 73 65 74 0a 2a 2a 20 62 79 20 73 71 6c 69  e set.** by sqli
1270: 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f  te3MallocDisallo
1280: 77 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  w()..*/.void sql
1290: 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28  ite3MallocAllow(
12a0: 29 7b 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  ){.#if 0.  asser
12b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  t( sqlite3_mallo
12c0: 63 44 69 73 61 6c 6c 6f 77 65 64 3e 30 20 29 3b  cDisallowed>0 );
12d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  .  sqlite3_mallo
12e0: 63 44 69 73 61 6c 6c 6f 77 65 64 2d 2d 3b 0a 23  cDisallowed--;.#
12f0: 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a     endif.}.#endif.