/ Hex Artifact Content
Login

Artifact 8e0e3b1ad4f7c70706a9e76881882a409ccdb2e8:


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: 35 38 20 32 30 30 35 2f 31 32 2f 32 30 20 31 34  58 2005/12/20 14
0230: 3a 33 38 3a 30 30 20 64 61 6e 69 65 6c 6b 31 39  :38:00 danielk19
0240: 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  77 Exp $.*/.#inc
0250: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0260: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  h".#include "os.
0270: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0280: 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  arg.h>.#include 
0290: 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  <ctype.h>../*.**
02a0: 20 4d 41 4c 4c 4f 43 20 57 52 41 50 50 45 52 20   MALLOC WRAPPER 
02b0: 41 52 43 48 49 54 45 43 54 55 52 45 0a 2a 2a 0a  ARCHITECTURE.**.
02c0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 20 63 6f  ** The sqlite co
02d0: 64 65 20 61 63 63 65 73 73 65 73 20 64 79 6e 61  de accesses dyna
02e0: 6d 69 63 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  mic memory alloc
02f0: 61 74 69 6f 6e 2f 64 65 61 6c 6c 6f 63 61 74 69  ation/deallocati
0300: 6f 6e 20 62 79 20 69 6e 76 6f 6b 69 6e 67 0a 2a  on by invoking.*
0310: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
0320: 66 6f 75 72 20 41 50 49 73 20 28 77 68 69 63 68  four APIs (which
0330: 20 6d 61 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e   may be implemen
0340: 74 65 64 20 61 73 20 6d 61 63 72 6f 73 29 2e 0a  ted as macros)..
0350: 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
0360: 33 4d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 20 20 20  3Malloc().**    
0370: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61   sqlite3MallocRa
0380: 77 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  w().**     sqlit
0390: 65 33 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 20  e3Realloc().**  
03a0: 20 20 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f     sqlite3Reallo
03b0: 63 4f 72 46 72 65 65 28 29 0a 2a 2a 20 20 20 20  cOrFree().**    
03c0: 20 73 71 6c 69 74 65 33 46 72 65 65 28 29 0a 2a   sqlite3Free().*
03d0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 41 6c 6c  *     sqlite3All
03e0: 6f 63 53 69 7a 65 28 29 0a 2a 2a 0a 2a 2a 20 54  ocSize().**.** T
03f0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69  he function sqli
0400: 74 65 33 46 72 65 65 58 20 70 65 72 66 6f 72 6d  te3FreeX perform
0410: 73 20 74 68 65 20 73 61 6d 65 20 74 61 73 6b 20  s the same task 
0420: 61 73 20 73 71 6c 69 74 65 33 46 72 65 65 20 61  as sqlite3Free a
0430: 6e 64 20 69 73 0a 2a 2a 20 67 75 61 72 61 6e 74  nd is.** guarant
0440: 65 65 64 20 74 6f 20 62 65 20 61 20 72 65 61 6c  eed to be a real
0450: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 73   function. The s
0460: 61 6d 65 20 68 6f 6c 64 73 20 66 6f 72 20 73 71  ame holds for sq
0470: 6c 69 74 65 33 4d 61 6c 6c 6f 63 58 0a 2a 2a 0a  lite3MallocX.**.
0480: 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 41 50 49  ** The above API
0490: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  s are implemente
04a0: 64 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  d in terms of th
04b0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 70 72 6f 76  e functions prov
04c0: 69 64 65 64 20 61 74 20 74 68 65 20 4f 73 0a 2a  ided at the Os.*
04d0: 2a 20 6c 65 76 65 6c 20 28 6e 6f 74 20 69 6e 20  * level (not in 
04e0: 74 68 69 73 20 66 69 6c 65 29 2e 20 54 68 65 20  this file). The 
04f0: 4f 73 20 6c 65 76 65 6c 20 69 6e 74 65 72 66 61  Os level interfa
0500: 63 65 20 69 73 20 6e 65 76 65 72 20 61 63 63 65  ce is never acce
0510: 73 73 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  ssed directly.**
0520: 20 62 79 20 63 6f 64 65 20 6f 75 74 73 69 64 65   by code outside
0530: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   of this file..*
0540: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
0550: 4f 73 2e 78 4d 61 6c 6c 6f 63 28 29 0a 2a 2a 20  Os.xMalloc().** 
0560: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 52      sqlite3Os.xR
0570: 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 20 20 20 20  ealloc().**     
0580: 73 71 6c 69 74 65 33 4f 73 2e 78 46 72 65 65 28  sqlite3Os.xFree(
0590: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
05a0: 4f 73 2e 78 41 6c 6c 6f 63 61 74 69 6f 6e 53 69  Os.xAllocationSi
05b0: 7a 65 28 29 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ze().**.** Funct
05c0: 69 6f 6e 73 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ions sqlite3Mall
05d0: 6f 63 52 61 77 28 29 20 61 6e 64 20 73 71 6c 69  ocRaw() and sqli
05e0: 74 65 33 52 65 61 6c 6c 6f 63 28 29 20 6d 61 79  te3Realloc() may
05f0: 20 69 6e 76 6f 6b 65 20 0a 2a 2a 20 73 71 6c 69   invoke .** sqli
0600: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
0610: 72 79 28 29 20 69 66 20 61 20 63 61 6c 6c 20 74  ry() if a call t
0620: 6f 20 73 71 6c 69 74 65 33 4f 73 2e 78 4d 61 6c  o sqlite3Os.xMal
0630: 6c 6f 63 28 29 20 6f 72 0a 2a 2a 20 73 71 6c 69  loc() or.** sqli
0640: 74 65 33 4f 73 2e 78 52 65 61 6c 6c 6f 63 28 29  te3Os.xRealloc()
0650: 20 66 61 69 6c 73 20 28 6f 72 20 69 66 20 74 68   fails (or if th
0660: 65 20 73 6f 66 74 2d 68 65 61 70 2d 6c 69 6d 69  e soft-heap-limi
0670: 74 20 66 6f 72 20 74 68 65 20 74 68 72 65 61 64  t for the thread
0680: 20 69 73 0a 2a 2a 20 65 78 63 65 65 64 65 64 29   is.** exceeded)
0690: 2e 20 46 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74  . Function sqlit
06a0: 65 33 4d 61 6c 6c 6f 63 28 29 20 75 73 75 61 6c  e3Malloc() usual
06b0: 6c 79 20 69 6e 76 6f 6b 65 73 0a 2a 2a 20 73 71  ly invokes.** sq
06c0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28 29  lite3MallocRaw()
06d0: 2e 0a 2a 2a 0a 2a 2a 20 4d 41 4c 4c 4f 43 20 54  ..**.** MALLOC T
06e0: 45 53 54 20 57 52 41 50 50 45 52 20 41 52 43 48  EST WRAPPER ARCH
06f0: 49 54 45 43 54 55 52 45 0a 2a 2a 0a 2a 2a 20 54  ITECTURE.**.** T
0700: 68 65 20 74 65 73 74 20 77 72 61 70 70 65 72 20  he test wrapper 
0710: 70 72 6f 76 69 64 65 73 20 65 78 74 72 61 20 74  provides extra t
0720: 65 73 74 20 66 61 63 69 6c 69 74 69 65 73 20 74  est facilities t
0730: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6c 69 62  o ensure the lib
0740: 72 61 72 79 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  rary .** does no
0750: 74 20 6c 65 61 6b 20 6d 65 6d 6f 72 79 20 61 6e  t leak memory an
0760: 64 20 68 61 6e 64 6c 65 73 20 74 68 65 20 66 61  d handles the fa
0770: 69 6c 75 72 65 20 6f 66 20 74 68 65 20 75 6e 64  ilure of the und
0780: 65 72 6c 79 69 6e 67 20 28 4f 73 20 6c 65 76 65  erlying (Os leve
0790: 6c 29 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  l).** allocation
07a0: 20 73 79 73 74 65 6d 20 63 6f 72 72 65 63 74 6c   system correctl
07b0: 79 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 70 72  y. It is only pr
07c0: 65 73 65 6e 74 20 69 66 20 74 68 65 20 6c 69 62  esent if the lib
07d0: 72 61 72 79 20 69 73 20 0a 2a 2a 20 63 6f 6d 70  rary is .** comp
07e0: 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
07f0: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 6d 61  LITE_MEMDEBUG ma
0800: 63 72 6f 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20  cro set..**.**  
0810: 20 20 20 2a 20 47 75 61 72 64 70 6f 73 74 73 20     * Guardposts 
0820: 74 6f 20 64 65 74 65 63 74 20 6f 76 65 72 77 72  to detect overwr
0830: 69 74 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 41  ites..**     * A
0840: 62 69 6c 69 74 79 20 74 6f 20 63 61 75 73 65 20  bility to cause 
0850: 61 20 73 70 65 63 69 66 69 63 20 4d 61 6c 6c 6f  a specific Mallo
0860: 63 28 29 20 6f 72 20 52 65 61 6c 6c 6f 63 28 29  c() or Realloc()
0870: 20 74 6f 20 66 61 69 6c 2e 0a 2a 2a 20 20 20 20   to fail..**    
0880: 20 2a 20 41 75 64 69 74 20 6f 75 74 73 74 61 6e   * Audit outstan
0890: 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ding memory allo
08a0: 63 61 74 69 6f 6e 73 20 28 69 2e 65 20 63 68 65  cations (i.e che
08b0: 63 6b 20 66 6f 72 20 6c 65 61 6b 73 29 2e 0a 2a  ck for leaks)..*
08c0: 2f 0a 0a 23 64 65 66 69 6e 65 20 4d 41 58 28 78  /..#define MAX(x
08d0: 2c 79 29 20 28 28 78 29 3e 28 79 29 3f 28 78 29  ,y) ((x)>(y)?(x)
08e0: 3a 28 79 29 29 0a 0a 23 69 66 6e 64 65 66 20 53  :(y))..#ifndef S
08f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
0900: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a  Y_MANAGEMENT./*.
0910: 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 66 74 20  ** Set the soft 
0920: 68 65 61 70 2d 73 69 7a 65 20 6c 69 6d 69 74 20  heap-size limit 
0930: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
0940: 74 68 72 65 61 64 2e 20 50 61 73 73 69 6e 67 20  thread. Passing 
0950: 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 76 61  a negative.** va
0960: 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  lue indicates no
0970: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20   limit..*/.void 
0980: 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
0990: 70 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 5f 69  p_limit(sqlite_i
09a0: 6e 74 36 34 20 6e 29 7b 0a 20 20 73 71 6c 69 74  nt64 n){.  sqlit
09b0: 65 33 54 73 64 28 29 2d 3e 6e 53 6f 66 74 48 65  e3Tsd()->nSoftHe
09c0: 61 70 4c 69 6d 69 74 20 3d 20 6e 3b 0a 7d 0a 0a  apLimit = n;.}..
09d0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d 65  /*.** Release me
09e0: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 53 51 4c  mory held by SQL
09f0: 69 74 65 20 69 6e 73 74 61 6e 63 65 73 20 63 72  ite instances cr
0a00: 65 61 74 65 64 20 62 79 20 74 68 65 20 63 75 72  eated by the cur
0a10: 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2f 0a  rent thread..*/.
0a20: 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6c 65  int sqlite3_rele
0a30: 61 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e  ase_memory(int n
0a40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
0a50: 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61 73 65  te3pager_release
0a60: 5f 6d 65 6d 6f 72 79 28 6e 29 3b 0a 7d 0a 23 65  _memory(n);.}.#e
0a70: 6c 73 65 0a 2f 2a 20 49 66 20 53 51 4c 49 54 45  lse./* If SQLITE
0a80: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  _OMIT_MEMORY_MAN
0a90: 41 47 45 4d 45 4e 54 20 69 73 20 64 65 66 69 6e  AGEMENT is defin
0aa0: 65 64 2c 20 74 68 65 6e 20 64 65 66 69 6e 65 20  ed, then define 
0ab0: 61 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20  a version.** of 
0ac0: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
0ad0: 6d 65 6d 6f 72 79 28 29 20 74 6f 20 62 65 20 75  memory() to be u
0ae0: 73 65 64 20 62 79 20 6f 74 68 65 72 20 63 6f 64  sed by other cod
0af0: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a  e in this file..
0b00: 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
0b10: 66 6f 72 20 6e 6f 20 62 65 74 74 65 72 20 72 65  for no better re
0b20: 61 73 6f 6e 20 74 68 61 6e 20 74 6f 20 72 65 64  ason than to red
0b30: 75 63 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  uce the number o
0b40: 66 20 0a 2a 2a 20 70 72 65 2d 70 72 6f 63 65 73  f .** pre-proces
0b50: 73 6f 72 20 23 69 66 6e 64 65 66 20 73 74 61 74  sor #ifndef stat
0b60: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66 69  ements..*/.#defi
0b70: 6e 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  ne sqlite3_relea
0b80: 73 65 5f 6d 65 6d 6f 72 79 28 78 29 20 30 20 20  se_memory(x) 0  
0b90: 20 20 2f 2a 20 30 20 3d 3d 20 6e 6f 20 6d 65 6d    /* 0 == no mem
0ba0: 6f 72 79 20 66 72 65 65 64 20 2a 2f 0a 23 65 6e  ory freed */.#en
0bb0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
0bc0: 54 45 5f 4d 45 4d 44 45 42 55 47 0a 2f 2a 2d 2d  TE_MEMDEBUG./*--
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 2a 2a 20 42 65 67 69  --------.** Begi
0c20: 6e 20 63 6f 64 65 20 66 6f 72 20 6d 65 6d 6f 72  n code for memor
0c30: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 79 73  y allocation sys
0c40: 74 65 6d 20 74 65 73 74 20 6c 61 79 65 72 2e 0a  tem test layer..
0c50: 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 64 65 62  **.** Memory deb
0c60: 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65 64  ugging is turned
0c70: 20 6f 6e 20 62 79 20 64 65 66 69 6e 69 6e 67 20   on by defining 
0c80: 74 68 65 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  the SQLITE_MEMDE
0c90: 42 55 47 20 6d 61 63 72 6f 2e 0a 2a 2a 0a 2a 2a  BUG macro..**.**
0ca0: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
0cb0: 3d 3d 31 20 20 20 20 2d 3e 20 46 65 6e 63 65 2d  ==1    -> Fence-
0cc0: 70 6f 73 74 69 6e 67 20 6f 6e 6c 79 20 28 74 68  posting only (th
0cd0: 72 65 61 64 20 73 61 66 65 29 20 0a 2a 2a 20 53  read safe) .** S
0ce0: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3d 3d  QLITE_MEMDEBUG==
0cf0: 32 20 20 20 20 2d 3e 20 46 65 6e 63 65 2d 70 6f  2    -> Fence-po
0d00: 73 74 69 6e 67 20 2b 20 6c 69 6e 6b 65 64 20 6c  sting + linked l
0d10: 69 73 74 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f  ist of allocatio
0d20: 6e 73 20 28 6e 6f 74 20 74 73 29 0a 2a 2a 20 53  ns (not ts).** S
0d30: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3d 3d  QLITE_MEMDEBUG==
0d40: 33 20 20 20 20 2d 3e 20 41 62 6f 76 65 20 2b 20  3    -> Above + 
0d50: 62 61 63 6b 74 72 61 63 65 73 20 28 6e 6f 74 20  backtraces (not 
0d60: 74 68 72 65 61 64 20 73 61 66 65 2c 20 72 65 71  thread safe, req
0d70: 2e 20 67 6c 69 62 63 29 0a 2a 2f 0a 0a 2f 2a 20  . glibc).*/../* 
0d80: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
0d90: 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 73 74 6f  er or not to sto
0da0: 72 65 20 62 61 63 6b 74 72 61 63 65 28 29 20 69  re backtrace() i
0db0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 65  nformation for e
0dc0: 61 63 68 20 6d 61 6c 6c 6f 63 2e 0a 2a 2a 20 54  ach malloc..** T
0dd0: 68 65 20 62 61 63 6b 74 72 61 63 65 28 29 20 66  he backtrace() f
0de0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
0df0: 75 73 65 64 20 69 66 20 53 51 4c 49 54 45 5f 4d  used if SQLITE_M
0e00: 45 4d 44 45 42 55 47 20 69 73 20 73 65 74 20 74  EMDEBUG is set t
0e10: 6f 20 32 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74  o 2 or .** great
0e20: 65 72 20 61 6e 64 20 67 6c 69 62 63 20 69 73 20  er and glibc is 
0e30: 69 6e 20 75 73 65 2e 20 49 66 20 77 65 20 64 6f  in use. If we do
0e40: 6e 27 74 20 77 61 6e 74 20 74 6f 20 75 73 65 20  n't want to use 
0e50: 62 61 63 6b 74 72 61 63 65 28 29 2c 20 74 68 65  backtrace(), the
0e60: 6e 20 6a 75 73 74 0a 2a 2a 20 64 65 66 69 6e 65  n just.** define
0e70: 20 69 74 20 61 73 20 61 6e 20 65 6d 70 74 79 20   it as an empty 
0e80: 6d 61 63 72 6f 20 61 6e 64 20 73 65 74 20 74 68  macro and set th
0e90: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
0ea0: 65 20 72 65 73 65 72 76 65 64 20 74 6f 20 30 2e  e reserved to 0.
0eb0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
0ec0: 5f 5f 47 4c 49 42 43 5f 5f 29 20 26 26 20 53 51  __GLIBC__) && SQ
0ed0: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 3e 32 0a  LITE_MEMDEBUG>2.
0ee0: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 62 61 63    extern int bac
0ef0: 6b 74 72 61 63 65 28 76 6f 69 64 20 2a 2a 2c 20  ktrace(void **, 
0f00: 69 6e 74 29 3b 0a 20 20 23 64 65 66 69 6e 65 20  int);.  #define 
0f10: 54 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 53  TESTALLOC_STACKS
0f20: 49 5a 45 20 31 32 38 0a 20 20 23 64 65 66 69 6e  IZE 128.  #defin
0f30: 65 20 54 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43  e TESTALLOC_STAC
0f40: 4b 46 52 41 4d 45 53 20 28 28 54 45 53 54 41 4c  KFRAMES ((TESTAL
0f50: 4c 4f 43 5f 53 54 41 43 4b 53 49 5a 45 2d 38 29  LOC_STACKSIZE-8)
0f60: 2f 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 0a  /sizeof(void*)).
0f70: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
0f80: 62 61 63 6b 74 72 61 63 65 28 78 2c 20 79 29 0a  backtrace(x, y).
0f90: 20 20 23 64 65 66 69 6e 65 20 54 45 53 54 41 4c    #define TESTAL
0fa0: 4c 4f 43 5f 53 54 41 43 4b 53 49 5a 45 20 30 0a  LOC_STACKSIZE 0.
0fb0: 20 20 23 64 65 66 69 6e 65 20 54 45 53 54 41 4c    #define TESTAL
0fc0: 4c 4f 43 5f 53 54 41 43 4b 46 52 41 4d 45 53 20  LOC_STACKFRAMES 
0fd0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
0fe0: 4e 75 6d 62 65 72 20 6f 66 20 33 32 2d 62 69 74  Number of 32-bit
0ff0: 20 67 75 61 72 64 20 77 6f 72 64 73 2e 20 20 54   guard words.  T
1000: 68 69 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61  his should proba
1010: 62 6c 79 20 62 65 20 61 20 6d 75 6c 74 69 70 6c  bly be a multipl
1020: 65 20 6f 66 0a 2a 2a 20 32 20 73 69 6e 63 65 20  e of.** 2 since 
1030: 6f 6e 20 36 34 2d 62 69 74 20 6d 61 63 68 69 6e  on 64-bit machin
1040: 65 73 20 77 65 20 77 61 6e 74 20 74 68 65 20 76  es we want the v
1050: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1060: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a   sqliteMalloc().
1070: 2a 2a 20 74 6f 20 62 65 20 38 2d 62 79 74 65 20  ** to be 8-byte 
1080: 61 6c 69 67 6e 65 64 2e 0a 2a 2f 0a 23 64 65 66  aligned..*/.#def
1090: 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43 5f 4e 47  ine TESTALLOC_NG
10a0: 55 41 52 44 20 32 0a 0a 2f 2a 0a 2a 2a 20 53 69  UARD 2../*.** Si
10b0: 7a 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ze reserved for 
10c0: 73 74 6f 72 69 6e 67 20 66 69 6c 65 2d 6e 61 6d  storing file-nam
10d0: 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  e along with eac
10e0: 68 20 6d 61 6c 6c 6f 63 28 29 65 64 20 62 6c 6f  h malloc()ed blo
10f0: 62 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  b..*/.#define TE
1100: 53 54 41 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a 45  STALLOC_FILESIZE
1110: 20 36 34 0a 0a 2f 2a 0a 2a 2a 20 53 69 7a 65 20   64../*.** Size 
1120: 72 65 73 65 72 76 65 64 20 66 6f 72 20 73 74 6f  reserved for sto
1130: 72 69 6e 67 20 74 68 65 20 75 73 65 72 20 73 74  ring the user st
1140: 72 69 6e 67 2e 20 45 61 63 68 20 74 69 6d 65 20  ring. Each time 
1150: 61 20 4d 61 6c 6c 6f 63 28 29 20 6f 72 20 52 65  a Malloc() or Re
1160: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 63 61 6c 6c 20  alloc().** call 
1170: 73 75 63 63 65 65 64 73 2c 20 75 70 20 74 6f 20  succeeds, up to 
1180: 54 45 53 54 41 4c 4c 4f 43 5f 55 53 45 52 53 49  TESTALLOC_USERSI
1190: 5a 45 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ZE bytes of the 
11a0: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74  string pointed t
11b0: 6f 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  o by.** sqlite3_
11c0: 6d 61 6c 6c 6f 63 5f 69 64 20 61 72 65 20 73 74  malloc_id are st
11d0: 6f 72 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ored along with 
11e0: 74 68 65 20 6f 74 68 65 72 20 74 65 73 74 20 73  the other test s
11f0: 79 73 74 65 6d 20 6d 65 74 61 64 61 74 61 2e 0a  ystem metadata..
1200: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 53 54 41  */.#define TESTA
1210: 4c 4c 4f 43 5f 55 53 45 52 53 49 5a 45 20 36 34  LLOC_USERSIZE 64
1220: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1230: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 69 64 20 3d  ite3_malloc_id =
1240: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 42 6c 6f 63 6b   0;../*.** Block
1250: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  s used by the te
1260: 73 74 20 6c 61 79 65 72 20 68 61 76 65 20 74 68  st layer have th
1270: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
1280: 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  at:.**.**       
1290: 20 3c 73 69 7a 65 6f 66 28 76 6f 69 64 20 2a 29   <sizeof(void *)
12a0: 20 70 4e 65 78 74 20 70 6f 69 6e 74 65 72 3e 0a   pNext pointer>.
12b0: 2a 2a 20 20 20 20 20 20 20 20 3c 73 69 7a 65 6f  **        <sizeo
12c0: 66 28 76 6f 69 64 20 2a 29 20 70 50 72 65 76 20  f(void *) pPrev 
12d0: 70 6f 69 6e 74 65 72 3e 0a 2a 2a 20 20 20 20 20  pointer>.**     
12e0: 20 20 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e 47     <TESTALLOC_NG
12f0: 55 41 52 44 20 33 32 2d 62 69 74 20 67 75 61 72  UARD 32-bit guar
1300: 64 20 77 6f 72 64 73 3e 0a 2a 2a 20 20 20 20 20  d words>.**     
1310: 20 20 20 20 20 20 20 3c 54 68 65 20 61 70 70 6c         <The appl
1320: 69 63 61 74 69 6f 6e 20 6c 65 76 65 6c 20 61 6c  ication level al
1330: 6c 6f 63 61 74 69 6f 6e 3e 0a 2a 2a 20 20 20 20  location>.**    
1340: 20 20 20 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e      <TESTALLOC_N
1350: 47 55 41 52 44 20 33 32 2d 62 69 74 20 67 75 61  GUARD 32-bit gua
1360: 72 64 20 77 6f 72 64 73 3e 0a 2a 2a 20 20 20 20  rd words>.**    
1370: 20 20 20 20 3c 33 32 2d 62 69 74 20 6c 69 6e 65      <32-bit line
1380: 20 6e 75 6d 62 65 72 3e 0a 2a 2a 20 20 20 20 20   number>.**     
1390: 20 20 20 3c 54 45 53 54 41 4c 4c 4f 43 5f 46 49     <TESTALLOC_FI
13a0: 4c 45 53 49 5a 45 20 62 79 74 65 73 20 63 6f 6e  LESIZE bytes con
13b0: 74 61 69 6e 69 6e 67 20 6e 75 6c 6c 2d 74 65 72  taining null-ter
13c0: 6d 69 6e 61 74 65 64 20 66 69 6c 65 20 6e 61 6d  minated file nam
13d0: 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 3c 54 45  e>.**        <TE
13e0: 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 53 49 5a  STALLOC_STACKSIZ
13f0: 45 20 62 79 74 65 73 20 6f 66 20 62 61 63 6b 74  E bytes of backt
1400: 72 61 63 65 28 29 20 6f 75 74 70 75 74 3e 0a 2a  race() output>.*
1410: 2f 20 0a 0a 23 64 65 66 69 6e 65 20 54 45 53 54  / ..#define TEST
1420: 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 47 55 41  ALLOC_OFFSET_GUA
1430: 52 44 31 28 70 29 20 20 20 20 28 73 69 7a 65 6f  RD1(p)    (sizeo
1440: 66 28 76 6f 69 64 20 2a 29 20 2a 20 32 29 0a 23  f(void *) * 2).#
1450: 64 65 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43  define TESTALLOC
1460: 5f 4f 46 46 53 45 54 5f 44 41 54 41 28 70 29 20  _OFFSET_DATA(p) 
1470: 28 20 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43 5f  ( \.  TESTALLOC_
1480: 4f 46 46 53 45 54 5f 47 55 41 52 44 31 28 70 29  OFFSET_GUARD1(p)
1490: 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2a   + sizeof(u32) *
14a0: 20 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52   TESTALLOC_NGUAR
14b0: 44 20 5c 0a 29 0a 23 64 65 66 69 6e 65 20 54 45  D \.).#define TE
14c0: 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 47  STALLOC_OFFSET_G
14d0: 55 41 52 44 32 28 70 29 20 28 20 5c 0a 20 20 54  UARD2(p) ( \.  T
14e0: 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f  ESTALLOC_OFFSET_
14f0: 44 41 54 41 28 70 29 20 2b 20 73 71 6c 69 74 65  DATA(p) + sqlite
1500: 33 4f 73 2e 78 41 6c 6c 6f 63 61 74 69 6f 6e 53  3Os.xAllocationS
1510: 69 7a 65 28 70 29 20 2d 20 54 45 53 54 41 4c 4c  ize(p) - TESTALL
1520: 4f 43 5f 4f 56 45 52 48 45 41 44 20 5c 0a 29 0a  OC_OVERHEAD \.).
1530: 23 64 65 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f  #define TESTALLO
1540: 43 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 55 4d  C_OFFSET_LINENUM
1550: 42 45 52 28 70 29 20 28 20 5c 0a 20 20 54 45 53  BER(p) ( \.  TES
1560: 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 47 55  TALLOC_OFFSET_GU
1570: 41 52 44 32 28 70 29 20 2b 20 73 69 7a 65 6f 66  ARD2(p) + sizeof
1580: 28 75 33 32 29 20 2a 20 54 45 53 54 41 4c 4c 4f  (u32) * TESTALLO
1590: 43 5f 4e 47 55 41 52 44 20 5c 0a 29 0a 23 64 65  C_NGUARD \.).#de
15a0: 66 69 6e 65 20 54 45 53 54 41 4c 4c 4f 43 5f 4f  fine TESTALLOC_O
15b0: 46 46 53 45 54 5f 46 49 4c 45 4e 41 4d 45 28 70  FFSET_FILENAME(p
15c0: 29 20 28 20 5c 0a 20 20 54 45 53 54 41 4c 4c 4f  ) ( \.  TESTALLO
15d0: 43 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 55 4d  C_OFFSET_LINENUM
15e0: 42 45 52 28 70 29 20 2b 20 73 69 7a 65 6f 66 28  BER(p) + sizeof(
15f0: 75 33 32 29 20 5c 0a 29 0a 23 64 65 66 69 6e 65  u32) \.).#define
1600: 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45   TESTALLOC_OFFSE
1610: 54 5f 55 53 45 52 28 70 29 20 28 20 5c 0a 20 20  T_USER(p) ( \.  
1620: 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54  TESTALLOC_OFFSET
1630: 5f 46 49 4c 45 4e 41 4d 45 28 70 29 20 2b 20 54  _FILENAME(p) + T
1640: 45 53 54 41 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a  ESTALLOC_FILESIZ
1650: 45 20 5c 0a 29 0a 23 64 65 66 69 6e 65 20 54 45  E \.).#define TE
1660: 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 53  STALLOC_OFFSET_S
1670: 54 41 43 4b 28 70 29 20 28 20 5c 0a 20 20 54 45  TACK(p) ( \.  TE
1680: 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 55  STALLOC_OFFSET_U
1690: 53 45 52 28 70 29 20 2b 20 54 45 53 54 41 4c 4c  SER(p) + TESTALL
16a0: 4f 43 5f 55 53 45 52 53 49 5a 45 20 2b 20 38 20  OC_USERSIZE + 8 
16b0: 2d 20 5c 0a 20 20 28 54 45 53 54 41 4c 4c 4f 43  - \.  (TESTALLOC
16c0: 5f 4f 46 46 53 45 54 5f 55 53 45 52 28 70 29 20  _OFFSET_USER(p) 
16d0: 25 20 38 29 20 5c 0a 29 0a 0a 23 64 65 66 69 6e  % 8) \.)..#defin
16e0: 65 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 56 45 52  e TESTALLOC_OVER
16f0: 48 45 41 44 20 28 20 5c 0a 20 20 73 69 7a 65 6f  HEAD ( \.  sizeo
1700: 66 28 76 6f 69 64 20 2a 29 2a 32 20 2b 20 20 20  f(void *)*2 +   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 2f 2a 20 70 50 72 65 76 20 61 6e 64 20 70 4e 65  /* pPrev and pNe
1730: 78 74 20 70 6f 69 6e 74 65 72 73 20 2a 2f 20 20  xt pointers */  
1740: 20 5c 0a 20 20 54 45 53 54 41 4c 4c 4f 43 5f 4e   \.  TESTALLOC_N
1750: 47 55 41 52 44 2a 73 69 7a 65 6f 66 28 75 33 32  GUARD*sizeof(u32
1760: 29 2a 32 20 2b 20 20 20 20 20 20 20 20 20 20 20  )*2 +           
1770: 20 20 20 2f 2a 20 47 75 61 72 64 20 77 6f 72 64     /* Guard word
1780: 73 20 2a 2f 20 20 20 20 20 20 20 5c 0a 20 20 73  s */       \.  s
1790: 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 54 45 53  izeof(u32) + TES
17a0: 54 41 4c 4c 4f 43 5f 46 49 4c 45 53 49 5a 45 20  TALLOC_FILESIZE 
17b0: 2b 20 20 20 2f 2a 20 46 69 6c 65 20 61 6e 64 20  +   /* File and 
17c0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 20 20  line number */  
17d0: 20 20 20 20 20 5c 0a 20 20 54 45 53 54 41 4c 4c       \.  TESTALL
17e0: 4f 43 5f 55 53 45 52 53 49 5a 45 20 2b 20 20 20  OC_USERSIZE +   
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1800: 20 55 73 65 72 20 73 74 72 69 6e 67 20 2a 2f 20   User string */ 
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1820: 0a 20 20 54 45 53 54 41 4c 4c 4f 43 5f 53 54 41  .  TESTALLOC_STA
1830: 43 4b 53 49 5a 45 20 20 20 20 20 20 20 20 20 20  CKSIZE          
1840: 20 20 20 20 20 20 20 20 2f 2a 20 62 61 63 6b 74          /* backt
1850: 72 61 63 65 28 29 20 73 74 61 63 6b 20 2a 2f 20  race() stack */ 
1860: 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 0a 2f           \.).../
1870: 2a 0a 2a 2a 20 46 6f 72 20 6b 65 65 70 69 6e 67  *.** For keeping
1880: 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75   track of the nu
1890: 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 73 20  mber of mallocs 
18a0: 61 6e 64 20 66 72 65 65 73 2e 20 20 20 54 68 69  and frees.   Thi
18b0: 73 0a 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20  s.** is used to 
18c0: 63 68 65 63 6b 20 66 6f 72 20 6d 65 6d 6f 72 79  check for memory
18d0: 20 6c 65 61 6b 73 2e 20 20 54 68 65 20 69 4d 61   leaks.  The iMa
18e0: 6c 6c 6f 63 46 61 69 6c 20 61 6e 64 20 69 4d 61  llocFail and iMa
18f0: 6c 6c 6f 63 52 65 73 65 74 0a 2a 2a 20 76 61 6c  llocReset.** val
1900: 75 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  ues are used to 
1910: 73 69 6d 75 6c 61 74 65 20 6d 61 6c 6c 6f 63 28  simulate malloc(
1920: 29 20 66 61 69 6c 75 72 65 73 20 64 75 72 69 6e  ) failures durin
1930: 67 20 74 65 73 74 69 6e 67 20 69 6e 20 0a 2a 2a  g testing in .**
1940: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
1950: 20 74 68 61 74 20 74 68 65 20 6c 69 62 72 61 72   that the librar
1960: 79 20 63 6f 72 72 65 63 74 6c 79 20 68 61 6e 64  y correctly hand
1970: 6c 65 73 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65  les an out-of-me
1980: 6d 6f 72 79 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  mory.** conditio
1990: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
19a0: 33 5f 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20  3_nMalloc;      
19b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 63  sqliteMalloc() c
19d0: 61 6c 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  alls */.int sqli
19e0: 74 65 33 5f 6e 46 72 65 65 3b 20 20 20 20 20 20  te3_nFree;      
19f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a00: 66 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 63  f sqliteFree() c
1a10: 61 6c 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  alls */.int sqli
1a20: 74 65 33 5f 6d 65 6d 55 73 65 64 3b 20 20 20 20  te3_memUsed;    
1a30: 20 20 20 20 20 2f 2a 20 54 4f 44 4f 20 54 6f 74       /* TODO Tot
1a40: 61 6c 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  al memory obtain
1a50: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a  ed from malloc *
1a60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65  /.int sqlite3_me
1a70: 6d 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20 2f  mMax;          /
1a80: 2a 20 54 4f 44 4f 20 4d 65 6d 20 75 73 61 67 65  * TODO Mem usage
1a90: 20 68 69 67 68 2d 77 61 74 65 72 20 6d 61 72 6b   high-water mark
1aa0: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
1ab0: 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 20 20 20 20  iMallocFail;    
1ac0: 20 2f 2a 20 46 61 69 6c 20 73 71 6c 69 74 65 4d   /* Fail sqliteM
1ad0: 61 6c 6c 6f 63 28 29 20 61 66 74 65 72 20 74 68  alloc() after th
1ae0: 69 73 20 6d 61 6e 79 20 63 61 6c 6c 73 20 2a 2f  is many calls */
1af0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 4d 61  .int sqlite3_iMa
1b00: 6c 6c 6f 63 52 65 73 65 74 20 3d 20 2d 31 3b 20  llocReset = -1; 
1b10: 2f 2a 20 57 68 65 6e 20 69 4d 61 6c 6c 6f 63 46  /* When iMallocF
1b20: 61 69 6c 20 72 65 61 63 68 65 73 20 30 2c 20 73  ail reaches 0, s
1b30: 65 74 20 74 6f 20 74 68 69 73 20 2a 2f 0a 0a 2f  et to this */../
1b40: 2a 0a 2a 2a 20 43 68 65 63 6b 20 66 6f 72 20 61  *.** Check for a
1b50: 20 73 69 6d 75 6c 61 74 65 64 20 6d 65 6d 6f 72   simulated memor
1b60: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
1b70: 6c 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 72  lure.  Return tr
1b80: 75 65 20 69 66 0a 2a 2a 20 74 68 65 20 66 61 69  ue if.** the fai
1b90: 6c 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73  lure should be s
1ba0: 69 6d 75 6c 61 74 65 64 2e 20 20 52 65 74 75 72  imulated.  Retur
1bb0: 6e 20 66 61 6c 73 65 20 74 6f 20 70 72 6f 63 65  n false to proce
1bc0: 65 64 20 61 73 20 6e 6f 72 6d 61 6c 2e 0a 2a 2f  ed as normal..*/
1bd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 61 69 6c  .static int fail
1be0: 4d 61 6c 6c 6f 63 28 29 7b 0a 20 20 53 71 6c 69  Malloc(){.  Sqli
1bf0: 74 65 54 73 64 20 2a 70 54 73 64 20 3d 20 73 71  teTsd *pTsd = sq
1c00: 6c 69 74 65 33 54 73 64 28 29 3b 0a 20 20 69 66  lite3Tsd();.  if
1c10: 28 20 70 54 73 64 2d 3e 69 73 46 61 69 6c 20 29  ( pTsd->isFail )
1c20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1c30: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1c40: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 3d 30  3_iMallocFail>=0
1c50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c60: 69 4d 61 6c 6c 6f 63 46 61 69 6c 2d 2d 3b 0a 20  iMallocFail--;. 
1c70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69     if( sqlite3_i
1c80: 4d 61 6c 6c 6f 63 46 61 69 6c 3d 3d 30 20 29 7b  MallocFail==0 ){
1c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
1ca0: 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 73 71 6c  MallocFail = sql
1cb0: 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 52 65 73 65  ite3_iMallocRese
1cc0: 74 3b 0a 20 20 20 20 20 20 70 54 73 64 2d 3e 69  t;.      pTsd->i
1cd0: 73 46 61 69 6c 20 3d 20 31 3b 0a 20 20 20 20 20  sFail = 1;.     
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1cf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1d10: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
1d20: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
1d30: 73 71 6c 69 74 65 33 4f 73 2e 78 4d 61 6c 6c 6f  sqlite3Os.xMallo
1d40: 63 28 29 20 6f 72 20 78 52 65 61 6c 6c 6f 63 28  c() or xRealloc(
1d50: 29 2e 0a 2a 2a 20 61 73 73 65 72 74 28 29 20 74  )..** assert() t
1d60: 68 61 74 20 74 68 65 20 66 69 72 73 74 20 61 6e  hat the first an
1d70: 64 20 6c 61 73 74 20 28 54 45 53 54 41 4c 4c 4f  d last (TESTALLO
1d80: 43 5f 4e 47 55 41 52 44 2a 34 29 20 62 79 74 65  C_NGUARD*4) byte
1d90: 73 20 61 72 65 20 73 65 74 20 74 6f 20 74 68 65  s are set to the
1da0: 0a 2a 2a 20 76 61 6c 75 65 73 20 73 65 74 20 62  .** values set b
1db0: 79 20 74 68 65 20 61 70 70 6c 79 47 75 61 72 64  y the applyGuard
1dc0: 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  s() function..*/
1dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
1de0: 63 6b 47 75 61 72 64 73 28 75 33 32 20 2a 70 29  ckGuards(u32 *p)
1df0: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  .{.  int i;.  ch
1e00: 61 72 20 2a 7a 41 6c 6c 6f 63 20 3d 20 28 63 68  ar *zAlloc = (ch
1e10: 61 72 20 2a 29 70 3b 0a 20 20 63 68 61 72 20 2a  ar *)p;.  char *
1e20: 7a 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  z;..  /* First s
1e30: 65 74 20 6f 66 20 67 75 61 72 64 20 77 6f 72 64  et of guard word
1e40: 73 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41 6c 6c  s */.  z = &zAll
1e50: 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46  oc[TESTALLOC_OFF
1e60: 53 45 54 5f 47 55 41 52 44 31 28 70 29 5d 3b 0a  SET_GUARD1(p)];.
1e70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53    for(i=0; i<TES
1e80: 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 3b 20 69  TALLOC_NGUARD; i
1e90: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
1ea0: 28 28 75 33 32 20 2a 29 7a 29 5b 69 5d 3d 3d 30  ((u32 *)z)[i]==0
1eb0: 78 64 65 61 64 31 31 32 32 29 3b 0a 20 20 7d 0a  xdead1122);.  }.
1ec0: 0a 20 20 2f 2a 20 53 65 63 6f 6e 64 20 73 65 74  .  /* Second set
1ed0: 20 6f 66 20 67 75 61 72 64 20 77 6f 72 64 73 20   of guard words 
1ee0: 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63  */.  z = &zAlloc
1ef0: 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45  [TESTALLOC_OFFSE
1f00: 54 5f 47 55 41 52 44 32 28 70 29 5d 3b 0a 20 20  T_GUARD2(p)];.  
1f10: 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53 54 41  for(i=0; i<TESTA
1f20: 4c 4c 4f 43 5f 4e 47 55 41 52 44 3b 20 69 2b 2b  LLOC_NGUARD; i++
1f30: 29 7b 0a 20 20 20 20 75 33 32 20 67 75 61 72 64  ){.    u32 guard
1f40: 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79   = 0;.    memcpy
1f50: 28 26 67 75 61 72 64 2c 20 26 7a 5b 69 2a 73 69  (&guard, &z[i*si
1f60: 7a 65 6f 66 28 75 33 32 29 5d 2c 20 73 69 7a 65  zeof(u32)], size
1f70: 6f 66 28 75 33 32 29 29 3b 0a 20 20 20 20 61 73  of(u32));.    as
1f80: 73 65 72 74 28 67 75 61 72 64 3d 3d 30 78 64 65  sert(guard==0xde
1f90: 61 64 33 33 34 34 29 3b 0a 20 20 7d 0a 7d 0a 0a  ad3344);.  }.}..
1fa0: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
1fb0: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1fc0: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1fd0: 74 65 33 4f 73 2e 78 4d 61 6c 6c 6f 63 28 29 20  te3Os.xMalloc() 
1fe0: 6f 72 20 52 65 61 6c 6c 6f 63 28 29 2e 20 54 68  or Realloc(). Th
1ff0: 65 0a 2a 2a 20 66 69 72 73 74 20 61 6e 64 20 6c  e.** first and l
2000: 61 73 74 20 28 54 45 53 54 41 4c 4c 4f 43 5f 4e  ast (TESTALLOC_N
2010: 47 55 41 52 44 2a 34 29 20 62 79 74 65 73 20 61  GUARD*4) bytes a
2020: 72 65 20 73 65 74 20 74 6f 20 6b 6e 6f 77 6e 20  re set to known 
2030: 76 61 6c 75 65 73 20 66 6f 72 20 75 73 65 20 61  values for use a
2040: 73 20 0a 2a 2a 20 67 75 61 72 64 2d 70 6f 73 74  s .** guard-post
2050: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2060: 64 20 61 70 70 6c 79 47 75 61 72 64 73 28 75 33  d applyGuards(u3
2070: 32 20 2a 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  2 *p).{.  int i;
2080: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68  .  char *z;.  ch
2090: 61 72 20 2a 7a 41 6c 6c 6f 63 20 3d 20 28 63 68  ar *zAlloc = (ch
20a0: 61 72 20 2a 29 70 3b 0a 0a 20 20 2f 2a 20 46 69  ar *)p;..  /* Fi
20b0: 72 73 74 20 73 65 74 20 6f 66 20 67 75 61 72 64  rst set of guard
20c0: 20 77 6f 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20   words */.  z = 
20d0: 26 7a 41 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f  &zAlloc[TESTALLO
20e0: 43 5f 4f 46 46 53 45 54 5f 47 55 41 52 44 31 28  C_OFFSET_GUARD1(
20f0: 70 29 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  p)];.  for(i=0; 
2100: 69 3c 54 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41  i<TESTALLOC_NGUA
2110: 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 28 28  RD; i++){.    ((
2120: 75 33 32 20 2a 29 7a 29 5b 69 5d 20 3d 20 30 78  u32 *)z)[i] = 0x
2130: 64 65 61 64 31 31 32 32 3b 0a 20 20 7d 0a 0a 20  dead1122;.  }.. 
2140: 20 2f 2a 20 53 65 63 6f 6e 64 20 73 65 74 20 6f   /* Second set o
2150: 66 20 67 75 61 72 64 20 77 6f 72 64 73 20 2a 2f  f guard words */
2160: 0a 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54  .  z = &zAlloc[T
2170: 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f  ESTALLOC_OFFSET_
2180: 47 55 41 52 44 32 28 70 29 5d 3b 0a 20 20 66 6f  GUARD2(p)];.  fo
2190: 72 28 69 3d 30 3b 20 69 3c 54 45 53 54 41 4c 4c  r(i=0; i<TESTALL
21a0: 4f 43 5f 4e 47 55 41 52 44 3b 20 69 2b 2b 29 7b  OC_NGUARD; i++){
21b0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
21c0: 74 20 69 6e 74 20 67 75 61 72 64 20 3d 20 30 78  t int guard = 0x
21d0: 64 65 61 64 33 33 34 34 3b 0a 20 20 20 20 6d 65  dead3344;.    me
21e0: 6d 63 70 79 28 26 7a 5b 69 2a 73 69 7a 65 6f 66  mcpy(&z[i*sizeof
21f0: 28 75 33 32 29 5d 2c 20 26 67 75 61 72 64 2c 20  (u32)], &guard, 
2200: 73 69 7a 65 6f 66 28 75 33 32 29 29 3b 0a 20 20  sizeof(u32));.  
2210: 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d  }..  /* Line num
2220: 62 65 72 20 2a 2f 0a 20 20 7a 20 3d 20 26 28 28  ber */.  z = &((
2230: 63 68 61 72 20 2a 29 7a 29 5b 54 45 53 54 41 4c  char *)z)[TESTAL
2240: 4c 4f 43 5f 4e 47 55 41 52 44 2a 73 69 7a 65 6f  LOC_NGUARD*sizeo
2250: 66 28 75 33 32 29 5d 3b 20 20 20 20 20 20 20 20  f(u32)];        
2260: 20 20 20 20 20 2f 2a 20 47 75 61 72 64 20 77 6f       /* Guard wo
2270: 72 64 73 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41  rds */.  z = &zA
2280: 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f  lloc[TESTALLOC_O
2290: 46 46 53 45 54 5f 4c 49 4e 45 4e 55 4d 42 45 52  FFSET_LINENUMBER
22a0: 28 70 29 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  (p)];.  memcpy(z
22b0: 2c 20 26 73 71 6c 69 74 65 33 54 73 64 28 29 2d  , &sqlite3Tsd()-
22c0: 3e 69 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 75  >iLine, sizeof(u
22d0: 33 32 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 65  32));..  /* File
22e0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 7a 20 3d 20 26   name */.  z = &
22f0: 7a 41 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43  zAlloc[TESTALLOC
2300: 5f 4f 46 46 53 45 54 5f 46 49 4c 45 4e 41 4d 45  _OFFSET_FILENAME
2310: 28 70 29 5d 3b 0a 20 20 73 74 72 6e 63 70 79 28  (p)];.  strncpy(
2320: 7a 2c 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d  z, sqlite3Tsd()-
2330: 3e 7a 46 69 6c 65 2c 20 54 45 53 54 41 4c 4c 4f  >zFile, TESTALLO
2340: 43 5f 46 49 4c 45 53 49 5a 45 29 3b 0a 20 20 7a  C_FILESIZE);.  z
2350: 5b 54 45 53 54 41 4c 4c 4f 43 5f 46 49 4c 45 53  [TESTALLOC_FILES
2360: 49 5a 45 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  IZE - 1] = '\0';
2370: 0a 0a 20 20 2f 2a 20 55 73 65 72 20 73 74 72 69  ..  /* User stri
2380: 6e 67 20 2a 2f 0a 20 20 7a 20 3d 20 26 7a 41 6c  ng */.  z = &zAl
2390: 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46  loc[TESTALLOC_OF
23a0: 46 53 45 54 5f 55 53 45 52 28 70 29 5d 3b 0a 20  FSET_USER(p)];. 
23b0: 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28   z[0] = 0;.  if(
23c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
23d0: 69 64 20 29 7b 0a 20 20 20 20 73 74 72 6e 63 70  id ){.    strncp
23e0: 79 28 7a 2c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  y(z, sqlite3_mal
23f0: 6c 6f 63 5f 69 64 2c 20 54 45 53 54 41 4c 4c 4f  loc_id, TESTALLO
2400: 43 5f 55 53 45 52 53 49 5a 45 29 3b 0a 20 20 20  C_USERSIZE);.   
2410: 20 7a 5b 54 45 53 54 41 4c 4c 4f 43 5f 55 53 45   z[TESTALLOC_USE
2420: 52 53 49 5a 45 2d 31 5d 20 3d 20 30 3b 0a 20 20  RSIZE-1] = 0;.  
2430: 7d 0a 0a 20 20 2f 2a 20 62 61 63 6b 74 72 61 63  }..  /* backtrac
2440: 65 28 29 20 73 74 61 63 6b 20 2a 2f 0a 20 20 7a  e() stack */.  z
2450: 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54 45 53 54 41   = &zAlloc[TESTA
2460: 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 53 54 41 43  LLOC_OFFSET_STAC
2470: 4b 28 70 29 5d 3b 0a 20 20 62 61 63 6b 74 72 61  K(p)];.  backtra
2480: 63 65 28 28 76 6f 69 64 20 2a 2a 29 7a 2c 20 54  ce((void **)z, T
2490: 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 46 52  ESTALLOC_STACKFR
24a0: 41 4d 45 53 29 3b 0a 0a 20 20 2f 2a 20 53 61 6e  AMES);..  /* San
24b0: 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ity check to mak
24c0: 65 20 73 75 72 65 20 63 68 65 63 6b 47 75 61 72  e sure checkGuar
24d0: 64 73 28 29 20 69 73 20 77 6f 72 6b 69 6e 67 20  ds() is working 
24e0: 2a 2f 0a 20 20 63 68 65 63 6b 47 75 61 72 64 73  */.  checkGuards
24f0: 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  (p);.}..static v
2500: 6f 69 64 20 2a 67 65 74 4f 73 50 6f 69 6e 74 65  oid *getOsPointe
2510: 72 28 76 6f 69 64 20 2a 70 29 0a 7b 0a 20 20 63  r(void *p).{.  c
2520: 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 20 2a  har *z = (char *
2530: 29 70 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  )p;.  return (vo
2540: 69 64 20 2a 29 28 26 7a 5b 2d 31 20 2a 20 54 45  id *)(&z[-1 * TE
2550: 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f 44  STALLOC_OFFSET_D
2560: 41 54 41 28 70 29 5d 29 3b 0a 7d 0a 0a 0a 23 69  ATA(p)]);.}...#i
2570: 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  f SQLITE_MEMDEBU
2580: 47 3e 31 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  G>1./*.** The ar
2590: 67 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f  gument points to
25a0: 20 61 6e 20 4f 73 20 6c 65 76 65 6c 20 61 6c 6c   an Os level all
25b0: 6f 63 61 74 69 6f 6e 2e 20 4c 69 6e 6b 20 69 74  ocation. Link it
25c0: 20 69 6e 74 6f 20 74 68 65 20 74 68 72 65 61 64   into the thread
25d0: 73 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c  s list.** of all
25e0: 6f 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  ocations..*/.sta
25f0: 74 69 63 20 76 6f 69 64 20 6c 69 6e 6b 41 6c 6c  tic void linkAll
2600: 6f 63 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 53  oc(void *p){.  S
2610: 71 6c 69 74 65 54 73 64 20 2a 70 54 73 64 20 3d  qliteTsd *pTsd =
2620: 20 73 71 6c 69 74 65 33 54 73 64 28 29 3b 0a 20   sqlite3Tsd();. 
2630: 20 76 6f 69 64 20 2a 2a 70 70 20 3d 20 28 76 6f   void **pp = (vo
2640: 69 64 20 2a 2a 29 70 3b 0a 20 20 70 70 5b 30 5d  id **)p;.  pp[0]
2650: 20 3d 20 30 3b 0a 20 20 70 70 5b 31 5d 20 3d 20   = 0;.  pp[1] = 
2660: 70 54 73 64 2d 3e 70 46 69 72 73 74 3b 0a 20 20  pTsd->pFirst;.  
2670: 69 66 28 20 70 54 73 64 2d 3e 70 46 69 72 73 74  if( pTsd->pFirst
2680: 20 29 7b 0a 20 20 20 20 28 28 76 6f 69 64 20 2a   ){.    ((void *
2690: 2a 29 70 54 73 64 2d 3e 70 46 69 72 73 74 29 5b  *)pTsd->pFirst)[
26a0: 30 5d 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 54  0] = p;.  }.  pT
26b0: 73 64 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  sd->pFirst = p;.
26c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
26d0: 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20  ument points to 
26e0: 61 6e 20 4f 73 20 6c 65 76 65 6c 20 61 6c 6c 6f  an Os level allo
26f0: 63 61 74 69 6f 6e 2e 20 55 6e 6c 69 6e 6b 65 20  cation. Unlinke 
2700: 69 74 20 66 72 6f 6d 20 74 68 65 20 74 68 72 65  it from the thre
2710: 61 64 73 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61  ads.** list of a
2720: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73  llocations..*/.s
2730: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
2740: 6b 41 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 29 0a  kAlloc(void *p).
2750: 7b 0a 20 20 53 71 6c 69 74 65 54 73 64 20 2a 70  {.  SqliteTsd *p
2760: 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 73 64  Tsd = sqlite3Tsd
2770: 28 29 3b 0a 20 20 76 6f 69 64 20 2a 2a 70 70 20  ();.  void **pp 
2780: 3d 20 28 76 6f 69 64 20 2a 2a 29 70 3b 0a 20 20  = (void **)p;.  
2790: 69 66 28 20 70 3d 3d 70 54 73 64 2d 3e 70 46 69  if( p==pTsd->pFi
27a0: 72 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rst ){.    asser
27b0: 74 28 21 70 70 5b 30 5d 29 3b 0a 20 20 20 20 61  t(!pp[0]);.    a
27c0: 73 73 65 72 74 28 21 70 70 5b 31 5d 20 7c 7c 20  ssert(!pp[1] || 
27d0: 28 28 76 6f 69 64 20 2a 2a 29 28 70 70 5b 31 5d  ((void **)(pp[1]
27e0: 29 29 5b 30 5d 3d 3d 70 29 3b 0a 20 20 20 20 70  ))[0]==p);.    p
27f0: 54 73 64 2d 3e 70 46 69 72 73 74 20 3d 20 70 70  Tsd->pFirst = pp
2800: 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 73  [1];.    if( pTs
2810: 64 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20 20  d->pFirst ){.   
2820: 20 20 20 28 28 76 6f 69 64 20 2a 2a 29 70 54 73     ((void **)pTs
2830: 64 2d 3e 70 46 69 72 73 74 29 5b 30 5d 20 3d 20  d->pFirst)[0] = 
2840: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
2850: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 70 70 72  {.    void **ppr
2860: 65 76 20 3d 20 70 70 5b 30 5d 3b 0a 20 20 20 20  ev = pp[0];.    
2870: 76 6f 69 64 20 2a 2a 70 6e 65 78 74 20 3d 20 70  void **pnext = p
2880: 70 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  p[1];.    assert
2890: 28 70 70 72 65 76 29 3b 0a 20 20 20 20 61 73 73  (pprev);.    ass
28a0: 65 72 74 28 70 70 72 65 76 5b 31 5d 3d 3d 70 29  ert(pprev[1]==p)
28b0: 3b 0a 20 20 20 20 70 70 72 65 76 5b 31 5d 20 3d  ;.    pprev[1] =
28c0: 20 28 76 6f 69 64 20 2a 29 70 6e 65 78 74 3b 0a   (void *)pnext;.
28d0: 20 20 20 20 69 66 28 20 70 6e 65 78 74 20 29 7b      if( pnext ){
28e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 6e  .      assert(pn
28f0: 65 78 74 5b 30 5d 3d 3d 70 29 3b 0a 20 20 20 20  ext[0]==p);.    
2900: 20 20 70 6e 65 78 74 5b 30 5d 20 3d 20 28 76 6f    pnext[0] = (vo
2910: 69 64 20 2a 29 70 70 72 65 76 3b 0a 20 20 20 20  id *)pprev;.    
2920: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
2930: 6f 69 6e 74 65 72 20 70 20 69 73 20 61 20 70 6f  ointer p is a po
2940: 69 6e 74 65 72 20 74 6f 20 61 6e 20 4f 53 20 6c  inter to an OS l
2950: 65 76 65 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  evel allocation 
2960: 74 68 61 74 20 68 61 73 20 6a 75 73 74 20 62 65  that has just be
2970: 65 6e 0a 2a 2a 20 72 65 61 6c 6c 6f 63 28 29 65  en.** realloc()e
2980: 64 2e 20 53 65 74 20 74 68 65 20 6c 69 73 74 20  d. Set the list 
2990: 70 6f 69 6e 74 65 72 73 20 74 68 61 74 20 70 6f  pointers that po
29a0: 69 6e 74 20 74 6f 20 74 68 69 73 20 65 6e 74 72  int to this entr
29b0: 79 20 74 6f 20 69 74 27 73 20 6e 65 77 0a 2a 2a  y to it's new.**
29c0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   location..*/.st
29d0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 69 6e 6b  atic void relink
29e0: 41 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 29 0a 7b  Alloc(void *p).{
29f0: 0a 20 20 76 6f 69 64 20 2a 2a 70 70 20 3d 20 28  .  void **pp = (
2a00: 76 6f 69 64 20 2a 2a 29 70 3b 0a 20 20 69 66 28  void **)p;.  if(
2a10: 20 70 70 5b 30 5d 20 29 7b 0a 20 20 20 20 28 28   pp[0] ){.    ((
2a20: 76 6f 69 64 20 2a 2a 29 28 70 70 5b 30 5d 29 29  void **)(pp[0]))
2a30: 5b 31 5d 20 3d 20 70 3b 0a 20 20 7d 65 6c 73 65  [1] = p;.  }else
2a40: 7b 0a 20 20 20 20 53 71 6c 69 74 65 54 73 64 20  {.    SqliteTsd 
2a50: 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54  *pTsd = sqlite3T
2a60: 73 64 28 29 3b 0a 20 20 20 20 70 54 73 64 2d 3e  sd();.    pTsd->
2a70: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 7d 0a  pFirst = p;.  }.
2a80: 20 20 69 66 28 20 70 70 5b 31 5d 20 29 7b 0a 20    if( pp[1] ){. 
2a90: 20 20 20 28 28 76 6f 69 64 20 2a 2a 29 28 70 70     ((void **)(pp
2aa0: 5b 31 5d 29 29 5b 30 5d 20 3d 20 70 3b 0a 20 20  [1]))[0] = p;.  
2ab0: 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
2ac0: 65 20 6c 69 6e 6b 41 6c 6c 6f 63 28 78 29 0a 23  e linkAlloc(x).#
2ad0: 64 65 66 69 6e 65 20 72 65 6c 69 6e 6b 41 6c 6c  define relinkAll
2ae0: 6f 63 28 78 29 0a 23 64 65 66 69 6e 65 20 75 6e  oc(x).#define un
2af0: 6c 69 6e 6b 41 6c 6c 6f 63 28 78 29 0a 23 65 6e  linkAlloc(x).#en
2b00: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
2b10: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
2b20: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
2b30: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20  Tcl interpreter 
2b40: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
2b50: 75 6d 65 6e 74 0a 2a 2a 20 74 6f 20 61 20 6c 69  ument.** to a li
2b60: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  st containing an
2b70: 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
2b80: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
2b90: 6e 64 69 6e 67 20 63 61 6c 6c 20 6d 61 64 65 20  nding call made 
2ba0: 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 4d 61 6c  to .** sqliteMal
2bb0: 6c 6f 63 20 61 6e 64 20 66 72 69 65 6e 64 73 20  loc and friends 
2bc0: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
2bd0: 68 72 65 61 64 2e 20 45 61 63 68 20 6c 69 73 74  hread. Each list
2be0: 20 65 6e 74 72 79 20 69 73 20 69 74 73 65 6c 66   entry is itself
2bf0: 20 61 0a 2a 2a 20 6c 69 73 74 2c 20 63 6f 6e 73   a.** list, cons
2c00: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 66 6f  isting of the fo
2c10: 6c 6c 6f 77 69 6e 67 20 28 69 6e 20 6f 72 64 65  llowing (in orde
2c20: 72 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  r):.**.**     * 
2c30: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
2c40: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  tes allocated.**
2c50: 20 20 20 20 20 2a 20 54 68 65 20 5f 5f 46 49 4c       * The __FIL
2c60: 45 5f 5f 20 6d 61 63 72 6f 20 61 74 20 74 68 65  E__ macro at the
2c70: 20 74 69 6d 65 20 6f 66 20 74 68 65 20 73 71 6c   time of the sql
2c80: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c  iteMalloc() call
2c90: 2e 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20 5f  ..**     * The _
2ca0: 5f 4c 49 4e 45 5f 5f 20 6d 61 63 72 6f 20 2e 2e  _LINE__ macro ..
2cb0: 2e 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20 76  ..**     * The v
2cc0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 71 6c 69  alue of the sqli
2cd0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 69 64 20 76 61  te3_malloc_id va
2ce0: 72 69 61 62 6c 65 20 2e 2e 2e 0a 2a 2a 20 20 20  riable ....**   
2cf0: 20 20 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6f    * The output o
2d00: 66 20 62 61 63 6b 74 72 61 63 65 28 29 20 28 69  f backtrace() (i
2d10: 66 20 61 76 61 69 6c 61 62 6c 65 29 20 2e 2e 2e  f available) ...
2d20: 0a 2a 2a 0a 2a 2a 20 54 6f 64 6f 3a 20 57 65 20  .**.** Todo: We 
2d30: 63 6f 75 6c 64 20 68 61 76 65 20 61 20 76 65 72  could have a ver
2d40: 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 75 6e  sion of this fun
2d50: 63 74 69 6f 6e 20 74 68 61 74 20 6f 75 74 70 75  ction that outpu
2d60: 74 73 20 74 6f 20 73 74 64 6f 75 74 2c 20 0a 2a  ts to stdout, .*
2d70: 2a 20 74 6f 20 64 65 62 75 67 20 6d 65 6d 6f 72  * to debug memor
2d80: 79 20 6c 65 61 6b 73 20 77 68 65 6e 20 54 63 6c  y leaks when Tcl
2d90: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
2da0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 54 43 4c  e..*/.#ifdef TCL
2db0: 53 48 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c  SH.#include <tcl
2dc0: 2e 68 3e 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .h>.int sqlite3O
2dd0: 75 74 73 74 61 6e 64 69 6e 67 4d 61 6c 6c 6f 63  utstandingMalloc
2de0: 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  s(Tcl_Interp *in
2df0: 74 65 72 70 29 7b 0a 20 20 76 6f 69 64 20 2a 70  terp){.  void *p
2e00: 3b 0a 20 20 53 71 6c 69 74 65 54 73 64 20 2a 70  ;.  SqliteTsd *p
2e10: 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 73 64  Tsd = sqlite3Tsd
2e20: 28 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ();.  Tcl_Obj *p
2e30: 52 65 73 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Res = Tcl_NewObj
2e40: 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  ();.  Tcl_IncrRe
2e50: 66 43 6f 75 6e 74 28 70 52 65 73 29 3b 0a 0a 20  fCount(pRes);.. 
2e60: 20 66 6f 72 28 70 3d 70 54 73 64 2d 3e 70 46 69   for(p=pTsd->pFi
2e70: 72 73 74 3b 20 70 3b 20 70 3d 28 28 76 6f 69 64  rst; p; p=((void
2e80: 20 2a 2a 29 70 29 5b 31 5d 29 7b 0a 20 20 20 20   **)p)[1]){.    
2e90: 54 63 6c 5f 4f 62 6a 20 2a 70 45 6e 74 72 79 20  Tcl_Obj *pEntry 
2ea0: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
2eb0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74      Tcl_Obj *pSt
2ec0: 61 63 6b 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ack = Tcl_NewObj
2ed0: 28 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  ();.    char *z;
2ee0: 0a 20 20 20 20 75 33 32 20 69 4c 69 6e 65 3b 0a  .    u32 iLine;.
2ef0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d      int nBytes =
2f00: 20 73 71 6c 69 74 65 33 4f 73 2e 78 41 6c 6c 6f   sqlite3Os.xAllo
2f10: 63 61 74 69 6f 6e 53 69 7a 65 28 70 29 20 2d 20  cationSize(p) - 
2f20: 54 45 53 54 41 4c 4c 4f 43 5f 4f 56 45 52 48 45  TESTALLOC_OVERHE
2f30: 41 44 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41  AD;.    char *zA
2f40: 6c 6c 6f 63 20 3d 20 28 63 68 61 72 20 2a 29 70  lloc = (char *)p
2f50: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ;.    int i;..  
2f60: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2f70: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45  endElement(0, pE
2f80: 6e 74 72 79 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  ntry, Tcl_NewInt
2f90: 4f 62 6a 28 6e 42 79 74 65 73 29 29 3b 0a 0a 20  Obj(nBytes));.. 
2fa0: 20 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63 5b 54     z = &zAlloc[T
2fb0: 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45 54 5f  ESTALLOC_OFFSET_
2fc0: 46 49 4c 45 4e 41 4d 45 28 70 29 5d 3b 0a 20 20  FILENAME(p)];.  
2fd0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2fe0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45  endElement(0, pE
2ff0: 6e 74 72 79 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ntry, Tcl_NewStr
3000: 69 6e 67 4f 62 6a 28 7a 2c 20 2d 31 29 29 3b 0a  ingObj(z, -1));.
3010: 0a 20 20 20 20 7a 20 3d 20 26 7a 41 6c 6c 6f 63  .    z = &zAlloc
3020: 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46 46 53 45  [TESTALLOC_OFFSE
3030: 54 5f 4c 49 4e 45 4e 55 4d 42 45 52 28 70 29 5d  T_LINENUMBER(p)]
3040: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 69 4c  ;.    memcpy(&iL
3050: 69 6e 65 2c 20 7a 2c 20 73 69 7a 65 6f 66 28 75  ine, z, sizeof(u
3060: 33 32 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  32));.    Tcl_Li
3070: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3080: 6e 74 28 30 2c 20 70 45 6e 74 72 79 2c 20 54 63  nt(0, pEntry, Tc
3090: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 4c 69 6e  l_NewIntObj(iLin
30a0: 65 29 29 3b 0a 0a 20 20 20 20 7a 20 3d 20 26 7a  e));..    z = &z
30b0: 41 6c 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f  Alloc[TESTALLOC_
30c0: 4f 46 46 53 45 54 5f 55 53 45 52 28 70 29 5d 3b  OFFSET_USER(p)];
30d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
30e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
30f0: 20 70 45 6e 74 72 79 2c 20 54 63 6c 5f 4e 65 77   pEntry, Tcl_New
3100: 53 74 72 69 6e 67 4f 62 6a 28 7a 2c 20 2d 31 29  StringObj(z, -1)
3110: 29 3b 0a 0a 20 20 20 20 7a 20 3d 20 26 7a 41 6c  );..    z = &zAl
3120: 6c 6f 63 5b 54 45 53 54 41 4c 4c 4f 43 5f 4f 46  loc[TESTALLOC_OF
3130: 46 53 45 54 5f 53 54 41 43 4b 28 70 29 5d 3b 0a  FSET_STACK(p)];.
3140: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54      for(i=0; i<T
3150: 45 53 54 41 4c 4c 4f 43 5f 53 54 41 43 4b 46 52  ESTALLOC_STACKFR
3160: 41 4d 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  AMES; i++){.    
3170: 20 20 63 68 61 72 20 7a 48 65 78 5b 31 32 38 5d    char zHex[128]
3180: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
3190: 7a 48 65 78 2c 20 22 25 70 22 2c 20 28 28 76 6f  zHex, "%p", ((vo
31a0: 69 64 20 2a 2a 29 7a 29 5b 69 5d 29 3b 0a 20 20  id **)z)[i]);.  
31b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
31c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
31d0: 70 53 74 61 63 6b 2c 20 54 63 6c 5f 4e 65 77 53  pStack, Tcl_NewS
31e0: 74 72 69 6e 67 4f 62 6a 28 7a 48 65 78 2c 20 2d  tringObj(zHex, -
31f0: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1));.    }..    
3200: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3210: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6e 74  dElement(0, pEnt
3220: 72 79 2c 20 70 53 74 61 63 6b 29 3b 0a 20 20 20  ry, pStack);.   
3230: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3240: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
3250: 73 2c 20 70 45 6e 74 72 79 29 3b 0a 20 20 7d 0a  s, pEntry);.  }.
3260: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
3270: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 54 63  lt(interp);.  Tc
3280: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
3290: 6e 74 65 72 70 2c 20 70 52 65 73 29 3b 0a 20 20  nterp, pRes);.  
32a0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
32b0: 28 70 52 65 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pRes);.  return
32c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
32d0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  f../*.** This is
32e0: 20 74 68 65 20 74 65 73 74 20 6c 61 79 65 72 27   the test layer'
32f0: 73 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  s wrapper around
3300: 20 73 71 6c 69 74 65 33 4f 73 2e 78 4d 61 6c 6c   sqlite3Os.xMall
3310: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
3320: 76 6f 69 64 20 2a 20 4f 53 4d 41 4c 4c 4f 43 28  void * OSMALLOC(
3330: 69 6e 74 20 6e 29 7b 0a 23 69 66 6e 64 65 66 20  int n){.#ifndef 
3340: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
3350: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
3360: 53 71 6c 69 74 65 54 73 64 20 2a 70 54 73 64 20  SqliteTsd *pTsd 
3370: 3d 20 73 71 6c 69 74 65 33 54 73 64 28 29 3b 0a  = sqlite3Tsd();.
3380: 20 20 70 54 73 64 2d 3e 6e 4d 61 78 41 6c 6c 6f    pTsd->nMaxAllo
3390: 63 20 3d 20 4d 41 58 28 70 54 73 64 2d 3e 6e 4d  c = MAX(pTsd->nM
33a0: 61 78 41 6c 6c 6f 63 2c 20 70 54 73 64 2d 3e 6e  axAlloc, pTsd->n
33b0: 41 6c 6c 6f 63 29 3b 0a 23 65 6e 64 69 66 0a 20  Alloc);.#endif. 
33c0: 20 69 66 28 20 21 66 61 69 6c 4d 61 6c 6c 6f 63   if( !failMalloc
33d0: 28 29 20 29 7b 0a 20 20 20 20 75 33 32 20 2a 70  () ){.    u32 *p
33e0: 3b 0a 20 20 20 20 70 20 3d 20 28 75 33 32 20 2a  ;.    p = (u32 *
33f0: 29 73 71 6c 69 74 65 33 4f 73 2e 78 4d 61 6c 6c  )sqlite3Os.xMall
3400: 6f 63 28 6e 20 2b 20 54 45 53 54 41 4c 4c 4f 43  oc(n + TESTALLOC
3410: 5f 4f 56 45 52 48 45 41 44 29 3b 0a 20 20 20 20  _OVERHEAD);.    
3420: 61 73 73 65 72 74 28 70 29 3b 0a 20 20 20 20 73  assert(p);.    s
3430: 71 6c 69 74 65 33 5f 6e 4d 61 6c 6c 6f 63 2b 2b  qlite3_nMalloc++
3440: 3b 0a 20 20 20 20 61 70 70 6c 79 47 75 61 72 64  ;.    applyGuard
3450: 73 28 70 29 3b 0a 20 20 20 20 6c 69 6e 6b 41 6c  s(p);.    linkAl
3460: 6c 6f 63 28 70 29 3b 0a 20 20 20 20 72 65 74 75  loc(p);.    retu
3470: 72 6e 20 28 76 6f 69 64 20 2a 29 28 26 70 5b 54  rn (void *)(&p[T
3480: 45 53 54 41 4c 4c 4f 43 5f 4e 47 55 41 52 44 20  ESTALLOC_NGUARD 
3490: 2b 20 32 2a 73 69 7a 65 6f 66 28 76 6f 69 64 20  + 2*sizeof(void 
34a0: 2a 29 2f 73 69 7a 65 6f 66 28 75 33 32 29 5d 29  *)/sizeof(u32)])
34b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
34c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
34d0: 69 73 20 74 68 65 20 74 65 73 74 20 6c 61 79 65  is the test laye
34e0: 72 27 73 20 77 72 61 70 70 65 72 20 61 72 6f 75  r's wrapper arou
34f0: 6e 64 20 73 71 6c 69 74 65 33 4f 73 2e 78 46 72  nd sqlite3Os.xFr
3500: 65 65 28 29 2e 20 54 68 65 20 61 72 67 75 6d 65  ee(). The argume
3510: 6e 74 20 69 73 20 61 0a 2a 2a 20 70 6f 69 6e 74  nt is a.** point
3520: 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20  er to the space 
3530: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
3540: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 6f  e application to
3550: 20 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 4f 53   use..*/.void OS
3560: 46 52 45 45 28 76 6f 69 64 20 2a 70 46 72 65 65  FREE(void *pFree
3570: 29 7b 0a 20 20 75 33 32 20 2a 70 20 3d 20 28 75  ){.  u32 *p = (u
3580: 33 32 20 2a 29 67 65 74 4f 73 50 6f 69 6e 74 65  32 *)getOsPointe
3590: 72 28 70 46 72 65 65 29 3b 20 20 20 2f 2a 20 70  r(pFree);   /* p
35a0: 20 70 6f 69 6e 74 73 20 74 6f 20 4f 73 20 6c 65   points to Os le
35b0: 76 65 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  vel allocation *
35c0: 2f 0a 20 20 63 68 65 63 6b 47 75 61 72 64 73 28  /.  checkGuards(
35d0: 70 29 3b 0a 20 20 75 6e 6c 69 6e 6b 41 6c 6c 6f  p);.  unlinkAllo
35e0: 63 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  c(p);.  sqlite3O
35f0: 73 2e 78 46 72 65 65 28 70 29 3b 0a 20 20 73 71  s.xFree(p);.  sq
3600: 6c 69 74 65 33 5f 6e 46 72 65 65 2b 2b 3b 0a 7d  lite3_nFree++;.}
3610: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
3620: 74 68 65 20 74 65 73 74 20 6c 61 79 65 72 27 73  the test layer's
3630: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
3640: 73 71 6c 69 74 65 33 4f 73 2e 78 52 65 61 6c 6c  sqlite3Os.xReall
3650: 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 20  oc()..*/.void * 
3660: 4f 53 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20 2a  OSREALLOC(void *
3670: 70 52 65 61 6c 6c 6f 63 2c 20 69 6e 74 20 6e 29  pRealloc, int n)
3680: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
3690: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  _OMIT_MEMORY_MAN
36a0: 41 47 45 4d 45 4e 54 0a 20 20 53 71 6c 69 74 65  AGEMENT.  Sqlite
36b0: 54 73 64 20 2a 70 54 73 64 20 3d 20 73 71 6c 69  Tsd *pTsd = sqli
36c0: 74 65 33 54 73 64 28 29 3b 0a 20 20 70 54 73 64  te3Tsd();.  pTsd
36d0: 2d 3e 6e 4d 61 78 41 6c 6c 6f 63 20 3d 20 4d 41  ->nMaxAlloc = MA
36e0: 58 28 70 54 73 64 2d 3e 6e 4d 61 78 41 6c 6c 6f  X(pTsd->nMaxAllo
36f0: 63 2c 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 29  c, pTsd->nAlloc)
3700: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
3710: 66 61 69 6c 4d 61 6c 6c 6f 63 28 29 20 29 7b 0a  failMalloc() ){.
3720: 20 20 20 20 75 33 32 20 2a 70 20 3d 20 28 75 33      u32 *p = (u3
3730: 32 20 2a 29 67 65 74 4f 73 50 6f 69 6e 74 65 72  2 *)getOsPointer
3740: 28 70 52 65 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  (pRealloc);.    
3750: 63 68 65 63 6b 47 75 61 72 64 73 28 70 29 3b 0a  checkGuards(p);.
3760: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4f      p = sqlite3O
3770: 73 2e 78 52 65 61 6c 6c 6f 63 28 70 2c 20 6e 20  s.xRealloc(p, n 
3780: 2b 20 54 45 53 54 41 4c 4c 4f 43 5f 4f 56 45 52  + TESTALLOC_OVER
3790: 48 45 41 44 29 3b 0a 20 20 20 20 61 70 70 6c 79  HEAD);.    apply
37a0: 47 75 61 72 64 73 28 70 29 3b 0a 20 20 20 20 72  Guards(p);.    r
37b0: 65 6c 69 6e 6b 41 6c 6c 6f 63 28 70 29 3b 0a 20  elinkAlloc(p);. 
37c0: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
37d0: 2a 29 28 26 70 5b 54 45 53 54 41 4c 4c 4f 43 5f  *)(&p[TESTALLOC_
37e0: 4e 47 55 41 52 44 20 2b 20 32 2a 73 69 7a 65 6f  NGUARD + 2*sizeo
37f0: 66 28 76 6f 69 64 20 2a 29 2f 73 69 7a 65 6f 66  f(void *)/sizeof
3800: 28 75 33 32 29 5d 29 3b 0a 20 20 7d 0a 20 20 72  (u32)]);.  }.  r
3810: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 76 6f 69 64  eturn 0;.}..void
3820: 20 4f 53 4d 41 4c 4c 4f 43 5f 46 41 49 4c 45 44   OSMALLOC_FAILED
3830: 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 54 73 64  (){.  sqlite3Tsd
3840: 28 29 2d 3e 69 73 46 61 69 6c 20 3d 20 30 3b 0a  ()->isFail = 0;.
3850: 7d 0a 0a 69 6e 74 20 4f 53 53 49 5a 45 4f 46 28  }..int OSSIZEOF(
3860: 76 6f 69 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  void *p){.  if( 
3870: 70 20 29 7b 0a 20 20 20 20 75 33 32 20 2a 70 4f  p ){.    u32 *pO
3880: 73 20 3d 20 28 75 33 32 20 2a 29 67 65 74 4f 73  s = (u32 *)getOs
3890: 50 6f 69 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  Pointer(p);.    
38a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
38b0: 2e 78 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65  .xAllocationSize
38c0: 28 70 4f 73 29 20 2d 20 54 45 53 54 41 4c 4c 4f  (pOs) - TESTALLO
38d0: 43 5f 4f 56 45 52 48 45 41 44 3b 0a 20 20 7d 0a  C_OVERHEAD;.  }.
38e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
38f0: 65 6c 73 65 0a 2f 2a 20 44 65 66 69 6e 65 20 6d  else./* Define m
3900: 61 63 72 6f 73 20 74 6f 20 63 61 6c 6c 20 74 68  acros to call th
3910: 65 20 73 71 6c 69 74 65 33 4f 73 2e 78 58 58 58  e sqlite3Os.xXXX
3920: 20 69 6e 74 65 72 66 61 63 65 20 64 69 72 65 63   interface direc
3930: 74 6c 79 20 69 66 20 0a 2a 2a 20 74 68 65 20 53  tly if .** the S
3940: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 6d  QLITE_MEMDEBUG m
3950: 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69  acro is not defi
3960: 6e 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ned..*/.#define 
3970: 4f 53 4d 41 4c 4c 4f 43 28 78 29 20 20 20 20 20  OSMALLOC(x)     
3980: 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 4d 61     sqlite3Os.xMa
3990: 6c 6c 6f 63 28 78 29 0a 23 64 65 66 69 6e 65 20  lloc(x).#define 
39a0: 4f 53 52 45 41 4c 4c 4f 43 28 78 2c 79 29 20 20  OSREALLOC(x,y)  
39b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 52 65     sqlite3Os.xRe
39c0: 61 6c 6c 6f 63 28 78 2c 79 29 0a 23 64 65 66 69  alloc(x,y).#defi
39d0: 6e 65 20 4f 53 46 52 45 45 28 78 29 20 20 20 20  ne OSFREE(x)    
39e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e        sqlite3Os.
39f0: 78 46 72 65 65 28 78 29 0a 23 64 65 66 69 6e 65  xFree(x).#define
3a00: 20 4f 53 53 49 5a 45 4f 46 28 78 29 20 20 20 20   OSSIZEOF(x)    
3a10: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 41      sqlite3Os.xA
3a20: 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 28 78 29  llocationSize(x)
3a30: 0a 23 64 65 66 69 6e 65 20 4f 53 4d 41 4c 4c 4f  .#define OSMALLO
3a40: 43 5f 46 41 49 4c 45 44 28 29 0a 0a 23 65 6e 64  C_FAILED()..#end
3a50: 69 66 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 63 6f 64  if./*.** End cod
3a60: 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  e for memory all
3a70: 6f 63 61 74 69 6f 6e 20 73 79 73 74 65 6d 20 74  ocation system t
3a80: 65 73 74 20 6c 61 79 65 72 2e 0a 2a 2a 2d 2d 2d  est layer..**---
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ad0: 2d 2d 2d 2d 2d 2d 2d 2a 2f 0a 0a 2f 2a 0a 2a 2a  -------*/../*.**
3ae0: 20 54 68 65 20 68 61 6e 64 6c 65 53 6f 66 74 4c   The handleSoftL
3af0: 69 6d 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  imit() function 
3b00: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3b10: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 0a 2a   each call to .*
3b20: 2a 20 73 71 6c 69 74 65 33 4f 73 2e 78 4d 61 6c  * sqlite3Os.xMal
3b30: 6c 6f 63 28 29 20 6f 72 20 78 52 65 61 6c 6c 6f  loc() or xReallo
3b40: 63 28 29 2e 20 54 68 65 20 70 61 72 61 6d 65 74  c(). The paramet
3b50: 65 72 20 27 6e 27 20 69 73 20 74 68 65 20 6e 75  er 'n' is the nu
3b60: 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 78 74 72 61  mber of.** extra
3b70: 20 62 79 74 65 73 20 61 62 6f 75 74 20 74 6f 20   bytes about to 
3b80: 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 28 66 6f  be allocated (fo
3b90: 72 20 52 65 61 6c 6c 6f 63 28 29 20 74 68 69 73  r Realloc() this
3ba0: 20 6d 65 61 6e 73 20 74 68 65 20 73 69 7a 65 20   means the size 
3bb0: 6f 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 61 6c  of the.** new al
3bc0: 6c 6f 63 61 74 69 6f 6e 20 6c 65 73 73 20 74 68  location less th
3bd0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 6c  e size of the ol
3be0: 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 29 2e 20 49  d allocation). I
3bf0: 66 20 74 68 65 20 65 78 74 72 61 20 61 6c 6c 6f  f the extra allo
3c00: 63 61 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20  cation.** means 
3c10: 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6d  that the total m
3c20: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
3c30: 74 6f 20 53 51 4c 69 74 65 20 69 6e 20 74 68 69  to SQLite in thi
3c40: 73 20 74 68 72 65 61 64 20 77 6f 75 6c 64 20 65  s thread would e
3c50: 78 63 65 65 64 0a 2a 2a 20 74 68 65 20 6c 69 6d  xceed.** the lim
3c60: 69 74 20 73 65 74 20 62 79 20 73 71 6c 69 74 65  it set by sqlite
3c70: 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
3c80: 74 28 29 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  t(), then sqlite
3c90: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
3ca0: 28 29 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  () is.** called 
3cb0: 74 6f 20 74 72 79 20 74 6f 20 61 76 6f 69 64 20  to try to avoid 
3cc0: 74 68 69 73 2e 20 4e 6f 20 69 6e 64 69 63 61 74  this. No indicat
3cd0: 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ion of whether o
3ce0: 72 20 6e 6f 74 20 74 68 69 73 20 69 73 0a 2a 2a  r not this is.**
3cf0: 20 73 75 63 63 65 73 73 66 75 6c 20 69 73 20 72   successful is r
3d00: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
3d10: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aller..**.** If 
3d20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
3d30: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 69 73  RY_MANAGEMENT is
3d40: 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66   defined, this f
3d50: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
3d60: 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  op..*/.#ifndef S
3d70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
3d80: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61  Y_MANAGEMENT.sta
3d90: 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 53  tic void handleS
3da0: 6f 66 74 4c 69 6d 69 74 28 69 6e 74 20 6e 29 7b  oftLimit(int n){
3db0: 0a 20 20 53 71 6c 69 74 65 54 73 64 20 2a 70 54  .  SqliteTsd *pT
3dc0: 73 64 20 3d 20 73 71 6c 69 74 65 33 54 73 64 28  sd = sqlite3Tsd(
3dd0: 29 3b 0a 20 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f  );.  pTsd->nAllo
3de0: 63 20 2b 3d 20 28 69 36 34 29 6e 3b 0a 20 20 69  c += (i64)n;.  i
3df0: 66 28 20 6e 3e 30 20 26 26 20 70 54 73 64 2d 3e  f( n>0 && pTsd->
3e00: 6e 53 6f 66 74 48 65 61 70 4c 69 6d 69 74 3e 30  nSoftHeapLimit>0
3e10: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
3e20: 54 73 64 2d 3e 6e 41 6c 6c 6f 63 3e 70 54 73 64  Tsd->nAlloc>pTsd
3e30: 2d 3e 6e 53 6f 66 74 48 65 61 70 4c 69 6d 69 74  ->nSoftHeapLimit
3e40: 20 26 26 20 73 71 6c 69 74 65 33 5f 72 65 6c 65   && sqlite3_rele
3e50: 61 73 65 5f 6d 65 6d 6f 72 79 28 6e 29 20 29 3b  ase_memory(n) );
3e60: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
3e70: 66 69 6e 65 20 68 61 6e 64 6c 65 53 6f 66 74 4c  fine handleSoftL
3e80: 69 6d 69 74 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  imit().#endif../
3e90: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
3ea0: 64 20 72 65 74 75 72 6e 20 4e 20 62 79 74 65 73  d return N bytes
3eb0: 20 6f 66 20 75 6e 69 6e 69 74 69 61 6c 69 73 65   of uninitialise
3ec0: 64 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  d memory by call
3ed0: 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  ing.** sqlite3Os
3ee0: 2e 78 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 74  .xMalloc(). If t
3ef0: 68 65 20 4d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c  he Malloc() call
3f00: 20 66 61 69 6c 73 2c 20 61 74 74 65 6d 70 74 20   fails, attempt 
3f10: 74 6f 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 0a  to free memory .
3f20: 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ** by calling sq
3f30: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
3f40: 6d 6f 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  mory()..*/.void 
3f50: 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61  *sqlite3MallocRa
3f60: 77 28 69 6e 74 20 6e 29 7b 0a 20 20 53 71 6c 69  w(int n){.  Sqli
3f70: 74 65 54 73 64 20 2a 70 54 73 64 20 3d 20 73 71  teTsd *pTsd = sq
3f80: 6c 69 74 65 33 54 73 64 28 29 3b 0a 20 20 76 6f  lite3Tsd();.  vo
3f90: 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 69 66 28  id *p = 0;.  if(
3fa0: 20 6e 3e 30 20 26 26 20 21 70 54 73 64 2d 3e 6d   n>0 && !pTsd->m
3fb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
3fc0: 20 20 20 68 61 6e 64 6c 65 53 6f 66 74 4c 69 6d     handleSoftLim
3fd0: 69 74 28 6e 29 3b 0a 20 20 20 20 77 68 69 6c 65  it(n);.    while
3fe0: 28 20 21 28 70 20 3d 20 4f 53 4d 41 4c 4c 4f 43  ( !(p = OSMALLOC
3ff0: 28 6e 29 29 20 26 26 20 73 71 6c 69 74 65 33 5f  (n)) && sqlite3_
4000: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 6e  release_memory(n
4010: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20  ) );.    if( !p 
4020: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
4030: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  he allocation fa
4040: 69 6c 65 64 2c 20 63 61 6c 6c 20 68 61 6e 64 6c  iled, call handl
4050: 65 53 6f 66 74 4c 69 6d 69 74 28 29 20 61 67 61  eSoftLimit() aga
4060: 69 6e 2c 20 74 68 69 73 20 74 69 6d 65 0a 20 20  in, this time.  
4070: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
4080: 61 64 64 69 74 69 76 65 20 69 6e 76 65 72 73 65  additive inverse
4090: 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
40a0: 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20   passed to .    
40b0: 20 20 2a 2a 20 68 61 6e 64 6c 65 53 6f 66 74 4c    ** handleSoftL
40c0: 69 6d 69 74 28 29 20 61 62 6f 76 65 2e 20 54 68  imit() above. Th
40d0: 69 73 20 69 73 20 73 6f 20 74 68 65 20 53 71 6c  is is so the Sql
40e0: 69 74 65 54 73 64 2e 6e 41 6c 6c 6f 63 20 76 61  iteTsd.nAlloc va
40f0: 72 69 61 62 6c 65 20 69 73 0a 20 20 20 20 20 20  riable is.      
4100: 2a 2a 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74  ** still correct
4110: 20 61 66 74 65 72 20 61 20 6d 61 6c 6c 6f 63 28   after a malloc(
4120: 29 20 66 61 69 6c 75 72 65 2e 20 0a 20 20 20 20  ) failure. .    
4130: 20 20 2a 2f 0a 20 20 20 20 20 20 68 61 6e 64 6c    */.      handl
4140: 65 53 6f 66 74 4c 69 6d 69 74 28 6e 20 2a 20 2d  eSoftLimit(n * -
4150: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4160: 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61  3Tsd()->mallocFa
4170: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
4180: 4f 53 4d 41 4c 4c 4f 43 5f 46 41 49 4c 45 44 28  OSMALLOC_FAILED(
4190: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
41a0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
41b0: 2a 20 52 65 73 69 7a 65 20 74 68 65 20 61 6c 6c  * Resize the all
41c0: 6f 63 61 74 69 6f 6e 20 61 74 20 70 20 74 6f 20  ocation at p to 
41d0: 6e 20 62 79 74 65 73 20 62 79 20 63 61 6c 6c 69  n bytes by calli
41e0: 6e 67 20 73 71 6c 69 74 65 33 4f 73 2e 78 52 65  ng sqlite3Os.xRe
41f0: 61 6c 6c 6f 63 28 29 2e 20 54 68 65 0a 2a 2a 20  alloc(). The.** 
4200: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
4210: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ew allocation is
4220: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
4230: 68 65 20 52 65 61 6c 6c 6f 63 28 29 20 63 61 6c  he Realloc() cal
4240: 6c 20 66 61 69 6c 73 2c 0a 2a 2a 20 61 74 74 65  l fails,.** atte
4250: 6d 70 74 20 74 6f 20 66 72 65 65 20 6d 65 6d 6f  mpt to free memo
4260: 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
4270: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
4280: 6d 6f 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  mory()..*/.void 
4290: 2a 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28  *sqlite3Realloc(
42a0: 76 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  void *p, int n){
42b0: 0a 20 20 53 71 6c 69 74 65 54 73 64 20 2a 70 54  .  SqliteTsd *pT
42c0: 73 64 20 3d 20 73 71 6c 69 74 65 33 54 73 64 28  sd = sqlite3Tsd(
42d0: 29 3b 0a 20 20 69 66 28 20 70 54 73 64 2d 3e 6d  );.  if( pTsd->m
42e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
42f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4300: 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ..  if( !p ){.  
4310: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4320: 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d 65 6c  Malloc(n);.  }el
4330: 73 65 7b 0a 20 20 20 20 76 6f 69 64 20 2a 6e 70  se{.    void *np
4340: 20 3d 20 30 3b 0a 20 20 20 20 68 61 6e 64 6c 65   = 0;.    handle
4350: 53 6f 66 74 4c 69 6d 69 74 28 6e 20 2d 20 4f 53  SoftLimit(n - OS
4360: 53 49 5a 45 4f 46 28 70 29 29 3b 0a 20 20 20 20  SIZEOF(p));.    
4370: 77 68 69 6c 65 28 20 21 28 6e 70 20 3d 20 4f 53  while( !(np = OS
4380: 52 45 41 4c 4c 4f 43 28 70 2c 20 6e 29 29 20 26  REALLOC(p, n)) &
4390: 26 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  & sqlite3_releas
43a0: 65 5f 6d 65 6d 6f 72 79 28 6e 29 20 29 3b 0a 20  e_memory(n) );. 
43b0: 20 20 20 69 66 28 20 21 6e 70 20 29 7b 0a 20 20     if( !np ){.  
43c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 6c      /* If the al
43d0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c  location failed,
43e0: 20 63 61 6c 6c 20 68 61 6e 64 6c 65 53 6f 66 74   call handleSoft
43f0: 4c 69 6d 69 74 28 29 20 61 67 61 69 6e 2c 20 74  Limit() again, t
4400: 68 69 73 20 74 69 6d 65 0a 20 20 20 20 20 20 2a  his time.      *
4410: 2a 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74  * with the addit
4420: 69 76 65 20 69 6e 76 65 72 73 65 20 6f 66 20 74  ive inverse of t
4430: 68 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  he argument pass
4440: 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
4450: 68 61 6e 64 6c 65 53 6f 66 74 4c 69 6d 69 74 28  handleSoftLimit(
4460: 29 20 61 62 6f 76 65 2e 20 54 68 69 73 20 69 73  ) above. This is
4470: 20 73 6f 20 74 68 65 20 53 71 6c 69 74 65 54 73   so the SqliteTs
4480: 64 2e 6e 41 6c 6c 6f 63 20 76 61 72 69 61 62 6c  d.nAlloc variabl
4490: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 74  e is.      ** st
44a0: 69 6c 6c 20 63 6f 72 72 65 63 74 20 61 66 74 65  ill correct afte
44b0: 72 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  r a malloc() fai
44c0: 6c 75 72 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  lure. .      */.
44d0: 20 20 20 20 20 20 68 61 6e 64 6c 65 53 6f 66 74        handleSoft
44e0: 4c 69 6d 69 74 28 4f 53 53 49 5a 45 4f 46 28 70  Limit(OSSIZEOF(p
44f0: 29 20 2d 20 6e 29 3b 0a 20 20 20 20 20 20 70 54  ) - n);.      pT
4500: 73 64 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  sd->mallocFailed
4510: 20 3d 20 31 3b 0a 20 20 20 20 20 20 4f 53 4d 41   = 1;.      OSMA
4520: 4c 4c 4f 43 5f 46 41 49 4c 45 44 28 29 3b 0a 20  LLOC_FAILED();. 
4530: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
4540: 6e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  np;.  }.}../*.**
4550: 20 46 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79   Free the memory
4560: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
4570: 2e 20 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  . p must be eith
4580: 65 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  er a NULL pointe
4590: 72 20 6f 72 20 61 20 0a 2a 2a 20 76 61 6c 75 65  r or a .** value
45a0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
45b0: 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
45c0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
45d0: 6f 72 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  or sqlite3Reallo
45e0: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
45f0: 69 74 65 33 46 72 65 65 58 28 76 6f 69 64 20 2a  ite3FreeX(void *
4600: 70 29 7b 0a 20 20 68 61 6e 64 6c 65 53 6f 66 74  p){.  handleSoft
4610: 4c 69 6d 69 74 28 30 20 2d 20 4f 53 53 49 5a 45  Limit(0 - OSSIZE
4620: 4f 46 28 70 29 29 3b 0a 20 20 69 66 28 20 70 20  OF(p));.  if( p 
4630: 29 7b 0a 20 20 20 20 4f 53 46 52 45 45 28 70 29  ){.    OSFREE(p)
4640: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
4650: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
4660: 74 65 4d 61 6c 6c 6f 63 28 29 20 74 68 61 74 20  teMalloc() that 
4670: 69 73 20 61 6c 77 61 79 73 20 61 20 66 75 6e 63  is always a func
4680: 74 69 6f 6e 2c 20 6e 6f 74 20 61 20 6d 61 63 72  tion, not a macr
4690: 6f 2e 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c  o..** Currently,
46a0: 20 74 68 69 73 20 69 73 20 75 73 65 64 20 6f 6e   this is used on
46b0: 6c 79 20 74 6f 20 61 6c 6c 6f 63 20 74 6f 20 61  ly to alloc to a
46c0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 61 72 73  llocate the pars
46d0: 65 72 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 76 6f  er engine..*/.vo
46e0: 69 64 20 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  id *sqlite3Mallo
46f0: 63 58 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74  cX(int n){.  ret
4700: 75 72 6e 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  urn sqliteMalloc
4710: 28 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71  (n);.}../*.** sq
4720: 6c 69 74 65 33 4d 61 6c 6c 6f 63 0a 2a 2a 20 73  lite3Malloc.** s
4730: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46  qlite3ReallocOrF
4740: 72 65 65 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ree.**.** These 
4750: 74 77 6f 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  two are implemen
4760: 74 65 64 20 61 73 20 77 72 61 70 70 65 72 73 20  ted as wrappers 
4770: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4d 61  around sqlite3Ma
4780: 6c 6c 6f 63 52 61 77 28 29 2c 20 0a 2a 2a 20 73  llocRaw(), .** s
4790: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 29 20  qlite3Realloc() 
47a0: 61 6e 64 20 73 71 6c 69 74 65 33 46 72 65 65 28  and sqlite3Free(
47b0: 29 2e 0a 2a 2f 20 0a 76 6f 69 64 20 2a 73 71 6c  )..*/ .void *sql
47c0: 69 74 65 33 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  ite3Malloc(int n
47d0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 73  ){.  void *p = s
47e0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28  qlite3MallocRaw(
47f0: 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  n);.  if( p ){. 
4800: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
4810: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
4820: 20 70 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   p;.}.void sqlit
4830: 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  e3ReallocOrFree(
4840: 76 6f 69 64 20 2a 2a 70 70 2c 20 69 6e 74 20 6e  void **pp, int n
4850: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 73  ){.  void *p = s
4860: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 2a 70  qlite3Realloc(*p
4870: 70 2c 20 6e 29 3b 0a 20 20 69 66 28 20 21 70 20  p, n);.  if( !p 
4880: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72  ){.    sqlite3Fr
4890: 65 65 58 28 2a 70 70 29 3b 0a 20 20 7d 0a 20 20  eeX(*pp);.  }.  
48a0: 2a 70 70 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  *pp = p;.}../*.*
48b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
48c0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c  ber of bytes all
48d0: 6f 63 61 74 65 64 20 61 74 20 6c 6f 63 61 74 69  ocated at locati
48e0: 6f 6e 20 70 2e 20 70 20 6d 75 73 74 20 62 65 20  on p. p must be 
48f0: 65 69 74 68 65 72 20 0a 2a 2a 20 61 20 4e 55 4c  either .** a NUL
4900: 4c 20 70 6f 69 6e 74 65 72 20 28 69 6e 20 77 68  L pointer (in wh
4910: 69 63 68 20 63 61 73 65 20 30 20 69 73 20 72 65  ich case 0 is re
4920: 74 75 72 6e 65 64 29 20 6f 72 20 61 20 70 6f 69  turned) or a poi
4930: 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
4940: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c   .** sqlite3Mall
4950: 6f 63 28 29 2c 20 73 71 6c 69 74 65 33 52 65 61  oc(), sqlite3Rea
4960: 6c 6c 6f 63 28 29 20 6f 72 20 73 71 6c 69 74 65  lloc() or sqlite
4970: 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 29  3ReallocOrFree()
4980: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
4990: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
49a0: 63 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 69  cated does not i
49b0: 6e 63 6c 75 64 65 20 61 6e 79 20 6f 76 65 72 68  nclude any overh
49c0: 65 61 64 20 69 6e 73 65 72 74 65 64 20 62 79 20  ead inserted by 
49d0: 0a 2a 2a 20 61 6e 79 20 6d 61 6c 6c 6f 63 28 29  .** any malloc()
49e0: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
49f0: 6e 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 63  ns that may be c
4a00: 61 6c 6c 65 64 2e 20 53 6f 20 74 68 65 20 76 61  alled. So the va
4a10: 6c 75 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  lue returned.** 
4a20: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
4a30: 20 62 79 74 65 73 20 74 68 61 74 20 77 65 72 65   bytes that were
4a40: 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 53 51   available to SQ
4a50: 4c 69 74 65 20 75 73 69 6e 67 20 70 6f 69 6e 74  Lite using point
4a60: 65 72 20 70 2c 20 0a 2a 2a 20 72 65 67 61 72 64  er p, .** regard
4a70: 6c 65 73 73 20 6f 66 20 68 6f 77 20 6d 75 63 68  less of how much
4a80: 20 6d 65 6d 6f 72 79 20 77 61 73 20 61 63 74 75   memory was actu
4a90: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  ally allocated..
4aa0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 6c  */.int sqlite3Al
4ab0: 6c 6f 63 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  locSize(void *p)
4ac0: 7b 0a 20 20 72 65 74 75 72 6e 20 4f 53 53 49 5a  {.  return OSSIZ
4ad0: 45 4f 46 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  EOF(p);.}../*.**
4ae0: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
4af0: 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f  a string in memo
4b00: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
4b10: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
4b20: 20 54 68 65 73 65 20 0a 2a 2a 20 66 75 6e 63 74   These .** funct
4b30: 69 6f 6e 73 20 63 61 6c 6c 20 73 71 6c 69 74 65  ions call sqlite
4b40: 33 4d 61 6c 6c 6f 63 52 61 77 28 29 20 64 69 72  3MallocRaw() dir
4b50: 65 63 74 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ectly instead of
4b60: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
4b70: 20 54 68 69 73 0a 2a 2a 20 69 73 20 62 65 63 61   This.** is beca
4b80: 75 73 65 20 77 68 65 6e 20 6d 65 6d 6f 72 79 20  use when memory 
4b90: 64 65 62 75 67 67 69 6e 67 20 69 73 20 74 75 72  debugging is tur
4ba0: 6e 65 64 20 6f 6e 2c 20 74 68 65 73 65 20 74 77  ned on, these tw
4bb0: 6f 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  o functions are 
4bc0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 76 69 61 20 6d  .** called via m
4bd0: 61 63 72 6f 73 20 74 68 61 74 20 72 65 63 6f 72  acros that recor
4be0: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 69  d the current fi
4bf0: 6c 65 20 61 6e 64 20 6c 69 6e 65 20 6e 75 6d 62  le and line numb
4c00: 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 53 71 6c  er in the.** Sql
4c10: 69 74 65 54 73 64 20 73 74 72 75 63 74 75 72 65  iteTsd structure
4c20: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
4c30: 65 33 53 74 72 44 75 70 28 63 6f 6e 73 74 20 63  e3StrDup(const c
4c40: 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20  har *z){.  char 
4c50: 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d 3d  *zNew;.  if( z==
4c60: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4c70: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61  zNew = sqlite3Ma
4c80: 6c 6c 6f 63 52 61 77 28 73 74 72 6c 65 6e 28 7a  llocRaw(strlen(z
4c90: 29 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77  )+1);.  if( zNew
4ca0: 20 29 20 73 74 72 63 70 79 28 7a 4e 65 77 2c 20   ) strcpy(zNew, 
4cb0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65  z);.  return zNe
4cc0: 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c 69 74  w;.}.char *sqlit
4cd0: 65 33 53 74 72 4e 44 75 70 28 63 6f 6e 73 74 20  e3StrNDup(const 
4ce0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
4cf0: 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20  .  char *zNew;. 
4d00: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
4d10: 72 6e 20 30 3b 0a 20 20 7a 4e 65 77 20 3d 20 73  rn 0;.  zNew = s
4d20: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 52 61 77 28  qlite3MallocRaw(
4d30: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77  n+1);.  if( zNew
4d40: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
4d50: 4e 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  New, z, n);.    
4d60: 7a 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d  zNew[n] = 0;.  }
4d70: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a  .  return zNew;.
4d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
4d90: 61 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68  a string from th
4da0: 65 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  e 2nd and subseq
4db0: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 28  uent arguments (
4dc0: 75 70 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72  up to the.** fir
4dd0: 73 74 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  st NULL argument
4de0: 29 2c 20 73 74 6f 72 65 20 74 68 65 20 73 74 72  ), store the str
4df0: 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ing in memory ob
4e00: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
4e10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
4e20: 64 20 6d 61 6b 65 20 74 68 65 20 70 6f 69 6e 74  d make the point
4e30: 65 72 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  er indicated by 
4e40: 74 68 65 20 31 73 74 20 61 72 67 75 6d 65 6e 74  the 1st argument
4e50: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 61  .** point to tha
4e60: 74 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 31  t string.  The 1
4e70: 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  st argument must
4e80: 20 65 69 74 68 65 72 20 62 65 20 4e 55 4c 4c 20   either be NULL 
4e90: 6f 72 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  or .** point to 
4ea0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
4eb0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
4ec0: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
4ed0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 63 68  ite3SetString(ch
4ee0: 61 72 20 2a 2a 70 7a 2c 20 2e 2e 2e 29 7b 0a 20  ar **pz, ...){. 
4ef0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
4f00: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 6f 6e 73  nt nByte;.  cons
4f10: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61  t char *z;.  cha
4f20: 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 0a 20 20 69  r *zResult;..  i
4f30: 66 28 20 70 7a 3d 3d 30 20 29 20 72 65 74 75 72  f( pz==0 ) retur
4f40: 6e 3b 0a 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a  n;.  nByte = 1;.
4f50: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70    va_start(ap, p
4f60: 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20  z);.  while( (z 
4f70: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
4f80: 73 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b  st char*))!=0 ){
4f90: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74  .    nByte += st
4fa0: 72 6c 65 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 76  rlen(z);.  }.  v
4fb0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c  a_end(ap);.  sql
4fc0: 69 74 65 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20  iteFree(*pz);.  
4fd0: 2a 70 7a 20 3d 20 7a 52 65 73 75 6c 74 20 3d 20  *pz = zResult = 
4fe0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
4ff0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
5000: 7a 52 65 73 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  zResult==0 ){.  
5010: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5020: 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *zResult = 0;.  
5030: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70 7a 29  va_start(ap, pz)
5040: 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20 3d 20  ;.  while( (z = 
5050: 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
5060: 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20   char*))!=0 ){. 
5070: 20 20 20 73 74 72 63 70 79 28 7a 52 65 73 75 6c     strcpy(zResul
5080: 74 2c 20 7a 29 3b 0a 20 20 20 20 7a 52 65 73 75  t, z);.    zResu
5090: 6c 74 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 52 65  lt += strlen(zRe
50a0: 73 75 6c 74 29 3b 0a 20 20 7d 0a 20 20 76 61 5f  sult);.  }.  va_
50b0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
50c0: 2a 20 53 65 74 20 74 68 65 20 6d 6f 73 74 20 72  * Set the most r
50d0: 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ecent error code
50e0: 20 61 6e 64 20 65 72 72 6f 72 20 73 74 72 69 6e   and error strin
50f0: 67 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  g for the sqlite
5100: 0a 2a 2a 20 68 61 6e 64 6c 65 20 22 64 62 22 2e  .** handle "db".
5110: 20 54 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   The error code 
5120: 69 73 20 73 65 74 20 74 6f 20 22 65 72 72 5f 63  is set to "err_c
5130: 6f 64 65 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ode"..**.** If i
5140: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  t is not NULL, s
5150: 74 72 69 6e 67 20 7a 46 6f 72 6d 61 74 20 73 70  tring zFormat sp
5160: 65 63 69 66 69 65 73 20 74 68 65 20 66 6f 72 6d  ecifies the form
5170: 61 74 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72  at of the.** err
5180: 6f 72 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  or string in the
5190: 20 73 74 79 6c 65 20 6f 66 20 74 68 65 20 70 72   style of the pr
51a0: 69 6e 74 66 20 66 75 6e 63 74 69 6f 6e 73 3a 20  intf functions: 
51b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  The following.**
51c0: 20 66 6f 72 6d 61 74 20 63 68 61 72 61 63 74 65   format characte
51d0: 72 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 3a 0a  rs are allowed:.
51e0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 25 73 20 20 20  **.**      %s   
51f0: 20 20 20 49 6e 73 65 72 74 20 61 20 73 74 72 69     Insert a stri
5200: 6e 67 0a 2a 2a 20 20 20 20 20 20 25 7a 20 20 20  ng.**      %z   
5210: 20 20 20 41 20 73 74 72 69 6e 67 20 74 68 61 74     A string that
5220: 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64   should be freed
5230: 20 61 66 74 65 72 20 75 73 65 0a 2a 2a 20 20 20   after use.**   
5240: 20 20 20 25 64 20 20 20 20 20 20 49 6e 73 65 72     %d      Inser
5250: 74 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20  t an integer.** 
5260: 20 20 20 20 20 25 54 20 20 20 20 20 20 49 6e 73       %T      Ins
5270: 65 72 74 20 61 20 74 6f 6b 65 6e 0a 2a 2a 20 20  ert a token.**  
5280: 20 20 20 20 25 53 20 20 20 20 20 20 49 6e 73 65      %S      Inse
5290: 72 74 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  rt the first ele
52a0: 6d 65 6e 74 20 6f 66 20 61 20 53 72 63 4c 69 73  ment of a SrcLis
52b0: 74 0a 2a 2a 0a 2a 2a 20 7a 46 6f 72 6d 61 74 20  t.**.** zFormat 
52c0: 61 6e 64 20 61 6e 79 20 73 74 72 69 6e 67 20 74  and any string t
52d0: 6f 6b 65 6e 73 20 74 68 61 74 20 66 6f 6c 6c 6f  okens that follo
52e0: 77 20 69 74 20 61 72 65 20 61 73 73 75 6d 65 64  w it are assumed
52f0: 20 74 6f 20 62 65 0a 2a 2a 20 65 6e 63 6f 64 65   to be.** encode
5300: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a  d in UTF-8..**.*
5310: 2a 20 54 6f 20 63 6c 65 61 72 20 74 68 65 20 6d  * To clear the m
5320: 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72  ost recent error
5330: 20 66 6f 72 20 73 71 6c 69 74 65 20 68 61 6e 64   for sqlite hand
5340: 6c 65 20 22 64 62 22 2c 20 73 71 6c 69 74 65 33  le "db", sqlite3
5350: 45 72 72 6f 72 0a 2a 2a 20 73 68 6f 75 6c 64 20  Error.** should 
5360: 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  be called with e
5370: 72 72 5f 63 6f 64 65 20 73 65 74 20 74 6f 20 53  rr_code set to S
5380: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 7a 46 6f  QLITE_OK and zFo
5390: 72 6d 61 74 20 73 65 74 0a 2a 2a 20 74 6f 20 4e  rmat set.** to N
53a0: 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ULL..*/.void sql
53b0: 69 74 65 33 45 72 72 6f 72 28 73 71 6c 69 74 65  ite3Error(sqlite
53c0: 33 20 2a 64 62 2c 20 69 6e 74 20 65 72 72 5f 63  3 *db, int err_c
53d0: 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ode, const char 
53e0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
53f0: 20 20 69 66 28 20 64 62 20 26 26 20 28 64 62 2d    if( db && (db-
5400: 3e 70 45 72 72 20 7c 7c 20 28 64 62 2d 3e 70 45  >pErr || (db->pE
5410: 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  rr = sqlite3Valu
5420: 65 4e 65 77 28 29 29 29 21 3d 30 20 29 7b 0a 20  eNew()))!=0 ){. 
5430: 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
5440: 20 65 72 72 5f 63 6f 64 65 3b 0a 20 20 20 20 69   err_code;.    i
5450: 66 28 20 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20  f( zFormat ){.  
5460: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
5470: 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20     va_list ap;. 
5480: 20 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70       va_start(ap
5490: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
54a0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50    z = sqlite3VMP
54b0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
54c0: 70 29 3b 0a 20 20 20 20 20 20 76 61 5f 65 6e 64  p);.      va_end
54d0: 28 61 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (ap);.      sqli
54e0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
54f0: 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 7a 2c 20  b->pErr, -1, z, 
5500: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c  SQLITE_UTF8, sql
5510: 69 74 65 33 46 72 65 65 58 29 3b 0a 20 20 20 20  ite3FreeX);.    
5520: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
5530: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
5540: 64 62 2d 3e 70 45 72 72 2c 20 30 2c 20 30 2c 20  db->pErr, 0, 0, 
5550: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
5560: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
5570: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
5580: 41 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  Add an error mes
5590: 73 61 67 65 20 74 6f 20 70 50 61 72 73 65 2d 3e  sage to pParse->
55a0: 7a 45 72 72 4d 73 67 20 61 6e 64 20 69 6e 63 72  zErrMsg and incr
55b0: 65 6d 65 6e 74 20 70 50 61 72 73 65 2d 3e 6e 45  ement pParse->nE
55c0: 72 72 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  rr..** The follo
55d0: 77 69 6e 67 20 66 6f 72 6d 61 74 74 69 6e 67 20  wing formatting 
55e0: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 61  characters are a
55f0: 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  llowed:.**.**   
5600: 20 20 20 25 73 20 20 20 20 20 20 49 6e 73 65 72     %s      Inser
5610: 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 20 20  t a string.**   
5620: 20 20 20 25 7a 20 20 20 20 20 20 41 20 73 74 72     %z      A str
5630: 69 6e 67 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ing that should 
5640: 62 65 20 66 72 65 65 64 20 61 66 74 65 72 20 75  be freed after u
5650: 73 65 0a 2a 2a 20 20 20 20 20 20 25 64 20 20 20  se.**      %d   
5660: 20 20 20 49 6e 73 65 72 74 20 61 6e 20 69 6e 74     Insert an int
5670: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 25 54 20  eger.**      %T 
5680: 20 20 20 20 20 49 6e 73 65 72 74 20 61 20 74 6f       Insert a to
5690: 6b 65 6e 0a 2a 2a 20 20 20 20 20 20 25 53 20 20  ken.**      %S  
56a0: 20 20 20 20 49 6e 73 65 72 74 20 74 68 65 20 66      Insert the f
56b0: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  irst element of 
56c0: 61 20 53 72 63 4c 69 73 74 0a 2a 2a 0a 2a 2a 20  a SrcList.**.** 
56d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
56e0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20  ould be used to 
56f0: 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72  report any error
5700: 20 74 68 61 74 20 6f 63 63 75 72 73 20 77 68 69   that occurs whi
5710: 6c 73 74 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67  lst.** compiling
5720: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
5730: 74 20 28 69 2e 65 2e 20 77 69 74 68 69 6e 20 73  t (i.e. within s
5740: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
5750: 29 2e 20 54 68 65 0a 2a 2a 20 6c 61 73 74 20 74  ). The.** last t
5760: 68 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  hing the sqlite3
5770: 5f 70 72 65 70 61 72 65 28 29 20 66 75 6e 63 74  _prepare() funct
5780: 69 6f 6e 20 64 6f 65 73 20 69 73 20 63 6f 70 79  ion does is copy
5790: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 73 74   the error.** st
57a0: 6f 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ored by this fun
57b0: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 64  ction into the d
57c0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75  atabase handle u
57d0: 73 69 6e 67 20 73 71 6c 69 74 65 33 45 72 72 6f  sing sqlite3Erro
57e0: 72 28 29 2e 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  r()..** Function
57f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 29 20   sqlite3Error() 
5800: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 64  should be used d
5810: 75 72 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  uring statement 
5820: 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 28 73 71  execution.** (sq
5830: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 65 74 63  lite3_step() etc
5840: 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .)..*/.void sqli
5850: 74 65 33 45 72 72 6f 72 4d 73 67 28 50 61 72 73  te3ErrorMsg(Pars
5860: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
5870: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5880: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5890: 61 70 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45  ap;.  pParse->nE
58a0: 72 72 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 46 72  rr++;.  sqliteFr
58b0: 65 65 28 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ee(pParse->zErrM
58c0: 73 67 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  sg);.  va_start(
58d0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
58e0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
58f0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
5900: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
5910: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a    va_end(ap);.}.
5920: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
5930: 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71 75 6f 74  n SQL-style quot
5940: 65 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61  ed string into a
5950: 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e 67 20 62   normal string b
5960: 79 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20 74 68  y removing.** th
5970: 65 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  e quote characte
5980: 72 73 2e 20 20 54 68 65 20 63 6f 6e 76 65 72 73  rs.  The convers
5990: 69 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70  ion is done in-p
59a0: 6c 61 63 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a  lace.  If the.**
59b0: 20 69 6e 70 75 74 20 64 6f 65 73 20 6e 6f 74 20   input does not 
59c0: 62 65 67 69 6e 20 77 69 74 68 20 61 20 71 75 6f  begin with a quo
59d0: 74 65 20 63 68 61 72 61 63 74 65 72 2c 20 74 68  te character, th
59e0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
59f0: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ** is a no-op..*
5a00: 2a 0a 2a 2a 20 32 30 30 32 2d 46 65 62 2d 31 34  *.** 2002-Feb-14
5a10: 3a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  : This routine i
5a20: 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65  s extended to re
5a30: 6d 6f 76 65 20 4d 53 2d 41 63 63 65 73 73 20 73  move MS-Access s
5a40: 74 79 6c 65 0a 2a 2a 20 62 72 61 63 6b 65 74 73  tyle.** brackets
5a50: 20 66 72 6f 6d 20 61 72 6f 75 6e 64 20 69 64 65   from around ide
5a60: 6e 74 69 66 65 72 73 2e 20 20 46 6f 72 20 65 78  ntifers.  For ex
5a70: 61 6d 70 6c 65 3a 20 20 22 5b 61 2d 62 2d 63 5d  ample:  "[a-b-c]
5a80: 22 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 22 61 2d  " becomes.** "a-
5a90: 62 2d 63 22 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  b-c"..*/.void sq
5aa0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 63 68 61  lite3Dequote(cha
5ab0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 71 75 6f  r *z){.  int quo
5ac0: 74 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  te;.  int i, j;.
5ad0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
5ae0: 75 72 6e 3b 0a 20 20 71 75 6f 74 65 20 3d 20 7a  urn;.  quote = z
5af0: 5b 30 5d 3b 0a 20 20 73 77 69 74 63 68 28 20 71  [0];.  switch( q
5b00: 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65  uote ){.    case
5b10: 20 27 5c 27 27 3a 20 20 62 72 65 61 6b 3b 0a 20   '\'':  break;. 
5b20: 20 20 20 63 61 73 65 20 27 22 27 3a 20 20 20 62     case '"':   b
5b30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27  reak;.    case '
5b40: 60 27 3a 20 20 20 62 72 65 61 6b 3b 20 20 20 20  `':   break;    
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
5b60: 6f 72 20 4d 79 53 51 4c 20 63 6f 6d 70 61 74 69  or MySQL compati
5b70: 62 69 6c 69 74 79 20 2a 2f 0a 20 20 20 20 63 61  bility */.    ca
5b80: 73 65 20 27 5b 27 3a 20 20 20 71 75 6f 74 65 20  se '[':   quote 
5b90: 3d 20 27 5d 27 3b 20 20 62 72 65 61 6b 3b 20 20  = ']';  break;  
5ba0: 2f 2a 20 46 6f 72 20 4d 53 20 53 71 6c 53 65 72  /* For MS SqlSer
5bb0: 76 65 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  ver compatibilit
5bc0: 79 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74  y */.    default
5bd0: 3a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  :    return;.  }
5be0: 0a 20 20 66 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b  .  for(i=1, j=0;
5bf0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
5c00: 20 69 66 28 20 7a 5b 69 5d 3d 3d 71 75 6f 74 65   if( z[i]==quote
5c10: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
5c20: 69 2b 31 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20  i+1]==quote ){. 
5c30: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
5c40: 71 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 69  quote;.        i
5c50: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
5c60: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
5c70: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
5c80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 6a  }else{.      z[j
5ca0: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
5cb0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41 6e 20 61  }.  }.}../* An a
5cc0: 72 72 61 79 20 74 6f 20 6d 61 70 20 61 6c 6c 20  rray to map all 
5cd0: 75 70 70 65 72 2d 63 61 73 65 20 63 68 61 72 61  upper-case chara
5ce0: 63 74 65 72 73 20 69 6e 74 6f 20 74 68 65 69 72  cters into their
5cf0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
5d00: 2a 20 6c 6f 77 65 72 2d 63 61 73 65 20 63 68 61  * lower-case cha
5d10: 72 61 63 74 65 72 2e 20 0a 2a 2f 0a 63 6f 6e 73  racter. .*/.cons
5d20: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
5d30: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
5d40: 77 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  wer[] = {.      
5d50: 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20  0,  1,  2,  3,  
5d60: 34 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20  4,  5,  6,  7,  
5d70: 38 2c 20 20 39 2c 20 31 30 2c 20 31 31 2c 20 31  8,  9, 10, 11, 1
5d80: 32 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31  2, 13, 14, 15, 1
5d90: 36 2c 20 31 37 2c 0a 20 20 20 20 20 31 38 2c 20  6, 17,.     18, 
5da0: 31 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 20  19, 20, 21, 22, 
5db0: 32 33 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c 20  23, 24, 25, 26, 
5dc0: 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20  27, 28, 29, 30, 
5dd0: 33 31 2c 20 33 32 2c 20 33 33 2c 20 33 34 2c 20  31, 32, 33, 34, 
5de0: 33 35 2c 0a 20 20 20 20 20 33 36 2c 20 33 37 2c  35,.     36, 37,
5df0: 20 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c   38, 39, 40, 41,
5e00: 20 34 32 2c 20 34 33 2c 20 34 34 2c 20 34 35 2c   42, 43, 44, 45,
5e10: 20 34 36 2c 20 34 37 2c 20 34 38 2c 20 34 39 2c   46, 47, 48, 49,
5e20: 20 35 30 2c 20 35 31 2c 20 35 32 2c 20 35 33 2c   50, 51, 52, 53,
5e30: 0a 20 20 20 20 20 35 34 2c 20 35 35 2c 20 35 36  .     54, 55, 56
5e40: 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 36 30  , 57, 58, 59, 60
5e50: 2c 20 36 31 2c 20 36 32 2c 20 36 33 2c 20 36 34  , 61, 62, 63, 64
5e60: 2c 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30  , 97, 98, 99,100
5e70: 2c 31 30 31 2c 31 30 32 2c 31 30 33 2c 0a 20 20  ,101,102,103,.  
5e80: 20 20 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30    104,105,106,10
5e90: 37 2c 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31  7,108,109,110,11
5ea0: 31 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31  1,112,113,114,11
5eb0: 35 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31  5,116,117,118,11
5ec0: 39 2c 31 32 30 2c 31 32 31 2c 0a 20 20 20 20 31  9,120,121,.    1
5ed0: 32 32 2c 20 39 31 2c 20 39 32 2c 20 39 33 2c 20  22, 91, 92, 93, 
5ee0: 39 34 2c 20 39 35 2c 20 39 36 2c 20 39 37 2c 20  94, 95, 96, 97, 
5ef0: 39 38 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c 31  98, 99,100,101,1
5f00: 30 32 2c 31 30 33 2c 31 30 34 2c 31 30 35 2c 31  02,103,104,105,1
5f10: 30 36 2c 31 30 37 2c 0a 20 20 20 20 31 30 38 2c  06,107,.    108,
5f20: 31 30 39 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c  109,110,111,112,
5f30: 31 31 33 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c  113,114,115,116,
5f40: 31 31 37 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c  117,118,119,120,
5f50: 31 32 31 2c 31 32 32 2c 31 32 33 2c 31 32 34 2c  121,122,123,124,
5f60: 31 32 35 2c 0a 20 20 20 20 31 32 36 2c 31 32 37  125,.    126,127
5f70: 2c 31 32 38 2c 31 32 39 2c 31 33 30 2c 31 33 31  ,128,129,130,131
5f80: 2c 31 33 32 2c 31 33 33 2c 31 33 34 2c 31 33 35  ,132,133,134,135
5f90: 2c 31 33 36 2c 31 33 37 2c 31 33 38 2c 31 33 39  ,136,137,138,139
5fa0: 2c 31 34 30 2c 31 34 31 2c 31 34 32 2c 31 34 33  ,140,141,142,143
5fb0: 2c 0a 20 20 20 20 31 34 34 2c 31 34 35 2c 31 34  ,.    144,145,14
5fc0: 36 2c 31 34 37 2c 31 34 38 2c 31 34 39 2c 31 35  6,147,148,149,15
5fd0: 30 2c 31 35 31 2c 31 35 32 2c 31 35 33 2c 31 35  0,151,152,153,15
5fe0: 34 2c 31 35 35 2c 31 35 36 2c 31 35 37 2c 31 35  4,155,156,157,15
5ff0: 38 2c 31 35 39 2c 31 36 30 2c 31 36 31 2c 0a 20  8,159,160,161,. 
6000: 20 20 20 31 36 32 2c 31 36 33 2c 31 36 34 2c 31     162,163,164,1
6010: 36 35 2c 31 36 36 2c 31 36 37 2c 31 36 38 2c 31  65,166,167,168,1
6020: 36 39 2c 31 37 30 2c 31 37 31 2c 31 37 32 2c 31  69,170,171,172,1
6030: 37 33 2c 31 37 34 2c 31 37 35 2c 31 37 36 2c 31  73,174,175,176,1
6040: 37 37 2c 31 37 38 2c 31 37 39 2c 0a 20 20 20 20  77,178,179,.    
6050: 31 38 30 2c 31 38 31 2c 31 38 32 2c 31 38 33 2c  180,181,182,183,
6060: 31 38 34 2c 31 38 35 2c 31 38 36 2c 31 38 37 2c  184,185,186,187,
6070: 31 38 38 2c 31 38 39 2c 31 39 30 2c 31 39 31 2c  188,189,190,191,
6080: 31 39 32 2c 31 39 33 2c 31 39 34 2c 31 39 35 2c  192,193,194,195,
6090: 31 39 36 2c 31 39 37 2c 0a 20 20 20 20 31 39 38  196,197,.    198
60a0: 2c 31 39 39 2c 32 30 30 2c 32 30 31 2c 32 30 32  ,199,200,201,202
60b0: 2c 32 30 33 2c 32 30 34 2c 32 30 35 2c 32 30 36  ,203,204,205,206
60c0: 2c 32 30 37 2c 32 30 38 2c 32 30 39 2c 32 31 30  ,207,208,209,210
60d0: 2c 32 31 31 2c 32 31 32 2c 32 31 33 2c 32 31 34  ,211,212,213,214
60e0: 2c 32 31 35 2c 0a 20 20 20 20 32 31 36 2c 32 31  ,215,.    216,21
60f0: 37 2c 32 31 38 2c 32 31 39 2c 32 32 30 2c 32 32  7,218,219,220,22
6100: 31 2c 32 32 32 2c 32 32 33 2c 32 32 34 2c 32 32  1,222,223,224,22
6110: 35 2c 32 32 36 2c 32 32 37 2c 32 32 38 2c 32 32  5,226,227,228,22
6120: 39 2c 32 33 30 2c 32 33 31 2c 32 33 32 2c 32 33  9,230,231,232,23
6130: 33 2c 0a 20 20 20 20 32 33 34 2c 32 33 35 2c 32  3,.    234,235,2
6140: 33 36 2c 32 33 37 2c 32 33 38 2c 32 33 39 2c 32  36,237,238,239,2
6150: 34 30 2c 32 34 31 2c 32 34 32 2c 32 34 33 2c 32  40,241,242,243,2
6160: 34 34 2c 32 34 35 2c 32 34 36 2c 32 34 37 2c 32  44,245,246,247,2
6170: 34 38 2c 32 34 39 2c 32 35 30 2c 32 35 31 2c 0a  48,249,250,251,.
6180: 20 20 20 20 32 35 32 2c 32 35 33 2c 32 35 34 2c      252,253,254,
6190: 32 35 35 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 55  255.};.#define U
61a0: 70 70 65 72 54 6f 4c 6f 77 65 72 20 73 71 6c 69  pperToLower sqli
61b0: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 0a  te3UpperToLower.
61c0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 73 79 73 74  ./*.** Some syst
61d0: 65 6d 73 20 68 61 76 65 20 73 74 72 69 63 6d 70  ems have stricmp
61e0: 28 29 2e 20 20 4f 74 68 65 72 73 20 68 61 76 65  ().  Others have
61f0: 20 73 74 72 63 61 73 65 63 6d 70 28 29 2e 20 20   strcasecmp().  
6200: 42 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 72 65  Because.** there
6210: 20 69 73 20 6e 6f 20 63 6f 6e 73 69 73 74 65 6e   is no consisten
6220: 63 79 2c 20 77 65 20 77 69 6c 6c 20 64 65 66 69  cy, we will defi
6230: 6e 65 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 69  ne our own..*/.i
6240: 6e 74 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  nt sqlite3StrICm
6250: 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c  p(const char *zL
6260: 65 66 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  eft, const char 
6270: 2a 7a 52 69 67 68 74 29 7b 0a 20 20 72 65 67 69  *zRight){.  regi
6280: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 63 68  ster unsigned ch
6290: 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20 61 20 3d  ar *a, *b;.  a =
62a0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
62b0: 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20 3d 20 28  *)zLeft;.  b = (
62c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
62d0: 7a 52 69 67 68 74 3b 0a 20 20 77 68 69 6c 65 28  zRight;.  while(
62e0: 20 2a 61 21 3d 30 20 26 26 20 55 70 70 65 72 54   *a!=0 && UpperT
62f0: 6f 4c 6f 77 65 72 5b 2a 61 5d 3d 3d 55 70 70 65  oLower[*a]==Uppe
6300: 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d 29 7b 20 61  rToLower[*b]){ a
6310: 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a 20 20 72 65 74  ++; b++; }.  ret
6320: 75 72 6e 20 55 70 70 65 72 54 6f 4c 6f 77 65 72  urn UpperToLower
6330: 5b 2a 61 5d 20 2d 20 55 70 70 65 72 54 6f 4c 6f  [*a] - UpperToLo
6340: 77 65 72 5b 2a 62 5d 3b 0a 7d 0a 69 6e 74 20 73  wer[*b];.}.int s
6350: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 63  qlite3StrNICmp(c
6360: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74  onst char *zLeft
6370: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52  , const char *zR
6380: 69 67 68 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ight, int N){.  
6390: 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65  register unsigne
63a0: 64 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20  d char *a, *b;. 
63b0: 20 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63   a = (unsigned c
63c0: 68 61 72 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62  har *)zLeft;.  b
63d0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
63e0: 72 20 2a 29 7a 52 69 67 68 74 3b 0a 20 20 77 68  r *)zRight;.  wh
63f0: 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20  ile( N-- > 0 && 
6400: 2a 61 21 3d 30 20 26 26 20 55 70 70 65 72 54 6f  *a!=0 && UpperTo
6410: 4c 6f 77 65 72 5b 2a 61 5d 3d 3d 55 70 70 65 72  Lower[*a]==Upper
6420: 54 6f 4c 6f 77 65 72 5b 2a 62 5d 29 7b 20 61 2b  ToLower[*b]){ a+
6430: 2b 3b 20 62 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  +; b++; }.  retu
6440: 72 6e 20 4e 3c 30 20 3f 20 30 20 3a 20 55 70 70  rn N<0 ? 0 : Upp
6450: 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 20 2d 20  erToLower[*a] - 
6460: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d  UpperToLower[*b]
6470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6480: 6e 20 54 52 55 45 20 69 66 20 7a 20 69 73 20 61  n TRUE if z is a
6490: 20 70 75 72 65 20 6e 75 6d 65 72 69 63 20 73 74   pure numeric st
64a0: 72 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 46 41  ring.  Return FA
64b0: 4c 53 45 20 69 66 20 74 68 65 0a 2a 2a 20 73 74  LSE if the.** st
64c0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ring contains an
64d0: 79 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  y character whic
64e0: 68 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  h is not part of
64f0: 20 61 20 6e 75 6d 62 65 72 2e 20 49 66 0a 2a 2a   a number. If.**
6500: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e   the string is n
6510: 75 6d 65 72 69 63 20 61 6e 64 20 63 6f 6e 74 61  umeric and conta
6520: 69 6e 73 20 74 68 65 20 27 2e 27 20 63 68 61 72  ins the '.' char
6530: 61 63 74 65 72 2c 20 73 65 74 20 2a 72 65 61 6c  acter, set *real
6540: 6e 75 6d 0a 2a 2a 20 74 6f 20 54 52 55 45 20 28  num.** to TRUE (
6550: 6f 74 68 65 72 77 69 73 65 20 46 41 4c 53 45 29  otherwise FALSE)
6560: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6d 70 74 79  ..**.** An empty
6570: 20 73 74 72 69 6e 67 20 69 73 20 63 6f 6e 73 69   string is consi
6580: 64 65 72 65 64 20 6e 6f 6e 2d 6e 75 6d 65 72 69  dered non-numeri
6590: 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
65a0: 33 49 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20  3IsNumber(const 
65b0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65  char *z, int *re
65c0: 61 6c 6e 75 6d 2c 20 75 38 20 65 6e 63 29 7b 0a  alnum, u8 enc){.
65d0: 20 20 69 6e 74 20 69 6e 63 72 20 3d 20 28 65 6e    int incr = (en
65e0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 3f 31  c==SQLITE_UTF8?1
65f0: 3a 32 29 3b 0a 20 20 69 66 28 20 65 6e 63 3d 3d  :2);.  if( enc==
6600: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
6610: 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 2a 7a 3d 3d   z++;.  if( *z==
6620: 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29  '-' || *z=='+' )
6630: 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 69 66   z += incr;.  if
6640: 28 20 21 69 73 64 69 67 69 74 28 2a 28 75 38 2a  ( !isdigit(*(u8*
6650: 29 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  )z) ){.    retur
6660: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20  n 0;.  }.  z += 
6670: 69 6e 63 72 3b 0a 20 20 69 66 28 20 72 65 61 6c  incr;.  if( real
6680: 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d  num ) *realnum =
6690: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 64   0;.  while( isd
66a0: 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b  igit(*(u8*)z) ){
66b0: 20 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a 20 20   z += incr; }.  
66c0: 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20  if( *z=='.' ){. 
66d0: 20 20 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20     z += incr;.  
66e0: 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a    if( !isdigit(*
66f0: 28 75 38 2a 29 7a 29 20 29 20 72 65 74 75 72 6e  (u8*)z) ) return
6700: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   0;.    while( i
6710: 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20  sdigit(*(u8*)z) 
6720: 29 7b 20 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a  ){ z += incr; }.
6730: 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20      if( realnum 
6740: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a  ) *realnum = 1;.
6750: 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65    }.  if( *z=='e
6760: 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a  ' || *z=='E' ){.
6770: 20 20 20 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20      z += incr;. 
6780: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c     if( *z=='+' |
6790: 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 20 2b 3d  | *z=='-' ) z +=
67a0: 20 69 6e 63 72 3b 0a 20 20 20 20 69 66 28 20 21   incr;.    if( !
67b0: 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29  isdigit(*(u8*)z)
67c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
67d0: 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28   while( isdigit(
67e0: 2a 28 75 38 2a 29 7a 29 20 29 7b 20 7a 20 2b 3d  *(u8*)z) ){ z +=
67f0: 20 69 6e 63 72 3b 20 7d 0a 20 20 20 20 69 66 28   incr; }.    if(
6800: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
6810: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  num = 1;.  }.  r
6820: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
6830: 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67  /*.** The string
6840: 20 7a 5b 5d 20 69 73 20 61 6e 20 61 73 63 69 69   z[] is an ascii
6850: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6860: 6f 66 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72  of a real number
6870: 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 69  ..** Convert thi
6880: 73 20 73 74 72 69 6e 67 20 74 6f 20 61 20 64 6f  s string to a do
6890: 75 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  uble..**.** This
68a0: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
68b0: 20 74 68 61 74 20 7a 5b 5d 20 72 65 61 6c 6c 79   that z[] really
68c0: 20 69 73 20 61 20 76 61 6c 69 64 20 6e 75 6d 62   is a valid numb
68d0: 65 72 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73  er.  If it.** is
68e0: 20 6e 6f 74 2c 20 74 68 65 20 72 65 73 75 6c 74   not, the result
68f0: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
6900: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6910: 65 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  e is used instea
6920: 64 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79  d of the library
6930: 20 61 74 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e   atof() function
6940: 20 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20   because.** the 
6950: 6c 69 62 72 61 72 79 20 61 74 6f 66 28 29 20 6d  library atof() m
6960: 69 67 68 74 20 77 61 6e 74 20 74 6f 20 75 73 65  ight want to use
6970: 20 22 2c 22 20 61 73 20 74 68 65 20 64 65 63 69   "," as the deci
6980: 6d 61 6c 20 70 6f 69 6e 74 20 69 6e 73 74 65 61  mal point instea
6990: 64 0a 2a 2a 20 6f 66 20 22 2e 22 20 64 65 70 65  d.** of "." depe
69a0: 6e 64 69 6e 67 20 6f 6e 20 68 6f 77 20 6c 6f 63  nding on how loc
69b0: 61 6c 65 20 69 73 20 73 65 74 2e 20 20 42 75 74  ale is set.  But
69c0: 20 74 68 61 74 20 77 6f 75 6c 64 20 63 61 75 73   that would caus
69d0: 65 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a 20 66 6f  e problems.** fo
69e0: 72 20 53 51 4c 2e 20 20 53 6f 20 74 68 69 73 20  r SQL.  So this 
69f0: 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 75  routine always u
6a00: 73 65 73 20 22 2e 22 20 72 65 67 61 72 64 6c 65  ses "." regardle
6a10: 73 73 20 6f 66 20 6c 6f 63 61 6c 65 2e 0a 2a 2f  ss of locale..*/
6a20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 74 6f 46  .int sqlite3AtoF
6a30: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
6a40: 64 6f 75 62 6c 65 20 2a 70 52 65 73 75 6c 74 29  double *pResult)
6a50: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
6a60: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
6a70: 4f 49 4e 54 0a 20 20 69 6e 74 20 73 69 67 6e 20  OINT.  int sign 
6a80: 3d 20 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 1;.  const cha
6a90: 72 20 2a 7a 42 65 67 69 6e 20 3d 20 7a 3b 0a 20  r *zBegin = z;. 
6aa0: 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45   LONGDOUBLE_TYPE
6ab0: 20 76 31 20 3d 20 30 2e 30 3b 0a 20 20 69 66 28   v1 = 0.0;.  if(
6ac0: 20 2a 7a 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20   *z=='-' ){.    
6ad0: 73 69 67 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7a  sign = -1;.    z
6ae0: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ++;.  }else if( 
6af0: 2a 7a 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a  *z=='+' ){.    z
6b00: 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  ++;.  }.  while(
6b10: 20 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a   isdigit(*(u8*)z
6b20: 29 20 29 7b 0a 20 20 20 20 76 31 20 3d 20 76 31  ) ){.    v1 = v1
6b30: 2a 31 30 2e 30 20 2b 20 28 2a 7a 20 2d 20 27 30  *10.0 + (*z - '0
6b40: 27 29 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d  ');.    z++;.  }
6b50: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29  .  if( *z=='.' )
6b60: 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45  {.    LONGDOUBLE
6b70: 5f 54 59 50 45 20 64 69 76 69 73 6f 72 20 3d 20  _TYPE divisor = 
6b80: 31 2e 30 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  1.0;.    z++;.  
6b90: 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74    while( isdigit
6ba0: 28 2a 28 75 38 2a 29 7a 29 20 29 7b 0a 20 20 20  (*(u8*)z) ){.   
6bb0: 20 20 20 76 31 20 3d 20 76 31 2a 31 30 2e 30 20     v1 = v1*10.0 
6bc0: 2b 20 28 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20  + (*z - '0');.  
6bd0: 20 20 20 20 64 69 76 69 73 6f 72 20 2a 3d 20 31      divisor *= 1
6be0: 30 2e 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a  0.0;.      z++;.
6bf0: 20 20 20 20 7d 0a 20 20 20 20 76 31 20 2f 3d 20      }.    v1 /= 
6c00: 64 69 76 69 73 6f 72 3b 0a 20 20 7d 0a 20 20 69  divisor;.  }.  i
6c10: 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a  f( *z=='e' || *z
6c20: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='E' ){.    int
6c30: 20 65 73 69 67 6e 20 3d 20 31 3b 0a 20 20 20 20   esign = 1;.    
6c40: 69 6e 74 20 65 76 61 6c 20 3d 20 30 3b 0a 20 20  int eval = 0;.  
6c50: 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50    LONGDOUBLE_TYP
6c60: 45 20 73 63 61 6c 65 20 3d 20 31 2e 30 3b 0a 20  E scale = 1.0;. 
6c70: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20     z++;.    if( 
6c80: 2a 7a 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  *z=='-' ){.     
6c90: 20 65 73 69 67 6e 20 3d 20 2d 31 3b 0a 20 20 20   esign = -1;.   
6ca0: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73     z++;.    }els
6cb0: 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b  e if( *z=='+' ){
6cc0: 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  .      z++;.    
6cd0: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 64  }.    while( isd
6ce0: 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b  igit(*(u8*)z) ){
6cf0: 0a 20 20 20 20 20 20 65 76 61 6c 20 3d 20 65 76  .      eval = ev
6d00: 61 6c 2a 31 30 20 2b 20 2a 7a 20 2d 20 27 30 27  al*10 + *z - '0'
6d10: 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  ;.      z++;.   
6d20: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 65 76   }.    while( ev
6d30: 61 6c 3e 3d 36 34 20 29 7b 20 73 63 61 6c 65 20  al>=64 ){ scale 
6d40: 2a 3d 20 31 2e 30 65 2b 36 34 3b 20 65 76 61 6c  *= 1.0e+64; eval
6d50: 20 2d 3d 20 36 34 3b 20 7d 0a 20 20 20 20 77 68   -= 64; }.    wh
6d60: 69 6c 65 28 20 65 76 61 6c 3e 3d 31 36 20 29 7b  ile( eval>=16 ){
6d70: 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 31   scale *= 1.0e+1
6d80: 36 3b 20 65 76 61 6c 20 2d 3d 20 31 36 3b 20 7d  6; eval -= 16; }
6d90: 0a 20 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c  .    while( eval
6da0: 3e 3d 34 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20  >=4 ){ scale *= 
6db0: 31 2e 30 65 2b 34 3b 20 65 76 61 6c 20 2d 3d 20  1.0e+4; eval -= 
6dc0: 34 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20  4; }.    while( 
6dd0: 65 76 61 6c 3e 3d 31 20 29 7b 20 73 63 61 6c 65  eval>=1 ){ scale
6de0: 20 2a 3d 20 31 2e 30 65 2b 31 3b 20 65 76 61 6c   *= 1.0e+1; eval
6df0: 20 2d 3d 20 31 3b 20 7d 0a 20 20 20 20 69 66 28   -= 1; }.    if(
6e00: 20 65 73 69 67 6e 3c 30 20 29 7b 0a 20 20 20 20   esign<0 ){.    
6e10: 20 20 76 31 20 2f 3d 20 73 63 61 6c 65 3b 0a 20    v1 /= scale;. 
6e20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6e30: 76 31 20 2a 3d 20 73 63 61 6c 65 3b 0a 20 20 20  v1 *= scale;.   
6e40: 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 75 6c   }.  }.  *pResul
6e50: 74 20 3d 20 73 69 67 6e 3c 30 20 3f 20 2d 76 31  t = sign<0 ? -v1
6e60: 20 3a 20 76 31 3b 0a 20 20 72 65 74 75 72 6e 20   : v1;.  return 
6e70: 7a 20 2d 20 7a 42 65 67 69 6e 3b 0a 23 65 6c 73  z - zBegin;.#els
6e80: 65 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  e.  return sqlit
6e90: 65 33 61 74 6f 69 36 34 28 7a 2c 20 70 52 65 73  e3atoi64(z, pRes
6ea0: 75 6c 74 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  ult);.#endif /* 
6eb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
6ec0: 54 49 4e 47 5f 50 4f 49 4e 54 20 2a 2f 0a 7d 0a  TING_POINT */.}.
6ed0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
6ee0: 55 45 20 69 66 20 7a 4e 75 6d 20 69 73 20 61 20  UE if zNum is a 
6ef0: 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
6f00: 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65 0a  teger and write.
6f10: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
6f20: 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  the integer into
6f30: 20 2a 70 4e 75 6d 2e 20 20 49 66 20 7a 4e 75 6d   *pNum.  If zNum
6f40: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
6f50: 65 72 0a 2a 2a 20 6f 72 20 69 73 20 61 6e 20 69  er.** or is an i
6f60: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 74  nteger that is t
6f70: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 65  oo large to be e
6f80: 78 70 72 65 73 73 65 64 20 77 69 74 68 20 36 34  xpressed with 64
6f90: 20 62 69 74 73 2c 0a 2a 2a 20 74 68 65 6e 20 72   bits,.** then r
6fa0: 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 49 66  eturn false.  If
6fb0: 20 6e 3e 30 20 61 6e 64 20 74 68 65 20 69 6e 74   n>0 and the int
6fc0: 65 67 65 72 20 69 73 20 73 74 72 69 6e 67 20 69  eger is string i
6fd0: 73 20 6e 6f 74 0a 2a 2a 20 65 78 61 63 74 6c 79  s not.** exactly
6fe0: 20 6e 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 72   n bytes long, r
6ff0: 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2a 0a  eturn false..**.
7000: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
7010: 74 69 6e 65 20 77 61 73 20 6f 72 69 67 69 6e 61  tine was origina
7020: 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 74 20 64  lly written it d
7030: 65 61 6c 74 20 77 69 74 68 20 6f 6e 6c 79 0a 2a  ealt with only.*
7040: 2a 20 33 32 2d 62 69 74 20 6e 75 6d 62 65 72 73  * 32-bit numbers
7050: 2e 20 20 41 74 20 74 68 61 74 20 74 69 6d 65 2c  .  At that time,
7060: 20 69 74 20 77 61 73 20 6d 75 63 68 20 66 61 73   it was much fas
7070: 74 65 72 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20  ter than the.** 
7080: 61 74 6f 69 28 29 20 6c 69 62 72 61 72 79 20 72  atoi() library r
7090: 6f 75 74 69 6e 65 20 69 6e 20 52 65 64 48 61 74  outine in RedHat
70a0: 20 37 2e 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   7.2..*/.int sql
70b0: 69 74 65 33 61 74 6f 69 36 34 28 63 6f 6e 73 74  ite3atoi64(const
70c0: 20 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36 34   char *zNum, i64
70d0: 20 2a 70 4e 75 6d 29 7b 0a 20 20 69 36 34 20 76   *pNum){.  i64 v
70e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 65 67 3b   = 0;.  int neg;
70f0: 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20 69  .  int i, c;.  i
7100: 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 29 7b  f( *zNum=='-' ){
7110: 0a 20 20 20 20 6e 65 67 20 3d 20 31 3b 0a 20 20  .    neg = 1;.  
7120: 20 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 7d 65 6c 73    zNum++;.  }els
7130: 65 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2b 27  e if( *zNum=='+'
7140: 20 29 7b 0a 20 20 20 20 6e 65 67 20 3d 20 30 3b   ){.    neg = 0;
7150: 0a 20 20 20 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 7d  .    zNum++;.  }
7160: 65 6c 73 65 7b 0a 20 20 20 20 6e 65 67 20 3d 20  else{.    neg = 
7170: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
7180: 3b 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d 27  ; (c=zNum[i])>='
7190: 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69 2b  0' && c<='9'; i+
71a0: 2b 29 7b 0a 20 20 20 20 76 20 3d 20 76 2a 31 30  +){.    v = v*10
71b0: 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 7d 0a   + c - '0';.  }.
71c0: 20 20 2a 70 4e 75 6d 20 3d 20 6e 65 67 20 3f 20    *pNum = neg ? 
71d0: 2d 76 20 3a 20 76 3b 0a 20 20 72 65 74 75 72 6e  -v : v;.  return
71e0: 20 63 3d 3d 30 20 26 26 20 69 3e 30 20 26 26 20   c==0 && i>0 && 
71f0: 0a 20 20 20 20 20 20 28 69 3c 31 39 20 7c 7c 20  .      (i<19 || 
7200: 28 69 3d 3d 31 39 20 26 26 20 6d 65 6d 63 6d 70  (i==19 && memcmp
7210: 28 7a 4e 75 6d 2c 22 39 32 32 33 33 37 32 30 33  (zNum,"922337203
7220: 36 38 35 34 37 37 35 38 30 37 22 2c 31 39 29 3c  6854775807",19)<
7230: 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  =0));.}../*.** T
7240: 68 65 20 73 74 72 69 6e 67 20 7a 4e 75 6d 20 72  he string zNum r
7250: 65 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74  epresents an int
7260: 65 67 65 72 2e 20 20 54 68 65 72 65 20 6d 69 67  eger.  There mig
7270: 68 74 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72  ht be some other
7280: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
7290: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 69 6e  following the in
72a0: 74 65 67 65 72 20 74 6f 6f 2c 20 62 75 74 20 74  teger too, but t
72b0: 68 61 74 20 70 61 72 74 20 69 73 20 69 67 6e 6f  hat part is igno
72c0: 72 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  red..** If the i
72d0: 6e 74 65 67 65 72 20 74 68 61 74 20 74 68 65 20  nteger that the 
72e0: 70 72 65 66 69 78 20 6f 66 20 7a 4e 75 6d 20 72  prefix of zNum r
72f0: 65 70 72 65 73 65 6e 74 73 20 77 69 6c 6c 20 66  epresents will f
7300: 69 74 20 69 6e 20 61 0a 2a 2a 20 33 32 2d 62 69  it in a.** 32-bi
7310: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
7320: 2c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  , return TRUE.  
7330: 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
7340: 20 46 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   FALSE..**.** Th
7350: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
7360: 6e 73 20 46 41 4c 53 45 20 66 6f 72 20 74 68 65  ns FALSE for the
7370: 20 73 74 72 69 6e 67 20 2d 32 31 34 37 34 38 33   string -2147483
7380: 36 34 38 20 65 76 65 6e 20 74 68 61 74 0a 2a 2a  648 even that.**
7390: 20 74 68 61 74 20 6e 75 6d 62 65 72 20 77 69 6c   that number wil
73a0: 6c 20 69 6e 20 66 61 63 74 20 66 69 74 20 69 6e  l in fact fit in
73b0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
73c0: 72 2e 20 20 42 75 74 20 70 6f 73 69 74 69 76 65  r.  But positive
73d0: 0a 2a 2a 20 32 31 34 37 34 38 33 36 34 38 20 77  .** 2147483648 w
73e0: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 69 6e 20 33  ill not fit in 3
73f0: 32 20 62 69 74 73 2e 20 20 53 6f 20 69 74 20 73  2 bits.  So it s
7400: 65 65 6d 73 20 73 61 66 65 72 20 74 6f 20 72 65  eems safer to re
7410: 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a  turn.** false..*
7420: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
7430: 69 74 65 33 46 69 74 73 49 6e 33 32 42 69 74 73  ite3FitsIn32Bits
7440: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75  (const char *zNu
7450: 6d 29 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a  m){.  int i, c;.
7460: 20 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27    if( *zNum=='-'
7470: 20 7c 7c 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20 29   || *zNum=='+' )
7480: 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 66 6f 72 28 69   zNum++;.  for(i
7490: 3d 30 3b 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e  =0; (c=zNum[i])>
74a0: 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20  ='0' && c<='9'; 
74b0: 69 2b 2b 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  i++){}.  return 
74c0: 69 3c 31 30 20 7c 7c 20 28 69 3d 3d 31 30 20 26  i<10 || (i==10 &
74d0: 26 20 6d 65 6d 63 6d 70 28 7a 4e 75 6d 2c 22 32  & memcmp(zNum,"2
74e0: 31 34 37 34 38 33 36 34 37 22 2c 31 30 29 3c 3d  147483647",10)<=
74f0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  0);.}../*.** If 
7500: 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20  zNum represents 
7510: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
7520: 77 69 6c 6c 20 66 69 74 20 69 6e 20 33 32 2d 62  will fit in 32-b
7530: 69 74 73 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  its, then set.**
7540: 20 2a 70 56 61 6c 75 65 20 74 6f 20 74 68 61 74   *pValue to that
7550: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74   integer and ret
7560: 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65 72  urn true.  Other
7570: 77 69 73 65 20 72 65 74 75 72 6e 20 66 61 6c 73  wise return fals
7580: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
7590: 33 47 65 74 49 6e 74 33 32 28 63 6f 6e 73 74 20  3GetInt32(const 
75a0: 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 6e 74 20  char *zNum, int 
75b0: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 66 28 20  *pValue){.  if( 
75c0: 73 71 6c 69 74 65 33 46 69 74 73 49 6e 33 32 42  sqlite3FitsIn32B
75d0: 69 74 73 28 7a 4e 75 6d 29 20 29 7b 0a 20 20 20  its(zNum) ){.   
75e0: 20 2a 70 56 61 6c 75 65 20 3d 20 61 74 6f 69 28   *pValue = atoi(
75f0: 7a 4e 75 6d 29 3b 0a 20 20 20 20 72 65 74 75 72  zNum);.    retur
7600: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
7610: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
7620: 65 20 73 74 72 69 6e 67 20 7a 4e 75 6d 20 72 65  e string zNum re
7630: 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74 65  presents an inte
7640: 67 65 72 2e 20 20 54 68 65 72 65 20 6d 69 67 68  ger.  There migh
7650: 74 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a  t be some other.
7660: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
7670: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 69 6e 74  ollowing the int
7680: 65 67 65 72 20 74 6f 6f 2c 20 62 75 74 20 74 68  eger too, but th
7690: 61 74 20 70 61 72 74 20 69 73 20 69 67 6e 6f 72  at part is ignor
76a0: 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ed..** If the in
76b0: 74 65 67 65 72 20 74 68 61 74 20 74 68 65 20 70  teger that the p
76c0: 72 65 66 69 78 20 6f 66 20 7a 4e 75 6d 20 72 65  refix of zNum re
76d0: 70 72 65 73 65 6e 74 73 20 77 69 6c 6c 20 66 69  presents will fi
76e0: 74 20 69 6e 20 61 0a 2a 2a 20 36 34 2d 62 69 74  t in a.** 64-bit
76f0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2c   signed integer,
7700: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 4f   return TRUE.  O
7710: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
7720: 46 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FALSE..**.** Thi
7730: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
7740: 73 20 46 41 4c 53 45 20 66 6f 72 20 74 68 65 20  s FALSE for the 
7750: 73 74 72 69 6e 67 20 2d 39 32 32 33 33 37 32 30  string -92233720
7760: 33 36 38 35 34 37 37 35 38 30 38 20 65 76 65 6e  36854775808 even
7770: 20 74 68 61 74 0a 2a 2a 20 74 68 61 74 20 6e 75   that.** that nu
7780: 6d 62 65 72 20 77 69 6c 6c 2c 20 69 6e 20 74 68  mber will, in th
7790: 65 6f 72 79 20 66 69 74 20 69 6e 20 61 20 36 34  eory fit in a 64
77a0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 50  -bit integer.  P
77b0: 6f 73 69 74 69 76 65 0a 2a 2a 20 39 32 32 33 33  ositive.** 92233
77c0: 37 33 30 33 36 38 35 34 37 37 35 38 30 38 20 77  73036854775808 w
77d0: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 69 6e 20 36  ill not fit in 6
77e0: 34 20 62 69 74 73 2e 20 20 53 6f 20 69 74 20 73  4 bits.  So it s
77f0: 65 65 6d 73 20 73 61 66 65 72 20 74 6f 20 72 65  eems safer to re
7800: 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a  turn.** false..*
7810: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 74  /.int sqlite3Fit
7820: 73 49 6e 36 34 42 69 74 73 28 63 6f 6e 73 74 20  sIn64Bits(const 
7830: 63 68 61 72 20 2a 7a 4e 75 6d 29 7b 0a 20 20 69  char *zNum){.  i
7840: 6e 74 20 69 2c 20 63 3b 0a 20 20 69 66 28 20 2a  nt i, c;.  if( *
7850: 7a 4e 75 6d 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 4e  zNum=='-' || *zN
7860: 75 6d 3d 3d 27 2b 27 20 29 20 7a 4e 75 6d 2b 2b  um=='+' ) zNum++
7870: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 3d  ;.  for(i=0; (c=
7880: 7a 4e 75 6d 5b 69 5d 29 3e 3d 27 30 27 20 26 26  zNum[i])>='0' &&
7890: 20 63 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a   c<='9'; i++){}.
78a0: 20 20 72 65 74 75 72 6e 20 69 3c 31 39 20 7c 7c    return i<19 ||
78b0: 20 28 69 3d 3d 31 39 20 26 26 20 6d 65 6d 63 6d   (i==19 && memcm
78c0: 70 28 7a 4e 75 6d 2c 22 39 32 32 33 33 37 32 30  p(zNum,"92233720
78d0: 33 36 38 35 34 37 37 35 38 30 37 22 2c 31 39 29  36854775807",19)
78e0: 3c 3d 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  <=0);.}.../*.** 
78f0: 43 68 61 6e 67 65 20 74 68 65 20 73 71 6c 69 74  Change the sqlit
7900: 65 2e 6d 61 67 69 63 20 66 72 6f 6d 20 53 51 4c  e.magic from SQL
7910: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 74  ITE_MAGIC_OPEN t
7920: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  o SQLITE_MAGIC_B
7930: 55 53 59 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  USY..** Return a
7940: 6e 20 65 72 72 6f 72 20 28 6e 6f 6e 2d 7a 65 72  n error (non-zer
7950: 6f 29 20 69 66 20 74 68 65 20 6d 61 67 69 63 20  o) if the magic 
7960: 77 61 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4d  was not SQLITE_M
7970: 41 47 49 43 5f 4f 50 45 4e 0a 2a 2a 20 77 68 65  AGIC_OPEN.** whe
7980: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7990: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
79a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
79b0: 61 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74  a attempt to det
79c0: 65 63 74 20 69 66 20 74 77 6f 20 74 68 72 65 61  ect if two threa
79d0: 64 73 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  ds use the.** sa
79e0: 6d 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  me sqlite* point
79f0: 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  er at the same t
7a00: 69 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61  ime.  There is a
7a10: 20 72 61 63 65 20 0a 2a 2a 20 63 6f 6e 64 69 74   race .** condit
7a20: 69 6f 6e 20 73 6f 20 69 74 20 69 73 20 70 6f 73  ion so it is pos
7a30: 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 65  sible that the e
7a40: 72 72 6f 72 20 69 73 20 6e 6f 74 20 64 65 74 65  rror is not dete
7a50: 63 74 65 64 2e 0a 2a 2a 20 42 75 74 20 75 73 75  cted..** But usu
7a60: 61 6c 6c 79 20 74 68 65 20 70 72 6f 62 6c 65 6d  ally the problem
7a70: 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 2e 20 20   will be seen.  
7a80: 54 68 65 20 72 65 73 75 6c 74 20 77 69 6c 6c 20  The result will 
7a90: 62 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 77  be an.** error w
7aa0: 68 69 63 68 20 63 61 6e 20 62 65 20 75 73 65 64  hich can be used
7ab0: 20 74 6f 20 64 65 62 75 67 20 74 68 65 20 61 70   to debug the ap
7ac0: 70 6c 69 63 61 74 69 6f 6e 20 74 68 61 74 20 69  plication that i
7ad0: 73 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 69 74  s.** using SQLit
7ae0: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  e incorrectly..*
7af0: 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32 30 32  *.** Ticket #202
7b00: 3a 20 20 49 66 20 64 62 2d 3e 6d 61 67 69 63 20  :  If db->magic 
7b10: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6f  is not a valid o
7b20: 70 65 6e 20 76 61 6c 75 65 2c 20 74 61 6b 65 20  pen value, take 
7b30: 63 61 72 65 20 6e 6f 74 0a 2a 2a 20 74 6f 20 6d  care not.** to m
7b40: 6f 64 69 66 79 20 74 68 65 20 64 62 20 73 74 72  odify the db str
7b50: 75 63 74 75 72 65 20 61 74 20 61 6c 6c 2e 20 20  ucture at all.  
7b60: 49 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  It could be that
7b70: 20 64 62 20 69 73 20 61 20 73 74 61 6c 65 0a 2a   db is a stale.*
7b80: 2a 20 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 6f  * pointer.  In o
7b90: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 63  ther words, it c
7ba0: 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
7bb0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 70 72  re has been a pr
7bc0: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  ior.** call to s
7bd0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
7be0: 20 61 6e 64 20 64 62 20 68 61 73 20 62 65 65 6e   and db has been
7bf0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 41   deallocated.  A
7c00: 6e 64 20 77 65 20 64 6f 0a 2a 2a 20 6e 6f 74 20  nd we do.** not 
7c10: 77 61 6e 74 20 74 6f 20 77 72 69 74 65 20 69 6e  want to write in
7c20: 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 6d  to deallocated m
7c30: 65 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  emory..*/.int sq
7c40: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 73 71  lite3SafetyOn(sq
7c50: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
7c60: 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c  ( db->magic==SQL
7c70: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 29  ITE_MAGIC_OPEN )
7c80: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
7c90: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
7ca0: 55 53 59 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  USY;.    return 
7cb0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  0;.  }else if( d
7cc0: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
7cd0: 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a 20  _MAGIC_BUSY ){. 
7ce0: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
7cf0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
7d00: 52 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  R;.    db->flags
7d10: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
7d20: 72 75 70 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rupt;.  }.  retu
7d30: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
7d40: 68 61 6e 67 65 20 74 68 65 20 6d 61 67 69 63 20  hange the magic 
7d50: 66 72 6f 6d 20 53 51 4c 49 54 45 5f 4d 41 47 49  from SQLITE_MAGI
7d60: 43 5f 42 55 53 59 20 74 6f 20 53 51 4c 49 54 45  C_BUSY to SQLITE
7d70: 5f 4d 41 47 49 43 5f 4f 50 45 4e 2e 0a 2a 2a 20  _MAGIC_OPEN..** 
7d80: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
7d90: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68  (non-zero) if th
7da0: 65 20 6d 61 67 69 63 20 77 61 73 20 6e 6f 74 20  e magic was not 
7db0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
7dc0: 59 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  Y.** when this r
7dd0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7df0: 53 61 66 65 74 79 4f 66 66 28 73 71 6c 69 74 65  SafetyOff(sqlite
7e00: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
7e10: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
7e20: 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a 20 20  MAGIC_BUSY ){.  
7e30: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
7e40: 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
7e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7e60: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6d   }else if( db->m
7e70: 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47  agic==SQLITE_MAG
7e80: 49 43 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 64  IC_OPEN ){.    d
7e90: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
7ea0: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20  E_MAGIC_ERROR;. 
7eb0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
7ec0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
7ed0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
7ee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
7ef0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   to make sure we
7f00: 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 64 62   have a valid db
7f10: 20 70 6f 69 6e 74 65 72 2e 20 20 54 68 69 73 20   pointer.  This 
7f20: 74 65 73 74 20 69 73 20 6e 6f 74 0a 2a 2a 20 66  test is not.** f
7f30: 6f 6f 6c 70 72 6f 6f 66 20 62 75 74 20 69 74 20  oolproof but it 
7f40: 64 6f 65 73 20 70 72 6f 76 69 64 65 20 73 6f 6d  does provide som
7f50: 65 20 6d 65 61 73 75 72 65 20 6f 66 20 70 72 6f  e measure of pro
7f60: 74 65 63 74 69 6f 6e 20 61 67 61 69 6e 73 74 0a  tection against.
7f70: 2a 2a 20 6d 69 73 75 73 65 20 6f 66 20 74 68 65  ** misuse of the
7f80: 20 69 6e 74 65 72 66 61 63 65 20 73 75 63 68 20   interface such 
7f90: 61 73 20 70 61 73 73 69 6e 67 20 69 6e 20 64 62  as passing in db
7fa0: 20 70 6f 69 6e 74 65 72 73 20 74 68 61 74 20 61   pointers that a
7fb0: 72 65 0a 2a 2a 20 4e 55 4c 4c 20 6f 72 20 77 68  re.** NULL or wh
7fc0: 69 63 68 20 68 61 76 65 20 62 65 65 6e 20 70 72  ich have been pr
7fd0: 65 76 69 6f 75 73 6c 79 20 63 6c 6f 73 65 64 2e  eviously closed.
7fe0: 20 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e    If this routin
7ff0: 65 20 72 65 74 75 72 6e 73 0a 2a 2a 20 54 52 55  e returns.** TRU
8000: 45 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  E it means that 
8010: 74 68 65 20 64 62 20 70 6f 69 6e 74 65 72 20 69  the db pointer i
8020: 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  s invalid and sh
8030: 6f 75 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 64  ould not be.** d
8040: 65 72 65 66 65 72 65 6e 63 65 64 20 66 6f 72 20  ereferenced for 
8050: 61 6e 79 20 72 65 61 73 6f 6e 2e 20 20 54 68 65  any reason.  The
8060: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
8070: 6e 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 0a  n should invoke.
8080: 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ** SQLITE_MISUSE
8090: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f   immediately..*/
80a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 61 66 65  .int sqlite3Safe
80b0: 74 79 43 68 65 63 6b 28 73 71 6c 69 74 65 33 20  tyCheck(sqlite3 
80c0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6d 61 67 69  *db){.  int magi
80d0: 63 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  c;.  if( db==0 )
80e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 61 67   return 1;.  mag
80f0: 69 63 20 3d 20 64 62 2d 3e 6d 61 67 69 63 3b 0a  ic = db->magic;.
8100: 20 20 69 66 28 20 6d 61 67 69 63 21 3d 53 51 4c    if( magic!=SQL
8110: 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
8120: 20 26 26 0a 20 20 20 20 20 20 20 20 20 6d 61 67   &&.         mag
8130: 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic!=SQLITE_MAGIC
8140: 5f 4f 50 45 4e 20 26 26 0a 20 20 20 20 20 20 20  _OPEN &&.       
8150: 20 20 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f    magic!=SQLITE_
8160: 4d 41 47 49 43 5f 42 55 53 59 20 29 20 72 65 74  MAGIC_BUSY ) ret
8170: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
8180: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
8190: 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20  variable-length 
81a0: 69 6e 74 65 67 65 72 20 65 6e 63 6f 64 69 6e 67  integer encoding
81b0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
81c0: 2a 2a 0a 2a 2a 20 4b 45 59 3a 0a 2a 2a 20 20 20  **.** KEY:.**   
81d0: 20 20 20 20 20 20 41 20 3d 20 30 78 78 78 78 78        A = 0xxxxx
81e0: 78 78 20 20 20 20 37 20 62 69 74 73 20 6f 66 20  xx    7 bits of 
81f0: 64 61 74 61 20 61 6e 64 20 6f 6e 65 20 66 6c 61  data and one fla
8200: 67 20 62 69 74 0a 2a 2a 20 20 20 20 20 20 20 20  g bit.**        
8210: 20 42 20 3d 20 31 78 78 78 78 78 78 78 20 20 20   B = 1xxxxxxx   
8220: 20 37 20 62 69 74 73 20 6f 66 20 64 61 74 61 20   7 bits of data 
8230: 61 6e 64 20 6f 6e 65 20 66 6c 61 67 20 62 69 74  and one flag bit
8240: 0a 2a 2a 20 20 20 20 20 20 20 20 20 43 20 3d 20  .**         C = 
8250: 78 78 78 78 78 78 78 78 20 20 20 20 38 20 62 69  xxxxxxxx    8 bi
8260: 74 73 20 6f 66 20 64 61 74 61 0a 2a 2a 0a 2a 2a  ts of data.**.**
8270: 20 20 37 20 62 69 74 73 20 2d 20 41 0a 2a 2a 20    7 bits - A.** 
8280: 31 34 20 62 69 74 73 20 2d 20 42 41 0a 2a 2a 20  14 bits - BA.** 
8290: 32 31 20 62 69 74 73 20 2d 20 42 42 41 0a 2a 2a  21 bits - BBA.**
82a0: 20 32 38 20 62 69 74 73 20 2d 20 42 42 42 41 0a   28 bits - BBBA.
82b0: 2a 2a 20 33 35 20 62 69 74 73 20 2d 20 42 42 42  ** 35 bits - BBB
82c0: 42 41 0a 2a 2a 20 34 32 20 62 69 74 73 20 2d 20  BA.** 42 bits - 
82d0: 42 42 42 42 42 41 0a 2a 2a 20 34 39 20 62 69 74  BBBBBA.** 49 bit
82e0: 73 20 2d 20 42 42 42 42 42 42 41 0a 2a 2a 20 35  s - BBBBBBA.** 5
82f0: 36 20 62 69 74 73 20 2d 20 42 42 42 42 42 42 42  6 bits - BBBBBBB
8300: 41 0a 2a 2a 20 36 34 20 62 69 74 73 20 2d 20 42  A.** 64 bits - B
8310: 42 42 42 42 42 42 42 43 0a 2a 2f 0a 0a 2f 2a 0a  BBBBBBBC.*/../*.
8320: 2a 2a 20 57 72 69 74 65 20 61 20 36 34 2d 62 69  ** Write a 64-bi
8330: 74 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74  t variable-lengt
8340: 68 20 69 6e 74 65 67 65 72 20 74 6f 20 6d 65 6d  h integer to mem
8350: 6f 72 79 20 73 74 61 72 74 69 6e 67 20 61 74 20  ory starting at 
8360: 70 5b 30 5d 2e 0a 2a 2a 20 54 68 65 20 6c 65 6e  p[0]..** The len
8370: 67 74 68 20 6f 66 20 64 61 74 61 20 77 72 69 74  gth of data writ
8380: 65 20 77 69 6c 6c 20 62 65 20 62 65 74 77 65 65  e will be betwee
8390: 6e 20 31 20 61 6e 64 20 39 20 62 79 74 65 73 2e  n 1 and 9 bytes.
83a0: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
83b0: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
83c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
83d0: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 2d 6c  .** A variable-l
83e0: 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 63 6f  ength integer co
83f0: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 6c 6f  nsists of the lo
8400: 77 65 72 20 37 20 62 69 74 73 20 6f 66 20 65 61  wer 7 bits of ea
8410: 63 68 20 62 79 74 65 0a 2a 2a 20 66 6f 72 20 61  ch byte.** for a
8420: 6c 6c 20 62 79 74 65 73 20 74 68 61 74 20 68 61  ll bytes that ha
8430: 76 65 20 74 68 65 20 38 74 68 20 62 69 74 20 73  ve the 8th bit s
8440: 65 74 20 61 6e 64 20 6f 6e 65 20 62 79 74 65 20  et and one byte 
8450: 77 69 74 68 20 74 68 65 20 38 74 68 0a 2a 2a 20  with the 8th.** 
8460: 62 69 74 20 63 6c 65 61 72 2e 20 20 45 78 63 65  bit clear.  Exce
8470: 70 74 2c 20 69 66 20 77 65 20 67 65 74 20 74 6f  pt, if we get to
8480: 20 74 68 65 20 39 74 68 20 62 79 74 65 2c 20 69   the 9th byte, i
8490: 74 20 73 74 6f 72 65 73 20 74 68 65 20 66 75 6c  t stores the ful
84a0: 6c 0a 2a 2a 20 38 20 62 69 74 73 20 61 6e 64 20  l.** 8 bits and 
84b0: 69 73 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  is the last byte
84c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
84d0: 50 75 74 56 61 72 69 6e 74 28 75 6e 73 69 67 6e  PutVarint(unsign
84e0: 65 64 20 63 68 61 72 20 2a 70 2c 20 75 36 34 20  ed char *p, u64 
84f0: 76 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  v){.  int i, j, 
8500: 6e 3b 0a 20 20 75 38 20 62 75 66 5b 31 30 5d 3b  n;.  u8 buf[10];
8510: 0a 20 20 69 66 28 20 76 20 26 20 28 28 28 75 36  .  if( v & (((u6
8520: 34 29 30 78 66 66 30 30 30 30 30 30 29 3c 3c 33  4)0xff000000)<<3
8530: 32 29 20 29 7b 0a 20 20 20 20 70 5b 38 5d 20 3d  2) ){.    p[8] =
8540: 20 76 3b 0a 20 20 20 20 76 20 3e 3e 3d 20 38 3b   v;.    v >>= 8;
8550: 0a 20 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 3e  .    for(i=7; i>
8560: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
8570: 70 5b 69 5d 20 3d 20 28 76 20 26 20 30 78 37 66  p[i] = (v & 0x7f
8580: 29 20 7c 20 30 78 38 30 3b 0a 20 20 20 20 20 20  ) | 0x80;.      
8590: 76 20 3e 3e 3d 20 37 3b 0a 20 20 20 20 7d 0a 20  v >>= 7;.    }. 
85a0: 20 20 20 72 65 74 75 72 6e 20 39 3b 0a 20 20 7d     return 9;.  }
85b0: 20 20 20 20 0a 20 20 6e 20 3d 20 30 3b 0a 20 20      .  n = 0;.  
85c0: 64 6f 7b 0a 20 20 20 20 62 75 66 5b 6e 2b 2b 5d  do{.    buf[n++]
85d0: 20 3d 20 28 76 20 26 20 30 78 37 66 29 20 7c 20   = (v & 0x7f) | 
85e0: 30 78 38 30 3b 0a 20 20 20 20 76 20 3e 3e 3d 20  0x80;.    v >>= 
85f0: 37 3b 0a 20 20 7d 77 68 69 6c 65 28 20 76 21 3d  7;.  }while( v!=
8600: 30 20 29 3b 0a 20 20 62 75 66 5b 30 5d 20 26 3d  0 );.  buf[0] &=
8610: 20 30 78 37 66 3b 0a 20 20 61 73 73 65 72 74 28   0x7f;.  assert(
8620: 20 6e 3c 3d 39 20 29 3b 0a 20 20 66 6f 72 28 69   n<=9 );.  for(i
8630: 3d 30 2c 20 6a 3d 6e 2d 31 3b 20 6a 3e 3d 30 3b  =0, j=n-1; j>=0;
8640: 20 6a 2d 2d 2c 20 69 2b 2b 29 7b 0a 20 20 20 20   j--, i++){.    
8650: 70 5b 69 5d 20 3d 20 62 75 66 5b 6a 5d 3b 0a 20  p[i] = buf[j];. 
8660: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
8670: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 36  ../*.** Read a 6
8680: 34 2d 62 69 74 20 76 61 72 69 61 62 6c 65 2d 6c  4-bit variable-l
8690: 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 66 72  ength integer fr
86a0: 6f 6d 20 6d 65 6d 6f 72 79 20 73 74 61 72 74 69  om memory starti
86b0: 6e 67 20 61 74 20 70 5b 30 5d 2e 0a 2a 2a 20 52  ng at p[0]..** R
86c0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
86d0: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 20   of bytes read. 
86e0: 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 73 74   The value is st
86f0: 6f 72 65 64 20 69 6e 20 2a 76 2e 0a 2a 2f 0a 69  ored in *v..*/.i
8700: 6e 74 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nt sqlite3GetVar
8710: 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  int(const unsign
8720: 65 64 20 63 68 61 72 20 2a 70 2c 20 75 36 34 20  ed char *p, u64 
8730: 2a 76 29 7b 0a 20 20 75 33 32 20 78 3b 0a 20 20  *v){.  u32 x;.  
8740: 75 36 34 20 78 36 34 3b 0a 20 20 69 6e 74 20 6e  u64 x64;.  int n
8750: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
8760: 72 20 63 3b 0a 20 20 69 66 28 20 28 28 63 20 3d  r c;.  if( ((c =
8770: 20 70 5b 30 5d 29 20 26 20 30 78 38 30 29 3d 3d   p[0]) & 0x80)==
8780: 30 20 29 7b 0a 20 20 20 20 2a 76 20 3d 20 63 3b  0 ){.    *v = c;
8790: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
87a0: 20 7d 0a 20 20 78 20 3d 20 63 20 26 20 30 78 37   }.  x = c & 0x7
87b0: 66 3b 0a 20 20 69 66 28 20 28 28 63 20 3d 20 70  f;.  if( ((c = p
87c0: 5b 31 5d 29 20 26 20 30 78 38 30 29 3d 3d 30 20  [1]) & 0x80)==0 
87d0: 29 7b 0a 20 20 20 20 2a 76 20 3d 20 28 78 3c 3c  ){.    *v = (x<<
87e0: 37 29 20 7c 20 63 3b 0a 20 20 20 20 72 65 74 75  7) | c;.    retu
87f0: 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 78 20 3d 20  rn 2;.  }.  x = 
8800: 28 78 3c 3c 37 29 20 7c 20 28 63 26 30 78 37 66  (x<<7) | (c&0x7f
8810: 29 3b 0a 20 20 69 66 28 20 28 28 63 20 3d 20 70  );.  if( ((c = p
8820: 5b 32 5d 29 20 26 20 30 78 38 30 29 3d 3d 30 20  [2]) & 0x80)==0 
8830: 29 7b 0a 20 20 20 20 2a 76 20 3d 20 28 78 3c 3c  ){.    *v = (x<<
8840: 37 29 20 7c 20 63 3b 0a 20 20 20 20 72 65 74 75  7) | c;.    retu
8850: 72 6e 20 33 3b 0a 20 20 7d 0a 20 20 78 20 3d 20  rn 3;.  }.  x = 
8860: 28 78 3c 3c 37 29 20 7c 20 28 63 26 30 78 37 66  (x<<7) | (c&0x7f
8870: 29 3b 0a 20 20 69 66 28 20 28 28 63 20 3d 20 70  );.  if( ((c = p
8880: 5b 33 5d 29 20 26 20 30 78 38 30 29 3d 3d 30 20  [3]) & 0x80)==0 
8890: 29 7b 0a 20 20 20 20 2a 76 20 3d 20 28 78 3c 3c  ){.    *v = (x<<
88a0: 37 29 20 7c 20 63 3b 0a 20 20 20 20 72 65 74 75  7) | c;.    retu
88b0: 72 6e 20 34 3b 0a 20 20 7d 0a 20 20 78 36 34 20  rn 4;.  }.  x64 
88c0: 3d 20 28 78 3c 3c 37 29 20 7c 20 28 63 26 30 78  = (x<<7) | (c&0x
88d0: 37 66 29 3b 0a 20 20 6e 20 3d 20 34 3b 0a 20 20  7f);.  n = 4;.  
88e0: 64 6f 7b 0a 20 20 20 20 63 20 3d 20 70 5b 6e 2b  do{.    c = p[n+
88f0: 2b 5d 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 39  +];.    if( n==9
8900: 20 29 7b 0a 20 20 20 20 20 20 78 36 34 20 3d 20   ){.      x64 = 
8910: 28 78 36 34 3c 3c 38 29 20 7c 20 63 3b 0a 20 20  (x64<<8) | c;.  
8920: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8930: 0a 20 20 20 20 78 36 34 20 3d 20 28 78 36 34 3c  .    x64 = (x64<
8940: 3c 37 29 20 7c 20 28 63 26 30 78 37 66 29 3b 0a  <7) | (c&0x7f);.
8950: 20 20 7d 77 68 69 6c 65 28 20 28 63 20 26 20 30    }while( (c & 0
8960: 78 38 30 29 21 3d 30 20 29 3b 0a 20 20 2a 76 20  x80)!=0 );.  *v 
8970: 3d 20 78 36 34 3b 0a 20 20 72 65 74 75 72 6e 20  = x64;.  return 
8980: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  n;.}../*.** Read
8990: 20 61 20 33 32 2d 62 69 74 20 76 61 72 69 61 62   a 32-bit variab
89a0: 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le-length intege
89b0: 72 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 73 74  r from memory st
89c0: 61 72 74 69 6e 67 20 61 74 20 70 5b 30 5d 2e 0a  arting at p[0]..
89d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
89e0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
89f0: 61 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ad.  The value i
8a00: 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 76 2e 0a  s stored in *v..
8a10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
8a20: 74 56 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20  tVarint32(const 
8a30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8a40: 2c 20 75 33 32 20 2a 76 29 7b 0a 20 20 75 33 32  , u32 *v){.  u32
8a50: 20 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 75   x;.  int n;.  u
8a60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 3b 0a  nsigned char c;.
8a70: 20 20 69 66 28 20 28 28 73 69 67 6e 65 64 20 63    if( ((signed c
8a80: 68 61 72 2a 29 70 29 5b 30 5d 3e 3d 30 20 29 7b  har*)p)[0]>=0 ){
8a90: 0a 20 20 20 20 2a 76 20 3d 20 70 5b 30 5d 3b 0a  .    *v = p[0];.
8aa0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8ab0: 7d 0a 20 20 78 20 3d 20 70 5b 30 5d 20 26 20 30  }.  x = p[0] & 0
8ac0: 78 37 66 3b 0a 20 20 69 66 28 20 28 28 73 69 67  x7f;.  if( ((sig
8ad0: 6e 65 64 20 63 68 61 72 2a 29 70 29 5b 31 5d 3e  ned char*)p)[1]>
8ae0: 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20 3d 20 28  =0 ){.    *v = (
8af0: 78 3c 3c 37 29 20 7c 20 70 5b 31 5d 3b 0a 20 20  x<<7) | p[1];.  
8b00: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
8b10: 20 20 78 20 3d 20 28 78 3c 3c 37 29 20 7c 20 28    x = (x<<7) | (
8b20: 70 5b 31 5d 20 26 20 30 78 37 66 29 3b 0a 20 20  p[1] & 0x7f);.  
8b30: 6e 20 3d 20 32 3b 0a 20 20 64 6f 7b 0a 20 20 20  n = 2;.  do{.   
8b40: 20 78 20 3d 20 28 78 3c 3c 37 29 20 7c 20 28 28   x = (x<<7) | ((
8b50: 63 20 3d 20 70 5b 6e 2b 2b 5d 29 26 30 78 37 66  c = p[n++])&0x7f
8b60: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 28 63 20  );.  }while( (c 
8b70: 26 20 30 78 38 30 29 21 3d 30 20 26 26 20 6e 3c  & 0x80)!=0 && n<
8b80: 39 20 29 3b 0a 20 20 2a 76 20 3d 20 78 3b 0a 20  9 );.  *v = x;. 
8b90: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
8ba0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
8bb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
8bc0: 68 61 74 20 77 69 6c 6c 20 62 65 20 6e 65 65 64  hat will be need
8bd0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
8be0: 67 69 76 65 6e 0a 2a 2a 20 36 34 2d 62 69 74 20  given.** 64-bit 
8bf0: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  integer..*/.int 
8c00: 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
8c10: 28 75 36 34 20 76 29 7b 0a 20 20 69 6e 74 20 69  (u64 v){.  int i
8c20: 20 3d 20 30 3b 0a 20 20 64 6f 7b 0a 20 20 20 20   = 0;.  do{.    
8c30: 69 2b 2b 3b 0a 20 20 20 20 76 20 3e 3e 3d 20 37  i++;.    v >>= 7
8c40: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 76 21 3d 30  ;.  }while( v!=0
8c50: 20 26 26 20 69 3c 39 20 29 3b 0a 20 20 72 65 74   && i<9 );.  ret
8c60: 75 72 6e 20 69 3b 0a 7d 0a 0a 23 69 66 20 21 64  urn i;.}..#if !d
8c70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8c80: 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 29  IT_BLOB_LITERAL)
8c90: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
8ca0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 5c 0a  TE_HAS_CODEC) \.
8cb0: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 53      || defined(S
8cc0: 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
8cd0: 2a 20 54 72 61 6e 73 6c 61 74 65 20 61 20 73 69  * Translate a si
8ce0: 6e 67 6c 65 20 62 79 74 65 20 6f 66 20 48 65 78  ngle byte of Hex
8cf0: 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72   into an integer
8d00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8d10: 68 65 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b  hexToInt(int h){
8d20: 0a 20 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26  .  if( h>='0' &&
8d30: 20 68 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72   h<='9' ){.    r
8d40: 65 74 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20  eturn h - '0';. 
8d50: 20 7d 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61   }else if( h>='a
8d60: 27 20 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20  ' && h<='f' ){. 
8d70: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61     return h - 'a
8d80: 27 20 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b  ' + 10;.  }else{
8d90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d  .    assert( h>=
8da0: 27 41 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b  'A' && h<='F' );
8db0: 0a 20 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20  .    return h - 
8dc0: 27 41 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a  'A' + 10;.  }.}.
8dd0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
8de0: 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
8df0: 52 41 4c 20 7c 7c 20 53 51 4c 49 54 45 5f 48 41  RAL || SQLITE_HA
8e00: 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54  S_CODEC || SQLIT
8e10: 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66 20 21  E_TEST */..#if !
8e20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8e30: 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
8e40: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
8e50: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 2f  ITE_HAS_CODEC)./
8e60: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 42  *.** Convert a B
8e70: 4c 4f 42 20 6c 69 74 65 72 61 6c 20 6f 66 20 74  LOB literal of t
8e80: 68 65 20 66 6f 72 6d 20 22 78 27 68 68 68 68 68  he form "x'hhhhh
8e90: 68 27 22 20 69 6e 74 6f 20 69 74 73 20 62 69 6e  h'" into its bin
8ea0: 61 72 79 0a 2a 2a 20 76 61 6c 75 65 2e 20 20 52  ary.** value.  R
8eb0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
8ec0: 74 6f 20 69 74 73 20 62 69 6e 61 72 79 20 76 61  to its binary va
8ed0: 6c 75 65 2e 20 20 53 70 61 63 65 20 74 6f 20 68  lue.  Space to h
8ee0: 6f 6c 64 20 74 68 65 0a 2a 2a 20 62 69 6e 61 72  old the.** binar
8ef0: 79 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e  y value has been
8f00: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
8f10: 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
8f20: 65 20 66 72 65 65 64 20 62 79 0a 2a 2a 20 74 68  e freed by.** th
8f30: 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
8f40: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
8f50: 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 63 6f 6e  te3HexToBlob(con
8f60: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
8f70: 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 69 6e  har *zBlob;.  in
8f80: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73  t i;.  int n = s
8f90: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28 20  trlen(z);.  if( 
8fa0: 6e 25 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n%2 ) return 0;.
8fb0: 0a 20 20 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72  .  zBlob = (char
8fc0: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
8fd0: 6e 2f 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n/2);.  for(i=0;
8fe0: 20 69 3c 6e 3b 20 69 2b 3d 32 29 7b 0a 20 20 20   i<n; i+=2){.   
8ff0: 20 7a 42 6c 6f 62 5b 69 2f 32 5d 20 3d 20 28 68   zBlob[i/2] = (h
9000: 65 78 54 6f 49 6e 74 28 7a 5b 69 5d 29 3c 3c 34  exToInt(z[i])<<4
9010: 29 20 7c 20 68 65 78 54 6f 49 6e 74 28 7a 5b 69  ) | hexToInt(z[i
9020: 2b 31 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  +1]);.  }.  retu
9030: 72 6e 20 7a 42 6c 6f 62 3b 0a 7d 0a 23 65 6e 64  rn zBlob;.}.#end
9040: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
9050: 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 20  IT_BLOB_LITERAL 
9060: 7c 7c 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  || SQLITE_HAS_CO
9070: 44 45 43 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  DEC */..#if defi
9080: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
9090: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
90a0: 65 78 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  ext generated by
90b0: 20 74 68 65 20 22 25 70 22 20 63 6f 6e 76 65 72   the "%p" conver
90c0: 73 69 6f 6e 20 66 6f 72 6d 61 74 20 62 61 63 6b  sion format back
90d0: 20 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f 69 6e 74   into.** a point
90e0: 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  er..*/.void *sql
90f0: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 63 6f  ite3TextToPtr(co
9100: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9110: 76 6f 69 64 20 2a 70 3b 0a 20 20 75 36 34 20 76  void *p;.  u64 v
9120: 3b 0a 20 20 75 33 32 20 76 32 3b 0a 20 20 69 66  ;.  u32 v2;.  if
9130: 28 20 7a 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a  ( z[0]=='0' && z
9140: 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20  [1]=='x' ){.    
9150: 7a 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 76 20  z += 2;.  }.  v 
9160: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
9170: 20 29 7b 0a 20 20 20 20 76 20 3d 20 28 76 3c 3c   ){.    v = (v<<
9180: 34 29 20 2b 20 68 65 78 54 6f 49 6e 74 28 2a 7a  4) + hexToInt(*z
9190: 29 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a  );.    z++;.  }.
91a0: 20 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d    if( sizeof(p)=
91b0: 3d 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20  =sizeof(v) ){.  
91c0: 20 20 70 20 3d 20 2a 28 76 6f 69 64 2a 2a 29 26    p = *(void**)&
91d0: 76 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  v;.  }else{.    
91e0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 70  assert( sizeof(p
91f0: 29 3d 3d 73 69 7a 65 6f 66 28 76 32 29 20 29 3b  )==sizeof(v2) );
9200: 0a 20 20 20 20 76 32 20 3d 20 28 75 33 32 29 76  .    v2 = (u32)v
9210: 3b 0a 20 20 20 20 70 20 3d 20 2a 28 76 6f 69 64  ;.    p = *(void
9220: 2a 2a 29 26 76 32 3b 0a 20 20 7d 0a 20 20 72 65  **)&v2;.  }.  re
9230: 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66  turn p;.}.#endif
9240: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
9250: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
9260: 53 71 6c 69 74 65 54 73 64 20 61 73 73 6f 63 69  SqliteTsd associ
9270: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63 61  ated with the ca
9280: 6c 6c 69 6e 67 20 74 68 72 65 61 64 2e 0a 2a 2f  lling thread..*/
9290: 0a 53 71 6c 69 74 65 54 73 64 20 2a 73 71 6c 69  .SqliteTsd *sqli
92a0: 74 65 33 54 73 64 28 29 7b 0a 20 20 53 71 6c 69  te3Tsd(){.  Sqli
92b0: 74 65 54 73 64 20 2a 70 54 73 64 20 3d 20 73 71  teTsd *pTsd = sq
92c0: 6c 69 74 65 33 4f 73 2e 78 54 68 72 65 61 64 53  lite3Os.xThreadS
92d0: 70 65 63 69 66 69 63 44 61 74 61 28 73 69 7a 65  pecificData(size
92e0: 6f 66 28 53 71 6c 69 74 65 54 73 64 29 29 3b 0a  of(SqliteTsd));.
92f0: 20 20 69 66 28 20 70 54 73 64 20 26 26 20 21 70    if( pTsd && !p
9300: 54 73 64 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  Tsd->isInit ){. 
9310: 20 20 20 70 54 73 64 2d 3e 6e 53 6f 66 74 48 65     pTsd->nSoftHe
9320: 61 70 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 23 69  apLimit = -1;.#i
9330: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
9340: 20 70 54 73 64 2d 3e 6d 61 6c 6c 6f 63 41 6c 6c   pTsd->mallocAll
9350: 6f 77 65 64 20 3d 20 31 3b 0a 23 65 6e 64 69 66  owed = 1;.#endif
9360: 0a 20 20 20 20 70 54 73 64 2d 3e 69 73 49 6e 69  .    pTsd->isIni
9370: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
9380: 75 72 6e 20 70 54 73 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pTsd;.}../*.
9390: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 22 6d 61  ** Clear the "ma
93a0: 6c 6c 6f 63 46 61 69 6c 65 64 22 20 66 6c 61 67  llocFailed" flag
93b0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
93c0: 20 69 6e 76 6f 6b 65 64 20 62 65 66 6f 72 65 20   invoked before 
93d0: 65 78 69 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 65  exiting any.** e
93e0: 6e 74 72 79 20 70 6f 69 6e 74 73 20 74 68 61 74  ntry points that
93f0: 20 6d 61 79 20 68 61 76 65 20 63 61 6c 6c 65 64   may have called
9400: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
9410: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9420: 4d 61 6c 6c 6f 63 43 6c 65 61 72 46 61 69 6c 65  MallocClearFaile
9430: 64 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 54 73  d(){.  sqlite3Ts
9440: 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  d()->mallocFaile
9450: 64 20 3d 20 30 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  d = 0;.}...#ifnd
9460: 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
9470: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
9480: 74 73 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  ts a flag in the
9490: 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
94a0: 2d 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20  -data structure 
94b0: 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 63 61 75  that will.** cau
94c0: 73 65 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20  se an assert to 
94d0: 66 61 69 6c 20 69 66 20 73 71 6c 69 74 65 4d 61  fail if sqliteMa
94e0: 6c 6c 6f 63 28 29 20 6f 72 20 73 71 6c 69 74 65  lloc() or sqlite
94f0: 52 65 61 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c  Realloc() is cal
9500: 6c 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  led..*/.void sql
9510: 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c  ite3MallocDisall
9520: 6f 77 28 29 7b 0a 20 20 61 73 73 65 72 74 28 73  ow(){.  assert(s
9530: 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c  qlite3Tsd()->mal
9540: 6c 6f 63 41 6c 6c 6f 77 65 64 29 3b 0a 20 20 73  locAllowed);.  s
9550: 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c  qlite3Tsd()->mal
9560: 6c 6f 63 41 6c 6c 6f 77 65 64 20 3d 20 30 3b 0a  locAllowed = 0;.
9570: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
9580: 6e 63 74 69 6f 6e 20 63 6c 65 61 72 73 20 74 68  nction clears th
9590: 65 20 66 6c 61 67 20 73 65 74 20 69 6e 20 74 68  e flag set in th
95a0: 65 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  e thread-specifi
95b0: 63 2d 64 61 74 61 20 73 74 72 75 63 74 75 72 65  c-data structure
95c0: 20 73 65 74 0a 2a 2a 20 62 79 20 73 71 6c 69 74   set.** by sqlit
95d0: 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77  e3MallocDisallow
95e0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
95f0: 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29  te3MallocAllow()
9600: 7b 0a 20 20 61 73 73 65 72 74 28 21 73 71 6c 69  {.  assert(!sqli
9610: 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
9620: 41 6c 6c 6f 77 65 64 29 3b 0a 20 20 73 71 6c 69  Allowed);.  sqli
9630: 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
9640: 41 6c 6c 6f 77 65 64 20 3d 20 31 3b 0a 7d 0a 23  Allowed = 1;.}.#
9650: 65 6e 64 69 66 0a 0a 0a                          endif...