/ Hex Artifact Content
Login

Artifact 264083f0de25b92c362e88a23402cc76e93613ba:


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: 36 35 20 32 30 30 36 2f 30 31 2f 31 30 20 30 37  65 2006/01/10 07
0230: 3a 31 34 3a 32 34 20 64 61 6e 69 65 6c 6b 31 39  :14:24 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 21  ?(x):(y))..#if !
08e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
08f0: 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  MIT_MEMORY_MANAG
0900: 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e  EMENT) && !defin
0910: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
0920: 49 53 4b 49 4f 29 0a 2f 2a 0a 2a 2a 20 53 65 74  ISKIO)./*.** Set
0930: 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 2d 73   the soft heap-s
0940: 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 74 68  ize limit for th
0950: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
0960: 2e 20 50 61 73 73 69 6e 67 20 61 20 6e 65 67 61  . Passing a nega
0970: 74 69 76 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e  tive.** value in
0980: 64 69 63 61 74 65 73 20 6e 6f 20 6c 69 6d 69 74  dicates no limit
0990: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
09a0: 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
09b0: 74 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 6e  t(sqlite_int64 n
09c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 54 68 72 65  ){.  sqlite3Thre
09d0: 61 64 44 61 74 61 28 29 2d 3e 6e 53 6f 66 74 48  adData()->nSoftH
09e0: 65 61 70 4c 69 6d 69 74 20 3d 20 6e 3b 0a 7d 0a  eapLimit = n;.}.
09f0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d  ./*.** Release m
0a00: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 53 51  emory held by SQ
0a10: 4c 69 74 65 20 69 6e 73 74 61 6e 63 65 73 20 63  Lite instances c
0a20: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 63 75  reated by the cu
0a30: 72 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2f  rrent thread..*/
0a40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6c  .int sqlite3_rel
0a50: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20  ease_memory(int 
0a60: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  n){.  return sql
0a70: 69 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61 73  ite3pager_releas
0a80: 65 5f 6d 65 6d 6f 72 79 28 6e 29 3b 0a 7d 0a 23  e_memory(n);.}.#
0a90: 65 6c 73 65 0a 2f 2a 20 49 66 20 53 51 4c 49 54  else./* If SQLIT
0aa0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41  E_OMIT_MEMORY_MA
0ab0: 4e 41 47 45 4d 45 4e 54 20 69 73 20 64 65 66 69  NAGEMENT is defi
0ac0: 6e 65 64 2c 20 74 68 65 6e 20 64 65 66 69 6e 65  ned, then define
0ad0: 20 61 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66   a version.** of
0ae0: 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
0af0: 5f 6d 65 6d 6f 72 79 28 29 20 74 6f 20 62 65 20  _memory() to be 
0b00: 75 73 65 64 20 62 79 20 6f 74 68 65 72 20 63 6f  used by other co
0b10: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  de in this file.
0b20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65  .** This is done
0b30: 20 66 6f 72 20 6e 6f 20 62 65 74 74 65 72 20 72   for no better r
0b40: 65 61 73 6f 6e 20 74 68 61 6e 20 74 6f 20 72 65  eason than to re
0b50: 64 75 63 65 20 74 68 65 20 6e 75 6d 62 65 72 20  duce the number 
0b60: 6f 66 20 0a 2a 2a 20 70 72 65 2d 70 72 6f 63 65  of .** pre-proce
0b70: 73 73 6f 72 20 23 69 66 6e 64 65 66 20 73 74 61  ssor #ifndef sta
0b80: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66  tements..*/.#def
0b90: 69 6e 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65  ine sqlite3_rele
0ba0: 61 73 65 5f 6d 65 6d 6f 72 79 28 78 29 20 30 20  ase_memory(x) 0 
0bb0: 20 20 20 2f 2a 20 30 20 3d 3d 20 6e 6f 20 6d 65     /* 0 == no me
0bc0: 6d 6f 72 79 20 66 72 65 65 64 20 2a 2f 0a 23 65  mory freed */.#e
0bd0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
0be0: 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 2f 2a 2d  ITE_MEMDEBUG./*-
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 2a 2a 20 42 65 67  ---------.** Beg
0c40: 69 6e 20 63 6f 64 65 20 66 6f 72 20 6d 65 6d 6f  in code for memo
0c50: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 79  ry allocation sy
0c60: 73 74 65 6d 20 74 65 73 74 20 6c 61 79 65 72 2e  stem test layer.
0c70: 0a 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 64 65  .**.** Memory de
0c80: 62 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65  bugging is turne
0c90: 64 20 6f 6e 20 62 79 20 64 65 66 69 6e 69 6e 67  d on by defining
0ca0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 45 4d 44   the SQLITE_MEMD
0cb0: 45 42 55 47 20 6d 61 63 72 6f 2e 0a 2a 2a 0a 2a  EBUG macro..**.*
0cc0: 2a 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  * SQLITE_MEMDEBU
0cd0: 47 3d 3d 31 20 20 20 20 2d 3e 20 46 65 6e 63 65  G==1    -> Fence
0ce0: 2d 70 6f 73 74 69 6e 67 20 6f 6e 6c 79 20 28 74  -posting only (t
0cf0: 68 72 65 61 64 20 73 61 66 65 29 20 0a 2a 2a 20  hread safe) .** 
0d00: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3d  SQLITE_MEMDEBUG=
0d10: 3d 32 20 20 20 20 2d 3e 20 46 65 6e 63 65 2d 70  =2    -> Fence-p
0d20: 6f 73 74 69 6e 67 20 2b 20 6c 69 6e 6b 65 64 20  osting + linked 
0d30: 6c 69 73 74 20 6f 66 20 61 6c 6c 6f 63 61 74 69  list of allocati
0d40: 6f 6e 73 20 28 6e 6f 74 20 74 73 29 0a 2a 2a 20  ons (not ts).** 
0d50: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3d  SQLITE_MEMDEBUG=
0d60: 3d 33 20 20 20 20 2d 3e 20 41 62 6f 76 65 20 2b  =3    -> Above +
0d70: 20 62 61 63 6b 74 72 61 63 65 73 20 28 6e 6f 74   backtraces (not
0d80: 20 74 68 72 65 61 64 20 73 61 66 65 2c 20 72 65   thread safe, re
0d90: 71 2e 20 67 6c 69 62 63 29 0a 2a 2f 0a 0a 2f 2a  q. glibc).*/../*
0da0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
0db0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 73 74  her or not to st
0dc0: 6f 72 65 20 62 61 63 6b 74 72 61 63 65 28 29 20  ore backtrace() 
0dd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
0de0: 65 61 63 68 20 6d 61 6c 6c 6f 63 2e 0a 2a 2a 20  each malloc..** 
0df0: 54 68 65 20 62 61 63 6b 74 72 61 63 65 28 29 20  The backtrace() 
0e00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
0e10: 20 75 73 65 64 20 69 66 20 53 51 4c 49 54 45 5f   used if SQLITE_
0e20: 4d 45 4d 44 45 42 55 47 20 69 73 20 73 65 74 20  MEMDEBUG is set 
0e30: 74 6f 20 32 20 6f 72 20 0a 2a 2a 20 67 72 65 61  to 2 or .** grea
0e40: 74 65 72 20 61 6e 64 20 67 6c 69 62 63 20 69 73  ter and glibc is
0e50: 20 69 6e 20 75 73 65 2e 20 49 66 20 77 65 20 64   in use. If we d
0e60: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 75 73 65  on't want to use
0e70: 20 62 61 63 6b 74 72 61 63 65 28 29 2c 20 74 68   backtrace(), th
0e80: 65 6e 20 6a 75 73 74 0a 2a 2a 20 64 65 66 69 6e  en just.** defin
0e90: 65 20 69 74 20 61 73 20 61 6e 20 65 6d 70 74 79  e it as an empty
0ea0: 20 6d 61 63 72 6f 20 61 6e 64 20 73 65 74 20 74   macro and set t
0eb0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
0ec0: 63 65 20 72 65 73 65 72 76 65 64 20 74 6f 20 30  ce reserved to 0
0ed0: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
0ee0: 28 5f 5f 47 4c 49 42 43 5f 5f 29 20 26 26 20 53  (__GLIBC__) && S
0ef0: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3e 32  QLITE_MEMDEBUG>2
0f00: 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 62 61  .  extern int ba
0f10: 63 6b 74 72 61 63 65 28 76 6f 69 64 20 2a 2a 2c  cktrace(void **,
0f20: 20 69 6e 74 29 3b 0a 20 20 23 64 65 66 69 6e 65   int);.  #define
0f30: 20 54 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b   TESTALLOC_STACK
0f40: 53 49 5a 45 20 31 32 38 0a 20 20 23 64 65 66 69  SIZE 128.  #defi
0f50: 6e 65 20 54 45 53 54 41 4c 4c 4f 43 5f 53 54 41  ne TESTALLOC_STA
0f60: 43 4b 46 52 41 4d 45 53 20 28 28 54 45 53 54 41  CKFRAMES ((TESTA
0f70: 4c 4c 4f 43 5f 53 54 41 43 4b 53 49 5a 45 2d 38  LLOC_STACKSIZE-8
0f80: 29 2f 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29  )/sizeof(void*))
0f90: 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
0fa0: 20 62 61 63 6b 74 72 61 63 65 28 78 2c 20 79 29   backtrace(x, y)
0fb0: 0a 20 20 23 64 65 66 69 6e 65 20 54 45 53 54 41  .  #define TESTA
0fc0: 4c 4c 4f 43 5f 53 54 41 43 4b 53 49 5a 45 20 30  LLOC_STACKSIZE 0
0fd0: 0a 20 20 23 64 65 66 69 6e 65 20 54 45 53 54 41  .  #define TESTA
0fe0: 4c 4c 4f 43 5f 53 54 41 43 4b 46 52 41 4d 45 53  LLOC_STACKFRAMES
0ff0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
1000: 20 4e 75 6d 62 65 72 20 6f 66 20 33 32 2d 62 69   Number of 32-bi
1010: 74 20 67 75 61 72 64 20 77 6f 72 64 73 2e 20 20  t guard words.  
1020: 54 68 69 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  This should prob
1030: 61 62 6c 79 20 62 65 20 61 20 6d 75 6c 74 69 70  ably be a multip
1040: 6c 65 20 6f 66 0a 2a 2a 20 32 20 73 69 6e 63 65  le of.** 2 since
1050: 20 6f 6e 20 36 34 2d 62 69 74 20 6d 61 63 68 69   on 64-bit machi
1060: 6e 65 73 20 77 65 20 77 61 6e 74 20 74 68 65 20  nes we want the 
1070: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
1080: 79 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  y sqliteMalloc()
1090: 0a 2a 2a 20 74 6f 20 62 65 20 38 2d 62 79 74 65  .** to be 8-byte
10a0: 20 61 6c 69 67 6e 65 64 2e 0a 2a 2f 0a 23 64 65   aligned..*/.#de
10b0: 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43 5f 4e  fine TESTALLOC_N
10c0: 47 55 41 52 44 20 32 0a 0a 2f 2a 0a 2a 2a 20 53  GUARD 2../*.** S
10d0: 69 7a 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ize reserved for
10e0: 20 73 74 6f 72 69 6e 67 20 66 69 6c 65 2d 6e 61   storing file-na
10f0: 6d 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  me along with ea
1100: 63 68 20 6d 61 6c 6c 6f 63 28 29 65 64 20 62 6c  ch malloc()ed bl
1110: 6f 62 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ob..*/.#define T
1120: 45 53 54 41 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a  ESTALLOC_FILESIZ
1130: 45 20 36 34 0a 0a 2f 2a 0a 2a 2a 20 53 69 7a 65  E 64../*.** Size
1140: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 73 74   reserved for st
1150: 6f 72 69 6e 67 20 74 68 65 20 75 73 65 72 20 73  oring the user s
1160: 74 72 69 6e 67 2e 20 45 61 63 68 20 74 69 6d 65  tring. Each time
1170: 20 61 20 4d 61 6c 6c 6f 63 28 29 20 6f 72 20 52   a Malloc() or R
1180: 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 63 61 6c 6c  ealloc().** call
1190: 20 73 75 63 63 65 65 64 73 2c 20 75 70 20 74 6f   succeeds, up to
11a0: 20 54 45 53 54 41 4c 4c 4f 43 5f 55 53 45 52 53   TESTALLOC_USERS
11b0: 49 5a 45 20 62 79 74 65 73 20 6f 66 20 74 68 65  IZE bytes of the
11c0: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
11d0: 74 6f 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  to by.** sqlite3
11e0: 5f 6d 61 6c 6c 6f 63 5f 69 64 20 61 72 65 20 73  _malloc_id are s
11f0: 74 6f 72 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  tored along with
1200: 20 74 68 65 20 6f 74 68 65 72 20 74 65 73 74 20   the other test 
1210: 73 79 73 74 65 6d 20 6d 65 74 61 64 61 74 61 2e  system metadata.
1220: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 53 54  .*/.#define TEST
1230: 41 4c 4c 4f 43 5f 55 53 45 52 53 49 5a 45 20 36  ALLOC_USERSIZE 6
1240: 34 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  4.const char *sq
1250: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 69 64 20  lite3_malloc_id 
1260: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 42 6c 6f 63  = 0;../*.** Bloc
1270: 6b 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  ks used by the t
1280: 65 73 74 20 6c 61 79 65 72 20 68 61 76 65 20 74  est layer have t
1290: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
12a0: 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  mat:.**.**      
12b0: 20 20 3c 73 69 7a 65 6f 66 28 76 6f 69 64 20 2a    <sizeof(void *
12c0: 29 20 70 4e 65 78 74 20 70 6f 69 6e 74 65 72 3e  ) pNext pointer>
12d0: 0a 2a 2a 20 20 20 20 20 20 20 20 3c 73 69 7a 65  .**        <size
12e0: 6f 66 28 76 6f 69 64 20 2a 29 20 70 50 72 65 76  of(void *) pPrev
12f0: 20 70 6f 69 6e 74 65 72 3e 0a 2a 2a 20 20 20 20   pointer>.**    
1300: 20 20 20 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e      <TESTALLOC_N
1310: 47 55 41 52 44 20 33 32 2d 62 69 74 20 67 75 61  GUARD 32-bit gua
1320: 72 64 20 77 6f 72 64 73 3e 0a 2a 2a 20 20 20 20  rd words>.**    
1330: 20 20 20 20 20 20 20 20 3c 54 68 65 20 61 70 70          <The app
1340: 6c 69 63 61 74 69 6f 6e 20 6c 65 76 65 6c 20 61  lication level a
1350: 6c 6c 6f 63 61 74 69 6f 6e 3e 0a 2a 2a 20 20 20  llocation>.**   
1360: 20 20 20 20 20 3c 54 45 53 54 41 4c 4c 4f 43 5f       <TESTALLOC_
1370: 4e 47 55 41 52 44 20 33 32 2d 62 69 74 20 67 75  NGUARD 32-bit gu
1380: 61 72 64 20 77 6f 72 64 73 3e 0a 2a 2a 20 20 20  ard words>.**   
1390: 20 20 20 20 20 3c 33 32 2d 62 69 74 20 6c 69 6e       <32-bit lin
13a0: 65 20 6e 75 6d 62 65 72 3e 0a 2a 2a 20 20 20 20  e number>.**    
13b0: 20 20 20 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 46      <TESTALLOC_F
13c0: 49 4c 45 53 49 5a 45 20 62 79 74 65 73 20 63 6f  ILESIZE bytes co
13d0: 6e 74 61 69 6e 69 6e 67 20 6e 75 6c 6c 2d 74 65  ntaining null-te
13e0: 72 6d 69 6e 61 74 65 64 20 66 69 6c 65 20 6e 61  rminated file na
13f0: 6d 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 3c 54  me>.**        <T
1400: 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 53 49  ESTALLOC_STACKSI
1410: 5a 45 20 62 79 74 65 73 20 6f 66 20 62 61 63 6b  ZE bytes of back
1420: 74 72 61 63 65 28 29 20 6f 75 74 70 75 74 3e 0a  trace() output>.
1430: 2a 2f 20 0a 0a 23 64 65 66 69 6e 65 20 54 45 53  */ ..#define TES
1440: 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 47 55  TALLOC_OFFSET_GU
1450: 41 52 44 31 28 70 29 20 20 20 20 28 73 69 7a 65  ARD1(p)    (size
1460: 6f 66 28 76 6f 69 64 20 2a 29 20 2a 20 32 29 0a  of(void *) * 2).
1470: 23 64 65 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f  #define TESTALLO
1480: 43 5f 4f 46 46 53 45 54 5f 44 41 54 41 28 70 29  C_OFFSET_DATA(p)
1490: 20 28 20 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43   ( \.  TESTALLOC
14a0: 5f 4f 46 46 53 45 54 5f 47 55 41 52 44 31 28 70  _OFFSET_GUARD1(p
14b0: 29 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20  ) + sizeof(u32) 
14c0: 2a 20 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41  * TESTALLOC_NGUA
14d0: 52 44 20 5c 0a 29 0a 23 64 65 66 69 6e 65 20 54  RD \.).#define T
14e0: 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f  ESTALLOC_OFFSET_
14f0: 47 55 41 52 44 32 28 70 29 20 28 20 5c 0a 20 20  GUARD2(p) ( \.  
1500: 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54  TESTALLOC_OFFSET
1510: 5f 44 41 54 41 28 70 29 20 2b 20 73 71 6c 69 74  _DATA(p) + sqlit
1520: 65 33 4f 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69  e3OsAllocationSi
1530: 7a 65 28 70 29 20 2d 20 54 45 53 54 41 4c 4c 4f  ze(p) - TESTALLO
1540: 43 5f 4f 56 45 52 48 45 41 44 20 5c 0a 29 0a 23  C_OVERHEAD \.).#
1550: 64 65 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43  define TESTALLOC
1560: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 55 4d 42  _OFFSET_LINENUMB
1570: 45 52 28 70 29 20 28 20 5c 0a 20 20 54 45 53 54  ER(p) ( \.  TEST
1580: 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 47 55 41  ALLOC_OFFSET_GUA
1590: 52 44 32 28 70 29 20 2b 20 73 69 7a 65 6f 66 28  RD2(p) + sizeof(
15a0: 75 33 32 29 20 2a 20 54 45 53 54 41 4c 4c 4f 43  u32) * TESTALLOC
15b0: 5f 4e 47 55 41 52 44 20 5c 0a 29 0a 23 64 65 66  _NGUARD \.).#def
15c0: 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 46  ine TESTALLOC_OF
15d0: 46 53 45 54 5f 46 49 4c 45 4e 41 4d 45 28 70 29  FSET_FILENAME(p)
15e0: 20 28 20 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43   ( \.  TESTALLOC
15f0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 55 4d 42  _OFFSET_LINENUMB
1600: 45 52 28 70 29 20 2b 20 73 69 7a 65 6f 66 28 75  ER(p) + sizeof(u
1610: 33 32 29 20 5c 0a 29 0a 23 64 65 66 69 6e 65 20  32) \.).#define 
1620: 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54  TESTALLOC_OFFSET
1630: 5f 55 53 45 52 28 70 29 20 28 20 5c 0a 20 20 54  _USER(p) ( \.  T
1640: 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f  ESTALLOC_OFFSET_
1650: 46 49 4c 45 4e 41 4d 45 28 70 29 20 2b 20 54 45  FILENAME(p) + TE
1660: 53 54 41 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a 45  STALLOC_FILESIZE
1670: 20 5c 0a 29 0a 23 64 65 66 69 6e 65 20 54 45 53   \.).#define TES
1680: 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 53 54  TALLOC_OFFSET_ST
1690: 41 43 4b 28 70 29 20 28 20 5c 0a 20 20 54 45 53  ACK(p) ( \.  TES
16a0: 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 55 53  TALLOC_OFFSET_US
16b0: 45 52 28 70 29 20 2b 20 54 45 53 54 41 4c 4c 4f  ER(p) + TESTALLO
16c0: 43 5f 55 53 45 52 53 49 5a 45 20 2b 20 38 20 2d  C_USERSIZE + 8 -
16d0: 20 5c 0a 20 20 28 54 45 53 54 41 4c 4c 4f 43 5f   \.  (TESTALLOC_
16e0: 4f 46 46 53 45 54 5f 55 53 45 52 28 70 29 20 25  OFFSET_USER(p) %
16f0: 20 38 29 20 5c 0a 29 0a 0a 23 64 65 66 69 6e 65   8) \.)..#define
1700: 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 56 45 52 48   TESTALLOC_OVERH
1710: 45 41 44 20 28 20 5c 0a 20 20 73 69 7a 65 6f 66  EAD ( \.  sizeof
1720: 28 76 6f 69 64 20 2a 29 2a 32 20 2b 20 20 20 20  (void *)*2 +    
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1740: 2a 20 70 50 72 65 76 20 61 6e 64 20 70 4e 65 78  * pPrev and pNex
1750: 74 20 70 6f 69 6e 74 65 72 73 20 2a 2f 20 20 20  t pointers */   
1760: 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43 5f 4e 47  \.  TESTALLOC_NG
1770: 55 41 52 44 2a 73 69 7a 65 6f 66 28 75 33 32 29  UARD*sizeof(u32)
1780: 2a 32 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  *2 +            
1790: 20 20 2f 2a 20 47 75 61 72 64 20 77 6f 72 64 73    /* Guard words
17a0: 20 2a 2f 20 20 20 20 20 20 20 5c 0a 20 20 73 69   */       \.  si
17b0: 7a 65 6f 66 28 75 33 32 29 20 2b 20 54 45 53 54  zeof(u32) + TEST
17c0: 41 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a 45 20 2b  ALLOC_FILESIZE +
17d0: 20 20 20 2f 2a 20 46 69 6c 65 20 61 6e 64 20 6c     /* File and l
17e0: 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 20 20 20  ine number */   
17f0: 20 20 20 20 5c 0a 20 20 54 45 53 54 41 4c 4c 4f      \.  TESTALLO
1800: 43 5f 55 53 45 52 53 49 5a 45 20 2b 20 20 20 20  C_USERSIZE +    
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1820: 55 73 65 72 20 73 74 72 69 6e 67 20 2a 2f 20 20  User string */  
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1840: 20 20 54 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43    TESTALLOC_STAC
1850: 4b 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 20  KSIZE           
1860: 20 20 20 20 20 20 20 2f 2a 20 62 61 63 6b 74 72         /* backtr
1870: 61 63 65 28 29 20 73 74 61 63 6b 20 2a 2f 20 20  ace() stack */  
1880: 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 0a 2f 2a          \.).../*
1890: 0a 2a 2a 20 46 6f 72 20 6b 65 65 70 69 6e 67 20  .** For keeping 
18a0: 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d  track of the num
18b0: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 73 20 61  ber of mallocs a
18c0: 6e 64 20 66 72 65 65 73 2e 20 20 20 54 68 69 73  nd frees.   This
18d0: 0a 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 63  .** is used to c
18e0: 68 65 63 6b 20 66 6f 72 20 6d 65 6d 6f 72 79 20  heck for memory 
18f0: 6c 65 61 6b 73 2e 20 20 54 68 65 20 69 4d 61 6c  leaks.  The iMal
1900: 6c 6f 63 46 61 69 6c 20 61 6e 64 20 69 4d 61 6c  locFail and iMal
1910: 6c 6f 63 52 65 73 65 74 0a 2a 2a 20 76 61 6c 75  locReset.** valu
1920: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  es are used to s
1930: 69 6d 75 6c 61 74 65 20 6d 61 6c 6c 6f 63 28 29  imulate malloc()
1940: 20 66 61 69 6c 75 72 65 73 20 64 75 72 69 6e 67   failures during
1950: 20 74 65 73 74 69 6e 67 20 69 6e 20 0a 2a 2a 20   testing in .** 
1960: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20  order to verify 
1970: 74 68 61 74 20 74 68 65 20 6c 69 62 72 61 72 79  that the library
1980: 20 63 6f 72 72 65 63 74 6c 79 20 68 61 6e 64 6c   correctly handl
1990: 65 73 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  es an out-of-mem
19a0: 6f 72 79 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ory.** condition
19b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19c0: 5f 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20  _nMalloc;       
19d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
19e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 63 61  qliteMalloc() ca
19f0: 6c 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lls */.int sqlit
1a00: 65 33 5f 6e 46 72 65 65 3b 20 20 20 20 20 20 20  e3_nFree;       
1a10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a20: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 63 61   sqliteFree() ca
1a30: 6c 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lls */.int sqlit
1a40: 65 33 5f 6d 65 6d 55 73 65 64 3b 20 20 20 20 20  e3_memUsed;     
1a50: 20 20 20 20 2f 2a 20 54 4f 44 4f 20 54 6f 74 61      /* TODO Tota
1a60: 6c 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  l memory obtaine
1a70: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f  d from malloc */
1a80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  .int sqlite3_mem
1a90: 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Max;          /*
1aa0: 20 54 4f 44 4f 20 4d 65 6d 20 75 73 61 67 65 20   TODO Mem usage 
1ab0: 68 69 67 68 2d 77 61 74 65 72 20 6d 61 72 6b 20  high-water mark 
1ac0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  */.int sqlite3_i
1ad0: 4d 61 6c 6c 6f 63 46 61 69 6c 3b 20 20 20 20 20  MallocFail;     
1ae0: 2f 2a 20 46 61 69 6c 20 73 71 6c 69 74 65 4d 61  /* Fail sqliteMa
1af0: 6c 6c 6f 63 28 29 20 61 66 74 65 72 20 74 68 69  lloc() after thi
1b00: 73 20 6d 61 6e 79 20 63 61 6c 6c 73 20 2a 2f 0a  s many calls */.
1b10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c  int sqlite3_iMal
1b20: 6c 6f 63 52 65 73 65 74 20 3d 20 2d 31 3b 20 2f  locReset = -1; /
1b30: 2a 20 57 68 65 6e 20 69 4d 61 6c 6c 6f 63 46 61  * When iMallocFa
1b40: 69 6c 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  il reaches 0, se
1b50: 74 20 74 6f 20 74 68 69 73 20 2a 2f 0a 0a 2f 2a  t to this */../*
1b60: 0a 2a 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20  .** Check for a 
1b70: 73 69 6d 75 6c 61 74 65 64 20 6d 65 6d 6f 72 79  simulated memory
1b80: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
1b90: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ure.  Return tru
1ba0: 65 20 69 66 0a 2a 2a 20 74 68 65 20 66 61 69 6c  e if.** the fail
1bb0: 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 69  ure should be si
1bc0: 6d 75 6c 61 74 65 64 2e 20 20 52 65 74 75 72 6e  mulated.  Return
1bd0: 20 66 61 6c 73 65 20 74 6f 20 70 72 6f 63 65 65   false to procee
1be0: 64 20 61 73 20 6e 6f 72 6d 61 6c 2e 0a 2a 2f 0a  d as normal..*/.
1bf0: 73 74 61 74 69 63 20 69 6e 74 20 66 61 69 6c 4d  static int failM
1c00: 61 6c 6c 6f 63 28 29 7b 0a 20 20 54 68 72 65 61  alloc(){.  Threa
1c10: 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
1c20: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
1c30: 29 3b 0a 20 20 69 66 28 20 70 54 73 64 2d 3e 69  );.  if( pTsd->i
1c40: 73 46 61 69 6c 20 29 7b 0a 20 20 20 20 72 65 74  sFail ){.    ret
1c50: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
1c60: 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
1c70: 46 61 69 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  Fail>=0 ){.    s
1c80: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
1c90: 69 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 73 71  il--;.    if( sq
1ca0: 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
1cb0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  l==0 ){.      sq
1cc0: 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
1cd0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c  l = sqlite3_iMal
1ce0: 6c 6f 63 52 65 73 65 74 3b 0a 20 20 20 20 20 20  locReset;.      
1cf0: 70 54 73 64 2d 3e 69 73 46 61 69 6c 20 3d 20 31  pTsd->isFail = 1
1d00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1d10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1d20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1d30: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
1d40: 20 61 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72   a pointer retur
1d50: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1d60: 4d 61 6c 6c 6f 63 28 29 20 6f 72 20 78 52 65 61  Malloc() or xRea
1d70: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 61 73 73 65 72  lloc()..** asser
1d80: 74 28 29 20 74 68 61 74 20 74 68 65 20 66 69 72  t() that the fir
1d90: 73 74 20 61 6e 64 20 6c 61 73 74 20 28 54 45 53  st and last (TES
1da0: 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 2a 34 29  TALLOC_NGUARD*4)
1db0: 20 62 79 74 65 73 20 61 72 65 20 73 65 74 20 74   bytes are set t
1dc0: 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 73 20  o the.** values 
1dd0: 73 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 79  set by the apply
1de0: 47 75 61 72 64 73 28 29 20 66 75 6e 63 74 69 6f  Guards() functio
1df0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1e00: 64 20 63 68 65 63 6b 47 75 61 72 64 73 28 75 33  d checkGuards(u3
1e10: 32 20 2a 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  2 *p).{.  int i;
1e20: 0a 20 20 63 68 61 72 20 2a 7a 41 6c 6c 6f 63 20  .  char *zAlloc 
1e30: 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 63  = (char *)p;.  c
1e40: 68 61 72 20 2a 7a 3b 0a 0a 20 20 2f 2a 20 46 69  har *z;..  /* Fi
1e50: 72 73 74 20 73 65 74 20 6f 66 20 67 75 61 72 64  rst set of guard
1e60: 20 77 6f 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20   words */.  z = 
1e70: 26 7a 41 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f  &zAlloc[TESTALLO
1e80: 43 5f 4f 46 46 53 45 54 5f 47 55 41 52 44 31 28  C_OFFSET_GUARD1(
1e90: 70 29 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  p)];.  for(i=0; 
1ea0: 69 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41  i<TESTALLOC_NGUA
1eb0: 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  RD; i++){.    as
1ec0: 73 65 72 74 28 28 28 75 33 32 20 2a 29 7a 29 5b  sert(((u32 *)z)[
1ed0: 69 5d 3d 3d 30 78 64 65 61 64 31 31 32 32 29 3b  i]==0xdead1122);
1ee0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 63 6f 6e  .  }..  /* Secon
1ef0: 64 20 73 65 74 20 6f 66 20 67 75 61 72 64 20 77  d set of guard w
1f00: 6f 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a  ords */.  z = &z
1f10: 41 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f  Alloc[TESTALLOC_
1f20: 4f 46 46 53 45 54 5f 47 55 41 52 44 32 28 70 29  OFFSET_GUARD2(p)
1f30: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
1f40: 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44  TESTALLOC_NGUARD
1f50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20  ; i++){.    u32 
1f60: 67 75 61 72 64 20 3d 20 30 3b 0a 20 20 20 20 6d  guard = 0;.    m
1f70: 65 6d 63 70 79 28 26 67 75 61 72 64 2c 20 26 7a  emcpy(&guard, &z
1f80: 5b 69 2a 73 69 7a 65 6f 66 28 75 33 32 29 5d 2c  [i*sizeof(u32)],
1f90: 20 73 69 7a 65 6f 66 28 75 33 32 29 29 3b 0a 20   sizeof(u32));. 
1fa0: 20 20 20 61 73 73 65 72 74 28 67 75 61 72 64 3d     assert(guard=
1fb0: 3d 30 78 64 65 61 64 33 33 34 34 29 3b 0a 20 20  =0xdead3344);.  
1fc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  }.}../*.** The a
1fd0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1fe0: 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
1ff0: 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63   sqlite3OsMalloc
2000: 28 29 20 6f 72 20 52 65 61 6c 6c 6f 63 28 29 2e  () or Realloc().
2010: 20 54 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 6e   The.** first an
2020: 64 20 6c 61 73 74 20 28 54 45 53 54 41 4c 4c 4f  d last (TESTALLO
2030: 43 5f 4e 47 55 41 52 44 2a 34 29 20 62 79 74 65  C_NGUARD*4) byte
2040: 73 20 61 72 65 20 73 65 74 20 74 6f 20 6b 6e 6f  s are set to kno
2050: 77 6e 20 76 61 6c 75 65 73 20 66 6f 72 20 75 73  wn values for us
2060: 65 20 61 73 20 0a 2a 2a 20 67 75 61 72 64 2d 70  e as .** guard-p
2070: 6f 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osts..*/.static 
2080: 76 6f 69 64 20 61 70 70 6c 79 47 75 61 72 64 73  void applyGuards
2090: 28 75 33 32 20 2a 70 29 0a 7b 0a 20 20 69 6e 74  (u32 *p).{.  int
20a0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
20b0: 20 63 68 61 72 20 2a 7a 41 6c 6c 6f 63 20 3d 20   char *zAlloc = 
20c0: 28 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 2f 2a  (char *)p;..  /*
20d0: 20 46 69 72 73 74 20 73 65 74 20 6f 66 20 67 75   First set of gu
20e0: 61 72 64 20 77 6f 72 64 73 20 2a 2f 0a 20 20 7a  ard words */.  z
20f0: 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45 53 54 41   = &zAlloc[TESTA
2100: 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 47 55 41 52  LLOC_OFFSET_GUAR
2110: 44 31 28 70 29 5d 3b 0a 20 20 66 6f 72 28 69 3d  D1(p)];.  for(i=
2120: 30 3b 20 69 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e  0; i<TESTALLOC_N
2130: 47 55 41 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20  GUARD; i++){.   
2140: 20 28 28 75 33 32 20 2a 29 7a 29 5b 69 5d 20 3d   ((u32 *)z)[i] =
2150: 20 30 78 64 65 61 64 31 31 32 32 3b 0a 20 20 7d   0xdead1122;.  }
2160: 0a 0a 20 20 2f 2a 20 53 65 63 6f 6e 64 20 73 65  ..  /* Second se
2170: 74 20 6f 66 20 67 75 61 72 64 20 77 6f 72 64 73  t of guard words
2180: 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f   */.  z = &zAllo
2190: 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53  c[TESTALLOC_OFFS
21a0: 45 54 5f 47 55 41 52 44 32 28 70 29 5d 3b 0a 20  ET_GUARD2(p)];. 
21b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53 54   for(i=0; i<TEST
21c0: 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 3b 20 69 2b  ALLOC_NGUARD; i+
21d0: 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  +){.    static c
21e0: 6f 6e 73 74 20 69 6e 74 20 67 75 61 72 64 20 3d  onst int guard =
21f0: 20 30 78 64 65 61 64 33 33 34 34 3b 0a 20 20 20   0xdead3344;.   
2200: 20 6d 65 6d 63 70 79 28 26 7a 5b 69 2a 73 69 7a   memcpy(&z[i*siz
2210: 65 6f 66 28 75 33 32 29 5d 2c 20 26 67 75 61 72  eof(u32)], &guar
2220: 64 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 29 3b  d, sizeof(u32));
2230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 65 20  .  }..  /* Line 
2240: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 7a 20 3d 20  number */.  z = 
2250: 26 28 28 63 68 61 72 20 2a 29 7a 29 5b 54 45 53  &((char *)z)[TES
2260: 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 2a 73 69  TALLOC_NGUARD*si
2270: 7a 65 6f 66 28 75 33 32 29 5d 3b 20 20 20 20 20  zeof(u32)];     
2280: 20 20 20 20 20 20 20 20 2f 2a 20 47 75 61 72 64          /* Guard
2290: 20 77 6f 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20   words */.  z = 
22a0: 26 7a 41 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f  &zAlloc[TESTALLO
22b0: 43 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 55 4d  C_OFFSET_LINENUM
22c0: 42 45 52 28 70 29 5d 3b 0a 20 20 6d 65 6d 63 70  BER(p)];.  memcp
22d0: 79 28 7a 2c 20 26 73 71 6c 69 74 65 33 54 68 72  y(z, &sqlite3Thr
22e0: 65 61 64 44 61 74 61 28 29 2d 3e 69 4c 69 6e 65  eadData()->iLine
22f0: 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 29 3b 0a  , sizeof(u32));.
2300: 0a 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20  .  /* File name 
2310: 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63  */.  z = &zAlloc
2320: 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45  [TESTALLOC_OFFSE
2330: 54 5f 46 49 4c 45 4e 41 4d 45 28 70 29 5d 3b 0a  T_FILENAME(p)];.
2340: 20 20 73 74 72 6e 63 70 79 28 7a 2c 20 73 71 6c    strncpy(z, sql
2350: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
2360: 2d 3e 7a 46 69 6c 65 2c 20 54 45 53 54 41 4c 4c  ->zFile, TESTALL
2370: 4f 43 5f 46 49 4c 45 53 49 5a 45 29 3b 0a 20 20  OC_FILESIZE);.  
2380: 7a 5b 54 45 53 54 41 4c 4c 4f 43 5f 46 49 4c 45  z[TESTALLOC_FILE
2390: 53 49 5a 45 20 2d 20 31 5d 20 3d 20 27 5c 30 27  SIZE - 1] = '\0'
23a0: 3b 0a 0a 20 20 2f 2a 20 55 73 65 72 20 73 74 72  ;..  /* User str
23b0: 69 6e 67 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41  ing */.  z = &zA
23c0: 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f  lloc[TESTALLOC_O
23d0: 46 46 53 45 54 5f 55 53 45 52 28 70 29 5d 3b 0a  FFSET_USER(p)];.
23e0: 20 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66    z[0] = 0;.  if
23f0: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
2400: 5f 69 64 20 29 7b 0a 20 20 20 20 73 74 72 6e 63  _id ){.    strnc
2410: 70 79 28 7a 2c 20 73 71 6c 69 74 65 33 5f 6d 61  py(z, sqlite3_ma
2420: 6c 6c 6f 63 5f 69 64 2c 20 54 45 53 54 41 4c 4c  lloc_id, TESTALL
2430: 4f 43 5f 55 53 45 52 53 49 5a 45 29 3b 0a 20 20  OC_USERSIZE);.  
2440: 20 20 7a 5b 54 45 53 54 41 4c 4c 4f 43 5f 55 53    z[TESTALLOC_US
2450: 45 52 53 49 5a 45 2d 31 5d 20 3d 20 30 3b 0a 20  ERSIZE-1] = 0;. 
2460: 20 7d 0a 0a 20 20 2f 2a 20 62 61 63 6b 74 72 61   }..  /* backtra
2470: 63 65 28 29 20 73 74 61 63 6b 20 2a 2f 0a 20 20  ce() stack */.  
2480: 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45 53 54  z = &zAlloc[TEST
2490: 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 53 54 41  ALLOC_OFFSET_STA
24a0: 43 4b 28 70 29 5d 3b 0a 20 20 62 61 63 6b 74 72  CK(p)];.  backtr
24b0: 61 63 65 28 28 76 6f 69 64 20 2a 2a 29 7a 2c 20  ace((void **)z, 
24c0: 54 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 46  TESTALLOC_STACKF
24d0: 52 41 4d 45 53 29 3b 0a 0a 20 20 2f 2a 20 53 61  RAMES);..  /* Sa
24e0: 6e 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61  nity check to ma
24f0: 6b 65 20 73 75 72 65 20 63 68 65 63 6b 47 75 61  ke sure checkGua
2500: 72 64 73 28 29 20 69 73 20 77 6f 72 6b 69 6e 67  rds() is working
2510: 20 2a 2f 0a 20 20 63 68 65 63 6b 47 75 61 72 64   */.  checkGuard
2520: 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  s(p);.}../*.** T
2530: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
2540: 20 6d 61 6c 6c 6f 63 28 29 65 64 20 70 6f 69 6e   malloc()ed poin
2550: 74 65 72 20 61 73 20 72 65 74 75 72 6e 65 64 20  ter as returned 
2560: 62 79 20 74 68 65 20 74 65 73 74 2d 77 72 61 70  by the test-wrap
2570: 70 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  per..** Return a
2580: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2590: 4f 73 20 6c 65 76 65 6c 20 61 6c 6c 6f 63 61 74  Os level allocat
25a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
25b0: 6f 69 64 20 2a 67 65 74 4f 73 50 6f 69 6e 74 65  oid *getOsPointe
25c0: 72 28 76 6f 69 64 20 2a 70 29 0a 7b 0a 20 20 63  r(void *p).{.  c
25d0: 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 20 2a  har *z = (char *
25e0: 29 70 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  )p;.  return (vo
25f0: 69 64 20 2a 29 28 26 7a 5b 2d 31 20 2a 20 54 45  id *)(&z[-1 * TE
2600: 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 44  STALLOC_OFFSET_D
2610: 41 54 41 28 70 29 5d 29 3b 0a 7d 0a 0a 0a 23 69  ATA(p)]);.}...#i
2620: 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  f SQLITE_MEMDEBU
2630: 47 3e 31 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  G>1./*.** The ar
2640: 67 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f  gument points to
2650: 20 61 6e 20 4f 73 20 6c 65 76 65 6c 20 61 6c 6c   an Os level all
2660: 6f 63 61 74 69 6f 6e 2e 20 4c 69 6e 6b 20 69 74  ocation. Link it
2670: 20 69 6e 74 6f 20 74 68 65 20 74 68 72 65 61 64   into the thread
2680: 73 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c  s list.** of all
2690: 6f 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  ocations..*/.sta
26a0: 74 69 63 20 76 6f 69 64 20 6c 69 6e 6b 41 6c 6c  tic void linkAll
26b0: 6f 63 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 54  oc(void *p){.  T
26c0: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
26d0: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
26e0: 61 74 61 28 29 3b 0a 20 20 76 6f 69 64 20 2a 2a  ata();.  void **
26f0: 70 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 70 3b  pp = (void **)p;
2700: 0a 20 20 70 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  .  pp[0] = 0;.  
2710: 70 70 5b 31 5d 20 3d 20 70 54 73 64 2d 3e 70 46  pp[1] = pTsd->pF
2720: 69 72 73 74 3b 0a 20 20 69 66 28 20 70 54 73 64  irst;.  if( pTsd
2730: 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ->pFirst ){.    
2740: 28 28 76 6f 69 64 20 2a 2a 29 70 54 73 64 2d 3e  ((void **)pTsd->
2750: 70 46 69 72 73 74 29 5b 30 5d 20 3d 20 70 3b 0a  pFirst)[0] = p;.
2760: 20 20 7d 0a 20 20 70 54 73 64 2d 3e 70 46 69 72    }.  pTsd->pFir
2770: 73 74 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  st = p;.}../*.**
2780: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f   The argument po
2790: 69 6e 74 73 20 74 6f 20 61 6e 20 4f 73 20 6c 65  ints to an Os le
27a0: 76 65 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  vel allocation. 
27b0: 55 6e 6c 69 6e 6b 65 20 69 74 20 66 72 6f 6d 20  Unlinke it from 
27c0: 74 68 65 20 74 68 72 65 61 64 73 0a 2a 2a 20 6c  the threads.** l
27d0: 69 73 74 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f  ist of allocatio
27e0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
27f0: 69 64 20 75 6e 6c 69 6e 6b 41 6c 6c 6f 63 28 76  id unlinkAlloc(v
2800: 6f 69 64 20 2a 70 29 0a 7b 0a 20 20 54 68 72 65  oid *p).{.  Thre
2810: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
2820: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
2830: 28 29 3b 0a 20 20 76 6f 69 64 20 2a 2a 70 70 20  ();.  void **pp 
2840: 3d 20 28 76 6f 69 64 20 2a 2a 29 70 3b 0a 20 20  = (void **)p;.  
2850: 69 66 28 20 70 3d 3d 70 54 73 64 2d 3e 70 46 69  if( p==pTsd->pFi
2860: 72 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rst ){.    asser
2870: 74 28 21 70 70 5b 30 5d 29 3b 0a 20 20 20 20 61  t(!pp[0]);.    a
2880: 73 73 65 72 74 28 21 70 70 5b 31 5d 20 7c 7c 20  ssert(!pp[1] || 
2890: 28 28 76 6f 69 64 20 2a 2a 29 28 70 70 5b 31 5d  ((void **)(pp[1]
28a0: 29 29 5b 30 5d 3d 3d 70 29 3b 0a 20 20 20 20 70  ))[0]==p);.    p
28b0: 54 73 64 2d 3e 70 46 69 72 73 74 20 3d 20 70 70  Tsd->pFirst = pp
28c0: 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 73  [1];.    if( pTs
28d0: 64 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20 20  d->pFirst ){.   
28e0: 20 20 20 28 28 76 6f 69 64 20 2a 2a 29 70 54 73     ((void **)pTs
28f0: 64 2d 3e 70 46 69 72 73 74 29 5b 30 5d 20 3d 20  d->pFirst)[0] = 
2900: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
2910: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 70 70 72  {.    void **ppr
2920: 65 76 20 3d 20 70 70 5b 30 5d 3b 0a 20 20 20 20  ev = pp[0];.    
2930: 76 6f 69 64 20 2a 2a 70 6e 65 78 74 20 3d 20 70  void **pnext = p
2940: 70 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  p[1];.    assert
2950: 28 70 70 72 65 76 29 3b 0a 20 20 20 20 61 73 73  (pprev);.    ass
2960: 65 72 74 28 70 70 72 65 76 5b 31 5d 3d 3d 70 29  ert(pprev[1]==p)
2970: 3b 0a 20 20 20 20 70 70 72 65 76 5b 31 5d 20 3d  ;.    pprev[1] =
2980: 20 28 76 6f 69 64 20 2a 29 70 6e 65 78 74 3b 0a   (void *)pnext;.
2990: 20 20 20 20 69 66 28 20 70 6e 65 78 74 20 29 7b      if( pnext ){
29a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 6e  .      assert(pn
29b0: 65 78 74 5b 30 5d 3d 3d 70 29 3b 0a 20 20 20 20  ext[0]==p);.    
29c0: 20 20 70 6e 65 78 74 5b 30 5d 20 3d 20 28 76 6f    pnext[0] = (vo
29d0: 69 64 20 2a 29 70 70 72 65 76 3b 0a 20 20 20 20  id *)pprev;.    
29e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
29f0: 6f 69 6e 74 65 72 20 70 20 69 73 20 61 20 70 6f  ointer p is a po
2a00: 69 6e 74 65 72 20 74 6f 20 61 6e 20 4f 53 20 6c  inter to an OS l
2a10: 65 76 65 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  evel allocation 
2a20: 74 68 61 74 20 68 61 73 20 6a 75 73 74 20 62 65  that has just be
2a30: 65 6e 0a 2a 2a 20 72 65 61 6c 6c 6f 63 28 29 65  en.** realloc()e
2a40: 64 2e 20 53 65 74 20 74 68 65 20 6c 69 73 74 20  d. Set the list 
2a50: 70 6f 69 6e 74 65 72 73 20 74 68 61 74 20 70 6f  pointers that po
2a60: 69 6e 74 20 74 6f 20 74 68 69 73 20 65 6e 74 72  int to this entr
2a70: 79 20 74 6f 20 69 74 27 73 20 6e 65 77 0a 2a 2a  y to it's new.**
2a80: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   location..*/.st
2a90: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 69 6e 6b  atic void relink
2aa0: 41 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 29 0a 7b  Alloc(void *p).{
2ab0: 0a 20 20 76 6f 69 64 20 2a 2a 70 70 20 3d 20 28  .  void **pp = (
2ac0: 76 6f 69 64 20 2a 2a 29 70 3b 0a 20 20 69 66 28  void **)p;.  if(
2ad0: 20 70 70 5b 30 5d 20 29 7b 0a 20 20 20 20 28 28   pp[0] ){.    ((
2ae0: 76 6f 69 64 20 2a 2a 29 28 70 70 5b 30 5d 29 29  void **)(pp[0]))
2af0: 5b 31 5d 20 3d 20 70 3b 0a 20 20 7d 65 6c 73 65  [1] = p;.  }else
2b00: 7b 0a 20 20 20 20 54 68 72 65 61 64 44 61 74 61  {.    ThreadData
2b10: 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
2b20: 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
2b30: 20 20 70 54 73 64 2d 3e 70 46 69 72 73 74 20 3d    pTsd->pFirst =
2b40: 20 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 70   p;.  }.  if( pp
2b50: 5b 31 5d 20 29 7b 0a 20 20 20 20 28 28 76 6f 69  [1] ){.    ((voi
2b60: 64 20 2a 2a 29 28 70 70 5b 31 5d 29 29 5b 30 5d  d **)(pp[1]))[0]
2b70: 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73   = p;.  }.}.#els
2b80: 65 0a 23 64 65 66 69 6e 65 20 6c 69 6e 6b 41 6c  e.#define linkAl
2b90: 6c 6f 63 28 78 29 0a 23 64 65 66 69 6e 65 20 72  loc(x).#define r
2ba0: 65 6c 69 6e 6b 41 6c 6c 6f 63 28 78 29 0a 23 64  elinkAlloc(x).#d
2bb0: 65 66 69 6e 65 20 75 6e 6c 69 6e 6b 41 6c 6c 6f  efine unlinkAllo
2bc0: 63 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c(x).#endif../*.
2bd0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2be0: 20 73 65 74 73 20 74 68 65 20 72 65 73 75 6c 74   sets the result
2bf0: 20 6f 66 20 74 68 65 20 54 63 6c 20 69 6e 74 65   of the Tcl inte
2c00: 72 70 72 65 74 65 72 20 70 61 73 73 65 64 20 61  rpreter passed a
2c10: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  s an argument.**
2c20: 20 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74 61   to a list conta
2c30: 69 6e 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 66  ining an entry f
2c40: 6f 72 20 65 61 63 68 20 63 75 72 72 65 6e 74 6c  or each currentl
2c50: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 61  y outstanding ca
2c60: 6c 6c 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 73  ll made to .** s
2c70: 71 6c 69 74 65 4d 61 6c 6c 6f 63 20 61 6e 64 20  qliteMalloc and 
2c80: 66 72 69 65 6e 64 73 20 62 79 20 74 68 65 20 63  friends by the c
2c90: 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 45  urrent thread. E
2ca0: 61 63 68 20 6c 69 73 74 20 65 6e 74 72 79 20 69  ach list entry i
2cb0: 73 20 69 74 73 65 6c 66 20 61 0a 2a 2a 20 6c 69  s itself a.** li
2cc0: 73 74 2c 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  st, consisting o
2cd0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2ce0: 28 69 6e 20 6f 72 64 65 72 29 3a 0a 2a 2a 0a 2a  (in order):.**.*
2cf0: 2a 20 20 20 20 20 2a 20 54 68 65 20 6e 75 6d 62  *     * The numb
2d00: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
2d10: 63 61 74 65 64 0a 2a 2a 20 20 20 20 20 2a 20 54  cated.**     * T
2d20: 68 65 20 5f 5f 46 49 4c 45 5f 5f 20 6d 61 63 72  he __FILE__ macr
2d30: 6f 20 61 74 20 74 68 65 20 74 69 6d 65 20 6f 66  o at the time of
2d40: 20 74 68 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f   the sqliteMallo
2d50: 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 20 20 20 20  c() call..**    
2d60: 20 2a 20 54 68 65 20 5f 5f 4c 49 4e 45 5f 5f 20   * The __LINE__ 
2d70: 6d 61 63 72 6f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  macro ....**    
2d80: 20 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20   * The value of 
2d90: 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  the sqlite3_mall
2da0: 6f 63 5f 69 64 20 76 61 72 69 61 62 6c 65 20 2e  oc_id variable .
2db0: 2e 2e 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  ...**     * The 
2dc0: 6f 75 74 70 75 74 20 6f 66 20 62 61 63 6b 74 72  output of backtr
2dd0: 61 63 65 28 29 20 28 69 66 20 61 76 61 69 6c 61  ace() (if availa
2de0: 62 6c 65 29 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  ble) ....**.** T
2df0: 6f 64 6f 3a 20 57 65 20 63 6f 75 6c 64 20 68 61  odo: We could ha
2e00: 76 65 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  ve a version of 
2e10: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68  this function th
2e20: 61 74 20 6f 75 74 70 75 74 73 20 74 6f 20 73 74  at outputs to st
2e30: 64 6f 75 74 2c 20 0a 2a 2a 20 74 6f 20 64 65 62  dout, .** to deb
2e40: 75 67 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 20  ug memory leaks 
2e50: 77 68 65 6e 20 54 63 6c 20 69 73 20 6e 6f 74 20  when Tcl is not 
2e60: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69  available..*/.#i
2e70: 66 64 65 66 20 54 43 4c 53 48 0a 23 69 6e 63 6c  fdef TCLSH.#incl
2e80: 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 69 6e 74 20  ude <tcl.h>.int 
2e90: 73 71 6c 69 74 65 33 4f 75 74 73 74 61 6e 64 69  sqlite3Outstandi
2ea0: 6e 67 4d 61 6c 6c 6f 63 73 28 54 63 6c 5f 49 6e  ngMallocs(Tcl_In
2eb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
2ec0: 20 76 6f 69 64 20 2a 70 3b 0a 20 20 54 68 72 65   void *p;.  Thre
2ed0: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
2ee0: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
2ef0: 28 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ();.  Tcl_Obj *p
2f00: 52 65 73 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Res = Tcl_NewObj
2f10: 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  ();.  Tcl_IncrRe
2f20: 66 43 6f 75 6e 74 28 70 52 65 73 29 3b 0a 0a 20  fCount(pRes);.. 
2f30: 20 66 6f 72 28 70 3d 70 54 73 64 2d 3e 70 46 69   for(p=pTsd->pFi
2f40: 72 73 74 3b 20 70 3b 20 70 3d 28 28 76 6f 69 64  rst; p; p=((void
2f50: 20 2a 2a 29 70 29 5b 31 5d 29 7b 0a 20 20 20 20   **)p)[1]){.    
2f60: 54 63 6c 5f 4f 62 6a 20 2a 70 45 6e 74 72 79 20  Tcl_Obj *pEntry 
2f70: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
2f80: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74      Tcl_Obj *pSt
2f90: 61 63 6b 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ack = Tcl_NewObj
2fa0: 28 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  ();.    char *z;
2fb0: 0a 20 20 20 20 75 33 32 20 69 4c 69 6e 65 3b 0a  .    u32 iLine;.
2fc0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d      int nBytes =
2fd0: 20 73 71 6c 69 74 65 33 4f 73 41 6c 6c 6f 63 61   sqlite3OsAlloca
2fe0: 74 69 6f 6e 53 69 7a 65 28 70 29 20 2d 20 54 45  tionSize(p) - TE
2ff0: 53 54 41 4c 4c 4f 43 5f 4f 56 45 52 48 45 41 44  STALLOC_OVERHEAD
3000: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 6c 6c  ;.    char *zAll
3010: 6f 63 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  oc = (char *)p;.
3020: 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
3030: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3040: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6e 74  dElement(0, pEnt
3050: 72 79 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  ry, Tcl_NewIntOb
3060: 6a 28 6e 42 79 74 65 73 29 29 3b 0a 0a 20 20 20  j(nBytes));..   
3070: 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45 53   z = &zAlloc[TES
3080: 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 46 49  TALLOC_OFFSET_FI
3090: 4c 45 4e 41 4d 45 28 70 29 5d 3b 0a 20 20 20 20  LENAME(p)];.    
30a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
30b0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6e 74  dElement(0, pEnt
30c0: 72 79 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ry, Tcl_NewStrin
30d0: 67 4f 62 6a 28 7a 2c 20 2d 31 29 29 3b 0a 0a 20  gObj(z, -1));.. 
30e0: 20 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54     z = &zAlloc[T
30f0: 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f  ESTALLOC_OFFSET_
3100: 4c 49 4e 45 4e 55 4d 42 45 52 28 70 29 5d 3b 0a  LINENUMBER(p)];.
3110: 20 20 20 20 6d 65 6d 63 70 79 28 26 69 4c 69 6e      memcpy(&iLin
3120: 65 2c 20 7a 2c 20 73 69 7a 65 6f 66 28 75 33 32  e, z, sizeof(u32
3130: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3140: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3150: 28 30 2c 20 70 45 6e 74 72 79 2c 20 54 63 6c 5f  (0, pEntry, Tcl_
3160: 4e 65 77 49 6e 74 4f 62 6a 28 69 4c 69 6e 65 29  NewIntObj(iLine)
3170: 29 3b 0a 0a 20 20 20 20 7a 20 3d 20 26 7a 41 6c  );..    z = &zAl
3180: 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46  loc[TESTALLOC_OF
3190: 46 53 45 54 5f 55 53 45 52 28 70 29 5d 3b 0a 20  FSET_USER(p)];. 
31a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
31b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
31c0: 45 6e 74 72 79 2c 20 54 63 6c 5f 4e 65 77 53 74  Entry, Tcl_NewSt
31d0: 72 69 6e 67 4f 62 6a 28 7a 2c 20 2d 31 29 29 3b  ringObj(z, -1));
31e0: 0a 0a 20 20 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f  ..    z = &zAllo
31f0: 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53  c[TESTALLOC_OFFS
3200: 45 54 5f 53 54 41 43 4b 28 70 29 5d 3b 0a 20 20  ET_STACK(p)];.  
3210: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53    for(i=0; i<TES
3220: 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 46 52 41 4d  TALLOC_STACKFRAM
3230: 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ES; i++){.      
3240: 63 68 61 72 20 7a 48 65 78 5b 31 32 38 5d 3b 0a  char zHex[128];.
3250: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 48        sprintf(zH
3260: 65 78 2c 20 22 25 70 22 2c 20 28 28 76 6f 69 64  ex, "%p", ((void
3270: 20 2a 2a 29 7a 29 5b 69 5d 29 3b 0a 20 20 20 20   **)z)[i]);.    
3280: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3290: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
32a0: 74 61 63 6b 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tack, Tcl_NewStr
32b0: 69 6e 67 4f 62 6a 28 7a 48 65 78 2c 20 2d 31 29  ingObj(zHex, -1)
32c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  );.    }..    Tc
32d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
32e0: 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6e 74 72 79  lement(0, pEntry
32f0: 2c 20 70 53 74 61 63 6b 29 3b 0a 20 20 20 20 54  , pStack);.    T
3300: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3310: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 73 2c  Element(0, pRes,
3320: 20 70 45 6e 74 72 79 29 3b 0a 20 20 7d 0a 0a 20   pEntry);.  }.. 
3330: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
3340: 28 69 6e 74 65 72 70 29 3b 0a 20 20 54 63 6c 5f  (interp);.  Tcl_
3350: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
3360: 65 72 70 2c 20 70 52 65 73 29 3b 0a 20 20 54 63  erp, pRes);.  Tc
3370: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3380: 52 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  Res);.  return T
3390: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
33a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
33b0: 68 65 20 74 65 73 74 20 6c 61 79 65 72 27 73 20  he test layer's 
33c0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
33d0: 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 29  qlite3OsMalloc()
33e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
33f0: 20 2a 20 4f 53 4d 41 4c 4c 4f 43 28 69 6e 74 20   * OSMALLOC(int 
3400: 6e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  n){.#ifndef SQLI
3410: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d  TE_OMIT_MEMORY_M
3420: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 54 68 72 65  ANAGEMENT.  Thre
3430: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
3440: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
3450: 28 29 3b 0a 20 20 70 54 73 64 2d 3e 6e 4d 61 78  ();.  pTsd->nMax
3460: 41 6c 6c 6f 63 20 3d 20 4d 41 58 28 70 54 73 64  Alloc = MAX(pTsd
3470: 2d 3e 6e 4d 61 78 41 6c 6c 6f 63 2c 20 70 54 73  ->nMaxAlloc, pTs
3480: 64 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 23 65 6e 64  d->nAlloc);.#end
3490: 69 66 0a 20 20 69 66 28 20 21 66 61 69 6c 4d 61  if.  if( !failMa
34a0: 6c 6c 6f 63 28 29 20 29 7b 0a 20 20 20 20 75 33  lloc() ){.    u3
34b0: 32 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 28 75  2 *p;.    p = (u
34c0: 33 32 20 2a 29 73 71 6c 69 74 65 33 4f 73 4d 61  32 *)sqlite3OsMa
34d0: 6c 6c 6f 63 28 6e 20 2b 20 54 45 53 54 41 4c 4c  lloc(n + TESTALL
34e0: 4f 43 5f 4f 56 45 52 48 45 41 44 29 3b 0a 20 20  OC_OVERHEAD);.  
34f0: 20 20 61 73 73 65 72 74 28 70 29 3b 0a 20 20 20    assert(p);.   
3500: 20 73 71 6c 69 74 65 33 5f 6e 4d 61 6c 6c 6f 63   sqlite3_nMalloc
3510: 2b 2b 3b 0a 20 20 20 20 61 70 70 6c 79 47 75 61  ++;.    applyGua
3520: 72 64 73 28 70 29 3b 0a 20 20 20 20 6c 69 6e 6b  rds(p);.    link
3530: 41 6c 6c 6f 63 28 70 29 3b 0a 20 20 20 20 72 65  Alloc(p);.    re
3540: 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 28 26 70  turn (void *)(&p
3550: 5b 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52  [TESTALLOC_NGUAR
3560: 44 20 2b 20 32 2a 73 69 7a 65 6f 66 28 76 6f 69  D + 2*sizeof(voi
3570: 64 20 2a 29 2f 73 69 7a 65 6f 66 28 75 33 32 29  d *)/sizeof(u32)
3580: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
3590: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   0;.}..static in
35a0: 74 20 4f 53 53 49 5a 45 4f 46 28 76 6f 69 64 20  t OSSIZEOF(void 
35b0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
35c0: 20 20 20 20 75 33 32 20 2a 70 4f 73 20 3d 20 28      u32 *pOs = (
35d0: 75 33 32 20 2a 29 67 65 74 4f 73 50 6f 69 6e 74  u32 *)getOsPoint
35e0: 65 72 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  er(p);.    retur
35f0: 6e 20 73 71 6c 69 74 65 33 4f 73 41 6c 6c 6f 63  n sqlite3OsAlloc
3600: 61 74 69 6f 6e 53 69 7a 65 28 70 4f 73 29 20 2d  ationSize(pOs) -
3610: 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 56 45 52 48   TESTALLOC_OVERH
3620: 45 41 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  EAD;.  }.  retur
3630: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
3640: 69 73 20 69 73 20 74 68 65 20 74 65 73 74 20 6c  is is the test l
3650: 61 79 65 72 27 73 20 77 72 61 70 70 65 72 20 61  ayer's wrapper a
3660: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4f 73 46  round sqlite3OsF
3670: 72 65 65 28 29 2e 20 54 68 65 20 61 72 67 75 6d  ree(). The argum
3680: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 70 6f 69 6e  ent is a.** poin
3690: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
36a0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
36b0: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74  he application t
36c0: 6f 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  o use..*/.static
36d0: 20 76 6f 69 64 20 4f 53 46 52 45 45 28 76 6f 69   void OSFREE(voi
36e0: 64 20 2a 70 46 72 65 65 29 7b 0a 20 20 75 33 32  d *pFree){.  u32
36f0: 20 2a 70 20 3d 20 28 75 33 32 20 2a 29 67 65 74   *p = (u32 *)get
3700: 4f 73 50 6f 69 6e 74 65 72 28 70 46 72 65 65 29  OsPointer(pFree)
3710: 3b 20 20 20 2f 2a 20 70 20 70 6f 69 6e 74 73 20  ;   /* p points 
3720: 74 6f 20 4f 73 20 6c 65 76 65 6c 20 61 6c 6c 6f  to Os level allo
3730: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 65 63  cation */.  chec
3740: 6b 47 75 61 72 64 73 28 70 29 3b 0a 20 20 75 6e  kGuards(p);.  un
3750: 6c 69 6e 6b 41 6c 6c 6f 63 28 70 29 3b 0a 20 20  linkAlloc(p);.  
3760: 6d 65 6d 73 65 74 28 70 46 72 65 65 2c 20 30 78  memset(pFree, 0x
3770: 35 35 2c 20 4f 53 53 49 5a 45 4f 46 28 70 46 72  55, OSSIZEOF(pFr
3780: 65 65 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  ee));.  sqlite3O
3790: 73 46 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69  sFree(p);.  sqli
37a0: 74 65 33 5f 6e 46 72 65 65 2b 2b 3b 0a 7d 0a 0a  te3_nFree++;.}..
37b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
37c0: 65 20 74 65 73 74 20 6c 61 79 65 72 27 73 20 77  e test layer's w
37d0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
37e0: 6c 69 74 65 33 4f 73 52 65 61 6c 6c 6f 63 28 29  lite3OsRealloc()
37f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3800: 20 2a 20 4f 53 52 45 41 4c 4c 4f 43 28 76 6f 69   * OSREALLOC(voi
3810: 64 20 2a 70 52 65 61 6c 6c 6f 63 2c 20 69 6e 74  d *pRealloc, int
3820: 20 6e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c   n){.#ifndef SQL
3830: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f  ITE_OMIT_MEMORY_
3840: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 54 68 72  MANAGEMENT.  Thr
3850: 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
3860: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
3870: 61 28 29 3b 0a 20 20 70 54 73 64 2d 3e 6e 4d 61  a();.  pTsd->nMa
3880: 78 41 6c 6c 6f 63 20 3d 20 4d 41 58 28 70 54 73  xAlloc = MAX(pTs
3890: 64 2d 3e 6e 4d 61 78 41 6c 6c 6f 63 2c 20 70 54  d->nMaxAlloc, pT
38a0: 73 64 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 23 65 6e  sd->nAlloc);.#en
38b0: 64 69 66 0a 20 20 69 66 28 20 21 66 61 69 6c 4d  dif.  if( !failM
38c0: 61 6c 6c 6f 63 28 29 20 29 7b 0a 20 20 20 20 75  alloc() ){.    u
38d0: 33 32 20 2a 70 20 3d 20 28 75 33 32 20 2a 29 67  32 *p = (u32 *)g
38e0: 65 74 4f 73 50 6f 69 6e 74 65 72 28 70 52 65 61  etOsPointer(pRea
38f0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 63 68 65 63 6b  lloc);.    check
3900: 47 75 61 72 64 73 28 70 29 3b 0a 20 20 20 20 70  Guards(p);.    p
3910: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 6c   = sqlite3OsReal
3920: 6c 6f 63 28 70 2c 20 6e 20 2b 20 54 45 53 54 41  loc(p, n + TESTA
3930: 4c 4c 4f 43 5f 4f 56 45 52 48 45 41 44 29 3b 0a  LLOC_OVERHEAD);.
3940: 20 20 20 20 61 70 70 6c 79 47 75 61 72 64 73 28      applyGuards(
3950: 70 29 3b 0a 20 20 20 20 72 65 6c 69 6e 6b 41 6c  p);.    relinkAl
3960: 6c 6f 63 28 70 29 3b 0a 20 20 20 20 72 65 74 75  loc(p);.    retu
3970: 72 6e 20 28 76 6f 69 64 20 2a 29 28 26 70 5b 54  rn (void *)(&p[T
3980: 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 20  ESTALLOC_NGUARD 
3990: 2b 20 32 2a 73 69 7a 65 6f 66 28 76 6f 69 64 20  + 2*sizeof(void 
39a0: 2a 29 2f 73 69 7a 65 6f 66 28 75 33 32 29 5d 29  *)/sizeof(u32)])
39b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
39c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
39d0: 20 4f 53 4d 41 4c 4c 4f 43 5f 46 41 49 4c 45 44   OSMALLOC_FAILED
39e0: 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 54 68 72  (){.  sqlite3Thr
39f0: 65 61 64 44 61 74 61 28 29 2d 3e 69 73 46 61 69  eadData()->isFai
3a00: 6c 20 3d 20 30 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  l = 0;.}..#else.
3a10: 2f 2a 20 44 65 66 69 6e 65 20 6d 61 63 72 6f 73  /* Define macros
3a20: 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 73 71 6c   to call the sql
3a30: 69 74 65 33 4f 73 58 58 58 20 69 6e 74 65 72 66  ite3OsXXX interf
3a40: 61 63 65 20 64 69 72 65 63 74 6c 79 20 69 66 20  ace directly if 
3a50: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  .** the SQLITE_M
3a60: 45 4d 44 45 42 55 47 20 6d 61 63 72 6f 20 69 73  EMDEBUG macro is
3a70: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 2a 2f   not defined..*/
3a80: 0a 23 64 65 66 69 6e 65 20 4f 53 4d 41 4c 4c 4f  .#define OSMALLO
3a90: 43 28 78 29 20 20 20 20 20 20 20 20 73 71 6c 69  C(x)        sqli
3aa0: 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 78 29 0a 23  te3OsMalloc(x).#
3ab0: 64 65 66 69 6e 65 20 4f 53 52 45 41 4c 4c 4f 43  define OSREALLOC
3ac0: 28 78 2c 79 29 20 20 20 20 20 73 71 6c 69 74 65  (x,y)     sqlite
3ad0: 33 4f 73 52 65 61 6c 6c 6f 63 28 78 2c 79 29 0a  3OsRealloc(x,y).
3ae0: 23 64 65 66 69 6e 65 20 4f 53 46 52 45 45 28 78  #define OSFREE(x
3af0: 29 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  )          sqlit
3b00: 65 33 4f 73 46 72 65 65 28 78 29 0a 23 64 65 66  e3OsFree(x).#def
3b10: 69 6e 65 20 4f 53 53 49 5a 45 4f 46 28 78 29 20  ine OSSIZEOF(x) 
3b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
3b30: 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 28 78  AllocationSize(x
3b40: 29 0a 23 64 65 66 69 6e 65 20 4f 53 4d 41 4c 4c  ).#define OSMALL
3b50: 4f 43 5f 46 41 49 4c 45 44 28 29 0a 0a 23 65 6e  OC_FAILED()..#en
3b60: 64 69 66 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 63 6f  dif./*.** End co
3b70: 64 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 61 6c  de for memory al
3b80: 6c 6f 63 61 74 69 6f 6e 20 73 79 73 74 65 6d 20  location system 
3b90: 74 65 73 74 20 6c 61 79 65 72 2e 0a 2a 2a 2d 2d  test layer..**--
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 2f 0a 0a 2f 2a 0a 2a  --------*/../*.*
3bf0: 2a 20 54 68 65 20 68 61 6e 64 6c 65 53 6f 66 74  * The handleSoft
3c00: 4c 69 6d 69 74 28 29 20 66 75 6e 63 74 69 6f 6e  Limit() function
3c10: 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
3c20: 65 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 0a  e each call to .
3c30: 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c  ** sqlite3OsMall
3c40: 6f 63 28 29 20 6f 72 20 78 52 65 61 6c 6c 6f 63  oc() or xRealloc
3c50: 28 29 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  (). The paramete
3c60: 72 20 27 6e 27 20 69 73 20 74 68 65 20 6e 75 6d  r 'n' is the num
3c70: 62 65 72 20 6f 66 0a 2a 2a 20 65 78 74 72 61 20  ber of.** extra 
3c80: 62 79 74 65 73 20 61 62 6f 75 74 20 74 6f 20 62  bytes about to b
3c90: 65 20 61 6c 6c 6f 63 61 74 65 64 20 28 66 6f 72  e allocated (for
3ca0: 20 52 65 61 6c 6c 6f 63 28 29 20 74 68 69 73 20   Realloc() this 
3cb0: 6d 65 61 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  means the size o
3cc0: 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 61 6c 6c  f the.** new all
3cd0: 6f 63 61 74 69 6f 6e 20 6c 65 73 73 20 74 68 65  ocation less the
3ce0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 6c 64   size of the old
3cf0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 29 2e 20 49 66   allocation). If
3d00: 20 74 68 65 20 65 78 74 72 61 20 61 6c 6c 6f 63   the extra alloc
3d10: 61 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74  ation.** means t
3d20: 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6d 65  hat the total me
3d30: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 74  mory allocated t
3d40: 6f 20 53 51 4c 69 74 65 20 69 6e 20 74 68 69 73  o SQLite in this
3d50: 20 74 68 72 65 61 64 20 77 6f 75 6c 64 20 65 78   thread would ex
3d60: 63 65 65 64 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ceed.** the limi
3d70: 74 20 73 65 74 20 62 79 20 73 71 6c 69 74 65 33  t set by sqlite3
3d80: 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
3d90: 28 29 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  (), then sqlite3
3da0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
3db0: 29 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 74  ) is.** called t
3dc0: 6f 20 74 72 79 20 74 6f 20 61 76 6f 69 64 20 74  o try to avoid t
3dd0: 68 69 73 2e 20 4e 6f 20 69 6e 64 69 63 61 74 69  his. No indicati
3de0: 6f 6e 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  on of whether or
3df0: 20 6e 6f 74 20 74 68 69 73 20 69 73 0a 2a 2a 20   not this is.** 
3e00: 73 75 63 63 65 73 73 66 75 6c 20 69 73 20 72 65  successful is re
3e10: 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
3e20: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ller..**.** If S
3e30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
3e40: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 69 73 20  Y_MANAGEMENT is 
3e50: 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75  defined, this fu
3e60: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
3e70: 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  p..*/.#ifndef SQ
3e80: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3e90: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74  _MANAGEMENT.stat
3ea0: 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 53 6f  ic void handleSo
3eb0: 66 74 4c 69 6d 69 74 28 69 6e 74 20 6e 29 7b 0a  ftLimit(int n){.
3ec0: 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
3ed0: 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  sd = sqlite3Thre
3ee0: 61 64 44 61 74 61 28 29 3b 0a 20 20 70 54 73 64  adData();.  pTsd
3ef0: 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 28 69 36 34  ->nAlloc += (i64
3f00: 29 6e 3b 0a 20 20 69 66 28 20 6e 3e 30 20 26 26  )n;.  if( n>0 &&
3f10: 20 70 54 73 64 2d 3e 6e 53 6f 66 74 48 65 61 70   pTsd->nSoftHeap
3f20: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 77  Limit>0 ){.    w
3f30: 68 69 6c 65 28 20 70 54 73 64 2d 3e 6e 41 6c 6c  hile( pTsd->nAll
3f40: 6f 63 3e 70 54 73 64 2d 3e 6e 53 6f 66 74 48 65  oc>pTsd->nSoftHe
3f50: 61 70 4c 69 6d 69 74 20 26 26 20 73 71 6c 69 74  apLimit && sqlit
3f60: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
3f70: 79 28 6e 29 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  y(n) );.  }.}.#e
3f80: 6c 73 65 0a 23 64 65 66 69 6e 65 20 68 61 6e 64  lse.#define hand
3f90: 6c 65 53 6f 66 74 4c 69 6d 69 74 28 78 29 0a 23  leSoftLimit(x).#
3fa0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  endif../*.** All
3fb0: 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
3fc0: 20 4e 20 62 79 74 65 73 20 6f 66 20 75 6e 69 6e   N bytes of unin
3fd0: 69 74 69 61 6c 69 73 65 64 20 6d 65 6d 6f 72 79  itialised memory
3fe0: 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73   by calling.** s
3ff0: 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 29  qlite3OsMalloc()
4000: 2e 20 49 66 20 74 68 65 20 4d 61 6c 6c 6f 63 28  . If the Malloc(
4010: 29 20 63 61 6c 6c 20 66 61 69 6c 73 2c 20 61 74  ) call fails, at
4020: 74 65 6d 70 74 20 74 6f 20 66 72 65 65 20 6d 65  tempt to free me
4030: 6d 6f 72 79 20 0a 2a 2a 20 62 79 20 63 61 6c 6c  mory .** by call
4040: 69 6e 67 20 73 71 6c 69 74 65 33 5f 72 65 6c 65  ing sqlite3_rele
4050: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 2a 2f  ase_memory()..*/
4060: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 61  .void *sqlite3Ma
4070: 6c 6c 6f 63 52 61 77 28 69 6e 74 20 6e 29 7b 0a  llocRaw(int n){.
4080: 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
4090: 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  sd = sqlite3Thre
40a0: 61 64 44 61 74 61 28 29 3b 0a 20 20 76 6f 69 64  adData();.  void
40b0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e   *p = 0;.  if( n
40c0: 3e 30 20 26 26 20 21 70 54 73 64 2d 3e 6d 61 6c  >0 && !pTsd->mal
40d0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
40e0: 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69 6d 69 74   handleSoftLimit
40f0: 28 6e 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  (n);.    while( 
4100: 21 28 70 20 3d 20 4f 53 4d 41 4c 4c 4f 43 28 6e  !(p = OSMALLOC(n
4110: 29 29 20 26 26 20 73 71 6c 69 74 65 33 5f 72 65  )) && sqlite3_re
4120: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 6e 29 20  lease_memory(n) 
4130: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b  );.    if( !p ){
4140: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
4150: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
4160: 65 64 2c 20 63 61 6c 6c 20 68 61 6e 64 6c 65 53  ed, call handleS
4170: 6f 66 74 4c 69 6d 69 74 28 29 20 61 67 61 69 6e  oftLimit() again
4180: 2c 20 74 68 69 73 20 74 69 6d 65 0a 20 20 20 20  , this time.    
4190: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 61 64    ** with the ad
41a0: 64 69 74 69 76 65 20 69 6e 76 65 72 73 65 20 6f  ditive inverse o
41b0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70  f the argument p
41c0: 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20 20 20  assed to .      
41d0: 2a 2a 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69 6d  ** handleSoftLim
41e0: 69 74 28 29 20 61 62 6f 76 65 2e 20 54 68 69 73  it() above. This
41f0: 20 69 73 20 73 6f 20 74 68 65 20 54 68 72 65 61   is so the Threa
4200: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 76 61 72  dData.nAlloc var
4210: 69 61 62 6c 65 20 69 73 0a 20 20 20 20 20 20 2a  iable is.      *
4220: 2a 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 20  * still correct 
4230: 61 66 74 65 72 20 61 20 6d 61 6c 6c 6f 63 28 29  after a malloc()
4240: 20 66 61 69 6c 75 72 65 2e 20 0a 20 20 20 20 20   failure. .     
4250: 20 2a 2f 0a 20 20 20 20 20 20 68 61 6e 64 6c 65   */.      handle
4260: 53 6f 66 74 4c 69 6d 69 74 28 6e 20 2a 20 2d 31  SoftLimit(n * -1
4270: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4280: 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61  ThreadData()->ma
4290: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
42a0: 20 20 20 20 20 20 4f 53 4d 41 4c 4c 4f 43 5f 46        OSMALLOC_F
42b0: 41 49 4c 45 44 28 29 3b 0a 20 20 20 20 7d 0a 20  AILED();.    }. 
42c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
42d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
42e0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  he allocation at
42f0: 20 70 20 74 6f 20 6e 20 62 79 74 65 73 20 62 79   p to n bytes by
4300: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
4310: 4f 73 52 65 61 6c 6c 6f 63 28 29 2e 20 54 68 65  OsRealloc(). The
4320: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
4330: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
4340: 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  n is returned.  
4350: 49 66 20 74 68 65 20 52 65 61 6c 6c 6f 63 28 29  If the Realloc()
4360: 20 63 61 6c 6c 20 66 61 69 6c 73 2c 0a 2a 2a 20   call fails,.** 
4370: 61 74 74 65 6d 70 74 20 74 6f 20 66 72 65 65 20  attempt to free 
4380: 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
4390: 67 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  g sqlite3_releas
43a0: 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 2a 2f 0a 76  e_memory()..*/.v
43b0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 52 65 61 6c  oid *sqlite3Real
43c0: 6c 6f 63 28 76 6f 69 64 20 2a 70 2c 20 69 6e 74  loc(void *p, int
43d0: 20 6e 29 7b 0a 20 20 54 68 72 65 61 64 44 61 74   n){.  ThreadDat
43e0: 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65  a *pTsd = sqlite
43f0: 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20  3ThreadData();. 
4400: 20 69 66 28 20 70 54 73 64 2d 3e 6d 61 6c 6c 6f   if( pTsd->mallo
4410: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
4420: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
4430: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
4440: 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 61 6c 6c  turn sqlite3Mall
4450: 6f 63 28 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  oc(n);.  }else{.
4460: 20 20 20 20 76 6f 69 64 20 2a 6e 70 20 3d 20 30      void *np = 0
4470: 3b 0a 20 20 20 20 68 61 6e 64 6c 65 53 6f 66 74  ;.    handleSoft
4480: 4c 69 6d 69 74 28 6e 20 2d 20 4f 53 53 49 5a 45  Limit(n - OSSIZE
4490: 4f 46 28 70 29 29 3b 0a 20 20 20 20 77 68 69 6c  OF(p));.    whil
44a0: 65 28 20 21 28 6e 70 20 3d 20 4f 53 52 45 41 4c  e( !(np = OSREAL
44b0: 4c 4f 43 28 70 2c 20 6e 29 29 20 26 26 20 73 71  LOC(p, n)) && sq
44c0: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
44d0: 6d 6f 72 79 28 6e 29 20 29 3b 0a 20 20 20 20 69  mory(n) );.    i
44e0: 66 28 20 21 6e 70 20 29 7b 0a 20 20 20 20 20 20  f( !np ){.      
44f0: 2f 2a 20 49 66 20 74 68 65 20 61 6c 6c 6f 63 61  /* If the alloca
4500: 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 63 61 6c  tion failed, cal
4510: 6c 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69 6d 69  l handleSoftLimi
4520: 74 28 29 20 61 67 61 69 6e 2c 20 74 68 69 73 20  t() again, this 
4530: 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 77 69  time.      ** wi
4540: 74 68 20 74 68 65 20 61 64 64 69 74 69 76 65 20  th the additive 
4550: 69 6e 76 65 72 73 65 20 6f 66 20 74 68 65 20 61  inverse of the a
4560: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
4570: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  o .      ** hand
4580: 6c 65 53 6f 66 74 4c 69 6d 69 74 28 29 20 61 62  leSoftLimit() ab
4590: 6f 76 65 2e 20 54 68 69 73 20 69 73 20 73 6f 20  ove. This is so 
45a0: 74 68 65 20 54 68 72 65 61 64 44 61 74 61 2e 6e  the ThreadData.n
45b0: 41 6c 6c 6f 63 20 76 61 72 69 61 62 6c 65 20 69  Alloc variable i
45c0: 73 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 6c 6c  s.      ** still
45d0: 20 63 6f 72 72 65 63 74 20 61 66 74 65 72 20 61   correct after a
45e0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
45f0: 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
4600: 20 20 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69 6d     handleSoftLim
4610: 69 74 28 4f 53 53 49 5a 45 4f 46 28 70 29 20 2d  it(OSSIZEOF(p) -
4620: 20 6e 29 3b 0a 20 20 20 20 20 20 70 54 73 64 2d   n);.      pTsd-
4630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
4640: 31 3b 0a 20 20 20 20 20 20 4f 53 4d 41 4c 4c 4f  1;.      OSMALLO
4650: 43 5f 46 41 49 4c 45 44 28 29 3b 0a 20 20 20 20  C_FAILED();.    
4660: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 70 3b  }.    return np;
4670: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
4680: 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f  ee the memory po
4690: 69 6e 74 65 64 20 74 6f 20 62 79 20 70 2e 20 70  inted to by p. p
46a0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
46b0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f  a NULL pointer o
46c0: 72 20 61 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  r a .** value re
46d0: 74 75 72 6e 65 64 20 62 79 20 61 20 70 72 65 76  turned by a prev
46e0: 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ious call to sql
46f0: 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 6f 72 20  ite3Malloc() or 
4700: 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 29  sqlite3Realloc()
4710: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4720: 33 46 72 65 65 58 28 76 6f 69 64 20 2a 70 29 7b  3FreeX(void *p){
4730: 0a 20 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69 6d  .  handleSoftLim
4740: 69 74 28 30 20 2d 20 4f 53 53 49 5a 45 4f 46 28  it(0 - OSSIZEOF(
4750: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  p));.  if( p ){.
4760: 20 20 20 20 4f 53 46 52 45 45 28 70 29 3b 0a 20      OSFREE(p);. 
4770: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 65   }.}../*.** A ve
4780: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 4d  rsion of sqliteM
4790: 61 6c 6c 6f 63 28 29 20 74 68 61 74 20 69 73 20  alloc() that is 
47a0: 61 6c 77 61 79 73 20 61 20 66 75 6e 63 74 69 6f  always a functio
47b0: 6e 2c 20 6e 6f 74 20 61 20 6d 61 63 72 6f 2e 0a  n, not a macro..
47c0: 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68  ** Currently, th
47d0: 69 73 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  is is used only 
47e0: 74 6f 20 61 6c 6c 6f 63 20 74 6f 20 61 6c 6c 6f  to alloc to allo
47f0: 63 61 74 65 20 74 68 65 20 70 61 72 73 65 72 20  cate the parser 
4800: 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  engine..*/.void 
4810: 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 58 28  *sqlite3MallocX(
4820: 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e  int n){.  return
4830: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 29   sqliteMalloc(n)
4840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
4850: 65 33 4d 61 6c 6c 6f 63 0a 2a 2a 20 73 71 6c 69  e3Malloc.** sqli
4860: 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  te3ReallocOrFree
4870: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 74 77 6f  .**.** These two
4880: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
4890: 20 61 73 20 77 72 61 70 70 65 72 73 20 61 72 6f   as wrappers aro
48a0: 75 6e 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  und sqlite3Mallo
48b0: 63 52 61 77 28 29 2c 20 0a 2a 2a 20 73 71 6c 69  cRaw(), .** sqli
48c0: 74 65 33 52 65 61 6c 6c 6f 63 28 29 20 61 6e 64  te3Realloc() and
48d0: 20 73 71 6c 69 74 65 33 46 72 65 65 28 29 2e 0a   sqlite3Free()..
48e0: 2a 2f 20 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  */ .void *sqlite
48f0: 33 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a  3Malloc(int n){.
4900: 20 20 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69    void *p = sqli
4910: 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 6e 29 3b  te3MallocRaw(n);
4920: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
4930: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 29 3b  memset(p, 0, n);
4940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
4950: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  .}.void sqlite3R
4960: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 6f 69  eallocOrFree(voi
4970: 64 20 2a 2a 70 70 2c 20 69 6e 74 20 6e 29 7b 0a  d **pp, int n){.
4980: 20 20 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69    void *p = sqli
4990: 74 65 33 52 65 61 6c 6c 6f 63 28 2a 70 70 2c 20  te3Realloc(*pp, 
49a0: 6e 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  n);.  if( !p ){.
49b0: 20 20 20 20 73 71 6c 69 74 65 33 46 72 65 65 58      sqlite3FreeX
49c0: 28 2a 70 70 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (*pp);.  }.  *pp
49d0: 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = p;.}../*.** R
49e0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
49f0: 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61   of bytes alloca
4a00: 74 65 64 20 61 74 20 6c 6f 63 61 74 69 6f 6e 20  ted at location 
4a10: 70 2e 20 70 20 6d 75 73 74 20 62 65 20 65 69 74  p. p must be eit
4a20: 68 65 72 20 0a 2a 2a 20 61 20 4e 55 4c 4c 20 70  her .** a NULL p
4a30: 6f 69 6e 74 65 72 20 28 69 6e 20 77 68 69 63 68  ointer (in which
4a40: 20 63 61 73 65 20 30 20 69 73 20 72 65 74 75 72   case 0 is retur
4a50: 6e 65 64 29 20 6f 72 20 61 20 70 6f 69 6e 74 65  ned) or a pointe
4a60: 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 0a 2a  r returned by .*
4a70: 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  * sqlite3Malloc(
4a80: 29 2c 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ), sqlite3Reallo
4a90: 63 28 29 20 6f 72 20 73 71 6c 69 74 65 33 52 65  c() or sqlite3Re
4aa0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 29 2e 0a 2a  allocOrFree()..*
4ab0: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
4ac0: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
4ad0: 65 64 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ed does not incl
4ae0: 75 64 65 20 61 6e 79 20 6f 76 65 72 68 65 61 64  ude any overhead
4af0: 20 69 6e 73 65 72 74 65 64 20 62 79 20 0a 2a 2a   inserted by .**
4b00: 20 61 6e 79 20 6d 61 6c 6c 6f 63 28 29 20 77 72   any malloc() wr
4b10: 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  apper functions 
4b20: 74 68 61 74 20 6d 61 79 20 62 65 20 63 61 6c 6c  that may be call
4b30: 65 64 2e 20 53 6f 20 74 68 65 20 76 61 6c 75 65  ed. So the value
4b40: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 73 20   returned.** is 
4b50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
4b60: 74 65 73 20 74 68 61 74 20 77 65 72 65 20 61 76  tes that were av
4b70: 61 69 6c 61 62 6c 65 20 74 6f 20 53 51 4c 69 74  ailable to SQLit
4b80: 65 20 75 73 69 6e 67 20 70 6f 69 6e 74 65 72 20  e using pointer 
4b90: 70 2c 20 0a 2a 2a 20 72 65 67 61 72 64 6c 65 73  p, .** regardles
4ba0: 73 20 6f 66 20 68 6f 77 20 6d 75 63 68 20 6d 65  s of how much me
4bb0: 6d 6f 72 79 20 77 61 73 20 61 63 74 75 61 6c 6c  mory was actuall
4bc0: 79 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a  y allocated..*/.
4bd0: 69 6e 74 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  int sqlite3Alloc
4be0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  Size(void *p){. 
4bf0: 20 72 65 74 75 72 6e 20 4f 53 53 49 5a 45 4f 46   return OSSIZEOF
4c00: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  (p);.}../*.** Ma
4c10: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 61 20 73  ke a copy of a s
4c20: 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20  tring in memory 
4c30: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4c40: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54 68  liteMalloc(). Th
4c50: 65 73 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ese .** function
4c60: 73 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4d 61  s call sqlite3Ma
4c70: 6c 6c 6f 63 52 61 77 28 29 20 64 69 72 65 63 74  llocRaw() direct
4c80: 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71  ly instead of sq
4c90: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54 68  liteMalloc(). Th
4ca0: 69 73 0a 2a 2a 20 69 73 20 62 65 63 61 75 73 65  is.** is because
4cb0: 20 77 68 65 6e 20 6d 65 6d 6f 72 79 20 64 65 62   when memory deb
4cc0: 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65 64  ugging is turned
4cd0: 20 6f 6e 2c 20 74 68 65 73 65 20 74 77 6f 20 66   on, these two f
4ce0: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a  unctions are .**
4cf0: 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72   called via macr
4d00: 6f 73 20 74 68 61 74 20 72 65 63 6f 72 64 20 74  os that record t
4d10: 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20  he current file 
4d20: 61 6e 64 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  and line number 
4d30: 69 6e 20 74 68 65 0a 2a 2a 20 54 68 72 65 61 64  in the.** Thread
4d40: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 0a  Data structure..
4d50: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
4d60: 53 74 72 44 75 70 28 63 6f 6e 73 74 20 63 68 61  StrDup(const cha
4d70: 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  r *z){.  char *z
4d80: 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  New;.  if( z==0 
4d90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 4e  ) return 0;.  zN
4da0: 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ew = sqlite3Mall
4db0: 6f 63 52 61 77 28 73 74 72 6c 65 6e 28 7a 29 2b  ocRaw(strlen(z)+
4dc0: 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29  1);.  if( zNew )
4dd0: 20 73 74 72 63 70 79 28 7a 4e 65 77 2c 20 7a 29   strcpy(zNew, z)
4de0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b  ;.  return zNew;
4df0: 0a 7d 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  .}.char *sqlite3
4e00: 53 74 72 4e 44 75 70 28 63 6f 6e 73 74 20 63 68  StrNDup(const ch
4e10: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
4e20: 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 69   char *zNew;.  i
4e30: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
4e40: 20 30 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c   0;.  zNew = sql
4e50: 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 6e 2b  ite3MallocRaw(n+
4e60: 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29  1);.  if( zNew )
4e70: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65  {.    memcpy(zNe
4e80: 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 4e  w, z, n);.    zN
4e90: 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ew[n] = 0;.  }. 
4ea0: 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a   return zNew;.}.
4eb0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
4ec0: 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  string from the 
4ed0: 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
4ee0: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 28 75 70  nt arguments (up
4ef0: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
4f00: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 29 2c   NULL argument),
4f10: 20 73 74 6f 72 65 20 74 68 65 20 73 74 72 69 6e   store the strin
4f20: 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  g in memory obta
4f30: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
4f40: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
4f50: 6d 61 6b 65 20 74 68 65 20 70 6f 69 6e 74 65 72  make the pointer
4f60: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
4f70: 65 20 31 73 74 20 61 72 67 75 6d 65 6e 74 0a 2a  e 1st argument.*
4f80: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  * point to that 
4f90: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 31 73 74  string.  The 1st
4fa0: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 65   argument must e
4fb0: 69 74 68 65 72 20 62 65 20 4e 55 4c 4c 20 6f 72  ither be NULL or
4fc0: 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 6d 65   .** point to me
4fd0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4fe0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
4ff0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
5000: 65 33 53 65 74 53 74 72 69 6e 67 28 63 68 61 72  e3SetString(char
5010: 20 2a 2a 70 7a 2c 20 2e 2e 2e 29 7b 0a 20 20 76   **pz, ...){.  v
5020: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
5030: 20 6e 42 79 74 65 3b 0a 20 20 63 6f 6e 73 74 20   nByte;.  const 
5040: 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20  char *z;.  char 
5050: 2a 7a 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28  *zResult;..  if(
5060: 20 70 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   pz==0 ) return;
5070: 0a 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20  .  nByte = 1;.  
5080: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70 7a 29  va_start(ap, pz)
5090: 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20 3d 20  ;.  while( (z = 
50a0: 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
50b0: 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20   char*))!=0 ){. 
50c0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
50d0: 65 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 76 61 5f  en(z);.  }.  va_
50e0: 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74  end(ap);.  sqlit
50f0: 65 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20 2a 70  eFree(*pz);.  *p
5100: 7a 20 3d 20 7a 52 65 73 75 6c 74 20 3d 20 73 71  z = zResult = sq
5110: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
5120: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 52  Byte );.  if( zR
5130: 65 73 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  esult==0 ){.    
5140: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2a 7a  return;.  }.  *z
5150: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 76 61  Result = 0;.  va
5160: 5f 73 74 61 72 74 28 61 70 2c 20 70 7a 29 3b 0a  _start(ap, pz);.
5170: 20 20 77 68 69 6c 65 28 20 28 7a 20 3d 20 76 61    while( (z = va
5180: 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
5190: 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20  har*))!=0 ){.   
51a0: 20 73 74 72 63 70 79 28 7a 52 65 73 75 6c 74 2c   strcpy(zResult,
51b0: 20 7a 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74   z);.    zResult
51c0: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 52 65 73 75   += strlen(zResu
51d0: 6c 74 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e  lt);.  }.  va_en
51e0: 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d(ap);.}../*.** 
51f0: 53 65 74 20 74 68 65 20 6d 6f 73 74 20 72 65 63  Set the most rec
5200: 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 61  ent error code a
5210: 6e 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20  nd error string 
5220: 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 0a 2a  for the sqlite.*
5230: 2a 20 68 61 6e 64 6c 65 20 22 64 62 22 2e 20 54  * handle "db". T
5240: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
5250: 20 73 65 74 20 74 6f 20 22 65 72 72 5f 63 6f 64   set to "err_cod
5260: 65 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  e"..**.** If it 
5270: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 72  is not NULL, str
5280: 69 6e 67 20 7a 46 6f 72 6d 61 74 20 73 70 65 63  ing zFormat spec
5290: 69 66 69 65 73 20 74 68 65 20 66 6f 72 6d 61 74  ifies the format
52a0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72   of the.** error
52b0: 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 73   string in the s
52c0: 74 79 6c 65 20 6f 66 20 74 68 65 20 70 72 69 6e  tyle of the prin
52d0: 74 66 20 66 75 6e 63 74 69 6f 6e 73 3a 20 54 68  tf functions: Th
52e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66  e following.** f
52f0: 6f 72 6d 61 74 20 63 68 61 72 61 63 74 65 72 73  ormat characters
5300: 20 61 72 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a   are allowed:.**
5310: 0a 2a 2a 20 20 20 20 20 20 25 73 20 20 20 20 20  .**      %s     
5320: 20 49 6e 73 65 72 74 20 61 20 73 74 72 69 6e 67   Insert a string
5330: 0a 2a 2a 20 20 20 20 20 20 25 7a 20 20 20 20 20  .**      %z     
5340: 20 41 20 73 74 72 69 6e 67 20 74 68 61 74 20 73   A string that s
5350: 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61  hould be freed a
5360: 66 74 65 72 20 75 73 65 0a 2a 2a 20 20 20 20 20  fter use.**     
5370: 20 25 64 20 20 20 20 20 20 49 6e 73 65 72 74 20   %d      Insert 
5380: 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  an integer.**   
5390: 20 20 20 25 54 20 20 20 20 20 20 49 6e 73 65 72     %T      Inser
53a0: 74 20 61 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  t a token.**    
53b0: 20 20 25 53 20 20 20 20 20 20 49 6e 73 65 72 74    %S      Insert
53c0: 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   the first eleme
53d0: 6e 74 20 6f 66 20 61 20 53 72 63 4c 69 73 74 0a  nt of a SrcList.
53e0: 2a 2a 0a 2a 2a 20 7a 46 6f 72 6d 61 74 20 61 6e  **.** zFormat an
53f0: 64 20 61 6e 79 20 73 74 72 69 6e 67 20 74 6f 6b  d any string tok
5400: 65 6e 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  ens that follow 
5410: 69 74 20 61 72 65 20 61 73 73 75 6d 65 64 20 74  it are assumed t
5420: 6f 20 62 65 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  o be.** encoded 
5430: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20  in UTF-8..**.** 
5440: 54 6f 20 63 6c 65 61 72 20 74 68 65 20 6d 6f 73  To clear the mos
5450: 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 66  t recent error f
5460: 6f 72 20 73 71 6c 69 74 65 20 68 61 6e 64 6c 65  or sqlite handle
5470: 20 22 64 62 22 2c 20 73 71 6c 69 74 65 33 45 72   "db", sqlite3Er
5480: 72 6f 72 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65  ror.** should be
5490: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 72 72   called with err
54a0: 5f 63 6f 64 65 20 73 65 74 20 74 6f 20 53 51 4c  _code set to SQL
54b0: 49 54 45 5f 4f 4b 20 61 6e 64 20 7a 46 6f 72 6d  ITE_OK and zForm
54c0: 61 74 20 73 65 74 0a 2a 2a 20 74 6f 20 4e 55 4c  at set.** to NUL
54d0: 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  L..*/.void sqlit
54e0: 65 33 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20  e3Error(sqlite3 
54f0: 2a 64 62 2c 20 69 6e 74 20 65 72 72 5f 63 6f 64  *db, int err_cod
5500: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
5510: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5520: 69 66 28 20 64 62 20 26 26 20 28 64 62 2d 3e 70  if( db && (db->p
5530: 45 72 72 20 7c 7c 20 28 64 62 2d 3e 70 45 72 72  Err || (db->pErr
5540: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
5550: 65 77 28 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  ew()))!=0 ){.   
5560: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 65   db->errCode = e
5570: 72 72 5f 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  rr_code;.    if(
5580: 20 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20   zFormat ){.    
5590: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20    char *z;.     
55a0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
55b0: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
55c0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20 20  zFormat);.      
55d0: 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  z = sqlite3VMPri
55e0: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
55f0: 3b 0a 20 20 20 20 20 20 76 61 5f 65 6e 64 28 61  ;.      va_end(a
5600: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
5610: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
5620: 3e 70 45 72 72 2c 20 2d 31 2c 20 7a 2c 20 53 51  >pErr, -1, z, SQ
5630: 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
5640: 65 33 46 72 65 65 58 29 3b 0a 20 20 20 20 7d 65  e3FreeX);.    }e
5650: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
5660: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
5670: 2d 3e 70 45 72 72 2c 20 30 2c 20 30 2c 20 53 51  ->pErr, 0, 0, SQ
5680: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
5690: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
56a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
56b0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
56c0: 67 65 20 74 6f 20 70 50 61 72 73 65 2d 3e 7a 45  ge to pParse->zE
56d0: 72 72 4d 73 67 20 61 6e 64 20 69 6e 63 72 65 6d  rrMsg and increm
56e0: 65 6e 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  ent pParse->nErr
56f0: 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ..** The followi
5700: 6e 67 20 66 6f 72 6d 61 74 74 69 6e 67 20 63 68  ng formatting ch
5710: 61 72 61 63 74 65 72 73 20 61 72 65 20 61 6c 6c  aracters are all
5720: 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  owed:.**.**     
5730: 20 25 73 20 20 20 20 20 20 49 6e 73 65 72 74 20   %s      Insert 
5740: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 20 20 20 20  a string.**     
5750: 20 25 7a 20 20 20 20 20 20 41 20 73 74 72 69 6e   %z      A strin
5760: 67 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  g that should be
5770: 20 66 72 65 65 64 20 61 66 74 65 72 20 75 73 65   freed after use
5780: 0a 2a 2a 20 20 20 20 20 20 25 64 20 20 20 20 20  .**      %d     
5790: 20 49 6e 73 65 72 74 20 61 6e 20 69 6e 74 65 67   Insert an integ
57a0: 65 72 0a 2a 2a 20 20 20 20 20 20 25 54 20 20 20  er.**      %T   
57b0: 20 20 20 49 6e 73 65 72 74 20 61 20 74 6f 6b 65     Insert a toke
57c0: 6e 0a 2a 2a 20 20 20 20 20 20 25 53 20 20 20 20  n.**      %S    
57d0: 20 20 49 6e 73 65 72 74 20 74 68 65 20 66 69 72    Insert the fir
57e0: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 20  st element of a 
57f0: 53 72 63 4c 69 73 74 0a 2a 2a 0a 2a 2a 20 54 68  SrcList.**.** Th
5800: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
5810: 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  ld be used to re
5820: 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 20 74  port any error t
5830: 68 61 74 20 6f 63 63 75 72 73 20 77 68 69 6c 73  hat occurs whils
5840: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 61  t.** compiling a
5850: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
5860: 28 69 2e 65 2e 20 77 69 74 68 69 6e 20 73 71 6c  (i.e. within sql
5870: 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 29 2e  ite3_prepare()).
5880: 20 54 68 65 0a 2a 2a 20 6c 61 73 74 20 74 68 69   The.** last thi
5890: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70  ng the sqlite3_p
58a0: 72 65 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f  repare() functio
58b0: 6e 20 64 6f 65 73 20 69 73 20 63 6f 70 79 20 74  n does is copy t
58c0: 68 65 20 65 72 72 6f 72 0a 2a 2a 20 73 74 6f 72  he error.** stor
58d0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
58e0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ion into the dat
58f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73 69  abase handle usi
5900: 6e 67 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  ng sqlite3Error(
5910: 29 2e 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 73  )..** Function s
5920: 71 6c 69 74 65 33 45 72 72 6f 72 28 29 20 73 68  qlite3Error() sh
5930: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 64 75 72  ould be used dur
5940: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 65 78  ing statement ex
5950: 65 63 75 74 69 6f 6e 0a 2a 2a 20 28 73 71 6c 69  ecution.** (sqli
5960: 74 65 33 5f 73 74 65 70 28 29 20 65 74 63 2e 29  te3_step() etc.)
5970: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5980: 33 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65 20  3ErrorMsg(Parse 
5990: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
59a0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
59b0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
59c0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  ;.  pParse->nErr
59d0: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  ++;.  sqliteFree
59e0: 28 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  (pParse->zErrMsg
59f0: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
5a00: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 50  , zFormat);.  pP
5a10: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  arse->zErrMsg = 
5a20: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
5a30: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
5a40: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
5a50: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 65  *.** Clear the e
5a60: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
5a70: 70 50 61 72 73 65 2c 20 69 66 20 61 6e 79 0a 2a  pParse, if any.*
5a80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 72  /.void sqlite3Er
5a90: 72 6f 72 43 6c 65 61 72 28 50 61 72 73 65 20 2a  rorClear(Parse *
5aa0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
5ab0: 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 7a 45  eFree(pParse->zE
5ac0: 72 72 4d 73 67 29 3b 0a 20 20 70 50 61 72 73 65  rrMsg);.  pParse
5ad0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
5ae0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 3d 20   pParse->nErr = 
5af0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  0;.}../*.** Conv
5b00: 65 72 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65  ert an SQL-style
5b10: 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 69   quoted string i
5b20: 6e 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72  nto a normal str
5b30: 69 6e 67 20 62 79 20 72 65 6d 6f 76 69 6e 67 0a  ing by removing.
5b40: 2a 2a 20 74 68 65 20 71 75 6f 74 65 20 63 68 61  ** the quote cha
5b50: 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 63 6f  racters.  The co
5b60: 6e 76 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65  nversion is done
5b70: 20 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20 74   in-place.  If t
5b80: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73  he.** input does
5b90: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
5ba0: 61 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  a quote characte
5bb0: 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
5bc0: 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tine.** is a no-
5bd0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 32 2d 46  op..**.** 2002-F
5be0: 65 62 2d 31 34 3a 20 54 68 69 73 20 72 6f 75 74  eb-14: This rout
5bf0: 69 6e 65 20 69 73 20 65 78 74 65 6e 64 65 64 20  ine is extended 
5c00: 74 6f 20 72 65 6d 6f 76 65 20 4d 53 2d 41 63 63  to remove MS-Acc
5c10: 65 73 73 20 73 74 79 6c 65 0a 2a 2a 20 62 72 61  ess style.** bra
5c20: 63 6b 65 74 73 20 66 72 6f 6d 20 61 72 6f 75 6e  ckets from aroun
5c30: 64 20 69 64 65 6e 74 69 66 65 72 73 2e 20 20 46  d identifers.  F
5c40: 6f 72 20 65 78 61 6d 70 6c 65 3a 20 20 22 5b 61  or example:  "[a
5c50: 2d 62 2d 63 5d 22 20 62 65 63 6f 6d 65 73 0a 2a  -b-c]" becomes.*
5c60: 2a 20 22 61 2d 62 2d 63 22 2e 0a 2a 2f 0a 76 6f  * "a-b-c"..*/.vo
5c70: 69 64 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  id sqlite3Dequot
5c80: 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  e(char *z){.  in
5c90: 74 20 71 75 6f 74 65 3b 0a 20 20 69 6e 74 20 69  t quote;.  int i
5ca0: 2c 20 6a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  , j;.  if( z==0 
5cb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 71 75 6f 74  ) return;.  quot
5cc0: 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 73 77 69 74  e = z[0];.  swit
5cd0: 63 68 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20  ch( quote ){.   
5ce0: 20 63 61 73 65 20 27 5c 27 27 3a 20 20 62 72 65   case '\'':  bre
5cf0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 22 27  ak;.    case '"'
5d00: 3a 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  :   break;.    c
5d10: 61 73 65 20 27 60 27 3a 20 20 20 62 72 65 61 6b  ase '`':   break
5d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5d30: 20 2f 2a 20 46 6f 72 20 4d 79 53 51 4c 20 63 6f   /* For MySQL co
5d40: 6d 70 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20  mpatibility */. 
5d50: 20 20 20 63 61 73 65 20 27 5b 27 3a 20 20 20 71     case '[':   q
5d60: 75 6f 74 65 20 3d 20 27 5d 27 3b 20 20 62 72 65  uote = ']';  bre
5d70: 61 6b 3b 20 20 2f 2a 20 46 6f 72 20 4d 53 20 53  ak;  /* For MS S
5d80: 71 6c 53 65 72 76 65 72 20 63 6f 6d 70 61 74 69  qlServer compati
5d90: 62 69 6c 69 74 79 20 2a 2f 0a 20 20 20 20 64 65  bility */.    de
5da0: 66 61 75 6c 74 3a 20 20 20 20 72 65 74 75 72 6e  fault:    return
5db0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 31 2c  ;.  }.  for(i=1,
5dc0: 20 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29   j=0; z[i]; i++)
5dd0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
5de0: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 69  quote ){.      i
5df0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 71 75 6f 74 65  f( z[i+1]==quote
5e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b   ){.        z[j+
5e10: 2b 5d 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20  +] = quote;.    
5e20: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d      i++;.      }
5e30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
5e40: 6a 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  j++] = 0;.      
5e50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5e60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e70: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
5e80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
5e90: 20 41 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 70   An array to map
5ea0: 20 61 6c 6c 20 75 70 70 65 72 2d 63 61 73 65 20   all upper-case 
5eb0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20  characters into 
5ec0: 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
5ed0: 69 6e 67 0a 2a 2a 20 6c 6f 77 65 72 2d 63 61 73  ing.** lower-cas
5ee0: 65 20 63 68 61 72 61 63 74 65 72 2e 20 0a 2a 2f  e character. .*/
5ef0: 0a 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  .const unsigned 
5f00: 63 68 61 72 20 73 71 6c 69 74 65 33 55 70 70 65  char sqlite3Uppe
5f10: 72 54 6f 4c 6f 77 65 72 5b 5d 20 3d 20 7b 0a 20  rToLower[] = {. 
5f20: 20 20 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20       0,  1,  2, 
5f30: 20 33 2c 20 20 34 2c 20 20 35 2c 20 20 36 2c 20   3,  4,  5,  6, 
5f40: 20 37 2c 20 20 38 2c 20 20 39 2c 20 31 30 2c 20   7,  8,  9, 10, 
5f50: 31 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c 20  11, 12, 13, 14, 
5f60: 31 35 2c 20 31 36 2c 20 31 37 2c 0a 20 20 20 20  15, 16, 17,.    
5f70: 20 31 38 2c 20 31 39 2c 20 32 30 2c 20 32 31 2c   18, 19, 20, 21,
5f80: 20 32 32 2c 20 32 33 2c 20 32 34 2c 20 32 35 2c   22, 23, 24, 25,
5f90: 20 32 36 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c   26, 27, 28, 29,
5fa0: 20 33 30 2c 20 33 31 2c 20 33 32 2c 20 33 33 2c   30, 31, 32, 33,
5fb0: 20 33 34 2c 20 33 35 2c 0a 20 20 20 20 20 33 36   34, 35,.     36
5fc0: 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30  , 37, 38, 39, 40
5fd0: 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 34 34  , 41, 42, 43, 44
5fe0: 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34 38  , 45, 46, 47, 48
5ff0: 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 20 35 32  , 49, 50, 51, 52
6000: 2c 20 35 33 2c 0a 20 20 20 20 20 35 34 2c 20 35  , 53,.     54, 5
6010: 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35  5, 56, 57, 58, 5
6020: 39 2c 20 36 30 2c 20 36 31 2c 20 36 32 2c 20 36  9, 60, 61, 62, 6
6030: 33 2c 20 36 34 2c 20 39 37 2c 20 39 38 2c 20 39  3, 64, 97, 98, 9
6040: 39 2c 31 30 30 2c 31 30 31 2c 31 30 32 2c 31 30  9,100,101,102,10
6050: 33 2c 0a 20 20 20 20 31 30 34 2c 31 30 35 2c 31  3,.    104,105,1
6060: 30 36 2c 31 30 37 2c 31 30 38 2c 31 30 39 2c 31  06,107,108,109,1
6070: 31 30 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c 31  10,111,112,113,1
6080: 31 34 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c 31  14,115,116,117,1
6090: 31 38 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c 0a  18,119,120,121,.
60a0: 20 20 20 20 31 32 32 2c 20 39 31 2c 20 39 32 2c      122, 91, 92,
60b0: 20 39 33 2c 20 39 34 2c 20 39 35 2c 20 39 36 2c   93, 94, 95, 96,
60c0: 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c   97, 98, 99,100,
60d0: 31 30 31 2c 31 30 32 2c 31 30 33 2c 31 30 34 2c  101,102,103,104,
60e0: 31 30 35 2c 31 30 36 2c 31 30 37 2c 0a 20 20 20  105,106,107,.   
60f0: 20 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31   108,109,110,111
6100: 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 35  ,112,113,114,115
6110: 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 39  ,116,117,118,119
6120: 2c 31 32 30 2c 31 32 31 2c 31 32 32 2c 31 32 33  ,120,121,122,123
6130: 2c 31 32 34 2c 31 32 35 2c 0a 20 20 20 20 31 32  ,124,125,.    12
6140: 36 2c 31 32 37 2c 31 32 38 2c 31 32 39 2c 31 33  6,127,128,129,13
6150: 30 2c 31 33 31 2c 31 33 32 2c 31 33 33 2c 31 33  0,131,132,133,13
6160: 34 2c 31 33 35 2c 31 33 36 2c 31 33 37 2c 31 33  4,135,136,137,13
6170: 38 2c 31 33 39 2c 31 34 30 2c 31 34 31 2c 31 34  8,139,140,141,14
6180: 32 2c 31 34 33 2c 0a 20 20 20 20 31 34 34 2c 31  2,143,.    144,1
6190: 34 35 2c 31 34 36 2c 31 34 37 2c 31 34 38 2c 31  45,146,147,148,1
61a0: 34 39 2c 31 35 30 2c 31 35 31 2c 31 35 32 2c 31  49,150,151,152,1
61b0: 35 33 2c 31 35 34 2c 31 35 35 2c 31 35 36 2c 31  53,154,155,156,1
61c0: 35 37 2c 31 35 38 2c 31 35 39 2c 31 36 30 2c 31  57,158,159,160,1
61d0: 36 31 2c 0a 20 20 20 20 31 36 32 2c 31 36 33 2c  61,.    162,163,
61e0: 31 36 34 2c 31 36 35 2c 31 36 36 2c 31 36 37 2c  164,165,166,167,
61f0: 31 36 38 2c 31 36 39 2c 31 37 30 2c 31 37 31 2c  168,169,170,171,
6200: 31 37 32 2c 31 37 33 2c 31 37 34 2c 31 37 35 2c  172,173,174,175,
6210: 31 37 36 2c 31 37 37 2c 31 37 38 2c 31 37 39 2c  176,177,178,179,
6220: 0a 20 20 20 20 31 38 30 2c 31 38 31 2c 31 38 32  .    180,181,182
6230: 2c 31 38 33 2c 31 38 34 2c 31 38 35 2c 31 38 36  ,183,184,185,186
6240: 2c 31 38 37 2c 31 38 38 2c 31 38 39 2c 31 39 30  ,187,188,189,190
6250: 2c 31 39 31 2c 31 39 32 2c 31 39 33 2c 31 39 34  ,191,192,193,194
6260: 2c 31 39 35 2c 31 39 36 2c 31 39 37 2c 0a 20 20  ,195,196,197,.  
6270: 20 20 31 39 38 2c 31 39 39 2c 32 30 30 2c 32 30    198,199,200,20
6280: 31 2c 32 30 32 2c 32 30 33 2c 32 30 34 2c 32 30  1,202,203,204,20
6290: 35 2c 32 30 36 2c 32 30 37 2c 32 30 38 2c 32 30  5,206,207,208,20
62a0: 39 2c 32 31 30 2c 32 31 31 2c 32 31 32 2c 32 31  9,210,211,212,21
62b0: 33 2c 32 31 34 2c 32 31 35 2c 0a 20 20 20 20 32  3,214,215,.    2
62c0: 31 36 2c 32 31 37 2c 32 31 38 2c 32 31 39 2c 32  16,217,218,219,2
62d0: 32 30 2c 32 32 31 2c 32 32 32 2c 32 32 33 2c 32  20,221,222,223,2
62e0: 32 34 2c 32 32 35 2c 32 32 36 2c 32 32 37 2c 32  24,225,226,227,2
62f0: 32 38 2c 32 32 39 2c 32 33 30 2c 32 33 31 2c 32  28,229,230,231,2
6300: 33 32 2c 32 33 33 2c 0a 20 20 20 20 32 33 34 2c  32,233,.    234,
6310: 32 33 35 2c 32 33 36 2c 32 33 37 2c 32 33 38 2c  235,236,237,238,
6320: 32 33 39 2c 32 34 30 2c 32 34 31 2c 32 34 32 2c  239,240,241,242,
6330: 32 34 33 2c 32 34 34 2c 32 34 35 2c 32 34 36 2c  243,244,245,246,
6340: 32 34 37 2c 32 34 38 2c 32 34 39 2c 32 35 30 2c  247,248,249,250,
6350: 32 35 31 2c 0a 20 20 20 20 32 35 32 2c 32 35 33  251,.    252,253
6360: 2c 32 35 34 2c 32 35 35 0a 7d 3b 0a 23 64 65 66  ,254,255.};.#def
6370: 69 6e 65 20 55 70 70 65 72 54 6f 4c 6f 77 65 72  ine UpperToLower
6380: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
6390: 6f 77 65 72 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ower../*.** Some
63a0: 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 73 74   systems have st
63b0: 72 69 63 6d 70 28 29 2e 20 20 4f 74 68 65 72 73  ricmp().  Others
63c0: 20 68 61 76 65 20 73 74 72 63 61 73 65 63 6d 70   have strcasecmp
63d0: 28 29 2e 20 20 42 65 63 61 75 73 65 0a 2a 2a 20  ().  Because.** 
63e0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 73  there is no cons
63f0: 69 73 74 65 6e 63 79 2c 20 77 65 20 77 69 6c 6c  istency, we will
6400: 20 64 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e 2e   define our own.
6410: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
6420: 74 72 49 43 6d 70 28 63 6f 6e 73 74 20 63 68 61  trICmp(const cha
6430: 72 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20  r *zLeft, const 
6440: 63 68 61 72 20 2a 7a 52 69 67 68 74 29 7b 0a 20  char *zRight){. 
6450: 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e   register unsign
6460: 65 64 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0a  ed char *a, *b;.
6470: 20 20 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20    a = (unsigned 
6480: 63 68 61 72 20 2a 29 7a 4c 65 66 74 3b 0a 20 20  char *)zLeft;.  
6490: 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
64a0: 61 72 20 2a 29 7a 52 69 67 68 74 3b 0a 20 20 77  ar *)zRight;.  w
64b0: 68 69 6c 65 28 20 2a 61 21 3d 30 20 26 26 20 55  hile( *a!=0 && U
64c0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d  pperToLower[*a]=
64d0: 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62  =UpperToLower[*b
64e0: 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a  ]){ a++; b++; }.
64f0: 20 20 72 65 74 75 72 6e 20 55 70 70 65 72 54 6f    return UpperTo
6500: 4c 6f 77 65 72 5b 2a 61 5d 20 2d 20 55 70 70 65  Lower[*a] - Uppe
6510: 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d 3b 0a 7d 0a  rToLower[*b];.}.
6520: 69 6e 74 20 73 71 6c 69 74 65 33 53 74 72 4e 49  int sqlite3StrNI
6530: 43 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Cmp(const char *
6540: 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63 68 61  zLeft, const cha
6550: 72 20 2a 7a 52 69 67 68 74 2c 20 69 6e 74 20 4e  r *zRight, int N
6560: 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20 75 6e  ){.  register un
6570: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20  signed char *a, 
6580: 2a 62 3b 0a 20 20 61 20 3d 20 28 75 6e 73 69 67  *b;.  a = (unsig
6590: 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c 65 66 74  ned char *)zLeft
65a0: 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e 65  ;.  b = (unsigne
65b0: 64 20 63 68 61 72 20 2a 29 7a 52 69 67 68 74 3b  d char *)zRight;
65c0: 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20  .  while( N-- > 
65d0: 30 20 26 26 20 2a 61 21 3d 30 20 26 26 20 55 70  0 && *a!=0 && Up
65e0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d 3d  perToLower[*a]==
65f0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d  UpperToLower[*b]
6600: 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a 20  ){ a++; b++; }. 
6610: 20 72 65 74 75 72 6e 20 4e 3c 30 20 3f 20 30 20   return N<0 ? 0 
6620: 3a 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  : UpperToLower[*
6630: 61 5d 20 2d 20 55 70 70 65 72 54 6f 4c 6f 77 65  a] - UpperToLowe
6640: 72 5b 2a 62 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r[*b];.}../*.** 
6650: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a  Return TRUE if z
6660: 20 69 73 20 61 20 70 75 72 65 20 6e 75 6d 65 72   is a pure numer
6670: 69 63 20 73 74 72 69 6e 67 2e 20 20 52 65 74 75  ic string.  Retu
6680: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 0a  rn FALSE if the.
6690: 2a 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ** string contai
66a0: 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72  ns any character
66b0: 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 70 61   which is not pa
66c0: 72 74 20 6f 66 20 61 20 6e 75 6d 62 65 72 2e 20  rt of a number. 
66d0: 49 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  If.** the string
66e0: 20 69 73 20 6e 75 6d 65 72 69 63 20 61 6e 64 20   is numeric and 
66f0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 27 2e 27  contains the '.'
6700: 20 63 68 61 72 61 63 74 65 72 2c 20 73 65 74 20   character, set 
6710: 2a 72 65 61 6c 6e 75 6d 0a 2a 2a 20 74 6f 20 54  *realnum.** to T
6720: 52 55 45 20 28 6f 74 68 65 72 77 69 73 65 20 46  RUE (otherwise F
6730: 41 4c 53 45 29 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  ALSE)..**.** An 
6740: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20  empty string is 
6750: 63 6f 6e 73 69 64 65 72 65 64 20 6e 6f 6e 2d 6e  considered non-n
6760: 75 6d 65 72 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73  umeric..*/.int s
6770: 71 6c 69 74 65 33 49 73 4e 75 6d 62 65 72 28 63  qlite3IsNumber(c
6780: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
6790: 74 20 2a 72 65 61 6c 6e 75 6d 2c 20 75 38 20 65  t *realnum, u8 e
67a0: 6e 63 29 7b 0a 20 20 69 6e 74 20 69 6e 63 72 20  nc){.  int incr 
67b0: 3d 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  = (enc==SQLITE_U
67c0: 54 46 38 3f 31 3a 32 29 3b 0a 20 20 69 66 28 20  TF8?1:2);.  if( 
67d0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
67e0: 36 42 45 20 29 20 7a 2b 2b 3b 0a 20 20 69 66 28  6BE ) z++;.  if(
67f0: 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d   *z=='-' || *z==
6800: 27 2b 27 20 29 20 7a 20 2b 3d 20 69 6e 63 72 3b  '+' ) z += incr;
6810: 0a 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28  .  if( !isdigit(
6820: 2a 28 75 38 2a 29 7a 29 20 29 7b 0a 20 20 20 20  *(u8*)z) ){.    
6830: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6840: 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 69 66 28  z += incr;.  if(
6850: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
6860: 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  num = 0;.  while
6870: 28 20 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29  ( isdigit(*(u8*)
6880: 7a 29 20 29 7b 20 7a 20 2b 3d 20 69 6e 63 72 3b  z) ){ z += incr;
6890: 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27   }.  if( *z=='.'
68a0: 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20 69 6e 63   ){.    z += inc
68b0: 72 3b 0a 20 20 20 20 69 66 28 20 21 69 73 64 69  r;.    if( !isdi
68c0: 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 20 72  git(*(u8*)z) ) r
68d0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69  eturn 0;.    whi
68e0: 6c 65 28 20 69 73 64 69 67 69 74 28 2a 28 75 38  le( isdigit(*(u8
68f0: 2a 29 7a 29 20 29 7b 20 7a 20 2b 3d 20 69 6e 63  *)z) ){ z += inc
6900: 72 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61  r; }.    if( rea
6910: 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20  lnum ) *realnum 
6920: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a  = 1;.  }.  if( *
6930: 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45  z=='e' || *z=='E
6940: 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20 69 6e  ' ){.    z += in
6950: 63 72 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  cr;.    if( *z==
6960: 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29  '+' || *z=='-' )
6970: 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 20 20   z += incr;.    
6980: 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 28 75  if( !isdigit(*(u
6990: 38 2a 29 7a 29 20 29 20 72 65 74 75 72 6e 20 30  8*)z) ) return 0
69a0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 64  ;.    while( isd
69b0: 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b  igit(*(u8*)z) ){
69c0: 20 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a 20 20   z += incr; }.  
69d0: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
69e0: 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20  *realnum = 1;.  
69f0: 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30  }.  return *z==0
6a00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
6a10: 74 72 69 6e 67 20 7a 5b 5d 20 69 73 20 61 6e 20  tring z[] is an 
6a20: 61 73 63 69 69 20 72 65 70 72 65 73 65 6e 74 61  ascii representa
6a30: 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 6c 20 6e  tion of a real n
6a40: 75 6d 62 65 72 2e 0a 2a 2a 20 43 6f 6e 76 65 72  umber..** Conver
6a50: 74 20 74 68 69 73 20 73 74 72 69 6e 67 20 74 6f  t this string to
6a60: 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2a 0a 2a 2a   a double..**.**
6a70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
6a80: 73 75 6d 65 73 20 74 68 61 74 20 7a 5b 5d 20 72  sumes that z[] r
6a90: 65 61 6c 6c 79 20 69 73 20 61 20 76 61 6c 69 64  eally is a valid
6aa0: 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 69 74 0a   number.  If it.
6ab0: 2a 2a 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 72  ** is not, the r
6ac0: 65 73 75 6c 74 20 69 73 20 75 6e 64 65 66 69 6e  esult is undefin
6ad0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
6ae0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69  outine is used i
6af0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6c 69  nstead of the li
6b00: 62 72 61 72 79 20 61 74 6f 66 28 29 20 66 75 6e  brary atof() fun
6b10: 63 74 69 6f 6e 20 62 65 63 61 75 73 65 0a 2a 2a  ction because.**
6b20: 20 74 68 65 20 6c 69 62 72 61 72 79 20 61 74 6f   the library ato
6b30: 66 28 29 20 6d 69 67 68 74 20 77 61 6e 74 20 74  f() might want t
6b40: 6f 20 75 73 65 20 22 2c 22 20 61 73 20 74 68 65  o use "," as the
6b50: 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 69   decimal point i
6b60: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 22 2e 22  nstead.** of "."
6b70: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68 6f   depending on ho
6b80: 77 20 6c 6f 63 61 6c 65 20 69 73 20 73 65 74 2e  w locale is set.
6b90: 20 20 42 75 74 20 74 68 61 74 20 77 6f 75 6c 64    But that would
6ba0: 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 0a   cause problems.
6bb0: 2a 2a 20 66 6f 72 20 53 51 4c 2e 20 20 53 6f 20  ** for SQL.  So 
6bc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  this routine alw
6bd0: 61 79 73 20 75 73 65 73 20 22 2e 22 20 72 65 67  ays uses "." reg
6be0: 61 72 64 6c 65 73 73 20 6f 66 20 6c 6f 63 61 6c  ardless of local
6bf0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6c00: 33 41 74 6f 46 28 63 6f 6e 73 74 20 63 68 61 72  3AtoF(const char
6c10: 20 2a 7a 2c 20 64 6f 75 62 6c 65 20 2a 70 52 65   *z, double *pRe
6c20: 73 75 6c 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  sult){.#ifndef S
6c30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
6c40: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 69 6e 74 20  ING_POINT.  int 
6c50: 73 69 67 6e 20 3d 20 31 3b 0a 20 20 63 6f 6e 73  sign = 1;.  cons
6c60: 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d  t char *zBegin =
6c70: 20 7a 3b 0a 20 20 4c 4f 4e 47 44 4f 55 42 4c 45   z;.  LONGDOUBLE
6c80: 5f 54 59 50 45 20 76 31 20 3d 20 30 2e 30 3b 0a  _TYPE v1 = 0.0;.
6c90: 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b    if( *z=='-' ){
6ca0: 0a 20 20 20 20 73 69 67 6e 20 3d 20 2d 31 3b 0a  .    sign = -1;.
6cb0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 65 6c 73 65      z++;.  }else
6cc0: 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a   if( *z=='+' ){.
6cd0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 77      z++;.  }.  w
6ce0: 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 28  hile( isdigit(*(
6cf0: 75 38 2a 29 7a 29 20 29 7b 0a 20 20 20 20 76 31  u8*)z) ){.    v1
6d00: 20 3d 20 76 31 2a 31 30 2e 30 20 2b 20 28 2a 7a   = v1*10.0 + (*z
6d10: 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 7a 2b 2b   - '0');.    z++
6d20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d  ;.  }.  if( *z==
6d30: 27 2e 27 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44  '.' ){.    LONGD
6d40: 4f 55 42 4c 45 5f 54 59 50 45 20 64 69 76 69 73  OUBLE_TYPE divis
6d50: 6f 72 20 3d 20 31 2e 30 3b 0a 20 20 20 20 7a 2b  or = 1.0;.    z+
6d60: 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  +;.    while( is
6d70: 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29  digit(*(u8*)z) )
6d80: 7b 0a 20 20 20 20 20 20 76 31 20 3d 20 76 31 2a  {.      v1 = v1*
6d90: 31 30 2e 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27  10.0 + (*z - '0'
6da0: 29 3b 0a 20 20 20 20 20 20 64 69 76 69 73 6f 72  );.      divisor
6db0: 20 2a 3d 20 31 30 2e 30 3b 0a 20 20 20 20 20 20   *= 10.0;.      
6dc0: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  z++;.    }.    v
6dd0: 31 20 2f 3d 20 64 69 76 69 73 6f 72 3b 0a 20 20  1 /= divisor;.  
6de0: 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20  }.  if( *z=='e' 
6df0: 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20  || *z=='E' ){.  
6e00: 20 20 69 6e 74 20 65 73 69 67 6e 20 3d 20 31 3b    int esign = 1;
6e10: 0a 20 20 20 20 69 6e 74 20 65 76 61 6c 20 3d 20  .    int eval = 
6e20: 30 3b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c  0;.    LONGDOUBL
6e30: 45 5f 54 59 50 45 20 73 63 61 6c 65 20 3d 20 31  E_TYPE scale = 1
6e40: 2e 30 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  .0;.    z++;.   
6e50: 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b 0a   if( *z=='-' ){.
6e60: 20 20 20 20 20 20 65 73 69 67 6e 20 3d 20 2d 31        esign = -1
6e70: 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  ;.      z++;.   
6e80: 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 3d 3d 27   }else if( *z=='
6e90: 2b 27 20 29 7b 0a 20 20 20 20 20 20 7a 2b 2b 3b  +' ){.      z++;
6ea0: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
6eb0: 28 20 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29  ( isdigit(*(u8*)
6ec0: 7a 29 20 29 7b 0a 20 20 20 20 20 20 65 76 61 6c  z) ){.      eval
6ed0: 20 3d 20 65 76 61 6c 2a 31 30 20 2b 20 2a 7a 20   = eval*10 + *z 
6ee0: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b  - '0';.      z++
6ef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
6f00: 65 28 20 65 76 61 6c 3e 3d 36 34 20 29 7b 20 73  e( eval>=64 ){ s
6f10: 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 36 34 3b  cale *= 1.0e+64;
6f20: 20 65 76 61 6c 20 2d 3d 20 36 34 3b 20 7d 0a 20   eval -= 64; }. 
6f30: 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e 3d     while( eval>=
6f40: 31 36 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31  16 ){ scale *= 1
6f50: 2e 30 65 2b 31 36 3b 20 65 76 61 6c 20 2d 3d 20  .0e+16; eval -= 
6f60: 31 36 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28  16; }.    while(
6f70: 20 65 76 61 6c 3e 3d 34 20 29 7b 20 73 63 61 6c   eval>=4 ){ scal
6f80: 65 20 2a 3d 20 31 2e 30 65 2b 34 3b 20 65 76 61  e *= 1.0e+4; eva
6f90: 6c 20 2d 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68  l -= 4; }.    wh
6fa0: 69 6c 65 28 20 65 76 61 6c 3e 3d 31 20 29 7b 20  ile( eval>=1 ){ 
6fb0: 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 31 3b  scale *= 1.0e+1;
6fc0: 20 65 76 61 6c 20 2d 3d 20 31 3b 20 7d 0a 20 20   eval -= 1; }.  
6fd0: 20 20 69 66 28 20 65 73 69 67 6e 3c 30 20 29 7b    if( esign<0 ){
6fe0: 0a 20 20 20 20 20 20 76 31 20 2f 3d 20 73 63 61  .      v1 /= sca
6ff0: 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  le;.    }else{. 
7000: 20 20 20 20 20 76 31 20 2a 3d 20 73 63 61 6c 65       v1 *= scale
7010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
7020: 52 65 73 75 6c 74 20 3d 20 73 69 67 6e 3c 30 20  Result = sign<0 
7030: 3f 20 2d 76 31 20 3a 20 76 31 3b 0a 20 20 72 65  ? -v1 : v1;.  re
7040: 74 75 72 6e 20 7a 20 2d 20 7a 42 65 67 69 6e 3b  turn z - zBegin;
7050: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
7060: 73 71 6c 69 74 65 33 61 74 6f 69 36 34 28 7a 2c  sqlite3atoi64(z,
7070: 20 70 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69   pResult);.#endi
7080: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7090: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20  _FLOATING_POINT 
70a0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  */.}../*.** Retu
70b0: 72 6e 20 54 52 55 45 20 69 66 20 7a 4e 75 6d 20  rn TRUE if zNum 
70c0: 69 73 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e  is a 64-bit sign
70d0: 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 77  ed integer and w
70e0: 72 69 74 65 0a 2a 2a 20 74 68 65 20 76 61 6c 75  rite.** the valu
70f0: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
7100: 20 69 6e 74 6f 20 2a 70 4e 75 6d 2e 20 20 49 66   into *pNum.  If
7110: 20 7a 4e 75 6d 20 69 73 20 6e 6f 74 20 61 6e 20   zNum is not an 
7120: 69 6e 74 65 67 65 72 0a 2a 2a 20 6f 72 20 69 73  integer.** or is
7130: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74   an integer that
7140: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f   is too large to
7150: 20 62 65 20 65 78 70 72 65 73 73 65 64 20 77 69   be expressed wi
7160: 74 68 20 36 34 20 62 69 74 73 2c 0a 2a 2a 20 74  th 64 bits,.** t
7170: 68 65 6e 20 72 65 74 75 72 6e 20 66 61 6c 73 65  hen return false
7180: 2e 20 20 49 66 20 6e 3e 30 20 61 6e 64 20 74 68  .  If n>0 and th
7190: 65 20 69 6e 74 65 67 65 72 20 69 73 20 73 74 72  e integer is str
71a0: 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ing is not.** ex
71b0: 61 63 74 6c 79 20 6e 20 62 79 74 65 73 20 6c 6f  actly n bytes lo
71c0: 6e 67 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ng, return false
71d0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
71e0: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 6f 72  s routine was or
71f0: 69 67 69 6e 61 6c 6c 79 20 77 72 69 74 74 65 6e  iginally written
7200: 20 69 74 20 64 65 61 6c 74 20 77 69 74 68 20 6f   it dealt with o
7210: 6e 6c 79 0a 2a 2a 20 33 32 2d 62 69 74 20 6e 75  nly.** 32-bit nu
7220: 6d 62 65 72 73 2e 20 20 41 74 20 74 68 61 74 20  mbers.  At that 
7230: 74 69 6d 65 2c 20 69 74 20 77 61 73 20 6d 75 63  time, it was muc
7240: 68 20 66 61 73 74 65 72 20 74 68 61 6e 20 74 68  h faster than th
7250: 65 0a 2a 2a 20 61 74 6f 69 28 29 20 6c 69 62 72  e.** atoi() libr
7260: 61 72 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 52  ary routine in R
7270: 65 64 48 61 74 20 37 2e 32 2e 0a 2a 2f 0a 69 6e  edHat 7.2..*/.in
7280: 74 20 73 71 6c 69 74 65 33 61 74 6f 69 36 34 28  t sqlite3atoi64(
7290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d  const char *zNum
72a0: 2c 20 69 36 34 20 2a 70 4e 75 6d 29 7b 0a 20 20  , i64 *pNum){.  
72b0: 69 36 34 20 76 20 3d 20 30 3b 0a 20 20 69 6e 74  i64 v = 0;.  int
72c0: 20 6e 65 67 3b 0a 20 20 69 6e 74 20 69 2c 20 63   neg;.  int i, c
72d0: 3b 0a 20 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27  ;.  if( *zNum=='
72e0: 2d 27 20 29 7b 0a 20 20 20 20 6e 65 67 20 3d 20  -' ){.    neg = 
72f0: 31 3b 0a 20 20 20 20 7a 4e 75 6d 2b 2b 3b 0a 20  1;.    zNum++;. 
7300: 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 4e 75 6d   }else if( *zNum
7310: 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 6e 65 67  =='+' ){.    neg
7320: 20 3d 20 30 3b 0a 20 20 20 20 7a 4e 75 6d 2b 2b   = 0;.    zNum++
7330: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
7340: 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  eg = 0;.  }.  fo
7350: 72 28 69 3d 30 3b 20 28 63 3d 7a 4e 75 6d 5b 69  r(i=0; (c=zNum[i
7360: 5d 29 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39  ])>='0' && c<='9
7370: 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d  '; i++){.    v =
7380: 20 76 2a 31 30 20 2b 20 63 20 2d 20 27 30 27 3b   v*10 + c - '0';
7390: 0a 20 20 7d 0a 20 20 2a 70 4e 75 6d 20 3d 20 6e  .  }.  *pNum = n
73a0: 65 67 20 3f 20 2d 76 20 3a 20 76 3b 0a 20 20 72  eg ? -v : v;.  r
73b0: 65 74 75 72 6e 20 63 3d 3d 30 20 26 26 20 69 3e  eturn c==0 && i>
73c0: 30 20 26 26 20 0a 20 20 20 20 20 20 28 69 3c 31  0 && .      (i<1
73d0: 39 20 7c 7c 20 28 69 3d 3d 31 39 20 26 26 20 6d  9 || (i==19 && m
73e0: 65 6d 63 6d 70 28 7a 4e 75 6d 2c 22 39 32 32 33  emcmp(zNum,"9223
73f0: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 22  372036854775807"
7400: 2c 31 39 29 3c 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  ,19)<=0));.}../*
7410: 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20 7a  .** The string z
7420: 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20 61  Num represents a
7430: 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 72  n integer.  Ther
7440: 65 20 6d 69 67 68 74 20 62 65 20 73 6f 6d 65 20  e might be some 
7450: 6f 74 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d 61  other.** informa
7460: 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tion following t
7470: 68 65 20 69 6e 74 65 67 65 72 20 74 6f 6f 2c 20  he integer too, 
7480: 62 75 74 20 74 68 61 74 20 70 61 72 74 20 69 73  but that part is
7490: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 49 66 20   ignored..** If 
74a0: 74 68 65 20 69 6e 74 65 67 65 72 20 74 68 61 74  the integer that
74b0: 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a   the prefix of z
74c0: 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20 77  Num represents w
74d0: 69 6c 6c 20 66 69 74 20 69 6e 20 61 0a 2a 2a 20  ill fit in a.** 
74e0: 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  32-bit signed in
74f0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 54 52  teger, return TR
7500: 55 45 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72  UE.  Otherwise r
7510: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a  eturn FALSE..**.
7520: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7530: 72 65 74 75 72 6e 73 20 46 41 4c 53 45 20 66 6f  returns FALSE fo
7540: 72 20 74 68 65 20 73 74 72 69 6e 67 20 2d 32 31  r the string -21
7550: 34 37 34 38 33 36 34 38 20 65 76 65 6e 20 74 68  47483648 even th
7560: 61 74 0a 2a 2a 20 74 68 61 74 20 6e 75 6d 62 65  at.** that numbe
7570: 72 20 77 69 6c 6c 20 69 6e 20 66 61 63 74 20 66  r will in fact f
7580: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
7590: 6e 74 65 67 65 72 2e 20 20 42 75 74 20 70 6f 73  nteger.  But pos
75a0: 69 74 69 76 65 0a 2a 2a 20 32 31 34 37 34 38 33  itive.** 2147483
75b0: 36 34 38 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  648 will not fit
75c0: 20 69 6e 20 33 32 20 62 69 74 73 2e 20 20 53 6f   in 32 bits.  So
75d0: 20 69 74 20 73 65 65 6d 73 20 73 61 66 65 72 20   it seems safer 
75e0: 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  to return.** fal
75f0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
7600: 74 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 33  t sqlite3FitsIn3
7610: 32 42 69 74 73 28 63 6f 6e 73 74 20 63 68 61 72  2Bits(const char
7620: 20 2a 7a 4e 75 6d 29 7b 0a 20 20 69 6e 74 20 69   *zNum){.  int i
7630: 2c 20 63 3b 0a 20 20 69 66 28 20 2a 7a 4e 75 6d  , c;.  if( *zNum
7640: 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 4e 75 6d 3d 3d  =='-' || *zNum==
7650: 27 2b 27 20 29 20 7a 4e 75 6d 2b 2b 3b 0a 20 20  '+' ) zNum++;.  
7660: 66 6f 72 28 69 3d 30 3b 20 28 63 3d 7a 4e 75 6d  for(i=0; (c=zNum
7670: 5b 69 5d 29 3e 3d 27 30 27 20 26 26 20 63 3c 3d  [i])>='0' && c<=
7680: 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 72 65  '9'; i++){}.  re
7690: 74 75 72 6e 20 69 3c 31 30 20 7c 7c 20 28 69 3d  turn i<10 || (i=
76a0: 3d 31 30 20 26 26 20 6d 65 6d 63 6d 70 28 7a 4e  =10 && memcmp(zN
76b0: 75 6d 2c 22 32 31 34 37 34 38 33 36 34 37 22 2c  um,"2147483647",
76c0: 31 30 29 3c 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  10)<=0);.}../*.*
76d0: 2a 20 49 66 20 7a 4e 75 6d 20 72 65 70 72 65 73  * If zNum repres
76e0: 65 6e 74 73 20 61 6e 20 69 6e 74 65 67 65 72 20  ents an integer 
76f0: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
7700: 20 33 32 2d 62 69 74 73 2c 20 74 68 65 6e 20 73   32-bits, then s
7710: 65 74 0a 2a 2a 20 2a 70 56 61 6c 75 65 20 74 6f  et.** *pValue to
7720: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 61 6e   that integer an
7730: 64 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  d return true.  
7740: 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
7750: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73   false..*/.int s
7760: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 63  qlite3GetInt32(c
7770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d 2c  onst char *zNum,
7780: 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
7790: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73   if( sqlite3Fits
77a0: 49 6e 33 32 42 69 74 73 28 7a 4e 75 6d 29 20 29  In32Bits(zNum) )
77b0: 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
77c0: 61 74 6f 69 28 7a 4e 75 6d 29 3b 0a 20 20 20 20  atoi(zNum);.    
77d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
77e0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
77f0: 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20 7a 4e  ** The string zN
7800: 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e  um represents an
7810: 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 72 65   integer.  There
7820: 20 6d 69 67 68 74 20 62 65 20 73 6f 6d 65 20 6f   might be some o
7830: 74 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ther.** informat
7840: 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ion following th
7850: 65 20 69 6e 74 65 67 65 72 20 74 6f 6f 2c 20 62  e integer too, b
7860: 75 74 20 74 68 61 74 20 70 61 72 74 20 69 73 20  ut that part is 
7870: 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 49 66 20 74  ignored..** If t
7880: 68 65 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  he integer that 
7890: 74 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a 4e  the prefix of zN
78a0: 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20 77 69  um represents wi
78b0: 6c 6c 20 66 69 74 20 69 6e 20 61 0a 2a 2a 20 36  ll fit in a.** 6
78c0: 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
78d0: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 54 52 55  eger, return TRU
78e0: 45 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65  E.  Otherwise re
78f0: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a 2a  turn FALSE..**.*
7900: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7910: 65 74 75 72 6e 73 20 46 41 4c 53 45 20 66 6f 72  eturns FALSE for
7920: 20 74 68 65 20 73 74 72 69 6e 67 20 2d 39 32 32   the string -922
7930: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
7940: 20 65 76 65 6e 20 74 68 61 74 0a 2a 2a 20 74 68   even that.** th
7950: 61 74 20 6e 75 6d 62 65 72 20 77 69 6c 6c 2c 20  at number will, 
7960: 69 6e 20 74 68 65 6f 72 79 20 66 69 74 20 69 6e  in theory fit in
7970: 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
7980: 72 2e 20 20 50 6f 73 69 74 69 76 65 0a 2a 2a 20  r.  Positive.** 
7990: 39 32 32 33 33 37 33 30 33 36 38 35 34 37 37 35  9223373036854775
79a0: 38 30 38 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  808 will not fit
79b0: 20 69 6e 20 36 34 20 62 69 74 73 2e 20 20 53 6f   in 64 bits.  So
79c0: 20 69 74 20 73 65 65 6d 73 20 73 61 66 65 72 20   it seems safer 
79d0: 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  to return.** fal
79e0: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
79f0: 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 63  e3FitsIn64Bits(c
7a00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d 29  onst char *zNum)
7a10: 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20  {.  int i, c;.  
7a20: 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 7c  if( *zNum=='-' |
7a30: 7c 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20 29 20 7a  | *zNum=='+' ) z
7a40: 4e 75 6d 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30  Num++;.  for(i=0
7a50: 3b 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d 27  ; (c=zNum[i])>='
7a60: 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69 2b  0' && c<='9'; i+
7a70: 2b 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69 3c  +){}.  return i<
7a80: 31 39 20 7c 7c 20 28 69 3d 3d 31 39 20 26 26 20  19 || (i==19 && 
7a90: 6d 65 6d 63 6d 70 28 7a 4e 75 6d 2c 22 39 32 32  memcmp(zNum,"922
7aa0: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
7ab0: 22 2c 31 39 29 3c 3d 30 29 3b 0a 7d 0a 0a 0a 2f  ",19)<=0);.}.../
7ac0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
7ad0: 73 71 6c 69 74 65 2e 6d 61 67 69 63 20 66 72 6f  sqlite.magic fro
7ae0: 6d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  m SQLITE_MAGIC_O
7af0: 50 45 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  PEN to SQLITE_MA
7b00: 47 49 43 5f 42 55 53 59 2e 0a 2a 2a 20 52 65 74  GIC_BUSY..** Ret
7b10: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 28 6e 6f  urn an error (no
7b20: 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 6d  n-zero) if the m
7b30: 61 67 69 63 20 77 61 73 20 6e 6f 74 20 53 51 4c  agic was not SQL
7b40: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 0a 2a  ITE_MAGIC_OPEN.*
7b50: 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
7b60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
7b70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7b80: 65 20 69 73 20 61 20 61 74 74 65 6d 70 74 20 74  e is a attempt t
7b90: 6f 20 64 65 74 65 63 74 20 69 66 20 74 77 6f 20  o detect if two 
7ba0: 74 68 72 65 61 64 73 20 75 73 65 20 74 68 65 0a  threads use the.
7bb0: 2a 2a 20 73 61 6d 65 20 73 71 6c 69 74 65 2a 20  ** same sqlite* 
7bc0: 70 6f 69 6e 74 65 72 20 61 74 20 74 68 65 20 73  pointer at the s
7bd0: 61 6d 65 20 74 69 6d 65 2e 20 20 54 68 65 72 65  ame time.  There
7be0: 20 69 73 20 61 20 72 61 63 65 20 0a 2a 2a 20 63   is a race .** c
7bf0: 6f 6e 64 69 74 69 6f 6e 20 73 6f 20 69 74 20 69  ondition so it i
7c00: 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
7c10: 74 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74  the error is not
7c20: 20 64 65 74 65 63 74 65 64 2e 0a 2a 2a 20 42 75   detected..** Bu
7c30: 74 20 75 73 75 61 6c 6c 79 20 74 68 65 20 70 72  t usually the pr
7c40: 6f 62 6c 65 6d 20 77 69 6c 6c 20 62 65 20 73 65  oblem will be se
7c50: 65 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  en.  The result 
7c60: 77 69 6c 6c 20 62 65 20 61 6e 0a 2a 2a 20 65 72  will be an.** er
7c70: 72 6f 72 20 77 68 69 63 68 20 63 61 6e 20 62 65  ror which can be
7c80: 20 75 73 65 64 20 74 6f 20 64 65 62 75 67 20 74   used to debug t
7c90: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74  he application t
7ca0: 68 61 74 20 69 73 0a 2a 2a 20 75 73 69 6e 67 20  hat is.** using 
7cb0: 53 51 4c 69 74 65 20 69 6e 63 6f 72 72 65 63 74  SQLite incorrect
7cc0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  ly..**.** Ticket
7cd0: 20 23 32 30 32 3a 20 20 49 66 20 64 62 2d 3e 6d   #202:  If db->m
7ce0: 61 67 69 63 20 69 73 20 6e 6f 74 20 61 20 76 61  agic is not a va
7cf0: 6c 69 64 20 6f 70 65 6e 20 76 61 6c 75 65 2c 20  lid open value, 
7d00: 74 61 6b 65 20 63 61 72 65 20 6e 6f 74 0a 2a 2a  take care not.**
7d10: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
7d20: 62 20 73 74 72 75 63 74 75 72 65 20 61 74 20 61  b structure at a
7d30: 6c 6c 2e 20 20 49 74 20 63 6f 75 6c 64 20 62 65  ll.  It could be
7d40: 20 74 68 61 74 20 64 62 20 69 73 20 61 20 73 74   that db is a st
7d50: 61 6c 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20  ale.** pointer. 
7d60: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
7d70: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
7d80: 74 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  t there has been
7d90: 20 61 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c   a prior.** call
7da0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
7db0: 65 28 64 62 29 20 61 6e 64 20 64 62 20 68 61 73  e(db) and db has
7dc0: 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   been deallocate
7dd0: 64 2e 20 20 41 6e 64 20 77 65 20 64 6f 0a 2a 2a  d.  And we do.**
7de0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 77 72 69   not want to wri
7df0: 74 65 20 69 6e 74 6f 20 64 65 61 6c 6c 6f 63 61  te into dealloca
7e00: 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 69  ted memory..*/.i
7e10: 6e 74 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  nt sqlite3Safety
7e20: 4f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  On(sqlite3 *db){
7e30: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63  .  if( db->magic
7e40: 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  ==SQLITE_MAGIC_O
7e50: 50 45 4e 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  PEN ){.    db->m
7e60: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
7e70: 47 49 43 5f 42 55 53 59 3b 0a 20 20 20 20 72 65  GIC_BUSY;.    re
7e80: 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20  turn 0;.  }else 
7e90: 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53  if( db->magic==S
7ea0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
7eb0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
7ec0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
7ed0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 64 62 2d 3e  _ERROR;.    db->
7ee0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
7ef0: 49 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20  Interrupt;.  }. 
7f00: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
7f10: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
7f20: 61 67 69 63 20 66 72 6f 6d 20 53 51 4c 49 54 45  agic from SQLITE
7f30: 5f 4d 41 47 49 43 5f 42 55 53 59 20 74 6f 20 53  _MAGIC_BUSY to S
7f40: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
7f50: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  ..** Return an e
7f60: 72 72 6f 72 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20  rror (non-zero) 
7f70: 69 66 20 74 68 65 20 6d 61 67 69 63 20 77 61 73  if the magic was
7f80: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4d 41 47 49   not SQLITE_MAGI
7f90: 43 5f 42 55 53 59 0a 2a 2a 20 77 68 65 6e 20 74  C_BUSY.** when t
7fa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7fb0: 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  alled..*/.int sq
7fc0: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 73  lite3SafetyOff(s
7fd0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
7fe0: 66 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51  f( db->magic==SQ
7ff0: 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20  LITE_MAGIC_BUSY 
8000: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
8010: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
8020: 4f 50 45 4e 3b 0a 20 20 20 20 72 65 74 75 72 6e  OPEN;.    return
8030: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
8040: 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54  db->magic==SQLIT
8050: 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 29 7b 0a  E_MAGIC_OPEN ){.
8060: 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
8070: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
8080: 4f 52 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  OR;.    db->flag
8090: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
80a0: 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrupt;.  }.  ret
80b0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
80c0: 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
80d0: 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c  re we have a val
80e0: 69 64 20 64 62 20 70 6f 69 6e 74 65 72 2e 20 20  id db pointer.  
80f0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6e 6f 74  This test is not
8100: 0a 2a 2a 20 66 6f 6f 6c 70 72 6f 6f 66 20 62 75  .** foolproof bu
8110: 74 20 69 74 20 64 6f 65 73 20 70 72 6f 76 69 64  t it does provid
8120: 65 20 73 6f 6d 65 20 6d 65 61 73 75 72 65 20 6f  e some measure o
8130: 66 20 70 72 6f 74 65 63 74 69 6f 6e 20 61 67 61  f protection aga
8140: 69 6e 73 74 0a 2a 2a 20 6d 69 73 75 73 65 20 6f  inst.** misuse o
8150: 66 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20  f the interface 
8160: 73 75 63 68 20 61 73 20 70 61 73 73 69 6e 67 20  such as passing 
8170: 69 6e 20 64 62 20 70 6f 69 6e 74 65 72 73 20 74  in db pointers t
8180: 68 61 74 20 61 72 65 0a 2a 2a 20 4e 55 4c 4c 20  hat are.** NULL 
8190: 6f 72 20 77 68 69 63 68 20 68 61 76 65 20 62 65  or which have be
81a0: 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6c  en previously cl
81b0: 6f 73 65 64 2e 20 20 49 66 20 74 68 69 73 20 72  osed.  If this r
81c0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 0a 2a  outine returns.*
81d0: 2a 20 54 52 55 45 20 69 74 20 6d 65 61 6e 73 20  * TRUE it means 
81e0: 74 68 61 74 20 74 68 65 20 64 62 20 70 6f 69 6e  that the db poin
81f0: 74 65 72 20 69 73 20 69 6e 76 61 6c 69 64 20 61  ter is invalid a
8200: 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nd should not be
8210: 0a 2a 2a 20 64 65 72 65 66 65 72 65 6e 63 65 64  .** dereferenced
8220: 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2e   for any reason.
8230: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
8240: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 69 6e  nction should in
8250: 76 6f 6b 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  voke.** SQLITE_M
8260: 49 53 55 53 45 20 69 6d 6d 65 64 69 61 74 65 6c  ISUSE immediatel
8270: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
8280: 33 53 61 66 65 74 79 43 68 65 63 6b 28 73 71 6c  3SafetyCheck(sql
8290: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
82a0: 20 6d 61 67 69 63 3b 0a 20 20 69 66 28 20 64 62   magic;.  if( db
82b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
82c0: 20 20 6d 61 67 69 63 20 3d 20 64 62 2d 3e 6d 61    magic = db->ma
82d0: 67 69 63 3b 0a 20 20 69 66 28 20 6d 61 67 69 63  gic;.  if( magic
82e0: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  !=SQLITE_MAGIC_C
82f0: 4c 4f 53 45 44 20 26 26 0a 20 20 20 20 20 20 20  LOSED &&.       
8300: 20 20 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f    magic!=SQLITE_
8310: 4d 41 47 49 43 5f 4f 50 45 4e 20 26 26 0a 20 20  MAGIC_OPEN &&.  
8320: 20 20 20 20 20 20 20 6d 61 67 69 63 21 3d 53 51         magic!=SQ
8330: 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20  LITE_MAGIC_BUSY 
8340: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
8350: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8360: 20 54 68 65 20 76 61 72 69 61 62 6c 65 2d 6c 65   The variable-le
8370: 6e 67 74 68 20 69 6e 74 65 67 65 72 20 65 6e 63  ngth integer enc
8380: 6f 64 69 6e 67 20 69 73 20 61 73 20 66 6f 6c 6c  oding is as foll
8390: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 4b 45 59 3a 0a  ows:.**.** KEY:.
83a0: 2a 2a 20 20 20 20 20 20 20 20 20 41 20 3d 20 30  **         A = 0
83b0: 78 78 78 78 78 78 78 20 20 20 20 37 20 62 69 74  xxxxxxx    7 bit
83c0: 73 20 6f 66 20 64 61 74 61 20 61 6e 64 20 6f 6e  s of data and on
83d0: 65 20 66 6c 61 67 20 62 69 74 0a 2a 2a 20 20 20  e flag bit.**   
83e0: 20 20 20 20 20 20 42 20 3d 20 31 78 78 78 78 78        B = 1xxxxx
83f0: 78 78 20 20 20 20 37 20 62 69 74 73 20 6f 66 20  xx    7 bits of 
8400: 64 61 74 61 20 61 6e 64 20 6f 6e 65 20 66 6c 61  data and one fla
8410: 67 20 62 69 74 0a 2a 2a 20 20 20 20 20 20 20 20  g bit.**        
8420: 20 43 20 3d 20 78 78 78 78 78 78 78 78 20 20 20   C = xxxxxxxx   
8430: 20 38 20 62 69 74 73 20 6f 66 20 64 61 74 61 0a   8 bits of data.
8440: 2a 2a 0a 2a 2a 20 20 37 20 62 69 74 73 20 2d 20  **.**  7 bits - 
8450: 41 0a 2a 2a 20 31 34 20 62 69 74 73 20 2d 20 42  A.** 14 bits - B
8460: 41 0a 2a 2a 20 32 31 20 62 69 74 73 20 2d 20 42  A.** 21 bits - B
8470: 42 41 0a 2a 2a 20 32 38 20 62 69 74 73 20 2d 20  BA.** 28 bits - 
8480: 42 42 42 41 0a 2a 2a 20 33 35 20 62 69 74 73 20  BBBA.** 35 bits 
8490: 2d 20 42 42 42 42 41 0a 2a 2a 20 34 32 20 62 69  - BBBBA.** 42 bi
84a0: 74 73 20 2d 20 42 42 42 42 42 41 0a 2a 2a 20 34  ts - BBBBBA.** 4
84b0: 39 20 62 69 74 73 20 2d 20 42 42 42 42 42 42 41  9 bits - BBBBBBA
84c0: 0a 2a 2a 20 35 36 20 62 69 74 73 20 2d 20 42 42  .** 56 bits - BB
84d0: 42 42 42 42 42 41 0a 2a 2a 20 36 34 20 62 69 74  BBBBBA.** 64 bit
84e0: 73 20 2d 20 42 42 42 42 42 42 42 42 43 0a 2a 2f  s - BBBBBBBBC.*/
84f0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
8500: 36 34 2d 62 69 74 20 76 61 72 69 61 62 6c 65 2d  64-bit variable-
8510: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 74  length integer t
8520: 6f 20 6d 65 6d 6f 72 79 20 73 74 61 72 74 69 6e  o memory startin
8530: 67 20 61 74 20 70 5b 30 5d 2e 0a 2a 2a 20 54 68  g at p[0]..** Th
8540: 65 20 6c 65 6e 67 74 68 20 6f 66 20 64 61 74 61  e length of data
8550: 20 77 72 69 74 65 20 77 69 6c 6c 20 62 65 20 62   write will be b
8560: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20 62  etween 1 and 9 b
8570: 79 74 65 73 2e 20 20 54 68 65 20 6e 75 6d 62 65  ytes.  The numbe
8580: 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 77 72  r.** of bytes wr
8590: 69 74 74 65 6e 20 69 73 20 72 65 74 75 72 6e 65  itten is returne
85a0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 61 72 69 61  d..**.** A varia
85b0: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
85c0: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  er consists of t
85d0: 68 65 20 6c 6f 77 65 72 20 37 20 62 69 74 73 20  he lower 7 bits 
85e0: 6f 66 20 65 61 63 68 20 62 79 74 65 0a 2a 2a 20  of each byte.** 
85f0: 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 74 68  for all bytes th
8600: 61 74 20 68 61 76 65 20 74 68 65 20 38 74 68 20  at have the 8th 
8610: 62 69 74 20 73 65 74 20 61 6e 64 20 6f 6e 65 20  bit set and one 
8620: 62 79 74 65 20 77 69 74 68 20 74 68 65 20 38 74  byte with the 8t
8630: 68 0a 2a 2a 20 62 69 74 20 63 6c 65 61 72 2e 20  h.** bit clear. 
8640: 20 45 78 63 65 70 74 2c 20 69 66 20 77 65 20 67   Except, if we g
8650: 65 74 20 74 6f 20 74 68 65 20 39 74 68 20 62 79  et to the 9th by
8660: 74 65 2c 20 69 74 20 73 74 6f 72 65 73 20 74 68  te, it stores th
8670: 65 20 66 75 6c 6c 0a 2a 2a 20 38 20 62 69 74 73  e full.** 8 bits
8680: 20 61 6e 64 20 69 73 20 74 68 65 20 6c 61 73 74   and is the last
8690: 20 62 79 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   byte..*/.int sq
86a0: 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 28 75  lite3PutVarint(u
86b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c  nsigned char *p,
86c0: 20 75 36 34 20 76 29 7b 0a 20 20 69 6e 74 20 69   u64 v){.  int i
86d0: 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 62 75 66  , j, n;.  u8 buf
86e0: 5b 31 30 5d 3b 0a 20 20 69 66 28 20 76 20 26 20  [10];.  if( v & 
86f0: 28 28 28 75 36 34 29 30 78 66 66 30 30 30 30 30  (((u64)0xff00000
8700: 30 29 3c 3c 33 32 29 20 29 7b 0a 20 20 20 20 70  0)<<32) ){.    p
8710: 5b 38 5d 20 3d 20 76 3b 0a 20 20 20 20 76 20 3e  [8] = v;.    v >
8720: 3e 3d 20 38 3b 0a 20 20 20 20 66 6f 72 28 69 3d  >= 8;.    for(i=
8730: 37 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  7; i>=0; i--){. 
8740: 20 20 20 20 20 70 5b 69 5d 20 3d 20 28 76 20 26       p[i] = (v &
8750: 20 30 78 37 66 29 20 7c 20 30 78 38 30 3b 0a 20   0x7f) | 0x80;. 
8760: 20 20 20 20 20 76 20 3e 3e 3d 20 37 3b 0a 20 20       v >>= 7;.  
8770: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 39    }.    return 9
8780: 3b 0a 20 20 7d 20 20 20 20 0a 20 20 6e 20 3d 20  ;.  }    .  n = 
8790: 30 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 62 75 66  0;.  do{.    buf
87a0: 5b 6e 2b 2b 5d 20 3d 20 28 76 20 26 20 30 78 37  [n++] = (v & 0x7
87b0: 66 29 20 7c 20 30 78 38 30 3b 0a 20 20 20 20 76  f) | 0x80;.    v
87c0: 20 3e 3e 3d 20 37 3b 0a 20 20 7d 77 68 69 6c 65   >>= 7;.  }while
87d0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 62 75 66 5b  ( v!=0 );.  buf[
87e0: 30 5d 20 26 3d 20 30 78 37 66 3b 0a 20 20 61 73  0] &= 0x7f;.  as
87f0: 73 65 72 74 28 20 6e 3c 3d 39 20 29 3b 0a 20 20  sert( n<=9 );.  
8800: 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 2d 31 3b 20  for(i=0, j=n-1; 
8810: 6a 3e 3d 30 3b 20 6a 2d 2d 2c 20 69 2b 2b 29 7b  j>=0; j--, i++){
8820: 0a 20 20 20 20 70 5b 69 5d 20 3d 20 62 75 66 5b  .    p[i] = buf[
8830: 6a 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  j];.  }.  return
8840: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61   n;.}../*.** Rea
8850: 64 20 61 20 36 34 2d 62 69 74 20 76 61 72 69 61  d a 64-bit varia
8860: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
8870: 65 72 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 73  er from memory s
8880: 74 61 72 74 69 6e 67 20 61 74 20 70 5b 30 5d 2e  tarting at p[0].
8890: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
88a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
88b0: 65 61 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ead.  The value 
88c0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 76 2e  is stored in *v.
88d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
88e0: 65 74 56 61 72 69 6e 74 28 63 6f 6e 73 74 20 75  etVarint(const u
88f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c  nsigned char *p,
8900: 20 75 36 34 20 2a 76 29 7b 0a 20 20 75 33 32 20   u64 *v){.  u32 
8910: 78 3b 0a 20 20 75 36 34 20 78 36 34 3b 0a 20 20  x;.  u64 x64;.  
8920: 69 6e 74 20 6e 3b 0a 20 20 75 6e 73 69 67 6e 65  int n;.  unsigne
8930: 64 20 63 68 61 72 20 63 3b 0a 20 20 69 66 28 20  d char c;.  if( 
8940: 28 28 63 20 3d 20 70 5b 30 5d 29 20 26 20 30 78  ((c = p[0]) & 0x
8950: 38 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 76  80)==0 ){.    *v
8960: 20 3d 20 63 3b 0a 20 20 20 20 72 65 74 75 72 6e   = c;.    return
8970: 20 31 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 63 20   1;.  }.  x = c 
8980: 26 20 30 78 37 66 3b 0a 20 20 69 66 28 20 28 28  & 0x7f;.  if( ((
8990: 63 20 3d 20 70 5b 31 5d 29 20 26 20 30 78 38 30  c = p[1]) & 0x80
89a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20 3d  )==0 ){.    *v =
89b0: 20 28 78 3c 3c 37 29 20 7c 20 63 3b 0a 20 20 20   (x<<7) | c;.   
89c0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
89d0: 20 78 20 3d 20 28 78 3c 3c 37 29 20 7c 20 28 63   x = (x<<7) | (c
89e0: 26 30 78 37 66 29 3b 0a 20 20 69 66 28 20 28 28  &0x7f);.  if( ((
89f0: 63 20 3d 20 70 5b 32 5d 29 20 26 20 30 78 38 30  c = p[2]) & 0x80
8a00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20 3d  )==0 ){.    *v =
8a10: 20 28 78 3c 3c 37 29 20 7c 20 63 3b 0a 20 20 20   (x<<7) | c;.   
8a20: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 7d 0a 20   return 3;.  }. 
8a30: 20 78 20 3d 20 28 78 3c 3c 37 29 20 7c 20 28 63   x = (x<<7) | (c
8a40: 26 30 78 37 66 29 3b 0a 20 20 69 66 28 20 28 28  &0x7f);.  if( ((
8a50: 63 20 3d 20 70 5b 33 5d 29 20 26 20 30 78 38 30  c = p[3]) & 0x80
8a60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20 3d  )==0 ){.    *v =
8a70: 20 28 78 3c 3c 37 29 20 7c 20 63 3b 0a 20 20 20   (x<<7) | c;.   
8a80: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 7d 0a 20   return 4;.  }. 
8a90: 20 78 36 34 20 3d 20 28 78 3c 3c 37 29 20 7c 20   x64 = (x<<7) | 
8aa0: 28 63 26 30 78 37 66 29 3b 0a 20 20 6e 20 3d 20  (c&0x7f);.  n = 
8ab0: 34 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 20 3d  4;.  do{.    c =
8ac0: 20 70 5b 6e 2b 2b 5d 3b 0a 20 20 20 20 69 66 28   p[n++];.    if(
8ad0: 20 6e 3d 3d 39 20 29 7b 0a 20 20 20 20 20 20 78   n==9 ){.      x
8ae0: 36 34 20 3d 20 28 78 36 34 3c 3c 38 29 20 7c 20  64 = (x64<<8) | 
8af0: 63 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  c;.      break;.
8b00: 20 20 20 20 7d 0a 20 20 20 20 78 36 34 20 3d 20      }.    x64 = 
8b10: 28 78 36 34 3c 3c 37 29 20 7c 20 28 63 26 30 78  (x64<<7) | (c&0x
8b20: 37 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 28  7f);.  }while( (
8b30: 63 20 26 20 30 78 38 30 29 21 3d 30 20 29 3b 0a  c & 0x80)!=0 );.
8b40: 20 20 2a 76 20 3d 20 78 36 34 3b 0a 20 20 72 65    *v = x64;.  re
8b50: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
8b60: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 76   Read a 32-bit v
8b70: 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69  ariable-length i
8b80: 6e 74 65 67 65 72 20 66 72 6f 6d 20 6d 65 6d 6f  nteger from memo
8b90: 72 79 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ry starting at p
8ba0: 5b 30 5d 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  [0]..** Return t
8bb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
8bc0: 65 73 20 72 65 61 64 2e 20 20 54 68 65 20 76 61  es read.  The va
8bd0: 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  lue is stored in
8be0: 20 2a 76 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   *v..*/.int sqli
8bf0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 63  te3GetVarint32(c
8c00: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
8c10: 61 72 20 2a 70 2c 20 75 33 32 20 2a 76 29 7b 0a  ar *p, u32 *v){.
8c20: 20 20 75 33 32 20 78 3b 0a 20 20 69 6e 74 20 6e    u32 x;.  int n
8c30: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
8c40: 72 20 63 3b 0a 20 20 69 66 28 20 28 28 73 69 67  r c;.  if( ((sig
8c50: 6e 65 64 20 63 68 61 72 2a 29 70 29 5b 30 5d 3e  ned char*)p)[0]>
8c60: 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20 3d 20 70  =0 ){.    *v = p
8c70: 5b 30 5d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  [0];.    return 
8c80: 31 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 70 5b 30  1;.  }.  x = p[0
8c90: 5d 20 26 20 30 78 37 66 3b 0a 20 20 69 66 28 20  ] & 0x7f;.  if( 
8ca0: 28 28 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  ((signed char*)p
8cb0: 29 5b 31 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 2a  )[1]>=0 ){.    *
8cc0: 76 20 3d 20 28 78 3c 3c 37 29 20 7c 20 70 5b 31  v = (x<<7) | p[1
8cd0: 5d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  ];.    return 2;
8ce0: 0a 20 20 7d 0a 20 20 78 20 3d 20 28 78 3c 3c 37  .  }.  x = (x<<7
8cf0: 29 20 7c 20 28 70 5b 31 5d 20 26 20 30 78 37 66  ) | (p[1] & 0x7f
8d00: 29 3b 0a 20 20 6e 20 3d 20 32 3b 0a 20 20 64 6f  );.  n = 2;.  do
8d10: 7b 0a 20 20 20 20 78 20 3d 20 28 78 3c 3c 37 29  {.    x = (x<<7)
8d20: 20 7c 20 28 28 63 20 3d 20 70 5b 6e 2b 2b 5d 29   | ((c = p[n++])
8d30: 26 30 78 37 66 29 3b 0a 20 20 7d 77 68 69 6c 65  &0x7f);.  }while
8d40: 28 20 28 63 20 26 20 30 78 38 30 29 21 3d 30 20  ( (c & 0x80)!=0 
8d50: 26 26 20 6e 3c 39 20 29 3b 0a 20 20 2a 76 20 3d  && n<9 );.  *v =
8d60: 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a   x;.  return n;.
8d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8d80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8d90: 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  tes that will be
8da0: 20 6e 65 65 64 65 64 20 74 6f 20 73 74 6f 72 65   needed to store
8db0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 36 34   the given.** 64
8dc0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  -bit integer..*/
8dd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 61 72 69  .int sqlite3Vari
8de0: 6e 74 4c 65 6e 28 75 36 34 20 76 29 7b 0a 20 20  ntLen(u64 v){.  
8df0: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 64 6f 7b  int i = 0;.  do{
8e00: 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 76 20  .    i++;.    v 
8e10: 3e 3e 3d 20 37 3b 0a 20 20 7d 77 68 69 6c 65 28  >>= 7;.  }while(
8e20: 20 76 21 3d 30 20 26 26 20 69 3c 39 20 29 3b 0a   v!=0 && i<9 );.
8e30: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 23    return i;.}..#
8e40: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8e50: 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
8e60: 45 52 41 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64  ERAL) || defined
8e70: 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
8e80: 43 29 20 5c 0a 20 20 20 20 7c 7c 20 64 65 66 69  C) \.    || defi
8e90: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
8ea0: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
8eb0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 6f   a single byte o
8ec0: 66 20 48 65 78 20 69 6e 74 6f 20 61 6e 20 69 6e  f Hex into an in
8ed0: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
8ee0: 20 69 6e 74 20 68 65 78 54 6f 49 6e 74 28 69 6e   int hexToInt(in
8ef0: 74 20 68 29 7b 0a 20 20 69 66 28 20 68 3e 3d 27  t h){.  if( h>='
8f00: 30 27 20 26 26 20 68 3c 3d 27 39 27 20 29 7b 0a  0' && h<='9' ){.
8f10: 20 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27      return h - '
8f20: 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0';.  }else if( 
8f30: 68 3e 3d 27 61 27 20 26 26 20 68 3c 3d 27 66 27  h>='a' && h<='f'
8f40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
8f50: 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20 7d   - 'a' + 10;.  }
8f60: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
8f70: 28 20 68 3e 3d 27 41 27 20 26 26 20 68 3c 3d 27  ( h>='A' && h<='
8f80: 46 27 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  F' );.    return
8f90: 20 68 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20   h - 'A' + 10;. 
8fa0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
8fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
8fc0: 5f 4c 49 54 45 52 41 4c 20 7c 7c 20 53 51 4c 49  _LITERAL || SQLI
8fd0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c 7c 20  TE_HAS_CODEC || 
8fe0: 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a  SQLITE_TEST */..
8ff0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9000: 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
9010: 54 45 52 41 4c 29 20 7c 7c 20 64 65 66 69 6e 65  TERAL) || define
9020: 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
9030: 45 43 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  EC)./*.** Conver
9040: 74 20 61 20 42 4c 4f 42 20 6c 69 74 65 72 61 6c  t a BLOB literal
9050: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 27   of the form "x'
9060: 68 68 68 68 68 68 27 22 20 69 6e 74 6f 20 69 74  hhhhhh'" into it
9070: 73 20 62 69 6e 61 72 79 0a 2a 2a 20 76 61 6c 75  s binary.** valu
9080: 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
9090: 6e 74 65 72 20 74 6f 20 69 74 73 20 62 69 6e 61  nter to its bina
90a0: 72 79 20 76 61 6c 75 65 2e 20 20 53 70 61 63 65  ry value.  Space
90b0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
90c0: 62 69 6e 61 72 79 20 76 61 6c 75 65 20 68 61 73  binary value has
90d0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
90e0: 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
90f0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 0a  ust be freed by.
9100: 2a 2a 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  ** the calling r
9110: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  outine..*/.void 
9120: 2a 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f  *sqlite3HexToBlo
9130: 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  b(const char *z)
9140: 7b 0a 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b  {.  char *zBlob;
9150: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
9160: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
9170: 20 69 66 28 20 6e 25 32 20 29 20 72 65 74 75 72   if( n%2 ) retur
9180: 6e 20 30 3b 0a 0a 20 20 7a 42 6c 6f 62 20 3d 20  n 0;..  zBlob = 
9190: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
91a0: 6c 6c 6f 63 28 6e 2f 32 29 3b 0a 20 20 66 6f 72  lloc(n/2);.  for
91b0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 3d 32 29  (i=0; i<n; i+=2)
91c0: 7b 0a 20 20 20 20 7a 42 6c 6f 62 5b 69 2f 32 5d  {.    zBlob[i/2]
91d0: 20 3d 20 28 68 65 78 54 6f 49 6e 74 28 7a 5b 69   = (hexToInt(z[i
91e0: 5d 29 3c 3c 34 29 20 7c 20 68 65 78 54 6f 49 6e  ])<<4) | hexToIn
91f0: 74 28 7a 5b 69 2b 31 5d 29 3b 0a 20 20 7d 0a 20  t(z[i+1]);.  }. 
9200: 20 72 65 74 75 72 6e 20 7a 42 6c 6f 62 3b 0a 7d   return zBlob;.}
9210: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
9220: 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
9230: 45 52 41 4c 20 7c 7c 20 53 51 4c 49 54 45 5f 48  ERAL || SQLITE_H
9240: 41 53 5f 43 4f 44 45 43 20 2a 2f 0a 0a 23 69 66  AS_CODEC */..#if
9250: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9260: 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  TEST)./*.** Conv
9270: 65 72 74 20 74 65 78 74 20 67 65 6e 65 72 61 74  ert text generat
9280: 65 64 20 62 79 20 74 68 65 20 22 25 70 22 20 63  ed by the "%p" c
9290: 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74  onversion format
92a0: 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20   back into.** a 
92b0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  pointer..*/.void
92c0: 20 2a 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50   *sqlite3TextToP
92d0: 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  tr(const char *z
92e0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20  ){.  void *p;.  
92f0: 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32 3b  u64 v;.  u32 v2;
9300: 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30 27  .  if( z[0]=='0'
9310: 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29 7b   && z[1]=='x' ){
9320: 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 7d  .    z += 2;.  }
9330: 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  v = 0;.  whil
9340: 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20 3d  e( *z ){.    v =
9350: 20 28 76 3c 3c 34 29 20 2b 20 68 65 78 54 6f 49   (v<<4) + hexToI
9360: 6e 74 28 2a 7a 29 3b 0a 20 20 20 20 7a 2b 2b 3b  nt(*z);.    z++;
9370: 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
9380: 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 29 20  f(p)==sizeof(v) 
9390: 29 7b 0a 20 20 20 20 70 20 3d 20 2a 28 76 6f 69  ){.    p = *(voi
93a0: 64 2a 2a 29 26 76 3b 0a 20 20 7d 65 6c 73 65 7b  d**)&v;.  }else{
93b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
93c0: 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76  eof(p)==sizeof(v
93d0: 32 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28  2) );.    v2 = (
93e0: 75 33 32 29 76 3b 0a 20 20 20 20 70 20 3d 20 2a  u32)v;.    p = *
93f0: 28 76 6f 69 64 2a 2a 29 26 76 32 3b 0a 20 20 7d  (void**)&v2;.  }
9400: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23  .  return p;.}.#
9410: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
9420: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9430: 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20   the ThreadData 
9440: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9450: 74 68 65 20 63 61 6c 6c 69 6e 67 20 74 68 72 65  the calling thre
9460: 61 64 2e 0a 2a 2f 0a 54 68 72 65 61 64 44 61 74  ad..*/.ThreadDat
9470: 61 20 2a 73 71 6c 69 74 65 33 54 68 72 65 61 64  a *sqlite3Thread
9480: 44 61 74 61 28 29 7b 0a 20 20 54 68 72 65 61 64  Data(){.  Thread
9490: 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
94a0: 69 74 65 33 4f 73 54 68 72 65 61 64 53 70 65 63  ite3OsThreadSpec
94b0: 69 66 69 63 44 61 74 61 28 73 69 7a 65 6f 66 28  ificData(sizeof(
94c0: 54 68 72 65 61 64 44 61 74 61 29 29 3b 0a 20 20  ThreadData));.  
94d0: 69 66 28 20 70 54 73 64 20 26 26 20 21 70 54 73  if( pTsd && !pTs
94e0: 64 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66  d->isInit ){.#if
94f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9500: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
9510: 4e 54 0a 20 20 20 20 70 54 73 64 2d 3e 6e 53 6f  NT.    pTsd->nSo
9520: 66 74 48 65 61 70 4c 69 6d 69 74 20 3d 20 2d 31  ftHeapLimit = -1
9530: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ;.#endif.#ifndef
9540: 20 4e 44 45 42 55 47 0a 20 20 20 20 70 54 73 64   NDEBUG.    pTsd
9550: 2d 3e 6d 61 6c 6c 6f 63 41 6c 6c 6f 77 65 64 20  ->mallocAllowed 
9560: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 1;.#endif.    
9570: 70 54 73 64 2d 3e 69 73 49 6e 69 74 20 3d 20 31  pTsd->isInit = 1
9580: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9590: 54 73 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Tsd;.}../*.** Cl
95a0: 65 61 72 20 74 68 65 20 22 6d 61 6c 6c 6f 63 46  ear the "mallocF
95b0: 61 69 6c 65 64 22 20 66 6c 61 67 2e 20 54 68 69  ailed" flag. Thi
95c0: 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  s should be invo
95d0: 6b 65 64 20 62 65 66 6f 72 65 20 65 78 69 74 69  ked before exiti
95e0: 6e 67 20 61 6e 79 0a 2a 2a 20 65 6e 74 72 79 20  ng any.** entry 
95f0: 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20  points that may 
9600: 68 61 76 65 20 63 61 6c 6c 65 64 20 73 71 6c 69  have called sqli
9610: 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 76  teMalloc()..*/.v
9620: 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  oid sqlite3Mallo
9630: 63 43 6c 65 61 72 46 61 69 6c 65 64 28 29 7b 0a  cClearFailed(){.
9640: 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44    sqlite3ThreadD
9650: 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ata()->mallocFai
9660: 6c 65 64 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e  led = 0;.}..#ifn
9670: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9680: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
9690: 54 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 74  T./*.** Enable t
96a0: 68 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20  he shared pager 
96b0: 61 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75  and schema featu
96c0: 72 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  res..*/.int sqli
96d0: 74 65 33 5f 65 6e 61 62 6c 65 5f 6d 65 6d 6f 72  te3_enable_memor
96e0: 79 5f 6d 61 6e 61 67 65 6d 65 6e 74 28 69 6e 74  y_management(int
96f0: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 54 68 72 65   enable){.  Thre
9700: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
9710: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
9720: 28 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  ();..  /* It is 
9730: 6f 6e 6c 79 20 6c 65 67 61 6c 20 74 6f 20 63 61  only legal to ca
9740: 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  ll sqlite3_enabl
9750: 65 5f 6d 65 6d 6f 72 79 5f 6d 61 6e 61 67 65 6d  e_memory_managem
9760: 65 6e 74 28 29 20 77 68 65 6e 20 74 68 65 72 65  ent() when there
9770: 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 63 75 72  .  ** are no cur
9780: 72 65 6e 74 6c 79 20 6f 70 65 6e 20 63 6f 6e 6e  rently open conn
9790: 65 63 74 69 6f 6e 73 20 74 68 61 74 20 77 65 72  ections that wer
97a0: 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  e opened by the 
97b0: 63 61 6c 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68  calling .  ** th
97c0: 72 65 61 64 2e 20 54 68 69 73 20 63 6f 6e 64 69  read. This condi
97d0: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 61 73  tion is only eas
97e0: 79 20 74 6f 20 64 65 74 65 63 74 20 69 66 20 74  y to detect if t
97f0: 68 65 20 66 65 61 74 75 72 65 20 77 65 72 65 0a  he feature were.
9800: 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
9810: 65 6e 61 62 6c 65 64 20 28 61 6e 64 20 69 73 20  enabled (and is 
9820: 62 65 69 6e 67 20 64 69 73 61 62 6c 65 64 29 2e  being disabled).
9830: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 73   .  */.  if( pTs
9840: 64 2d 3e 70 50 61 67 65 72 20 26 26 20 21 65 6e  d->pPager && !en
9850: 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75  able ){.    retu
9860: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
9870: 3b 0a 20 20 7d 0a 20 20 70 54 73 64 2d 3e 75 73  ;.  }.  pTsd->us
9880: 65 4d 65 6d 6f 72 79 4d 61 6e 61 67 65 6d 65 6e  eMemoryManagemen
9890: 74 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  t = enable;.  re
98a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
98b0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
98c0: 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  f NDEBUG./*.** T
98d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
98e0: 73 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  s a flag in the 
98f0: 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d  thread-specific-
9900: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74  data structure t
9910: 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73  hat will.** caus
9920: 65 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  e an assert to f
9930: 61 69 6c 20 69 66 20 73 71 6c 69 74 65 4d 61 6c  ail if sqliteMal
9940: 6c 6f 63 28 29 20 6f 72 20 73 71 6c 69 74 65 52  loc() or sqliteR
9950: 65 61 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c  ealloc() is call
9960: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
9970: 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f  te3MallocDisallo
9980: 77 28 29 7b 0a 20 20 61 73 73 65 72 74 28 73 71  w(){.  assert(sq
9990: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
99a0: 29 2d 3e 6d 61 6c 6c 6f 63 41 6c 6c 6f 77 65 64  )->mallocAllowed
99b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68 72 65  );.  sqlite3Thre
99c0: 61 64 44 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63  adData()->malloc
99d0: 41 6c 6c 6f 77 65 64 20 3d 20 30 3b 0a 7d 0a 0a  Allowed = 0;.}..
99e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
99f0: 69 6f 6e 20 63 6c 65 61 72 73 20 74 68 65 20 66  ion clears the f
9a00: 6c 61 67 20 73 65 74 20 69 6e 20 74 68 65 20 74  lag set in the t
9a10: 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d 64  hread-specific-d
9a20: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 73 65  ata structure se
9a30: 74 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4d  t.** by sqlite3M
9a40: 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29 2e  allocDisallow().
9a50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9a60: 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29 7b 0a 20  MallocAllow(){. 
9a70: 20 61 73 73 65 72 74 28 21 73 71 6c 69 74 65 33   assert(!sqlite3
9a80: 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61  ThreadData()->ma
9a90: 6c 6c 6f 63 41 6c 6c 6f 77 65 64 29 3b 0a 20 20  llocAllowed);.  
9aa0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
9ab0: 61 28 29 2d 3e 6d 61 6c 6c 6f 63 41 6c 6c 6f 77  a()->mallocAllow
9ac0: 65 64 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  ed = 1;.}.#endif
9ad0: 0a                                               .