/ Hex Artifact Content
Login

Artifact 28f399a6e3b4b55caf635f1941ee2391072d1a78:


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 55 74 69 6c 69 74  ******.** Utilit
0180: 79 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64  y functions used
0190: 20 74 68 72 6f 75 67 68 6f 75 74 20 73 71 6c 69   throughout sqli
01a0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  te..**.** This f
01b0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 66 75 6e  ile contains fun
01c0: 63 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 6f 63  ctions for alloc
01d0: 61 74 69 6e 67 20 6d 65 6d 6f 72 79 2c 20 63 6f  ating memory, co
01e0: 6d 70 61 72 69 6e 67 0a 2a 2a 20 73 74 72 69 6e  mparing.** strin
01f0: 67 73 2c 20 61 6e 64 20 73 74 75 66 66 20 6c 69  gs, and stuff li
0200: 6b 65 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 24  ke that..**.** $
0210: 49 64 3a 20 75 74 69 6c 2e 63 2c 76 20 31 2e 31  Id: util.c,v 1.1
0220: 37 34 20 32 30 30 36 2f 30 31 2f 31 38 20 31 35  74 2006/01/18 15
0230: 3a 32 35 3a 31 38 20 64 61 6e 69 65 6c 6b 31 39  :25:18 danielk19
0240: 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  77 Exp $.*/.#inc
0250: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0260: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  h".#include "os.
0270: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0280: 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  arg.h>.#include 
0290: 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  <ctype.h>../*.**
02a0: 20 4d 41 4c 4c 4f 43 20 57 52 41 50 50 45 52 20   MALLOC WRAPPER 
02b0: 41 52 43 48 49 54 45 43 54 55 52 45 0a 2a 2a 0a  ARCHITECTURE.**.
02c0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 20 63 6f  ** The sqlite co
02d0: 64 65 20 61 63 63 65 73 73 65 73 20 64 79 6e 61  de accesses dyna
02e0: 6d 69 63 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  mic memory alloc
02f0: 61 74 69 6f 6e 2f 64 65 61 6c 6c 6f 63 61 74 69  ation/deallocati
0300: 6f 6e 20 62 79 20 69 6e 76 6f 6b 69 6e 67 0a 2a  on by invoking.*
0310: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
0320: 66 6f 75 72 20 41 50 49 73 20 28 77 68 69 63 68  four APIs (which
0330: 20 6d 61 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e   may be implemen
0340: 74 65 64 20 61 73 20 6d 61 63 72 6f 73 29 2e 0a  ted as macros)..
0350: 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
0360: 33 4d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 20 20 20  3Malloc().**    
0370: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61   sqlite3MallocRa
0380: 77 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  w().**     sqlit
0390: 65 33 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 20  e3Realloc().**  
03a0: 20 20 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f     sqlite3Reallo
03b0: 63 4f 72 46 72 65 65 28 29 0a 2a 2a 20 20 20 20  cOrFree().**    
03c0: 20 73 71 6c 69 74 65 33 46 72 65 65 28 29 0a 2a   sqlite3Free().*
03d0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 41 6c 6c  *     sqlite3All
03e0: 6f 63 53 69 7a 65 28 29 0a 2a 2a 0a 2a 2a 20 54  ocSize().**.** T
03f0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69  he function sqli
0400: 74 65 33 46 72 65 65 58 20 70 65 72 66 6f 72 6d  te3FreeX perform
0410: 73 20 74 68 65 20 73 61 6d 65 20 74 61 73 6b 20  s the same task 
0420: 61 73 20 73 71 6c 69 74 65 33 46 72 65 65 20 61  as sqlite3Free a
0430: 6e 64 20 69 73 0a 2a 2a 20 67 75 61 72 61 6e 74  nd is.** guarant
0440: 65 65 64 20 74 6f 20 62 65 20 61 20 72 65 61 6c  eed to be a real
0450: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 73   function. The s
0460: 61 6d 65 20 68 6f 6c 64 73 20 66 6f 72 20 73 71  ame holds for sq
0470: 6c 69 74 65 33 4d 61 6c 6c 6f 63 58 0a 2a 2a 0a  lite3MallocX.**.
0480: 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 41 50 49  ** The above API
0490: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  s are implemente
04a0: 64 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  d in terms of th
04b0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 70 72 6f 76  e functions prov
04c0: 69 64 65 64 20 61 74 20 74 68 65 20 4f 73 0a 2a  ided at the Os.*
04d0: 2a 20 6c 65 76 65 6c 20 28 6e 6f 74 20 69 6e 20  * level (not in 
04e0: 74 68 69 73 20 66 69 6c 65 29 2e 20 54 68 65 20  this file). The 
04f0: 4f 73 20 6c 65 76 65 6c 20 69 6e 74 65 72 66 61  Os level interfa
0500: 63 65 20 69 73 20 6e 65 76 65 72 20 61 63 63 65  ce is never acce
0510: 73 73 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  ssed directly.**
0520: 20 62 79 20 63 6f 64 65 20 6f 75 74 73 69 64 65   by code outside
0530: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   of this file..*
0540: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
0550: 4f 73 4d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 20 20  OsMalloc().**   
0560: 20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 6c 6c    sqlite3OsReall
0570: 6f 63 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  oc().**     sqli
0580: 74 65 33 4f 73 46 72 65 65 28 29 0a 2a 2a 20 20  te3OsFree().**  
0590: 20 20 20 73 71 6c 69 74 65 33 4f 73 41 6c 6c 6f     sqlite3OsAllo
05a0: 63 61 74 69 6f 6e 53 69 7a 65 28 29 0a 2a 2a 0a  cationSize().**.
05b0: 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 73 71 6c  ** Functions sql
05c0: 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 29 20  ite3MallocRaw() 
05d0: 61 6e 64 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  and sqlite3Reall
05e0: 6f 63 28 29 20 6d 61 79 20 69 6e 76 6f 6b 65 20  oc() may invoke 
05f0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65  .** sqlite3_rele
0600: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69 66 20  ase_memory() if 
0610: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
0620: 33 4f 73 4d 61 6c 6c 6f 63 28 29 20 6f 72 0a 2a  3OsMalloc() or.*
0630: 2a 20 73 71 6c 69 74 65 33 4f 73 52 65 61 6c 6c  * sqlite3OsReall
0640: 6f 63 28 29 20 66 61 69 6c 73 20 28 6f 72 20 69  oc() fails (or i
0650: 66 20 74 68 65 20 73 6f 66 74 2d 68 65 61 70 2d  f the soft-heap-
0660: 6c 69 6d 69 74 20 66 6f 72 20 74 68 65 20 74 68  limit for the th
0670: 72 65 61 64 20 69 73 0a 2a 2a 20 65 78 63 65 65  read is.** excee
0680: 64 65 64 29 2e 20 46 75 6e 63 74 69 6f 6e 20 73  ded). Function s
0690: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 75  qlite3Malloc() u
06a0: 73 75 61 6c 6c 79 20 69 6e 76 6f 6b 65 73 0a 2a  sually invokes.*
06b0: 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52  * sqlite3MallocR
06c0: 61 77 28 29 2e 0a 2a 2a 0a 2a 2a 20 4d 41 4c 4c  aw()..**.** MALL
06d0: 4f 43 20 54 45 53 54 20 57 52 41 50 50 45 52 20  OC TEST WRAPPER 
06e0: 41 52 43 48 49 54 45 43 54 55 52 45 0a 2a 2a 0a  ARCHITECTURE.**.
06f0: 2a 2a 20 54 68 65 20 74 65 73 74 20 77 72 61 70  ** The test wrap
0700: 70 65 72 20 70 72 6f 76 69 64 65 73 20 65 78 74  per provides ext
0710: 72 61 20 74 65 73 74 20 66 61 63 69 6c 69 74 69  ra test faciliti
0720: 65 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  es to ensure the
0730: 20 6c 69 62 72 61 72 79 20 0a 2a 2a 20 64 6f 65   library .** doe
0740: 73 20 6e 6f 74 20 6c 65 61 6b 20 6d 65 6d 6f 72  s not leak memor
0750: 79 20 61 6e 64 20 68 61 6e 64 6c 65 73 20 74 68  y and handles th
0760: 65 20 66 61 69 6c 75 72 65 20 6f 66 20 74 68 65  e failure of the
0770: 20 75 6e 64 65 72 6c 79 69 6e 67 20 28 4f 73 20   underlying (Os 
0780: 6c 65 76 65 6c 29 0a 2a 2a 20 61 6c 6c 6f 63 61  level).** alloca
0790: 74 69 6f 6e 20 73 79 73 74 65 6d 20 63 6f 72 72  tion system corr
07a0: 65 63 74 6c 79 2e 20 49 74 20 69 73 20 6f 6e 6c  ectly. It is onl
07b0: 79 20 70 72 65 73 65 6e 74 20 69 66 20 74 68 65  y present if the
07c0: 20 6c 69 62 72 61 72 79 20 69 73 20 0a 2a 2a 20   library is .** 
07d0: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
07e0: 65 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  e SQLITE_MEMDEBU
07f0: 47 20 6d 61 63 72 6f 20 73 65 74 2e 0a 2a 2a 0a  G macro set..**.
0800: 2a 2a 20 20 20 20 20 2a 20 47 75 61 72 64 70 6f  **     * Guardpo
0810: 73 74 73 20 74 6f 20 64 65 74 65 63 74 20 6f 76  sts to detect ov
0820: 65 72 77 72 69 74 65 73 2e 0a 2a 2a 20 20 20 20  erwrites..**    
0830: 20 2a 20 41 62 69 6c 69 74 79 20 74 6f 20 63 61   * Ability to ca
0840: 75 73 65 20 61 20 73 70 65 63 69 66 69 63 20 4d  use a specific M
0850: 61 6c 6c 6f 63 28 29 20 6f 72 20 52 65 61 6c 6c  alloc() or Reall
0860: 6f 63 28 29 20 74 6f 20 66 61 69 6c 2e 0a 2a 2a  oc() to fail..**
0870: 20 20 20 20 20 2a 20 41 75 64 69 74 20 6f 75 74       * Audit out
0880: 73 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20  standing memory 
0890: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65  allocations (i.e
08a0: 20 63 68 65 63 6b 20 66 6f 72 20 6c 65 61 6b 73   check for leaks
08b0: 29 2e 0a 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4d  )..*/..#define M
08c0: 41 58 28 78 2c 79 29 20 28 28 78 29 3e 28 79 29  AX(x,y) ((x)>(y)
08d0: 3f 28 78 29 3a 28 79 29 29 0a 0a 23 69 66 20 64  ?(x):(y))..#if d
08e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
08f0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
0900: 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69  GEMENT) && !defi
0910: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
0920: 44 49 53 4b 49 4f 29 0a 2f 2a 0a 2a 2a 20 53 65  DISKIO)./*.** Se
0930: 74 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 2d  t the soft heap-
0940: 73 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 74  size limit for t
0950: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
0960: 64 2e 20 50 61 73 73 69 6e 67 20 61 20 6e 65 67  d. Passing a neg
0970: 61 74 69 76 65 0a 2a 2a 20 76 61 6c 75 65 20 69  ative.** value i
0980: 6e 64 69 63 61 74 65 73 20 6e 6f 20 6c 69 6d 69  ndicates no limi
0990: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
09a0: 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
09b0: 69 74 28 69 6e 74 20 6e 29 7b 0a 20 20 73 71 6c  it(int n){.  sql
09c0: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
09d0: 2d 3e 6e 53 6f 66 74 48 65 61 70 4c 69 6d 69 74  ->nSoftHeapLimit
09e0: 20 3d 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52   = n;.  sqlite3R
09f0: 65 6c 65 61 73 65 54 68 72 65 61 64 44 61 74 61  eleaseThreadData
0a00: 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  ();.}../*.** Rel
0a10: 65 61 73 65 20 6d 65 6d 6f 72 79 20 68 65 6c 64  ease memory held
0a20: 20 62 79 20 53 51 4c 69 74 65 20 69 6e 73 74 61   by SQLite insta
0a30: 6e 63 65 73 20 63 72 65 61 74 65 64 20 62 79 20  nces created by 
0a40: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
0a50: 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
0a60: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
0a70: 79 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75  y(int n){.  retu
0a80: 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  rn sqlite3pager_
0a90: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 6e  release_memory(n
0aa0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 49 66  );.}.#else./* If
0ab0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
0ac0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
0ad0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
0ae0: 20 74 68 65 6e 20 64 65 66 69 6e 65 20 61 20 76   then define a v
0af0: 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 73 71 6c  ersion.** of sql
0b00: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
0b10: 6f 72 79 28 29 20 74 6f 20 62 65 20 75 73 65 64  ory() to be used
0b20: 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69   by other code i
0b30: 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20  n this file..** 
0b40: 54 68 69 73 20 69 73 20 64 6f 6e 65 20 66 6f 72  This is done for
0b50: 20 6e 6f 20 62 65 74 74 65 72 20 72 65 61 73 6f   no better reaso
0b60: 6e 20 74 68 61 6e 20 74 6f 20 72 65 64 75 63 65  n than to reduce
0b70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
0b80: 2a 2a 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72  ** pre-processor
0b90: 20 23 69 66 6e 64 65 66 20 73 74 61 74 65 6d 65   #ifndef stateme
0ba0: 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  nts..*/.#define 
0bb0: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
0bc0: 6d 65 6d 6f 72 79 28 78 29 20 30 20 20 20 20 2f  memory(x) 0    /
0bd0: 2a 20 30 20 3d 3d 20 6e 6f 20 6d 65 6d 6f 72 79  * 0 == no memory
0be0: 20 66 72 65 65 64 20 2a 2f 0a 23 65 6e 64 69 66   freed */.#endif
0bf0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0c00: 4d 45 4d 44 45 42 55 47 0a 2f 2a 2d 2d 2d 2d 2d  MEMDEBUG./*-----
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c50: 2d 2d 2d 2d 2d 0a 2a 2a 20 42 65 67 69 6e 20 63  -----.** Begin c
0c60: 6f 64 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 61  ode for memory a
0c70: 6c 6c 6f 63 61 74 69 6f 6e 20 73 79 73 74 65 6d  llocation system
0c80: 20 74 65 73 74 20 6c 61 79 65 72 2e 0a 2a 2a 0a   test layer..**.
0c90: 2a 2a 20 4d 65 6d 6f 72 79 20 64 65 62 75 67 67  ** Memory debugg
0ca0: 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 6e  ing is turned on
0cb0: 20 62 79 20 64 65 66 69 6e 69 6e 67 20 74 68 65   by defining the
0cc0: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
0cd0: 20 6d 61 63 72 6f 2e 0a 2a 2a 0a 2a 2a 20 53 51   macro..**.** SQ
0ce0: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3d 3d 31  LITE_MEMDEBUG==1
0cf0: 20 20 20 20 2d 3e 20 46 65 6e 63 65 2d 70 6f 73      -> Fence-pos
0d00: 74 69 6e 67 20 6f 6e 6c 79 20 28 74 68 72 65 61  ting only (threa
0d10: 64 20 73 61 66 65 29 20 0a 2a 2a 20 53 51 4c 49  d safe) .** SQLI
0d20: 54 45 5f 4d 45 4d 44 45 42 55 47 3d 3d 32 20 20  TE_MEMDEBUG==2  
0d30: 20 20 2d 3e 20 46 65 6e 63 65 2d 70 6f 73 74 69    -> Fence-posti
0d40: 6e 67 20 2b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  ng + linked list
0d50: 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20   of allocations 
0d60: 28 6e 6f 74 20 74 73 29 0a 2a 2a 20 53 51 4c 49  (not ts).** SQLI
0d70: 54 45 5f 4d 45 4d 44 45 42 55 47 3d 3d 33 20 20  TE_MEMDEBUG==3  
0d80: 20 20 2d 3e 20 41 62 6f 76 65 20 2b 20 62 61 63    -> Above + bac
0d90: 6b 74 72 61 63 65 73 20 28 6e 6f 74 20 74 68 72  ktraces (not thr
0da0: 65 61 64 20 73 61 66 65 2c 20 72 65 71 2e 20 67  ead safe, req. g
0db0: 6c 69 62 63 29 0a 2a 2f 0a 0a 2f 2a 20 46 69 67  libc).*/../* Fig
0dc0: 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
0dd0: 6f 72 20 6e 6f 74 20 74 6f 20 73 74 6f 72 65 20  or not to store 
0de0: 62 61 63 6b 74 72 61 63 65 28 29 20 69 6e 66 6f  backtrace() info
0df0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  rmation for each
0e00: 20 6d 61 6c 6c 6f 63 2e 0a 2a 2a 20 54 68 65 20   malloc..** The 
0e10: 62 61 63 6b 74 72 61 63 65 28 29 20 66 75 6e 63  backtrace() func
0e20: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
0e30: 64 20 69 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44  d if SQLITE_MEMD
0e40: 45 42 55 47 20 69 73 20 73 65 74 20 74 6f 20 32  EBUG is set to 2
0e50: 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
0e60: 61 6e 64 20 67 6c 69 62 63 20 69 73 20 69 6e 20  and glibc is in 
0e70: 75 73 65 2e 20 49 66 20 77 65 20 64 6f 6e 27 74  use. If we don't
0e80: 20 77 61 6e 74 20 74 6f 20 75 73 65 20 62 61 63   want to use bac
0e90: 6b 74 72 61 63 65 28 29 2c 20 74 68 65 6e 20 6a  ktrace(), then j
0ea0: 75 73 74 0a 2a 2a 20 64 65 66 69 6e 65 20 69 74  ust.** define it
0eb0: 20 61 73 20 61 6e 20 65 6d 70 74 79 20 6d 61 63   as an empty mac
0ec0: 72 6f 20 61 6e 64 20 73 65 74 20 74 68 65 20 61  ro and set the a
0ed0: 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 72  mount of space r
0ee0: 65 73 65 72 76 65 64 20 74 6f 20 30 2e 0a 2a 2f  eserved to 0..*/
0ef0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47  .#if defined(__G
0f00: 4c 49 42 43 5f 5f 29 20 26 26 20 53 51 4c 49 54  LIBC__) && SQLIT
0f10: 45 5f 4d 45 4d 44 45 42 55 47 3e 32 0a 20 20 65  E_MEMDEBUG>2.  e
0f20: 78 74 65 72 6e 20 69 6e 74 20 62 61 63 6b 74 72  xtern int backtr
0f30: 61 63 65 28 76 6f 69 64 20 2a 2a 2c 20 69 6e 74  ace(void **, int
0f40: 29 3b 0a 20 20 23 64 65 66 69 6e 65 20 54 45 53  );.  #define TES
0f50: 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 53 49 5a 45  TALLOC_STACKSIZE
0f60: 20 31 32 38 0a 20 20 23 64 65 66 69 6e 65 20 54   128.  #define T
0f70: 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 46 52  ESTALLOC_STACKFR
0f80: 41 4d 45 53 20 28 28 54 45 53 54 41 4c 4c 4f 43  AMES ((TESTALLOC
0f90: 5f 53 54 41 43 4b 53 49 5a 45 2d 38 29 2f 73 69  _STACKSIZE-8)/si
0fa0: 7a 65 6f 66 28 76 6f 69 64 2a 29 29 0a 23 65 6c  zeof(void*)).#el
0fb0: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 62 61 63  se.  #define bac
0fc0: 6b 74 72 61 63 65 28 78 2c 20 79 29 0a 20 20 23  ktrace(x, y).  #
0fd0: 64 65 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43  define TESTALLOC
0fe0: 5f 53 54 41 43 4b 53 49 5a 45 20 30 0a 20 20 23  _STACKSIZE 0.  #
0ff0: 64 65 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43  define TESTALLOC
1000: 5f 53 54 41 43 4b 46 52 41 4d 45 53 20 30 0a 23  _STACKFRAMES 0.#
1010: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d  endif../*.** Num
1020: 62 65 72 20 6f 66 20 33 32 2d 62 69 74 20 67 75  ber of 32-bit gu
1030: 61 72 64 20 77 6f 72 64 73 2e 20 20 54 68 69 73  ard words.  This
1040: 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
1050: 20 62 65 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f   be a multiple o
1060: 66 0a 2a 2a 20 32 20 73 69 6e 63 65 20 6f 6e 20  f.** 2 since on 
1070: 36 34 2d 62 69 74 20 6d 61 63 68 69 6e 65 73 20  64-bit machines 
1080: 77 65 20 77 61 6e 74 20 74 68 65 20 76 61 6c 75  we want the valu
1090: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
10a0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2a 20  liteMalloc().** 
10b0: 74 6f 20 62 65 20 38 2d 62 79 74 65 20 61 6c 69  to be 8-byte ali
10c0: 67 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gned..*/.#ifndef
10d0: 20 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52   TESTALLOC_NGUAR
10e0: 44 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54 41  D.# define TESTA
10f0: 4c 4c 4f 43 5f 4e 47 55 41 52 44 20 32 0a 23 65  LLOC_NGUARD 2.#e
1100: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 69 7a 65  ndif../*.** Size
1110: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 73 74   reserved for st
1120: 6f 72 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 20  oring file-name 
1130: 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
1140: 6d 61 6c 6c 6f 63 28 29 65 64 20 62 6c 6f 62 2e  malloc()ed blob.
1150: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 53 54  .*/.#define TEST
1160: 41 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a 45 20 36  ALLOC_FILESIZE 6
1170: 34 0a 0a 2f 2a 0a 2a 2a 20 53 69 7a 65 20 72 65  4../*.** Size re
1180: 73 65 72 76 65 64 20 66 6f 72 20 73 74 6f 72 69  served for stori
1190: 6e 67 20 74 68 65 20 75 73 65 72 20 73 74 72 69  ng the user stri
11a0: 6e 67 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  ng. Each time a 
11b0: 4d 61 6c 6c 6f 63 28 29 20 6f 72 20 52 65 61 6c  Malloc() or Real
11c0: 6c 6f 63 28 29 0a 2a 2a 20 63 61 6c 6c 20 73 75  loc().** call su
11d0: 63 63 65 65 64 73 2c 20 75 70 20 74 6f 20 54 45  cceeds, up to TE
11e0: 53 54 41 4c 4c 4f 43 5f 55 53 45 52 53 49 5a 45  STALLOC_USERSIZE
11f0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 74   bytes of the st
1200: 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20  ring pointed to 
1210: 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  by.** sqlite3_ma
1220: 6c 6c 6f 63 5f 69 64 20 61 72 65 20 73 74 6f 72  lloc_id are stor
1230: 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
1240: 65 20 6f 74 68 65 72 20 74 65 73 74 20 73 79 73  e other test sys
1250: 74 65 6d 20 6d 65 74 61 64 61 74 61 2e 0a 2a 2f  tem metadata..*/
1260: 0a 23 64 65 66 69 6e 65 20 54 45 53 54 41 4c 4c  .#define TESTALL
1270: 4f 43 5f 55 53 45 52 53 49 5a 45 20 36 34 0a 63  OC_USERSIZE 64.c
1280: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1290: 65 33 5f 6d 61 6c 6c 6f 63 5f 69 64 20 3d 20 30  e3_malloc_id = 0
12a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 42 6c 6f 63 6b 73 20  ;../*.** Blocks 
12b0: 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74  used by the test
12c0: 20 6c 61 79 65 72 20 68 61 76 65 20 74 68 65 20   layer have the 
12d0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74  following format
12e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 3c  :.**.**        <
12f0: 73 69 7a 65 6f 66 28 76 6f 69 64 20 2a 29 20 70  sizeof(void *) p
1300: 4e 65 78 74 20 70 6f 69 6e 74 65 72 3e 0a 2a 2a  Next pointer>.**
1310: 20 20 20 20 20 20 20 20 3c 73 69 7a 65 6f 66 28          <sizeof(
1320: 76 6f 69 64 20 2a 29 20 70 50 72 65 76 20 70 6f  void *) pPrev po
1330: 69 6e 74 65 72 3e 0a 2a 2a 20 20 20 20 20 20 20  inter>.**       
1340: 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41   <TESTALLOC_NGUA
1350: 52 44 20 33 32 2d 62 69 74 20 67 75 61 72 64 20  RD 32-bit guard 
1360: 77 6f 72 64 73 3e 0a 2a 2a 20 20 20 20 20 20 20  words>.**       
1370: 20 20 20 20 20 3c 54 68 65 20 61 70 70 6c 69 63       <The applic
1380: 61 74 69 6f 6e 20 6c 65 76 65 6c 20 61 6c 6c 6f  ation level allo
1390: 63 61 74 69 6f 6e 3e 0a 2a 2a 20 20 20 20 20 20  cation>.**      
13a0: 20 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55    <TESTALLOC_NGU
13b0: 41 52 44 20 33 32 2d 62 69 74 20 67 75 61 72 64  ARD 32-bit guard
13c0: 20 77 6f 72 64 73 3e 0a 2a 2a 20 20 20 20 20 20   words>.**      
13d0: 20 20 3c 33 32 2d 62 69 74 20 6c 69 6e 65 20 6e    <32-bit line n
13e0: 75 6d 62 65 72 3e 0a 2a 2a 20 20 20 20 20 20 20  umber>.**       
13f0: 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 46 49 4c 45   <TESTALLOC_FILE
1400: 53 49 5a 45 20 62 79 74 65 73 20 63 6f 6e 74 61  SIZE bytes conta
1410: 69 6e 69 6e 67 20 6e 75 6c 6c 2d 74 65 72 6d 69  ining null-termi
1420: 6e 61 74 65 64 20 66 69 6c 65 20 6e 61 6d 65 3e  nated file name>
1430: 0a 2a 2a 20 20 20 20 20 20 20 20 3c 54 45 53 54  .**        <TEST
1440: 41 4c 4c 4f 43 5f 53 54 41 43 4b 53 49 5a 45 20  ALLOC_STACKSIZE 
1450: 62 79 74 65 73 20 6f 66 20 62 61 63 6b 74 72 61  bytes of backtra
1460: 63 65 28 29 20 6f 75 74 70 75 74 3e 0a 2a 2f 20  ce() output>.*/ 
1470: 0a 0a 23 64 65 66 69 6e 65 20 54 45 53 54 41 4c  ..#define TESTAL
1480: 4c 4f 43 5f 4f 46 46 53 45 54 5f 47 55 41 52 44  LOC_OFFSET_GUARD
1490: 31 28 70 29 20 20 20 20 28 73 69 7a 65 6f 66 28  1(p)    (sizeof(
14a0: 76 6f 69 64 20 2a 29 20 2a 20 32 29 0a 23 64 65  void *) * 2).#de
14b0: 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43 5f 4f  fine TESTALLOC_O
14c0: 46 46 53 45 54 5f 44 41 54 41 28 70 29 20 28 20  FFSET_DATA(p) ( 
14d0: 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 46  \.  TESTALLOC_OF
14e0: 46 53 45 54 5f 47 55 41 52 44 31 28 70 29 20 2b  FSET_GUARD1(p) +
14f0: 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2a 20 54   sizeof(u32) * T
1500: 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 20  ESTALLOC_NGUARD 
1510: 5c 0a 29 0a 23 64 65 66 69 6e 65 20 54 45 53 54  \.).#define TEST
1520: 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 47 55 41  ALLOC_OFFSET_GUA
1530: 52 44 32 28 70 29 20 28 20 5c 0a 20 20 54 45 53  RD2(p) ( \.  TES
1540: 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 44 41  TALLOC_OFFSET_DA
1550: 54 41 28 70 29 20 2b 20 73 71 6c 69 74 65 33 4f  TA(p) + sqlite3O
1560: 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 28  sAllocationSize(
1570: 70 29 20 2d 20 54 45 53 54 41 4c 4c 4f 43 5f 4f  p) - TESTALLOC_O
1580: 56 45 52 48 45 41 44 20 5c 0a 29 0a 23 64 65 66  VERHEAD \.).#def
1590: 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 46  ine TESTALLOC_OF
15a0: 46 53 45 54 5f 4c 49 4e 45 4e 55 4d 42 45 52 28  FSET_LINENUMBER(
15b0: 70 29 20 28 20 5c 0a 20 20 54 45 53 54 41 4c 4c  p) ( \.  TESTALL
15c0: 4f 43 5f 4f 46 46 53 45 54 5f 47 55 41 52 44 32  OC_OFFSET_GUARD2
15d0: 28 70 29 20 2b 20 73 69 7a 65 6f 66 28 75 33 32  (p) + sizeof(u32
15e0: 29 20 2a 20 54 45 53 54 41 4c 4c 4f 43 5f 4e 47  ) * TESTALLOC_NG
15f0: 55 41 52 44 20 5c 0a 29 0a 23 64 65 66 69 6e 65  UARD \.).#define
1600: 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45   TESTALLOC_OFFSE
1610: 54 5f 46 49 4c 45 4e 41 4d 45 28 70 29 20 28 20  T_FILENAME(p) ( 
1620: 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 46  \.  TESTALLOC_OF
1630: 46 53 45 54 5f 4c 49 4e 45 4e 55 4d 42 45 52 28  FSET_LINENUMBER(
1640: 70 29 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29  p) + sizeof(u32)
1650: 20 5c 0a 29 0a 23 64 65 66 69 6e 65 20 54 45 53   \.).#define TES
1660: 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 55 53  TALLOC_OFFSET_US
1670: 45 52 28 70 29 20 28 20 5c 0a 20 20 54 45 53 54  ER(p) ( \.  TEST
1680: 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 46 49 4c  ALLOC_OFFSET_FIL
1690: 45 4e 41 4d 45 28 70 29 20 2b 20 54 45 53 54 41  ENAME(p) + TESTA
16a0: 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a 45 20 5c 0a  LLOC_FILESIZE \.
16b0: 29 0a 23 64 65 66 69 6e 65 20 54 45 53 54 41 4c  ).#define TESTAL
16c0: 4c 4f 43 5f 4f 46 46 53 45 54 5f 53 54 41 43 4b  LOC_OFFSET_STACK
16d0: 28 70 29 20 28 20 5c 0a 20 20 54 45 53 54 41 4c  (p) ( \.  TESTAL
16e0: 4c 4f 43 5f 4f 46 46 53 45 54 5f 55 53 45 52 28  LOC_OFFSET_USER(
16f0: 70 29 20 2b 20 54 45 53 54 41 4c 4c 4f 43 5f 55  p) + TESTALLOC_U
1700: 53 45 52 53 49 5a 45 20 2b 20 38 20 2d 20 5c 0a  SERSIZE + 8 - \.
1710: 20 20 28 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46    (TESTALLOC_OFF
1720: 53 45 54 5f 55 53 45 52 28 70 29 20 25 20 38 29  SET_USER(p) % 8)
1730: 20 5c 0a 29 0a 0a 23 64 65 66 69 6e 65 20 54 45   \.)..#define TE
1740: 53 54 41 4c 4c 4f 43 5f 4f 56 45 52 48 45 41 44  STALLOC_OVERHEAD
1750: 20 28 20 5c 0a 20 20 73 69 7a 65 6f 66 28 76 6f   ( \.  sizeof(vo
1760: 69 64 20 2a 29 2a 32 20 2b 20 20 20 20 20 20 20  id *)*2 +       
1770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1780: 50 72 65 76 20 61 6e 64 20 70 4e 65 78 74 20 70  Prev and pNext p
1790: 6f 69 6e 74 65 72 73 20 2a 2f 20 20 20 5c 0a 20  ointers */   \. 
17a0: 20 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52   TESTALLOC_NGUAR
17b0: 44 2a 73 69 7a 65 6f 66 28 75 33 32 29 2a 32 20  D*sizeof(u32)*2 
17c0: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
17d0: 2a 20 47 75 61 72 64 20 77 6f 72 64 73 20 2a 2f  * Guard words */
17e0: 20 20 20 20 20 20 20 5c 0a 20 20 73 69 7a 65 6f         \.  sizeo
17f0: 66 28 75 33 32 29 20 2b 20 54 45 53 54 41 4c 4c  f(u32) + TESTALL
1800: 4f 43 5f 46 49 4c 45 53 49 5a 45 20 2b 20 20 20  OC_FILESIZE +   
1810: 2f 2a 20 46 69 6c 65 20 61 6e 64 20 6c 69 6e 65  /* File and line
1820: 20 6e 75 6d 62 65 72 20 2a 2f 20 20 20 20 20 20   number */      
1830: 20 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43 5f 55   \.  TESTALLOC_U
1840: 53 45 52 53 49 5a 45 20 2b 20 20 20 20 20 20 20  SERSIZE +       
1850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1860: 72 20 73 74 72 69 6e 67 20 2a 2f 20 20 20 20 20  r string */     
1870: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 54             \.  T
1880: 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 53 49  ESTALLOC_STACKSI
1890: 5a 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ZE              
18a0: 20 20 20 20 2f 2a 20 62 61 63 6b 74 72 61 63 65      /* backtrace
18b0: 28 29 20 73 74 61 63 6b 20 2a 2f 20 20 20 20 20  () stack */     
18c0: 20 20 20 20 20 5c 0a 29 0a 0a 0a 2f 2a 0a 2a 2a       \.).../*.**
18d0: 20 46 6f 72 20 6b 65 65 70 69 6e 67 20 74 72 61   For keeping tra
18e0: 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  ck of the number
18f0: 20 6f 66 20 6d 61 6c 6c 6f 63 73 20 61 6e 64 20   of mallocs and 
1900: 66 72 65 65 73 2e 20 20 20 54 68 69 73 0a 2a 2a  frees.   This.**
1910: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
1920: 6b 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6c 65 61  k for memory lea
1930: 6b 73 2e 20 20 54 68 65 20 69 4d 61 6c 6c 6f 63  ks.  The iMalloc
1940: 46 61 69 6c 20 61 6e 64 20 69 4d 61 6c 6c 6f 63  Fail and iMalloc
1950: 52 65 73 65 74 0a 2a 2a 20 76 61 6c 75 65 73 20  Reset.** values 
1960: 61 72 65 20 75 73 65 64 20 74 6f 20 73 69 6d 75  are used to simu
1970: 6c 61 74 65 20 6d 61 6c 6c 6f 63 28 29 20 66 61  late malloc() fa
1980: 69 6c 75 72 65 73 20 64 75 72 69 6e 67 20 74 65  ilures during te
1990: 73 74 69 6e 67 20 69 6e 20 0a 2a 2a 20 6f 72 64  sting in .** ord
19a0: 65 72 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  er to verify tha
19b0: 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f  t the library co
19c0: 72 72 65 63 74 6c 79 20 68 61 6e 64 6c 65 73 20  rrectly handles 
19d0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
19e0: 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 2a  .** condition..*
19f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e 4d  /.int sqlite3_nM
1a00: 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f  alloc;         /
1a10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69  * Number of sqli
1a20: 74 65 4d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 73  teMalloc() calls
1a30: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
1a40: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
1a50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 71   /* Number of sq
1a60: 6c 69 74 65 46 72 65 65 28 29 20 63 61 6c 6c 73  liteFree() calls
1a70: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
1a80: 6d 65 6d 55 73 65 64 3b 20 20 20 20 20 20 20 20  memUsed;        
1a90: 20 2f 2a 20 54 4f 44 4f 20 54 6f 74 61 6c 20 6d   /* TODO Total m
1aa0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1ab0: 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 69 6e  rom malloc */.in
1ac0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 4d 61 78  t sqlite3_memMax
1ad0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4f  ;          /* TO
1ae0: 44 4f 20 4d 65 6d 20 75 73 61 67 65 20 68 69 67  DO Mem usage hig
1af0: 68 2d 77 61 74 65 72 20 6d 61 72 6b 20 2a 2f 0a  h-water mark */.
1b00: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c  int sqlite3_iMal
1b10: 6c 6f 63 46 61 69 6c 3b 20 20 20 20 20 2f 2a 20  locFail;     /* 
1b20: 46 61 69 6c 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Fail sqliteMallo
1b30: 63 28 29 20 61 66 74 65 72 20 74 68 69 73 20 6d  c() after this m
1b40: 61 6e 79 20 63 61 6c 6c 73 20 2a 2f 0a 69 6e 74  any calls */.int
1b50: 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
1b60: 52 65 73 65 74 20 3d 20 2d 31 3b 20 2f 2a 20 57  Reset = -1; /* W
1b70: 68 65 6e 20 69 4d 61 6c 6c 6f 63 46 61 69 6c 20  hen iMallocFail 
1b80: 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
1b90: 6f 20 74 68 69 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  o this */../*.**
1ba0: 20 43 68 65 63 6b 20 66 6f 72 20 61 20 73 69 6d   Check for a sim
1bb0: 75 6c 61 74 65 64 20 6d 65 6d 6f 72 79 20 61 6c  ulated memory al
1bc0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
1bd0: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
1be0: 66 0a 2a 2a 20 74 68 65 20 66 61 69 6c 75 72 65  f.** the failure
1bf0: 20 73 68 6f 75 6c 64 20 62 65 20 73 69 6d 75 6c   should be simul
1c00: 61 74 65 64 2e 20 20 52 65 74 75 72 6e 20 66 61  ated.  Return fa
1c10: 6c 73 65 20 74 6f 20 70 72 6f 63 65 65 64 20 61  lse to proceed a
1c20: 73 20 6e 6f 72 6d 61 6c 2e 0a 2a 2f 0a 73 74 61  s normal..*/.sta
1c30: 74 69 63 20 69 6e 74 20 66 61 69 6c 4d 61 6c 6c  tic int failMall
1c40: 6f 63 28 29 7b 0a 20 20 54 68 72 65 61 64 44 61  oc(){.  ThreadDa
1c50: 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
1c60: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
1c70: 20 20 69 66 28 20 70 54 73 64 2d 3e 69 73 46 61    if( pTsd->isFa
1c80: 69 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  il ){.    return
1c90: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
1ca0: 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
1cb0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l>=0 ){.    sqli
1cc0: 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2d  te3_iMallocFail-
1cd0: 2d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  -;.    if( sqlit
1ce0: 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3d 3d  e3_iMallocFail==
1cf0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1d00: 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d  e3_iMallocFail =
1d10: 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
1d20: 52 65 73 65 74 3b 0a 20 20 20 20 20 20 70 54 73  Reset;.      pTs
1d30: 64 2d 3e 69 73 46 61 69 6c 20 3d 20 31 3b 0a 20  d->isFail = 1;. 
1d40: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1d50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d60: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
1d70: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  e argument is a 
1d80: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1d90: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c   by sqlite3OsMal
1da0: 6c 6f 63 28 29 20 6f 72 20 78 52 65 61 6c 6c 6f  loc() or xReallo
1db0: 63 28 29 2e 0a 2a 2a 20 61 73 73 65 72 74 28 29  c()..** assert()
1dc0: 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1dd0: 61 6e 64 20 6c 61 73 74 20 28 54 45 53 54 41 4c  and last (TESTAL
1de0: 4c 4f 43 5f 4e 47 55 41 52 44 2a 34 29 20 62 79  LOC_NGUARD*4) by
1df0: 74 65 73 20 61 72 65 20 73 65 74 20 74 6f 20 74  tes are set to t
1e00: 68 65 0a 2a 2a 20 76 61 6c 75 65 73 20 73 65 74  he.** values set
1e10: 20 62 79 20 74 68 65 20 61 70 70 6c 79 47 75 61   by the applyGua
1e20: 72 64 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  rds() function..
1e30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1e40: 68 65 63 6b 47 75 61 72 64 73 28 75 33 32 20 2a  heckGuards(u32 *
1e50: 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p).{.  int i;.  
1e60: 63 68 61 72 20 2a 7a 41 6c 6c 6f 63 20 3d 20 28  char *zAlloc = (
1e70: 63 68 61 72 20 2a 29 70 3b 0a 20 20 63 68 61 72  char *)p;.  char
1e80: 20 2a 7a 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74   *z;..  /* First
1e90: 20 73 65 74 20 6f 66 20 67 75 61 72 64 20 77 6f   set of guard wo
1ea0: 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41  rds */.  z = &zA
1eb0: 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f  lloc[TESTALLOC_O
1ec0: 46 46 53 45 54 5f 47 55 41 52 44 31 28 70 29 5d  FFSET_GUARD1(p)]
1ed0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54  ;.  for(i=0; i<T
1ee0: 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 3b  ESTALLOC_NGUARD;
1ef0: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
1f00: 74 28 28 28 75 33 32 20 2a 29 7a 29 5b 69 5d 3d  t(((u32 *)z)[i]=
1f10: 3d 30 78 64 65 61 64 31 31 32 32 29 3b 0a 20 20  =0xdead1122);.  
1f20: 7d 0a 0a 20 20 2f 2a 20 53 65 63 6f 6e 64 20 73  }..  /* Second s
1f30: 65 74 20 6f 66 20 67 75 61 72 64 20 77 6f 72 64  et of guard word
1f40: 73 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41 6c 6c  s */.  z = &zAll
1f50: 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46  oc[TESTALLOC_OFF
1f60: 53 45 54 5f 47 55 41 52 44 32 28 70 29 5d 3b 0a  SET_GUARD2(p)];.
1f70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53    for(i=0; i<TES
1f80: 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 3b 20 69  TALLOC_NGUARD; i
1f90: 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20 67 75 61  ++){.    u32 gua
1fa0: 72 64 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63  rd = 0;.    memc
1fb0: 70 79 28 26 67 75 61 72 64 2c 20 26 7a 5b 69 2a  py(&guard, &z[i*
1fc0: 73 69 7a 65 6f 66 28 75 33 32 29 5d 2c 20 73 69  sizeof(u32)], si
1fd0: 7a 65 6f 66 28 75 33 32 29 29 3b 0a 20 20 20 20  zeof(u32));.    
1fe0: 61 73 73 65 72 74 28 67 75 61 72 64 3d 3d 30 78  assert(guard==0x
1ff0: 64 65 61 64 33 33 34 34 29 3b 0a 20 20 7d 0a 7d  dead3344);.  }.}
2000: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
2010: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
2020: 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  r returned by sq
2030: 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 29 20  lite3OsMalloc() 
2040: 6f 72 20 52 65 61 6c 6c 6f 63 28 29 2e 20 54 68  or Realloc(). Th
2050: 65 0a 2a 2a 20 66 69 72 73 74 20 61 6e 64 20 6c  e.** first and l
2060: 61 73 74 20 28 54 45 53 54 41 4c 4c 4f 43 5f 4e  ast (TESTALLOC_N
2070: 47 55 41 52 44 2a 34 29 20 62 79 74 65 73 20 61  GUARD*4) bytes a
2080: 72 65 20 73 65 74 20 74 6f 20 6b 6e 6f 77 6e 20  re set to known 
2090: 76 61 6c 75 65 73 20 66 6f 72 20 75 73 65 20 61  values for use a
20a0: 73 20 0a 2a 2a 20 67 75 61 72 64 2d 70 6f 73 74  s .** guard-post
20b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
20c0: 64 20 61 70 70 6c 79 47 75 61 72 64 73 28 75 33  d applyGuards(u3
20d0: 32 20 2a 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  2 *p).{.  int i;
20e0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68  .  char *z;.  ch
20f0: 61 72 20 2a 7a 41 6c 6c 6f 63 20 3d 20 28 63 68  ar *zAlloc = (ch
2100: 61 72 20 2a 29 70 3b 0a 0a 20 20 2f 2a 20 46 69  ar *)p;..  /* Fi
2110: 72 73 74 20 73 65 74 20 6f 66 20 67 75 61 72 64  rst set of guard
2120: 20 77 6f 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20   words */.  z = 
2130: 26 7a 41 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f  &zAlloc[TESTALLO
2140: 43 5f 4f 46 46 53 45 54 5f 47 55 41 52 44 31 28  C_OFFSET_GUARD1(
2150: 70 29 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  p)];.  for(i=0; 
2160: 69 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41  i<TESTALLOC_NGUA
2170: 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 28 28  RD; i++){.    ((
2180: 75 33 32 20 2a 29 7a 29 5b 69 5d 20 3d 20 30 78  u32 *)z)[i] = 0x
2190: 64 65 61 64 31 31 32 32 3b 0a 20 20 7d 0a 0a 20  dead1122;.  }.. 
21a0: 20 2f 2a 20 53 65 63 6f 6e 64 20 73 65 74 20 6f   /* Second set o
21b0: 66 20 67 75 61 72 64 20 77 6f 72 64 73 20 2a 2f  f guard words */
21c0: 0a 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54  .  z = &zAlloc[T
21d0: 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f  ESTALLOC_OFFSET_
21e0: 47 55 41 52 44 32 28 70 29 5d 3b 0a 20 20 66 6f  GUARD2(p)];.  fo
21f0: 72 28 69 3d 30 3b 20 69 3c 54 45 53 54 41 4c 4c  r(i=0; i<TESTALL
2200: 4f 43 5f 4e 47 55 41 52 44 3b 20 69 2b 2b 29 7b  OC_NGUARD; i++){
2210: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
2220: 74 20 69 6e 74 20 67 75 61 72 64 20 3d 20 30 78  t int guard = 0x
2230: 64 65 61 64 33 33 34 34 3b 0a 20 20 20 20 6d 65  dead3344;.    me
2240: 6d 63 70 79 28 26 7a 5b 69 2a 73 69 7a 65 6f 66  mcpy(&z[i*sizeof
2250: 28 75 33 32 29 5d 2c 20 26 67 75 61 72 64 2c 20  (u32)], &guard, 
2260: 73 69 7a 65 6f 66 28 75 33 32 29 29 3b 0a 20 20  sizeof(u32));.  
2270: 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d  }..  /* Line num
2280: 62 65 72 20 2a 2f 0a 20 20 7a 20 3d 20 26 28 28  ber */.  z = &((
2290: 63 68 61 72 20 2a 29 7a 29 5b 54 45 53 54 41 4c  char *)z)[TESTAL
22a0: 4c 4f 43 5f 4e 47 55 41 52 44 2a 73 69 7a 65 6f  LOC_NGUARD*sizeo
22b0: 66 28 75 33 32 29 5d 3b 20 20 20 20 20 20 20 20  f(u32)];        
22c0: 20 20 20 20 20 2f 2a 20 47 75 61 72 64 20 77 6f       /* Guard wo
22d0: 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41  rds */.  z = &zA
22e0: 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f  lloc[TESTALLOC_O
22f0: 46 46 53 45 54 5f 4c 49 4e 45 4e 55 4d 42 45 52  FFSET_LINENUMBER
2300: 28 70 29 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  (p)];.  memcpy(z
2310: 2c 20 26 73 71 6c 69 74 65 33 54 68 72 65 61 64  , &sqlite3Thread
2320: 44 61 74 61 28 29 2d 3e 69 4c 69 6e 65 2c 20 73  Data()->iLine, s
2330: 69 7a 65 6f 66 28 75 33 32 29 29 3b 0a 0a 20 20  izeof(u32));..  
2340: 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  /* File name */.
2350: 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45    z = &zAlloc[TE
2360: 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 46  STALLOC_OFFSET_F
2370: 49 4c 45 4e 41 4d 45 28 70 29 5d 3b 0a 20 20 73  ILENAME(p)];.  s
2380: 74 72 6e 63 70 79 28 7a 2c 20 73 71 6c 69 74 65  trncpy(z, sqlite
2390: 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 7a  3ThreadData()->z
23a0: 46 69 6c 65 2c 20 54 45 53 54 41 4c 4c 4f 43 5f  File, TESTALLOC_
23b0: 46 49 4c 45 53 49 5a 45 29 3b 0a 20 20 7a 5b 54  FILESIZE);.  z[T
23c0: 45 53 54 41 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a  ESTALLOC_FILESIZ
23d0: 45 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a 0a  E - 1] = '\0';..
23e0: 20 20 2f 2a 20 55 73 65 72 20 73 74 72 69 6e 67    /* User string
23f0: 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f   */.  z = &zAllo
2400: 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53  c[TESTALLOC_OFFS
2410: 45 54 5f 55 53 45 52 28 70 29 5d 3b 0a 20 20 7a  ET_USER(p)];.  z
2420: 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  [0] = 0;.  if( s
2430: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 69 64  qlite3_malloc_id
2440: 20 29 7b 0a 20 20 20 20 73 74 72 6e 63 70 79 28   ){.    strncpy(
2450: 7a 2c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  z, sqlite3_mallo
2460: 63 5f 69 64 2c 20 54 45 53 54 41 4c 4c 4f 43 5f  c_id, TESTALLOC_
2470: 55 53 45 52 53 49 5a 45 29 3b 0a 20 20 20 20 7a  USERSIZE);.    z
2480: 5b 54 45 53 54 41 4c 4c 4f 43 5f 55 53 45 52 53  [TESTALLOC_USERS
2490: 49 5a 45 2d 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a  IZE-1] = 0;.  }.
24a0: 0a 20 20 2f 2a 20 62 61 63 6b 74 72 61 63 65 28  .  /* backtrace(
24b0: 29 20 73 74 61 63 6b 20 2a 2f 0a 20 20 7a 20 3d  ) stack */.  z =
24c0: 20 26 7a 41 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c   &zAlloc[TESTALL
24d0: 4f 43 5f 4f 46 46 53 45 54 5f 53 54 41 43 4b 28  OC_OFFSET_STACK(
24e0: 70 29 5d 3b 0a 20 20 62 61 63 6b 74 72 61 63 65  p)];.  backtrace
24f0: 28 28 76 6f 69 64 20 2a 2a 29 7a 2c 20 54 45 53  ((void **)z, TES
2500: 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 46 52 41 4d  TALLOC_STACKFRAM
2510: 45 53 29 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  ES);..  /* Sanit
2520: 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  y check to make 
2530: 73 75 72 65 20 63 68 65 63 6b 47 75 61 72 64 73  sure checkGuards
2540: 28 29 20 69 73 20 77 6f 72 6b 69 6e 67 20 2a 2f  () is working */
2550: 0a 20 20 63 68 65 63 6b 47 75 61 72 64 73 28 70  .  checkGuards(p
2560: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
2570: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 6d 61  argument is a ma
2580: 6c 6c 6f 63 28 29 65 64 20 70 6f 69 6e 74 65 72  lloc()ed pointer
2590: 20 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   as returned by 
25a0: 74 68 65 20 74 65 73 74 2d 77 72 61 70 70 65 72  the test-wrapper
25b0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ..** Return a po
25c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 73 20  inter to the Os 
25d0: 6c 65 76 65 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e  level allocation
25e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25f0: 20 2a 67 65 74 4f 73 50 6f 69 6e 74 65 72 28 76   *getOsPointer(v
2600: 6f 69 64 20 2a 70 29 0a 7b 0a 20 20 63 68 61 72  oid *p).{.  char
2610: 20 2a 7a 20 3d 20 28 63 68 61 72 20 2a 29 70 3b   *z = (char *)p;
2620: 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20  .  return (void 
2630: 2a 29 28 26 7a 5b 2d 31 20 2a 20 54 45 53 54 41  *)(&z[-1 * TESTA
2640: 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 44 41 54 41  LLOC_OFFSET_DATA
2650: 28 70 29 5d 29 3b 0a 7d 0a 0a 0a 23 69 66 20 53  (p)]);.}...#if S
2660: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3e 31  QLITE_MEMDEBUG>1
2670: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
2680: 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ent points to an
2690: 20 4f 73 20 6c 65 76 65 6c 20 61 6c 6c 6f 63 61   Os level alloca
26a0: 74 69 6f 6e 2e 20 4c 69 6e 6b 20 69 74 20 69 6e  tion. Link it in
26b0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 73 20 6c  to the threads l
26c0: 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 63 61  ist.** of alloca
26d0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tions..*/.static
26e0: 20 76 6f 69 64 20 6c 69 6e 6b 41 6c 6c 6f 63 28   void linkAlloc(
26f0: 76 6f 69 64 20 2a 70 29 7b 0a 20 20 54 68 72 65  void *p){.  Thre
2700: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
2710: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
2720: 28 29 3b 0a 20 20 76 6f 69 64 20 2a 2a 70 70 20  ();.  void **pp 
2730: 3d 20 28 76 6f 69 64 20 2a 2a 29 70 3b 0a 20 20  = (void **)p;.  
2740: 70 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 70 5b  pp[0] = 0;.  pp[
2750: 31 5d 20 3d 20 70 54 73 64 2d 3e 70 46 69 72 73  1] = pTsd->pFirs
2760: 74 3b 0a 20 20 69 66 28 20 70 54 73 64 2d 3e 70  t;.  if( pTsd->p
2770: 46 69 72 73 74 20 29 7b 0a 20 20 20 20 28 28 76  First ){.    ((v
2780: 6f 69 64 20 2a 2a 29 70 54 73 64 2d 3e 70 46 69  oid **)pTsd->pFi
2790: 72 73 74 29 5b 30 5d 20 3d 20 70 3b 0a 20 20 7d  rst)[0] = p;.  }
27a0: 0a 20 20 70 54 73 64 2d 3e 70 46 69 72 73 74 20  .  pTsd->pFirst 
27b0: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = p;.}../*.** Th
27c0: 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74  e argument point
27d0: 73 20 74 6f 20 61 6e 20 4f 73 20 6c 65 76 65 6c  s to an Os level
27e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 55 6e 6c   allocation. Unl
27f0: 69 6e 6b 65 20 69 74 20 66 72 6f 6d 20 74 68 65  inke it from the
2800: 20 74 68 72 65 61 64 73 0a 2a 2a 20 6c 69 73 74   threads.** list
2810: 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e   of allocations.
2820: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2830: 75 6e 6c 69 6e 6b 41 6c 6c 6f 63 28 76 6f 69 64  unlinkAlloc(void
2840: 20 2a 70 29 0a 7b 0a 20 20 54 68 72 65 61 64 44   *p).{.  ThreadD
2850: 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69  ata *pTsd = sqli
2860: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b  te3ThreadData();
2870: 0a 20 20 76 6f 69 64 20 2a 2a 70 70 20 3d 20 28  .  void **pp = (
2880: 76 6f 69 64 20 2a 2a 29 70 3b 0a 20 20 69 66 28  void **)p;.  if(
2890: 20 70 3d 3d 70 54 73 64 2d 3e 70 46 69 72 73 74   p==pTsd->pFirst
28a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 21   ){.    assert(!
28b0: 70 70 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65  pp[0]);.    asse
28c0: 72 74 28 21 70 70 5b 31 5d 20 7c 7c 20 28 28 76  rt(!pp[1] || ((v
28d0: 6f 69 64 20 2a 2a 29 28 70 70 5b 31 5d 29 29 5b  oid **)(pp[1]))[
28e0: 30 5d 3d 3d 70 29 3b 0a 20 20 20 20 70 54 73 64  0]==p);.    pTsd
28f0: 2d 3e 70 46 69 72 73 74 20 3d 20 70 70 5b 31 5d  ->pFirst = pp[1]
2900: 3b 0a 20 20 20 20 69 66 28 20 70 54 73 64 2d 3e  ;.    if( pTsd->
2910: 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  pFirst ){.      
2920: 28 28 76 6f 69 64 20 2a 2a 29 70 54 73 64 2d 3e  ((void **)pTsd->
2930: 70 46 69 72 73 74 29 5b 30 5d 20 3d 20 30 3b 0a  pFirst)[0] = 0;.
2940: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2950: 20 20 20 76 6f 69 64 20 2a 2a 70 70 72 65 76 20     void **pprev 
2960: 3d 20 70 70 5b 30 5d 3b 0a 20 20 20 20 76 6f 69  = pp[0];.    voi
2970: 64 20 2a 2a 70 6e 65 78 74 20 3d 20 70 70 5b 31  d **pnext = pp[1
2980: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 70  ];.    assert(pp
2990: 72 65 76 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rev);.    assert
29a0: 28 70 70 72 65 76 5b 31 5d 3d 3d 70 29 3b 0a 20  (pprev[1]==p);. 
29b0: 20 20 20 70 70 72 65 76 5b 31 5d 20 3d 20 28 76     pprev[1] = (v
29c0: 6f 69 64 20 2a 29 70 6e 65 78 74 3b 0a 20 20 20  oid *)pnext;.   
29d0: 20 69 66 28 20 70 6e 65 78 74 20 29 7b 0a 20 20   if( pnext ){.  
29e0: 20 20 20 20 61 73 73 65 72 74 28 70 6e 65 78 74      assert(pnext
29f0: 5b 30 5d 3d 3d 70 29 3b 0a 20 20 20 20 20 20 70  [0]==p);.      p
2a00: 6e 65 78 74 5b 30 5d 20 3d 20 28 76 6f 69 64 20  next[0] = (void 
2a10: 2a 29 70 70 72 65 76 3b 0a 20 20 20 20 7d 0a 20  *)pprev;.    }. 
2a20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 69 6e   }.}../*.** Poin
2a30: 74 65 72 20 70 20 69 73 20 61 20 70 6f 69 6e 74  ter p is a point
2a40: 65 72 20 74 6f 20 61 6e 20 4f 53 20 6c 65 76 65  er to an OS leve
2a50: 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 68 61  l allocation tha
2a60: 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 0a  t has just been.
2a70: 2a 2a 20 72 65 61 6c 6c 6f 63 28 29 65 64 2e 20  ** realloc()ed. 
2a80: 53 65 74 20 74 68 65 20 6c 69 73 74 20 70 6f 69  Set the list poi
2a90: 6e 74 65 72 73 20 74 68 61 74 20 70 6f 69 6e 74  nters that point
2aa0: 20 74 6f 20 74 68 69 73 20 65 6e 74 72 79 20 74   to this entry t
2ab0: 6f 20 69 74 27 73 20 6e 65 77 0a 2a 2a 20 6c 6f  o it's new.** lo
2ac0: 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  cation..*/.stati
2ad0: 63 20 76 6f 69 64 20 72 65 6c 69 6e 6b 41 6c 6c  c void relinkAll
2ae0: 6f 63 28 76 6f 69 64 20 2a 70 29 0a 7b 0a 20 20  oc(void *p).{.  
2af0: 76 6f 69 64 20 2a 2a 70 70 20 3d 20 28 76 6f 69  void **pp = (voi
2b00: 64 20 2a 2a 29 70 3b 0a 20 20 69 66 28 20 70 70  d **)p;.  if( pp
2b10: 5b 30 5d 20 29 7b 0a 20 20 20 20 28 28 76 6f 69  [0] ){.    ((voi
2b20: 64 20 2a 2a 29 28 70 70 5b 30 5d 29 29 5b 31 5d  d **)(pp[0]))[1]
2b30: 20 3d 20 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = p;.  }else{. 
2b40: 20 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70     ThreadData *p
2b50: 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  Tsd = sqlite3Thr
2b60: 65 61 64 44 61 74 61 28 29 3b 0a 20 20 20 20 70  eadData();.    p
2b70: 54 73 64 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  Tsd->pFirst = p;
2b80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 70 5b 31 5d  .  }.  if( pp[1]
2b90: 20 29 7b 0a 20 20 20 20 28 28 76 6f 69 64 20 2a   ){.    ((void *
2ba0: 2a 29 28 70 70 5b 31 5d 29 29 5b 30 5d 20 3d 20  *)(pp[1]))[0] = 
2bb0: 70 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  p;.  }.}.#else.#
2bc0: 64 65 66 69 6e 65 20 6c 69 6e 6b 41 6c 6c 6f 63  define linkAlloc
2bd0: 28 78 29 0a 23 64 65 66 69 6e 65 20 72 65 6c 69  (x).#define reli
2be0: 6e 6b 41 6c 6c 6f 63 28 78 29 0a 23 64 65 66 69  nkAlloc(x).#defi
2bf0: 6e 65 20 75 6e 6c 69 6e 6b 41 6c 6c 6f 63 28 78  ne unlinkAlloc(x
2c00: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2c10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
2c20: 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ts the result of
2c30: 20 74 68 65 20 54 63 6c 20 69 6e 74 65 72 70 72   the Tcl interpr
2c40: 65 74 65 72 20 70 61 73 73 65 64 20 61 73 20 61  eter passed as a
2c50: 6e 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 74 6f  n argument.** to
2c60: 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69   a list containi
2c70: 6e 67 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ng an entry for 
2c80: 65 61 63 68 20 63 75 72 72 65 6e 74 6c 79 20 6f  each currently o
2c90: 75 74 73 74 61 6e 64 69 6e 67 20 63 61 6c 6c 20  utstanding call 
2ca0: 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  made to .** sqli
2cb0: 74 65 4d 61 6c 6c 6f 63 20 61 6e 64 20 66 72 69  teMalloc and fri
2cc0: 65 6e 64 73 20 62 79 20 74 68 65 20 63 75 72 72  ends by the curr
2cd0: 65 6e 74 20 74 68 72 65 61 64 2e 20 45 61 63 68  ent thread. Each
2ce0: 20 6c 69 73 74 20 65 6e 74 72 79 20 69 73 20 69   list entry is i
2cf0: 74 73 65 6c 66 20 61 0a 2a 2a 20 6c 69 73 74 2c  tself a.** list,
2d00: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 74   consisting of t
2d10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 69 6e  he following (in
2d20: 20 6f 72 64 65 72 29 3a 0a 2a 2a 0a 2a 2a 20 20   order):.**.**  
2d30: 20 20 20 2a 20 54 68 65 20 6e 75 6d 62 65 72 20     * The number 
2d40: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
2d50: 65 64 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  ed.**     * The 
2d60: 5f 5f 46 49 4c 45 5f 5f 20 6d 61 63 72 6f 20 61  __FILE__ macro a
2d70: 74 20 74 68 65 20 74 69 6d 65 20 6f 66 20 74 68  t the time of th
2d80: 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  e sqliteMalloc()
2d90: 20 63 61 6c 6c 2e 0a 2a 2a 20 20 20 20 20 2a 20   call..**     * 
2da0: 54 68 65 20 5f 5f 4c 49 4e 45 5f 5f 20 6d 61 63  The __LINE__ mac
2db0: 72 6f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 2a 20  ro ....**     * 
2dc0: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
2dd0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
2de0: 69 64 20 76 61 72 69 61 62 6c 65 20 2e 2e 2e 0a  id variable ....
2df0: 2a 2a 20 20 20 20 20 2a 20 54 68 65 20 6f 75 74  **     * The out
2e00: 70 75 74 20 6f 66 20 62 61 63 6b 74 72 61 63 65  put of backtrace
2e10: 28 29 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  () (if available
2e20: 29 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 64 6f  ) ....**.** Todo
2e30: 3a 20 57 65 20 63 6f 75 6c 64 20 68 61 76 65 20  : We could have 
2e40: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  a version of thi
2e50: 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
2e60: 6f 75 74 70 75 74 73 20 74 6f 20 73 74 64 6f 75  outputs to stdou
2e70: 74 2c 20 0a 2a 2a 20 74 6f 20 64 65 62 75 67 20  t, .** to debug 
2e80: 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 20 77 68 65  memory leaks whe
2e90: 6e 20 54 63 6c 20 69 73 20 6e 6f 74 20 61 76 61  n Tcl is not ava
2ea0: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 64 65  ilable..*/.#ifde
2eb0: 66 20 54 43 4c 53 48 0a 23 69 6e 63 6c 75 64 65  f TCLSH.#include
2ec0: 20 3c 74 63 6c 2e 68 3e 0a 69 6e 74 20 73 71 6c   <tcl.h>.int sql
2ed0: 69 74 65 33 4f 75 74 73 74 61 6e 64 69 6e 67 4d  ite3OutstandingM
2ee0: 61 6c 6c 6f 63 73 28 54 63 6c 5f 49 6e 74 65 72  allocs(Tcl_Inter
2ef0: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 76 6f  p *interp){.  vo
2f00: 69 64 20 2a 70 3b 0a 20 20 54 68 72 65 61 64 44  id *p;.  ThreadD
2f10: 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69  ata *pTsd = sqli
2f20: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b  te3ThreadData();
2f30: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73  .  Tcl_Obj *pRes
2f40: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
2f50: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
2f60: 75 6e 74 28 70 52 65 73 29 3b 0a 0a 20 20 66 6f  unt(pRes);..  fo
2f70: 72 28 70 3d 70 54 73 64 2d 3e 70 46 69 72 73 74  r(p=pTsd->pFirst
2f80: 3b 20 70 3b 20 70 3d 28 28 76 6f 69 64 20 2a 2a  ; p; p=((void **
2f90: 29 70 29 5b 31 5d 29 7b 0a 20 20 20 20 54 63 6c  )p)[1]){.    Tcl
2fa0: 5f 4f 62 6a 20 2a 70 45 6e 74 72 79 20 3d 20 54  _Obj *pEntry = T
2fb0: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
2fc0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 63 6b   Tcl_Obj *pStack
2fd0: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
2fe0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
2ff0: 20 20 75 33 32 20 69 4c 69 6e 65 3b 0a 20 20 20    u32 iLine;.   
3000: 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 71   int nBytes = sq
3010: 6c 69 74 65 33 4f 73 41 6c 6c 6f 63 61 74 69 6f  lite3OsAllocatio
3020: 6e 53 69 7a 65 28 70 29 20 2d 20 54 45 53 54 41  nSize(p) - TESTA
3030: 4c 4c 4f 43 5f 4f 56 45 52 48 45 41 44 3b 0a 20  LLOC_OVERHEAD;. 
3040: 20 20 20 63 68 61 72 20 2a 7a 41 6c 6c 6f 63 20     char *zAlloc 
3050: 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20  = (char *)p;.   
3060: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 54 63 6c   int i;..    Tcl
3070: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3080: 65 6d 65 6e 74 28 30 2c 20 70 45 6e 74 72 79 2c  ement(0, pEntry,
3090: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
30a0: 42 79 74 65 73 29 29 3b 0a 0a 20 20 20 20 7a 20  Bytes));..    z 
30b0: 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45 53 54 41 4c  = &zAlloc[TESTAL
30c0: 4c 4f 43 5f 4f 46 46 53 45 54 5f 46 49 4c 45 4e  LOC_OFFSET_FILEN
30d0: 41 4d 45 28 70 29 5d 3b 0a 20 20 20 20 54 63 6c  AME(p)];.    Tcl
30e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
30f0: 65 6d 65 6e 74 28 30 2c 20 70 45 6e 74 72 79 2c  ement(0, pEntry,
3100: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3110: 6a 28 7a 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  j(z, -1));..    
3120: 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45 53 54  z = &zAlloc[TEST
3130: 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 4c 49 4e  ALLOC_OFFSET_LIN
3140: 45 4e 55 4d 42 45 52 28 70 29 5d 3b 0a 20 20 20  ENUMBER(p)];.   
3150: 20 6d 65 6d 63 70 79 28 26 69 4c 69 6e 65 2c 20   memcpy(&iLine, 
3160: 7a 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 29 3b  z, sizeof(u32));
3170: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3180: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
3190: 20 70 45 6e 74 72 79 2c 20 54 63 6c 5f 4e 65 77   pEntry, Tcl_New
31a0: 49 6e 74 4f 62 6a 28 69 4c 69 6e 65 29 29 3b 0a  IntObj(iLine));.
31b0: 0a 20 20 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63  .    z = &zAlloc
31c0: 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45  [TESTALLOC_OFFSE
31d0: 54 5f 55 53 45 52 28 70 29 5d 3b 0a 20 20 20 20  T_USER(p)];.    
31e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
31f0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6e 74  dElement(0, pEnt
3200: 72 79 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ry, Tcl_NewStrin
3210: 67 4f 62 6a 28 7a 2c 20 2d 31 29 29 3b 0a 0a 20  gObj(z, -1));.. 
3220: 20 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54     z = &zAlloc[T
3230: 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f  ESTALLOC_OFFSET_
3240: 53 54 41 43 4b 28 70 29 5d 3b 0a 20 20 20 20 66  STACK(p)];.    f
3250: 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53 54 41 4c  or(i=0; i<TESTAL
3260: 4c 4f 43 5f 53 54 41 43 4b 46 52 41 4d 45 53 3b  LOC_STACKFRAMES;
3270: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
3280: 72 20 7a 48 65 78 5b 31 32 38 5d 3b 0a 20 20 20  r zHex[128];.   
3290: 20 20 20 73 70 72 69 6e 74 66 28 7a 48 65 78 2c     sprintf(zHex,
32a0: 20 22 25 70 22 2c 20 28 28 76 6f 69 64 20 2a 2a   "%p", ((void **
32b0: 29 7a 29 5b 69 5d 29 3b 0a 20 20 20 20 20 20 54  )z)[i]);.      T
32c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
32d0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 74 61 63  Element(0, pStac
32e0: 6b 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  k, Tcl_NewString
32f0: 4f 62 6a 28 7a 48 65 78 2c 20 2d 31 29 29 3b 0a  Obj(zHex, -1));.
3300: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c      }..    Tcl_L
3310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3320: 65 6e 74 28 30 2c 20 70 45 6e 74 72 79 2c 20 70  ent(0, pEntry, p
3330: 53 74 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  Stack);.    Tcl_
3340: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3350: 6d 65 6e 74 28 30 2c 20 70 52 65 73 2c 20 70 45  ment(0, pRes, pE
3360: 6e 74 72 79 29 3b 0a 20 20 7d 0a 0a 20 20 54 63  ntry);.  }..  Tc
3370: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
3380: 74 65 72 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74  terp);.  Tcl_Set
3390: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
33a0: 2c 20 70 52 65 73 29 3b 0a 20 20 54 63 6c 5f 44  , pRes);.  Tcl_D
33b0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 73  ecrRefCount(pRes
33c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
33d0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
33e0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
33f0: 74 65 73 74 20 6c 61 79 65 72 27 73 20 77 72 61  test layer's wra
3400: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
3410: 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 29 2e 0a 2a  te3OsMalloc()..*
3420: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 20  /.static void * 
3430: 4f 53 4d 41 4c 4c 4f 43 28 69 6e 74 20 6e 29 7b  OSMALLOC(int n){
3440: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3450: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
3460: 41 47 45 4d 45 4e 54 0a 20 20 54 68 72 65 61 64  AGEMENT.  Thread
3470: 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
3480: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
3490: 3b 0a 20 20 70 54 73 64 2d 3e 6e 4d 61 78 41 6c  ;.  pTsd->nMaxAl
34a0: 6c 6f 63 20 3d 20 4d 41 58 28 70 54 73 64 2d 3e  loc = MAX(pTsd->
34b0: 6e 4d 61 78 41 6c 6c 6f 63 2c 20 70 54 73 64 2d  nMaxAlloc, pTsd-
34c0: 3e 6e 41 6c 6c 6f 63 29 3b 0a 23 65 6e 64 69 66  >nAlloc);.#endif
34d0: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
34e0: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d  te3ThreadData()-
34f0: 3e 6d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 65  >mallocDisallowe
3500: 64 20 29 3b 0a 20 20 69 66 28 20 21 66 61 69 6c  d );.  if( !fail
3510: 4d 61 6c 6c 6f 63 28 29 20 29 7b 0a 20 20 20 20  Malloc() ){.    
3520: 75 33 32 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  u32 *p;.    p = 
3530: 28 75 33 32 20 2a 29 73 71 6c 69 74 65 33 4f 73  (u32 *)sqlite3Os
3540: 4d 61 6c 6c 6f 63 28 6e 20 2b 20 54 45 53 54 41  Malloc(n + TESTA
3550: 4c 4c 4f 43 5f 4f 56 45 52 48 45 41 44 29 3b 0a  LLOC_OVERHEAD);.
3560: 20 20 20 20 61 73 73 65 72 74 28 70 29 3b 0a 20      assert(p);. 
3570: 20 20 20 73 71 6c 69 74 65 33 5f 6e 4d 61 6c 6c     sqlite3_nMall
3580: 6f 63 2b 2b 3b 0a 20 20 20 20 61 70 70 6c 79 47  oc++;.    applyG
3590: 75 61 72 64 73 28 70 29 3b 0a 20 20 20 20 6c 69  uards(p);.    li
35a0: 6e 6b 41 6c 6c 6f 63 28 70 29 3b 0a 20 20 20 20  nkAlloc(p);.    
35b0: 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 28  return (void *)(
35c0: 26 70 5b 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55  &p[TESTALLOC_NGU
35d0: 41 52 44 20 2b 20 32 2a 73 69 7a 65 6f 66 28 76  ARD + 2*sizeof(v
35e0: 6f 69 64 20 2a 29 2f 73 69 7a 65 6f 66 28 75 33  oid *)/sizeof(u3
35f0: 32 29 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  2)]);.  }.  retu
3600: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
3610: 69 6e 74 20 4f 53 53 49 5a 45 4f 46 28 76 6f 69  int OSSIZEOF(voi
3620: 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  d *p){.  if( p )
3630: 7b 0a 20 20 20 20 75 33 32 20 2a 70 4f 73 20 3d  {.    u32 *pOs =
3640: 20 28 75 33 32 20 2a 29 67 65 74 4f 73 50 6f 69   (u32 *)getOsPoi
3650: 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 65 74  nter(p);.    ret
3660: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 41 6c 6c  urn sqlite3OsAll
3670: 6f 63 61 74 69 6f 6e 53 69 7a 65 28 70 4f 73 29  ocationSize(pOs)
3680: 20 2d 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 56 45   - TESTALLOC_OVE
3690: 52 48 45 41 44 3b 0a 20 20 7d 0a 20 20 72 65 74  RHEAD;.  }.  ret
36a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
36b0: 54 68 69 73 20 69 73 20 74 68 65 20 74 65 73 74  This is the test
36c0: 20 6c 61 79 65 72 27 73 20 77 72 61 70 70 65 72   layer's wrapper
36d0: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4f   around sqlite3O
36e0: 73 46 72 65 65 28 29 2e 20 54 68 65 20 61 72 67  sFree(). The arg
36f0: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 70 6f  ument is a.** po
3700: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70 61  inter to the spa
3710: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
3720: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
3730: 20 74 6f 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   to use..*/.stat
3740: 69 63 20 76 6f 69 64 20 4f 53 46 52 45 45 28 76  ic void OSFREE(v
3750: 6f 69 64 20 2a 70 46 72 65 65 29 7b 0a 20 20 75  oid *pFree){.  u
3760: 33 32 20 2a 70 20 3d 20 28 75 33 32 20 2a 29 67  32 *p = (u32 *)g
3770: 65 74 4f 73 50 6f 69 6e 74 65 72 28 70 46 72 65  etOsPointer(pFre
3780: 65 29 3b 20 20 20 2f 2a 20 70 20 70 6f 69 6e 74  e);   /* p point
3790: 73 20 74 6f 20 4f 73 20 6c 65 76 65 6c 20 61 6c  s to Os level al
37a0: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  location */.  ch
37b0: 65 63 6b 47 75 61 72 64 73 28 70 29 3b 0a 20 20  eckGuards(p);.  
37c0: 75 6e 6c 69 6e 6b 41 6c 6c 6f 63 28 70 29 3b 0a  unlinkAlloc(p);.
37d0: 20 20 6d 65 6d 73 65 74 28 70 46 72 65 65 2c 20    memset(pFree, 
37e0: 30 78 35 35 2c 20 4f 53 53 49 5a 45 4f 46 28 70  0x55, OSSIZEOF(p
37f0: 46 72 65 65 29 29 3b 0a 20 20 73 71 6c 69 74 65  Free));.  sqlite
3800: 33 4f 73 46 72 65 65 28 70 29 3b 0a 20 20 73 71  3OsFree(p);.  sq
3810: 6c 69 74 65 33 5f 6e 46 72 65 65 2b 2b 3b 0a 7d  lite3_nFree++;.}
3820: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
3830: 74 68 65 20 74 65 73 74 20 6c 61 79 65 72 27 73  the test layer's
3840: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
3850: 73 71 6c 69 74 65 33 4f 73 52 65 61 6c 6c 6f 63  sqlite3OsRealloc
3860: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
3870: 69 64 20 2a 20 4f 53 52 45 41 4c 4c 4f 43 28 76  id * OSREALLOC(v
3880: 6f 69 64 20 2a 70 52 65 61 6c 6c 6f 63 2c 20 69  oid *pRealloc, i
3890: 6e 74 20 6e 29 7b 0a 23 69 66 64 65 66 20 53 51  nt n){.#ifdef SQ
38a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
38b0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
38c0: 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
38d0: 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
38e0: 44 61 74 61 28 29 3b 0a 20 20 70 54 73 64 2d 3e  Data();.  pTsd->
38f0: 6e 4d 61 78 41 6c 6c 6f 63 20 3d 20 4d 41 58 28  nMaxAlloc = MAX(
3900: 70 54 73 64 2d 3e 6e 4d 61 78 41 6c 6c 6f 63 2c  pTsd->nMaxAlloc,
3910: 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a   pTsd->nAlloc);.
3920: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
3930: 20 21 73 71 6c 69 74 65 33 54 68 72 65 61 64 44   !sqlite3ThreadD
3940: 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63 44 69 73  ata()->mallocDis
3950: 61 6c 6c 6f 77 65 64 20 29 3b 0a 20 20 69 66 28  allowed );.  if(
3960: 20 21 66 61 69 6c 4d 61 6c 6c 6f 63 28 29 20 29   !failMalloc() )
3970: 7b 0a 20 20 20 20 75 33 32 20 2a 70 20 3d 20 28  {.    u32 *p = (
3980: 75 33 32 20 2a 29 67 65 74 4f 73 50 6f 69 6e 74  u32 *)getOsPoint
3990: 65 72 28 70 52 65 61 6c 6c 6f 63 29 3b 0a 20 20  er(pRealloc);.  
39a0: 20 20 63 68 65 63 6b 47 75 61 72 64 73 28 70 29    checkGuards(p)
39b0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
39c0: 33 4f 73 52 65 61 6c 6c 6f 63 28 70 2c 20 6e 20  3OsRealloc(p, n 
39d0: 2b 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 56 45 52  + TESTALLOC_OVER
39e0: 48 45 41 44 29 3b 0a 20 20 20 20 61 70 70 6c 79  HEAD);.    apply
39f0: 47 75 61 72 64 73 28 70 29 3b 0a 20 20 20 20 72  Guards(p);.    r
3a00: 65 6c 69 6e 6b 41 6c 6c 6f 63 28 70 29 3b 0a 20  elinkAlloc(p);. 
3a10: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
3a20: 2a 29 28 26 70 5b 54 45 53 54 41 4c 4c 4f 43 5f  *)(&p[TESTALLOC_
3a30: 4e 47 55 41 52 44 20 2b 20 32 2a 73 69 7a 65 6f  NGUARD + 2*sizeo
3a40: 66 28 76 6f 69 64 20 2a 29 2f 73 69 7a 65 6f 66  f(void *)/sizeof
3a50: 28 75 33 32 29 5d 29 3b 0a 20 20 7d 0a 20 20 72  (u32)]);.  }.  r
3a60: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
3a70: 69 63 20 76 6f 69 64 20 4f 53 4d 41 4c 4c 4f 43  ic void OSMALLOC
3a80: 5f 46 41 49 4c 45 44 28 29 7b 0a 20 20 73 71 6c  _FAILED(){.  sql
3a90: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
3aa0: 2d 3e 69 73 46 61 69 6c 20 3d 20 30 3b 0a 7d 0a  ->isFail = 0;.}.
3ab0: 0a 23 65 6c 73 65 0a 2f 2a 20 44 65 66 69 6e 65  .#else./* Define
3ac0: 20 6d 61 63 72 6f 73 20 74 6f 20 63 61 6c 6c 20   macros to call 
3ad0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 58 58 58  the sqlite3OsXXX
3ae0: 20 69 6e 74 65 72 66 61 63 65 20 64 69 72 65 63   interface direc
3af0: 74 6c 79 20 69 66 20 0a 2a 2a 20 74 68 65 20 53  tly if .** the S
3b00: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 6d  QLITE_MEMDEBUG m
3b10: 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69  acro is not defi
3b20: 6e 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ned..*/.#define 
3b30: 4f 53 4d 41 4c 4c 4f 43 28 78 29 20 20 20 20 20  OSMALLOC(x)     
3b40: 20 20 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c     sqlite3OsMall
3b50: 6f 63 28 78 29 0a 23 64 65 66 69 6e 65 20 4f 53  oc(x).#define OS
3b60: 52 45 41 4c 4c 4f 43 28 78 2c 79 29 20 20 20 20  REALLOC(x,y)    
3b70: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 6c 6c 6f   sqlite3OsReallo
3b80: 63 28 78 2c 79 29 0a 23 64 65 66 69 6e 65 20 4f  c(x,y).#define O
3b90: 53 46 52 45 45 28 78 29 20 20 20 20 20 20 20 20  SFREE(x)        
3ba0: 20 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65 28    sqlite3OsFree(
3bb0: 78 29 0a 23 64 65 66 69 6e 65 20 4f 53 53 49 5a  x).#define OSSIZ
3bc0: 45 4f 46 28 78 29 20 20 20 20 20 20 20 20 73 71  EOF(x)        sq
3bd0: 6c 69 74 65 33 4f 73 41 6c 6c 6f 63 61 74 69 6f  lite3OsAllocatio
3be0: 6e 53 69 7a 65 28 78 29 0a 23 64 65 66 69 6e 65  nSize(x).#define
3bf0: 20 4f 53 4d 41 4c 4c 4f 43 5f 46 41 49 4c 45 44   OSMALLOC_FAILED
3c00: 28 29 0a 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  ()..#endif  /* S
3c10: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 2a  QLITE_MEMDEBUG *
3c20: 2f 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 63 6f 64 65  /./*.** End code
3c30: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   for memory allo
3c40: 63 61 74 69 6f 6e 20 73 79 73 74 65 6d 20 74 65  cation system te
3c50: 73 74 20 6c 61 79 65 72 2e 0a 2a 2a 2d 2d 2d 2d  st layer..**----
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ca0: 2d 2d 2d 2d 2d 2d 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ------*/../*.** 
3cb0: 54 68 65 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69  The handleSoftLi
3cc0: 6d 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  mit() function i
3cd0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3ce0: 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a  each call to .**
3cf0: 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63   sqlite3OsMalloc
3d00: 28 29 20 6f 72 20 78 52 65 61 6c 6c 6f 63 28 29  () or xRealloc()
3d10: 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
3d20: 27 6e 27 20 69 73 20 74 68 65 20 6e 75 6d 62 65  'n' is the numbe
3d30: 72 20 6f 66 0a 2a 2a 20 65 78 74 72 61 20 62 79  r of.** extra by
3d40: 74 65 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20  tes about to be 
3d50: 61 6c 6c 6f 63 61 74 65 64 20 28 66 6f 72 20 52  allocated (for R
3d60: 65 61 6c 6c 6f 63 28 29 20 74 68 69 73 20 6d 65  ealloc() this me
3d70: 61 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ans the size of 
3d80: 74 68 65 0a 2a 2a 20 6e 65 77 20 61 6c 6c 6f 63  the.** new alloc
3d90: 61 74 69 6f 6e 20 6c 65 73 73 20 74 68 65 20 73  ation less the s
3da0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 6c 64 20 61  ize of the old a
3db0: 6c 6c 6f 63 61 74 69 6f 6e 29 2e 20 49 66 20 74  llocation). If t
3dc0: 68 65 20 65 78 74 72 61 20 61 6c 6c 6f 63 61 74  he extra allocat
3dd0: 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  ion.** means tha
3de0: 74 20 74 68 65 20 74 6f 74 61 6c 20 6d 65 6d 6f  t the total memo
3df0: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ry allocated to 
3e00: 53 51 4c 69 74 65 20 69 6e 20 74 68 69 73 20 74  SQLite in this t
3e10: 68 72 65 61 64 20 77 6f 75 6c 64 20 65 78 63 65  hread would exce
3e20: 65 64 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  ed.** the limit 
3e30: 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 5f 73  set by sqlite3_s
3e40: 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 29  oft_heap_limit()
3e50: 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 5f 72  , then sqlite3_r
3e60: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
3e70: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 74 6f 20  is.** called to 
3e80: 74 72 79 20 74 6f 20 61 76 6f 69 64 20 74 68 69  try to avoid thi
3e90: 73 2e 20 4e 6f 20 69 6e 64 69 63 61 74 69 6f 6e  s. No indication
3ea0: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
3eb0: 6f 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 73 75  ot this is.** su
3ec0: 63 63 65 73 73 66 75 6c 20 69 73 20 72 65 74 75  ccessful is retu
3ed0: 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
3ee0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  er..**.** If SQL
3ef0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3f00: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 69 73 20  Y_MANAGEMENT is 
3f10: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68 69  not defined, thi
3f20: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
3f30: 61 20 6e 6f 2d 6f 70 0a 2a 2f 0a 23 69 66 64 65  a no-op.*/.#ifde
3f40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3f50: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
3f60: 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61  T.static void ha
3f70: 6e 64 6c 65 53 6f 66 74 4c 69 6d 69 74 28 69 6e  ndleSoftLimit(in
3f80: 74 20 6e 29 7b 0a 20 20 54 68 72 65 61 64 44 61  t n){.  ThreadDa
3f90: 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
3fa0: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
3fb0: 20 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 2b    pTsd->nAlloc +
3fc0: 3d 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = n;.  assert( p
3fd0: 54 73 64 2d 3e 6e 41 6c 6c 6f 63 3e 3d 30 20 29  Tsd->nAlloc>=0 )
3fe0: 3b 0a 20 20 69 66 28 20 6e 3e 30 20 26 26 20 70  ;.  if( n>0 && p
3ff0: 54 73 64 2d 3e 6e 53 6f 66 74 48 65 61 70 4c 69  Tsd->nSoftHeapLi
4000: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 77 68 69  mit>0 ){.    whi
4010: 6c 65 28 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63  le( pTsd->nAlloc
4020: 3e 70 54 73 64 2d 3e 6e 53 6f 66 74 48 65 61 70  >pTsd->nSoftHeap
4030: 4c 69 6d 69 74 20 26 26 20 73 71 6c 69 74 65 33  Limit && sqlite3
4040: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
4050: 6e 29 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  n) );.  }else if
4060: 28 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 3d 3d  ( pTsd->nAlloc==
4070: 30 20 26 26 20 70 54 73 64 2d 3e 6e 53 6f 66 74  0 && pTsd->nSoft
4080: 48 65 61 70 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a  HeapLimit==0 ){.
4090: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
40a0: 73 65 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  seThreadData();.
40b0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
40c0: 69 6e 65 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69  ine handleSoftLi
40d0: 6d 69 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  mit(x).#endif../
40e0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
40f0: 64 20 72 65 74 75 72 6e 20 4e 20 62 79 74 65 73  d return N bytes
4100: 20 6f 66 20 75 6e 69 6e 69 74 69 61 6c 69 73 65   of uninitialise
4110: 64 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  d memory by call
4120: 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  ing.** sqlite3Os
4130: 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 74 68 65  Malloc(). If the
4140: 20 4d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 20 66   Malloc() call f
4150: 61 69 6c 73 2c 20 61 74 74 65 6d 70 74 20 74 6f  ails, attempt to
4160: 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 0a 2a 2a   free memory .**
4170: 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
4180: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
4190: 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ry()..*/.void *s
41a0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28  qlite3MallocRaw(
41b0: 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a  int n){.  void *
41c0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3e 30  p = 0;.  if( n>0
41d0: 20 26 26 20 21 73 71 6c 69 74 65 33 54 68 72 65   && !sqlite3Thre
41e0: 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
41f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4200: 7b 0a 20 20 20 20 68 61 6e 64 6c 65 53 6f 66 74  {.    handleSoft
4210: 4c 69 6d 69 74 28 6e 29 3b 0a 20 20 20 20 77 68  Limit(n);.    wh
4220: 69 6c 65 28 20 21 28 70 20 3d 20 4f 53 4d 41 4c  ile( !(p = OSMAL
4230: 4c 4f 43 28 6e 29 29 20 26 26 20 73 71 6c 69 74  LOC(n)) && sqlit
4240: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
4250: 79 28 6e 29 20 29 3b 0a 20 20 20 20 69 66 28 20  y(n) );.    if( 
4260: 21 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  !p ){.      /* I
4270: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
4280: 20 66 61 69 6c 65 64 2c 20 63 61 6c 6c 20 68 61   failed, call ha
4290: 6e 64 6c 65 53 6f 66 74 4c 69 6d 69 74 28 29 20  ndleSoftLimit() 
42a0: 61 67 61 69 6e 2c 20 74 68 69 73 20 74 69 6d 65  again, this time
42b0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74  .      ** with t
42c0: 68 65 20 61 64 64 69 74 69 76 65 20 69 6e 76 65  he additive inve
42d0: 72 73 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d  rse of the argum
42e0: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 0a 20  ent passed to . 
42f0: 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 53 6f       ** handleSo
4300: 66 74 4c 69 6d 69 74 28 29 20 61 62 6f 76 65 2e  ftLimit() above.
4310: 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 65 20   This is so the 
4320: 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
4330: 63 20 76 61 72 69 61 62 6c 65 20 69 73 0a 20 20  c variable is.  
4340: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 63 6f 72      ** still cor
4350: 72 65 63 74 20 61 66 74 65 72 20 61 20 6d 61 6c  rect after a mal
4360: 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 20 0a  loc() failure. .
4370: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 68        */.      h
4380: 61 6e 64 6c 65 53 6f 66 74 4c 69 6d 69 74 28 6e  andleSoftLimit(n
4390: 20 2a 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71   * -1);.      sq
43a0: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
43b0: 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  )->mallocFailed 
43c0: 3d 20 31 3b 0a 20 20 20 20 20 20 4f 53 4d 41 4c  = 1;.      OSMAL
43d0: 4c 4f 43 5f 46 41 49 4c 45 44 28 29 3b 0a 20 20  LOC_FAILED();.  
43e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
43f0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73   p;.}../*.** Res
4400: 69 7a 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ize the allocati
4410: 6f 6e 20 61 74 20 70 20 74 6f 20 6e 20 62 79 74  on at p to n byt
4420: 65 73 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  es by calling sq
4430: 6c 69 74 65 33 4f 73 52 65 61 6c 6c 6f 63 28 29  lite3OsRealloc()
4440: 2e 20 54 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72  . The.** pointer
4450: 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   to the new allo
4460: 63 61 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e  cation is return
4470: 65 64 2e 20 20 49 66 20 74 68 65 20 52 65 61 6c  ed.  If the Real
4480: 6c 6f 63 28 29 20 63 61 6c 6c 20 66 61 69 6c 73  loc() call fails
4490: 2c 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  ,.** attempt to 
44a0: 66 72 65 65 20 6d 65 6d 6f 72 79 20 62 79 20 63  free memory by c
44b0: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 72  alling sqlite3_r
44c0: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e  elease_memory().
44d0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
44e0: 33 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  3Realloc(void *p
44f0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28 20  , int n){.  if( 
4500: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
4510: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 6d 61 6c  aReadOnly()->mal
4520: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
4530: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
4540: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
4550: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 61  return sqlite3Ma
4560: 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d 65 6c 73 65  lloc(n);.  }else
4570: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 6e 70 20 3d  {.    void *np =
4580: 20 30 3b 0a 20 20 20 20 68 61 6e 64 6c 65 53 6f   0;.    handleSo
4590: 66 74 4c 69 6d 69 74 28 6e 20 2d 20 4f 53 53 49  ftLimit(n - OSSI
45a0: 5a 45 4f 46 28 70 29 29 3b 0a 20 20 20 20 77 68  ZEOF(p));.    wh
45b0: 69 6c 65 28 20 21 28 6e 70 20 3d 20 4f 53 52 45  ile( !(np = OSRE
45c0: 41 4c 4c 4f 43 28 70 2c 20 6e 29 29 20 26 26 20  ALLOC(p, n)) && 
45d0: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
45e0: 6d 65 6d 6f 72 79 28 6e 29 20 29 3b 0a 20 20 20  memory(n) );.   
45f0: 20 69 66 28 20 21 6e 70 20 29 7b 0a 20 20 20 20   if( !np ){.    
4600: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 6c 6c 6f    /* If the allo
4610: 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 63  cation failed, c
4620: 61 6c 6c 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69  all handleSoftLi
4630: 6d 69 74 28 29 20 61 67 61 69 6e 2c 20 74 68 69  mit() again, thi
4640: 73 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20  s time.      ** 
4650: 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 76  with the additiv
4660: 65 20 69 6e 76 65 72 73 65 20 6f 66 20 74 68 65  e inverse of the
4670: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
4680: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 68 61   to .      ** ha
4690: 6e 64 6c 65 53 6f 66 74 4c 69 6d 69 74 28 29 20  ndleSoftLimit() 
46a0: 61 62 6f 76 65 2e 20 54 68 69 73 20 69 73 20 73  above. This is s
46b0: 6f 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61  o the ThreadData
46c0: 2e 6e 41 6c 6c 6f 63 20 76 61 72 69 61 62 6c 65  .nAlloc variable
46d0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 74 69   is.      ** sti
46e0: 6c 6c 20 63 6f 72 72 65 63 74 20 61 66 74 65 72  ll correct after
46f0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
4700: 75 72 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ure. .      */. 
4710: 20 20 20 20 20 68 61 6e 64 6c 65 53 6f 66 74 4c       handleSoftL
4720: 69 6d 69 74 28 4f 53 53 49 5a 45 4f 46 28 70 29  imit(OSSIZEOF(p)
4730: 20 2d 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c   - n);.      sql
4740: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
4750: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
4760: 20 31 3b 0a 20 20 20 20 20 20 4f 53 4d 41 4c 4c   1;.      OSMALL
4770: 4f 43 5f 46 41 49 4c 45 44 28 29 3b 0a 20 20 20  OC_FAILED();.   
4780: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 70   }.    return np
4790: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
47a0: 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 70  ree the memory p
47b0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 2e 20  ointed to by p. 
47c0: 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
47d0: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
47e0: 6f 72 20 61 20 0a 2a 2a 20 76 61 6c 75 65 20 72  or a .** value r
47f0: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 72 65  eturned by a pre
4800: 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 73 71  vious call to sq
4810: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 6f 72  lite3Malloc() or
4820: 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28   sqlite3Realloc(
4830: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
4840: 65 33 46 72 65 65 58 28 76 6f 69 64 20 2a 70 29  e3FreeX(void *p)
4850: 7b 0a 20 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69  {.  handleSoftLi
4860: 6d 69 74 28 30 20 2d 20 4f 53 53 49 5a 45 4f 46  mit(0 - OSSIZEOF
4870: 28 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  (p));.  if( p ){
4880: 0a 20 20 20 20 4f 53 46 52 45 45 28 70 29 3b 0a  .    OSFREE(p);.
4890: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76    }.}../*.** A v
48a0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
48b0: 4d 61 6c 6c 6f 63 28 29 20 74 68 61 74 20 69 73  Malloc() that is
48c0: 20 61 6c 77 61 79 73 20 61 20 66 75 6e 63 74 69   always a functi
48d0: 6f 6e 2c 20 6e 6f 74 20 61 20 6d 61 63 72 6f 2e  on, not a macro.
48e0: 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 74  .** Currently, t
48f0: 68 69 73 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  his is used only
4900: 20 74 6f 20 61 6c 6c 6f 63 20 74 6f 20 61 6c 6c   to alloc to all
4910: 6f 63 61 74 65 20 74 68 65 20 70 61 72 73 65 72  ocate the parser
4920: 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64   engine..*/.void
4930: 20 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 58   *sqlite3MallocX
4940: 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72  (int n){.  retur
4950: 6e 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  n sqliteMalloc(n
4960: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  );.}../*.** sqli
4970: 74 65 33 4d 61 6c 6c 6f 63 0a 2a 2a 20 73 71 6c  te3Malloc.** sql
4980: 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65  ite3ReallocOrFre
4990: 65 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 74 77  e.**.** These tw
49a0: 6f 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  o are implemente
49b0: 64 20 61 73 20 77 72 61 70 70 65 72 73 20 61 72  d as wrappers ar
49c0: 6f 75 6e 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ound sqlite3Mall
49d0: 6f 63 52 61 77 28 29 2c 20 0a 2a 2a 20 73 71 6c  ocRaw(), .** sql
49e0: 69 74 65 33 52 65 61 6c 6c 6f 63 28 29 20 61 6e  ite3Realloc() an
49f0: 64 20 73 71 6c 69 74 65 33 46 72 65 65 28 29 2e  d sqlite3Free().
4a00: 0a 2a 2f 20 0a 76 6f 69 64 20 2a 73 71 6c 69 74  .*/ .void *sqlit
4a10: 65 33 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b  e3Malloc(int n){
4a20: 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c  .  void *p = sql
4a30: 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 6e 29  ite3MallocRaw(n)
4a40: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
4a50: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 29   memset(p, 0, n)
4a60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4a70: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
4a80: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 6f  ReallocOrFree(vo
4a90: 69 64 20 2a 2a 70 70 2c 20 69 6e 74 20 6e 29 7b  id **pp, int n){
4aa0: 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c  .  void *p = sql
4ab0: 69 74 65 33 52 65 61 6c 6c 6f 63 28 2a 70 70 2c  ite3Realloc(*pp,
4ac0: 20 6e 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b   n);.  if( !p ){
4ad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72 65 65  .    sqlite3Free
4ae0: 58 28 2a 70 70 29 3b 0a 20 20 7d 0a 20 20 2a 70  X(*pp);.  }.  *p
4af0: 70 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p = p;.}../*.** 
4b00: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4b10: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
4b20: 61 74 65 64 20 61 74 20 6c 6f 63 61 74 69 6f 6e  ated at location
4b30: 20 70 2e 20 70 20 6d 75 73 74 20 62 65 20 65 69   p. p must be ei
4b40: 74 68 65 72 20 0a 2a 2a 20 61 20 4e 55 4c 4c 20  ther .** a NULL 
4b50: 70 6f 69 6e 74 65 72 20 28 69 6e 20 77 68 69 63  pointer (in whic
4b60: 68 20 63 61 73 65 20 30 20 69 73 20 72 65 74 75  h case 0 is retu
4b70: 72 6e 65 64 29 20 6f 72 20 61 20 70 6f 69 6e 74  rned) or a point
4b80: 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 0a  er returned by .
4b90: 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ** sqlite3Malloc
4ba0: 28 29 2c 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  (), sqlite3Reall
4bb0: 6f 63 28 29 20 6f 72 20 73 71 6c 69 74 65 33 52  oc() or sqlite3R
4bc0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 29 2e 0a  eallocOrFree()..
4bd0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
4be0: 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61   of bytes alloca
4bf0: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  ted does not inc
4c00: 6c 75 64 65 20 61 6e 79 20 6f 76 65 72 68 65 61  lude any overhea
4c10: 64 20 69 6e 73 65 72 74 65 64 20 62 79 20 0a 2a  d inserted by .*
4c20: 2a 20 61 6e 79 20 6d 61 6c 6c 6f 63 28 29 20 77  * any malloc() w
4c30: 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  rapper functions
4c40: 20 74 68 61 74 20 6d 61 79 20 62 65 20 63 61 6c   that may be cal
4c50: 6c 65 64 2e 20 53 6f 20 74 68 65 20 76 61 6c 75  led. So the valu
4c60: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 73  e returned.** is
4c70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
4c80: 79 74 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ytes that were a
4c90: 76 61 69 6c 61 62 6c 65 20 74 6f 20 53 51 4c 69  vailable to SQLi
4ca0: 74 65 20 75 73 69 6e 67 20 70 6f 69 6e 74 65 72  te using pointer
4cb0: 20 70 2c 20 0a 2a 2a 20 72 65 67 61 72 64 6c 65   p, .** regardle
4cc0: 73 73 20 6f 66 20 68 6f 77 20 6d 75 63 68 20 6d  ss of how much m
4cd0: 65 6d 6f 72 79 20 77 61 73 20 61 63 74 75 61 6c  emory was actual
4ce0: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f  ly allocated..*/
4cf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 6c 6c 6f  .int sqlite3Allo
4d00: 63 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a  cSize(void *p){.
4d10: 20 20 72 65 74 75 72 6e 20 4f 53 53 49 5a 45 4f    return OSSIZEO
4d20: 46 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  F(p);.}../*.** M
4d30: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 61 20  ake a copy of a 
4d40: 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79  string in memory
4d50: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4d60: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54  qliteMalloc(). T
4d70: 68 65 73 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  hese .** functio
4d80: 6e 73 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4d  ns call sqlite3M
4d90: 61 6c 6c 6f 63 52 61 77 28 29 20 64 69 72 65 63  allocRaw() direc
4da0: 74 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 73  tly instead of s
4db0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54  qliteMalloc(). T
4dc0: 68 69 73 0a 2a 2a 20 69 73 20 62 65 63 61 75 73  his.** is becaus
4dd0: 65 20 77 68 65 6e 20 6d 65 6d 6f 72 79 20 64 65  e when memory de
4de0: 62 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65  bugging is turne
4df0: 64 20 6f 6e 2c 20 74 68 65 73 65 20 74 77 6f 20  d on, these two 
4e00: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  functions are .*
4e10: 2a 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63  * called via mac
4e20: 72 6f 73 20 74 68 61 74 20 72 65 63 6f 72 64 20  ros that record 
4e30: 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65  the current file
4e40: 20 61 6e 64 20 6c 69 6e 65 20 6e 75 6d 62 65 72   and line number
4e50: 20 69 6e 20 74 68 65 0a 2a 2a 20 54 68 72 65 61   in the.** Threa
4e60: 64 44 61 74 61 20 73 74 72 75 63 74 75 72 65 2e  dData structure.
4e70: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
4e80: 33 53 74 72 44 75 70 28 63 6f 6e 73 74 20 63 68  3StrDup(const ch
4e90: 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a  ar *z){.  char *
4ea0: 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  zNew;.  if( z==0
4eb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
4ec0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  New = sqlite3Mal
4ed0: 6c 6f 63 52 61 77 28 73 74 72 6c 65 6e 28 7a 29  locRaw(strlen(z)
4ee0: 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20  +1);.  if( zNew 
4ef0: 29 20 73 74 72 63 70 79 28 7a 4e 65 77 2c 20 7a  ) strcpy(zNew, z
4f00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77  );.  return zNew
4f10: 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  ;.}.char *sqlite
4f20: 33 53 74 72 4e 44 75 70 28 63 6f 6e 73 74 20 63  3StrNDup(const c
4f30: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
4f40: 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20    char *zNew;.  
4f50: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
4f60: 6e 20 30 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71  n 0;.  zNew = sq
4f70: 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 6e  lite3MallocRaw(n
4f80: 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20  +1);.  if( zNew 
4f90: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e  ){.    memcpy(zN
4fa0: 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a  ew, z, n);.    z
4fb0: 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  New[n] = 0;.  }.
4fc0: 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d    return zNew;.}
4fd0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
4fe0: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65   string from the
4ff0: 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
5000: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 28 75  ent arguments (u
5010: 70 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73  p to the.** firs
5020: 74 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 29  t NULL argument)
5030: 2c 20 73 74 6f 72 65 20 74 68 65 20 73 74 72 69  , store the stri
5040: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
5050: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
5060: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
5070: 20 6d 61 6b 65 20 74 68 65 20 70 6f 69 6e 74 65   make the pointe
5080: 72 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  r indicated by t
5090: 68 65 20 31 73 74 20 61 72 67 75 6d 65 6e 74 0a  he 1st argument.
50a0: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  ** point to that
50b0: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 31 73   string.  The 1s
50c0: 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  t argument must 
50d0: 65 69 74 68 65 72 20 62 65 20 4e 55 4c 4c 20 6f  either be NULL o
50e0: 72 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 6d  r .** point to m
50f0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
5100: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
5110: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
5120: 74 65 33 53 65 74 53 74 72 69 6e 67 28 63 68 61  te3SetString(cha
5130: 72 20 2a 2a 70 7a 2c 20 2e 2e 2e 29 7b 0a 20 20  r **pz, ...){.  
5140: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
5150: 74 20 6e 42 79 74 65 3b 0a 20 20 63 6f 6e 73 74  t nByte;.  const
5160: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
5170: 20 2a 7a 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66   *zResult;..  if
5180: 28 20 70 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pz==0 ) return
5190: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20  ;.  nByte = 1;. 
51a0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70 7a   va_start(ap, pz
51b0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20 3d  );.  while( (z =
51c0: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
51d0: 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a  t char*))!=0 ){.
51e0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
51f0: 6c 65 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 76 61  len(z);.  }.  va
5200: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69  _end(ap);.  sqli
5210: 74 65 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20 2a  teFree(*pz);.  *
5220: 70 7a 20 3d 20 7a 52 65 73 75 6c 74 20 3d 20 73  pz = zResult = s
5230: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
5240: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
5250: 52 65 73 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  Result==0 ){.   
5260: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2a   return;.  }.  *
5270: 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 76  zResult = 0;.  v
5280: 61 5f 73 74 61 72 74 28 61 70 2c 20 70 7a 29 3b  a_start(ap, pz);
5290: 0a 20 20 77 68 69 6c 65 28 20 28 7a 20 3d 20 76  .  while( (z = v
52a0: 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
52b0: 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20  char*))!=0 ){.  
52c0: 20 20 73 74 72 63 70 79 28 7a 52 65 73 75 6c 74    strcpy(zResult
52d0: 2c 20 7a 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c  , z);.    zResul
52e0: 74 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 52 65 73  t += strlen(zRes
52f0: 75 6c 74 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65  ult);.  }.  va_e
5300: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
5310: 20 53 65 74 20 74 68 65 20 6d 6f 73 74 20 72 65   Set the most re
5320: 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  cent error code 
5330: 61 6e 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67  and error string
5340: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 0a   for the sqlite.
5350: 2a 2a 20 68 61 6e 64 6c 65 20 22 64 62 22 2e 20  ** handle "db". 
5360: 54 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  The error code i
5370: 73 20 73 65 74 20 74 6f 20 22 65 72 72 5f 63 6f  s set to "err_co
5380: 64 65 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  de"..**.** If it
5390: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74   is not NULL, st
53a0: 72 69 6e 67 20 7a 46 6f 72 6d 61 74 20 73 70 65  ring zFormat spe
53b0: 63 69 66 69 65 73 20 74 68 65 20 66 6f 72 6d 61  cifies the forma
53c0: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f  t of the.** erro
53d0: 72 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  r string in the 
53e0: 73 74 79 6c 65 20 6f 66 20 74 68 65 20 70 72 69  style of the pri
53f0: 6e 74 66 20 66 75 6e 63 74 69 6f 6e 73 3a 20 54  ntf functions: T
5400: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
5410: 66 6f 72 6d 61 74 20 63 68 61 72 61 63 74 65 72  format character
5420: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  s are allowed:.*
5430: 2a 0a 2a 2a 20 20 20 20 20 20 25 73 20 20 20 20  *.**      %s    
5440: 20 20 49 6e 73 65 72 74 20 61 20 73 74 72 69 6e    Insert a strin
5450: 67 0a 2a 2a 20 20 20 20 20 20 25 7a 20 20 20 20  g.**      %z    
5460: 20 20 41 20 73 74 72 69 6e 67 20 74 68 61 74 20    A string that 
5470: 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20  should be freed 
5480: 61 66 74 65 72 20 75 73 65 0a 2a 2a 20 20 20 20  after use.**    
5490: 20 20 25 64 20 20 20 20 20 20 49 6e 73 65 72 74    %d      Insert
54a0: 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20   an integer.**  
54b0: 20 20 20 20 25 54 20 20 20 20 20 20 49 6e 73 65      %T      Inse
54c0: 72 74 20 61 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20  rt a token.**   
54d0: 20 20 20 25 53 20 20 20 20 20 20 49 6e 73 65 72     %S      Inser
54e0: 74 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  t the first elem
54f0: 65 6e 74 20 6f 66 20 61 20 53 72 63 4c 69 73 74  ent of a SrcList
5500: 0a 2a 2a 0a 2a 2a 20 7a 46 6f 72 6d 61 74 20 61  .**.** zFormat a
5510: 6e 64 20 61 6e 79 20 73 74 72 69 6e 67 20 74 6f  nd any string to
5520: 6b 65 6e 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  kens that follow
5530: 20 69 74 20 61 72 65 20 61 73 73 75 6d 65 64 20   it are assumed 
5540: 74 6f 20 62 65 0a 2a 2a 20 65 6e 63 6f 64 65 64  to be.** encoded
5550: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a   in UTF-8..**.**
5560: 20 54 6f 20 63 6c 65 61 72 20 74 68 65 20 6d 6f   To clear the mo
5570: 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
5580: 66 6f 72 20 73 71 6c 69 74 65 20 68 61 6e 64 6c  for sqlite handl
5590: 65 20 22 64 62 22 2c 20 73 71 6c 69 74 65 33 45  e "db", sqlite3E
55a0: 72 72 6f 72 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  rror.** should b
55b0: 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 72  e called with er
55c0: 72 5f 63 6f 64 65 20 73 65 74 20 74 6f 20 53 51  r_code set to SQ
55d0: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 7a 46 6f 72  LITE_OK and zFor
55e0: 6d 61 74 20 73 65 74 0a 2a 2a 20 74 6f 20 4e 55  mat set.** to NU
55f0: 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  LL..*/.void sqli
5600: 74 65 33 45 72 72 6f 72 28 73 71 6c 69 74 65 33  te3Error(sqlite3
5610: 20 2a 64 62 2c 20 69 6e 74 20 65 72 72 5f 63 6f   *db, int err_co
5620: 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  de, const char *
5630: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5640: 20 69 66 28 20 64 62 20 26 26 20 28 64 62 2d 3e   if( db && (db->
5650: 70 45 72 72 20 7c 7c 20 28 64 62 2d 3e 70 45 72  pErr || (db->pEr
5660: 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  r = sqlite3Value
5670: 4e 65 77 28 29 29 29 21 3d 30 20 29 7b 0a 20 20  New()))!=0 ){.  
5680: 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20    db->errCode = 
5690: 65 72 72 5f 63 6f 64 65 3b 0a 20 20 20 20 69 66  err_code;.    if
56a0: 28 20 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20  ( zFormat ){.   
56b0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
56c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
56d0: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
56e0: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20   zFormat);.     
56f0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72   z = sqlite3VMPr
5700: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
5710: 29 3b 0a 20 20 20 20 20 20 76 61 5f 65 6e 64 28  );.      va_end(
5720: 61 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ap);.      sqlit
5730: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
5740: 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 7a 2c 20 53  ->pErr, -1, z, S
5750: 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69  QLITE_UTF8, sqli
5760: 74 65 33 46 72 65 65 58 29 3b 0a 20 20 20 20 7d  te3FreeX);.    }
5770: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5780: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
5790: 62 2d 3e 70 45 72 72 2c 20 30 2c 20 30 2c 20 53  b->pErr, 0, 0, S
57a0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
57b0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
57c0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
57d0: 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  dd an error mess
57e0: 61 67 65 20 74 6f 20 70 50 61 72 73 65 2d 3e 7a  age to pParse->z
57f0: 45 72 72 4d 73 67 20 61 6e 64 20 69 6e 63 72 65  ErrMsg and incre
5800: 6d 65 6e 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  ment pParse->nEr
5810: 72 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  r..** The follow
5820: 69 6e 67 20 66 6f 72 6d 61 74 74 69 6e 67 20 63  ing formatting c
5830: 68 61 72 61 63 74 65 72 73 20 61 72 65 20 61 6c  haracters are al
5840: 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lowed:.**.**    
5850: 20 20 25 73 20 20 20 20 20 20 49 6e 73 65 72 74    %s      Insert
5860: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 20 20 20   a string.**    
5870: 20 20 25 7a 20 20 20 20 20 20 41 20 73 74 72 69    %z      A stri
5880: 6e 67 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ng that should b
5890: 65 20 66 72 65 65 64 20 61 66 74 65 72 20 75 73  e freed after us
58a0: 65 0a 2a 2a 20 20 20 20 20 20 25 64 20 20 20 20  e.**      %d    
58b0: 20 20 49 6e 73 65 72 74 20 61 6e 20 69 6e 74 65    Insert an inte
58c0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 25 54 20 20  ger.**      %T  
58d0: 20 20 20 20 49 6e 73 65 72 74 20 61 20 74 6f 6b      Insert a tok
58e0: 65 6e 0a 2a 2a 20 20 20 20 20 20 25 53 20 20 20  en.**      %S   
58f0: 20 20 20 49 6e 73 65 72 74 20 74 68 65 20 66 69     Insert the fi
5900: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  rst element of a
5910: 20 53 72 63 4c 69 73 74 0a 2a 2a 0a 2a 2a 20 54   SrcList.**.** T
5920: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
5930: 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 72  uld be used to r
5940: 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 20  eport any error 
5950: 74 68 61 74 20 6f 63 63 75 72 73 20 77 68 69 6c  that occurs whil
5960: 73 74 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20  st.** compiling 
5970: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
5980: 20 28 69 2e 65 2e 20 77 69 74 68 69 6e 20 73 71   (i.e. within sq
5990: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 29  lite3_prepare())
59a0: 2e 20 54 68 65 0a 2a 2a 20 6c 61 73 74 20 74 68  . The.** last th
59b0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
59c0: 70 72 65 70 61 72 65 28 29 20 66 75 6e 63 74 69  prepare() functi
59d0: 6f 6e 20 64 6f 65 73 20 69 73 20 63 6f 70 79 20  on does is copy 
59e0: 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 73 74 6f  the error.** sto
59f0: 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
5a00: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tion into the da
5a10: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73  tabase handle us
5a20: 69 6e 67 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ing sqlite3Error
5a30: 28 29 2e 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ()..** Function 
5a40: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 29 20 73  sqlite3Error() s
5a50: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 64 75  hould be used du
5a60: 72 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 65  ring statement e
5a70: 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 28 73 71 6c  xecution.** (sql
5a80: 69 74 65 33 5f 73 74 65 70 28 29 20 65 74 63 2e  ite3_step() etc.
5a90: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
5aa0: 65 33 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65  e3ErrorMsg(Parse
5ab0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
5ac0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
5ad0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
5ae0: 70 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  p;.  pParse->nEr
5af0: 72 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  r++;.  sqliteFre
5b00: 65 28 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  e(pParse->zErrMs
5b10: 67 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  g);.  va_start(a
5b20: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70  p, zFormat);.  p
5b30: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 3d  Parse->zErrMsg =
5b40: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
5b50: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
5b60: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a   va_end(ap);.}..
5b70: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
5b80: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
5b90: 20 70 50 61 72 73 65 2c 20 69 66 20 61 6e 79 0a   pParse, if any.
5ba0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
5bb0: 72 72 6f 72 43 6c 65 61 72 28 50 61 72 73 65 20  rrorClear(Parse 
5bc0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
5bd0: 74 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 7a  teFree(pParse->z
5be0: 45 72 72 4d 73 67 29 3b 0a 20 20 70 50 61 72 73  ErrMsg);.  pPars
5bf0: 65 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  e->zErrMsg = 0;.
5c00: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 3d    pParse->nErr =
5c10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   0;.}../*.** Con
5c20: 76 65 72 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c  vert an SQL-styl
5c30: 65 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e quoted string 
5c40: 69 6e 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74  into a normal st
5c50: 72 69 6e 67 20 62 79 20 72 65 6d 6f 76 69 6e 67  ring by removing
5c60: 0a 2a 2a 20 74 68 65 20 71 75 6f 74 65 20 63 68  .** the quote ch
5c70: 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 63  aracters.  The c
5c80: 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e  onversion is don
5c90: 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20  e in-place.  If 
5ca0: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65  the.** input doe
5cb0: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
5cc0: 20 61 20 71 75 6f 74 65 20 63 68 61 72 61 63 74   a quote charact
5cd0: 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  er, then this ro
5ce0: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f  utine.** is a no
5cf0: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 32 2d  -op..**.** 2002-
5d00: 46 65 62 2d 31 34 3a 20 54 68 69 73 20 72 6f 75  Feb-14: This rou
5d10: 74 69 6e 65 20 69 73 20 65 78 74 65 6e 64 65 64  tine is extended
5d20: 20 74 6f 20 72 65 6d 6f 76 65 20 4d 53 2d 41 63   to remove MS-Ac
5d30: 63 65 73 73 20 73 74 79 6c 65 0a 2a 2a 20 62 72  cess style.** br
5d40: 61 63 6b 65 74 73 20 66 72 6f 6d 20 61 72 6f 75  ackets from arou
5d50: 6e 64 20 69 64 65 6e 74 69 66 65 72 73 2e 20 20  nd identifers.  
5d60: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 20 20 22 5b  For example:  "[
5d70: 61 2d 62 2d 63 5d 22 20 62 65 63 6f 6d 65 73 0a  a-b-c]" becomes.
5d80: 2a 2a 20 22 61 2d 62 2d 63 22 2e 0a 2a 2f 0a 76  ** "a-b-c"..*/.v
5d90: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71 75 6f  oid sqlite3Dequo
5da0: 74 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  te(char *z){.  i
5db0: 6e 74 20 71 75 6f 74 65 3b 0a 20 20 69 6e 74 20  nt quote;.  int 
5dc0: 69 2c 20 6a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  i, j;.  if( z==0
5dd0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 71 75 6f   ) return;.  quo
5de0: 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 73 77 69  te = z[0];.  swi
5df0: 74 63 68 28 20 71 75 6f 74 65 20 29 7b 0a 20 20  tch( quote ){.  
5e00: 20 20 63 61 73 65 20 27 5c 27 27 3a 20 20 62 72    case '\'':  br
5e10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 22  eak;.    case '"
5e20: 27 3a 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ':   break;.    
5e30: 63 61 73 65 20 27 60 27 3a 20 20 20 62 72 65 61  case '`':   brea
5e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
5e50: 20 20 2f 2a 20 46 6f 72 20 4d 79 53 51 4c 20 63    /* For MySQL c
5e60: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a  ompatibility */.
5e70: 20 20 20 20 63 61 73 65 20 27 5b 27 3a 20 20 20      case '[':   
5e80: 71 75 6f 74 65 20 3d 20 27 5d 27 3b 20 20 62 72  quote = ']';  br
5e90: 65 61 6b 3b 20 20 2f 2a 20 46 6f 72 20 4d 53 20  eak;  /* For MS 
5ea0: 53 71 6c 53 65 72 76 65 72 20 63 6f 6d 70 61 74  SqlServer compat
5eb0: 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20 20 20 64  ibility */.    d
5ec0: 65 66 61 75 6c 74 3a 20 20 20 20 72 65 74 75 72  efault:    retur
5ed0: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 31  n;.  }.  for(i=1
5ee0: 2c 20 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  , j=0; z[i]; i++
5ef0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
5f00: 3d 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20  =quote ){.      
5f10: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 71 75 6f 74  if( z[i+1]==quot
5f20: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  e ){.        z[j
5f30: 2b 2b 5d 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20  ++] = quote;.   
5f40: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
5f50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
5f60: 5b 6a 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [j++] = 0;.     
5f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5f80: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5f90: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
5fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
5fb0: 2a 20 41 6e 20 61 72 72 61 79 20 74 6f 20 6d 61  * An array to ma
5fc0: 70 20 61 6c 6c 20 75 70 70 65 72 2d 63 61 73 65  p all upper-case
5fd0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f   characters into
5fe0: 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
5ff0: 64 69 6e 67 0a 2a 2a 20 6c 6f 77 65 72 2d 63 61  ding.** lower-ca
6000: 73 65 20 63 68 61 72 61 63 74 65 72 2e 20 0a 2a  se character. .*
6010: 2f 0a 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  /.const unsigned
6020: 20 63 68 61 72 20 73 71 6c 69 74 65 33 55 70 70   char sqlite3Upp
6030: 65 72 54 6f 4c 6f 77 65 72 5b 5d 20 3d 20 7b 0a  erToLower[] = {.
6040: 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 32 2c        0,  1,  2,
6050: 20 20 33 2c 20 20 34 2c 20 20 35 2c 20 20 36 2c    3,  4,  5,  6,
6060: 20 20 37 2c 20 20 38 2c 20 20 39 2c 20 31 30 2c    7,  8,  9, 10,
6070: 20 31 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c   11, 12, 13, 14,
6080: 20 31 35 2c 20 31 36 2c 20 31 37 2c 0a 20 20 20   15, 16, 17,.   
6090: 20 20 31 38 2c 20 31 39 2c 20 32 30 2c 20 32 31    18, 19, 20, 21
60a0: 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c 20 32 35  , 22, 23, 24, 25
60b0: 2c 20 32 36 2c 20 32 37 2c 20 32 38 2c 20 32 39  , 26, 27, 28, 29
60c0: 2c 20 33 30 2c 20 33 31 2c 20 33 32 2c 20 33 33  , 30, 31, 32, 33
60d0: 2c 20 33 34 2c 20 33 35 2c 0a 20 20 20 20 20 33  , 34, 35,.     3
60e0: 36 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34  6, 37, 38, 39, 4
60f0: 30 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 34  0, 41, 42, 43, 4
6100: 34 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34  4, 45, 46, 47, 4
6110: 38 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 20 35  8, 49, 50, 51, 5
6120: 32 2c 20 35 33 2c 0a 20 20 20 20 20 35 34 2c 20  2, 53,.     54, 
6130: 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20  55, 56, 57, 58, 
6140: 35 39 2c 20 36 30 2c 20 36 31 2c 20 36 32 2c 20  59, 60, 61, 62, 
6150: 36 33 2c 20 36 34 2c 20 39 37 2c 20 39 38 2c 20  63, 64, 97, 98, 
6160: 39 39 2c 31 30 30 2c 31 30 31 2c 31 30 32 2c 31  99,100,101,102,1
6170: 30 33 2c 0a 20 20 20 20 31 30 34 2c 31 30 35 2c  03,.    104,105,
6180: 31 30 36 2c 31 30 37 2c 31 30 38 2c 31 30 39 2c  106,107,108,109,
6190: 31 31 30 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c  110,111,112,113,
61a0: 31 31 34 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c  114,115,116,117,
61b0: 31 31 38 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c  118,119,120,121,
61c0: 0a 20 20 20 20 31 32 32 2c 20 39 31 2c 20 39 32  .    122, 91, 92
61d0: 2c 20 39 33 2c 20 39 34 2c 20 39 35 2c 20 39 36  , 93, 94, 95, 96
61e0: 2c 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30  , 97, 98, 99,100
61f0: 2c 31 30 31 2c 31 30 32 2c 31 30 33 2c 31 30 34  ,101,102,103,104
6200: 2c 31 30 35 2c 31 30 36 2c 31 30 37 2c 0a 20 20  ,105,106,107,.  
6210: 20 20 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31    108,109,110,11
6220: 31 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31  1,112,113,114,11
6230: 35 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31  5,116,117,118,11
6240: 39 2c 31 32 30 2c 31 32 31 2c 31 32 32 2c 31 32  9,120,121,122,12
6250: 33 2c 31 32 34 2c 31 32 35 2c 0a 20 20 20 20 31  3,124,125,.    1
6260: 32 36 2c 31 32 37 2c 31 32 38 2c 31 32 39 2c 31  26,127,128,129,1
6270: 33 30 2c 31 33 31 2c 31 33 32 2c 31 33 33 2c 31  30,131,132,133,1
6280: 33 34 2c 31 33 35 2c 31 33 36 2c 31 33 37 2c 31  34,135,136,137,1
6290: 33 38 2c 31 33 39 2c 31 34 30 2c 31 34 31 2c 31  38,139,140,141,1
62a0: 34 32 2c 31 34 33 2c 0a 20 20 20 20 31 34 34 2c  42,143,.    144,
62b0: 31 34 35 2c 31 34 36 2c 31 34 37 2c 31 34 38 2c  145,146,147,148,
62c0: 31 34 39 2c 31 35 30 2c 31 35 31 2c 31 35 32 2c  149,150,151,152,
62d0: 31 35 33 2c 31 35 34 2c 31 35 35 2c 31 35 36 2c  153,154,155,156,
62e0: 31 35 37 2c 31 35 38 2c 31 35 39 2c 31 36 30 2c  157,158,159,160,
62f0: 31 36 31 2c 0a 20 20 20 20 31 36 32 2c 31 36 33  161,.    162,163
6300: 2c 31 36 34 2c 31 36 35 2c 31 36 36 2c 31 36 37  ,164,165,166,167
6310: 2c 31 36 38 2c 31 36 39 2c 31 37 30 2c 31 37 31  ,168,169,170,171
6320: 2c 31 37 32 2c 31 37 33 2c 31 37 34 2c 31 37 35  ,172,173,174,175
6330: 2c 31 37 36 2c 31 37 37 2c 31 37 38 2c 31 37 39  ,176,177,178,179
6340: 2c 0a 20 20 20 20 31 38 30 2c 31 38 31 2c 31 38  ,.    180,181,18
6350: 32 2c 31 38 33 2c 31 38 34 2c 31 38 35 2c 31 38  2,183,184,185,18
6360: 36 2c 31 38 37 2c 31 38 38 2c 31 38 39 2c 31 39  6,187,188,189,19
6370: 30 2c 31 39 31 2c 31 39 32 2c 31 39 33 2c 31 39  0,191,192,193,19
6380: 34 2c 31 39 35 2c 31 39 36 2c 31 39 37 2c 0a 20  4,195,196,197,. 
6390: 20 20 20 31 39 38 2c 31 39 39 2c 32 30 30 2c 32     198,199,200,2
63a0: 30 31 2c 32 30 32 2c 32 30 33 2c 32 30 34 2c 32  01,202,203,204,2
63b0: 30 35 2c 32 30 36 2c 32 30 37 2c 32 30 38 2c 32  05,206,207,208,2
63c0: 30 39 2c 32 31 30 2c 32 31 31 2c 32 31 32 2c 32  09,210,211,212,2
63d0: 31 33 2c 32 31 34 2c 32 31 35 2c 0a 20 20 20 20  13,214,215,.    
63e0: 32 31 36 2c 32 31 37 2c 32 31 38 2c 32 31 39 2c  216,217,218,219,
63f0: 32 32 30 2c 32 32 31 2c 32 32 32 2c 32 32 33 2c  220,221,222,223,
6400: 32 32 34 2c 32 32 35 2c 32 32 36 2c 32 32 37 2c  224,225,226,227,
6410: 32 32 38 2c 32 32 39 2c 32 33 30 2c 32 33 31 2c  228,229,230,231,
6420: 32 33 32 2c 32 33 33 2c 0a 20 20 20 20 32 33 34  232,233,.    234
6430: 2c 32 33 35 2c 32 33 36 2c 32 33 37 2c 32 33 38  ,235,236,237,238
6440: 2c 32 33 39 2c 32 34 30 2c 32 34 31 2c 32 34 32  ,239,240,241,242
6450: 2c 32 34 33 2c 32 34 34 2c 32 34 35 2c 32 34 36  ,243,244,245,246
6460: 2c 32 34 37 2c 32 34 38 2c 32 34 39 2c 32 35 30  ,247,248,249,250
6470: 2c 32 35 31 2c 0a 20 20 20 20 32 35 32 2c 32 35  ,251,.    252,25
6480: 33 2c 32 35 34 2c 32 35 35 0a 7d 3b 0a 23 64 65  3,254,255.};.#de
6490: 66 69 6e 65 20 55 70 70 65 72 54 6f 4c 6f 77 65  fine UpperToLowe
64a0: 72 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  r sqlite3UpperTo
64b0: 4c 6f 77 65 72 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  Lower../*.** Som
64c0: 65 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 73  e systems have s
64d0: 74 72 69 63 6d 70 28 29 2e 20 20 4f 74 68 65 72  tricmp().  Other
64e0: 73 20 68 61 76 65 20 73 74 72 63 61 73 65 63 6d  s have strcasecm
64f0: 70 28 29 2e 20 20 42 65 63 61 75 73 65 0a 2a 2a  p().  Because.**
6500: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
6510: 73 69 73 74 65 6e 63 79 2c 20 77 65 20 77 69 6c  sistency, we wil
6520: 6c 20 64 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e  l define our own
6530: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6540: 53 74 72 49 43 6d 70 28 63 6f 6e 73 74 20 63 68  StrICmp(const ch
6550: 61 72 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74  ar *zLeft, const
6560: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 29 7b 0a   char *zRight){.
6570: 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67    register unsig
6580: 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b  ned char *a, *b;
6590: 0a 20 20 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  .  a = (unsigned
65a0: 20 63 68 61 72 20 2a 29 7a 4c 65 66 74 3b 0a 20   char *)zLeft;. 
65b0: 20 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63   b = (unsigned c
65c0: 68 61 72 20 2a 29 7a 52 69 67 68 74 3b 0a 20 20  har *)zRight;.  
65d0: 77 68 69 6c 65 28 20 2a 61 21 3d 30 20 26 26 20  while( *a!=0 && 
65e0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d  UpperToLower[*a]
65f0: 3d 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  ==UpperToLower[*
6600: 62 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d  b]){ a++; b++; }
6610: 0a 20 20 72 65 74 75 72 6e 20 55 70 70 65 72 54  .  return UpperT
6620: 6f 4c 6f 77 65 72 5b 2a 61 5d 20 2d 20 55 70 70  oLower[*a] - Upp
6630: 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d 3b 0a 7d  erToLower[*b];.}
6640: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 74 72 4e  .int sqlite3StrN
6650: 49 43 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20  ICmp(const char 
6660: 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63 68  *zLeft, const ch
6670: 61 72 20 2a 7a 52 69 67 68 74 2c 20 69 6e 74 20  ar *zRight, int 
6680: 4e 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20 75  N){.  register u
6690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c  nsigned char *a,
66a0: 20 2a 62 3b 0a 20 20 61 20 3d 20 28 75 6e 73 69   *b;.  a = (unsi
66b0: 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c 65 66  gned char *)zLef
66c0: 74 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e  t;.  b = (unsign
66d0: 65 64 20 63 68 61 72 20 2a 29 7a 52 69 67 68 74  ed char *)zRight
66e0: 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e  ;.  while( N-- >
66f0: 20 30 20 26 26 20 2a 61 21 3d 30 20 26 26 20 55   0 && *a!=0 && U
6700: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d  pperToLower[*a]=
6710: 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62  =UpperToLower[*b
6720: 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a  ]){ a++; b++; }.
6730: 20 20 72 65 74 75 72 6e 20 4e 3c 30 20 3f 20 30    return N<0 ? 0
6740: 20 3a 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b   : UpperToLower[
6750: 2a 61 5d 20 2d 20 55 70 70 65 72 54 6f 4c 6f 77  *a] - UpperToLow
6760: 65 72 5b 2a 62 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er[*b];.}../*.**
6770: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
6780: 7a 20 69 73 20 61 20 70 75 72 65 20 6e 75 6d 65  z is a pure nume
6790: 72 69 63 20 73 74 72 69 6e 67 2e 20 20 52 65 74  ric string.  Ret
67a0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
67b0: 0a 2a 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  .** string conta
67c0: 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65  ins any characte
67d0: 72 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 70  r which is not p
67e0: 61 72 74 20 6f 66 20 61 20 6e 75 6d 62 65 72 2e  art of a number.
67f0: 20 49 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   If.** the strin
6800: 67 20 69 73 20 6e 75 6d 65 72 69 63 20 61 6e 64  g is numeric and
6810: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 27 2e   contains the '.
6820: 27 20 63 68 61 72 61 63 74 65 72 2c 20 73 65 74  ' character, set
6830: 20 2a 72 65 61 6c 6e 75 6d 0a 2a 2a 20 74 6f 20   *realnum.** to 
6840: 54 52 55 45 20 28 6f 74 68 65 72 77 69 73 65 20  TRUE (otherwise 
6850: 46 41 4c 53 45 29 2e 0a 2a 2a 0a 2a 2a 20 41 6e  FALSE)..**.** An
6860: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73   empty string is
6870: 20 63 6f 6e 73 69 64 65 72 65 64 20 6e 6f 6e 2d   considered non-
6880: 6e 75 6d 65 72 69 63 2e 0a 2a 2f 0a 69 6e 74 20  numeric..*/.int 
6890: 73 71 6c 69 74 65 33 49 73 4e 75 6d 62 65 72 28  sqlite3IsNumber(
68a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
68b0: 6e 74 20 2a 72 65 61 6c 6e 75 6d 2c 20 75 38 20  nt *realnum, u8 
68c0: 65 6e 63 29 7b 0a 20 20 69 6e 74 20 69 6e 63 72  enc){.  int incr
68d0: 20 3d 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f   = (enc==SQLITE_
68e0: 55 54 46 38 3f 31 3a 32 29 3b 0a 20 20 69 66 28  UTF8?1:2);.  if(
68f0: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
6900: 31 36 42 45 20 29 20 7a 2b 2b 3b 0a 20 20 69 66  16BE ) z++;.  if
6910: 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d  ( *z=='-' || *z=
6920: 3d 27 2b 27 20 29 20 7a 20 2b 3d 20 69 6e 63 72  ='+' ) z += incr
6930: 3b 0a 20 20 69 66 28 20 21 69 73 64 69 67 69 74  ;.  if( !isdigit
6940: 28 2a 28 75 38 2a 29 7a 29 20 29 7b 0a 20 20 20  (*(u8*)z) ){.   
6950: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6960: 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 69 66   z += incr;.  if
6970: 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61  ( realnum ) *rea
6980: 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  lnum = 0;.  whil
6990: 65 28 20 69 73 64 69 67 69 74 28 2a 28 75 38 2a  e( isdigit(*(u8*
69a0: 29 7a 29 20 29 7b 20 7a 20 2b 3d 20 69 6e 63 72  )z) ){ z += incr
69b0: 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e  ; }.  if( *z=='.
69c0: 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20 69 6e  ' ){.    z += in
69d0: 63 72 3b 0a 20 20 20 20 69 66 28 20 21 69 73 64  cr;.    if( !isd
69e0: 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 20  igit(*(u8*)z) ) 
69f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
6a00: 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 28 75  ile( isdigit(*(u
6a10: 38 2a 29 7a 29 20 29 7b 20 7a 20 2b 3d 20 69 6e  8*)z) ){ z += in
6a20: 63 72 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65  cr; }.    if( re
6a30: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
6a40: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
6a50: 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27  *z=='e' || *z=='
6a60: 45 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20 69  E' ){.    z += i
6a70: 6e 63 72 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ncr;.    if( *z=
6a80: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
6a90: 29 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 20  ) z += incr;.   
6aa0: 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 28   if( !isdigit(*(
6ab0: 75 38 2a 29 7a 29 20 29 20 72 65 74 75 72 6e 20  u8*)z) ) return 
6ac0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  0;.    while( is
6ad0: 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29  digit(*(u8*)z) )
6ae0: 7b 20 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a 20  { z += incr; }. 
6af0: 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29     if( realnum )
6b00: 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20   *realnum = 1;. 
6b10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d   }.  return *z==
6b20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
6b30: 73 74 72 69 6e 67 20 7a 5b 5d 20 69 73 20 61 6e  string z[] is an
6b40: 20 61 73 63 69 69 20 72 65 70 72 65 73 65 6e 74   ascii represent
6b50: 61 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 6c 20  ation of a real 
6b60: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 43 6f 6e 76 65  number..** Conve
6b70: 72 74 20 74 68 69 73 20 73 74 72 69 6e 67 20 74  rt this string t
6b80: 6f 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2a 0a 2a  o a double..**.*
6b90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
6ba0: 73 73 75 6d 65 73 20 74 68 61 74 20 7a 5b 5d 20  ssumes that z[] 
6bb0: 72 65 61 6c 6c 79 20 69 73 20 61 20 76 61 6c 69  really is a vali
6bc0: 64 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 69 74  d number.  If it
6bd0: 0a 2a 2a 20 69 73 20 6e 6f 74 2c 20 74 68 65 20  .** is not, the 
6be0: 72 65 73 75 6c 74 20 69 73 20 75 6e 64 65 66 69  result is undefi
6bf0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
6c00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
6c10: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6c  instead of the l
6c20: 69 62 72 61 72 79 20 61 74 6f 66 28 29 20 66 75  ibrary atof() fu
6c30: 6e 63 74 69 6f 6e 20 62 65 63 61 75 73 65 0a 2a  nction because.*
6c40: 2a 20 74 68 65 20 6c 69 62 72 61 72 79 20 61 74  * the library at
6c50: 6f 66 28 29 20 6d 69 67 68 74 20 77 61 6e 74 20  of() might want 
6c60: 74 6f 20 75 73 65 20 22 2c 22 20 61 73 20 74 68  to use "," as th
6c70: 65 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20  e decimal point 
6c80: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 22 2e  instead.** of ".
6c90: 22 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68  " depending on h
6ca0: 6f 77 20 6c 6f 63 61 6c 65 20 69 73 20 73 65 74  ow locale is set
6cb0: 2e 20 20 42 75 74 20 74 68 61 74 20 77 6f 75 6c  .  But that woul
6cc0: 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73  d cause problems
6cd0: 0a 2a 2a 20 66 6f 72 20 53 51 4c 2e 20 20 53 6f  .** for SQL.  So
6ce0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
6cf0: 77 61 79 73 20 75 73 65 73 20 22 2e 22 20 72 65  ways uses "." re
6d00: 67 61 72 64 6c 65 73 73 20 6f 66 20 6c 6f 63 61  gardless of loca
6d10: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
6d20: 65 33 41 74 6f 46 28 63 6f 6e 73 74 20 63 68 61  e3AtoF(const cha
6d30: 72 20 2a 7a 2c 20 64 6f 75 62 6c 65 20 2a 70 52  r *z, double *pR
6d40: 65 73 75 6c 74 29 7b 0a 23 69 66 6e 64 65 66 20  esult){.#ifndef 
6d50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
6d60: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 69 6e 74  TING_POINT.  int
6d70: 20 73 69 67 6e 20 3d 20 31 3b 0a 20 20 63 6f 6e   sign = 1;.  con
6d80: 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20  st char *zBegin 
6d90: 3d 20 7a 3b 0a 20 20 4c 4f 4e 47 44 4f 55 42 4c  = z;.  LONGDOUBL
6da0: 45 5f 54 59 50 45 20 76 31 20 3d 20 30 2e 30 3b  E_TYPE v1 = 0.0;
6db0: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 29  .  if( *z=='-' )
6dc0: 7b 0a 20 20 20 20 73 69 67 6e 20 3d 20 2d 31 3b  {.    sign = -1;
6dd0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 65 6c 73  .    z++;.  }els
6de0: 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b  e if( *z=='+' ){
6df0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    z++;.  }.  
6e00: 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a  while( isdigit(*
6e10: 28 75 38 2a 29 7a 29 20 29 7b 0a 20 20 20 20 76  (u8*)z) ){.    v
6e20: 31 20 3d 20 76 31 2a 31 30 2e 30 20 2b 20 28 2a  1 = v1*10.0 + (*
6e30: 7a 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 7a 2b  z - '0');.    z+
6e40: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d  +;.  }.  if( *z=
6e50: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 4c 4f 4e 47  ='.' ){.    LONG
6e60: 44 4f 55 42 4c 45 5f 54 59 50 45 20 64 69 76 69  DOUBLE_TYPE divi
6e70: 73 6f 72 20 3d 20 31 2e 30 3b 0a 20 20 20 20 7a  sor = 1.0;.    z
6e80: 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  ++;.    while( i
6e90: 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20  sdigit(*(u8*)z) 
6ea0: 29 7b 0a 20 20 20 20 20 20 76 31 20 3d 20 76 31  ){.      v1 = v1
6eb0: 2a 31 30 2e 30 20 2b 20 28 2a 7a 20 2d 20 27 30  *10.0 + (*z - '0
6ec0: 27 29 3b 0a 20 20 20 20 20 20 64 69 76 69 73 6f  ');.      diviso
6ed0: 72 20 2a 3d 20 31 30 2e 30 3b 0a 20 20 20 20 20  r *= 10.0;.     
6ee0: 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   z++;.    }.    
6ef0: 76 31 20 2f 3d 20 64 69 76 69 73 6f 72 3b 0a 20  v1 /= divisor;. 
6f00: 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27   }.  if( *z=='e'
6f10: 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20   || *z=='E' ){. 
6f20: 20 20 20 69 6e 74 20 65 73 69 67 6e 20 3d 20 31     int esign = 1
6f30: 3b 0a 20 20 20 20 69 6e 74 20 65 76 61 6c 20 3d  ;.    int eval =
6f40: 20 30 3b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42   0;.    LONGDOUB
6f50: 4c 45 5f 54 59 50 45 20 73 63 61 6c 65 20 3d 20  LE_TYPE scale = 
6f60: 31 2e 30 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  1.0;.    z++;.  
6f70: 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b    if( *z=='-' ){
6f80: 0a 20 20 20 20 20 20 65 73 69 67 6e 20 3d 20 2d  .      esign = -
6f90: 31 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  1;.      z++;.  
6fa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 3d 3d    }else if( *z==
6fb0: 27 2b 27 20 29 7b 0a 20 20 20 20 20 20 7a 2b 2b  '+' ){.      z++
6fc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
6fd0: 65 28 20 69 73 64 69 67 69 74 28 2a 28 75 38 2a  e( isdigit(*(u8*
6fe0: 29 7a 29 20 29 7b 0a 20 20 20 20 20 20 65 76 61  )z) ){.      eva
6ff0: 6c 20 3d 20 65 76 61 6c 2a 31 30 20 2b 20 2a 7a  l = eval*10 + *z
7000: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b   - '0';.      z+
7010: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  +;.    }.    whi
7020: 6c 65 28 20 65 76 61 6c 3e 3d 36 34 20 29 7b 20  le( eval>=64 ){ 
7030: 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 36 34  scale *= 1.0e+64
7040: 3b 20 65 76 61 6c 20 2d 3d 20 36 34 3b 20 7d 0a  ; eval -= 64; }.
7050: 20 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e      while( eval>
7060: 3d 31 36 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20  =16 ){ scale *= 
7070: 31 2e 30 65 2b 31 36 3b 20 65 76 61 6c 20 2d 3d  1.0e+16; eval -=
7080: 20 31 36 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65   16; }.    while
7090: 28 20 65 76 61 6c 3e 3d 34 20 29 7b 20 73 63 61  ( eval>=4 ){ sca
70a0: 6c 65 20 2a 3d 20 31 2e 30 65 2b 34 3b 20 65 76  le *= 1.0e+4; ev
70b0: 61 6c 20 2d 3d 20 34 3b 20 7d 0a 20 20 20 20 77  al -= 4; }.    w
70c0: 68 69 6c 65 28 20 65 76 61 6c 3e 3d 31 20 29 7b  hile( eval>=1 ){
70d0: 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 31   scale *= 1.0e+1
70e0: 3b 20 65 76 61 6c 20 2d 3d 20 31 3b 20 7d 0a 20  ; eval -= 1; }. 
70f0: 20 20 20 69 66 28 20 65 73 69 67 6e 3c 30 20 29     if( esign<0 )
7100: 7b 0a 20 20 20 20 20 20 76 31 20 2f 3d 20 73 63  {.      v1 /= sc
7110: 61 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ale;.    }else{.
7120: 20 20 20 20 20 20 76 31 20 2a 3d 20 73 63 61 6c        v1 *= scal
7130: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  e;.    }.  }.  *
7140: 70 52 65 73 75 6c 74 20 3d 20 73 69 67 6e 3c 30  pResult = sign<0
7150: 20 3f 20 2d 76 31 20 3a 20 76 31 3b 0a 20 20 72   ? -v1 : v1;.  r
7160: 65 74 75 72 6e 20 7a 20 2d 20 7a 42 65 67 69 6e  eturn z - zBegin
7170: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
7180: 20 73 71 6c 69 74 65 33 61 74 6f 69 36 34 28 7a   sqlite3atoi64(z
7190: 2c 20 70 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64  , pResult);.#end
71a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
71b0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
71c0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   */.}../*.** Ret
71d0: 75 72 6e 20 54 52 55 45 20 69 66 20 7a 4e 75 6d  urn TRUE if zNum
71e0: 20 69 73 20 61 20 36 34 2d 62 69 74 20 73 69 67   is a 64-bit sig
71f0: 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20  ned integer and 
7200: 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 76 61 6c  write.** the val
7210: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
7220: 72 20 69 6e 74 6f 20 2a 70 4e 75 6d 2e 20 20 49  r into *pNum.  I
7230: 66 20 7a 4e 75 6d 20 69 73 20 6e 6f 74 20 61 6e  f zNum is not an
7240: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6f 72 20 69   integer.** or i
7250: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  s an integer tha
7260: 74 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  t is too large t
7270: 6f 20 62 65 20 65 78 70 72 65 73 73 65 64 20 77  o be expressed w
7280: 69 74 68 20 36 34 20 62 69 74 73 2c 0a 2a 2a 20  ith 64 bits,.** 
7290: 74 68 65 6e 20 72 65 74 75 72 6e 20 66 61 6c 73  then return fals
72a0: 65 2e 20 20 49 66 20 6e 3e 30 20 61 6e 64 20 74  e.  If n>0 and t
72b0: 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 73 74  he integer is st
72c0: 72 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  ring is not.** e
72d0: 78 61 63 74 6c 79 20 6e 20 62 79 74 65 73 20 6c  xactly n bytes l
72e0: 6f 6e 67 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ong, return fals
72f0: 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  e..**.** When th
7300: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 6f  is routine was o
7310: 72 69 67 69 6e 61 6c 6c 79 20 77 72 69 74 74 65  riginally writte
7320: 6e 20 69 74 20 64 65 61 6c 74 20 77 69 74 68 20  n it dealt with 
7330: 6f 6e 6c 79 0a 2a 2a 20 33 32 2d 62 69 74 20 6e  only.** 32-bit n
7340: 75 6d 62 65 72 73 2e 20 20 41 74 20 74 68 61 74  umbers.  At that
7350: 20 74 69 6d 65 2c 20 69 74 20 77 61 73 20 6d 75   time, it was mu
7360: 63 68 20 66 61 73 74 65 72 20 74 68 61 6e 20 74  ch faster than t
7370: 68 65 0a 2a 2a 20 61 74 6f 69 28 29 20 6c 69 62  he.** atoi() lib
7380: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 69 6e 20  rary routine in 
7390: 52 65 64 48 61 74 20 37 2e 32 2e 0a 2a 2f 0a 69  RedHat 7.2..*/.i
73a0: 6e 74 20 73 71 6c 69 74 65 33 61 74 6f 69 36 34  nt sqlite3atoi64
73b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75  (const char *zNu
73c0: 6d 2c 20 69 36 34 20 2a 70 4e 75 6d 29 7b 0a 20  m, i64 *pNum){. 
73d0: 20 69 36 34 20 76 20 3d 20 30 3b 0a 20 20 69 6e   i64 v = 0;.  in
73e0: 74 20 6e 65 67 3b 0a 20 20 69 6e 74 20 69 2c 20  t neg;.  int i, 
73f0: 63 3b 0a 20 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d  c;.  if( *zNum==
7400: 27 2d 27 20 29 7b 0a 20 20 20 20 6e 65 67 20 3d  '-' ){.    neg =
7410: 20 31 3b 0a 20 20 20 20 7a 4e 75 6d 2b 2b 3b 0a   1;.    zNum++;.
7420: 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 4e 75    }else if( *zNu
7430: 6d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 6e 65  m=='+' ){.    ne
7440: 67 20 3d 20 30 3b 0a 20 20 20 20 7a 4e 75 6d 2b  g = 0;.    zNum+
7450: 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
7460: 6e 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66  neg = 0;.  }.  f
7470: 6f 72 28 69 3d 30 3b 20 28 63 3d 7a 4e 75 6d 5b  or(i=0; (c=zNum[
7480: 69 5d 29 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27  i])>='0' && c<='
7490: 39 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20  9'; i++){.    v 
74a0: 3d 20 76 2a 31 30 20 2b 20 63 20 2d 20 27 30 27  = v*10 + c - '0'
74b0: 3b 0a 20 20 7d 0a 20 20 2a 70 4e 75 6d 20 3d 20  ;.  }.  *pNum = 
74c0: 6e 65 67 20 3f 20 2d 76 20 3a 20 76 3b 0a 20 20  neg ? -v : v;.  
74d0: 72 65 74 75 72 6e 20 63 3d 3d 30 20 26 26 20 69  return c==0 && i
74e0: 3e 30 20 26 26 20 0a 20 20 20 20 20 20 28 69 3c  >0 && .      (i<
74f0: 31 39 20 7c 7c 20 28 69 3d 3d 31 39 20 26 26 20  19 || (i==19 && 
7500: 6d 65 6d 63 6d 70 28 7a 4e 75 6d 2c 22 39 32 32  memcmp(zNum,"922
7510: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
7520: 22 2c 31 39 29 3c 3d 30 29 29 3b 0a 7d 0a 0a 2f  ",19)<=0));.}../
7530: 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20  *.** The string 
7540: 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20  zNum represents 
7550: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  an integer.  The
7560: 72 65 20 6d 69 67 68 74 20 62 65 20 73 6f 6d 65  re might be some
7570: 20 6f 74 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d   other.** inform
7580: 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  ation following 
7590: 74 68 65 20 69 6e 74 65 67 65 72 20 74 6f 6f 2c  the integer too,
75a0: 20 62 75 74 20 74 68 61 74 20 70 61 72 74 20 69   but that part i
75b0: 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 49 66  s ignored..** If
75c0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 68 61   the integer tha
75d0: 74 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20  t the prefix of 
75e0: 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20  zNum represents 
75f0: 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 0a 2a 2a  will fit in a.**
7600: 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69   32-bit signed i
7610: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 54  nteger, return T
7620: 52 55 45 2e 20 20 4f 74 68 65 72 77 69 73 65 20  RUE.  Otherwise 
7630: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a  return FALSE..**
7640: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7650: 20 72 65 74 75 72 6e 73 20 46 41 4c 53 45 20 66   returns FALSE f
7660: 6f 72 20 74 68 65 20 73 74 72 69 6e 67 20 2d 32  or the string -2
7670: 31 34 37 34 38 33 36 34 38 20 65 76 65 6e 20 74  147483648 even t
7680: 68 61 74 0a 2a 2a 20 74 68 61 74 20 6e 75 6d 62  hat.** that numb
7690: 65 72 20 77 69 6c 6c 20 69 6e 20 66 61 63 74 20  er will in fact 
76a0: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
76b0: 69 6e 74 65 67 65 72 2e 20 20 42 75 74 20 70 6f  integer.  But po
76c0: 73 69 74 69 76 65 0a 2a 2a 20 32 31 34 37 34 38  sitive.** 214748
76d0: 33 36 34 38 20 77 69 6c 6c 20 6e 6f 74 20 66 69  3648 will not fi
76e0: 74 20 69 6e 20 33 32 20 62 69 74 73 2e 20 20 53  t in 32 bits.  S
76f0: 6f 20 69 74 20 73 65 65 6d 73 20 73 61 66 65 72  o it seems safer
7700: 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61   to return.** fa
7710: 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lse..*/.static i
7720: 6e 74 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e  nt sqlite3FitsIn
7730: 33 32 42 69 74 73 28 63 6f 6e 73 74 20 63 68 61  32Bits(const cha
7740: 72 20 2a 7a 4e 75 6d 29 7b 0a 20 20 69 6e 74 20  r *zNum){.  int 
7750: 69 2c 20 63 3b 0a 20 20 69 66 28 20 2a 7a 4e 75  i, c;.  if( *zNu
7760: 6d 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 4e 75 6d 3d  m=='-' || *zNum=
7770: 3d 27 2b 27 20 29 20 7a 4e 75 6d 2b 2b 3b 0a 20  ='+' ) zNum++;. 
7780: 20 66 6f 72 28 69 3d 30 3b 20 28 63 3d 7a 4e 75   for(i=0; (c=zNu
7790: 6d 5b 69 5d 29 3e 3d 27 30 27 20 26 26 20 63 3c  m[i])>='0' && c<
77a0: 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 72  ='9'; i++){}.  r
77b0: 65 74 75 72 6e 20 69 3c 31 30 20 7c 7c 20 28 69  eturn i<10 || (i
77c0: 3d 3d 31 30 20 26 26 20 6d 65 6d 63 6d 70 28 7a  ==10 && memcmp(z
77d0: 4e 75 6d 2c 22 32 31 34 37 34 38 33 36 34 37 22  Num,"2147483647"
77e0: 2c 31 30 29 3c 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a  ,10)<=0);.}../*.
77f0: 2a 2a 20 49 66 20 7a 4e 75 6d 20 72 65 70 72 65  ** If zNum repre
7800: 73 65 6e 74 73 20 61 6e 20 69 6e 74 65 67 65 72  sents an integer
7810: 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69   that will fit i
7820: 6e 20 33 32 2d 62 69 74 73 2c 20 74 68 65 6e 20  n 32-bits, then 
7830: 73 65 74 0a 2a 2a 20 2a 70 56 61 6c 75 65 20 74  set.** *pValue t
7840: 6f 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 61  o that integer a
7850: 6e 64 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20  nd return true. 
7860: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
7870: 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  n false..*/.int 
7880: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
7890: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d  const char *zNum
78a0: 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
78b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74    if( sqlite3Fit
78c0: 73 49 6e 33 32 42 69 74 73 28 7a 4e 75 6d 29 20  sIn32Bits(zNum) 
78d0: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
78e0: 20 61 74 6f 69 28 7a 4e 75 6d 29 3b 0a 20 20 20   atoi(zNum);.   
78f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
7900: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7910: 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20 7a  .** The string z
7920: 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20 61  Num represents a
7930: 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 72  n integer.  Ther
7940: 65 20 6d 69 67 68 74 20 62 65 20 73 6f 6d 65 20  e might be some 
7950: 6f 74 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d 61  other.** informa
7960: 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tion following t
7970: 68 65 20 69 6e 74 65 67 65 72 20 74 6f 6f 2c 20  he integer too, 
7980: 62 75 74 20 74 68 61 74 20 70 61 72 74 20 69 73  but that part is
7990: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 49 66 20   ignored..** If 
79a0: 74 68 65 20 69 6e 74 65 67 65 72 20 74 68 61 74  the integer that
79b0: 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a   the prefix of z
79c0: 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20 77  Num represents w
79d0: 69 6c 6c 20 66 69 74 20 69 6e 20 61 0a 2a 2a 20  ill fit in a.** 
79e0: 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
79f0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 54 52  teger, return TR
7a00: 55 45 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72  UE.  Otherwise r
7a10: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a  eturn FALSE..**.
7a20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7a30: 72 65 74 75 72 6e 73 20 46 41 4c 53 45 20 66 6f  returns FALSE fo
7a40: 72 20 74 68 65 20 73 74 72 69 6e 67 20 2d 39 32  r the string -92
7a50: 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
7a60: 38 20 65 76 65 6e 20 74 68 61 74 0a 2a 2a 20 74  8 even that.** t
7a70: 68 61 74 20 6e 75 6d 62 65 72 20 77 69 6c 6c 2c  hat number will,
7a80: 20 69 6e 20 74 68 65 6f 72 79 20 66 69 74 20 69   in theory fit i
7a90: 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  n a 64-bit integ
7aa0: 65 72 2e 20 20 50 6f 73 69 74 69 76 65 0a 2a 2a  er.  Positive.**
7ab0: 20 39 32 32 33 33 37 33 30 33 36 38 35 34 37 37   922337303685477
7ac0: 35 38 30 38 20 77 69 6c 6c 20 6e 6f 74 20 66 69  5808 will not fi
7ad0: 74 20 69 6e 20 36 34 20 62 69 74 73 2e 20 20 53  t in 64 bits.  S
7ae0: 6f 20 69 74 20 73 65 65 6d 73 20 73 61 66 65 72  o it seems safer
7af0: 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61   to return.** fa
7b00: 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lse..*/.int sqli
7b10: 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28  te3FitsIn64Bits(
7b20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d  const char *zNum
7b30: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20  ){.  int i, c;. 
7b40: 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20   if( *zNum=='-' 
7b50: 7c 7c 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20 29 20  || *zNum=='+' ) 
7b60: 7a 4e 75 6d 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  zNum++;.  for(i=
7b70: 30 3b 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d  0; (c=zNum[i])>=
7b80: 27 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69  '0' && c<='9'; i
7b90: 2b 2b 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69  ++){}.  return i
7ba0: 3c 31 39 20 7c 7c 20 28 69 3d 3d 31 39 20 26 26  <19 || (i==19 &&
7bb0: 20 6d 65 6d 63 6d 70 28 7a 4e 75 6d 2c 22 39 32   memcmp(zNum,"92
7bc0: 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
7bd0: 37 22 2c 31 39 29 3c 3d 30 29 3b 0a 7d 0a 0a 0a  7",19)<=0);.}...
7be0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
7bf0: 20 73 71 6c 69 74 65 2e 6d 61 67 69 63 20 66 72   sqlite.magic fr
7c00: 6f 6d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  om SQLITE_MAGIC_
7c10: 4f 50 45 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  OPEN to SQLITE_M
7c20: 41 47 49 43 5f 42 55 53 59 2e 0a 2a 2a 20 52 65  AGIC_BUSY..** Re
7c30: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 28 6e  turn an error (n
7c40: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20  on-zero) if the 
7c50: 6d 61 67 69 63 20 77 61 73 20 6e 6f 74 20 53 51  magic was not SQ
7c60: 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 0a  LITE_MAGIC_OPEN.
7c70: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
7c80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
7c90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7ca0: 6e 65 20 69 73 20 61 20 61 74 74 65 6d 70 74 20  ne is a attempt 
7cb0: 74 6f 20 64 65 74 65 63 74 20 69 66 20 74 77 6f  to detect if two
7cc0: 20 74 68 72 65 61 64 73 20 75 73 65 20 74 68 65   threads use the
7cd0: 0a 2a 2a 20 73 61 6d 65 20 73 71 6c 69 74 65 2a  .** same sqlite*
7ce0: 20 70 6f 69 6e 74 65 72 20 61 74 20 74 68 65 20   pointer at the 
7cf0: 73 61 6d 65 20 74 69 6d 65 2e 20 20 54 68 65 72  same time.  Ther
7d00: 65 20 69 73 20 61 20 72 61 63 65 20 0a 2a 2a 20  e is a race .** 
7d10: 63 6f 6e 64 69 74 69 6f 6e 20 73 6f 20 69 74 20  condition so it 
7d20: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
7d30: 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   the error is no
7d40: 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2a 20 42  t detected..** B
7d50: 75 74 20 75 73 75 61 6c 6c 79 20 74 68 65 20 70  ut usually the p
7d60: 72 6f 62 6c 65 6d 20 77 69 6c 6c 20 62 65 20 73  roblem will be s
7d70: 65 65 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74  een.  The result
7d80: 20 77 69 6c 6c 20 62 65 20 61 6e 0a 2a 2a 20 65   will be an.** e
7d90: 72 72 6f 72 20 77 68 69 63 68 20 63 61 6e 20 62  rror which can b
7da0: 65 20 75 73 65 64 20 74 6f 20 64 65 62 75 67 20  e used to debug 
7db0: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
7dc0: 74 68 61 74 20 69 73 0a 2a 2a 20 75 73 69 6e 67  that is.** using
7dd0: 20 53 51 4c 69 74 65 20 69 6e 63 6f 72 72 65 63   SQLite incorrec
7de0: 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  tly..**.** Ticke
7df0: 74 20 23 32 30 32 3a 20 20 49 66 20 64 62 2d 3e  t #202:  If db->
7e00: 6d 61 67 69 63 20 69 73 20 6e 6f 74 20 61 20 76  magic is not a v
7e10: 61 6c 69 64 20 6f 70 65 6e 20 76 61 6c 75 65 2c  alid open value,
7e20: 20 74 61 6b 65 20 63 61 72 65 20 6e 6f 74 0a 2a   take care not.*
7e30: 2a 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  * to modify the 
7e40: 64 62 20 73 74 72 75 63 74 75 72 65 20 61 74 20  db structure at 
7e50: 61 6c 6c 2e 20 20 49 74 20 63 6f 75 6c 64 20 62  all.  It could b
7e60: 65 20 74 68 61 74 20 64 62 20 69 73 20 61 20 73  e that db is a s
7e70: 74 61 6c 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  tale.** pointer.
7e80: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
7e90: 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
7ea0: 61 74 20 74 68 65 72 65 20 68 61 73 20 62 65 65  at there has bee
7eb0: 6e 20 61 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c  n a prior.** cal
7ec0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f  l to sqlite3_clo
7ed0: 73 65 28 64 62 29 20 61 6e 64 20 64 62 20 68 61  se(db) and db ha
7ee0: 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s been deallocat
7ef0: 65 64 2e 20 20 41 6e 64 20 77 65 20 64 6f 0a 2a  ed.  And we do.*
7f00: 2a 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 77 72  * not want to wr
7f10: 69 74 65 20 69 6e 74 6f 20 64 65 61 6c 6c 6f 63  ite into dealloc
7f20: 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  ated memory..*/.
7f30: 69 6e 74 20 73 71 6c 69 74 65 33 53 61 66 65 74  int sqlite3Safet
7f40: 79 4f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29  yOn(sqlite3 *db)
7f50: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69  {.  if( db->magi
7f60: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
7f70: 4f 50 45 4e 20 29 7b 0a 20 20 20 20 64 62 2d 3e  OPEN ){.    db->
7f80: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
7f90: 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 20 20 72  AGIC_BUSY;.    r
7fa0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
7fb0: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d   if( db->magic==
7fc0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
7fd0: 59 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  Y ){.    db->mag
7fe0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
7ff0: 43 5f 45 52 52 4f 52 3b 0a 20 20 20 20 64 62 2d  C_ERROR;.    db-
8000: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
8010: 5f 49 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 0a  _Interrupt;.  }.
8020: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
8030: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
8040: 6d 61 67 69 63 20 66 72 6f 6d 20 53 51 4c 49 54  magic from SQLIT
8050: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 74 6f 20  E_MAGIC_BUSY to 
8060: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
8070: 4e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  N..** Return an 
8080: 65 72 72 6f 72 20 28 6e 6f 6e 2d 7a 65 72 6f 29  error (non-zero)
8090: 20 69 66 20 74 68 65 20 6d 61 67 69 63 20 77 61   if the magic wa
80a0: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4d 41 47  s not SQLITE_MAG
80b0: 49 43 5f 42 55 53 59 0a 2a 2a 20 77 68 65 6e 20  IC_BUSY.** when 
80c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
80d0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  called..*/.int s
80e0: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
80f0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8100: 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53  if( db->magic==S
8110: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
8120: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
8130: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
8140: 5f 4f 50 45 4e 3b 0a 20 20 20 20 72 65 74 75 72  _OPEN;.    retur
8150: 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 0;.  }else if(
8160: 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49   db->magic==SQLI
8170: 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 29 7b  TE_MAGIC_OPEN ){
8180: 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
8190: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
81a0: 52 4f 52 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  ROR;.    db->fla
81b0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
81c0: 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20 72 65  errupt;.  }.  re
81d0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
81e0: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
81f0: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
8200: 6c 69 64 20 64 62 20 70 6f 69 6e 74 65 72 2e 20  lid db pointer. 
8210: 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6e 6f   This test is no
8220: 74 0a 2a 2a 20 66 6f 6f 6c 70 72 6f 6f 66 20 62  t.** foolproof b
8230: 75 74 20 69 74 20 64 6f 65 73 20 70 72 6f 76 69  ut it does provi
8240: 64 65 20 73 6f 6d 65 20 6d 65 61 73 75 72 65 20  de some measure 
8250: 6f 66 20 70 72 6f 74 65 63 74 69 6f 6e 20 61 67  of protection ag
8260: 61 69 6e 73 74 0a 2a 2a 20 6d 69 73 75 73 65 20  ainst.** misuse 
8270: 6f 66 20 74 68 65 20 69 6e 74 65 72 66 61 63 65  of the interface
8280: 20 73 75 63 68 20 61 73 20 70 61 73 73 69 6e 67   such as passing
8290: 20 69 6e 20 64 62 20 70 6f 69 6e 74 65 72 73 20   in db pointers 
82a0: 74 68 61 74 20 61 72 65 0a 2a 2a 20 4e 55 4c 4c  that are.** NULL
82b0: 20 6f 72 20 77 68 69 63 68 20 68 61 76 65 20 62   or which have b
82c0: 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63  een previously c
82d0: 6c 6f 73 65 64 2e 20 20 49 66 20 74 68 69 73 20  losed.  If this 
82e0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 0a  routine returns.
82f0: 2a 2a 20 54 52 55 45 20 69 74 20 6d 65 61 6e 73  ** TRUE it means
8300: 20 74 68 61 74 20 74 68 65 20 64 62 20 70 6f 69   that the db poi
8310: 6e 74 65 72 20 69 73 20 69 6e 76 61 6c 69 64 20  nter is invalid 
8320: 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  and should not b
8330: 65 0a 2a 2a 20 64 65 72 65 66 65 72 65 6e 63 65  e.** dereference
8340: 64 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  d for any reason
8350: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
8360: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 69  unction should i
8370: 6e 76 6f 6b 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  nvoke.** SQLITE_
8380: 4d 49 53 55 53 45 20 69 6d 6d 65 64 69 61 74 65  MISUSE immediate
8390: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
83a0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 28 73 71  e3SafetyCheck(sq
83b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
83c0: 74 20 6d 61 67 69 63 3b 0a 20 20 69 66 28 20 64  t magic;.  if( d
83d0: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
83e0: 0a 20 20 6d 61 67 69 63 20 3d 20 64 62 2d 3e 6d  .  magic = db->m
83f0: 61 67 69 63 3b 0a 20 20 69 66 28 20 6d 61 67 69  agic;.  if( magi
8400: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
8410: 43 4c 4f 53 45 44 20 26 26 0a 20 20 20 20 20 20  CLOSED &&.      
8420: 20 20 20 6d 61 67 69 63 21 3d 53 51 4c 49 54 45     magic!=SQLITE
8430: 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 26 26 0a 20  _MAGIC_OPEN &&. 
8440: 20 20 20 20 20 20 20 20 6d 61 67 69 63 21 3d 53          magic!=S
8450: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
8460: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
8470: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8480: 2a 20 54 68 65 20 76 61 72 69 61 62 6c 65 2d 6c  * The variable-l
8490: 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 65 6e  ength integer en
84a0: 63 6f 64 69 6e 67 20 69 73 20 61 73 20 66 6f 6c  coding is as fol
84b0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 4b 45 59 3a  lows:.**.** KEY:
84c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 20 3d 20  .**         A = 
84d0: 30 78 78 78 78 78 78 78 20 20 20 20 37 20 62 69  0xxxxxxx    7 bi
84e0: 74 73 20 6f 66 20 64 61 74 61 20 61 6e 64 20 6f  ts of data and o
84f0: 6e 65 20 66 6c 61 67 20 62 69 74 0a 2a 2a 20 20  ne flag bit.**  
8500: 20 20 20 20 20 20 20 42 20 3d 20 31 78 78 78 78         B = 1xxxx
8510: 78 78 78 20 20 20 20 37 20 62 69 74 73 20 6f 66  xxx    7 bits of
8520: 20 64 61 74 61 20 61 6e 64 20 6f 6e 65 20 66 6c   data and one fl
8530: 61 67 20 62 69 74 0a 2a 2a 20 20 20 20 20 20 20  ag bit.**       
8540: 20 20 43 20 3d 20 78 78 78 78 78 78 78 78 20 20    C = xxxxxxxx  
8550: 20 20 38 20 62 69 74 73 20 6f 66 20 64 61 74 61    8 bits of data
8560: 0a 2a 2a 0a 2a 2a 20 20 37 20 62 69 74 73 20 2d  .**.**  7 bits -
8570: 20 41 0a 2a 2a 20 31 34 20 62 69 74 73 20 2d 20   A.** 14 bits - 
8580: 42 41 0a 2a 2a 20 32 31 20 62 69 74 73 20 2d 20  BA.** 21 bits - 
8590: 42 42 41 0a 2a 2a 20 32 38 20 62 69 74 73 20 2d  BBA.** 28 bits -
85a0: 20 42 42 42 41 0a 2a 2a 20 33 35 20 62 69 74 73   BBBA.** 35 bits
85b0: 20 2d 20 42 42 42 42 41 0a 2a 2a 20 34 32 20 62   - BBBBA.** 42 b
85c0: 69 74 73 20 2d 20 42 42 42 42 42 41 0a 2a 2a 20  its - BBBBBA.** 
85d0: 34 39 20 62 69 74 73 20 2d 20 42 42 42 42 42 42  49 bits - BBBBBB
85e0: 41 0a 2a 2a 20 35 36 20 62 69 74 73 20 2d 20 42  A.** 56 bits - B
85f0: 42 42 42 42 42 42 41 0a 2a 2a 20 36 34 20 62 69  BBBBBBA.** 64 bi
8600: 74 73 20 2d 20 42 42 42 42 42 42 42 42 43 0a 2a  ts - BBBBBBBBC.*
8610: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  /../*.** Write a
8620: 20 36 34 2d 62 69 74 20 76 61 72 69 61 62 6c 65   64-bit variable
8630: 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20  -length integer 
8640: 74 6f 20 6d 65 6d 6f 72 79 20 73 74 61 72 74 69  to memory starti
8650: 6e 67 20 61 74 20 70 5b 30 5d 2e 0a 2a 2a 20 54  ng at p[0]..** T
8660: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 64 61 74  he length of dat
8670: 61 20 77 72 69 74 65 20 77 69 6c 6c 20 62 65 20  a write will be 
8680: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20  between 1 and 9 
8690: 62 79 74 65 73 2e 20 20 54 68 65 20 6e 75 6d 62  bytes.  The numb
86a0: 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 77  er.** of bytes w
86b0: 72 69 74 74 65 6e 20 69 73 20 72 65 74 75 72 6e  ritten is return
86c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 61 72 69  ed..**.** A vari
86d0: 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65  able-length inte
86e0: 67 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ger consists of 
86f0: 74 68 65 20 6c 6f 77 65 72 20 37 20 62 69 74 73  the lower 7 bits
8700: 20 6f 66 20 65 61 63 68 20 62 79 74 65 0a 2a 2a   of each byte.**
8710: 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 74   for all bytes t
8720: 68 61 74 20 68 61 76 65 20 74 68 65 20 38 74 68  hat have the 8th
8730: 20 62 69 74 20 73 65 74 20 61 6e 64 20 6f 6e 65   bit set and one
8740: 20 62 79 74 65 20 77 69 74 68 20 74 68 65 20 38   byte with the 8
8750: 74 68 0a 2a 2a 20 62 69 74 20 63 6c 65 61 72 2e  th.** bit clear.
8760: 20 20 45 78 63 65 70 74 2c 20 69 66 20 77 65 20    Except, if we 
8770: 67 65 74 20 74 6f 20 74 68 65 20 39 74 68 20 62  get to the 9th b
8780: 79 74 65 2c 20 69 74 20 73 74 6f 72 65 73 20 74  yte, it stores t
8790: 68 65 20 66 75 6c 6c 0a 2a 2a 20 38 20 62 69 74  he full.** 8 bit
87a0: 73 20 61 6e 64 20 69 73 20 74 68 65 20 6c 61 73  s and is the las
87b0: 74 20 62 79 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73  t byte..*/.int s
87c0: 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 28  qlite3PutVarint(
87d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
87e0: 2c 20 75 36 34 20 76 29 7b 0a 20 20 69 6e 74 20  , u64 v){.  int 
87f0: 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 62 75  i, j, n;.  u8 bu
8800: 66 5b 31 30 5d 3b 0a 20 20 69 66 28 20 76 20 26  f[10];.  if( v &
8810: 20 28 28 28 75 36 34 29 30 78 66 66 30 30 30 30   (((u64)0xff0000
8820: 30 30 29 3c 3c 33 32 29 20 29 7b 0a 20 20 20 20  00)<<32) ){.    
8830: 70 5b 38 5d 20 3d 20 76 3b 0a 20 20 20 20 76 20  p[8] = v;.    v 
8840: 3e 3e 3d 20 38 3b 0a 20 20 20 20 66 6f 72 28 69  >>= 8;.    for(i
8850: 3d 37 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  =7; i>=0; i--){.
8860: 20 20 20 20 20 20 70 5b 69 5d 20 3d 20 28 76 20        p[i] = (v 
8870: 26 20 30 78 37 66 29 20 7c 20 30 78 38 30 3b 0a  & 0x7f) | 0x80;.
8880: 20 20 20 20 20 20 76 20 3e 3e 3d 20 37 3b 0a 20        v >>= 7;. 
8890: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
88a0: 39 3b 0a 20 20 7d 20 20 20 20 0a 20 20 6e 20 3d  9;.  }    .  n =
88b0: 20 30 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 62 75   0;.  do{.    bu
88c0: 66 5b 6e 2b 2b 5d 20 3d 20 28 76 20 26 20 30 78  f[n++] = (v & 0x
88d0: 37 66 29 20 7c 20 30 78 38 30 3b 0a 20 20 20 20  7f) | 0x80;.    
88e0: 76 20 3e 3e 3d 20 37 3b 0a 20 20 7d 77 68 69 6c  v >>= 7;.  }whil
88f0: 65 28 20 76 21 3d 30 20 29 3b 0a 20 20 62 75 66  e( v!=0 );.  buf
8900: 5b 30 5d 20 26 3d 20 30 78 37 66 3b 0a 20 20 61  [0] &= 0x7f;.  a
8910: 73 73 65 72 74 28 20 6e 3c 3d 39 20 29 3b 0a 20  ssert( n<=9 );. 
8920: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 2d 31 3b   for(i=0, j=n-1;
8930: 20 6a 3e 3d 30 3b 20 6a 2d 2d 2c 20 69 2b 2b 29   j>=0; j--, i++)
8940: 7b 0a 20 20 20 20 70 5b 69 5d 20 3d 20 62 75 66  {.    p[i] = buf
8950: 5b 6a 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [j];.  }.  retur
8960: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n n;.}../*.** Re
8970: 61 64 20 61 20 36 34 2d 62 69 74 20 76 61 72 69  ad a 64-bit vari
8980: 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65  able-length inte
8990: 67 65 72 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20  ger from memory 
89a0: 73 74 61 72 74 69 6e 67 20 61 74 20 70 5b 30 5d  starting at p[0]
89b0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
89c0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
89d0: 72 65 61 64 2e 20 20 54 68 65 20 76 61 6c 75 65  read.  The value
89e0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 76   is stored in *v
89f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8a00: 47 65 74 56 61 72 69 6e 74 28 63 6f 6e 73 74 20  GetVarint(const 
8a10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8a20: 2c 20 75 36 34 20 2a 76 29 7b 0a 20 20 75 33 32  , u64 *v){.  u32
8a30: 20 78 3b 0a 20 20 75 36 34 20 78 36 34 3b 0a 20   x;.  u64 x64;. 
8a40: 20 69 6e 74 20 6e 3b 0a 20 20 75 6e 73 69 67 6e   int n;.  unsign
8a50: 65 64 20 63 68 61 72 20 63 3b 0a 20 20 69 66 28  ed char c;.  if(
8a60: 20 28 28 63 20 3d 20 70 5b 30 5d 29 20 26 20 30   ((c = p[0]) & 0
8a70: 78 38 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  x80)==0 ){.    *
8a80: 76 20 3d 20 63 3b 0a 20 20 20 20 72 65 74 75 72  v = c;.    retur
8a90: 6e 20 31 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 63  n 1;.  }.  x = c
8aa0: 20 26 20 30 78 37 66 3b 0a 20 20 69 66 28 20 28   & 0x7f;.  if( (
8ab0: 28 63 20 3d 20 70 5b 31 5d 29 20 26 20 30 78 38  (c = p[1]) & 0x8
8ac0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20  0)==0 ){.    *v 
8ad0: 3d 20 28 78 3c 3c 37 29 20 7c 20 63 3b 0a 20 20  = (x<<7) | c;.  
8ae0: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
8af0: 20 20 78 20 3d 20 28 78 3c 3c 37 29 20 7c 20 28    x = (x<<7) | (
8b00: 63 26 30 78 37 66 29 3b 0a 20 20 69 66 28 20 28  c&0x7f);.  if( (
8b10: 28 63 20 3d 20 70 5b 32 5d 29 20 26 20 30 78 38  (c = p[2]) & 0x8
8b20: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20  0)==0 ){.    *v 
8b30: 3d 20 28 78 3c 3c 37 29 20 7c 20 63 3b 0a 20 20  = (x<<7) | c;.  
8b40: 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 7d 0a    return 3;.  }.
8b50: 20 20 78 20 3d 20 28 78 3c 3c 37 29 20 7c 20 28    x = (x<<7) | (
8b60: 63 26 30 78 37 66 29 3b 0a 20 20 69 66 28 20 28  c&0x7f);.  if( (
8b70: 28 63 20 3d 20 70 5b 33 5d 29 20 26 20 30 78 38  (c = p[3]) & 0x8
8b80: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20  0)==0 ){.    *v 
8b90: 3d 20 28 78 3c 3c 37 29 20 7c 20 63 3b 0a 20 20  = (x<<7) | c;.  
8ba0: 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 7d 0a    return 4;.  }.
8bb0: 20 20 78 36 34 20 3d 20 28 78 3c 3c 37 29 20 7c    x64 = (x<<7) |
8bc0: 20 28 63 26 30 78 37 66 29 3b 0a 20 20 6e 20 3d   (c&0x7f);.  n =
8bd0: 20 34 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 20   4;.  do{.    c 
8be0: 3d 20 70 5b 6e 2b 2b 5d 3b 0a 20 20 20 20 69 66  = p[n++];.    if
8bf0: 28 20 6e 3d 3d 39 20 29 7b 0a 20 20 20 20 20 20  ( n==9 ){.      
8c00: 78 36 34 20 3d 20 28 78 36 34 3c 3c 38 29 20 7c  x64 = (x64<<8) |
8c10: 20 63 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   c;.      break;
8c20: 0a 20 20 20 20 7d 0a 20 20 20 20 78 36 34 20 3d  .    }.    x64 =
8c30: 20 28 78 36 34 3c 3c 37 29 20 7c 20 28 63 26 30   (x64<<7) | (c&0
8c40: 78 37 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  x7f);.  }while( 
8c50: 28 63 20 26 20 30 78 38 30 29 21 3d 30 20 29 3b  (c & 0x80)!=0 );
8c60: 0a 20 20 2a 76 20 3d 20 78 36 34 3b 0a 20 20 72  .  *v = x64;.  r
8c70: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
8c80: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
8c90: 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20  variable-length 
8ca0: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 6d 65 6d  integer from mem
8cb0: 6f 72 79 20 73 74 61 72 74 69 6e 67 20 61 74 20  ory starting at 
8cc0: 70 5b 30 5d 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  p[0]..** Return 
8cd0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8ce0: 74 65 73 20 72 65 61 64 2e 20 20 54 68 65 20 76  tes read.  The v
8cf0: 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20 69  alue is stored i
8d00: 6e 20 2a 76 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  n *v..*/.int sql
8d10: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
8d20: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8d30: 68 61 72 20 2a 70 2c 20 75 33 32 20 2a 76 29 7b  har *p, u32 *v){
8d40: 0a 20 20 75 33 32 20 78 3b 0a 20 20 69 6e 74 20  .  u32 x;.  int 
8d50: 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  n;.  unsigned ch
8d60: 61 72 20 63 3b 0a 20 20 69 66 28 20 28 28 73 69  ar c;.  if( ((si
8d70: 67 6e 65 64 20 63 68 61 72 2a 29 70 29 5b 30 5d  gned char*)p)[0]
8d80: 3e 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20 3d 20  >=0 ){.    *v = 
8d90: 70 5b 30 5d 3b 0a 20 20 20 20 72 65 74 75 72 6e  p[0];.    return
8da0: 20 31 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 70 5b   1;.  }.  x = p[
8db0: 30 5d 20 26 20 30 78 37 66 3b 0a 20 20 69 66 28  0] & 0x7f;.  if(
8dc0: 20 28 28 73 69 67 6e 65 64 20 63 68 61 72 2a 29   ((signed char*)
8dd0: 70 29 5b 31 5d 3e 3d 30 20 29 7b 0a 20 20 20 20  p)[1]>=0 ){.    
8de0: 2a 76 20 3d 20 28 78 3c 3c 37 29 20 7c 20 70 5b  *v = (x<<7) | p[
8df0: 31 5d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32  1];.    return 2
8e00: 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 28 78 3c 3c  ;.  }.  x = (x<<
8e10: 37 29 20 7c 20 28 70 5b 31 5d 20 26 20 30 78 37  7) | (p[1] & 0x7
8e20: 66 29 3b 0a 20 20 6e 20 3d 20 32 3b 0a 20 20 64  f);.  n = 2;.  d
8e30: 6f 7b 0a 20 20 20 20 78 20 3d 20 28 78 3c 3c 37  o{.    x = (x<<7
8e40: 29 20 7c 20 28 28 63 20 3d 20 70 5b 6e 2b 2b 5d  ) | ((c = p[n++]
8e50: 29 26 30 78 37 66 29 3b 0a 20 20 7d 77 68 69 6c  )&0x7f);.  }whil
8e60: 65 28 20 28 63 20 26 20 30 78 38 30 29 21 3d 30  e( (c & 0x80)!=0
8e70: 20 26 26 20 6e 3c 39 20 29 3b 0a 20 20 2a 76 20   && n<9 );.  *v 
8e80: 3d 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  = x;.  return n;
8e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8ea0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8eb0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ytes that will b
8ec0: 65 20 6e 65 65 64 65 64 20 74 6f 20 73 74 6f 72  e needed to stor
8ed0: 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 36  e the given.** 6
8ee0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  4-bit integer..*
8ef0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 61 72  /.int sqlite3Var
8f00: 69 6e 74 4c 65 6e 28 75 36 34 20 76 29 7b 0a 20  intLen(u64 v){. 
8f10: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 64 6f   int i = 0;.  do
8f20: 7b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 76  {.    i++;.    v
8f30: 20 3e 3e 3d 20 37 3b 0a 20 20 7d 77 68 69 6c 65   >>= 7;.  }while
8f40: 28 20 76 21 3d 30 20 26 26 20 69 3c 39 20 29 3b  ( v!=0 && i<9 );
8f50: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
8f60: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8f70: 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
8f80: 54 45 52 41 4c 29 20 7c 7c 20 64 65 66 69 6e 65  TERAL) || define
8f90: 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
8fa0: 45 43 29 20 5c 0a 20 20 20 20 7c 7c 20 64 65 66  EC) \.    || def
8fb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
8fc0: 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  )./*.** Translat
8fd0: 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  e a single byte 
8fe0: 6f 66 20 48 65 78 20 69 6e 74 6f 20 61 6e 20 69  of Hex into an i
8ff0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
9000: 63 20 69 6e 74 20 68 65 78 54 6f 49 6e 74 28 69  c int hexToInt(i
9010: 6e 74 20 68 29 7b 0a 20 20 69 66 28 20 68 3e 3d  nt h){.  if( h>=
9020: 27 30 27 20 26 26 20 68 3c 3d 27 39 27 20 29 7b  '0' && h<='9' ){
9030: 0a 20 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20  .    return h - 
9040: 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  '0';.  }else if(
9050: 20 68 3e 3d 27 61 27 20 26 26 20 68 3c 3d 27 66   h>='a' && h<='f
9060: 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ' ){.    return 
9070: 68 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20  h - 'a' + 10;.  
9080: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
9090: 74 28 20 68 3e 3d 27 41 27 20 26 26 20 68 3c 3d  t( h>='A' && h<=
90a0: 27 46 27 20 29 3b 0a 20 20 20 20 72 65 74 75 72  'F' );.    retur
90b0: 6e 20 68 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a  n h - 'A' + 10;.
90c0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
90d0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f  !SQLITE_OMIT_BLO
90e0: 42 5f 4c 49 54 45 52 41 4c 20 7c 7c 20 53 51 4c  B_LITERAL || SQL
90f0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c 7c  ITE_HAS_CODEC ||
9100: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
9110: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9120: 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
9130: 49 54 45 52 41 4c 29 20 7c 7c 20 64 65 66 69 6e  ITERAL) || defin
9140: 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
9150: 44 45 43 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  DEC)./*.** Conve
9160: 72 74 20 61 20 42 4c 4f 42 20 6c 69 74 65 72 61  rt a BLOB litera
9170: 6c 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78  l of the form "x
9180: 27 68 68 68 68 68 68 27 22 20 69 6e 74 6f 20 69  'hhhhhh'" into i
9190: 74 73 20 62 69 6e 61 72 79 0a 2a 2a 20 76 61 6c  ts binary.** val
91a0: 75 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ue.  Return a po
91b0: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 62 69 6e  inter to its bin
91c0: 61 72 79 20 76 61 6c 75 65 2e 20 20 53 70 61 63  ary value.  Spac
91d0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  e to hold the.**
91e0: 20 62 69 6e 61 72 79 20 76 61 6c 75 65 20 68 61   binary value ha
91f0: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
9200: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
9210: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
9220: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  .** the calling 
9230: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64  routine..*/.void
9240: 20 2a 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c   *sqlite3HexToBl
9250: 6f 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ob(const char *z
9260: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62  ){.  char *zBlob
9270: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
9280: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
9290: 20 20 69 66 28 20 6e 25 32 20 29 20 72 65 74 75    if( n%2 ) retu
92a0: 72 6e 20 30 3b 0a 0a 20 20 7a 42 6c 6f 62 20 3d  rn 0;..  zBlob =
92b0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
92c0: 61 6c 6c 6f 63 28 6e 2f 32 29 3b 0a 20 20 66 6f  alloc(n/2);.  fo
92d0: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 3d 32  r(i=0; i<n; i+=2
92e0: 29 7b 0a 20 20 20 20 7a 42 6c 6f 62 5b 69 2f 32  ){.    zBlob[i/2
92f0: 5d 20 3d 20 28 68 65 78 54 6f 49 6e 74 28 7a 5b  ] = (hexToInt(z[
9300: 69 5d 29 3c 3c 34 29 20 7c 20 68 65 78 54 6f 49  i])<<4) | hexToI
9310: 6e 74 28 7a 5b 69 2b 31 5d 29 3b 0a 20 20 7d 0a  nt(z[i+1]);.  }.
9320: 20 20 72 65 74 75 72 6e 20 7a 42 6c 6f 62 3b 0a    return zBlob;.
9330: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
9340: 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
9350: 54 45 52 41 4c 20 7c 7c 20 53 51 4c 49 54 45 5f  TERAL || SQLITE_
9360: 48 41 53 5f 43 4f 44 45 43 20 2a 2f 0a 0a 23 69  HAS_CODEC */..#i
9370: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
9380: 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e  _TEST)./*.** Con
9390: 76 65 72 74 20 74 65 78 74 20 67 65 6e 65 72 61  vert text genera
93a0: 74 65 64 20 62 79 20 74 68 65 20 22 25 70 22 20  ted by the "%p" 
93b0: 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61  conversion forma
93c0: 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61  t back into.** a
93d0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69   pointer..*/.voi
93e0: 64 20 2a 73 71 6c 69 74 65 33 54 65 78 74 54 6f  d *sqlite3TextTo
93f0: 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ptr(const char *
9400: 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  z){.  void *p;. 
9410: 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32   u64 v;.  u32 v2
9420: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30  ;.  if( z[0]=='0
9430: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29  ' && z[1]=='x' )
9440: 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  {.    z += 2;.  
9450: 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  }.  v = 0;.  whi
9460: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20  le( *z ){.    v 
9470: 3d 20 28 76 3c 3c 34 29 20 2b 20 68 65 78 54 6f  = (v<<4) + hexTo
9480: 49 6e 74 28 2a 7a 29 3b 0a 20 20 20 20 7a 2b 2b  Int(*z);.    z++
9490: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
94a0: 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 29  of(p)==sizeof(v)
94b0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 2a 28 76 6f   ){.    p = *(vo
94c0: 69 64 2a 2a 29 26 76 3b 0a 20 20 7d 65 6c 73 65  id**)&v;.  }else
94d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  {.    assert( si
94e0: 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28  zeof(p)==sizeof(
94f0: 76 32 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20  v2) );.    v2 = 
9500: 28 75 33 32 29 76 3b 0a 20 20 20 20 70 20 3d 20  (u32)v;.    p = 
9510: 2a 28 76 6f 69 64 2a 2a 29 26 76 32 3b 0a 20 20  *(void**)&v2;.  
9520: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
9530: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
9540: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
9550: 6f 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61  o the ThreadData
9560: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9570: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 74 68 72   the calling thr
9580: 65 61 64 2e 0a 2a 2f 0a 54 68 72 65 61 64 44 61  ead..*/.ThreadDa
9590: 74 61 20 2a 73 71 6c 69 74 65 33 54 68 72 65 61  ta *sqlite3Threa
95a0: 64 44 61 74 61 28 29 7b 0a 20 20 72 65 74 75 72  dData(){.  retur
95b0: 6e 20 28 54 68 72 65 61 64 44 61 74 61 2a 29 73  n (ThreadData*)s
95c0: 71 6c 69 74 65 33 4f 73 54 68 72 65 61 64 53 70  qlite3OsThreadSp
95d0: 65 63 69 66 69 63 44 61 74 61 28 31 29 3b 0a 7d  ecificData(1);.}
95e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
95f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
9600: 54 68 72 65 61 64 44 61 74 61 20 61 73 73 6f 63  ThreadData assoc
9610: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63  iated with the c
9620: 61 6c 6c 69 6e 67 20 74 68 72 65 61 64 2e 0a 2a  alling thread..*
9630: 2a 20 49 66 20 6e 6f 20 54 68 72 65 61 64 44 61  * If no ThreadDa
9640: 74 61 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ta has been allo
9650: 63 61 74 65 64 20 74 6f 20 74 68 69 73 20 74 68  cated to this th
9660: 72 65 61 64 20 79 65 74 2c 20 72 65 74 75 72 6e  read yet, return
9670: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
9680: 20 61 20 73 75 62 73 74 69 74 75 74 65 20 54 68   a substitute Th
9690: 72 65 61 64 44 61 74 61 20 73 74 72 75 63 74 75  readData structu
96a0: 72 65 20 74 68 61 74 20 69 73 20 61 6c 6c 20 7a  re that is all z
96b0: 65 72 6f 73 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  eros. .*/.const 
96c0: 54 68 72 65 61 64 44 61 74 61 20 2a 73 71 6c 69  ThreadData *sqli
96d0: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
96e0: 64 4f 6e 6c 79 28 29 7b 0a 20 20 73 74 61 74 69  dOnly(){.  stati
96f0: 63 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61  c const ThreadDa
9700: 74 61 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20 63  ta zeroData;.  c
9710: 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20  onst ThreadData 
9720: 2a 70 54 64 20 3d 20 73 71 6c 69 74 65 33 4f 73  *pTd = sqlite3Os
9730: 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
9740: 74 61 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ta(0);.  return 
9750: 70 54 64 20 3f 20 70 54 64 20 3a 20 26 7a 65 72  pTd ? pTd : &zer
9760: 6f 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oData;.}../*.** 
9770: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
9780: 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 66  the ThreadData f
9790: 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20 69  or this thread i
97a0: 73 20 61 6c 6c 20 7a 65 72 6f 2e 20 20 49 66 20  s all zero.  If 
97b0: 69 74 0a 2a 2a 20 69 73 2c 20 74 68 65 6e 20 64  it.** is, then d
97c0: 65 61 6c 6c 6f 63 61 74 65 20 69 74 2e 20 0a 2a  eallocate it. .*
97d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
97e0: 6c 65 61 73 65 54 68 72 65 61 64 44 61 74 61 28  leaseThreadData(
97f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 4f 73 54 68  ){.  sqlite3OsTh
9800: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
9810: 28 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (-1);.}../*.** T
9820: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
9830: 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
9840: 72 65 20 65 78 69 74 69 6e 67 20 61 6e 79 20 41  re exiting any A
9850: 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65  PI function (i.e
9860: 2e 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20  . .** returning 
9870: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75  control to the u
9880: 73 65 72 29 20 74 68 61 74 20 68 61 73 20 63 61  ser) that has ca
9890: 6c 6c 65 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c  lled sqlite3Mall
98a0: 6f 63 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 33  oc or.** sqlite3
98b0: 52 65 61 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20 54  Realloc..**.** T
98c0: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
98d0: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  e is normally a 
98e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
98f0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
9900: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
9910: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 61 20 6d   However, if a m
9920: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20  alloc() failure 
9930: 68 61 73 20 6f 63 63 75 72 65 64 20 73 69 6e 63  has occured sinc
9940: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  e the previous.*
9950: 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 53 51 4c  * invocation SQL
9960: 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
9970: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 20 0a  urned instead. .
9980: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 72  **.** If the fir
9990: 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 64 62 2c  st argument, db,
99a0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
99b0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f   a malloc() erro
99c0: 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c 0a 2a  r has occured,.*
99d0: 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 6e 65  * then the conne
99e0: 63 74 69 6f 6e 20 65 72 72 6f 72 2d 63 6f 64 65  ction error-code
99f0: 20 28 74 68 65 20 76 61 6c 75 65 20 72 65 74 75   (the value retu
9a00: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  rned by sqlite3_
9a10: 65 72 72 63 6f 64 65 28 29 29 0a 2a 2a 20 69 73  errcode()).** is
9a20: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
9a30: 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OMEM..*/.int sql
9a40: 69 74 65 33 41 70 69 45 78 69 74 28 73 71 6c 69  ite3ApiExit(sqli
9a50: 74 65 33 2a 20 64 62 2c 20 69 6e 74 20 72 63 29  te3* db, int rc)
9a60: 7b 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a  {.  ThreadData *
9a70: 70 54 64 20 3d 20 73 71 6c 69 74 65 33 4f 73 54  pTd = sqlite3OsT
9a80: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
9a90: 61 28 30 29 3b 0a 20 20 69 66 28 20 70 54 64 20  a(0);.  if( pTd 
9aa0: 26 26 20 70 54 64 2d 3e 6d 61 6c 6c 6f 63 46 61  && pTd->mallocFa
9ab0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 54 64 2d  iled ){.    pTd-
9ac0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
9ad0: 30 3b 0a 20 20 20 20 69 66 28 20 64 62 20 29 7b  0;.    if( db ){
9ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9af0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4e  ror(db, SQLITE_N
9b00: 4f 4d 45 4d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  OMEM, 0);.    }.
9b10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9b20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
9b30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
9b40: 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  def SQLITE_MEMDE
9b50: 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
9b60: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20 66  unction sets a f
9b70: 6c 61 67 20 69 6e 20 74 68 65 20 74 68 72 65 61  lag in the threa
9b80: 64 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61 20  d-specific-data 
9b90: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
9ba0: 69 6c 6c 0a 2a 2a 20 63 61 75 73 65 20 61 6e 20  ill.** cause an 
9bb0: 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 20 69  assert to fail i
9bc0: 66 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  f sqliteMalloc()
9bd0: 20 6f 72 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f   or sqliteReallo
9be0: 63 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  c() is called..*
9bf0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61  /.void sqlite3Ma
9c00: 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29 7b 0a  llocDisallow(){.
9c10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9c20: 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d  3ThreadData()->m
9c30: 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 65 64 3e  allocDisallowed>
9c40: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 54  =0 );.  sqlite3T
9c50: 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61 6c  hreadData()->mal
9c60: 6c 6f 63 44 69 73 61 6c 6c 6f 77 65 64 2b 2b 3b  locDisallowed++;
9c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9c80: 75 6e 63 74 69 6f 6e 20 63 6c 65 61 72 73 20 74  unction clears t
9c90: 68 65 20 66 6c 61 67 20 73 65 74 20 69 6e 20 74  he flag set in t
9ca0: 68 65 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  he thread-specif
9cb0: 69 63 2d 64 61 74 61 20 73 74 72 75 63 74 75 72  ic-data structur
9cc0: 65 20 73 65 74 0a 2a 2a 20 62 79 20 73 71 6c 69  e set.** by sqli
9cd0: 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f  te3MallocDisallo
9ce0: 77 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  w()..*/.void sql
9cf0: 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28  ite3MallocAllow(
9d00: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
9d10: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
9d20: 2d 3e 6d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77  ->mallocDisallow
9d30: 65 64 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  ed>0 );.  sqlite
9d40: 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d  3ThreadData()->m
9d50: 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 65 64 2d  allocDisallowed-
9d60: 2d 3b 0a 7d 0a 23 65 6e 64 69 66 0a              -;.}.#endif.