/ Hex Artifact Content
Login

Artifact c2f5da620d8e030c6974a0ddcaeb7b408c9bdb3d:


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 37 20 32 30 30 37 2f  oc.c,v 1.7 2007/
01d0: 30 38 2f 32 31 20 31 30 3a 34 34 3a 31 36 20 64  08/21 10:44:16 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 3c 73 74 64  h".#include <std
0210: 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  arg.h>.#include 
0220: 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  <ctype.h>../*.**
0230: 20 53 65 74 20 74 68 65 20 73 6f 66 74 20 68 65   Set the soft he
0240: 61 70 2d 73 69 7a 65 20 6c 69 6d 69 74 20 66 6f  ap-size limit fo
0250: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  r the current th
0260: 72 65 61 64 2e 20 50 61 73 73 69 6e 67 20 61 20  read. Passing a 
0270: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 76 61 6c 75  negative.** valu
0280: 65 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 20 6c  e indicates no l
0290: 69 6d 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  imit..*/.void sq
02a0: 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
02b0: 6c 69 6d 69 74 28 69 6e 74 20 6e 29 7b 0a 23 69  limit(int n){.#i
02c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02d0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
02e0: 4d 45 4e 54 0a 20 20 54 68 72 65 61 64 44 61 74  MENT.  ThreadDat
02f0: 61 20 2a 70 54 64 20 3d 20 73 71 6c 69 74 65 33  a *pTd = sqlite3
0300: 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
0310: 69 66 28 20 70 54 64 20 29 7b 0a 20 20 20 20 70  if( pTd ){.    p
0320: 54 64 2d 3e 6e 53 6f 66 74 48 65 61 70 4c 69 6d  Td->nSoftHeapLim
0330: 69 74 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 73 71  it = n;.  }.  sq
0340: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 68 72 65  lite3ReleaseThre
0350: 61 64 44 61 74 61 28 29 3b 0a 23 65 6e 64 69 66  adData();.#endif
0360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
0370: 65 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  e memory held by
0380: 20 53 51 4c 69 74 65 20 69 6e 73 74 61 6e 63 65   SQLite instance
0390: 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
03a0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
03b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
03c0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69  release_memory(i
03d0: 6e 74 20 6e 29 7b 0a 23 69 66 20 64 65 66 69 6e  nt n){.#if defin
03e0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
03f0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
0400: 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  NT) && !defined(
0410: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
0420: 49 4f 29 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  IO).  return sql
0430: 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65  ite3PagerRelease
0440: 4d 65 6d 6f 72 79 28 6e 29 3b 0a 23 65 6c 73 65  Memory(n);.#else
0450: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
0460: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  _OK;.#endif.}...
0470: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0480: 6e 64 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 0a  nd zero memory..
0490: 2a 2f 20 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  */ .void *sqlite
04a0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 75 6e 73 69  3MallocZero(unsi
04b0: 67 6e 65 64 20 6e 29 7b 0a 20 20 76 6f 69 64 20  gned n){.  void 
04c0: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  *p = sqlite3_mal
04d0: 6c 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 70 20  loc(n);.  if( p 
04e0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c  ){.    memset(p,
04f0: 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65   0, n);.  }.  re
0500: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0510: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65   Allocate and ze
0520: 72 6f 20 6d 65 6d 6f 72 79 2e 20 20 49 66 20 74  ro memory.  If t
0530: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  he allocation fa
0540: 69 6c 73 2c 20 6d 61 6b 65 0a 2a 2a 20 74 68 65  ils, make.** the
0550: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
0560: 61 67 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63  ag in the connec
0570: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  tion pointer..*/
0580: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62  .void *sqlite3Db
0590: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 71 6c 69 74  MallocZero(sqlit
05a0: 65 33 20 2a 64 62 2c 20 75 6e 73 69 67 6e 65 64  e3 *db, unsigned
05b0: 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 20 3d   n){.  void *p =
05c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
05d0: 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  n);.  if( p ){. 
05e0: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
05f0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
0600: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0610: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 1;.  }.  ret
0620: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
0630: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72  Allocate and zer
0640: 6f 20 6d 65 6d 6f 72 79 2e 20 20 49 66 20 74 68  o memory.  If th
0650: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  e allocation fai
0660: 6c 73 2c 20 6d 61 6b 65 0a 2a 2a 20 74 68 65 20  ls, make.** the 
0670: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
0680: 67 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74  g in the connect
0690: 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ion pointer..*/.
06a0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62 4d  void *sqlite3DbM
06b0: 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33  allocRaw(sqlite3
06c0: 20 2a 64 62 2c 20 75 6e 73 69 67 6e 65 64 20 6e   *db, unsigned n
06d0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 73  ){.  void *p = s
06e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 29  qlite3_malloc(n)
06f0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
0700: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
0710: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ed = 1;.  }.  re
0720: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0730: 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 61 6c   Attempt to real
0740: 6c 6f 63 61 74 65 20 70 2e 20 20 49 66 20 74 68  locate p.  If th
0750: 65 20 72 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  e reallocation f
0760: 61 69 6c 73 2c 20 74 68 65 6e 20 66 72 65 65 20  ails, then free 
0770: 70 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 68 65  p.** and set the
0780: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
0790: 61 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ag in the databa
07a0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
07b0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44  /.void *sqlite3D
07c0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 73  bReallocOrFree(s
07d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
07e0: 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 76   *p, int n){.  v
07f0: 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  oid *pNew;.  pNe
0800: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
0810: 6c 6f 63 28 70 2c 20 6e 29 3b 0a 20 20 69 66 28  loc(p, n);.  if(
0820: 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 73 71   !pNew ){.    sq
0830: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
0840: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
0850: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  led = 1;.  }.  r
0860: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a  eturn pNew;.}...
0870: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70  /*.** Make a cop
0880: 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e  y of a string in
0890: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
08a0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
08b0: 6f 63 28 29 2e 20 54 68 65 73 65 20 0a 2a 2a 20  oc(). These .** 
08c0: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 20 73  functions call s
08d0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28  qlite3MallocRaw(
08e0: 29 20 64 69 72 65 63 74 6c 79 20 69 6e 73 74 65  ) directly inste
08f0: 61 64 20 6f 66 20 73 71 6c 69 74 65 4d 61 6c 6c  ad of sqliteMall
0900: 6f 63 28 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73  oc(). This.** is
0910: 20 62 65 63 61 75 73 65 20 77 68 65 6e 20 6d 65   because when me
0920: 6d 6f 72 79 20 64 65 62 75 67 67 69 6e 67 20 69  mory debugging i
0930: 73 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65  s turned on, the
0940: 73 65 20 74 77 6f 20 66 75 6e 63 74 69 6f 6e 73  se two functions
0950: 20 61 72 65 20 0a 2a 2a 20 63 61 6c 6c 65 64 20   are .** called 
0960: 76 69 61 20 6d 61 63 72 6f 73 20 74 68 61 74 20  via macros that 
0970: 72 65 63 6f 72 64 20 74 68 65 20 63 75 72 72 65  record the curre
0980: 6e 74 20 66 69 6c 65 20 61 6e 64 20 6c 69 6e 65  nt file and line
0990: 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 2a   number in the.*
09a0: 2a 20 54 68 72 65 61 64 44 61 74 61 20 73 74 72  * ThreadData str
09b0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 63 68 61 72 20  ucture..*/.char 
09c0: 2a 73 71 6c 69 74 65 33 53 74 72 44 75 70 28 63  *sqlite3StrDup(c
09d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
09e0: 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 69   char *zNew;.  i
09f0: 6e 74 20 6e 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  nt n;.  if( z==0
0a00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
0a10: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 2b 31 3b 0a   = strlen(z)+1;.
0a20: 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    zNew = sqlite3
0a30: 5f 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 69 66  _malloc(n);.  if
0a40: 28 20 7a 4e 65 77 20 29 20 6d 65 6d 63 70 79 28  ( zNew ) memcpy(
0a50: 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 72  zNew, z, n);.  r
0a60: 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 63 68  eturn zNew;.}.ch
0a70: 61 72 20 2a 73 71 6c 69 74 65 33 53 74 72 4e 44  ar *sqlite3StrND
0a80: 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  up(const char *z
0a90: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 63 68 61 72  , int n){.  char
0aa0: 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d   *zNew;.  if( z=
0ab0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0ac0: 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   zNew = sqlite3_
0ad0: 6d 61 6c 6c 6f 63 28 6e 2b 31 29 3b 0a 20 20 69  malloc(n+1);.  i
0ae0: 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( zNew ){.    m
0af0: 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e  emcpy(zNew, z, n
0b00: 29 3b 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20 3d  );.    zNew[n] =
0b10: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
0b20: 20 7a 4e 65 77 3b 0a 7d 0a 0a 63 68 61 72 20 2a   zNew;.}..char *
0b30: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
0b40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
0b50: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
0b60: 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69  har *zNew = sqli
0b70: 74 65 33 53 74 72 44 75 70 28 7a 29 3b 0a 20 20  te3StrDup(z);.  
0b80: 69 66 28 20 7a 20 26 26 20 21 7a 4e 65 77 20 29  if( z && !zNew )
0b90: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
0ba0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
0bb0: 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d    return zNew;.}
0bc0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 44 62  .char *sqlite3Db
0bd0: 53 74 72 4e 44 75 70 28 73 71 6c 69 74 65 33 20  StrNDup(sqlite3 
0be0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
0bf0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 63 68  *z, int n){.  ch
0c00: 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74  ar *zNew = sqlit
0c10: 65 33 53 74 72 4e 44 75 70 28 7a 2c 20 6e 29 3b  e3StrNDup(z, n);
0c20: 0a 20 20 69 66 28 20 7a 20 26 26 20 21 7a 4e 65  .  if( z && !zNe
0c30: 77 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  w ){.    db->mal
0c40: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0c50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77   }.  return zNew
0c60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
0c70: 65 20 61 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  e a string from 
0c80: 74 68 65 20 32 6e 64 20 61 6e 64 20 73 75 62 73  the 2nd and subs
0c90: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
0ca0: 20 28 75 70 20 74 6f 20 74 68 65 0a 2a 2a 20 66   (up to the.** f
0cb0: 69 72 73 74 20 4e 55 4c 4c 20 61 72 67 75 6d 65  irst NULL argume
0cc0: 6e 74 29 2c 20 73 74 6f 72 65 20 74 68 65 20 73  nt), store the s
0cd0: 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20  tring in memory 
0ce0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
0cf0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
0d00: 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 6f 69  and make the poi
0d10: 6e 74 65 72 20 69 6e 64 69 63 61 74 65 64 20 62  nter indicated b
0d20: 79 20 74 68 65 20 31 73 74 20 61 72 67 75 6d 65  y the 1st argume
0d30: 6e 74 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  nt.** point to t
0d40: 68 61 74 20 73 74 72 69 6e 67 2e 20 20 54 68 65  hat string.  The
0d50: 20 31 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75   1st argument mu
0d60: 73 74 20 65 69 74 68 65 72 20 62 65 20 4e 55 4c  st either be NUL
0d70: 4c 20 6f 72 20 0a 2a 2a 20 70 6f 69 6e 74 20 74  L or .** point t
0d80: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
0d90: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
0da0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  loc()..*/.void s
0db0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
0dc0: 63 68 61 72 20 2a 2a 70 7a 2c 20 2e 2e 2e 29 7b  char **pz, ...){
0dd0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
0de0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 6f   int nByte;.  co
0df0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  nst char *z;.  c
0e00: 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 0a 20  har *zResult;.. 
0e10: 20 61 73 73 65 72 74 28 20 70 7a 21 3d 30 20 29   assert( pz!=0 )
0e20: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20  ;.  nByte = 1;. 
0e30: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70 7a   va_start(ap, pz
0e40: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20 3d  );.  while( (z =
0e50: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
0e60: 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a  t char*))!=0 ){.
0e70: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
0e80: 6c 65 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 76 61  len(z);.  }.  va
0e90: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69  _end(ap);.  sqli
0ea0: 74 65 33 5f 66 72 65 65 28 2a 70 7a 29 3b 0a 20  te3_free(*pz);. 
0eb0: 20 2a 70 7a 20 3d 20 7a 52 65 73 75 6c 74 20 3d   *pz = zResult =
0ec0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
0ed0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 52  nByte);.  if( zR
0ee0: 65 73 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  esult==0 ){.    
0ef0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2a 7a  return;.  }.  *z
0f00: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 76 61  Result = 0;.  va
0f10: 5f 73 74 61 72 74 28 61 70 2c 20 70 7a 29 3b 0a  _start(ap, pz);.
0f20: 20 20 77 68 69 6c 65 28 20 28 7a 20 3d 20 76 61    while( (z = va
0f30: 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
0f40: 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20  har*))!=0 ){.   
0f50: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
0f60: 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  z);.    memcpy(z
0f70: 52 65 73 75 6c 74 2c 20 7a 2c 20 6e 29 3b 0a 20  Result, z, n);. 
0f80: 20 20 20 7a 52 65 73 75 6c 74 20 2b 3d 20 6e 3b     zResult += n;
0f90: 0a 20 20 7d 0a 20 20 7a 52 65 73 75 6c 74 5b 30  .  }.  zResult[0
0fa0: 5d 20 3d 20 30 3b 0a 20 20 76 61 5f 65 6e 64 28  ] = 0;.  va_end(
0fb0: 61 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ap);.}.../*.** T
0fc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
0fd0: 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
0fe0: 72 65 20 65 78 69 74 69 6e 67 20 61 6e 79 20 41  re exiting any A
0ff0: 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65  PI function (i.e
1000: 2e 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20  . .** returning 
1010: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75  control to the u
1020: 73 65 72 29 20 74 68 61 74 20 68 61 73 20 63 61  ser) that has ca
1030: 6c 6c 65 64 20 73 71 6c 69 74 65 33 5f 6d 61 6c  lled sqlite3_mal
1040: 6c 6f 63 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65  loc or.** sqlite
1050: 33 5f 72 65 61 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a  3_realloc..**.**
1060: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
1070: 6c 75 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  lue is normally 
1080: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
1090: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
10a0: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
10b0: 6e 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 61  n. However, if a
10c0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
10d0: 65 20 68 61 73 20 6f 63 63 75 72 65 64 20 73 69  e has occured si
10e0: 6e 63 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  nce the previous
10f0: 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 53  .** invocation S
1100: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
1110: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
1120: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
1130: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 64  irst argument, d
1140: 62 2c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  b, is not NULL a
1150: 6e 64 20 61 20 6d 61 6c 6c 6f 63 28 29 20 65 72  nd a malloc() er
1160: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c  ror has occured,
1170: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  .** then the con
1180: 6e 65 63 74 69 6f 6e 20 65 72 72 6f 72 2d 63 6f  nection error-co
1190: 64 65 20 28 74 68 65 20 76 61 6c 75 65 20 72 65  de (the value re
11a0: 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
11b0: 33 5f 65 72 72 63 6f 64 65 28 29 29 0a 2a 2a 20  3_errcode()).** 
11c0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
11d0: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73  _NOMEM..*/.int s
11e0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 73 71  qlite3ApiExit(sq
11f0: 6c 69 74 65 33 2a 20 64 62 2c 20 69 6e 74 20 72  lite3* db, int r
1200: 63 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  c){.  if( db && 
1210: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1220: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1230: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
1240: 4e 4f 4d 45 4d 2c 20 30 29 3b 0a 20 20 20 20 64  NOMEM, 0);.    d
1250: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1260: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 0;.    rc = SQ
1270: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
1280: 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 28 64    return rc & (d
1290: 62 20 3f 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  b ? db->errMask 
12a0: 3a 20 30 78 66 66 29 3b 0a 7d 0a 0a 23 69 66 64  : 0xff);.}..#ifd
12b0: 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
12c0: 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  UG./*.** This fu
12d0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c  nction sets a fl
12e0: 61 67 20 69 6e 20 74 68 65 20 74 68 72 65 61 64  ag in the thread
12f0: 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61 20 73  -specific-data s
1300: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
1310: 6c 6c 0a 2a 2a 20 63 61 75 73 65 20 61 6e 20 61  ll.** cause an a
1320: 73 73 65 72 74 20 74 6f 20 66 61 69 6c 20 69 66  ssert to fail if
1330: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
1340: 6f 72 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63  or sqliteRealloc
1350: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  () is called..*/
1360: 0a 23 69 66 20 30 0a 76 6f 69 64 20 73 71 6c 69  .#if 0.void sqli
1370: 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f  te3MallocDisallo
1380: 77 28 29 7b 0a 23 69 66 20 30 0a 20 20 61 73 73  w(){.#if 0.  ass
1390: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ert( sqlite3_mal
13a0: 6c 6f 63 44 69 73 61 6c 6c 6f 77 65 64 3e 3d 30  locDisallowed>=0
13b0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 61   );.  sqlite3_ma
13c0: 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 65 64 2b 2b  llocDisallowed++
13d0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
13e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13f0: 63 6c 65 61 72 73 20 74 68 65 20 66 6c 61 67 20  clears the flag 
1400: 73 65 74 20 69 6e 20 74 68 65 20 74 68 72 65 61  set in the threa
1410: 64 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61 20  d-specific-data 
1420: 73 74 72 75 63 74 75 72 65 20 73 65 74 0a 2a 2a  structure set.**
1430: 20 62 79 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   by sqlite3Mallo
1440: 63 44 69 73 61 6c 6c 6f 77 28 29 2e 0a 2a 2f 0a  cDisallow()..*/.
1450: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c  void sqlite3Mall
1460: 6f 63 41 6c 6c 6f 77 28 29 7b 0a 23 69 66 20 30  ocAllow(){.#if 0
1470: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1480: 65 33 5f 6d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f  e3_mallocDisallo
1490: 77 65 64 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74  wed>0 );.  sqlit
14a0: 65 33 5f 6d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f  e3_mallocDisallo
14b0: 77 65 64 2d 2d 3b 0a 23 65 6e 64 69 66 0a 7d 0a  wed--;.#endif.}.
14c0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a        #endif.#endif.