/ Hex Artifact Content
Login

Artifact 5d5792d4a4dda20d70fdfb973ed8a5ed71fea98c:


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 36 20 32 30 30 36 2f 30 31 2f 31 30 20 31 35  66 2006/01/10 15
0230: 3a 31 38 3a 32 38 20 64 72 68 20 45 78 70 20 24  :18:28 drh Exp $
0240: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0250: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
0260: 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c  ude "os.h".#incl
0270: 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 23  ude <stdarg.h>.#
0280: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0290: 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 41 4c 4c 4f 43 20  >../*.** MALLOC 
02a0: 57 52 41 50 50 45 52 20 41 52 43 48 49 54 45 43  WRAPPER ARCHITEC
02b0: 54 55 52 45 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  TURE.**.** The s
02c0: 71 6c 69 74 65 20 63 6f 64 65 20 61 63 63 65 73  qlite code acces
02d0: 73 65 73 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  ses dynamic memo
02e0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2f 64 65  ry allocation/de
02f0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 62 79 20 69 6e  allocation by in
0300: 76 6f 6b 69 6e 67 0a 2a 2a 20 74 68 65 20 66 6f  voking.** the fo
0310: 6c 6c 6f 77 69 6e 67 20 66 6f 75 72 20 41 50 49  llowing four API
0320: 73 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  s (which may be 
0330: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 6d  implemented as m
0340: 61 63 72 6f 73 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  acros)..**.**   
0350: 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28    sqlite3Malloc(
0360: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
0370: 4d 61 6c 6c 6f 63 52 61 77 28 29 0a 2a 2a 20 20  MallocRaw().**  
0380: 20 20 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f     sqlite3Reallo
0390: 63 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  c().**     sqlit
03a0: 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  e3ReallocOrFree(
03b0: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
03c0: 46 72 65 65 28 29 0a 2a 2a 20 20 20 20 20 73 71  Free().**     sq
03d0: 6c 69 74 65 33 41 6c 6c 6f 63 53 69 7a 65 28 29  lite3AllocSize()
03e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74  .**.** The funct
03f0: 69 6f 6e 20 73 71 6c 69 74 65 33 46 72 65 65 58  ion sqlite3FreeX
0400: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61   performs the sa
0410: 6d 65 20 74 61 73 6b 20 61 73 20 73 71 6c 69 74  me task as sqlit
0420: 65 33 46 72 65 65 20 61 6e 64 20 69 73 0a 2a 2a  e3Free and is.**
0430: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
0440: 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
0450: 6e 2e 20 54 68 65 20 73 61 6d 65 20 68 6f 6c 64  n. The same hold
0460: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 4d 61 6c  s for sqlite3Mal
0470: 6c 6f 63 58 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  locX.**.** The a
0480: 62 6f 76 65 20 41 50 49 73 20 61 72 65 20 69 6d  bove APIs are im
0490: 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 65 72  plemented in ter
04a0: 6d 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ms of the functi
04b0: 6f 6e 73 20 70 72 6f 76 69 64 65 64 20 61 74 20  ons provided at 
04c0: 74 68 65 20 4f 73 0a 2a 2a 20 6c 65 76 65 6c 20  the Os.** level 
04d0: 28 6e 6f 74 20 69 6e 20 74 68 69 73 20 66 69 6c  (not in this fil
04e0: 65 29 2e 20 54 68 65 20 4f 73 20 6c 65 76 65 6c  e). The Os level
04f0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6e 65   interface is ne
0500: 76 65 72 20 61 63 63 65 73 73 65 64 20 64 69 72  ver accessed dir
0510: 65 63 74 6c 79 0a 2a 2a 20 62 79 20 63 6f 64 65  ectly.** by code
0520: 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 69 73   outside of this
0530: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   file..**.**    
0540: 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63   sqlite3OsMalloc
0550: 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  ().**     sqlite
0560: 33 4f 73 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20  3OsRealloc().** 
0570: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 72 65      sqlite3OsFre
0580: 65 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  e().**     sqlit
0590: 65 33 4f 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69  e3OsAllocationSi
05a0: 7a 65 28 29 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ze().**.** Funct
05b0: 69 6f 6e 73 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ions sqlite3Mall
05c0: 6f 63 52 61 77 28 29 20 61 6e 64 20 73 71 6c 69  ocRaw() and sqli
05d0: 74 65 33 52 65 61 6c 6c 6f 63 28 29 20 6d 61 79  te3Realloc() may
05e0: 20 69 6e 76 6f 6b 65 20 0a 2a 2a 20 73 71 6c 69   invoke .** sqli
05f0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
0600: 72 79 28 29 20 69 66 20 61 20 63 61 6c 6c 20 74  ry() if a call t
0610: 6f 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f  o sqlite3OsMallo
0620: 63 28 29 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65  c() or.** sqlite
0630: 33 4f 73 52 65 61 6c 6c 6f 63 28 29 20 66 61 69  3OsRealloc() fai
0640: 6c 73 20 28 6f 72 20 69 66 20 74 68 65 20 73 6f  ls (or if the so
0650: 66 74 2d 68 65 61 70 2d 6c 69 6d 69 74 20 66 6f  ft-heap-limit fo
0660: 72 20 74 68 65 20 74 68 72 65 61 64 20 69 73 0a  r the thread is.
0670: 2a 2a 20 65 78 63 65 65 64 65 64 29 2e 20 46 75  ** exceeded). Fu
0680: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 4d 61  nction sqlite3Ma
0690: 6c 6c 6f 63 28 29 20 75 73 75 61 6c 6c 79 20 69  lloc() usually i
06a0: 6e 76 6f 6b 65 73 0a 2a 2a 20 73 71 6c 69 74 65  nvokes.** sqlite
06b0: 33 4d 61 6c 6c 6f 63 52 61 77 28 29 2e 0a 2a 2a  3MallocRaw()..**
06c0: 0a 2a 2a 20 4d 41 4c 4c 4f 43 20 54 45 53 54 20  .** MALLOC TEST 
06d0: 57 52 41 50 50 45 52 20 41 52 43 48 49 54 45 43  WRAPPER ARCHITEC
06e0: 54 55 52 45 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  TURE.**.** The t
06f0: 65 73 74 20 77 72 61 70 70 65 72 20 70 72 6f 76  est wrapper prov
0700: 69 64 65 73 20 65 78 74 72 61 20 74 65 73 74 20  ides extra test 
0710: 66 61 63 69 6c 69 74 69 65 73 20 74 6f 20 65 6e  facilities to en
0720: 73 75 72 65 20 74 68 65 20 6c 69 62 72 61 72 79  sure the library
0730: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6c 65   .** does not le
0740: 61 6b 20 6d 65 6d 6f 72 79 20 61 6e 64 20 68 61  ak memory and ha
0750: 6e 64 6c 65 73 20 74 68 65 20 66 61 69 6c 75 72  ndles the failur
0760: 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  e of the underly
0770: 69 6e 67 20 28 4f 73 20 6c 65 76 65 6c 29 0a 2a  ing (Os level).*
0780: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 79 73  * allocation sys
0790: 74 65 6d 20 63 6f 72 72 65 63 74 6c 79 2e 20 49  tem correctly. I
07a0: 74 20 69 73 20 6f 6e 6c 79 20 70 72 65 73 65 6e  t is only presen
07b0: 74 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79  t if the library
07c0: 20 69 73 20 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64   is .** compiled
07d0: 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
07e0: 5f 4d 45 4d 44 45 42 55 47 20 6d 61 63 72 6f 20  _MEMDEBUG macro 
07f0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  set..**.**     *
0800: 20 47 75 61 72 64 70 6f 73 74 73 20 74 6f 20 64   Guardposts to d
0810: 65 74 65 63 74 20 6f 76 65 72 77 72 69 74 65 73  etect overwrites
0820: 2e 0a 2a 2a 20 20 20 20 20 2a 20 41 62 69 6c 69  ..**     * Abili
0830: 74 79 20 74 6f 20 63 61 75 73 65 20 61 20 73 70  ty to cause a sp
0840: 65 63 69 66 69 63 20 4d 61 6c 6c 6f 63 28 29 20  ecific Malloc() 
0850: 6f 72 20 52 65 61 6c 6c 6f 63 28 29 20 74 6f 20  or Realloc() to 
0860: 66 61 69 6c 2e 0a 2a 2a 20 20 20 20 20 2a 20 41  fail..**     * A
0870: 75 64 69 74 20 6f 75 74 73 74 61 6e 64 69 6e 67  udit outstanding
0880: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0890: 6f 6e 73 20 28 69 2e 65 20 63 68 65 63 6b 20 66  ons (i.e check f
08a0: 6f 72 20 6c 65 61 6b 73 29 2e 0a 2a 2f 0a 0a 23  or leaks)..*/..#
08b0: 64 65 66 69 6e 65 20 4d 41 58 28 78 2c 79 29 20  define MAX(x,y) 
08c0: 28 28 78 29 3e 28 79 29 3f 28 78 29 3a 28 79 29  ((x)>(y)?(x):(y)
08d0: 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  )..#if !defined(
08e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
08f0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26  RY_MANAGEMENT) &
0900: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
0910: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 2f  E_OMIT_DISKIO)./
0920: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 66  *.** Set the sof
0930: 74 20 68 65 61 70 2d 73 69 7a 65 20 6c 69 6d 69  t heap-size limi
0940: 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
0950: 74 20 74 68 72 65 61 64 2e 20 50 61 73 73 69 6e  t thread. Passin
0960: 67 20 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  g a negative.** 
0970: 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
0980: 6e 6f 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 76 6f 69  no limit..*/.voi
0990: 64 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68  d sqlite3_soft_h
09a0: 65 61 70 5f 6c 69 6d 69 74 28 69 6e 74 20 6e 29  eap_limit(int n)
09b0: 7b 0a 20 20 73 71 6c 69 74 65 33 54 68 72 65 61  {.  sqlite3Threa
09c0: 64 44 61 74 61 28 29 2d 3e 6e 53 6f 66 74 48 65  dData()->nSoftHe
09d0: 61 70 4c 69 6d 69 74 20 3d 20 6e 3b 0a 7d 0a 0a  apLimit = n;.}..
09e0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d 65  /*.** Release me
09f0: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 53 51 4c  mory held by SQL
0a00: 69 74 65 20 69 6e 73 74 61 6e 63 65 73 20 63 72  ite instances cr
0a10: 65 61 74 65 64 20 62 79 20 74 68 65 20 63 75 72  eated by the cur
0a20: 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2f 0a  rent thread..*/.
0a30: 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6c 65  int sqlite3_rele
0a40: 61 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e  ase_memory(int n
0a50: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
0a60: 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61 73 65  te3pager_release
0a70: 5f 6d 65 6d 6f 72 79 28 6e 29 3b 0a 7d 0a 23 65  _memory(n);.}.#e
0a80: 6c 73 65 0a 2f 2a 20 49 66 20 53 51 4c 49 54 45  lse./* If SQLITE
0a90: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  _OMIT_MEMORY_MAN
0aa0: 41 47 45 4d 45 4e 54 20 69 73 20 64 65 66 69 6e  AGEMENT is defin
0ab0: 65 64 2c 20 74 68 65 6e 20 64 65 66 69 6e 65 20  ed, then define 
0ac0: 61 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20  a version.** of 
0ad0: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
0ae0: 6d 65 6d 6f 72 79 28 29 20 74 6f 20 62 65 20 75  memory() to be u
0af0: 73 65 64 20 62 79 20 6f 74 68 65 72 20 63 6f 64  sed by other cod
0b00: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a  e in this file..
0b10: 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
0b20: 66 6f 72 20 6e 6f 20 62 65 74 74 65 72 20 72 65  for no better re
0b30: 61 73 6f 6e 20 74 68 61 6e 20 74 6f 20 72 65 64  ason than to red
0b40: 75 63 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  uce the number o
0b50: 66 20 0a 2a 2a 20 70 72 65 2d 70 72 6f 63 65 73  f .** pre-proces
0b60: 73 6f 72 20 23 69 66 6e 64 65 66 20 73 74 61 74  sor #ifndef stat
0b70: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66 69  ements..*/.#defi
0b80: 6e 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  ne sqlite3_relea
0b90: 73 65 5f 6d 65 6d 6f 72 79 28 78 29 20 30 20 20  se_memory(x) 0  
0ba0: 20 20 2f 2a 20 30 20 3d 3d 20 6e 6f 20 6d 65 6d    /* 0 == no mem
0bb0: 6f 72 79 20 66 72 65 65 64 20 2a 2f 0a 23 65 6e  ory freed */.#en
0bc0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
0bd0: 54 45 5f 4d 45 4d 44 45 42 55 47 0a 2f 2a 2d 2d  TE_MEMDEBUG./*--
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 2a 2a 20 42 65 67 69  --------.** Begi
0c30: 6e 20 63 6f 64 65 20 66 6f 72 20 6d 65 6d 6f 72  n code for memor
0c40: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 79 73  y allocation sys
0c50: 74 65 6d 20 74 65 73 74 20 6c 61 79 65 72 2e 0a  tem test layer..
0c60: 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 64 65 62  **.** Memory deb
0c70: 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65 64  ugging is turned
0c80: 20 6f 6e 20 62 79 20 64 65 66 69 6e 69 6e 67 20   on by defining 
0c90: 74 68 65 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  the SQLITE_MEMDE
0ca0: 42 55 47 20 6d 61 63 72 6f 2e 0a 2a 2a 0a 2a 2a  BUG macro..**.**
0cb0: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
0cc0: 3d 3d 31 20 20 20 20 2d 3e 20 46 65 6e 63 65 2d  ==1    -> Fence-
0cd0: 70 6f 73 74 69 6e 67 20 6f 6e 6c 79 20 28 74 68  posting only (th
0ce0: 72 65 61 64 20 73 61 66 65 29 20 0a 2a 2a 20 53  read safe) .** S
0cf0: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3d 3d  QLITE_MEMDEBUG==
0d00: 32 20 20 20 20 2d 3e 20 46 65 6e 63 65 2d 70 6f  2    -> Fence-po
0d10: 73 74 69 6e 67 20 2b 20 6c 69 6e 6b 65 64 20 6c  sting + linked l
0d20: 69 73 74 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f  ist of allocatio
0d30: 6e 73 20 28 6e 6f 74 20 74 73 29 0a 2a 2a 20 53  ns (not ts).** S
0d40: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3d 3d  QLITE_MEMDEBUG==
0d50: 33 20 20 20 20 2d 3e 20 41 62 6f 76 65 20 2b 20  3    -> Above + 
0d60: 62 61 63 6b 74 72 61 63 65 73 20 28 6e 6f 74 20  backtraces (not 
0d70: 74 68 72 65 61 64 20 73 61 66 65 2c 20 72 65 71  thread safe, req
0d80: 2e 20 67 6c 69 62 63 29 0a 2a 2f 0a 0a 2f 2a 20  . glibc).*/../* 
0d90: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
0da0: 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 73 74 6f  er or not to sto
0db0: 72 65 20 62 61 63 6b 74 72 61 63 65 28 29 20 69  re backtrace() i
0dc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 65  nformation for e
0dd0: 61 63 68 20 6d 61 6c 6c 6f 63 2e 0a 2a 2a 20 54  ach malloc..** T
0de0: 68 65 20 62 61 63 6b 74 72 61 63 65 28 29 20 66  he backtrace() f
0df0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
0e00: 75 73 65 64 20 69 66 20 53 51 4c 49 54 45 5f 4d  used if SQLITE_M
0e10: 45 4d 44 45 42 55 47 20 69 73 20 73 65 74 20 74  EMDEBUG is set t
0e20: 6f 20 32 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74  o 2 or .** great
0e30: 65 72 20 61 6e 64 20 67 6c 69 62 63 20 69 73 20  er and glibc is 
0e40: 69 6e 20 75 73 65 2e 20 49 66 20 77 65 20 64 6f  in use. If we do
0e50: 6e 27 74 20 77 61 6e 74 20 74 6f 20 75 73 65 20  n't want to use 
0e60: 62 61 63 6b 74 72 61 63 65 28 29 2c 20 74 68 65  backtrace(), the
0e70: 6e 20 6a 75 73 74 0a 2a 2a 20 64 65 66 69 6e 65  n just.** define
0e80: 20 69 74 20 61 73 20 61 6e 20 65 6d 70 74 79 20   it as an empty 
0e90: 6d 61 63 72 6f 20 61 6e 64 20 73 65 74 20 74 68  macro and set th
0ea0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
0eb0: 65 20 72 65 73 65 72 76 65 64 20 74 6f 20 30 2e  e reserved to 0.
0ec0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
0ed0: 5f 5f 47 4c 49 42 43 5f 5f 29 20 26 26 20 53 51  __GLIBC__) && SQ
0ee0: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3e 32 0a  LITE_MEMDEBUG>2.
0ef0: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 62 61 63    extern int bac
0f00: 6b 74 72 61 63 65 28 76 6f 69 64 20 2a 2a 2c 20  ktrace(void **, 
0f10: 69 6e 74 29 3b 0a 20 20 23 64 65 66 69 6e 65 20  int);.  #define 
0f20: 54 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 53  TESTALLOC_STACKS
0f30: 49 5a 45 20 31 32 38 0a 20 20 23 64 65 66 69 6e  IZE 128.  #defin
0f40: 65 20 54 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43  e TESTALLOC_STAC
0f50: 4b 46 52 41 4d 45 53 20 28 28 54 45 53 54 41 4c  KFRAMES ((TESTAL
0f60: 4c 4f 43 5f 53 54 41 43 4b 53 49 5a 45 2d 38 29  LOC_STACKSIZE-8)
0f70: 2f 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 0a  /sizeof(void*)).
0f80: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
0f90: 62 61 63 6b 74 72 61 63 65 28 78 2c 20 79 29 0a  backtrace(x, y).
0fa0: 20 20 23 64 65 66 69 6e 65 20 54 45 53 54 41 4c    #define TESTAL
0fb0: 4c 4f 43 5f 53 54 41 43 4b 53 49 5a 45 20 30 0a  LOC_STACKSIZE 0.
0fc0: 20 20 23 64 65 66 69 6e 65 20 54 45 53 54 41 4c    #define TESTAL
0fd0: 4c 4f 43 5f 53 54 41 43 4b 46 52 41 4d 45 53 20  LOC_STACKFRAMES 
0fe0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
0ff0: 4e 75 6d 62 65 72 20 6f 66 20 33 32 2d 62 69 74  Number of 32-bit
1000: 20 67 75 61 72 64 20 77 6f 72 64 73 2e 20 20 54   guard words.  T
1010: 68 69 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61  his should proba
1020: 62 6c 79 20 62 65 20 61 20 6d 75 6c 74 69 70 6c  bly be a multipl
1030: 65 20 6f 66 0a 2a 2a 20 32 20 73 69 6e 63 65 20  e of.** 2 since 
1040: 6f 6e 20 36 34 2d 62 69 74 20 6d 61 63 68 69 6e  on 64-bit machin
1050: 65 73 20 77 65 20 77 61 6e 74 20 74 68 65 20 76  es we want the v
1060: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1070: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a   sqliteMalloc().
1080: 2a 2a 20 74 6f 20 62 65 20 38 2d 62 79 74 65 20  ** to be 8-byte 
1090: 61 6c 69 67 6e 65 64 2e 0a 2a 2f 0a 23 64 65 66  aligned..*/.#def
10a0: 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43 5f 4e 47  ine TESTALLOC_NG
10b0: 55 41 52 44 20 32 0a 0a 2f 2a 0a 2a 2a 20 53 69  UARD 2../*.** Si
10c0: 7a 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ze reserved for 
10d0: 73 74 6f 72 69 6e 67 20 66 69 6c 65 2d 6e 61 6d  storing file-nam
10e0: 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  e along with eac
10f0: 68 20 6d 61 6c 6c 6f 63 28 29 65 64 20 62 6c 6f  h malloc()ed blo
1100: 62 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  b..*/.#define TE
1110: 53 54 41 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a 45  STALLOC_FILESIZE
1120: 20 36 34 0a 0a 2f 2a 0a 2a 2a 20 53 69 7a 65 20   64../*.** Size 
1130: 72 65 73 65 72 76 65 64 20 66 6f 72 20 73 74 6f  reserved for sto
1140: 72 69 6e 67 20 74 68 65 20 75 73 65 72 20 73 74  ring the user st
1150: 72 69 6e 67 2e 20 45 61 63 68 20 74 69 6d 65 20  ring. Each time 
1160: 61 20 4d 61 6c 6c 6f 63 28 29 20 6f 72 20 52 65  a Malloc() or Re
1170: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 63 61 6c 6c 20  alloc().** call 
1180: 73 75 63 63 65 65 64 73 2c 20 75 70 20 74 6f 20  succeeds, up to 
1190: 54 45 53 54 41 4c 4c 4f 43 5f 55 53 45 52 53 49  TESTALLOC_USERSI
11a0: 5a 45 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ZE bytes of the 
11b0: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74  string pointed t
11c0: 6f 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  o by.** sqlite3_
11d0: 6d 61 6c 6c 6f 63 5f 69 64 20 61 72 65 20 73 74  malloc_id are st
11e0: 6f 72 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ored along with 
11f0: 74 68 65 20 6f 74 68 65 72 20 74 65 73 74 20 73  the other test s
1200: 79 73 74 65 6d 20 6d 65 74 61 64 61 74 61 2e 0a  ystem metadata..
1210: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 53 54 41  */.#define TESTA
1220: 4c 4c 4f 43 5f 55 53 45 52 53 49 5a 45 20 36 34  LLOC_USERSIZE 64
1230: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1240: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 69 64 20 3d  ite3_malloc_id =
1250: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 42 6c 6f 63 6b   0;../*.** Block
1260: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  s used by the te
1270: 73 74 20 6c 61 79 65 72 20 68 61 76 65 20 74 68  st layer have th
1280: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
1290: 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  at:.**.**       
12a0: 20 3c 73 69 7a 65 6f 66 28 76 6f 69 64 20 2a 29   <sizeof(void *)
12b0: 20 70 4e 65 78 74 20 70 6f 69 6e 74 65 72 3e 0a   pNext pointer>.
12c0: 2a 2a 20 20 20 20 20 20 20 20 3c 73 69 7a 65 6f  **        <sizeo
12d0: 66 28 76 6f 69 64 20 2a 29 20 70 50 72 65 76 20  f(void *) pPrev 
12e0: 70 6f 69 6e 74 65 72 3e 0a 2a 2a 20 20 20 20 20  pointer>.**     
12f0: 20 20 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e 47     <TESTALLOC_NG
1300: 55 41 52 44 20 33 32 2d 62 69 74 20 67 75 61 72  UARD 32-bit guar
1310: 64 20 77 6f 72 64 73 3e 0a 2a 2a 20 20 20 20 20  d words>.**     
1320: 20 20 20 20 20 20 20 3c 54 68 65 20 61 70 70 6c         <The appl
1330: 69 63 61 74 69 6f 6e 20 6c 65 76 65 6c 20 61 6c  ication level al
1340: 6c 6f 63 61 74 69 6f 6e 3e 0a 2a 2a 20 20 20 20  location>.**    
1350: 20 20 20 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e      <TESTALLOC_N
1360: 47 55 41 52 44 20 33 32 2d 62 69 74 20 67 75 61  GUARD 32-bit gua
1370: 72 64 20 77 6f 72 64 73 3e 0a 2a 2a 20 20 20 20  rd words>.**    
1380: 20 20 20 20 3c 33 32 2d 62 69 74 20 6c 69 6e 65      <32-bit line
1390: 20 6e 75 6d 62 65 72 3e 0a 2a 2a 20 20 20 20 20   number>.**     
13a0: 20 20 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 46 49     <TESTALLOC_FI
13b0: 4c 45 53 49 5a 45 20 62 79 74 65 73 20 63 6f 6e  LESIZE bytes con
13c0: 74 61 69 6e 69 6e 67 20 6e 75 6c 6c 2d 74 65 72  taining null-ter
13d0: 6d 69 6e 61 74 65 64 20 66 69 6c 65 20 6e 61 6d  minated file nam
13e0: 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 3c 54 45  e>.**        <TE
13f0: 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 53 49 5a  STALLOC_STACKSIZ
1400: 45 20 62 79 74 65 73 20 6f 66 20 62 61 63 6b 74  E bytes of backt
1410: 72 61 63 65 28 29 20 6f 75 74 70 75 74 3e 0a 2a  race() output>.*
1420: 2f 20 0a 0a 23 64 65 66 69 6e 65 20 54 45 53 54  / ..#define TEST
1430: 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 47 55 41  ALLOC_OFFSET_GUA
1440: 52 44 31 28 70 29 20 20 20 20 28 73 69 7a 65 6f  RD1(p)    (sizeo
1450: 66 28 76 6f 69 64 20 2a 29 20 2a 20 32 29 0a 23  f(void *) * 2).#
1460: 64 65 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43  define TESTALLOC
1470: 5f 4f 46 46 53 45 54 5f 44 41 54 41 28 70 29 20  _OFFSET_DATA(p) 
1480: 28 20 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43 5f  ( \.  TESTALLOC_
1490: 4f 46 46 53 45 54 5f 47 55 41 52 44 31 28 70 29  OFFSET_GUARD1(p)
14a0: 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2a   + sizeof(u32) *
14b0: 20 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52   TESTALLOC_NGUAR
14c0: 44 20 5c 0a 29 0a 23 64 65 66 69 6e 65 20 54 45  D \.).#define TE
14d0: 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 47  STALLOC_OFFSET_G
14e0: 55 41 52 44 32 28 70 29 20 28 20 5c 0a 20 20 54  UARD2(p) ( \.  T
14f0: 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f  ESTALLOC_OFFSET_
1500: 44 41 54 41 28 70 29 20 2b 20 73 71 6c 69 74 65  DATA(p) + sqlite
1510: 33 4f 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a  3OsAllocationSiz
1520: 65 28 70 29 20 2d 20 54 45 53 54 41 4c 4c 4f 43  e(p) - TESTALLOC
1530: 5f 4f 56 45 52 48 45 41 44 20 5c 0a 29 0a 23 64  _OVERHEAD \.).#d
1540: 65 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43 5f  efine TESTALLOC_
1550: 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 55 4d 42 45  OFFSET_LINENUMBE
1560: 52 28 70 29 20 28 20 5c 0a 20 20 54 45 53 54 41  R(p) ( \.  TESTA
1570: 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 47 55 41 52  LLOC_OFFSET_GUAR
1580: 44 32 28 70 29 20 2b 20 73 69 7a 65 6f 66 28 75  D2(p) + sizeof(u
1590: 33 32 29 20 2a 20 54 45 53 54 41 4c 4c 4f 43 5f  32) * TESTALLOC_
15a0: 4e 47 55 41 52 44 20 5c 0a 29 0a 23 64 65 66 69  NGUARD \.).#defi
15b0: 6e 65 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46  ne TESTALLOC_OFF
15c0: 53 45 54 5f 46 49 4c 45 4e 41 4d 45 28 70 29 20  SET_FILENAME(p) 
15d0: 28 20 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43 5f  ( \.  TESTALLOC_
15e0: 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 55 4d 42 45  OFFSET_LINENUMBE
15f0: 52 28 70 29 20 2b 20 73 69 7a 65 6f 66 28 75 33  R(p) + sizeof(u3
1600: 32 29 20 5c 0a 29 0a 23 64 65 66 69 6e 65 20 54  2) \.).#define T
1610: 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f  ESTALLOC_OFFSET_
1620: 55 53 45 52 28 70 29 20 28 20 5c 0a 20 20 54 45  USER(p) ( \.  TE
1630: 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 46  STALLOC_OFFSET_F
1640: 49 4c 45 4e 41 4d 45 28 70 29 20 2b 20 54 45 53  ILENAME(p) + TES
1650: 54 41 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a 45 20  TALLOC_FILESIZE 
1660: 5c 0a 29 0a 23 64 65 66 69 6e 65 20 54 45 53 54  \.).#define TEST
1670: 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 53 54 41  ALLOC_OFFSET_STA
1680: 43 4b 28 70 29 20 28 20 5c 0a 20 20 54 45 53 54  CK(p) ( \.  TEST
1690: 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 55 53 45  ALLOC_OFFSET_USE
16a0: 52 28 70 29 20 2b 20 54 45 53 54 41 4c 4c 4f 43  R(p) + TESTALLOC
16b0: 5f 55 53 45 52 53 49 5a 45 20 2b 20 38 20 2d 20  _USERSIZE + 8 - 
16c0: 5c 0a 20 20 28 54 45 53 54 41 4c 4c 4f 43 5f 4f  \.  (TESTALLOC_O
16d0: 46 46 53 45 54 5f 55 53 45 52 28 70 29 20 25 20  FFSET_USER(p) % 
16e0: 38 29 20 5c 0a 29 0a 0a 23 64 65 66 69 6e 65 20  8) \.)..#define 
16f0: 54 45 53 54 41 4c 4c 4f 43 5f 4f 56 45 52 48 45  TESTALLOC_OVERHE
1700: 41 44 20 28 20 5c 0a 20 20 73 69 7a 65 6f 66 28  AD ( \.  sizeof(
1710: 76 6f 69 64 20 2a 29 2a 32 20 2b 20 20 20 20 20  void *)*2 +     
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1730: 20 70 50 72 65 76 20 61 6e 64 20 70 4e 65 78 74   pPrev and pNext
1740: 20 70 6f 69 6e 74 65 72 73 20 2a 2f 20 20 20 5c   pointers */   \
1750: 0a 20 20 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55  .  TESTALLOC_NGU
1760: 41 52 44 2a 73 69 7a 65 6f 66 28 75 33 32 29 2a  ARD*sizeof(u32)*
1770: 32 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  2 +             
1780: 20 2f 2a 20 47 75 61 72 64 20 77 6f 72 64 73 20   /* Guard words 
1790: 2a 2f 20 20 20 20 20 20 20 5c 0a 20 20 73 69 7a  */       \.  siz
17a0: 65 6f 66 28 75 33 32 29 20 2b 20 54 45 53 54 41  eof(u32) + TESTA
17b0: 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a 45 20 2b 20  LLOC_FILESIZE + 
17c0: 20 20 2f 2a 20 46 69 6c 65 20 61 6e 64 20 6c 69    /* File and li
17d0: 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 20 20 20 20  ne number */    
17e0: 20 20 20 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43     \.  TESTALLOC
17f0: 5f 55 53 45 52 53 49 5a 45 20 2b 20 20 20 20 20  _USERSIZE +     
1800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1810: 73 65 72 20 73 74 72 69 6e 67 20 2a 2f 20 20 20  ser string */   
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1830: 20 54 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b   TESTALLOC_STACK
1840: 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 20  SIZE            
1850: 20 20 20 20 20 20 2f 2a 20 62 61 63 6b 74 72 61        /* backtra
1860: 63 65 28 29 20 73 74 61 63 6b 20 2a 2f 20 20 20  ce() stack */   
1870: 20 20 20 20 20 20 20 5c 0a 29 0a 0a 0a 2f 2a 0a         \.).../*.
1880: 2a 2a 20 46 6f 72 20 6b 65 65 70 69 6e 67 20 74  ** For keeping t
1890: 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62  rack of the numb
18a0: 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 73 20 61 6e  er of mallocs an
18b0: 64 20 66 72 65 65 73 2e 20 20 20 54 68 69 73 0a  d frees.   This.
18c0: 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ** is used to ch
18d0: 65 63 6b 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6c  eck for memory l
18e0: 65 61 6b 73 2e 20 20 54 68 65 20 69 4d 61 6c 6c  eaks.  The iMall
18f0: 6f 63 46 61 69 6c 20 61 6e 64 20 69 4d 61 6c 6c  ocFail and iMall
1900: 6f 63 52 65 73 65 74 0a 2a 2a 20 76 61 6c 75 65  ocReset.** value
1910: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 69  s are used to si
1920: 6d 75 6c 61 74 65 20 6d 61 6c 6c 6f 63 28 29 20  mulate malloc() 
1930: 66 61 69 6c 75 72 65 73 20 64 75 72 69 6e 67 20  failures during 
1940: 74 65 73 74 69 6e 67 20 69 6e 20 0a 2a 2a 20 6f  testing in .** o
1950: 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20 74  rder to verify t
1960: 68 61 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  hat the library 
1970: 63 6f 72 72 65 63 74 6c 79 20 68 61 6e 64 6c 65  correctly handle
1980: 73 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  s an out-of-memo
1990: 72 79 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 2e  ry.** condition.
19a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
19b0: 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  nMalloc;        
19c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 71   /* Number of sq
19d0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 63 61 6c  liteMalloc() cal
19e0: 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ls */.int sqlite
19f0: 33 5f 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  3_nFree;        
1a00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a10: 73 71 6c 69 74 65 46 72 65 65 28 29 20 63 61 6c  sqliteFree() cal
1a20: 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ls */.int sqlite
1a30: 33 5f 6d 65 6d 55 73 65 64 3b 20 20 20 20 20 20  3_memUsed;      
1a40: 20 20 20 2f 2a 20 54 4f 44 4f 20 54 6f 74 61 6c     /* TODO Total
1a50: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
1a60: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a   from malloc */.
1a70: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 4d  int sqlite3_memM
1a80: 61 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ax;          /* 
1a90: 54 4f 44 4f 20 4d 65 6d 20 75 73 61 67 65 20 68  TODO Mem usage h
1aa0: 69 67 68 2d 77 61 74 65 72 20 6d 61 72 6b 20 2a  igh-water mark *
1ab0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 4d  /.int sqlite3_iM
1ac0: 61 6c 6c 6f 63 46 61 69 6c 3b 20 20 20 20 20 2f  allocFail;     /
1ad0: 2a 20 46 61 69 6c 20 73 71 6c 69 74 65 4d 61 6c  * Fail sqliteMal
1ae0: 6c 6f 63 28 29 20 61 66 74 65 72 20 74 68 69 73  loc() after this
1af0: 20 6d 61 6e 79 20 63 61 6c 6c 73 20 2a 2f 0a 69   many calls */.i
1b00: 6e 74 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c  nt sqlite3_iMall
1b10: 6f 63 52 65 73 65 74 20 3d 20 2d 31 3b 20 2f 2a  ocReset = -1; /*
1b20: 20 57 68 65 6e 20 69 4d 61 6c 6c 6f 63 46 61 69   When iMallocFai
1b30: 6c 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  l reaches 0, set
1b40: 20 74 6f 20 74 68 69 73 20 2a 2f 0a 0a 2f 2a 0a   to this */../*.
1b50: 2a 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 73  ** Check for a s
1b60: 69 6d 75 6c 61 74 65 64 20 6d 65 6d 6f 72 79 20  imulated memory 
1b70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
1b80: 72 65 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  re.  Return true
1b90: 20 69 66 0a 2a 2a 20 74 68 65 20 66 61 69 6c 75   if.** the failu
1ba0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 69 6d  re should be sim
1bb0: 75 6c 61 74 65 64 2e 20 20 52 65 74 75 72 6e 20  ulated.  Return 
1bc0: 66 61 6c 73 65 20 74 6f 20 70 72 6f 63 65 65 64  false to proceed
1bd0: 20 61 73 20 6e 6f 72 6d 61 6c 2e 0a 2a 2f 0a 73   as normal..*/.s
1be0: 74 61 74 69 63 20 69 6e 74 20 66 61 69 6c 4d 61  tatic int failMa
1bf0: 6c 6c 6f 63 28 29 7b 0a 20 20 54 68 72 65 61 64  lloc(){.  Thread
1c00: 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
1c10: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
1c20: 3b 0a 20 20 69 66 28 20 70 54 73 64 2d 3e 69 73  ;.  if( pTsd->is
1c30: 46 61 69 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Fail ){.    retu
1c40: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
1c50: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
1c60: 61 69 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  ail>=0 ){.    sq
1c70: 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
1c80: 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  l--;.    if( sql
1c90: 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
1ca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1cb0: 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
1cc0: 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c   = sqlite3_iMall
1cd0: 6f 63 52 65 73 65 74 3b 0a 20 20 20 20 20 20 70  ocReset;.      p
1ce0: 54 73 64 2d 3e 69 73 46 61 69 6c 20 3d 20 31 3b  Tsd->isFail = 1;
1cf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1d00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d10: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1d20: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1d30: 61 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  a pointer return
1d40: 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 4d  ed by sqlite3OsM
1d50: 61 6c 6c 6f 63 28 29 20 6f 72 20 78 52 65 61 6c  alloc() or xReal
1d60: 6c 6f 63 28 29 2e 0a 2a 2a 20 61 73 73 65 72 74  loc()..** assert
1d70: 28 29 20 74 68 61 74 20 74 68 65 20 66 69 72 73  () that the firs
1d80: 74 20 61 6e 64 20 6c 61 73 74 20 28 54 45 53 54  t and last (TEST
1d90: 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 2a 34 29 20  ALLOC_NGUARD*4) 
1da0: 62 79 74 65 73 20 61 72 65 20 73 65 74 20 74 6f  bytes are set to
1db0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 73 20 73   the.** values s
1dc0: 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 79 47  et by the applyG
1dd0: 75 61 72 64 73 28 29 20 66 75 6e 63 74 69 6f 6e  uards() function
1de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1df0: 20 63 68 65 63 6b 47 75 61 72 64 73 28 75 33 32   checkGuards(u32
1e00: 20 2a 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a   *p).{.  int i;.
1e10: 20 20 63 68 61 72 20 2a 7a 41 6c 6c 6f 63 20 3d    char *zAlloc =
1e20: 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 63 68   (char *)p;.  ch
1e30: 61 72 20 2a 7a 3b 0a 0a 20 20 2f 2a 20 46 69 72  ar *z;..  /* Fir
1e40: 73 74 20 73 65 74 20 6f 66 20 67 75 61 72 64 20  st set of guard 
1e50: 77 6f 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20 26  words */.  z = &
1e60: 7a 41 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43  zAlloc[TESTALLOC
1e70: 5f 4f 46 46 53 45 54 5f 47 55 41 52 44 31 28 70  _OFFSET_GUARD1(p
1e80: 29 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  )];.  for(i=0; i
1e90: 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52  <TESTALLOC_NGUAR
1ea0: 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  D; i++){.    ass
1eb0: 65 72 74 28 28 28 75 33 32 20 2a 29 7a 29 5b 69  ert(((u32 *)z)[i
1ec0: 5d 3d 3d 30 78 64 65 61 64 31 31 32 32 29 3b 0a  ]==0xdead1122);.
1ed0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 63 6f 6e 64    }..  /* Second
1ee0: 20 73 65 74 20 6f 66 20 67 75 61 72 64 20 77 6f   set of guard wo
1ef0: 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41  rds */.  z = &zA
1f00: 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f  lloc[TESTALLOC_O
1f10: 46 46 53 45 54 5f 47 55 41 52 44 32 28 70 29 5d  FFSET_GUARD2(p)]
1f20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54  ;.  for(i=0; i<T
1f30: 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 3b  ESTALLOC_NGUARD;
1f40: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20 67   i++){.    u32 g
1f50: 75 61 72 64 20 3d 20 30 3b 0a 20 20 20 20 6d 65  uard = 0;.    me
1f60: 6d 63 70 79 28 26 67 75 61 72 64 2c 20 26 7a 5b  mcpy(&guard, &z[
1f70: 69 2a 73 69 7a 65 6f 66 28 75 33 32 29 5d 2c 20  i*sizeof(u32)], 
1f80: 73 69 7a 65 6f 66 28 75 33 32 29 29 3b 0a 20 20  sizeof(u32));.  
1f90: 20 20 61 73 73 65 72 74 28 67 75 61 72 64 3d 3d    assert(guard==
1fa0: 30 78 64 65 61 64 33 33 34 34 29 3b 0a 20 20 7d  0xdead3344);.  }
1fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1fc0: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
1fd0: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
1fe0: 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28  sqlite3OsMalloc(
1ff0: 29 20 6f 72 20 52 65 61 6c 6c 6f 63 28 29 2e 20  ) or Realloc(). 
2000: 54 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 6e 64  The.** first and
2010: 20 6c 61 73 74 20 28 54 45 53 54 41 4c 4c 4f 43   last (TESTALLOC
2020: 5f 4e 47 55 41 52 44 2a 34 29 20 62 79 74 65 73  _NGUARD*4) bytes
2030: 20 61 72 65 20 73 65 74 20 74 6f 20 6b 6e 6f 77   are set to know
2040: 6e 20 76 61 6c 75 65 73 20 66 6f 72 20 75 73 65  n values for use
2050: 20 61 73 20 0a 2a 2a 20 67 75 61 72 64 2d 70 6f   as .** guard-po
2060: 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sts..*/.static v
2070: 6f 69 64 20 61 70 70 6c 79 47 75 61 72 64 73 28  oid applyGuards(
2080: 75 33 32 20 2a 70 29 0a 7b 0a 20 20 69 6e 74 20  u32 *p).{.  int 
2090: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
20a0: 63 68 61 72 20 2a 7a 41 6c 6c 6f 63 20 3d 20 28  char *zAlloc = (
20b0: 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 2f 2a 20  char *)p;..  /* 
20c0: 46 69 72 73 74 20 73 65 74 20 6f 66 20 67 75 61  First set of gua
20d0: 72 64 20 77 6f 72 64 73 20 2a 2f 0a 20 20 7a 20  rd words */.  z 
20e0: 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45 53 54 41 4c  = &zAlloc[TESTAL
20f0: 4c 4f 43 5f 4f 46 46 53 45 54 5f 47 55 41 52 44  LOC_OFFSET_GUARD
2100: 31 28 70 29 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  1(p)];.  for(i=0
2110: 3b 20 69 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e 47  ; i<TESTALLOC_NG
2120: 55 41 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  UARD; i++){.    
2130: 28 28 75 33 32 20 2a 29 7a 29 5b 69 5d 20 3d 20  ((u32 *)z)[i] = 
2140: 30 78 64 65 61 64 31 31 32 32 3b 0a 20 20 7d 0a  0xdead1122;.  }.
2150: 0a 20 20 2f 2a 20 53 65 63 6f 6e 64 20 73 65 74  .  /* Second set
2160: 20 6f 66 20 67 75 61 72 64 20 77 6f 72 64 73 20   of guard words 
2170: 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63  */.  z = &zAlloc
2180: 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45  [TESTALLOC_OFFSE
2190: 54 5f 47 55 41 52 44 32 28 70 29 5d 3b 0a 20 20  T_GUARD2(p)];.  
21a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53 54 41  for(i=0; i<TESTA
21b0: 4c 4c 4f 43 5f 4e 47 55 41 52 44 3b 20 69 2b 2b  LLOC_NGUARD; i++
21c0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
21d0: 6e 73 74 20 69 6e 74 20 67 75 61 72 64 20 3d 20  nst int guard = 
21e0: 30 78 64 65 61 64 33 33 34 34 3b 0a 20 20 20 20  0xdead3344;.    
21f0: 6d 65 6d 63 70 79 28 26 7a 5b 69 2a 73 69 7a 65  memcpy(&z[i*size
2200: 6f 66 28 75 33 32 29 5d 2c 20 26 67 75 61 72 64  of(u32)], &guard
2210: 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 29 3b 0a  , sizeof(u32));.
2220: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 65 20 6e    }..  /* Line n
2230: 75 6d 62 65 72 20 2a 2f 0a 20 20 7a 20 3d 20 26  umber */.  z = &
2240: 28 28 63 68 61 72 20 2a 29 7a 29 5b 54 45 53 54  ((char *)z)[TEST
2250: 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 2a 73 69 7a  ALLOC_NGUARD*siz
2260: 65 6f 66 28 75 33 32 29 5d 3b 20 20 20 20 20 20  eof(u32)];      
2270: 20 20 20 20 20 20 20 2f 2a 20 47 75 61 72 64 20         /* Guard 
2280: 77 6f 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20 26  words */.  z = &
2290: 7a 41 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43  zAlloc[TESTALLOC
22a0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 55 4d 42  _OFFSET_LINENUMB
22b0: 45 52 28 70 29 5d 3b 0a 20 20 6d 65 6d 63 70 79  ER(p)];.  memcpy
22c0: 28 7a 2c 20 26 73 71 6c 69 74 65 33 54 68 72 65  (z, &sqlite3Thre
22d0: 61 64 44 61 74 61 28 29 2d 3e 69 4c 69 6e 65 2c  adData()->iLine,
22e0: 20 73 69 7a 65 6f 66 28 75 33 32 29 29 3b 0a 0a   sizeof(u32));..
22f0: 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 2a    /* File name *
2300: 2f 0a 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b  /.  z = &zAlloc[
2310: 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54  TESTALLOC_OFFSET
2320: 5f 46 49 4c 45 4e 41 4d 45 28 70 29 5d 3b 0a 20  _FILENAME(p)];. 
2330: 20 73 74 72 6e 63 70 79 28 7a 2c 20 73 71 6c 69   strncpy(z, sqli
2340: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d  te3ThreadData()-
2350: 3e 7a 46 69 6c 65 2c 20 54 45 53 54 41 4c 4c 4f  >zFile, TESTALLO
2360: 43 5f 46 49 4c 45 53 49 5a 45 29 3b 0a 20 20 7a  C_FILESIZE);.  z
2370: 5b 54 45 53 54 41 4c 4c 4f 43 5f 46 49 4c 45 53  [TESTALLOC_FILES
2380: 49 5a 45 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  IZE - 1] = '\0';
2390: 0a 0a 20 20 2f 2a 20 55 73 65 72 20 73 74 72 69  ..  /* User stri
23a0: 6e 67 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41 6c  ng */.  z = &zAl
23b0: 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46  loc[TESTALLOC_OF
23c0: 46 53 45 54 5f 55 53 45 52 28 70 29 5d 3b 0a 20  FSET_USER(p)];. 
23d0: 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28   z[0] = 0;.  if(
23e0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
23f0: 69 64 20 29 7b 0a 20 20 20 20 73 74 72 6e 63 70  id ){.    strncp
2400: 79 28 7a 2c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  y(z, sqlite3_mal
2410: 6c 6f 63 5f 69 64 2c 20 54 45 53 54 41 4c 4c 4f  loc_id, TESTALLO
2420: 43 5f 55 53 45 52 53 49 5a 45 29 3b 0a 20 20 20  C_USERSIZE);.   
2430: 20 7a 5b 54 45 53 54 41 4c 4c 4f 43 5f 55 53 45   z[TESTALLOC_USE
2440: 52 53 49 5a 45 2d 31 5d 20 3d 20 30 3b 0a 20 20  RSIZE-1] = 0;.  
2450: 7d 0a 0a 20 20 2f 2a 20 62 61 63 6b 74 72 61 63  }..  /* backtrac
2460: 65 28 29 20 73 74 61 63 6b 20 2a 2f 0a 20 20 7a  e() stack */.  z
2470: 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45 53 54 41   = &zAlloc[TESTA
2480: 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 53 54 41 43  LLOC_OFFSET_STAC
2490: 4b 28 70 29 5d 3b 0a 20 20 62 61 63 6b 74 72 61  K(p)];.  backtra
24a0: 63 65 28 28 76 6f 69 64 20 2a 2a 29 7a 2c 20 54  ce((void **)z, T
24b0: 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 46 52  ESTALLOC_STACKFR
24c0: 41 4d 45 53 29 3b 0a 0a 20 20 2f 2a 20 53 61 6e  AMES);..  /* San
24d0: 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ity check to mak
24e0: 65 20 73 75 72 65 20 63 68 65 63 6b 47 75 61 72  e sure checkGuar
24f0: 64 73 28 29 20 69 73 20 77 6f 72 6b 69 6e 67 20  ds() is working 
2500: 2a 2f 0a 20 20 63 68 65 63 6b 47 75 61 72 64 73  */.  checkGuards
2510: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
2520: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  e argument is a 
2530: 6d 61 6c 6c 6f 63 28 29 65 64 20 70 6f 69 6e 74  malloc()ed point
2540: 65 72 20 61 73 20 72 65 74 75 72 6e 65 64 20 62  er as returned b
2550: 79 20 74 68 65 20 74 65 73 74 2d 77 72 61 70 70  y the test-wrapp
2560: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
2570: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
2580: 73 20 6c 65 76 65 6c 20 61 6c 6c 6f 63 61 74 69  s level allocati
2590: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
25a0: 69 64 20 2a 67 65 74 4f 73 50 6f 69 6e 74 65 72  id *getOsPointer
25b0: 28 76 6f 69 64 20 2a 70 29 0a 7b 0a 20 20 63 68  (void *p).{.  ch
25c0: 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 20 2a 29  ar *z = (char *)
25d0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  p;.  return (voi
25e0: 64 20 2a 29 28 26 7a 5b 2d 31 20 2a 20 54 45 53  d *)(&z[-1 * TES
25f0: 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 44 41  TALLOC_OFFSET_DA
2600: 54 41 28 70 29 5d 29 3b 0a 7d 0a 0a 0a 23 69 66  TA(p)]);.}...#if
2610: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
2620: 3e 31 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  >1./*.** The arg
2630: 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20  ument points to 
2640: 61 6e 20 4f 73 20 6c 65 76 65 6c 20 61 6c 6c 6f  an Os level allo
2650: 63 61 74 69 6f 6e 2e 20 4c 69 6e 6b 20 69 74 20  cation. Link it 
2660: 69 6e 74 6f 20 74 68 65 20 74 68 72 65 61 64 73  into the threads
2670: 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f   list.** of allo
2680: 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  cations..*/.stat
2690: 69 63 20 76 6f 69 64 20 6c 69 6e 6b 41 6c 6c 6f  ic void linkAllo
26a0: 63 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 54 68  c(void *p){.  Th
26b0: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
26c0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
26d0: 74 61 28 29 3b 0a 20 20 76 6f 69 64 20 2a 2a 70  ta();.  void **p
26e0: 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 70 3b 0a  p = (void **)p;.
26f0: 20 20 70 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 70    pp[0] = 0;.  p
2700: 70 5b 31 5d 20 3d 20 70 54 73 64 2d 3e 70 46 69  p[1] = pTsd->pFi
2710: 72 73 74 3b 0a 20 20 69 66 28 20 70 54 73 64 2d  rst;.  if( pTsd-
2720: 3e 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20 28  >pFirst ){.    (
2730: 28 76 6f 69 64 20 2a 2a 29 70 54 73 64 2d 3e 70  (void **)pTsd->p
2740: 46 69 72 73 74 29 5b 30 5d 20 3d 20 70 3b 0a 20  First)[0] = p;. 
2750: 20 7d 0a 20 20 70 54 73 64 2d 3e 70 46 69 72 73   }.  pTsd->pFirs
2760: 74 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = p;.}../*.** 
2770: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 69  The argument poi
2780: 6e 74 73 20 74 6f 20 61 6e 20 4f 73 20 6c 65 76  nts to an Os lev
2790: 65 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 55  el allocation. U
27a0: 6e 6c 69 6e 6b 65 20 69 74 20 66 72 6f 6d 20 74  nlinke it from t
27b0: 68 65 20 74 68 72 65 61 64 73 0a 2a 2a 20 6c 69  he threads.** li
27c0: 73 74 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  st of allocation
27d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
27e0: 64 20 75 6e 6c 69 6e 6b 41 6c 6c 6f 63 28 76 6f  d unlinkAlloc(vo
27f0: 69 64 20 2a 70 29 0a 7b 0a 20 20 54 68 72 65 61  id *p).{.  Threa
2800: 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
2810: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
2820: 29 3b 0a 20 20 76 6f 69 64 20 2a 2a 70 70 20 3d  );.  void **pp =
2830: 20 28 76 6f 69 64 20 2a 2a 29 70 3b 0a 20 20 69   (void **)p;.  i
2840: 66 28 20 70 3d 3d 70 54 73 64 2d 3e 70 46 69 72  f( p==pTsd->pFir
2850: 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  st ){.    assert
2860: 28 21 70 70 5b 30 5d 29 3b 0a 20 20 20 20 61 73  (!pp[0]);.    as
2870: 73 65 72 74 28 21 70 70 5b 31 5d 20 7c 7c 20 28  sert(!pp[1] || (
2880: 28 76 6f 69 64 20 2a 2a 29 28 70 70 5b 31 5d 29  (void **)(pp[1])
2890: 29 5b 30 5d 3d 3d 70 29 3b 0a 20 20 20 20 70 54  )[0]==p);.    pT
28a0: 73 64 2d 3e 70 46 69 72 73 74 20 3d 20 70 70 5b  sd->pFirst = pp[
28b0: 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 73 64  1];.    if( pTsd
28c0: 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ->pFirst ){.    
28d0: 20 20 28 28 76 6f 69 64 20 2a 2a 29 70 54 73 64    ((void **)pTsd
28e0: 2d 3e 70 46 69 72 73 74 29 5b 30 5d 20 3d 20 30  ->pFirst)[0] = 0
28f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2900: 0a 20 20 20 20 76 6f 69 64 20 2a 2a 70 70 72 65  .    void **ppre
2910: 76 20 3d 20 70 70 5b 30 5d 3b 0a 20 20 20 20 76  v = pp[0];.    v
2920: 6f 69 64 20 2a 2a 70 6e 65 78 74 20 3d 20 70 70  oid **pnext = pp
2930: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
2940: 70 70 72 65 76 29 3b 0a 20 20 20 20 61 73 73 65  pprev);.    asse
2950: 72 74 28 70 70 72 65 76 5b 31 5d 3d 3d 70 29 3b  rt(pprev[1]==p);
2960: 0a 20 20 20 20 70 70 72 65 76 5b 31 5d 20 3d 20  .    pprev[1] = 
2970: 28 76 6f 69 64 20 2a 29 70 6e 65 78 74 3b 0a 20  (void *)pnext;. 
2980: 20 20 20 69 66 28 20 70 6e 65 78 74 20 29 7b 0a     if( pnext ){.
2990: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 6e 65        assert(pne
29a0: 78 74 5b 30 5d 3d 3d 70 29 3b 0a 20 20 20 20 20  xt[0]==p);.     
29b0: 20 70 6e 65 78 74 5b 30 5d 20 3d 20 28 76 6f 69   pnext[0] = (voi
29c0: 64 20 2a 29 70 70 72 65 76 3b 0a 20 20 20 20 7d  d *)pprev;.    }
29d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  .  }.}../*.** Po
29e0: 69 6e 74 65 72 20 70 20 69 73 20 61 20 70 6f 69  inter p is a poi
29f0: 6e 74 65 72 20 74 6f 20 61 6e 20 4f 53 20 6c 65  nter to an OS le
2a00: 76 65 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74  vel allocation t
2a10: 68 61 74 20 68 61 73 20 6a 75 73 74 20 62 65 65  hat has just bee
2a20: 6e 0a 2a 2a 20 72 65 61 6c 6c 6f 63 28 29 65 64  n.** realloc()ed
2a30: 2e 20 53 65 74 20 74 68 65 20 6c 69 73 74 20 70  . Set the list p
2a40: 6f 69 6e 74 65 72 73 20 74 68 61 74 20 70 6f 69  ointers that poi
2a50: 6e 74 20 74 6f 20 74 68 69 73 20 65 6e 74 72 79  nt to this entry
2a60: 20 74 6f 20 69 74 27 73 20 6e 65 77 0a 2a 2a 20   to it's new.** 
2a70: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  location..*/.sta
2a80: 74 69 63 20 76 6f 69 64 20 72 65 6c 69 6e 6b 41  tic void relinkA
2a90: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 29 0a 7b 0a  lloc(void *p).{.
2aa0: 20 20 76 6f 69 64 20 2a 2a 70 70 20 3d 20 28 76    void **pp = (v
2ab0: 6f 69 64 20 2a 2a 29 70 3b 0a 20 20 69 66 28 20  oid **)p;.  if( 
2ac0: 70 70 5b 30 5d 20 29 7b 0a 20 20 20 20 28 28 76  pp[0] ){.    ((v
2ad0: 6f 69 64 20 2a 2a 29 28 70 70 5b 30 5d 29 29 5b  oid **)(pp[0]))[
2ae0: 31 5d 20 3d 20 70 3b 0a 20 20 7d 65 6c 73 65 7b  1] = p;.  }else{
2af0: 0a 20 20 20 20 54 68 72 65 61 64 44 61 74 61 20  .    ThreadData 
2b00: 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54  *pTsd = sqlite3T
2b10: 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 20  hreadData();.   
2b20: 20 70 54 73 64 2d 3e 70 46 69 72 73 74 20 3d 20   pTsd->pFirst = 
2b30: 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 70 5b  p;.  }.  if( pp[
2b40: 31 5d 20 29 7b 0a 20 20 20 20 28 28 76 6f 69 64  1] ){.    ((void
2b50: 20 2a 2a 29 28 70 70 5b 31 5d 29 29 5b 30 5d 20   **)(pp[1]))[0] 
2b60: 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  = p;.  }.}.#else
2b70: 0a 23 64 65 66 69 6e 65 20 6c 69 6e 6b 41 6c 6c  .#define linkAll
2b80: 6f 63 28 78 29 0a 23 64 65 66 69 6e 65 20 72 65  oc(x).#define re
2b90: 6c 69 6e 6b 41 6c 6c 6f 63 28 78 29 0a 23 64 65  linkAlloc(x).#de
2ba0: 66 69 6e 65 20 75 6e 6c 69 6e 6b 41 6c 6c 6f 63  fine unlinkAlloc
2bb0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
2bc0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2bd0: 73 65 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  sets the result 
2be0: 6f 66 20 74 68 65 20 54 63 6c 20 69 6e 74 65 72  of the Tcl inter
2bf0: 70 72 65 74 65 72 20 70 61 73 73 65 64 20 61 73  preter passed as
2c00: 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20   an argument.** 
2c10: 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69  to a list contai
2c20: 6e 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 66 6f  ning an entry fo
2c30: 72 20 65 61 63 68 20 63 75 72 72 65 6e 74 6c 79  r each currently
2c40: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 61 6c   outstanding cal
2c50: 6c 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 73 71  l made to .** sq
2c60: 6c 69 74 65 4d 61 6c 6c 6f 63 20 61 6e 64 20 66  liteMalloc and f
2c70: 72 69 65 6e 64 73 20 62 79 20 74 68 65 20 63 75  riends by the cu
2c80: 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 45 61  rrent thread. Ea
2c90: 63 68 20 6c 69 73 74 20 65 6e 74 72 79 20 69 73  ch list entry is
2ca0: 20 69 74 73 65 6c 66 20 61 0a 2a 2a 20 6c 69 73   itself a.** lis
2cb0: 74 2c 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  t, consisting of
2cc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28   the following (
2cd0: 69 6e 20 6f 72 64 65 72 29 3a 0a 2a 2a 0a 2a 2a  in order):.**.**
2ce0: 20 20 20 20 20 2a 20 54 68 65 20 6e 75 6d 62 65       * The numbe
2cf0: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
2d00: 61 74 65 64 0a 2a 2a 20 20 20 20 20 2a 20 54 68  ated.**     * Th
2d10: 65 20 5f 5f 46 49 4c 45 5f 5f 20 6d 61 63 72 6f  e __FILE__ macro
2d20: 20 61 74 20 74 68 65 20 74 69 6d 65 20 6f 66 20   at the time of 
2d30: 74 68 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  the sqliteMalloc
2d40: 28 29 20 63 61 6c 6c 2e 0a 2a 2a 20 20 20 20 20  () call..**     
2d50: 2a 20 54 68 65 20 5f 5f 4c 49 4e 45 5f 5f 20 6d  * The __LINE__ m
2d60: 61 63 72 6f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20  acro ....**     
2d70: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * The value of t
2d80: 68 65 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  he sqlite3_mallo
2d90: 63 5f 69 64 20 76 61 72 69 61 62 6c 65 20 2e 2e  c_id variable ..
2da0: 2e 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20 6f  ..**     * The o
2db0: 75 74 70 75 74 20 6f 66 20 62 61 63 6b 74 72 61  utput of backtra
2dc0: 63 65 28 29 20 28 69 66 20 61 76 61 69 6c 61 62  ce() (if availab
2dd0: 6c 65 29 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  le) ....**.** To
2de0: 64 6f 3a 20 57 65 20 63 6f 75 6c 64 20 68 61 76  do: We could hav
2df0: 65 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  e a version of t
2e00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  his function tha
2e10: 74 20 6f 75 74 70 75 74 73 20 74 6f 20 73 74 64  t outputs to std
2e20: 6f 75 74 2c 20 0a 2a 2a 20 74 6f 20 64 65 62 75  out, .** to debu
2e30: 67 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 20 77  g memory leaks w
2e40: 68 65 6e 20 54 63 6c 20 69 73 20 6e 6f 74 20 61  hen Tcl is not a
2e50: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  vailable..*/.#if
2e60: 64 65 66 20 54 43 4c 53 48 0a 23 69 6e 63 6c 75  def TCLSH.#inclu
2e70: 64 65 20 3c 74 63 6c 2e 68 3e 0a 69 6e 74 20 73  de <tcl.h>.int s
2e80: 71 6c 69 74 65 33 4f 75 74 73 74 61 6e 64 69 6e  qlite3Outstandin
2e90: 67 4d 61 6c 6c 6f 63 73 28 54 63 6c 5f 49 6e 74  gMallocs(Tcl_Int
2ea0: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
2eb0: 76 6f 69 64 20 2a 70 3b 0a 20 20 54 68 72 65 61  void *p;.  Threa
2ec0: 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
2ed0: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
2ee0: 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  );.  Tcl_Obj *pR
2ef0: 65 73 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  es = Tcl_NewObj(
2f00: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
2f10: 43 6f 75 6e 74 28 70 52 65 73 29 3b 0a 0a 20 20  Count(pRes);..  
2f20: 66 6f 72 28 70 3d 70 54 73 64 2d 3e 70 46 69 72  for(p=pTsd->pFir
2f30: 73 74 3b 20 70 3b 20 70 3d 28 28 76 6f 69 64 20  st; p; p=((void 
2f40: 2a 2a 29 70 29 5b 31 5d 29 7b 0a 20 20 20 20 54  **)p)[1]){.    T
2f50: 63 6c 5f 4f 62 6a 20 2a 70 45 6e 74 72 79 20 3d  cl_Obj *pEntry =
2f60: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
2f70: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61     Tcl_Obj *pSta
2f80: 63 6b 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  ck = Tcl_NewObj(
2f90: 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  );.    char *z;.
2fa0: 20 20 20 20 75 33 32 20 69 4c 69 6e 65 3b 0a 20      u32 iLine;. 
2fb0: 20 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20     int nBytes = 
2fc0: 73 71 6c 69 74 65 33 4f 73 41 6c 6c 6f 63 61 74  sqlite3OsAllocat
2fd0: 69 6f 6e 53 69 7a 65 28 70 29 20 2d 20 54 45 53  ionSize(p) - TES
2fe0: 54 41 4c 4c 4f 43 5f 4f 56 45 52 48 45 41 44 3b  TALLOC_OVERHEAD;
2ff0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 6c 6c 6f  .    char *zAllo
3000: 63 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20  c = (char *)p;. 
3010: 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 54     int i;..    T
3020: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3030: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6e 74 72  Element(0, pEntr
3040: 79 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  y, Tcl_NewIntObj
3050: 28 6e 42 79 74 65 73 29 29 3b 0a 0a 20 20 20 20  (nBytes));..    
3060: 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45 53 54  z = &zAlloc[TEST
3070: 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 46 49 4c  ALLOC_OFFSET_FIL
3080: 45 4e 41 4d 45 28 70 29 5d 3b 0a 20 20 20 20 54  ENAME(p)];.    T
3090: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
30a0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6e 74 72  Element(0, pEntr
30b0: 79 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  y, Tcl_NewString
30c0: 4f 62 6a 28 7a 2c 20 2d 31 29 29 3b 0a 0a 20 20  Obj(z, -1));..  
30d0: 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45    z = &zAlloc[TE
30e0: 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 4c  STALLOC_OFFSET_L
30f0: 49 4e 45 4e 55 4d 42 45 52 28 70 29 5d 3b 0a 20  INENUMBER(p)];. 
3100: 20 20 20 6d 65 6d 63 70 79 28 26 69 4c 69 6e 65     memcpy(&iLine
3110: 2c 20 7a 2c 20 73 69 7a 65 6f 66 28 75 33 32 29  , z, sizeof(u32)
3120: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3130: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3140: 30 2c 20 70 45 6e 74 72 79 2c 20 54 63 6c 5f 4e  0, pEntry, Tcl_N
3150: 65 77 49 6e 74 4f 62 6a 28 69 4c 69 6e 65 29 29  ewIntObj(iLine))
3160: 3b 0a 0a 20 20 20 20 7a 20 3d 20 26 7a 41 6c 6c  ;..    z = &zAll
3170: 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46  oc[TESTALLOC_OFF
3180: 53 45 54 5f 55 53 45 52 28 70 29 5d 3b 0a 20 20  SET_USER(p)];.  
3190: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
31a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45  endElement(0, pE
31b0: 6e 74 72 79 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ntry, Tcl_NewStr
31c0: 69 6e 67 4f 62 6a 28 7a 2c 20 2d 31 29 29 3b 0a  ingObj(z, -1));.
31d0: 0a 20 20 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63  .    z = &zAlloc
31e0: 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45  [TESTALLOC_OFFSE
31f0: 54 5f 53 54 41 43 4b 28 70 29 5d 3b 0a 20 20 20  T_STACK(p)];.   
3200: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53 54   for(i=0; i<TEST
3210: 41 4c 4c 4f 43 5f 53 54 41 43 4b 46 52 41 4d 45  ALLOC_STACKFRAME
3220: 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  S; i++){.      c
3230: 68 61 72 20 7a 48 65 78 5b 31 32 38 5d 3b 0a 20  har zHex[128];. 
3240: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 48 65       sprintf(zHe
3250: 78 2c 20 22 25 70 22 2c 20 28 28 76 6f 69 64 20  x, "%p", ((void 
3260: 2a 2a 29 7a 29 5b 69 5d 29 3b 0a 20 20 20 20 20  **)z)[i]);.     
3270: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3280: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 74  ndElement(0, pSt
3290: 61 63 6b 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ack, Tcl_NewStri
32a0: 6e 67 4f 62 6a 28 7a 48 65 78 2c 20 2d 31 29 29  ngObj(zHex, -1))
32b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
32c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
32d0: 65 6d 65 6e 74 28 30 2c 20 70 45 6e 74 72 79 2c  ement(0, pEntry,
32e0: 20 70 53 74 61 63 6b 29 3b 0a 20 20 20 20 54 63   pStack);.    Tc
32f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3300: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 73 2c 20  lement(0, pRes, 
3310: 70 45 6e 74 72 79 29 3b 0a 20 20 7d 0a 0a 20 20  pEntry);.  }..  
3320: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
3330: 69 6e 74 65 72 70 29 3b 0a 20 20 54 63 6c 5f 53  interp);.  Tcl_S
3340: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3350: 72 70 2c 20 70 52 65 73 29 3b 0a 20 20 54 63 6c  rp, pRes);.  Tcl
3360: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
3370: 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  es);.  return TC
3380: 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
3390: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
33a0: 65 20 74 65 73 74 20 6c 61 79 65 72 27 73 20 77  e test layer's w
33b0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
33c0: 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 29 2e  lite3OsMalloc().
33d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
33e0: 2a 20 4f 53 4d 41 4c 4c 4f 43 28 69 6e 74 20 6e  * OSMALLOC(int n
33f0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
3400: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41  E_OMIT_MEMORY_MA
3410: 4e 41 47 45 4d 45 4e 54 0a 20 20 54 68 72 65 61  NAGEMENT.  Threa
3420: 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
3430: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
3440: 29 3b 0a 20 20 70 54 73 64 2d 3e 6e 4d 61 78 41  );.  pTsd->nMaxA
3450: 6c 6c 6f 63 20 3d 20 4d 41 58 28 70 54 73 64 2d  lloc = MAX(pTsd-
3460: 3e 6e 4d 61 78 41 6c 6c 6f 63 2c 20 70 54 73 64  >nMaxAlloc, pTsd
3470: 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 23 65 6e 64 69  ->nAlloc);.#endi
3480: 66 0a 20 20 69 66 28 20 21 66 61 69 6c 4d 61 6c  f.  if( !failMal
3490: 6c 6f 63 28 29 20 29 7b 0a 20 20 20 20 75 33 32  loc() ){.    u32
34a0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 28 75 33   *p;.    p = (u3
34b0: 32 20 2a 29 73 71 6c 69 74 65 33 4f 73 4d 61 6c  2 *)sqlite3OsMal
34c0: 6c 6f 63 28 6e 20 2b 20 54 45 53 54 41 4c 4c 4f  loc(n + TESTALLO
34d0: 43 5f 4f 56 45 52 48 45 41 44 29 3b 0a 20 20 20  C_OVERHEAD);.   
34e0: 20 61 73 73 65 72 74 28 70 29 3b 0a 20 20 20 20   assert(p);.    
34f0: 73 71 6c 69 74 65 33 5f 6e 4d 61 6c 6c 6f 63 2b  sqlite3_nMalloc+
3500: 2b 3b 0a 20 20 20 20 61 70 70 6c 79 47 75 61 72  +;.    applyGuar
3510: 64 73 28 70 29 3b 0a 20 20 20 20 6c 69 6e 6b 41  ds(p);.    linkA
3520: 6c 6c 6f 63 28 70 29 3b 0a 20 20 20 20 72 65 74  lloc(p);.    ret
3530: 75 72 6e 20 28 76 6f 69 64 20 2a 29 28 26 70 5b  urn (void *)(&p[
3540: 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44  TESTALLOC_NGUARD
3550: 20 2b 20 32 2a 73 69 7a 65 6f 66 28 76 6f 69 64   + 2*sizeof(void
3560: 20 2a 29 2f 73 69 7a 65 6f 66 28 75 33 32 29 5d   *)/sizeof(u32)]
3570: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3580: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
3590: 20 4f 53 53 49 5a 45 4f 46 28 76 6f 69 64 20 2a   OSSIZEOF(void *
35a0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
35b0: 20 20 20 75 33 32 20 2a 70 4f 73 20 3d 20 28 75     u32 *pOs = (u
35c0: 33 32 20 2a 29 67 65 74 4f 73 50 6f 69 6e 74 65  32 *)getOsPointe
35d0: 72 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r(p);.    return
35e0: 20 73 71 6c 69 74 65 33 4f 73 41 6c 6c 6f 63 61   sqlite3OsAlloca
35f0: 74 69 6f 6e 53 69 7a 65 28 70 4f 73 29 20 2d 20  tionSize(pOs) - 
3600: 54 45 53 54 41 4c 4c 4f 43 5f 4f 56 45 52 48 45  TESTALLOC_OVERHE
3610: 41 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  AD;.  }.  return
3620: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
3630: 73 20 69 73 20 74 68 65 20 74 65 73 74 20 6c 61  s is the test la
3640: 79 65 72 27 73 20 77 72 61 70 70 65 72 20 61 72  yer's wrapper ar
3650: 6f 75 6e 64 20 73 71 6c 69 74 65 33 4f 73 46 72  ound sqlite3OsFr
3660: 65 65 28 29 2e 20 54 68 65 20 61 72 67 75 6d 65  ee(). The argume
3670: 6e 74 20 69 73 20 61 0a 2a 2a 20 70 6f 69 6e 74  nt is a.** point
3680: 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20  er to the space 
3690: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
36a0: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 6f  e application to
36b0: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
36c0: 76 6f 69 64 20 4f 53 46 52 45 45 28 76 6f 69 64  void OSFREE(void
36d0: 20 2a 70 46 72 65 65 29 7b 0a 20 20 75 33 32 20   *pFree){.  u32 
36e0: 2a 70 20 3d 20 28 75 33 32 20 2a 29 67 65 74 4f  *p = (u32 *)getO
36f0: 73 50 6f 69 6e 74 65 72 28 70 46 72 65 65 29 3b  sPointer(pFree);
3700: 20 20 20 2f 2a 20 70 20 70 6f 69 6e 74 73 20 74     /* p points t
3710: 6f 20 4f 73 20 6c 65 76 65 6c 20 61 6c 6c 6f 63  o Os level alloc
3720: 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 65 63 6b  ation */.  check
3730: 47 75 61 72 64 73 28 70 29 3b 0a 20 20 75 6e 6c  Guards(p);.  unl
3740: 69 6e 6b 41 6c 6c 6f 63 28 70 29 3b 0a 20 20 6d  inkAlloc(p);.  m
3750: 65 6d 73 65 74 28 70 46 72 65 65 2c 20 30 78 35  emset(pFree, 0x5
3760: 35 2c 20 4f 53 53 49 5a 45 4f 46 28 70 46 72 65  5, OSSIZEOF(pFre
3770: 65 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  e));.  sqlite3Os
3780: 46 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Free(p);.  sqlit
3790: 65 33 5f 6e 46 72 65 65 2b 2b 3b 0a 7d 0a 0a 2f  e3_nFree++;.}../
37a0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
37b0: 20 74 65 73 74 20 6c 61 79 65 72 27 73 20 77 72   test layer's wr
37c0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
37d0: 69 74 65 33 4f 73 52 65 61 6c 6c 6f 63 28 29 2e  ite3OsRealloc().
37e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
37f0: 2a 20 4f 53 52 45 41 4c 4c 4f 43 28 76 6f 69 64  * OSREALLOC(void
3800: 20 2a 70 52 65 61 6c 6c 6f 63 2c 20 69 6e 74 20   *pRealloc, int 
3810: 6e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  n){.#ifndef SQLI
3820: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d  TE_OMIT_MEMORY_M
3830: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 54 68 72 65  ANAGEMENT.  Thre
3840: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
3850: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
3860: 28 29 3b 0a 20 20 70 54 73 64 2d 3e 6e 4d 61 78  ();.  pTsd->nMax
3870: 41 6c 6c 6f 63 20 3d 20 4d 41 58 28 70 54 73 64  Alloc = MAX(pTsd
3880: 2d 3e 6e 4d 61 78 41 6c 6c 6f 63 2c 20 70 54 73  ->nMaxAlloc, pTs
3890: 64 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 23 65 6e 64  d->nAlloc);.#end
38a0: 69 66 0a 20 20 69 66 28 20 21 66 61 69 6c 4d 61  if.  if( !failMa
38b0: 6c 6c 6f 63 28 29 20 29 7b 0a 20 20 20 20 75 33  lloc() ){.    u3
38c0: 32 20 2a 70 20 3d 20 28 75 33 32 20 2a 29 67 65  2 *p = (u32 *)ge
38d0: 74 4f 73 50 6f 69 6e 74 65 72 28 70 52 65 61 6c  tOsPointer(pReal
38e0: 6c 6f 63 29 3b 0a 20 20 20 20 63 68 65 63 6b 47  loc);.    checkG
38f0: 75 61 72 64 73 28 70 29 3b 0a 20 20 20 20 70 20  uards(p);.    p 
3900: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 6c 6c  = sqlite3OsReall
3910: 6f 63 28 70 2c 20 6e 20 2b 20 54 45 53 54 41 4c  oc(p, n + TESTAL
3920: 4c 4f 43 5f 4f 56 45 52 48 45 41 44 29 3b 0a 20  LOC_OVERHEAD);. 
3930: 20 20 20 61 70 70 6c 79 47 75 61 72 64 73 28 70     applyGuards(p
3940: 29 3b 0a 20 20 20 20 72 65 6c 69 6e 6b 41 6c 6c  );.    relinkAll
3950: 6f 63 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  oc(p);.    retur
3960: 6e 20 28 76 6f 69 64 20 2a 29 28 26 70 5b 54 45  n (void *)(&p[TE
3970: 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 20 2b  STALLOC_NGUARD +
3980: 20 32 2a 73 69 7a 65 6f 66 28 76 6f 69 64 20 2a   2*sizeof(void *
3990: 29 2f 73 69 7a 65 6f 66 28 75 33 32 29 5d 29 3b  )/sizeof(u32)]);
39a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
39b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
39c0: 4f 53 4d 41 4c 4c 4f 43 5f 46 41 49 4c 45 44 28  OSMALLOC_FAILED(
39d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 54 68 72 65  ){.  sqlite3Thre
39e0: 61 64 44 61 74 61 28 29 2d 3e 69 73 46 61 69 6c  adData()->isFail
39f0: 20 3d 20 30 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 2f   = 0;.}..#else./
3a00: 2a 20 44 65 66 69 6e 65 20 6d 61 63 72 6f 73 20  * Define macros 
3a10: 74 6f 20 63 61 6c 6c 20 74 68 65 20 73 71 6c 69  to call the sqli
3a20: 74 65 33 4f 73 58 58 58 20 69 6e 74 65 72 66 61  te3OsXXX interfa
3a30: 63 65 20 64 69 72 65 63 74 6c 79 20 69 66 20 0a  ce directly if .
3a40: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 45  ** the SQLITE_ME
3a50: 4d 44 45 42 55 47 20 6d 61 63 72 6f 20 69 73 20  MDEBUG macro is 
3a60: 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  not defined..*/.
3a70: 23 64 65 66 69 6e 65 20 4f 53 4d 41 4c 4c 4f 43  #define OSMALLOC
3a80: 28 78 29 20 20 20 20 20 20 20 20 73 71 6c 69 74  (x)        sqlit
3a90: 65 33 4f 73 4d 61 6c 6c 6f 63 28 78 29 0a 23 64  e3OsMalloc(x).#d
3aa0: 65 66 69 6e 65 20 4f 53 52 45 41 4c 4c 4f 43 28  efine OSREALLOC(
3ab0: 78 2c 79 29 20 20 20 20 20 73 71 6c 69 74 65 33  x,y)     sqlite3
3ac0: 4f 73 52 65 61 6c 6c 6f 63 28 78 2c 79 29 0a 23  OsRealloc(x,y).#
3ad0: 64 65 66 69 6e 65 20 4f 53 46 52 45 45 28 78 29  define OSFREE(x)
3ae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3af0: 33 4f 73 46 72 65 65 28 78 29 0a 23 64 65 66 69  3OsFree(x).#defi
3b00: 6e 65 20 4f 53 53 49 5a 45 4f 46 28 78 29 20 20  ne OSSIZEOF(x)  
3b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 41        sqlite3OsA
3b20: 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 28 78 29  llocationSize(x)
3b30: 0a 23 64 65 66 69 6e 65 20 4f 53 4d 41 4c 4c 4f  .#define OSMALLO
3b40: 43 5f 46 41 49 4c 45 44 28 29 0a 0a 23 65 6e 64  C_FAILED()..#end
3b50: 69 66 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 63 6f 64  if./*.** End cod
3b60: 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  e for memory all
3b70: 6f 63 61 74 69 6f 6e 20 73 79 73 74 65 6d 20 74  ocation system t
3b80: 65 73 74 20 6c 61 79 65 72 2e 0a 2a 2a 2d 2d 2d  est layer..**---
3b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 2f 0a 0a 2f 2a 0a 2a 2a  -------*/../*.**
3be0: 20 54 68 65 20 68 61 6e 64 6c 65 53 6f 66 74 4c   The handleSoftL
3bf0: 69 6d 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  imit() function 
3c00: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3c10: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 0a 2a   each call to .*
3c20: 2a 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f  * sqlite3OsMallo
3c30: 63 28 29 20 6f 72 20 78 52 65 61 6c 6c 6f 63 28  c() or xRealloc(
3c40: 29 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ). The parameter
3c50: 20 27 6e 27 20 69 73 20 74 68 65 20 6e 75 6d 62   'n' is the numb
3c60: 65 72 20 6f 66 0a 2a 2a 20 65 78 74 72 61 20 62  er of.** extra b
3c70: 79 74 65 73 20 61 62 6f 75 74 20 74 6f 20 62 65  ytes about to be
3c80: 20 61 6c 6c 6f 63 61 74 65 64 20 28 66 6f 72 20   allocated (for 
3c90: 52 65 61 6c 6c 6f 63 28 29 20 74 68 69 73 20 6d  Realloc() this m
3ca0: 65 61 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  eans the size of
3cb0: 20 74 68 65 0a 2a 2a 20 6e 65 77 20 61 6c 6c 6f   the.** new allo
3cc0: 63 61 74 69 6f 6e 20 6c 65 73 73 20 74 68 65 20  cation less the 
3cd0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 6c 64 20  size of the old 
3ce0: 61 6c 6c 6f 63 61 74 69 6f 6e 29 2e 20 49 66 20  allocation). If 
3cf0: 74 68 65 20 65 78 74 72 61 20 61 6c 6c 6f 63 61  the extra alloca
3d00: 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  tion.** means th
3d10: 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6d 65 6d  at the total mem
3d20: 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ory allocated to
3d30: 20 53 51 4c 69 74 65 20 69 6e 20 74 68 69 73 20   SQLite in this 
3d40: 74 68 72 65 61 64 20 77 6f 75 6c 64 20 65 78 63  thread would exc
3d50: 65 65 64 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  eed.** the limit
3d60: 20 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 5f   set by sqlite3_
3d70: 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28  soft_heap_limit(
3d80: 29 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 5f  ), then sqlite3_
3d90: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
3da0: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 74 6f   is.** called to
3db0: 20 74 72 79 20 74 6f 20 61 76 6f 69 64 20 74 68   try to avoid th
3dc0: 69 73 2e 20 4e 6f 20 69 6e 64 69 63 61 74 69 6f  is. No indicatio
3dd0: 6e 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  n of whether or 
3de0: 6e 6f 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 73  not this is.** s
3df0: 75 63 63 65 73 73 66 75 6c 20 69 73 20 72 65 74  uccessful is ret
3e00: 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
3e10: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ler..**.** If SQ
3e20: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3e30: 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 69 73 20 64  _MANAGEMENT is d
3e40: 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  efined, this fun
3e50: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
3e60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
3e70: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f  ITE_OMIT_MEMORY_
3e80: 4d 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69  MANAGEMENT.stati
3e90: 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 53 6f 66  c void handleSof
3ea0: 74 4c 69 6d 69 74 28 69 6e 74 20 6e 29 7b 0a 20  tLimit(int n){. 
3eb0: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
3ec0: 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
3ed0: 64 44 61 74 61 28 29 3b 0a 20 20 70 54 73 64 2d  dData();.  pTsd-
3ee0: 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 6e 3b 0a 20 20  >nAlloc += n;.  
3ef0: 69 66 28 20 6e 3e 30 20 26 26 20 70 54 73 64 2d  if( n>0 && pTsd-
3f00: 3e 6e 53 6f 66 74 48 65 61 70 4c 69 6d 69 74 3e  >nSoftHeapLimit>
3f10: 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
3f20: 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 3e 70 54 73  pTsd->nAlloc>pTs
3f30: 64 2d 3e 6e 53 6f 66 74 48 65 61 70 4c 69 6d 69  d->nSoftHeapLimi
3f40: 74 20 26 26 20 73 71 6c 69 74 65 33 5f 72 65 6c  t && sqlite3_rel
3f50: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 6e 29 20 29  ease_memory(n) )
3f60: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  ;.  }.}.#else.#d
3f70: 65 66 69 6e 65 20 68 61 6e 64 6c 65 53 6f 66 74  efine handleSoft
3f80: 4c 69 6d 69 74 28 78 29 0a 23 65 6e 64 69 66 0a  Limit(x).#endif.
3f90: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
3fa0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 20 62 79 74  and return N byt
3fb0: 65 73 20 6f 66 20 75 6e 69 6e 69 74 69 61 6c 69  es of uninitiali
3fc0: 73 65 64 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  sed memory by ca
3fd0: 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
3fe0: 4f 73 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 74  OsMalloc(). If t
3ff0: 68 65 20 4d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c  he Malloc() call
4000: 20 66 61 69 6c 73 2c 20 61 74 74 65 6d 70 74 20   fails, attempt 
4010: 74 6f 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 0a  to free memory .
4020: 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ** by calling sq
4030: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
4040: 6d 6f 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  mory()..*/.void 
4050: 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61  *sqlite3MallocRa
4060: 77 28 69 6e 74 20 6e 29 7b 0a 20 20 54 68 72 65  w(int n){.  Thre
4070: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
4080: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
4090: 28 29 3b 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20  ();.  void *p = 
40a0: 30 3b 0a 20 20 69 66 28 20 6e 3e 30 20 26 26 20  0;.  if( n>0 && 
40b0: 21 70 54 73 64 2d 3e 6d 61 6c 6c 6f 63 46 61 69  !pTsd->mallocFai
40c0: 6c 65 64 20 29 7b 0a 20 20 20 20 68 61 6e 64 6c  led ){.    handl
40d0: 65 53 6f 66 74 4c 69 6d 69 74 28 6e 29 3b 0a 20  eSoftLimit(n);. 
40e0: 20 20 20 77 68 69 6c 65 28 20 21 28 70 20 3d 20     while( !(p = 
40f0: 4f 53 4d 41 4c 4c 4f 43 28 6e 29 29 20 26 26 20  OSMALLOC(n)) && 
4100: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
4110: 6d 65 6d 6f 72 79 28 6e 29 20 29 3b 0a 20 20 20  memory(n) );.   
4120: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20   if( !p ){.     
4130: 20 2f 2a 20 49 66 20 74 68 65 20 61 6c 6c 6f 63   /* If the alloc
4140: 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 63 61  ation failed, ca
4150: 6c 6c 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69 6d  ll handleSoftLim
4160: 69 74 28 29 20 61 67 61 69 6e 2c 20 74 68 69 73  it() again, this
4170: 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 77   time.      ** w
4180: 69 74 68 20 74 68 65 20 61 64 64 69 74 69 76 65  ith the additive
4190: 20 69 6e 76 65 72 73 65 20 6f 66 20 74 68 65 20   inverse of the 
41a0: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
41b0: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  to .      ** han
41c0: 64 6c 65 53 6f 66 74 4c 69 6d 69 74 28 29 20 61  dleSoftLimit() a
41d0: 62 6f 76 65 2e 20 54 68 69 73 20 69 73 20 73 6f  bove. This is so
41e0: 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61 2e   the ThreadData.
41f0: 6e 41 6c 6c 6f 63 20 76 61 72 69 61 62 6c 65 20  nAlloc variable 
4200: 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 6c  is.      ** stil
4210: 6c 20 63 6f 72 72 65 63 74 20 61 66 74 65 72 20  l correct after 
4220: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
4230: 72 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  re. .      */.  
4240: 20 20 20 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69      handleSoftLi
4250: 6d 69 74 28 6e 20 2a 20 2d 31 29 3b 0a 20 20 20  mit(n * -1);.   
4260: 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64     sqlite3Thread
4270: 44 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61  Data()->mallocFa
4280: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
4290: 4f 53 4d 41 4c 4c 4f 43 5f 46 41 49 4c 45 44 28  OSMALLOC_FAILED(
42a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
42b0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
42c0: 2a 20 52 65 73 69 7a 65 20 74 68 65 20 61 6c 6c  * Resize the all
42d0: 6f 63 61 74 69 6f 6e 20 61 74 20 70 20 74 6f 20  ocation at p to 
42e0: 6e 20 62 79 74 65 73 20 62 79 20 63 61 6c 6c 69  n bytes by calli
42f0: 6e 67 20 73 71 6c 69 74 65 33 4f 73 52 65 61 6c  ng sqlite3OsReal
4300: 6c 6f 63 28 29 2e 20 54 68 65 0a 2a 2a 20 70 6f  loc(). The.** po
4310: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
4320: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 72   allocation is r
4330: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
4340: 20 52 65 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 20   Realloc() call 
4350: 66 61 69 6c 73 2c 0a 2a 2a 20 61 74 74 65 6d 70  fails,.** attemp
4360: 74 20 74 6f 20 66 72 65 65 20 6d 65 6d 6f 72 79  t to free memory
4370: 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
4380: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
4390: 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ry()..*/.void *s
43a0: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 76 6f  qlite3Realloc(vo
43b0: 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  id *p, int n){. 
43c0: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
43d0: 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
43e0: 64 44 61 74 61 28 29 3b 0a 20 20 69 66 28 20 70  dData();.  if( p
43f0: 54 73 64 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  Tsd->mallocFaile
4400: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
4410: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  0;.  }..  if( !p
4420: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
4430: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 29 3b  qlite3Malloc(n);
4440: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 6f  .  }else{.    vo
4450: 69 64 20 2a 6e 70 20 3d 20 30 3b 0a 20 20 20 20  id *np = 0;.    
4460: 68 61 6e 64 6c 65 53 6f 66 74 4c 69 6d 69 74 28  handleSoftLimit(
4470: 6e 20 2d 20 4f 53 53 49 5a 45 4f 46 28 70 29 29  n - OSSIZEOF(p))
4480: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 6e  ;.    while( !(n
4490: 70 20 3d 20 4f 53 52 45 41 4c 4c 4f 43 28 70 2c  p = OSREALLOC(p,
44a0: 20 6e 29 29 20 26 26 20 73 71 6c 69 74 65 33 5f   n)) && sqlite3_
44b0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 6e  release_memory(n
44c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 70  ) );.    if( !np
44d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
44e0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
44f0: 61 69 6c 65 64 2c 20 63 61 6c 6c 20 68 61 6e 64  ailed, call hand
4500: 6c 65 53 6f 66 74 4c 69 6d 69 74 28 29 20 61 67  leSoftLimit() ag
4510: 61 69 6e 2c 20 74 68 69 73 20 74 69 6d 65 0a 20  ain, this time. 
4520: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65       ** with the
4530: 20 61 64 64 69 74 69 76 65 20 69 6e 76 65 72 73   additive invers
4540: 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  e of the argumen
4550: 74 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20  t passed to .   
4560: 20 20 20 2a 2a 20 68 61 6e 64 6c 65 53 6f 66 74     ** handleSoft
4570: 4c 69 6d 69 74 28 29 20 61 62 6f 76 65 2e 20 54  Limit() above. T
4580: 68 69 73 20 69 73 20 73 6f 20 74 68 65 20 54 68  his is so the Th
4590: 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
45a0: 76 61 72 69 61 62 6c 65 20 69 73 0a 20 20 20 20  variable is.    
45b0: 20 20 2a 2a 20 73 74 69 6c 6c 20 63 6f 72 72 65    ** still corre
45c0: 63 74 20 61 66 74 65 72 20 61 20 6d 61 6c 6c 6f  ct after a mallo
45d0: 63 28 29 20 66 61 69 6c 75 72 65 2e 20 0a 20 20  c() failure. .  
45e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 68 61 6e      */.      han
45f0: 64 6c 65 53 6f 66 74 4c 69 6d 69 74 28 4f 53 53  dleSoftLimit(OSS
4600: 49 5a 45 4f 46 28 70 29 20 2d 20 6e 29 3b 0a 20  IZEOF(p) - n);. 
4610: 20 20 20 20 20 70 54 73 64 2d 3e 6d 61 6c 6c 6f       pTsd->mallo
4620: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
4630: 20 20 20 4f 53 4d 41 4c 4c 4f 43 5f 46 41 49 4c     OSMALLOC_FAIL
4640: 45 44 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ED();.    }.    
4650: 72 65 74 75 72 6e 20 6e 70 3b 0a 20 20 7d 0a 7d  return np;.  }.}
4660: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
4670: 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 64 20   memory pointed 
4680: 74 6f 20 62 79 20 70 2e 20 70 20 6d 75 73 74 20  to by p. p must 
4690: 62 65 20 65 69 74 68 65 72 20 61 20 4e 55 4c 4c  be either a NULL
46a0: 20 70 6f 69 6e 74 65 72 20 6f 72 20 61 20 0a 2a   pointer or a .*
46b0: 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * value returned
46c0: 20 62 79 20 61 20 70 72 65 76 69 6f 75 73 20 63   by a previous c
46d0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4d 61  all to sqlite3Ma
46e0: 6c 6c 6f 63 28 29 20 6f 72 20 73 71 6c 69 74 65  lloc() or sqlite
46f0: 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 76  3Realloc()..*/.v
4700: 6f 69 64 20 73 71 6c 69 74 65 33 46 72 65 65 58  oid sqlite3FreeX
4710: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 68 61 6e  (void *p){.  han
4720: 64 6c 65 53 6f 66 74 4c 69 6d 69 74 28 30 20 2d  dleSoftLimit(0 -
4730: 20 4f 53 53 49 5a 45 4f 46 28 70 29 29 3b 0a 20   OSSIZEOF(p));. 
4740: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 4f 53   if( p ){.    OS
4750: 46 52 45 45 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  FREE(p);.  }.}..
4760: 2f 2a 0a 2a 2a 20 41 20 76 65 72 73 69 6f 6e 20  /*.** A version 
4770: 6f 66 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  of sqliteMalloc(
4780: 29 20 74 68 61 74 20 69 73 20 61 6c 77 61 79 73  ) that is always
4790: 20 61 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74   a function, not
47a0: 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 43 75 72   a macro..** Cur
47b0: 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 69 73 20  rently, this is 
47c0: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 61 6c 6c  used only to all
47d0: 6f 63 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  oc to allocate t
47e0: 68 65 20 70 61 72 73 65 72 20 65 6e 67 69 6e 65  he parser engine
47f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
4800: 65 33 4d 61 6c 6c 6f 63 58 28 69 6e 74 20 6e 29  e3MallocX(int n)
4810: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
4820: 65 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 7d 0a 0a 2f  eMalloc(n);.}../
4830: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c  *.** sqlite3Mall
4840: 6f 63 0a 2a 2a 20 73 71 6c 69 74 65 33 52 65 61  oc.** sqlite3Rea
4850: 6c 6c 6f 63 4f 72 46 72 65 65 0a 2a 2a 0a 2a 2a  llocOrFree.**.**
4860: 20 54 68 65 73 65 20 74 77 6f 20 61 72 65 20 69   These two are i
4870: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 77 72  mplemented as wr
4880: 61 70 70 65 72 73 20 61 72 6f 75 6e 64 20 73 71  appers around sq
4890: 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 29  lite3MallocRaw()
48a0: 2c 20 0a 2a 2a 20 73 71 6c 69 74 65 33 52 65 61  , .** sqlite3Rea
48b0: 6c 6c 6f 63 28 29 20 61 6e 64 20 73 71 6c 69 74  lloc() and sqlit
48c0: 65 33 46 72 65 65 28 29 2e 0a 2a 2f 20 0a 76 6f  e3Free()..*/ .vo
48d0: 69 64 20 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  id *sqlite3Mallo
48e0: 63 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64  c(int n){.  void
48f0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   *p = sqlite3Mal
4900: 6c 6f 63 52 61 77 28 6e 29 3b 0a 20 20 69 66 28  locRaw(n);.  if(
4910: 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74   p ){.    memset
4920: 28 70 2c 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a 20  (p, 0, n);.  }. 
4930: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 76 6f 69   return p;.}.voi
4940: 64 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  d sqlite3Realloc
4950: 4f 72 46 72 65 65 28 76 6f 69 64 20 2a 2a 70 70  OrFree(void **pp
4960: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64  , int n){.  void
4970: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 52 65 61   *p = sqlite3Rea
4980: 6c 6c 6f 63 28 2a 70 70 2c 20 6e 29 3b 0a 20 20  lloc(*pp, n);.  
4990: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71  if( !p ){.    sq
49a0: 6c 69 74 65 33 46 72 65 65 58 28 2a 70 70 29 3b  lite3FreeX(*pp);
49b0: 0a 20 20 7d 0a 20 20 2a 70 70 20 3d 20 70 3b 0a  .  }.  *pp = p;.
49c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
49d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
49e0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74  tes allocated at
49f0: 20 6c 6f 63 61 74 69 6f 6e 20 70 2e 20 70 20 6d   location p. p m
4a00: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 0a 2a  ust be either .*
4a10: 2a 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  * a NULL pointer
4a20: 20 28 69 6e 20 77 68 69 63 68 20 63 61 73 65 20   (in which case 
4a30: 30 20 69 73 20 72 65 74 75 72 6e 65 64 29 20 6f  0 is returned) o
4a40: 72 20 61 20 70 6f 69 6e 74 65 72 20 72 65 74 75  r a pointer retu
4a50: 72 6e 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69  rned by .** sqli
4a60: 74 65 33 4d 61 6c 6c 6f 63 28 29 2c 20 73 71 6c  te3Malloc(), sql
4a70: 69 74 65 33 52 65 61 6c 6c 6f 63 28 29 20 6f 72  ite3Realloc() or
4a80: 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f   sqlite3ReallocO
4a90: 72 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  rFree()..**.** T
4aa0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
4ab0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 6f 65  es allocated doe
4ac0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e  s not include an
4ad0: 79 20 6f 76 65 72 68 65 61 64 20 69 6e 73 65 72  y overhead inser
4ae0: 74 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20 6d  ted by .** any m
4af0: 61 6c 6c 6f 63 28 29 20 77 72 61 70 70 65 72 20  alloc() wrapper 
4b00: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 6d  functions that m
4b10: 61 79 20 62 65 20 63 61 6c 6c 65 64 2e 20 53 6f  ay be called. So
4b20: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
4b30: 6e 65 64 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75  ned.** is the nu
4b40: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
4b50: 61 74 20 77 65 72 65 20 61 76 61 69 6c 61 62 6c  at were availabl
4b60: 65 20 74 6f 20 53 51 4c 69 74 65 20 75 73 69 6e  e to SQLite usin
4b70: 67 20 70 6f 69 6e 74 65 72 20 70 2c 20 0a 2a 2a  g pointer p, .**
4b80: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 68   regardless of h
4b90: 6f 77 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 77  ow much memory w
4ba0: 61 73 20 61 63 74 75 61 6c 6c 79 20 61 6c 6c 6f  as actually allo
4bb0: 63 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cated..*/.int sq
4bc0: 6c 69 74 65 33 41 6c 6c 6f 63 53 69 7a 65 28 76  lite3AllocSize(v
4bd0: 6f 69 64 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  oid *p){.  retur
4be0: 6e 20 4f 53 53 49 5a 45 4f 46 28 70 29 3b 0a 7d  n OSSIZEOF(p);.}
4bf0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63  ../*.** Make a c
4c00: 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20  opy of a string 
4c10: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4c20: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
4c30: 6c 6c 6f 63 28 29 2e 20 54 68 65 73 65 20 0a 2a  lloc(). These .*
4c40: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6c 6c  * functions call
4c50: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61   sqlite3MallocRa
4c60: 77 28 29 20 64 69 72 65 63 74 6c 79 20 69 6e 73  w() directly ins
4c70: 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 4d 61  tead of sqliteMa
4c80: 6c 6c 6f 63 28 29 2e 20 54 68 69 73 0a 2a 2a 20  lloc(). This.** 
4c90: 69 73 20 62 65 63 61 75 73 65 20 77 68 65 6e 20  is because when 
4ca0: 6d 65 6d 6f 72 79 20 64 65 62 75 67 67 69 6e 67  memory debugging
4cb0: 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74   is turned on, t
4cc0: 68 65 73 65 20 74 77 6f 20 66 75 6e 63 74 69 6f  hese two functio
4cd0: 6e 73 20 61 72 65 20 0a 2a 2a 20 63 61 6c 6c 65  ns are .** calle
4ce0: 64 20 76 69 61 20 6d 61 63 72 6f 73 20 74 68 61  d via macros tha
4cf0: 74 20 72 65 63 6f 72 64 20 74 68 65 20 63 75 72  t record the cur
4d00: 72 65 6e 74 20 66 69 6c 65 20 61 6e 64 20 6c 69  rent file and li
4d10: 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ne number in the
4d20: 0a 2a 2a 20 54 68 72 65 61 64 44 61 74 61 20 73  .** ThreadData s
4d30: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 63 68 61  tructure..*/.cha
4d40: 72 20 2a 73 71 6c 69 74 65 33 53 74 72 44 75 70  r *sqlite3StrDup
4d50: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
4d60: 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20  .  char *zNew;. 
4d70: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
4d80: 72 6e 20 30 3b 0a 20 20 7a 4e 65 77 20 3d 20 73  rn 0;.  zNew = s
4d90: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28  qlite3MallocRaw(
4da0: 73 74 72 6c 65 6e 28 7a 29 2b 31 29 3b 0a 20 20  strlen(z)+1);.  
4db0: 69 66 28 20 7a 4e 65 77 20 29 20 73 74 72 63 70  if( zNew ) strcp
4dc0: 79 28 7a 4e 65 77 2c 20 7a 29 3b 0a 20 20 72 65  y(zNew, z);.  re
4dd0: 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 63 68 61  turn zNew;.}.cha
4de0: 72 20 2a 73 71 6c 69 74 65 33 53 74 72 4e 44 75  r *sqlite3StrNDu
4df0: 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  p(const char *z,
4e00: 20 69 6e 74 20 6e 29 7b 0a 20 20 63 68 61 72 20   int n){.  char 
4e10: 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d 3d  *zNew;.  if( z==
4e20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4e30: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61  zNew = sqlite3Ma
4e40: 6c 6c 6f 63 52 61 77 28 6e 2b 31 29 3b 0a 20 20  llocRaw(n+1);.  
4e50: 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20  if( zNew ){.    
4e60: 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20  memcpy(zNew, z, 
4e70: 6e 29 3b 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20  n);.    zNew[n] 
4e80: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4e90: 6e 20 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zNew;.}../*.**
4ea0: 20 43 72 65 61 74 65 20 61 20 73 74 72 69 6e 67   Create a string
4eb0: 20 66 72 6f 6d 20 74 68 65 20 32 6e 64 20 61 6e   from the 2nd an
4ec0: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  d subsequent arg
4ed0: 75 6d 65 6e 74 73 20 28 75 70 20 74 6f 20 74 68  uments (up to th
4ee0: 65 0a 2a 2a 20 66 69 72 73 74 20 4e 55 4c 4c 20  e.** first NULL 
4ef0: 61 72 67 75 6d 65 6e 74 29 2c 20 73 74 6f 72 65  argument), store
4f00: 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 6d   the string in m
4f10: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4f20: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 4d 61 6c  rom.** sqliteMal
4f30: 6c 6f 63 28 29 20 61 6e 64 20 6d 61 6b 65 20 74  loc() and make t
4f40: 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 64 69 63  he pointer indic
4f50: 61 74 65 64 20 62 79 20 74 68 65 20 31 73 74 20  ated by the 1st 
4f60: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e  argument.** poin
4f70: 74 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67  t to that string
4f80: 2e 20 20 54 68 65 20 31 73 74 20 61 72 67 75 6d  .  The 1st argum
4f90: 65 6e 74 20 6d 75 73 74 20 65 69 74 68 65 72 20  ent must either 
4fa0: 62 65 20 4e 55 4c 4c 20 6f 72 20 0a 2a 2a 20 70  be NULL or .** p
4fb0: 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  oint to memory o
4fc0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4fd0: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  iteMalloc()..*/.
4fe0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 53  void sqlite3SetS
4ff0: 74 72 69 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c  tring(char **pz,
5000: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
5010: 20 61 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65   ap;.  int nByte
5020: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5030: 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75  z;.  char *zResu
5040: 6c 74 3b 0a 0a 20 20 69 66 28 20 70 7a 3d 3d 30  lt;..  if( pz==0
5050: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 42 79   ) return;.  nBy
5060: 74 65 20 3d 20 31 3b 0a 20 20 76 61 5f 73 74 61  te = 1;.  va_sta
5070: 72 74 28 61 70 2c 20 70 7a 29 3b 0a 20 20 77 68  rt(ap, pz);.  wh
5080: 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61 72 67  ile( (z = va_arg
5090: 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
50a0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79  ))!=0 ){.    nBy
50b0: 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b  te += strlen(z);
50c0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
50d0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
50e0: 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20 7a 52  *pz);.  *pz = zR
50f0: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 4d 61  esult = sqliteMa
5100: 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29  llocRaw( nByte )
5110: 3b 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74 3d  ;.  if( zResult=
5120: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5130: 3b 0a 20 20 7d 0a 20 20 2a 7a 52 65 73 75 6c 74  ;.  }.  *zResult
5140: 20 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61 72 74   = 0;.  va_start
5150: 28 61 70 2c 20 70 7a 29 3b 0a 20 20 77 68 69 6c  (ap, pz);.  whil
5160: 65 28 20 28 7a 20 3d 20 76 61 5f 61 72 67 28 61  e( (z = va_arg(a
5170: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  p, const char*))
5180: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70  !=0 ){.    strcp
5190: 79 28 7a 52 65 73 75 6c 74 2c 20 7a 29 3b 0a 20  y(zResult, z);. 
51a0: 20 20 20 7a 52 65 73 75 6c 74 20 2b 3d 20 73 74     zResult += st
51b0: 72 6c 65 6e 28 7a 52 65 73 75 6c 74 29 3b 0a 20  rlen(zResult);. 
51c0: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
51d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
51e0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
51f0: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
5200: 6f 72 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  or string for th
5210: 65 20 73 71 6c 69 74 65 0a 2a 2a 20 68 61 6e 64  e sqlite.** hand
5220: 6c 65 20 22 64 62 22 2e 20 54 68 65 20 65 72 72  le "db". The err
5230: 6f 72 20 63 6f 64 65 20 69 73 20 73 65 74 20 74  or code is set t
5240: 6f 20 22 65 72 72 5f 63 6f 64 65 22 2e 0a 2a 2a  o "err_code"..**
5250: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
5260: 20 4e 55 4c 4c 2c 20 73 74 72 69 6e 67 20 7a 46   NULL, string zF
5270: 6f 72 6d 61 74 20 73 70 65 63 69 66 69 65 73 20  ormat specifies 
5280: 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  the format of th
5290: 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74 72 69 6e  e.** error strin
52a0: 67 20 69 6e 20 74 68 65 20 73 74 79 6c 65 20 6f  g in the style o
52b0: 66 20 74 68 65 20 70 72 69 6e 74 66 20 66 75 6e  f the printf fun
52c0: 63 74 69 6f 6e 73 3a 20 54 68 65 20 66 6f 6c 6c  ctions: The foll
52d0: 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d 61 74 20  owing.** format 
52e0: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 61  characters are a
52f0: 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  llowed:.**.**   
5300: 20 20 20 25 73 20 20 20 20 20 20 49 6e 73 65 72     %s      Inser
5310: 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 20 20  t a string.**   
5320: 20 20 20 25 7a 20 20 20 20 20 20 41 20 73 74 72     %z      A str
5330: 69 6e 67 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ing that should 
5340: 62 65 20 66 72 65 65 64 20 61 66 74 65 72 20 75  be freed after u
5350: 73 65 0a 2a 2a 20 20 20 20 20 20 25 64 20 20 20  se.**      %d   
5360: 20 20 20 49 6e 73 65 72 74 20 61 6e 20 69 6e 74     Insert an int
5370: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 25 54 20  eger.**      %T 
5380: 20 20 20 20 20 49 6e 73 65 72 74 20 61 20 74 6f       Insert a to
5390: 6b 65 6e 0a 2a 2a 20 20 20 20 20 20 25 53 20 20  ken.**      %S  
53a0: 20 20 20 20 49 6e 73 65 72 74 20 74 68 65 20 66      Insert the f
53b0: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  irst element of 
53c0: 61 20 53 72 63 4c 69 73 74 0a 2a 2a 0a 2a 2a 20  a SrcList.**.** 
53d0: 7a 46 6f 72 6d 61 74 20 61 6e 64 20 61 6e 79 20  zFormat and any 
53e0: 73 74 72 69 6e 67 20 74 6f 6b 65 6e 73 20 74 68  string tokens th
53f0: 61 74 20 66 6f 6c 6c 6f 77 20 69 74 20 61 72 65  at follow it are
5400: 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 0a 2a   assumed to be.*
5410: 2a 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46  * encoded in UTF
5420: 2d 38 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 63 6c 65  -8..**.** To cle
5430: 61 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ar the most rece
5440: 6e 74 20 65 72 72 6f 72 20 66 6f 72 20 73 71 6c  nt error for sql
5450: 69 74 65 20 68 61 6e 64 6c 65 20 22 64 62 22 2c  ite handle "db",
5460: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 0a 2a 2a   sqlite3Error.**
5470: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
5480: 64 20 77 69 74 68 20 65 72 72 5f 63 6f 64 65 20  d with err_code 
5490: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
54a0: 20 61 6e 64 20 7a 46 6f 72 6d 61 74 20 73 65 74   and zFormat set
54b0: 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a  .** to NULL..*/.
54c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 72 72 6f  void sqlite3Erro
54d0: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  r(sqlite3 *db, i
54e0: 6e 74 20 65 72 72 5f 63 6f 64 65 2c 20 63 6f 6e  nt err_code, con
54f0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
5500: 2c 20 2e 2e 2e 29 7b 0a 20 20 69 66 28 20 64 62  , ...){.  if( db
5510: 20 26 26 20 28 64 62 2d 3e 70 45 72 72 20 7c 7c   && (db->pErr ||
5520: 20 28 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c   (db->pErr = sql
5530: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 29 29  ite3ValueNew()))
5540: 21 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 65  !=0 ){.    db->e
5550: 72 72 43 6f 64 65 20 3d 20 65 72 72 5f 63 6f 64  rrCode = err_cod
5560: 65 3b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d  e;.    if( zForm
5570: 61 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  at ){.      char
5580: 20 2a 7a 3b 0a 20 20 20 20 20 20 76 61 5f 6c 69   *z;.      va_li
5590: 73 74 20 61 70 3b 0a 20 20 20 20 20 20 76 61 5f  st ap;.      va_
55a0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
55b0: 74 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  t);.      z = sq
55c0: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46  lite3VMPrintf(zF
55d0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
55e0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
55f0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
5600: 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
5610: 20 2d 31 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 55   -1, z, SQLITE_U
5620: 54 46 38 2c 20 73 71 6c 69 74 65 33 46 72 65 65  TF8, sqlite3Free
5630: 58 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  X);.    }else{. 
5640: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
5650: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
5660: 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55  , 0, 0, SQLITE_U
5670: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
5680: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  IC);.    }.  }.}
5690: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65  ../*.** Add an e
56a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
56b0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
56c0: 61 6e 64 20 69 6e 63 72 65 6d 65 6e 74 20 70 50  and increment pP
56d0: 61 72 73 65 2d 3e 6e 45 72 72 2e 0a 2a 2a 20 54  arse->nErr..** T
56e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
56f0: 6d 61 74 74 69 6e 67 20 63 68 61 72 61 63 74 65  matting characte
5700: 72 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 3a 0a  rs are allowed:.
5710: 2a 2a 0a 2a 2a 20 20 20 20 20 20 25 73 20 20 20  **.**      %s   
5720: 20 20 20 49 6e 73 65 72 74 20 61 20 73 74 72 69     Insert a stri
5730: 6e 67 0a 2a 2a 20 20 20 20 20 20 25 7a 20 20 20  ng.**      %z   
5740: 20 20 20 41 20 73 74 72 69 6e 67 20 74 68 61 74     A string that
5750: 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64   should be freed
5760: 20 61 66 74 65 72 20 75 73 65 0a 2a 2a 20 20 20   after use.**   
5770: 20 20 20 25 64 20 20 20 20 20 20 49 6e 73 65 72     %d      Inser
5780: 74 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20  t an integer.** 
5790: 20 20 20 20 20 25 54 20 20 20 20 20 20 49 6e 73       %T      Ins
57a0: 65 72 74 20 61 20 74 6f 6b 65 6e 0a 2a 2a 20 20  ert a token.**  
57b0: 20 20 20 20 25 53 20 20 20 20 20 20 49 6e 73 65      %S      Inse
57c0: 72 74 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  rt the first ele
57d0: 6d 65 6e 74 20 6f 66 20 61 20 53 72 63 4c 69 73  ment of a SrcLis
57e0: 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  t.**.** This fun
57f0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
5800: 75 73 65 64 20 74 6f 20 72 65 70 6f 72 74 20 61  used to report a
5810: 6e 79 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  ny error that oc
5820: 63 75 72 73 20 77 68 69 6c 73 74 0a 2a 2a 20 63  curs whilst.** c
5830: 6f 6d 70 69 6c 69 6e 67 20 61 6e 20 53 51 4c 20  ompiling an SQL 
5840: 73 74 61 74 65 6d 65 6e 74 20 28 69 2e 65 2e 20  statement (i.e. 
5850: 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 70  within sqlite3_p
5860: 72 65 70 61 72 65 28 29 29 2e 20 54 68 65 0a 2a  repare()). The.*
5870: 2a 20 6c 61 73 74 20 74 68 69 6e 67 20 74 68 65  * last thing the
5880: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
5890: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  () function does
58a0: 20 69 73 20 63 6f 70 79 20 74 68 65 20 65 72 72   is copy the err
58b0: 6f 72 0a 2a 2a 20 73 74 6f 72 65 64 20 62 79 20  or.** stored by 
58c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
58d0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
58e0: 68 61 6e 64 6c 65 20 75 73 69 6e 67 20 73 71 6c  handle using sql
58f0: 69 74 65 33 45 72 72 6f 72 28 29 2e 0a 2a 2a 20  ite3Error()..** 
5900: 46 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33  Function sqlite3
5910: 45 72 72 6f 72 28 29 20 73 68 6f 75 6c 64 20 62  Error() should b
5920: 65 20 75 73 65 64 20 64 75 72 69 6e 67 20 73 74  e used during st
5930: 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 69 6f  atement executio
5940: 6e 0a 2a 2a 20 28 73 71 6c 69 74 65 33 5f 73 74  n.** (sqlite3_st
5950: 65 70 28 29 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76  ep() etc.)..*/.v
5960: 6f 69 64 20 73 71 6c 69 74 65 33 45 72 72 6f 72  oid sqlite3Error
5970: 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Msg(Parse *pPars
5980: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
5990: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
59a0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 70 50  va_list ap;.  pP
59b0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
59c0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 72 73  sqliteFree(pPars
59d0: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  e->zErrMsg);.  v
59e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
59f0: 6d 61 74 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  mat);.  pParse->
5a00: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
5a10: 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61  3VMPrintf(zForma
5a20: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
5a30: 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  (ap);.}../*.** C
5a40: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 6d  lear the error m
5a50: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
5a60: 2c 20 69 66 20 61 6e 79 0a 2a 2f 0a 76 6f 69 64  , if any.*/.void
5a70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65   sqlite3ErrorCle
5a80: 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
5a90: 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
5aa0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29  pParse->zErrMsg)
5ab0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  ;.  pParse->zErr
5ac0: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Msg = 0;.  pPars
5ad0: 65 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 7d 0a 0a  e->nErr = 0;.}..
5ae0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
5af0: 20 53 51 4c 2d 73 74 79 6c 65 20 71 75 6f 74 65   SQL-style quote
5b00: 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  d string into a 
5b10: 6e 6f 72 6d 61 6c 20 73 74 72 69 6e 67 20 62 79  normal string by
5b20: 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20 74 68 65   removing.** the
5b30: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
5b40: 73 2e 20 20 54 68 65 20 63 6f 6e 76 65 72 73 69  s.  The conversi
5b50: 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70 6c  on is done in-pl
5b60: 61 63 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ace.  If the.** 
5b70: 69 6e 70 75 74 20 64 6f 65 73 20 6e 6f 74 20 62  input does not b
5b80: 65 67 69 6e 20 77 69 74 68 20 61 20 71 75 6f 74  egin with a quot
5b90: 65 20 63 68 61 72 61 63 74 65 72 2c 20 74 68 65  e character, the
5ba0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
5bb0: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  * is a no-op..**
5bc0: 0a 2a 2a 20 32 30 30 32 2d 46 65 62 2d 31 34 3a  .** 2002-Feb-14:
5bd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5be0: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65 6d   extended to rem
5bf0: 6f 76 65 20 4d 53 2d 41 63 63 65 73 73 20 73 74  ove MS-Access st
5c00: 79 6c 65 0a 2a 2a 20 62 72 61 63 6b 65 74 73 20  yle.** brackets 
5c10: 66 72 6f 6d 20 61 72 6f 75 6e 64 20 69 64 65 6e  from around iden
5c20: 74 69 66 65 72 73 2e 20 20 46 6f 72 20 65 78 61  tifers.  For exa
5c30: 6d 70 6c 65 3a 20 20 22 5b 61 2d 62 2d 63 5d 22  mple:  "[a-b-c]"
5c40: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 22 61 2d 62   becomes.** "a-b
5c50: 2d 63 22 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  -c"..*/.void sql
5c60: 69 74 65 33 44 65 71 75 6f 74 65 28 63 68 61 72  ite3Dequote(char
5c70: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 71 75 6f 74   *z){.  int quot
5c80: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
5c90: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
5ca0: 72 6e 3b 0a 20 20 71 75 6f 74 65 20 3d 20 7a 5b  rn;.  quote = z[
5cb0: 30 5d 3b 0a 20 20 73 77 69 74 63 68 28 20 71 75  0];.  switch( qu
5cc0: 6f 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ote ){.    case 
5cd0: 27 5c 27 27 3a 20 20 62 72 65 61 6b 3b 0a 20 20  '\'':  break;.  
5ce0: 20 20 63 61 73 65 20 27 22 27 3a 20 20 20 62 72    case '"':   br
5cf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 60  eak;.    case '`
5d00: 27 3a 20 20 20 62 72 65 61 6b 3b 20 20 20 20 20  ':   break;     
5d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
5d20: 72 20 4d 79 53 51 4c 20 63 6f 6d 70 61 74 69 62  r MySQL compatib
5d30: 69 6c 69 74 79 20 2a 2f 0a 20 20 20 20 63 61 73  ility */.    cas
5d40: 65 20 27 5b 27 3a 20 20 20 71 75 6f 74 65 20 3d  e '[':   quote =
5d50: 20 27 5d 27 3b 20 20 62 72 65 61 6b 3b 20 20 2f   ']';  break;  /
5d60: 2a 20 46 6f 72 20 4d 53 20 53 71 6c 53 65 72 76  * For MS SqlServ
5d70: 65 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  er compatibility
5d80: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
5d90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5da0: 20 20 66 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b 20    for(i=1, j=0; 
5db0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
5dc0: 69 66 28 20 7a 5b 69 5d 3d 3d 71 75 6f 74 65 20  if( z[i]==quote 
5dd0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
5de0: 2b 31 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20  +1]==quote ){.  
5df0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 71        z[j++] = q
5e00: 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 69 2b  uote;.        i+
5e10: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
5e20: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
5e30: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
5e40: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5e50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 6a 2b  else{.      z[j+
5e60: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 7d  +] = z[i];.    }
5e70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41 6e 20 61 72  .  }.}../* An ar
5e80: 72 61 79 20 74 6f 20 6d 61 70 20 61 6c 6c 20 75  ray to map all u
5e90: 70 70 65 72 2d 63 61 73 65 20 63 68 61 72 61 63  pper-case charac
5ea0: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 69 72 20  ters into their 
5eb0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
5ec0: 20 6c 6f 77 65 72 2d 63 61 73 65 20 63 68 61 72   lower-case char
5ed0: 61 63 74 65 72 2e 20 0a 2a 2f 0a 63 6f 6e 73 74  acter. .*/.const
5ee0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
5ef0: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
5f00: 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30  er[] = {.      0
5f10: 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
5f20: 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 38  ,  5,  6,  7,  8
5f30: 2c 20 20 39 2c 20 31 30 2c 20 31 31 2c 20 31 32  ,  9, 10, 11, 12
5f40: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
5f50: 2c 20 31 37 2c 0a 20 20 20 20 20 31 38 2c 20 31  , 17,.     18, 1
5f60: 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 20 32  9, 20, 21, 22, 2
5f70: 33 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c 20 32  3, 24, 25, 26, 2
5f80: 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33  7, 28, 29, 30, 3
5f90: 31 2c 20 33 32 2c 20 33 33 2c 20 33 34 2c 20 33  1, 32, 33, 34, 3
5fa0: 35 2c 0a 20 20 20 20 20 33 36 2c 20 33 37 2c 20  5,.     36, 37, 
5fb0: 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c 20  38, 39, 40, 41, 
5fc0: 34 32 2c 20 34 33 2c 20 34 34 2c 20 34 35 2c 20  42, 43, 44, 45, 
5fd0: 34 36 2c 20 34 37 2c 20 34 38 2c 20 34 39 2c 20  46, 47, 48, 49, 
5fe0: 35 30 2c 20 35 31 2c 20 35 32 2c 20 35 33 2c 0a  50, 51, 52, 53,.
5ff0: 20 20 20 20 20 35 34 2c 20 35 35 2c 20 35 36 2c       54, 55, 56,
6000: 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 36 30 2c   57, 58, 59, 60,
6010: 20 36 31 2c 20 36 32 2c 20 36 33 2c 20 36 34 2c   61, 62, 63, 64,
6020: 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c   97, 98, 99,100,
6030: 31 30 31 2c 31 30 32 2c 31 30 33 2c 0a 20 20 20  101,102,103,.   
6040: 20 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30 37   104,105,106,107
6050: 2c 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31  ,108,109,110,111
6060: 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 35  ,112,113,114,115
6070: 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 39  ,116,117,118,119
6080: 2c 31 32 30 2c 31 32 31 2c 0a 20 20 20 20 31 32  ,120,121,.    12
6090: 32 2c 20 39 31 2c 20 39 32 2c 20 39 33 2c 20 39  2, 91, 92, 93, 9
60a0: 34 2c 20 39 35 2c 20 39 36 2c 20 39 37 2c 20 39  4, 95, 96, 97, 9
60b0: 38 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c 31 30  8, 99,100,101,10
60c0: 32 2c 31 30 33 2c 31 30 34 2c 31 30 35 2c 31 30  2,103,104,105,10
60d0: 36 2c 31 30 37 2c 0a 20 20 20 20 31 30 38 2c 31  6,107,.    108,1
60e0: 30 39 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c 31  09,110,111,112,1
60f0: 31 33 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c 31  13,114,115,116,1
6100: 31 37 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c 31  17,118,119,120,1
6110: 32 31 2c 31 32 32 2c 31 32 33 2c 31 32 34 2c 31  21,122,123,124,1
6120: 32 35 2c 0a 20 20 20 20 31 32 36 2c 31 32 37 2c  25,.    126,127,
6130: 31 32 38 2c 31 32 39 2c 31 33 30 2c 31 33 31 2c  128,129,130,131,
6140: 31 33 32 2c 31 33 33 2c 31 33 34 2c 31 33 35 2c  132,133,134,135,
6150: 31 33 36 2c 31 33 37 2c 31 33 38 2c 31 33 39 2c  136,137,138,139,
6160: 31 34 30 2c 31 34 31 2c 31 34 32 2c 31 34 33 2c  140,141,142,143,
6170: 0a 20 20 20 20 31 34 34 2c 31 34 35 2c 31 34 36  .    144,145,146
6180: 2c 31 34 37 2c 31 34 38 2c 31 34 39 2c 31 35 30  ,147,148,149,150
6190: 2c 31 35 31 2c 31 35 32 2c 31 35 33 2c 31 35 34  ,151,152,153,154
61a0: 2c 31 35 35 2c 31 35 36 2c 31 35 37 2c 31 35 38  ,155,156,157,158
61b0: 2c 31 35 39 2c 31 36 30 2c 31 36 31 2c 0a 20 20  ,159,160,161,.  
61c0: 20 20 31 36 32 2c 31 36 33 2c 31 36 34 2c 31 36    162,163,164,16
61d0: 35 2c 31 36 36 2c 31 36 37 2c 31 36 38 2c 31 36  5,166,167,168,16
61e0: 39 2c 31 37 30 2c 31 37 31 2c 31 37 32 2c 31 37  9,170,171,172,17
61f0: 33 2c 31 37 34 2c 31 37 35 2c 31 37 36 2c 31 37  3,174,175,176,17
6200: 37 2c 31 37 38 2c 31 37 39 2c 0a 20 20 20 20 31  7,178,179,.    1
6210: 38 30 2c 31 38 31 2c 31 38 32 2c 31 38 33 2c 31  80,181,182,183,1
6220: 38 34 2c 31 38 35 2c 31 38 36 2c 31 38 37 2c 31  84,185,186,187,1
6230: 38 38 2c 31 38 39 2c 31 39 30 2c 31 39 31 2c 31  88,189,190,191,1
6240: 39 32 2c 31 39 33 2c 31 39 34 2c 31 39 35 2c 31  92,193,194,195,1
6250: 39 36 2c 31 39 37 2c 0a 20 20 20 20 31 39 38 2c  96,197,.    198,
6260: 31 39 39 2c 32 30 30 2c 32 30 31 2c 32 30 32 2c  199,200,201,202,
6270: 32 30 33 2c 32 30 34 2c 32 30 35 2c 32 30 36 2c  203,204,205,206,
6280: 32 30 37 2c 32 30 38 2c 32 30 39 2c 32 31 30 2c  207,208,209,210,
6290: 32 31 31 2c 32 31 32 2c 32 31 33 2c 32 31 34 2c  211,212,213,214,
62a0: 32 31 35 2c 0a 20 20 20 20 32 31 36 2c 32 31 37  215,.    216,217
62b0: 2c 32 31 38 2c 32 31 39 2c 32 32 30 2c 32 32 31  ,218,219,220,221
62c0: 2c 32 32 32 2c 32 32 33 2c 32 32 34 2c 32 32 35  ,222,223,224,225
62d0: 2c 32 32 36 2c 32 32 37 2c 32 32 38 2c 32 32 39  ,226,227,228,229
62e0: 2c 32 33 30 2c 32 33 31 2c 32 33 32 2c 32 33 33  ,230,231,232,233
62f0: 2c 0a 20 20 20 20 32 33 34 2c 32 33 35 2c 32 33  ,.    234,235,23
6300: 36 2c 32 33 37 2c 32 33 38 2c 32 33 39 2c 32 34  6,237,238,239,24
6310: 30 2c 32 34 31 2c 32 34 32 2c 32 34 33 2c 32 34  0,241,242,243,24
6320: 34 2c 32 34 35 2c 32 34 36 2c 32 34 37 2c 32 34  4,245,246,247,24
6330: 38 2c 32 34 39 2c 32 35 30 2c 32 35 31 2c 0a 20  8,249,250,251,. 
6340: 20 20 20 32 35 32 2c 32 35 33 2c 32 35 34 2c 32     252,253,254,2
6350: 35 35 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 55 70  55.};.#define Up
6360: 70 65 72 54 6f 4c 6f 77 65 72 20 73 71 6c 69 74  perToLower sqlit
6370: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 0a 0a  e3UpperToLower..
6380: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 73 79 73 74 65  /*.** Some syste
6390: 6d 73 20 68 61 76 65 20 73 74 72 69 63 6d 70 28  ms have stricmp(
63a0: 29 2e 20 20 4f 74 68 65 72 73 20 68 61 76 65 20  ).  Others have 
63b0: 73 74 72 63 61 73 65 63 6d 70 28 29 2e 20 20 42  strcasecmp().  B
63c0: 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 72 65 20  ecause.** there 
63d0: 69 73 20 6e 6f 20 63 6f 6e 73 69 73 74 65 6e 63  is no consistenc
63e0: 79 2c 20 77 65 20 77 69 6c 6c 20 64 65 66 69 6e  y, we will defin
63f0: 65 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 69 6e  e our own..*/.in
6400: 74 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  t sqlite3StrICmp
6410: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65  (const char *zLe
6420: 66 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ft, const char *
6430: 7a 52 69 67 68 74 29 7b 0a 20 20 72 65 67 69 73  zRight){.  regis
6440: 74 65 72 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ter unsigned cha
6450: 72 20 2a 61 2c 20 2a 62 3b 0a 20 20 61 20 3d 20  r *a, *b;.  a = 
6460: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
6470: 29 7a 4c 65 66 74 3b 0a 20 20 62 20 3d 20 28 75  )zLeft;.  b = (u
6480: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a  nsigned char *)z
6490: 52 69 67 68 74 3b 0a 20 20 77 68 69 6c 65 28 20  Right;.  while( 
64a0: 2a 61 21 3d 30 20 26 26 20 55 70 70 65 72 54 6f  *a!=0 && UpperTo
64b0: 4c 6f 77 65 72 5b 2a 61 5d 3d 3d 55 70 70 65 72  Lower[*a]==Upper
64c0: 54 6f 4c 6f 77 65 72 5b 2a 62 5d 29 7b 20 61 2b  ToLower[*b]){ a+
64d0: 2b 3b 20 62 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  +; b++; }.  retu
64e0: 72 6e 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  rn UpperToLower[
64f0: 2a 61 5d 20 2d 20 55 70 70 65 72 54 6f 4c 6f 77  *a] - UpperToLow
6500: 65 72 5b 2a 62 5d 3b 0a 7d 0a 69 6e 74 20 73 71  er[*b];.}.int sq
6510: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 63 6f  lite3StrNICmp(co
6520: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c  nst char *zLeft,
6530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 69   const char *zRi
6540: 67 68 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72  ght, int N){.  r
6550: 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64  egister unsigned
6560: 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20   char *a, *b;.  
6570: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
6580: 61 72 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20  ar *)zLeft;.  b 
6590: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
65a0: 20 2a 29 7a 52 69 67 68 74 3b 0a 20 20 77 68 69   *)zRight;.  whi
65b0: 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 2a  le( N-- > 0 && *
65c0: 61 21 3d 30 20 26 26 20 55 70 70 65 72 54 6f 4c  a!=0 && UpperToL
65d0: 6f 77 65 72 5b 2a 61 5d 3d 3d 55 70 70 65 72 54  ower[*a]==UpperT
65e0: 6f 4c 6f 77 65 72 5b 2a 62 5d 29 7b 20 61 2b 2b  oLower[*b]){ a++
65f0: 3b 20 62 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72  ; b++; }.  retur
6600: 6e 20 4e 3c 30 20 3f 20 30 20 3a 20 55 70 70 65  n N<0 ? 0 : Uppe
6610: 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 20 2d 20 55  rToLower[*a] - U
6620: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d 3b  pperToLower[*b];
6630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6640: 20 54 52 55 45 20 69 66 20 7a 20 69 73 20 61 20   TRUE if z is a 
6650: 70 75 72 65 20 6e 75 6d 65 72 69 63 20 73 74 72  pure numeric str
6660: 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ing.  Return FAL
6670: 53 45 20 69 66 20 74 68 65 0a 2a 2a 20 73 74 72  SE if the.** str
6680: 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ing contains any
6690: 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68   character which
66a0: 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
66b0: 61 20 6e 75 6d 62 65 72 2e 20 49 66 0a 2a 2a 20  a number. If.** 
66c0: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e 75  the string is nu
66d0: 6d 65 72 69 63 20 61 6e 64 20 63 6f 6e 74 61 69  meric and contai
66e0: 6e 73 20 74 68 65 20 27 2e 27 20 63 68 61 72 61  ns the '.' chara
66f0: 63 74 65 72 2c 20 73 65 74 20 2a 72 65 61 6c 6e  cter, set *realn
6700: 75 6d 0a 2a 2a 20 74 6f 20 54 52 55 45 20 28 6f  um.** to TRUE (o
6710: 74 68 65 72 77 69 73 65 20 46 41 4c 53 45 29 2e  therwise FALSE).
6720: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20  .**.** An empty 
6730: 73 74 72 69 6e 67 20 69 73 20 63 6f 6e 73 69 64  string is consid
6740: 65 72 65 64 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63  ered non-numeric
6750: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6760: 49 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20 63  IsNumber(const c
6770: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61  har *z, int *rea
6780: 6c 6e 75 6d 2c 20 75 38 20 65 6e 63 29 7b 0a 20  lnum, u8 enc){. 
6790: 20 69 6e 74 20 69 6e 63 72 20 3d 20 28 65 6e 63   int incr = (enc
67a0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 3f 31 3a  ==SQLITE_UTF8?1:
67b0: 32 29 3b 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53  2);.  if( enc==S
67c0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 20  QLITE_UTF16BE ) 
67d0: 7a 2b 2b 3b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  z++;.  if( *z=='
67e0: 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20  -' || *z=='+' ) 
67f0: 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 69 66 28  z += incr;.  if(
6800: 20 21 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29   !isdigit(*(u8*)
6810: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
6820: 20 30 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 69   0;.  }.  z += i
6830: 6e 63 72 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e  ncr;.  if( realn
6840: 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20  um ) *realnum = 
6850: 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 64 69  0;.  while( isdi
6860: 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b 20  git(*(u8*)z) ){ 
6870: 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a 20 20 69  z += incr; }.  i
6880: 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20  f( *z=='.' ){.  
6890: 20 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 20    z += incr;.   
68a0: 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 28   if( !isdigit(*(
68b0: 75 38 2a 29 7a 29 20 29 20 72 65 74 75 72 6e 20  u8*)z) ) return 
68c0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  0;.    while( is
68d0: 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29  digit(*(u8*)z) )
68e0: 7b 20 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a 20  { z += incr; }. 
68f0: 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29     if( realnum )
6900: 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20   *realnum = 1;. 
6910: 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27   }.  if( *z=='e'
6920: 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20   || *z=='E' ){. 
6930: 20 20 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20     z += incr;.  
6940: 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c    if( *z=='+' ||
6950: 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 20 2b 3d 20   *z=='-' ) z += 
6960: 69 6e 63 72 3b 0a 20 20 20 20 69 66 28 20 21 69  incr;.    if( !i
6970: 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20  sdigit(*(u8*)z) 
6980: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6990: 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a  while( isdigit(*
69a0: 28 75 38 2a 29 7a 29 20 29 7b 20 7a 20 2b 3d 20  (u8*)z) ){ z += 
69b0: 69 6e 63 72 3b 20 7d 0a 20 20 20 20 69 66 28 20  incr; }.    if( 
69c0: 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e  realnum ) *realn
69d0: 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  um = 1;.  }.  re
69e0: 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f  turn *z==0;.}../
69f0: 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20  *.** The string 
6a00: 7a 5b 5d 20 69 73 20 61 6e 20 61 73 63 69 69 20  z[] is an ascii 
6a10: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
6a20: 66 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72 2e  f a real number.
6a30: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 69 73  .** Convert this
6a40: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 64 6f 75   string to a dou
6a50: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
6a60: 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
6a70: 74 68 61 74 20 7a 5b 5d 20 72 65 61 6c 6c 79 20  that z[] really 
6a80: 69 73 20 61 20 76 61 6c 69 64 20 6e 75 6d 62 65  is a valid numbe
6a90: 72 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73 20  r.  If it.** is 
6aa0: 6e 6f 74 2c 20 74 68 65 20 72 65 73 75 6c 74 20  not, the result 
6ab0: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a  is undefined..**
6ac0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6ad0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
6ae0: 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   of the library 
6af0: 61 74 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  atof() function 
6b00: 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 6c  because.** the l
6b10: 69 62 72 61 72 79 20 61 74 6f 66 28 29 20 6d 69  ibrary atof() mi
6b20: 67 68 74 20 77 61 6e 74 20 74 6f 20 75 73 65 20  ght want to use 
6b30: 22 2c 22 20 61 73 20 74 68 65 20 64 65 63 69 6d  "," as the decim
6b40: 61 6c 20 70 6f 69 6e 74 20 69 6e 73 74 65 61 64  al point instead
6b50: 0a 2a 2a 20 6f 66 20 22 2e 22 20 64 65 70 65 6e  .** of "." depen
6b60: 64 69 6e 67 20 6f 6e 20 68 6f 77 20 6c 6f 63 61  ding on how loca
6b70: 6c 65 20 69 73 20 73 65 74 2e 20 20 42 75 74 20  le is set.  But 
6b80: 74 68 61 74 20 77 6f 75 6c 64 20 63 61 75 73 65  that would cause
6b90: 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a 20 66 6f 72   problems.** for
6ba0: 20 53 51 4c 2e 20 20 53 6f 20 74 68 69 73 20 72   SQL.  So this r
6bb0: 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 75 73  outine always us
6bc0: 65 73 20 22 2e 22 20 72 65 67 61 72 64 6c 65 73  es "." regardles
6bd0: 73 20 6f 66 20 6c 6f 63 61 6c 65 2e 0a 2a 2f 0a  s of locale..*/.
6be0: 69 6e 74 20 73 71 6c 69 74 65 33 41 74 6f 46 28  int sqlite3AtoF(
6bf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 64  const char *z, d
6c00: 6f 75 62 6c 65 20 2a 70 52 65 73 75 6c 74 29 7b  ouble *pResult){
6c10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6c20: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
6c30: 49 4e 54 0a 20 20 69 6e 74 20 73 69 67 6e 20 3d  INT.  int sign =
6c40: 20 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   1;.  const char
6c50: 20 2a 7a 42 65 67 69 6e 20 3d 20 7a 3b 0a 20 20   *zBegin = z;.  
6c60: 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20  LONGDOUBLE_TYPE 
6c70: 76 31 20 3d 20 30 2e 30 3b 0a 20 20 69 66 28 20  v1 = 0.0;.  if( 
6c80: 2a 7a 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 73  *z=='-' ){.    s
6c90: 69 67 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7a 2b  ign = -1;.    z+
6ca0: 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  +;.  }else if( *
6cb0: 7a 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 2b  z=='+' ){.    z+
6cc0: 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  +;.  }.  while( 
6cd0: 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29  isdigit(*(u8*)z)
6ce0: 20 29 7b 0a 20 20 20 20 76 31 20 3d 20 76 31 2a   ){.    v1 = v1*
6cf0: 31 30 2e 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27  10.0 + (*z - '0'
6d00: 29 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a  );.    z++;.  }.
6d10: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
6d20: 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
6d30: 54 59 50 45 20 64 69 76 69 73 6f 72 20 3d 20 31  TYPE divisor = 1
6d40: 2e 30 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  .0;.    z++;.   
6d50: 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28   while( isdigit(
6d60: 2a 28 75 38 2a 29 7a 29 20 29 7b 0a 20 20 20 20  *(u8*)z) ){.    
6d70: 20 20 76 31 20 3d 20 76 31 2a 31 30 2e 30 20 2b    v1 = v1*10.0 +
6d80: 20 28 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20 20   (*z - '0');.   
6d90: 20 20 20 64 69 76 69 73 6f 72 20 2a 3d 20 31 30     divisor *= 10
6da0: 2e 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20  .0;.      z++;. 
6db0: 20 20 20 7d 0a 20 20 20 20 76 31 20 2f 3d 20 64     }.    v1 /= d
6dc0: 69 76 69 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  ivisor;.  }.  if
6dd0: 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d  ( *z=='e' || *z=
6de0: 3d 27 45 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='E' ){.    int 
6df0: 65 73 69 67 6e 20 3d 20 31 3b 0a 20 20 20 20 69  esign = 1;.    i
6e00: 6e 74 20 65 76 61 6c 20 3d 20 30 3b 0a 20 20 20  nt eval = 0;.   
6e10: 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45   LONGDOUBLE_TYPE
6e20: 20 73 63 61 6c 65 20 3d 20 31 2e 30 3b 0a 20 20   scale = 1.0;.  
6e30: 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a    z++;.    if( *
6e40: 7a 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  z=='-' ){.      
6e50: 65 73 69 67 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  esign = -1;.    
6e60: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65    z++;.    }else
6e70: 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a   if( *z=='+' ){.
6e80: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d        z++;.    }
6e90: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69  .    while( isdi
6ea0: 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b 0a  git(*(u8*)z) ){.
6eb0: 20 20 20 20 20 20 65 76 61 6c 20 3d 20 65 76 61        eval = eva
6ec0: 6c 2a 31 30 20 2b 20 2a 7a 20 2d 20 27 30 27 3b  l*10 + *z - '0';
6ed0: 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  .      z++;.    
6ee0: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 65 76 61  }.    while( eva
6ef0: 6c 3e 3d 36 34 20 29 7b 20 73 63 61 6c 65 20 2a  l>=64 ){ scale *
6f00: 3d 20 31 2e 30 65 2b 36 34 3b 20 65 76 61 6c 20  = 1.0e+64; eval 
6f10: 2d 3d 20 36 34 3b 20 7d 0a 20 20 20 20 77 68 69  -= 64; }.    whi
6f20: 6c 65 28 20 65 76 61 6c 3e 3d 31 36 20 29 7b 20  le( eval>=16 ){ 
6f30: 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 31 36  scale *= 1.0e+16
6f40: 3b 20 65 76 61 6c 20 2d 3d 20 31 36 3b 20 7d 0a  ; eval -= 16; }.
6f50: 20 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e      while( eval>
6f60: 3d 34 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31  =4 ){ scale *= 1
6f70: 2e 30 65 2b 34 3b 20 65 76 61 6c 20 2d 3d 20 34  .0e+4; eval -= 4
6f80: 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 65  ; }.    while( e
6f90: 76 61 6c 3e 3d 31 20 29 7b 20 73 63 61 6c 65 20  val>=1 ){ scale 
6fa0: 2a 3d 20 31 2e 30 65 2b 31 3b 20 65 76 61 6c 20  *= 1.0e+1; eval 
6fb0: 2d 3d 20 31 3b 20 7d 0a 20 20 20 20 69 66 28 20  -= 1; }.    if( 
6fc0: 65 73 69 67 6e 3c 30 20 29 7b 0a 20 20 20 20 20  esign<0 ){.     
6fd0: 20 76 31 20 2f 3d 20 73 63 61 6c 65 3b 0a 20 20   v1 /= scale;.  
6fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
6ff0: 31 20 2a 3d 20 73 63 61 6c 65 3b 0a 20 20 20 20  1 *= scale;.    
7000: 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 75 6c 74  }.  }.  *pResult
7010: 20 3d 20 73 69 67 6e 3c 30 20 3f 20 2d 76 31 20   = sign<0 ? -v1 
7020: 3a 20 76 31 3b 0a 20 20 72 65 74 75 72 6e 20 7a  : v1;.  return z
7030: 20 2d 20 7a 42 65 67 69 6e 3b 0a 23 65 6c 73 65   - zBegin;.#else
7040: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
7050: 33 61 74 6f 69 36 34 28 7a 2c 20 70 52 65 73 75  3atoi64(z, pResu
7060: 6c 74 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  lt);.#endif /* S
7070: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
7080: 49 4e 47 5f 50 4f 49 4e 54 20 2a 2f 0a 7d 0a 0a  ING_POINT */.}..
7090: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
70a0: 45 20 69 66 20 7a 4e 75 6d 20 69 73 20 61 20 36  E if zNum is a 6
70b0: 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
70c0: 65 67 65 72 20 61 6e 64 20 77 72 69 74 65 0a 2a  eger and write.*
70d0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
70e0: 68 65 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  he integer into 
70f0: 2a 70 4e 75 6d 2e 20 20 49 66 20 7a 4e 75 6d 20  *pNum.  If zNum 
7100: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
7110: 72 0a 2a 2a 20 6f 72 20 69 73 20 61 6e 20 69 6e  r.** or is an in
7120: 74 65 67 65 72 20 74 68 61 74 20 69 73 20 74 6f  teger that is to
7130: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 65 78  o large to be ex
7140: 70 72 65 73 73 65 64 20 77 69 74 68 20 36 34 20  pressed with 64 
7150: 62 69 74 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  bits,.** then re
7160: 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 49 66 20  turn false.  If 
7170: 6e 3e 30 20 61 6e 64 20 74 68 65 20 69 6e 74 65  n>0 and the inte
7180: 67 65 72 20 69 73 20 73 74 72 69 6e 67 20 69 73  ger is string is
7190: 20 6e 6f 74 0a 2a 2a 20 65 78 61 63 74 6c 79 20   not.** exactly 
71a0: 6e 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 72 65  n bytes long, re
71b0: 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  turn false..**.*
71c0: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
71d0: 69 6e 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ine was original
71e0: 6c 79 20 77 72 69 74 74 65 6e 20 69 74 20 64 65  ly written it de
71f0: 61 6c 74 20 77 69 74 68 20 6f 6e 6c 79 0a 2a 2a  alt with only.**
7200: 20 33 32 2d 62 69 74 20 6e 75 6d 62 65 72 73 2e   32-bit numbers.
7210: 20 20 41 74 20 74 68 61 74 20 74 69 6d 65 2c 20    At that time, 
7220: 69 74 20 77 61 73 20 6d 75 63 68 20 66 61 73 74  it was much fast
7230: 65 72 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 61  er than the.** a
7240: 74 6f 69 28 29 20 6c 69 62 72 61 72 79 20 72 6f  toi() library ro
7250: 75 74 69 6e 65 20 69 6e 20 52 65 64 48 61 74 20  utine in RedHat 
7260: 37 2e 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  7.2..*/.int sqli
7270: 74 65 33 61 74 6f 69 36 34 28 63 6f 6e 73 74 20  te3atoi64(const 
7280: 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36 34 20  char *zNum, i64 
7290: 2a 70 4e 75 6d 29 7b 0a 20 20 69 36 34 20 76 20  *pNum){.  i64 v 
72a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 65 67 3b 0a  = 0;.  int neg;.
72b0: 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20 69 66    int i, c;.  if
72c0: 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 29 7b 0a  ( *zNum=='-' ){.
72d0: 20 20 20 20 6e 65 67 20 3d 20 31 3b 0a 20 20 20      neg = 1;.   
72e0: 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 7d 65 6c 73 65   zNum++;.  }else
72f0: 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20   if( *zNum=='+' 
7300: 29 7b 0a 20 20 20 20 6e 65 67 20 3d 20 30 3b 0a  ){.    neg = 0;.
7310: 20 20 20 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 7d 65      zNum++;.  }e
7320: 6c 73 65 7b 0a 20 20 20 20 6e 65 67 20 3d 20 30  lse{.    neg = 0
7330: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
7340: 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d 27 30   (c=zNum[i])>='0
7350: 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69 2b 2b  ' && c<='9'; i++
7360: 29 7b 0a 20 20 20 20 76 20 3d 20 76 2a 31 30 20  ){.    v = v*10 
7370: 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 7d 0a 20  + c - '0';.  }. 
7380: 20 2a 70 4e 75 6d 20 3d 20 6e 65 67 20 3f 20 2d   *pNum = neg ? -
7390: 76 20 3a 20 76 3b 0a 20 20 72 65 74 75 72 6e 20  v : v;.  return 
73a0: 63 3d 3d 30 20 26 26 20 69 3e 30 20 26 26 20 0a  c==0 && i>0 && .
73b0: 20 20 20 20 20 20 28 69 3c 31 39 20 7c 7c 20 28        (i<19 || (
73c0: 69 3d 3d 31 39 20 26 26 20 6d 65 6d 63 6d 70 28  i==19 && memcmp(
73d0: 7a 4e 75 6d 2c 22 39 32 32 33 33 37 32 30 33 36  zNum,"9223372036
73e0: 38 35 34 37 37 35 38 30 37 22 2c 31 39 29 3c 3d  854775807",19)<=
73f0: 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  0));.}../*.** Th
7400: 65 20 73 74 72 69 6e 67 20 7a 4e 75 6d 20 72 65  e string zNum re
7410: 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74 65  presents an inte
7420: 67 65 72 2e 20 20 54 68 65 72 65 20 6d 69 67 68  ger.  There migh
7430: 74 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a  t be some other.
7440: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
7450: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 69 6e 74  ollowing the int
7460: 65 67 65 72 20 74 6f 6f 2c 20 62 75 74 20 74 68  eger too, but th
7470: 61 74 20 70 61 72 74 20 69 73 20 69 67 6e 6f 72  at part is ignor
7480: 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ed..** If the in
7490: 74 65 67 65 72 20 74 68 61 74 20 74 68 65 20 70  teger that the p
74a0: 72 65 66 69 78 20 6f 66 20 7a 4e 75 6d 20 72 65  refix of zNum re
74b0: 70 72 65 73 65 6e 74 73 20 77 69 6c 6c 20 66 69  presents will fi
74c0: 74 20 69 6e 20 61 0a 2a 2a 20 33 32 2d 62 69 74  t in a.** 32-bit
74d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2c   signed integer,
74e0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 4f   return TRUE.  O
74f0: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
7500: 46 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FALSE..**.** Thi
7510: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
7520: 73 20 46 41 4c 53 45 20 66 6f 72 20 74 68 65 20  s FALSE for the 
7530: 73 74 72 69 6e 67 20 2d 32 31 34 37 34 38 33 36  string -21474836
7540: 34 38 20 65 76 65 6e 20 74 68 61 74 0a 2a 2a 20  48 even that.** 
7550: 74 68 61 74 20 6e 75 6d 62 65 72 20 77 69 6c 6c  that number will
7560: 20 69 6e 20 66 61 63 74 20 66 69 74 20 69 6e 20   in fact fit in 
7570: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
7580: 2e 20 20 42 75 74 20 70 6f 73 69 74 69 76 65 0a  .  But positive.
7590: 2a 2a 20 32 31 34 37 34 38 33 36 34 38 20 77 69  ** 2147483648 wi
75a0: 6c 6c 20 6e 6f 74 20 66 69 74 20 69 6e 20 33 32  ll not fit in 32
75b0: 20 62 69 74 73 2e 20 20 53 6f 20 69 74 20 73 65   bits.  So it se
75c0: 65 6d 73 20 73 61 66 65 72 20 74 6f 20 72 65 74  ems safer to ret
75d0: 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a 2f  urn.** false..*/
75e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
75f0: 74 65 33 46 69 74 73 49 6e 33 32 42 69 74 73 28  te3FitsIn32Bits(
7600: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d  const char *zNum
7610: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20  ){.  int i, c;. 
7620: 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20   if( *zNum=='-' 
7630: 7c 7c 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20 29 20  || *zNum=='+' ) 
7640: 7a 4e 75 6d 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  zNum++;.  for(i=
7650: 30 3b 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d  0; (c=zNum[i])>=
7660: 27 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69  '0' && c<='9'; i
7670: 2b 2b 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69  ++){}.  return i
7680: 3c 31 30 20 7c 7c 20 28 69 3d 3d 31 30 20 26 26  <10 || (i==10 &&
7690: 20 6d 65 6d 63 6d 70 28 7a 4e 75 6d 2c 22 32 31   memcmp(zNum,"21
76a0: 34 37 34 38 33 36 34 37 22 2c 31 30 29 3c 3d 30  47483647",10)<=0
76b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 7a  );.}../*.** If z
76c0: 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20 61  Num represents a
76d0: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 77  n integer that w
76e0: 69 6c 6c 20 66 69 74 20 69 6e 20 33 32 2d 62 69  ill fit in 32-bi
76f0: 74 73 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20  ts, then set.** 
7700: 2a 70 56 61 6c 75 65 20 74 6f 20 74 68 61 74 20  *pValue to that 
7710: 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74 75  integer and retu
7720: 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65 72 77  rn true.  Otherw
7730: 69 73 65 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ise return false
7740: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7750: 47 65 74 49 6e 74 33 32 28 63 6f 6e 73 74 20 63  GetInt32(const c
7760: 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 6e 74 20 2a  har *zNum, int *
7770: 70 56 61 6c 75 65 29 7b 0a 20 20 69 66 28 20 73  pValue){.  if( s
7780: 71 6c 69 74 65 33 46 69 74 73 49 6e 33 32 42 69  qlite3FitsIn32Bi
7790: 74 73 28 7a 4e 75 6d 29 20 29 7b 0a 20 20 20 20  ts(zNum) ){.    
77a0: 2a 70 56 61 6c 75 65 20 3d 20 61 74 6f 69 28 7a  *pValue = atoi(z
77b0: 4e 75 6d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Num);.    return
77c0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
77d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
77e0: 20 73 74 72 69 6e 67 20 7a 4e 75 6d 20 72 65 70   string zNum rep
77f0: 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74 65 67  resents an integ
7800: 65 72 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  er.  There might
7810: 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   be some other.*
7820: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  * information fo
7830: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 69 6e 74 65  llowing the inte
7840: 67 65 72 20 74 6f 6f 2c 20 62 75 74 20 74 68 61  ger too, but tha
7850: 74 20 70 61 72 74 20 69 73 20 69 67 6e 6f 72 65  t part is ignore
7860: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 74  d..** If the int
7870: 65 67 65 72 20 74 68 61 74 20 74 68 65 20 70 72  eger that the pr
7880: 65 66 69 78 20 6f 66 20 7a 4e 75 6d 20 72 65 70  efix of zNum rep
7890: 72 65 73 65 6e 74 73 20 77 69 6c 6c 20 66 69 74  resents will fit
78a0: 20 69 6e 20 61 0a 2a 2a 20 36 34 2d 62 69 74 20   in a.** 64-bit 
78b0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2c 20  signed integer, 
78c0: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 4f 74  return TRUE.  Ot
78d0: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 46  herwise return F
78e0: 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ALSE..**.** This
78f0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
7900: 20 46 41 4c 53 45 20 66 6f 72 20 74 68 65 20 73   FALSE for the s
7910: 74 72 69 6e 67 20 2d 39 32 32 33 33 37 32 30 33  tring -922337203
7920: 36 38 35 34 37 37 35 38 30 38 20 65 76 65 6e 20  6854775808 even 
7930: 74 68 61 74 0a 2a 2a 20 74 68 61 74 20 6e 75 6d  that.** that num
7940: 62 65 72 20 77 69 6c 6c 2c 20 69 6e 20 74 68 65  ber will, in the
7950: 6f 72 79 20 66 69 74 20 69 6e 20 61 20 36 34 2d  ory fit in a 64-
7960: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 50 6f  bit integer.  Po
7970: 73 69 74 69 76 65 0a 2a 2a 20 39 32 32 33 33 37  sitive.** 922337
7980: 33 30 33 36 38 35 34 37 37 35 38 30 38 20 77 69  3036854775808 wi
7990: 6c 6c 20 6e 6f 74 20 66 69 74 20 69 6e 20 36 34  ll not fit in 64
79a0: 20 62 69 74 73 2e 20 20 53 6f 20 69 74 20 73 65   bits.  So it se
79b0: 65 6d 73 20 73 61 66 65 72 20 74 6f 20 72 65 74  ems safer to ret
79c0: 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a 2f  urn.** false..*/
79d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 74 73  .int sqlite3Fits
79e0: 49 6e 36 34 42 69 74 73 28 63 6f 6e 73 74 20 63  In64Bits(const c
79f0: 68 61 72 20 2a 7a 4e 75 6d 29 7b 0a 20 20 69 6e  har *zNum){.  in
7a00: 74 20 69 2c 20 63 3b 0a 20 20 69 66 28 20 2a 7a  t i, c;.  if( *z
7a10: 4e 75 6d 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 4e 75  Num=='-' || *zNu
7a20: 6d 3d 3d 27 2b 27 20 29 20 7a 4e 75 6d 2b 2b 3b  m=='+' ) zNum++;
7a30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 3d 7a  .  for(i=0; (c=z
7a40: 4e 75 6d 5b 69 5d 29 3e 3d 27 30 27 20 26 26 20  Num[i])>='0' && 
7a50: 63 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20  c<='9'; i++){}. 
7a60: 20 72 65 74 75 72 6e 20 69 3c 31 39 20 7c 7c 20   return i<19 || 
7a70: 28 69 3d 3d 31 39 20 26 26 20 6d 65 6d 63 6d 70  (i==19 && memcmp
7a80: 28 7a 4e 75 6d 2c 22 39 32 32 33 33 37 32 30 33  (zNum,"922337203
7a90: 36 38 35 34 37 37 35 38 30 37 22 2c 31 39 29 3c  6854775807",19)<
7aa0: 3d 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  =0);.}.../*.** C
7ab0: 68 61 6e 67 65 20 74 68 65 20 73 71 6c 69 74 65  hange the sqlite
7ac0: 2e 6d 61 67 69 63 20 66 72 6f 6d 20 53 51 4c 49  .magic from SQLI
7ad0: 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 74 6f  TE_MAGIC_OPEN to
7ae0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
7af0: 53 59 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  SY..** Return an
7b00: 20 65 72 72 6f 72 20 28 6e 6f 6e 2d 7a 65 72 6f   error (non-zero
7b10: 29 20 69 66 20 74 68 65 20 6d 61 67 69 63 20 77  ) if the magic w
7b20: 61 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4d 41  as not SQLITE_MA
7b30: 47 49 43 5f 4f 50 45 4e 0a 2a 2a 20 77 68 65 6e  GIC_OPEN.** when
7b40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7b50: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
7b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
7b70: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   attempt to dete
7b80: 63 74 20 69 66 20 74 77 6f 20 74 68 72 65 61 64  ct if two thread
7b90: 73 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s use the.** sam
7ba0: 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65  e sqlite* pointe
7bb0: 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
7bc0: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  me.  There is a 
7bd0: 72 61 63 65 20 0a 2a 2a 20 63 6f 6e 64 69 74 69  race .** conditi
7be0: 6f 6e 20 73 6f 20 69 74 20 69 73 20 70 6f 73 73  on so it is poss
7bf0: 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 65 72  ible that the er
7c00: 72 6f 72 20 69 73 20 6e 6f 74 20 64 65 74 65 63  ror is not detec
7c10: 74 65 64 2e 0a 2a 2a 20 42 75 74 20 75 73 75 61  ted..** But usua
7c20: 6c 6c 79 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  lly the problem 
7c30: 77 69 6c 6c 20 62 65 20 73 65 65 6e 2e 20 20 54  will be seen.  T
7c40: 68 65 20 72 65 73 75 6c 74 20 77 69 6c 6c 20 62  he result will b
7c50: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 77 68  e an.** error wh
7c60: 69 63 68 20 63 61 6e 20 62 65 20 75 73 65 64 20  ich can be used 
7c70: 74 6f 20 64 65 62 75 67 20 74 68 65 20 61 70 70  to debug the app
7c80: 6c 69 63 61 74 69 6f 6e 20 74 68 61 74 20 69 73  lication that is
7c90: 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 69 74 65  .** using SQLite
7ca0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a   incorrectly..**
7cb0: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32 30 32 3a  .** Ticket #202:
7cc0: 20 20 49 66 20 64 62 2d 3e 6d 61 67 69 63 20 69    If db->magic i
7cd0: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6f 70  s not a valid op
7ce0: 65 6e 20 76 61 6c 75 65 2c 20 74 61 6b 65 20 63  en value, take c
7cf0: 61 72 65 20 6e 6f 74 0a 2a 2a 20 74 6f 20 6d 6f  are not.** to mo
7d00: 64 69 66 79 20 74 68 65 20 64 62 20 73 74 72 75  dify the db stru
7d10: 63 74 75 72 65 20 61 74 20 61 6c 6c 2e 20 20 49  cture at all.  I
7d20: 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
7d30: 64 62 20 69 73 20 61 20 73 74 61 6c 65 0a 2a 2a  db is a stale.**
7d40: 20 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 6f 74   pointer.  In ot
7d50: 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 63 6f  her words, it co
7d60: 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 72  uld be that ther
7d70: 65 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69  e has been a pri
7d80: 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  or.** call to sq
7d90: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20  lite3_close(db) 
7da0: 61 6e 64 20 64 62 20 68 61 73 20 62 65 65 6e 20  and db has been 
7db0: 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 41 6e  deallocated.  An
7dc0: 64 20 77 65 20 64 6f 0a 2a 2a 20 6e 6f 74 20 77  d we do.** not w
7dd0: 61 6e 74 20 74 6f 20 77 72 69 74 65 20 69 6e 74  ant to write int
7de0: 6f 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 6d 65  o deallocated me
7df0: 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mory..*/.int sql
7e00: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 73 71 6c  ite3SafetyOn(sql
7e10: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
7e20: 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49   db->magic==SQLI
7e30: 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 29 7b  TE_MAGIC_OPEN ){
7e40: 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
7e50: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
7e60: 53 59 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  SY;.    return 0
7e70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
7e80: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
7e90: 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a 20 20  MAGIC_BUSY ){.  
7ea0: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
7eb0: 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
7ec0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
7ed0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 72  |= SQLITE_Interr
7ee0: 75 70 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  upt;.  }.  retur
7ef0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n 1;.}../*.** Ch
7f00: 61 6e 67 65 20 74 68 65 20 6d 61 67 69 63 20 66  ange the magic f
7f10: 72 6f 6d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  rom SQLITE_MAGIC
7f20: 5f 42 55 53 59 20 74 6f 20 53 51 4c 49 54 45 5f  _BUSY to SQLITE_
7f30: 4d 41 47 49 43 5f 4f 50 45 4e 2e 0a 2a 2a 20 52  MAGIC_OPEN..** R
7f40: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 28  eturn an error (
7f50: 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65  non-zero) if the
7f60: 20 6d 61 67 69 63 20 77 61 73 20 6e 6f 74 20 53   magic was not S
7f70: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
7f80: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
7f90: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
7fa0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
7fb0: 61 66 65 74 79 4f 66 66 28 73 71 6c 69 74 65 33  afetyOff(sqlite3
7fc0: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d   *db){.  if( db-
7fd0: 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d  >magic==SQLITE_M
7fe0: 41 47 49 43 5f 42 55 53 59 20 29 7b 0a 20 20 20  AGIC_BUSY ){.   
7ff0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
8000: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
8010: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8020: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6d 61  }else if( db->ma
8030: 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic==SQLITE_MAGI
8040: 43 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 64 62  C_OPEN ){.    db
8050: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
8060: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20  _MAGIC_ERROR;.  
8070: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
8080: 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74 3b  QLITE_Interrupt;
8090: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
80a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
80b0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  to make sure we 
80c0: 68 61 76 65 20 61 20 76 61 6c 69 64 20 64 62 20  have a valid db 
80d0: 70 6f 69 6e 74 65 72 2e 20 20 54 68 69 73 20 74  pointer.  This t
80e0: 65 73 74 20 69 73 20 6e 6f 74 0a 2a 2a 20 66 6f  est is not.** fo
80f0: 6f 6c 70 72 6f 6f 66 20 62 75 74 20 69 74 20 64  olproof but it d
8100: 6f 65 73 20 70 72 6f 76 69 64 65 20 73 6f 6d 65  oes provide some
8110: 20 6d 65 61 73 75 72 65 20 6f 66 20 70 72 6f 74   measure of prot
8120: 65 63 74 69 6f 6e 20 61 67 61 69 6e 73 74 0a 2a  ection against.*
8130: 2a 20 6d 69 73 75 73 65 20 6f 66 20 74 68 65 20  * misuse of the 
8140: 69 6e 74 65 72 66 61 63 65 20 73 75 63 68 20 61  interface such a
8150: 73 20 70 61 73 73 69 6e 67 20 69 6e 20 64 62 20  s passing in db 
8160: 70 6f 69 6e 74 65 72 73 20 74 68 61 74 20 61 72  pointers that ar
8170: 65 0a 2a 2a 20 4e 55 4c 4c 20 6f 72 20 77 68 69  e.** NULL or whi
8180: 63 68 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ch have been pre
8190: 76 69 6f 75 73 6c 79 20 63 6c 6f 73 65 64 2e 20  viously closed. 
81a0: 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
81b0: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 54 52 55 45   returns.** TRUE
81c0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
81d0: 68 65 20 64 62 20 70 6f 69 6e 74 65 72 20 69 73  he db pointer is
81e0: 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
81f0: 75 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 64 65  uld not be.** de
8200: 72 65 66 65 72 65 6e 63 65 64 20 66 6f 72 20 61  referenced for a
8210: 6e 79 20 72 65 61 73 6f 6e 2e 20 20 54 68 65 20  ny reason.  The 
8220: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
8230: 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 0a 2a   should invoke.*
8240: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  * SQLITE_MISUSE 
8250: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a  immediately..*/.
8260: 69 6e 74 20 73 71 6c 69 74 65 33 53 61 66 65 74  int sqlite3Safet
8270: 79 43 68 65 63 6b 28 73 71 6c 69 74 65 33 20 2a  yCheck(sqlite3 *
8280: 64 62 29 7b 0a 20 20 69 6e 74 20 6d 61 67 69 63  db){.  int magic
8290: 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20  ;.  if( db==0 ) 
82a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 61 67 69  return 1;.  magi
82b0: 63 20 3d 20 64 62 2d 3e 6d 61 67 69 63 3b 0a 20  c = db->magic;. 
82c0: 20 69 66 28 20 6d 61 67 69 63 21 3d 53 51 4c 49   if( magic!=SQLI
82d0: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 20  TE_MAGIC_CLOSED 
82e0: 26 26 0a 20 20 20 20 20 20 20 20 20 6d 61 67 69  &&.         magi
82f0: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
8300: 4f 50 45 4e 20 26 26 0a 20 20 20 20 20 20 20 20  OPEN &&.        
8310: 20 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d   magic!=SQLITE_M
8320: 41 47 49 43 5f 42 55 53 59 20 29 20 72 65 74 75  AGIC_BUSY ) retu
8330: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
8340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76  ;.}../*.** The v
8350: 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69  ariable-length i
8360: 6e 74 65 67 65 72 20 65 6e 63 6f 64 69 6e 67 20  nteger encoding 
8370: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
8380: 2a 0a 2a 2a 20 4b 45 59 3a 0a 2a 2a 20 20 20 20  *.** KEY:.**    
8390: 20 20 20 20 20 41 20 3d 20 30 78 78 78 78 78 78       A = 0xxxxxx
83a0: 78 20 20 20 20 37 20 62 69 74 73 20 6f 66 20 64  x    7 bits of d
83b0: 61 74 61 20 61 6e 64 20 6f 6e 65 20 66 6c 61 67  ata and one flag
83c0: 20 62 69 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   bit.**         
83d0: 42 20 3d 20 31 78 78 78 78 78 78 78 20 20 20 20  B = 1xxxxxxx    
83e0: 37 20 62 69 74 73 20 6f 66 20 64 61 74 61 20 61  7 bits of data a
83f0: 6e 64 20 6f 6e 65 20 66 6c 61 67 20 62 69 74 0a  nd one flag bit.
8400: 2a 2a 20 20 20 20 20 20 20 20 20 43 20 3d 20 78  **         C = x
8410: 78 78 78 78 78 78 78 20 20 20 20 38 20 62 69 74  xxxxxxx    8 bit
8420: 73 20 6f 66 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20  s of data.**.** 
8430: 20 37 20 62 69 74 73 20 2d 20 41 0a 2a 2a 20 31   7 bits - A.** 1
8440: 34 20 62 69 74 73 20 2d 20 42 41 0a 2a 2a 20 32  4 bits - BA.** 2
8450: 31 20 62 69 74 73 20 2d 20 42 42 41 0a 2a 2a 20  1 bits - BBA.** 
8460: 32 38 20 62 69 74 73 20 2d 20 42 42 42 41 0a 2a  28 bits - BBBA.*
8470: 2a 20 33 35 20 62 69 74 73 20 2d 20 42 42 42 42  * 35 bits - BBBB
8480: 41 0a 2a 2a 20 34 32 20 62 69 74 73 20 2d 20 42  A.** 42 bits - B
8490: 42 42 42 42 41 0a 2a 2a 20 34 39 20 62 69 74 73  BBBBA.** 49 bits
84a0: 20 2d 20 42 42 42 42 42 42 41 0a 2a 2a 20 35 36   - BBBBBBA.** 56
84b0: 20 62 69 74 73 20 2d 20 42 42 42 42 42 42 42 41   bits - BBBBBBBA
84c0: 0a 2a 2a 20 36 34 20 62 69 74 73 20 2d 20 42 42  .** 64 bits - BB
84d0: 42 42 42 42 42 42 43 0a 2a 2f 0a 0a 2f 2a 0a 2a  BBBBBBC.*/../*.*
84e0: 2a 20 57 72 69 74 65 20 61 20 36 34 2d 62 69 74  * Write a 64-bit
84f0: 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68   variable-length
8500: 20 69 6e 74 65 67 65 72 20 74 6f 20 6d 65 6d 6f   integer to memo
8510: 72 79 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ry starting at p
8520: 5b 30 5d 2e 0a 2a 2a 20 54 68 65 20 6c 65 6e 67  [0]..** The leng
8530: 74 68 20 6f 66 20 64 61 74 61 20 77 72 69 74 65  th of data write
8540: 20 77 69 6c 6c 20 62 65 20 62 65 74 77 65 65 6e   will be between
8550: 20 31 20 61 6e 64 20 39 20 62 79 74 65 73 2e 20   1 and 9 bytes. 
8560: 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
8570: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
8580: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
8590: 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 2d 6c 65  ** A variable-le
85a0: 6e 67 74 68 20 69 6e 74 65 67 65 72 20 63 6f 6e  ngth integer con
85b0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 6c 6f 77  sists of the low
85c0: 65 72 20 37 20 62 69 74 73 20 6f 66 20 65 61 63  er 7 bits of eac
85d0: 68 20 62 79 74 65 0a 2a 2a 20 66 6f 72 20 61 6c  h byte.** for al
85e0: 6c 20 62 79 74 65 73 20 74 68 61 74 20 68 61 76  l bytes that hav
85f0: 65 20 74 68 65 20 38 74 68 20 62 69 74 20 73 65  e the 8th bit se
8600: 74 20 61 6e 64 20 6f 6e 65 20 62 79 74 65 20 77  t and one byte w
8610: 69 74 68 20 74 68 65 20 38 74 68 0a 2a 2a 20 62  ith the 8th.** b
8620: 69 74 20 63 6c 65 61 72 2e 20 20 45 78 63 65 70  it clear.  Excep
8630: 74 2c 20 69 66 20 77 65 20 67 65 74 20 74 6f 20  t, if we get to 
8640: 74 68 65 20 39 74 68 20 62 79 74 65 2c 20 69 74  the 9th byte, it
8650: 20 73 74 6f 72 65 73 20 74 68 65 20 66 75 6c 6c   stores the full
8660: 0a 2a 2a 20 38 20 62 69 74 73 20 61 6e 64 20 69  .** 8 bits and i
8670: 73 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 2e  s the last byte.
8680: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
8690: 75 74 56 61 72 69 6e 74 28 75 6e 73 69 67 6e 65  utVarint(unsigne
86a0: 64 20 63 68 61 72 20 2a 70 2c 20 75 36 34 20 76  d char *p, u64 v
86b0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  ){.  int i, j, n
86c0: 3b 0a 20 20 75 38 20 62 75 66 5b 31 30 5d 3b 0a  ;.  u8 buf[10];.
86d0: 20 20 69 66 28 20 76 20 26 20 28 28 28 75 36 34    if( v & (((u64
86e0: 29 30 78 66 66 30 30 30 30 30 30 29 3c 3c 33 32  )0xff000000)<<32
86f0: 29 20 29 7b 0a 20 20 20 20 70 5b 38 5d 20 3d 20  ) ){.    p[8] = 
8700: 76 3b 0a 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  v;.    v >>= 8;.
8710: 20 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 3e 3d      for(i=7; i>=
8720: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
8730: 5b 69 5d 20 3d 20 28 76 20 26 20 30 78 37 66 29  [i] = (v & 0x7f)
8740: 20 7c 20 30 78 38 30 3b 0a 20 20 20 20 20 20 76   | 0x80;.      v
8750: 20 3e 3e 3d 20 37 3b 0a 20 20 20 20 7d 0a 20 20   >>= 7;.    }.  
8760: 20 20 72 65 74 75 72 6e 20 39 3b 0a 20 20 7d 20    return 9;.  } 
8770: 20 20 20 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 64     .  n = 0;.  d
8780: 6f 7b 0a 20 20 20 20 62 75 66 5b 6e 2b 2b 5d 20  o{.    buf[n++] 
8790: 3d 20 28 76 20 26 20 30 78 37 66 29 20 7c 20 30  = (v & 0x7f) | 0
87a0: 78 38 30 3b 0a 20 20 20 20 76 20 3e 3e 3d 20 37  x80;.    v >>= 7
87b0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 76 21 3d 30  ;.  }while( v!=0
87c0: 20 29 3b 0a 20 20 62 75 66 5b 30 5d 20 26 3d 20   );.  buf[0] &= 
87d0: 30 78 37 66 3b 0a 20 20 61 73 73 65 72 74 28 20  0x7f;.  assert( 
87e0: 6e 3c 3d 39 20 29 3b 0a 20 20 66 6f 72 28 69 3d  n<=9 );.  for(i=
87f0: 30 2c 20 6a 3d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  0, j=n-1; j>=0; 
8800: 6a 2d 2d 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 70  j--, i++){.    p
8810: 5b 69 5d 20 3d 20 62 75 66 5b 6a 5d 3b 0a 20 20  [i] = buf[j];.  
8820: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
8830: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 36 34  ./*.** Read a 64
8840: 2d 62 69 74 20 76 61 72 69 61 62 6c 65 2d 6c 65  -bit variable-le
8850: 6e 67 74 68 20 69 6e 74 65 67 65 72 20 66 72 6f  ngth integer fro
8860: 6d 20 6d 65 6d 6f 72 79 20 73 74 61 72 74 69 6e  m memory startin
8870: 67 20 61 74 20 70 5b 30 5d 2e 0a 2a 2a 20 52 65  g at p[0]..** Re
8880: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8890: 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 20 20  of bytes read.  
88a0: 54 68 65 20 76 61 6c 75 65 20 69 73 20 73 74 6f  The value is sto
88b0: 72 65 64 20 69 6e 20 2a 76 2e 0a 2a 2f 0a 69 6e  red in *v..*/.in
88c0: 74 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  t sqlite3GetVari
88d0: 6e 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  nt(const unsigne
88e0: 64 20 63 68 61 72 20 2a 70 2c 20 75 36 34 20 2a  d char *p, u64 *
88f0: 76 29 7b 0a 20 20 75 33 32 20 78 3b 0a 20 20 75  v){.  u32 x;.  u
8900: 36 34 20 78 36 34 3b 0a 20 20 69 6e 74 20 6e 3b  64 x64;.  int n;
8910: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8920: 20 63 3b 0a 20 20 69 66 28 20 28 28 63 20 3d 20   c;.  if( ((c = 
8930: 70 5b 30 5d 29 20 26 20 30 78 38 30 29 3d 3d 30  p[0]) & 0x80)==0
8940: 20 29 7b 0a 20 20 20 20 2a 76 20 3d 20 63 3b 0a   ){.    *v = c;.
8950: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8960: 7d 0a 20 20 78 20 3d 20 63 20 26 20 30 78 37 66  }.  x = c & 0x7f
8970: 3b 0a 20 20 69 66 28 20 28 28 63 20 3d 20 70 5b  ;.  if( ((c = p[
8980: 31 5d 29 20 26 20 30 78 38 30 29 3d 3d 30 20 29  1]) & 0x80)==0 )
8990: 7b 0a 20 20 20 20 2a 76 20 3d 20 28 78 3c 3c 37  {.    *v = (x<<7
89a0: 29 20 7c 20 63 3b 0a 20 20 20 20 72 65 74 75 72  ) | c;.    retur
89b0: 6e 20 32 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 28  n 2;.  }.  x = (
89c0: 78 3c 3c 37 29 20 7c 20 28 63 26 30 78 37 66 29  x<<7) | (c&0x7f)
89d0: 3b 0a 20 20 69 66 28 20 28 28 63 20 3d 20 70 5b  ;.  if( ((c = p[
89e0: 32 5d 29 20 26 20 30 78 38 30 29 3d 3d 30 20 29  2]) & 0x80)==0 )
89f0: 7b 0a 20 20 20 20 2a 76 20 3d 20 28 78 3c 3c 37  {.    *v = (x<<7
8a00: 29 20 7c 20 63 3b 0a 20 20 20 20 72 65 74 75 72  ) | c;.    retur
8a10: 6e 20 33 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 28  n 3;.  }.  x = (
8a20: 78 3c 3c 37 29 20 7c 20 28 63 26 30 78 37 66 29  x<<7) | (c&0x7f)
8a30: 3b 0a 20 20 69 66 28 20 28 28 63 20 3d 20 70 5b  ;.  if( ((c = p[
8a40: 33 5d 29 20 26 20 30 78 38 30 29 3d 3d 30 20 29  3]) & 0x80)==0 )
8a50: 7b 0a 20 20 20 20 2a 76 20 3d 20 28 78 3c 3c 37  {.    *v = (x<<7
8a60: 29 20 7c 20 63 3b 0a 20 20 20 20 72 65 74 75 72  ) | c;.    retur
8a70: 6e 20 34 3b 0a 20 20 7d 0a 20 20 78 36 34 20 3d  n 4;.  }.  x64 =
8a80: 20 28 78 3c 3c 37 29 20 7c 20 28 63 26 30 78 37   (x<<7) | (c&0x7
8a90: 66 29 3b 0a 20 20 6e 20 3d 20 34 3b 0a 20 20 64  f);.  n = 4;.  d
8aa0: 6f 7b 0a 20 20 20 20 63 20 3d 20 70 5b 6e 2b 2b  o{.    c = p[n++
8ab0: 5d 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 39 20  ];.    if( n==9 
8ac0: 29 7b 0a 20 20 20 20 20 20 78 36 34 20 3d 20 28  ){.      x64 = (
8ad0: 78 36 34 3c 3c 38 29 20 7c 20 63 3b 0a 20 20 20  x64<<8) | c;.   
8ae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8af0: 20 20 20 20 78 36 34 20 3d 20 28 78 36 34 3c 3c      x64 = (x64<<
8b00: 37 29 20 7c 20 28 63 26 30 78 37 66 29 3b 0a 20  7) | (c&0x7f);. 
8b10: 20 7d 77 68 69 6c 65 28 20 28 63 20 26 20 30 78   }while( (c & 0x
8b20: 38 30 29 21 3d 30 20 29 3b 0a 20 20 2a 76 20 3d  80)!=0 );.  *v =
8b30: 20 78 36 34 3b 0a 20 20 72 65 74 75 72 6e 20 6e   x64;.  return n
8b40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
8b50: 61 20 33 32 2d 62 69 74 20 76 61 72 69 61 62 6c  a 32-bit variabl
8b60: 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e-length integer
8b70: 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 73 74 61   from memory sta
8b80: 72 74 69 6e 67 20 61 74 20 70 5b 30 5d 2e 0a 2a  rting at p[0]..*
8b90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8ba0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
8bb0: 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  d.  The value is
8bc0: 20 73 74 6f 72 65 64 20 69 6e 20 2a 76 2e 0a 2a   stored in *v..*
8bd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
8be0: 56 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 75  Varint32(const u
8bf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c  nsigned char *p,
8c00: 20 75 33 32 20 2a 76 29 7b 0a 20 20 75 33 32 20   u32 *v){.  u32 
8c10: 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 75 6e  x;.  int n;.  un
8c20: 73 69 67 6e 65 64 20 63 68 61 72 20 63 3b 0a 20  signed char c;. 
8c30: 20 69 66 28 20 28 28 73 69 67 6e 65 64 20 63 68   if( ((signed ch
8c40: 61 72 2a 29 70 29 5b 30 5d 3e 3d 30 20 29 7b 0a  ar*)p)[0]>=0 ){.
8c50: 20 20 20 20 2a 76 20 3d 20 70 5b 30 5d 3b 0a 20      *v = p[0];. 
8c60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
8c70: 0a 20 20 78 20 3d 20 70 5b 30 5d 20 26 20 30 78  .  x = p[0] & 0x
8c80: 37 66 3b 0a 20 20 69 66 28 20 28 28 73 69 67 6e  7f;.  if( ((sign
8c90: 65 64 20 63 68 61 72 2a 29 70 29 5b 31 5d 3e 3d  ed char*)p)[1]>=
8ca0: 30 20 29 7b 0a 20 20 20 20 2a 76 20 3d 20 28 78  0 ){.    *v = (x
8cb0: 3c 3c 37 29 20 7c 20 70 5b 31 5d 3b 0a 20 20 20  <<7) | p[1];.   
8cc0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
8cd0: 20 78 20 3d 20 28 78 3c 3c 37 29 20 7c 20 28 70   x = (x<<7) | (p
8ce0: 5b 31 5d 20 26 20 30 78 37 66 29 3b 0a 20 20 6e  [1] & 0x7f);.  n
8cf0: 20 3d 20 32 3b 0a 20 20 64 6f 7b 0a 20 20 20 20   = 2;.  do{.    
8d00: 78 20 3d 20 28 78 3c 3c 37 29 20 7c 20 28 28 63  x = (x<<7) | ((c
8d10: 20 3d 20 70 5b 6e 2b 2b 5d 29 26 30 78 37 66 29   = p[n++])&0x7f)
8d20: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 28 63 20 26  ;.  }while( (c &
8d30: 20 30 78 38 30 29 21 3d 30 20 26 26 20 6e 3c 39   0x80)!=0 && n<9
8d40: 20 29 3b 0a 20 20 2a 76 20 3d 20 78 3b 0a 20 20   );.  *v = x;.  
8d50: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
8d60: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8d70: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
8d80: 61 74 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 65  at will be neede
8d90: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 67  d to store the g
8da0: 69 76 65 6e 0a 2a 2a 20 36 34 2d 62 69 74 20 69  iven.** 64-bit i
8db0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  nteger..*/.int s
8dc0: 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
8dd0: 75 36 34 20 76 29 7b 0a 20 20 69 6e 74 20 69 20  u64 v){.  int i 
8de0: 3d 20 30 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  = 0;.  do{.    i
8df0: 2b 2b 3b 0a 20 20 20 20 76 20 3e 3e 3d 20 37 3b  ++;.    v >>= 7;
8e00: 0a 20 20 7d 77 68 69 6c 65 28 20 76 21 3d 30 20  .  }while( v!=0 
8e10: 26 26 20 69 3c 39 20 29 3b 0a 20 20 72 65 74 75  && i<9 );.  retu
8e20: 72 6e 20 69 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  rn i;.}..#if !de
8e30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8e40: 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 29 20  T_BLOB_LITERAL) 
8e50: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
8e60: 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 5c 0a 20  E_HAS_CODEC) \. 
8e70: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51     || defined(SQ
8e80: 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
8e90: 20 54 72 61 6e 73 6c 61 74 65 20 61 20 73 69 6e   Translate a sin
8ea0: 67 6c 65 20 62 79 74 65 20 6f 66 20 48 65 78 20  gle byte of Hex 
8eb0: 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  into an integer.
8ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
8ed0: 65 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a  exToInt(int h){.
8ee0: 20 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20    if( h>='0' && 
8ef0: 68 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65  h<='9' ){.    re
8f00: 74 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20  turn h - '0';.  
8f10: 7d 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27  }else if( h>='a'
8f20: 20 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20   && h<='f' ){.  
8f30: 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27    return h - 'a'
8f40: 20 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   + 10;.  }else{.
8f50: 20 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27      assert( h>='
8f60: 41 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a  A' && h<='F' );.
8f70: 20 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27      return h - '
8f80: 41 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 23  A' + 10;.  }.}.#
8f90: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
8fa0: 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
8fb0: 41 4c 20 7c 7c 20 53 51 4c 49 54 45 5f 48 41 53  AL || SQLITE_HAS
8fc0: 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45  _CODEC || SQLITE
8fd0: 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66 20 21 64  _TEST */..#if !d
8fe0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8ff0: 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 29  IT_BLOB_LITERAL)
9000: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
9010: 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 2f 2a  TE_HAS_CODEC)./*
9020: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 42 4c  .** Convert a BL
9030: 4f 42 20 6c 69 74 65 72 61 6c 20 6f 66 20 74 68  OB literal of th
9040: 65 20 66 6f 72 6d 20 22 78 27 68 68 68 68 68 68  e form "x'hhhhhh
9050: 27 22 20 69 6e 74 6f 20 69 74 73 20 62 69 6e 61  '" into its bina
9060: 72 79 0a 2a 2a 20 76 61 6c 75 65 2e 20 20 52 65  ry.** value.  Re
9070: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
9080: 6f 20 69 74 73 20 62 69 6e 61 72 79 20 76 61 6c  o its binary val
9090: 75 65 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ue.  Space to ho
90a0: 6c 64 20 74 68 65 0a 2a 2a 20 62 69 6e 61 72 79  ld the.** binary
90b0: 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20   value has been 
90c0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
90d0: 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
90e0: 20 66 72 65 65 64 20 62 79 0a 2a 2a 20 74 68 65   freed by.** the
90f0: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
9100: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
9110: 65 33 48 65 78 54 6f 42 6c 6f 62 28 63 6f 6e 73  e3HexToBlob(cons
9120: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68  t char *z){.  ch
9130: 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 69 6e 74  ar *zBlob;.  int
9140: 20 69 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74   i;.  int n = st
9150: 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28 20 6e  rlen(z);.  if( n
9160: 25 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  %2 ) return 0;..
9170: 20 20 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72 20    zBlob = (char 
9180: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
9190: 2f 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  /2);.  for(i=0; 
91a0: 69 3c 6e 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  i<n; i+=2){.    
91b0: 7a 42 6c 6f 62 5b 69 2f 32 5d 20 3d 20 28 68 65  zBlob[i/2] = (he
91c0: 78 54 6f 49 6e 74 28 7a 5b 69 5d 29 3c 3c 34 29  xToInt(z[i])<<4)
91d0: 20 7c 20 68 65 78 54 6f 49 6e 74 28 7a 5b 69 2b   | hexToInt(z[i+
91e0: 31 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  1]);.  }.  retur
91f0: 6e 20 7a 42 6c 6f 62 3b 0a 7d 0a 23 65 6e 64 69  n zBlob;.}.#endi
9200: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
9210: 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 20 7c  T_BLOB_LITERAL |
9220: 7c 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  | SQLITE_HAS_COD
9230: 45 43 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  EC */..#if defin
9240: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
9250: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 65  /*.** Convert te
9260: 78 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  xt generated by 
9270: 74 68 65 20 22 25 70 22 20 63 6f 6e 76 65 72 73  the "%p" convers
9280: 69 6f 6e 20 66 6f 72 6d 61 74 20 62 61 63 6b 20  ion format back 
9290: 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  into.** a pointe
92a0: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  r..*/.void *sqli
92b0: 74 65 33 54 65 78 74 54 6f 50 74 72 28 63 6f 6e  te3TextToPtr(con
92c0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 76  st char *z){.  v
92d0: 6f 69 64 20 2a 70 3b 0a 20 20 75 36 34 20 76 3b  oid *p;.  u64 v;
92e0: 0a 20 20 75 33 32 20 76 32 3b 0a 20 20 69 66 28  .  u32 v2;.  if(
92f0: 20 7a 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 5b   z[0]=='0' && z[
9300: 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 7a  1]=='x' ){.    z
9310: 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 76 20 3d   += 2;.  }.  v =
9320: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   0;.  while( *z 
9330: 29 7b 0a 20 20 20 20 76 20 3d 20 28 76 3c 3c 34  ){.    v = (v<<4
9340: 29 20 2b 20 68 65 78 54 6f 49 6e 74 28 2a 7a 29  ) + hexToInt(*z)
9350: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
9360: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
9370: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
9380: 20 70 20 3d 20 2a 28 76 6f 69 64 2a 2a 29 26 76   p = *(void**)&v
9390: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
93a0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 70 29  ssert( sizeof(p)
93b0: 3d 3d 73 69 7a 65 6f 66 28 76 32 29 20 29 3b 0a  ==sizeof(v2) );.
93c0: 20 20 20 20 76 32 20 3d 20 28 75 33 32 29 76 3b      v2 = (u32)v;
93d0: 0a 20 20 20 20 70 20 3d 20 2a 28 76 6f 69 64 2a  .    p = *(void*
93e0: 2a 29 26 76 32 3b 0a 20 20 7d 0a 20 20 72 65 74  *)&v2;.  }.  ret
93f0: 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn p;.}.#endif.
9400: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
9410: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
9420: 68 72 65 61 64 44 61 74 61 20 61 73 73 6f 63 69  hreadData associ
9430: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63 61  ated with the ca
9440: 6c 6c 69 6e 67 20 74 68 72 65 61 64 2e 0a 2a 2f  lling thread..*/
9450: 0a 54 68 72 65 61 64 44 61 74 61 20 2a 73 71 6c  .ThreadData *sql
9460: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
9470: 7b 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a  {.  ThreadData *
9480: 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 4f 73  pTsd = sqlite3Os
9490: 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
94a0: 74 61 28 73 69 7a 65 6f 66 28 54 68 72 65 61 64  ta(sizeof(Thread
94b0: 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70 54  Data));.  if( pT
94c0: 73 64 20 26 26 20 21 70 54 73 64 2d 3e 69 73 49  sd && !pTsd->isI
94d0: 6e 69 74 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  nit ){.#ifndef S
94e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
94f0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 20  Y_MANAGEMENT.   
9500: 20 70 54 73 64 2d 3e 6e 53 6f 66 74 48 65 61 70   pTsd->nSoftHeap
9510: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 23 65 6e 64  Limit = -1;.#end
9520: 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  if.#ifndef NDEBU
9530: 47 0a 20 20 20 20 70 54 73 64 2d 3e 6d 61 6c 6c  G.    pTsd->mall
9540: 6f 63 41 6c 6c 6f 77 65 64 20 3d 20 31 3b 0a 23  ocAllowed = 1;.#
9550: 65 6e 64 69 66 0a 20 20 20 20 70 54 73 64 2d 3e  endif.    pTsd->
9560: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a  isInit = 1;.  }.
9570: 20 20 72 65 74 75 72 6e 20 70 54 73 64 3b 0a 7d    return pTsd;.}
9580: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
9590: 65 20 22 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 22  e "mallocFailed"
95a0: 20 66 6c 61 67 2e 20 54 68 69 73 20 73 68 6f 75   flag. This shou
95b0: 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 62 65  ld be invoked be
95c0: 66 6f 72 65 20 65 78 69 74 69 6e 67 20 61 6e 79  fore exiting any
95d0: 0a 2a 2a 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  .** entry points
95e0: 20 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 63   that may have c
95f0: 61 6c 6c 65 64 20 73 71 6c 69 74 65 4d 61 6c 6c  alled sqliteMall
9600: 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oc()..*/.void sq
9610: 6c 69 74 65 33 4d 61 6c 6c 6f 63 43 6c 65 61 72  lite3MallocClear
9620: 46 61 69 6c 65 64 28 29 7b 0a 20 20 73 71 6c 69  Failed(){.  sqli
9630: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d  te3ThreadData()-
9640: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
9650: 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
9660: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
9670: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a  _MANAGEMENT./*.*
9680: 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 73 68 61  * Enable the sha
9690: 72 65 64 20 70 61 67 65 72 20 61 6e 64 20 73 63  red pager and sc
96a0: 68 65 6d 61 20 66 65 61 74 75 72 65 73 2e 0a 2a  hema features..*
96b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e  /.int sqlite3_en
96c0: 61 62 6c 65 5f 6d 65 6d 6f 72 79 5f 6d 61 6e 61  able_memory_mana
96d0: 67 65 6d 65 6e 74 28 69 6e 74 20 65 6e 61 62 6c  gement(int enabl
96e0: 65 29 7b 0a 20 20 54 68 72 65 61 64 44 61 74 61  e){.  ThreadData
96f0: 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
9700: 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 0a 20  ThreadData();.. 
9710: 20 2f 2a 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c   /* It is only l
9720: 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
9730: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6d 65 6d 6f  ite3_enable_memo
9740: 72 79 5f 6d 61 6e 61 67 65 6d 65 6e 74 28 29 20  ry_management() 
9750: 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
9760: 61 72 65 20 6e 6f 20 63 75 72 72 65 6e 74 6c 79  are no currently
9770: 20 6f 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e   open connection
9780: 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
9790: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
97a0: 67 20 0a 20 20 2a 2a 20 74 68 72 65 61 64 2e 20  g .  ** thread. 
97b0: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
97c0: 73 20 6f 6e 6c 79 20 65 61 73 79 20 74 6f 20 64  s only easy to d
97d0: 65 74 65 63 74 20 69 66 20 74 68 65 20 66 65 61  etect if the fea
97e0: 74 75 72 65 20 77 65 72 65 0a 20 20 2a 2a 20 70  ture were.  ** p
97f0: 72 65 76 69 6f 75 73 6c 79 20 65 6e 61 62 6c 65  reviously enable
9800: 64 20 28 61 6e 64 20 69 73 20 62 65 69 6e 67 20  d (and is being 
9810: 64 69 73 61 62 6c 65 64 29 2e 20 0a 20 20 2a 2f  disabled). .  */
9820: 0a 20 20 69 66 28 20 70 54 73 64 2d 3e 70 50 61  .  if( pTsd->pPa
9830: 67 65 72 20 26 26 20 21 65 6e 61 62 6c 65 20 29  ger && !enable )
9840: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9850: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
9860: 20 20 70 54 73 64 2d 3e 75 73 65 4d 65 6d 6f 72    pTsd->useMemor
9870: 79 4d 61 6e 61 67 65 6d 65 6e 74 20 3d 20 65 6e  yManagement = en
9880: 61 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  able;.  return S
9890: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
98a0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  if..#ifndef NDEB
98b0: 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  UG./*.** This fu
98c0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c  nction sets a fl
98d0: 61 67 20 69 6e 20 74 68 65 20 74 68 72 65 61 64  ag in the thread
98e0: 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61 20 73  -specific-data s
98f0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
9900: 6c 6c 0a 2a 2a 20 63 61 75 73 65 20 61 6e 20 61  ll.** cause an a
9910: 73 73 65 72 74 20 74 6f 20 66 61 69 6c 20 69 66  ssert to fail if
9920: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
9930: 6f 72 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63  or sqliteRealloc
9940: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  () is called..*/
9950: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 6c  .void sqlite3Mal
9960: 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29 7b 0a 20  locDisallow(){. 
9970: 20 61 73 73 65 72 74 28 73 71 6c 69 74 65 33 54   assert(sqlite3T
9980: 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61 6c  hreadData()->mal
9990: 6c 6f 63 41 6c 6c 6f 77 65 64 29 3b 0a 20 20 73  locAllowed);.  s
99a0: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
99b0: 28 29 2d 3e 6d 61 6c 6c 6f 63 41 6c 6c 6f 77 65  ()->mallocAllowe
99c0: 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d = 0;.}../*.** 
99d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6c  This function cl
99e0: 65 61 72 73 20 74 68 65 20 66 6c 61 67 20 73 65  ears the flag se
99f0: 74 20 69 6e 20 74 68 65 20 74 68 72 65 61 64 2d  t in the thread-
9a00: 73 70 65 63 69 66 69 63 2d 64 61 74 61 20 73 74  specific-data st
9a10: 72 75 63 74 75 72 65 20 73 65 74 0a 2a 2a 20 62  ructure set.** b
9a20: 79 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44  y sqlite3MallocD
9a30: 69 73 61 6c 6c 6f 77 28 29 2e 0a 2a 2f 0a 76 6f  isallow()..*/.vo
9a40: 69 64 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  id sqlite3Malloc
9a50: 41 6c 6c 6f 77 28 29 7b 0a 20 20 61 73 73 65 72  Allow(){.  asser
9a60: 74 28 21 73 71 6c 69 74 65 33 54 68 72 65 61 64  t(!sqlite3Thread
9a70: 44 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63 41 6c  Data()->mallocAl
9a80: 6c 6f 77 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  lowed);.  sqlite
9a90: 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d  3ThreadData()->m
9aa0: 61 6c 6c 6f 63 41 6c 6c 6f 77 65 64 20 3d 20 31  allocAllowed = 1
9ab0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.