/ Hex Artifact Content
Login

Artifact 56008ded7b0695939f1127b47c195525fde10276:


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 2f 0a 23  ke that..**.*/.#
0210: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0220: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0230: 73 74 64 61 72 67 2e 68 3e 0a 23 69 66 64 65 66  stdarg.h>.#ifdef
0240: 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 49 53 4e   SQLITE_HAVE_ISN
0250: 41 4e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6d 61  AN.# include <ma
0260: 74 68 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  th.h>.#endif../*
0270: 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 6e 65 65 64  .** Routine need
0280: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68  ed to support th
0290: 65 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  e testcase() mac
02a0: 72 6f 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ro..*/.#ifdef SQ
02b0: 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
02c0: 53 54 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  ST.void sqlite3C
02d0: 6f 76 65 72 61 67 65 28 69 6e 74 20 78 29 7b 0a  overage(int x){.
02e0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d    static int dum
02f0: 6d 79 20 3d 20 30 3b 0a 20 20 64 75 6d 6d 79 20  my = 0;.  dummy 
0300: 2b 3d 20 78 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  += x;.}.#endif..
0310: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
0320: 65 20 69 66 20 74 68 65 20 66 6c 6f 61 74 69 6e  e if the floatin
0330: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 69 73  g point value is
0340: 20 4e 6f 74 20 61 20 4e 75 6d 62 65 72 20 28 4e   Not a Number (N
0350: 61 4e 29 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  aN)..**.** Use t
0360: 68 65 20 6d 61 74 68 20 6c 69 62 72 61 72 79 20  he math library 
0370: 69 73 6e 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e  isnan() function
0380: 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   if compiled wit
0390: 68 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 49 53  h SQLITE_HAVE_IS
03a0: 4e 41 4e 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  NAN..** Otherwis
03b0: 65 2c 20 77 65 20 68 61 76 65 20 6f 75 72 20 6f  e, we have our o
03c0: 77 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  wn implementatio
03d0: 6e 20 74 68 61 74 20 77 6f 72 6b 73 20 6f 6e 20  n that works on 
03e0: 6d 6f 73 74 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  most systems..*/
03f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 4e 61  .int sqlite3IsNa
0400: 4e 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20 20 69  N(double x){.  i
0410: 6e 74 20 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  nt rc;   /* The 
0420: 76 61 6c 75 65 20 72 65 74 75 72 6e 20 2a 2f 0a  value return */.
0430: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
0440: 49 54 45 5f 48 41 56 45 5f 49 53 4e 41 4e 29 0a  ITE_HAVE_ISNAN).
0450: 20 20 2f 2a 0a 20 20 2a 2a 20 53 79 73 74 65 6d    /*.  ** System
0460: 73 20 74 68 61 74 20 73 75 70 70 6f 72 74 20 74  s that support t
0470: 68 65 20 69 73 6e 61 6e 28 29 20 6c 69 62 72 61  he isnan() libra
0480: 72 79 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  ry function shou
0490: 6c 64 20 70 72 6f 62 61 62 6c 79 0a 20 20 2a 2a  ld probably.  **
04a0: 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 69 74 20   make use of it 
04b0: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
04c0: 68 20 2d 44 53 51 4c 49 54 45 5f 48 41 56 45 5f  h -DSQLITE_HAVE_
04d0: 49 53 4e 41 4e 2e 20 20 42 75 74 20 77 65 20 68  ISNAN.  But we h
04e0: 61 76 65 0a 20 20 2a 2a 20 66 6f 75 6e 64 20 74  ave.  ** found t
04f0: 68 61 74 20 6d 61 6e 79 20 73 79 73 74 65 6d 73  hat many systems
0500: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 77   do not have a w
0510: 6f 72 6b 69 6e 67 20 69 73 6e 61 6e 28 29 20 66  orking isnan() f
0520: 75 6e 63 74 69 6f 6e 20 73 6f 0a 20 20 2a 2a 20  unction so.  ** 
0530: 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
0540: 69 6f 6e 20 69 73 20 70 72 6f 76 69 64 65 64 20  ion is provided 
0550: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
0560: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
0570: 73 20 4e 61 4e 20 74 65 73 74 20 73 6f 6d 65 74  s NaN test somet
0580: 69 6d 65 73 20 66 61 69 6c 73 20 69 66 20 63 6f  imes fails if co
0590: 6d 70 69 6c 65 64 20 6f 6e 20 47 43 43 20 77 69  mpiled on GCC wi
05a0: 74 68 20 2d 66 66 61 73 74 2d 6d 61 74 68 2e 0a  th -ffast-math..
05b0: 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
05c0: 72 20 68 61 6e 64 2c 20 74 68 65 20 75 73 65 20  r hand, the use 
05d0: 6f 66 20 2d 66 66 61 73 74 2d 6d 61 74 68 20 63  of -ffast-math c
05e0: 6f 6d 65 73 20 77 69 74 68 20 74 68 65 20 66 6f  omes with the fo
05f0: 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 77 61 72  llowing.  ** war
0600: 6e 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ning:.  **.  ** 
0610: 20 20 20 20 20 54 68 69 73 20 6f 70 74 69 6f 6e       This option
0620: 20 5b 2d 66 66 61 73 74 2d 6d 61 74 68 5d 20 73   [-ffast-math] s
0630: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 74  hould never be t
0640: 75 72 6e 65 64 20 6f 6e 20 62 79 20 61 6e 79 0a  urned on by any.
0650: 20 20 2a 2a 20 20 20 20 20 20 2d 4f 20 6f 70 74    **      -O opt
0660: 69 6f 6e 20 73 69 6e 63 65 20 69 74 20 63 61 6e  ion since it can
0670: 20 72 65 73 75 6c 74 20 69 6e 20 69 6e 63 6f 72   result in incor
0680: 72 65 63 74 20 6f 75 74 70 75 74 20 66 6f 72 20  rect output for 
0690: 70 72 6f 67 72 61 6d 73 0a 20 20 2a 2a 20 20 20  programs.  **   
06a0: 20 20 20 77 68 69 63 68 20 64 65 70 65 6e 64 20     which depend 
06b0: 6f 6e 20 61 6e 20 65 78 61 63 74 20 69 6d 70 6c  on an exact impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 49 45  ementation of IE
06d0: 45 45 20 6f 72 20 49 53 4f 20 0a 20 20 2a 2a 20  EE or ISO .  ** 
06e0: 20 20 20 20 20 72 75 6c 65 73 2f 73 70 65 63 69       rules/speci
06f0: 66 69 63 61 74 69 6f 6e 73 20 66 6f 72 20 6d 61  fications for ma
0700: 74 68 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  th functions..  
0710: 2a 2a 0a 20 20 2a 2a 20 55 6e 64 65 72 20 4d 53  **.  ** Under MS
0720: 56 43 2c 20 74 68 69 73 20 4e 61 4e 20 74 65 73  VC, this NaN tes
0730: 74 20 6d 61 79 20 66 61 69 6c 20 69 66 20 63 6f  t may fail if co
0740: 6d 70 69 6c 65 64 20 77 69 74 68 20 61 20 66 6c  mpiled with a fl
0750: 6f 61 74 69 6e 67 2d 0a 20 20 2a 2a 20 70 6f 69  oating-.  ** poi
0760: 6e 74 20 70 72 65 63 69 73 69 6f 6e 20 6d 6f 64  nt precision mod
0770: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 2f 66 70  e other than /fp
0780: 3a 70 72 65 63 69 73 65 2e 20 20 46 72 6f 6d 20  :precise.  From 
0790: 74 68 65 20 4d 53 44 4e 20 0a 20 20 2a 2a 20 64  the MSDN .  ** d
07a0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 3a 0a 20 20  ocumentation:.  
07b0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 54 68 65  **.  **      The
07c0: 20 63 6f 6d 70 69 6c 65 72 20 5b 77 69 74 68 20   compiler [with 
07d0: 2f 66 70 3a 70 72 65 63 69 73 65 5d 20 77 69 6c  /fp:precise] wil
07e0: 6c 20 70 72 6f 70 65 72 6c 79 20 68 61 6e 64 6c  l properly handl
07f0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 0a 20  e comparisons . 
0800: 20 2a 2a 20 20 20 20 20 20 69 6e 76 6f 6c 76 69   **      involvi
0810: 6e 67 20 4e 61 4e 2e 20 46 6f 72 20 65 78 61 6d  ng NaN. For exam
0820: 70 6c 65 2c 20 78 20 21 3d 20 78 20 65 76 61 6c  ple, x != x eval
0830: 75 61 74 65 73 20 74 6f 20 74 72 75 65 20 69 66  uates to true if
0840: 20 78 20 69 73 20 4e 61 4e 20 0a 20 20 2a 2a 20   x is NaN .  ** 
0850: 20 20 20 20 20 2e 2e 2e 0a 20 20 2a 2f 0a 23 69       ....  */.#i
0860: 66 64 65 66 20 5f 5f 46 41 53 54 5f 4d 41 54 48  fdef __FAST_MATH
0870: 5f 5f 0a 23 20 65 72 72 6f 72 20 53 51 4c 69 74  __.# error SQLit
0880: 65 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  e will not work 
0890: 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68 20 74  correctly with t
08a0: 68 65 20 2d 66 66 61 73 74 2d 6d 61 74 68 20 6f  he -ffast-math o
08b0: 70 74 69 6f 6e 20 6f 66 20 47 43 43 2e 0a 23 65  ption of GCC..#e
08c0: 6e 64 69 66 0a 20 20 76 6f 6c 61 74 69 6c 65 20  ndif.  volatile 
08d0: 64 6f 75 62 6c 65 20 79 20 3d 20 78 3b 0a 20 20  double y = x;.  
08e0: 76 6f 6c 61 74 69 6c 65 20 64 6f 75 62 6c 65 20  volatile double 
08f0: 7a 20 3d 20 79 3b 0a 20 20 72 63 20 3d 20 28 79  z = y;.  rc = (y
0900: 21 3d 7a 29 3b 0a 23 65 6c 73 65 20 20 2f 2a 20  !=z);.#else  /* 
0910: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0920: 45 5f 48 41 56 45 5f 49 53 4e 41 4e 29 20 2a 2f  E_HAVE_ISNAN) */
0930: 0a 20 20 72 63 20 3d 20 69 73 6e 61 6e 28 78 29  .  rc = isnan(x)
0940: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
0950: 54 45 5f 48 41 56 45 5f 49 53 4e 41 4e 20 2a 2f  TE_HAVE_ISNAN */
0960: 0a 20 20 74 65 73 74 63 61 73 65 28 20 72 63 20  .  testcase( rc 
0970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
0980: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
0990: 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   a string length
09a0: 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64   that is limited
09b0: 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20   to what can be 
09c0: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77  stored in.** low
09d0: 65 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20  er 30 bits of a 
09e0: 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  32-bit signed in
09f0: 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  teger..**.** The
0a00: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
0a10: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 6e 65  will never be ne
0a20: 67 61 74 69 76 65 2e 20 20 4e 6f 72 20 77 69 6c  gative.  Nor wil
0a30: 6c 20 69 74 20 65 76 65 72 20 62 65 20 67 72 65  l it ever be gre
0a40: 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 74 68 65  ater.** than the
0a50: 20 61 63 74 75 61 6c 20 6c 65 6e 67 74 68 20 6f   actual length o
0a60: 66 20 74 68 65 20 73 74 72 69 6e 67 2e 20 20 46  f the string.  F
0a70: 6f 72 20 76 65 72 79 20 6c 6f 6e 67 20 73 74 72  or very long str
0a80: 69 6e 67 73 20 28 67 72 65 61 74 65 72 0a 2a 2a  ings (greater.**
0a90: 20 74 68 61 6e 20 31 47 69 42 29 20 74 68 65 20   than 1GiB) the 
0aa0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 6d  value returned m
0ab0: 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
0ac0: 6e 20 74 68 65 20 74 72 75 65 20 73 74 72 69 6e  n the true strin
0ad0: 67 20 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 69 6e 74  g length..*/.int
0ae0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
0af0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0b10: 32 20 3d 20 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d  2 = z;.  if( z==
0b20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
0b30: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32  while( *z2 ){ z2
0b40: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ++; }.  return 0
0b50: 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74  x3fffffff & (int
0b60: 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a  )(z2 - z);.}../*
0b70: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 6f 73 74  .** Set the most
0b80: 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f   recent error co
0b90: 64 65 20 61 6e 64 20 65 72 72 6f 72 20 73 74 72  de and error str
0ba0: 69 6e 67 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ing for the sqli
0bb0: 74 65 0a 2a 2a 20 68 61 6e 64 6c 65 20 22 64 62  te.** handle "db
0bc0: 22 2e 20 54 68 65 20 65 72 72 6f 72 20 63 6f 64  ". The error cod
0bd0: 65 20 69 73 20 73 65 74 20 74 6f 20 22 65 72 72  e is set to "err
0be0: 5f 63 6f 64 65 22 2e 0a 2a 2a 0a 2a 2a 20 49 66  _code"..**.** If
0bf0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
0c00: 20 73 74 72 69 6e 67 20 7a 46 6f 72 6d 61 74 20   string zFormat 
0c10: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 66 6f  specifies the fo
0c20: 72 6d 61 74 20 6f 66 20 74 68 65 0a 2a 2a 20 65  rmat of the.** e
0c30: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 20 74  rror string in t
0c40: 68 65 20 73 74 79 6c 65 20 6f 66 20 74 68 65 20  he style of the 
0c50: 70 72 69 6e 74 66 20 66 75 6e 63 74 69 6f 6e 73  printf functions
0c60: 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  : The following.
0c70: 2a 2a 20 66 6f 72 6d 61 74 20 63 68 61 72 61 63  ** format charac
0c80: 74 65 72 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ters are allowed
0c90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 25 73 20  :.**.**      %s 
0ca0: 20 20 20 20 20 49 6e 73 65 72 74 20 61 20 73 74       Insert a st
0cb0: 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 25 7a 20  ring.**      %z 
0cc0: 20 20 20 20 20 41 20 73 74 72 69 6e 67 20 74 68       A string th
0cd0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  at should be fre
0ce0: 65 64 20 61 66 74 65 72 20 75 73 65 0a 2a 2a 20  ed after use.** 
0cf0: 20 20 20 20 20 25 64 20 20 20 20 20 20 49 6e 73       %d      Ins
0d00: 65 72 74 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a  ert an integer.*
0d10: 2a 20 20 20 20 20 20 25 54 20 20 20 20 20 20 49  *      %T      I
0d20: 6e 73 65 72 74 20 61 20 74 6f 6b 65 6e 0a 2a 2a  nsert a token.**
0d30: 20 20 20 20 20 20 25 53 20 20 20 20 20 20 49 6e        %S      In
0d40: 73 65 72 74 20 74 68 65 20 66 69 72 73 74 20 65  sert the first e
0d50: 6c 65 6d 65 6e 74 20 6f 66 20 61 20 53 72 63 4c  lement of a SrcL
0d60: 69 73 74 0a 2a 2a 0a 2a 2a 20 7a 46 6f 72 6d 61  ist.**.** zForma
0d70: 74 20 61 6e 64 20 61 6e 79 20 73 74 72 69 6e 67  t and any string
0d80: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 66 6f 6c   tokens that fol
0d90: 6c 6f 77 20 69 74 20 61 72 65 20 61 73 73 75 6d  low it are assum
0da0: 65 64 20 74 6f 20 62 65 0a 2a 2a 20 65 6e 63 6f  ed to be.** enco
0db0: 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  ded in UTF-8..**
0dc0: 0a 2a 2a 20 54 6f 20 63 6c 65 61 72 20 74 68 65  .** To clear the
0dd0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
0de0: 6f 72 20 66 6f 72 20 73 71 6c 69 74 65 20 68 61  or for sqlite ha
0df0: 6e 64 6c 65 20 22 64 62 22 2c 20 73 71 6c 69 74  ndle "db", sqlit
0e00: 65 33 45 72 72 6f 72 0a 2a 2a 20 73 68 6f 75 6c  e3Error.** shoul
0e10: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
0e20: 20 65 72 72 5f 63 6f 64 65 20 73 65 74 20 74 6f   err_code set to
0e30: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 7a   SQLITE_OK and z
0e40: 46 6f 72 6d 61 74 20 73 65 74 0a 2a 2a 20 74 6f  Format set.** to
0e50: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   NULL..*/.void s
0e60: 71 6c 69 74 65 33 45 72 72 6f 72 28 73 71 6c 69  qlite3Error(sqli
0e70: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 65 72 72  te3 *db, int err
0e80: 5f 63 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61  _code, const cha
0e90: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
0ea0: 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 28 64  {.  if( db && (d
0eb0: 62 2d 3e 70 45 72 72 20 7c 7c 20 28 64 62 2d 3e  b->pErr || (db->
0ec0: 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61  pErr = sqlite3Va
0ed0: 6c 75 65 4e 65 77 28 64 62 29 29 21 3d 30 29 20  lueNew(db))!=0) 
0ee0: 29 7b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f  ){.    db->errCo
0ef0: 64 65 20 3d 20 65 72 72 5f 63 6f 64 65 3b 0a 20  de = err_code;. 
0f00: 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 20 29     if( zFormat )
0f10: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
0f20: 0a 20 20 20 20 20 20 76 61 5f 6c 69 73 74 20 61  .      va_list a
0f30: 70 3b 0a 20 20 20 20 20 20 76 61 5f 73 74 61 72  p;.      va_star
0f40: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
0f50: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
0f60: 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46  3VMPrintf(db, zF
0f70: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
0f80: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
0f90: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
0fa0: 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
0fb0: 20 2d 31 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 55   -1, z, SQLITE_U
0fc0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  TF8, SQLITE_DYNA
0fd0: 4d 49 43 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  MIC);.    }else{
0fe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
0ff0: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
1000: 72 72 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45  rr, 0, 0, SQLITE
1010: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
1020: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ATIC);.    }.  }
1030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1040: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
1050: 6f 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  o pParse->zErrMs
1060: 67 20 61 6e 64 20 69 6e 63 72 65 6d 65 6e 74 20  g and increment 
1070: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2e 0a 2a 2a  pParse->nErr..**
1080: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
1090: 6f 72 6d 61 74 74 69 6e 67 20 63 68 61 72 61 63  ormatting charac
10a0: 74 65 72 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ters are allowed
10b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 25 73 20  :.**.**      %s 
10c0: 20 20 20 20 20 49 6e 73 65 72 74 20 61 20 73 74       Insert a st
10d0: 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 25 7a 20  ring.**      %z 
10e0: 20 20 20 20 20 41 20 73 74 72 69 6e 67 20 74 68       A string th
10f0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  at should be fre
1100: 65 64 20 61 66 74 65 72 20 75 73 65 0a 2a 2a 20  ed after use.** 
1110: 20 20 20 20 20 25 64 20 20 20 20 20 20 49 6e 73       %d      Ins
1120: 65 72 74 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a  ert an integer.*
1130: 2a 20 20 20 20 20 20 25 54 20 20 20 20 20 20 49  *      %T      I
1140: 6e 73 65 72 74 20 61 20 74 6f 6b 65 6e 0a 2a 2a  nsert a token.**
1150: 20 20 20 20 20 20 25 53 20 20 20 20 20 20 49 6e        %S      In
1160: 73 65 72 74 20 74 68 65 20 66 69 72 73 74 20 65  sert the first e
1170: 6c 65 6d 65 6e 74 20 6f 66 20 61 20 53 72 63 4c  lement of a SrcL
1180: 69 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ist.**.** This f
1190: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
11a0: 65 20 75 73 65 64 20 74 6f 20 72 65 70 6f 72 74  e used to report
11b0: 20 61 6e 79 20 65 72 72 6f 72 20 74 68 61 74 20   any error that 
11c0: 6f 63 63 75 72 73 20 77 68 69 6c 73 74 0a 2a 2a  occurs whilst.**
11d0: 20 63 6f 6d 70 69 6c 69 6e 67 20 61 6e 20 53 51   compiling an SQ
11e0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 28 69 2e 65  L statement (i.e
11f0: 2e 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33  . within sqlite3
1200: 5f 70 72 65 70 61 72 65 28 29 29 2e 20 54 68 65  _prepare()). The
1210: 0a 2a 2a 20 6c 61 73 74 20 74 68 69 6e 67 20 74  .** last thing t
1220: 68 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  he sqlite3_prepa
1230: 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f  re() function do
1240: 65 73 20 69 73 20 63 6f 70 79 20 74 68 65 20 65  es is copy the e
1250: 72 72 6f 72 0a 2a 2a 20 73 74 6f 72 65 64 20 62  rror.** stored b
1260: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
1270: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1280: 65 20 68 61 6e 64 6c 65 20 75 73 69 6e 67 20 73  e handle using s
1290: 71 6c 69 74 65 33 45 72 72 6f 72 28 29 2e 0a 2a  qlite3Error()..*
12a0: 2a 20 46 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74  * Function sqlit
12b0: 65 33 45 72 72 6f 72 28 29 20 73 68 6f 75 6c 64  e3Error() should
12c0: 20 62 65 20 75 73 65 64 20 64 75 72 69 6e 67 20   be used during 
12d0: 73 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74  statement execut
12e0: 69 6f 6e 0a 2a 2a 20 28 73 71 6c 69 74 65 33 5f  ion.** (sqlite3_
12f0: 73 74 65 70 28 29 20 65 74 63 2e 29 2e 0a 2a 2f  step() etc.)..*/
1300: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 72 72  .void sqlite3Err
1310: 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61  orMsg(Parse *pPa
1320: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1330: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1340: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
1350: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73 71  va_list ap;.  sq
1360: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1370: 73 65 2d 3e 64 62 3b 0a 20 20 76 61 5f 73 74 61  se->db;.  va_sta
1380: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1390: 0a 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  .  zMsg = sqlite
13a0: 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46  3VMPrintf(db, zF
13b0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
13c0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
13d0: 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 20  db->suppressErr 
13e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
13f0: 46 72 65 65 28 64 62 2c 20 7a 4d 73 67 29 3b 0a  Free(db, zMsg);.
1400: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1410: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
1420: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1430: 62 2c 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  b, pParse->zErrM
1440: 73 67 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  sg);.    pParse-
1450: 3e 7a 45 72 72 4d 73 67 20 3d 20 7a 4d 73 67 3b  >zErrMsg = zMsg;
1460: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1470: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1480: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
1490: 76 65 72 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c  vert an SQL-styl
14a0: 65 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e quoted string 
14b0: 69 6e 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74  into a normal st
14c0: 72 69 6e 67 20 62 79 20 72 65 6d 6f 76 69 6e 67  ring by removing
14d0: 0a 2a 2a 20 74 68 65 20 71 75 6f 74 65 20 63 68  .** the quote ch
14e0: 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 63  aracters.  The c
14f0: 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e  onversion is don
1500: 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20  e in-place.  If 
1510: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65  the.** input doe
1520: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
1530: 20 61 20 71 75 6f 74 65 20 63 68 61 72 61 63 74   a quote charact
1540: 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  er, then this ro
1550: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f  utine.** is a no
1560: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  -op..**.** The i
1570: 6e 70 75 74 20 73 74 72 69 6e 67 20 6d 75 73 74  nput string must
1580: 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
1590: 74 65 64 2e 20 20 41 20 6e 65 77 20 7a 65 72 6f  ted.  A new zero
15a0: 2d 74 65 72 6d 69 6e 61 74 6f 72 0a 2a 2a 20 69  -terminator.** i
15b0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  s added to the d
15c0: 65 71 75 6f 74 65 64 20 73 74 72 69 6e 67 2e 0a  equoted string..
15d0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
15e0: 20 76 61 6c 75 65 20 69 73 20 2d 31 20 69 66 20   value is -1 if 
15f0: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 6f 63 63  no dequoting occ
1600: 75 72 73 20 6f 72 20 74 68 65 20 6c 65 6e 67 74  urs or the lengt
1610: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 65 71 75  h of the.** dequ
1620: 6f 74 65 64 20 73 74 72 69 6e 67 2c 20 65 78 63  oted string, exc
1630: 6c 75 73 69 76 65 20 6f 66 20 74 68 65 20 7a 65  lusive of the ze
1640: 72 6f 20 74 65 72 6d 69 6e 61 74 6f 72 2c 20 69  ro terminator, i
1650: 66 20 64 65 71 75 6f 74 69 6e 67 20 64 6f 65 73  f dequoting does
1660: 0a 2a 2a 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a  .** occur..**.**
1670: 20 32 30 30 32 2d 46 65 62 2d 31 34 3a 20 54 68   2002-Feb-14: Th
1680: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 65 78  is routine is ex
1690: 74 65 6e 64 65 64 20 74 6f 20 72 65 6d 6f 76 65  tended to remove
16a0: 20 4d 53 2d 41 63 63 65 73 73 20 73 74 79 6c 65   MS-Access style
16b0: 0a 2a 2a 20 62 72 61 63 6b 65 74 73 20 66 72 6f  .** brackets fro
16c0: 6d 20 61 72 6f 75 6e 64 20 69 64 65 6e 74 69 66  m around identif
16d0: 65 72 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ers.  For exampl
16e0: 65 3a 20 20 22 5b 61 2d 62 2d 63 5d 22 20 62 65  e:  "[a-b-c]" be
16f0: 63 6f 6d 65 73 0a 2a 2a 20 22 61 2d 62 2d 63 22  comes.** "a-b-c"
1700: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1710: 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 29  Dequote(char *z)
1720: 7b 0a 20 20 63 68 61 72 20 71 75 6f 74 65 3b 0a  {.  char quote;.
1730: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66    int i, j;.  if
1740: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
1750: 2d 31 3b 0a 20 20 71 75 6f 74 65 20 3d 20 7a 5b  -1;.  quote = z[
1760: 30 5d 3b 0a 20 20 73 77 69 74 63 68 28 20 71 75  0];.  switch( qu
1770: 6f 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ote ){.    case 
1780: 27 5c 27 27 3a 20 20 62 72 65 61 6b 3b 0a 20 20  '\'':  break;.  
1790: 20 20 63 61 73 65 20 27 22 27 3a 20 20 20 62 72    case '"':   br
17a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 60  eak;.    case '`
17b0: 27 3a 20 20 20 62 72 65 61 6b 3b 20 20 20 20 20  ':   break;     
17c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
17d0: 72 20 4d 79 53 51 4c 20 63 6f 6d 70 61 74 69 62  r MySQL compatib
17e0: 69 6c 69 74 79 20 2a 2f 0a 20 20 20 20 63 61 73  ility */.    cas
17f0: 65 20 27 5b 27 3a 20 20 20 71 75 6f 74 65 20 3d  e '[':   quote =
1800: 20 27 5d 27 3b 20 20 62 72 65 61 6b 3b 20 20 2f   ']';  break;  /
1810: 2a 20 46 6f 72 20 4d 53 20 53 71 6c 53 65 72 76  * For MS SqlServ
1820: 65 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  er compatibility
1830: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
1840: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1850: 20 7d 0a 20 20 66 6f 72 28 69 3d 31 2c 20 6a 3d   }.  for(i=1, j=
1860: 30 3b 20 41 4c 57 41 59 53 28 7a 5b 69 5d 29 3b  0; ALWAYS(z[i]);
1870: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
1880: 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20  [i]==quote ){.  
1890: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
18a0: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  quote ){.       
18b0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 71 75 6f 74 65 3b   z[j++] = quote;
18c0: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
18d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1900: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
1910: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b  ;.    }.  }.  z[
1920: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
1930: 20 6a 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 76 65 6e   j;.}../* Conven
1940: 69 65 6e 74 20 73 68 6f 72 74 2d 68 61 6e 64 20  ient short-hand 
1950: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 70 70 65 72  */.#define Upper
1960: 54 6f 4c 6f 77 65 72 20 73 71 6c 69 74 65 33 55  ToLower sqlite3U
1970: 70 70 65 72 54 6f 4c 6f 77 65 72 0a 0a 2f 2a 0a  pperToLower../*.
1980: 2a 2a 20 53 6f 6d 65 20 73 79 73 74 65 6d 73 20  ** Some systems 
1990: 68 61 76 65 20 73 74 72 69 63 6d 70 28 29 2e 20  have stricmp(). 
19a0: 20 4f 74 68 65 72 73 20 68 61 76 65 20 73 74 72   Others have str
19b0: 63 61 73 65 63 6d 70 28 29 2e 20 20 42 65 63 61  casecmp().  Beca
19c0: 75 73 65 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  use.** there is 
19d0: 6e 6f 20 63 6f 6e 73 69 73 74 65 6e 63 79 2c 20  no consistency, 
19e0: 77 65 20 77 69 6c 6c 20 64 65 66 69 6e 65 20 6f  we will define o
19f0: 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ur own..*/.int s
1a00: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 63 6f  qlite3StrICmp(co
1a10: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c  nst char *zLeft,
1a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 69   const char *zRi
1a30: 67 68 74 29 7b 0a 20 20 72 65 67 69 73 74 65 72  ght){.  register
1a40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1a50: 61 2c 20 2a 62 3b 0a 20 20 61 20 3d 20 28 75 6e  a, *b;.  a = (un
1a60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c  signed char *)zL
1a70: 65 66 74 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69  eft;.  b = (unsi
1a80: 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 52 69 67  gned char *)zRig
1a90: 68 74 3b 0a 20 20 77 68 69 6c 65 28 20 2a 61 21  ht;.  while( *a!
1aa0: 3d 30 20 26 26 20 55 70 70 65 72 54 6f 4c 6f 77  =0 && UpperToLow
1ab0: 65 72 5b 2a 61 5d 3d 3d 55 70 70 65 72 54 6f 4c  er[*a]==UpperToL
1ac0: 6f 77 65 72 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20  ower[*b]){ a++; 
1ad0: 62 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  b++; }.  return 
1ae0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d  UpperToLower[*a]
1af0: 20 2d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b   - UpperToLower[
1b00: 2a 62 5d 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  *b];.}.int sqlit
1b10: 65 33 5f 73 74 72 6e 69 63 6d 70 28 63 6f 6e 73  e3_strnicmp(cons
1b20: 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63  t char *zLeft, c
1b30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 69 67 68  onst char *zRigh
1b40: 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 67  t, int N){.  reg
1b50: 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 63  ister unsigned c
1b60: 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20 61 20  har *a, *b;.  a 
1b70: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
1b80: 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20 3d 20   *)zLeft;.  b = 
1b90: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
1ba0: 29 7a 52 69 67 68 74 3b 0a 20 20 77 68 69 6c 65  )zRight;.  while
1bb0: 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 2a 61 21  ( N-- > 0 && *a!
1bc0: 3d 30 20 26 26 20 55 70 70 65 72 54 6f 4c 6f 77  =0 && UpperToLow
1bd0: 65 72 5b 2a 61 5d 3d 3d 55 70 70 65 72 54 6f 4c  er[*a]==UpperToL
1be0: 6f 77 65 72 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20  ower[*b]){ a++; 
1bf0: 62 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  b++; }.  return 
1c00: 4e 3c 30 20 3f 20 30 20 3a 20 55 70 70 65 72 54  N<0 ? 0 : UpperT
1c10: 6f 4c 6f 77 65 72 5b 2a 61 5d 20 2d 20 55 70 70  oLower[*a] - Upp
1c20: 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d 3b 0a 7d  erToLower[*b];.}
1c30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1c40: 52 55 45 20 69 66 20 7a 20 69 73 20 61 20 70 75  RUE if z is a pu
1c50: 72 65 20 6e 75 6d 65 72 69 63 20 73 74 72 69 6e  re numeric strin
1c60: 67 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  g.  Return FALSE
1c70: 20 61 6e 64 20 6c 65 61 76 65 0a 2a 2a 20 2a 72   and leave.** *r
1c80: 65 61 6c 6e 75 6d 20 75 6e 63 68 61 6e 67 65 64  ealnum unchanged
1c90: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 63   if the string c
1ca0: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72  ontains any char
1cb0: 61 63 74 65 72 20 77 68 69 63 68 20 69 73 20 6e  acter which is n
1cc0: 6f 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 20  ot.** part of a 
1cd0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  number..**.** If
1ce0: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 70   the string is p
1cf0: 75 72 65 20 6e 75 6d 65 72 69 63 2c 20 73 65 74  ure numeric, set
1d00: 20 2a 72 65 61 6c 6e 75 6d 20 74 6f 20 54 52 55   *realnum to TRU
1d10: 45 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a  E if the string.
1d20: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
1d30: 27 2e 27 20 63 68 61 72 61 63 74 65 72 20 6f 72  '.' character or
1d40: 20 61 6e 20 22 45 2b 30 30 30 22 20 73 74 79 6c   an "E+000" styl
1d50: 65 20 65 78 70 6f 6e 65 6e 74 69 61 74 69 6f 6e  e exponentiation
1d60: 20 73 75 66 66 69 78 2e 0a 2a 2a 20 4f 74 68 65   suffix..** Othe
1d70: 72 77 69 73 65 20 73 65 74 20 2a 72 65 61 6c 6e  rwise set *realn
1d80: 75 6d 20 74 6f 20 46 41 4c 53 45 2e 20 20 4e 6f  um to FALSE.  No
1d90: 74 65 20 74 68 61 74 20 6a 75 73 74 20 62 65 63  te that just bec
1da0: 61 75 65 20 2a 72 65 61 6c 6e 75 6d 20 69 73 0a  aue *realnum is.
1db0: 2a 2a 20 66 61 6c 73 65 20 64 6f 65 73 20 6e 6f  ** false does no
1dc0: 74 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  t mean that the 
1dd0: 6e 75 6d 62 65 72 20 63 61 6e 20 62 65 20 73 75  number can be su
1de0: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 76 65  ccessfully conve
1df0: 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20  rted into.** an 
1e00: 69 6e 74 65 67 65 72 20 2d 20 69 74 20 6d 69 67  integer - it mig
1e10: 68 74 20 62 65 20 74 6f 6f 20 62 69 67 2e 0a 2a  ht be too big..*
1e20: 2a 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73 74  *.** An empty st
1e30: 72 69 6e 67 20 69 73 20 63 6f 6e 73 69 64 65 72  ring is consider
1e40: 65 64 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63 2e 0a  ed non-numeric..
1e50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
1e60: 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61  Number(const cha
1e70: 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e  r *z, int *realn
1e80: 75 6d 2c 20 75 38 20 65 6e 63 29 7b 0a 20 20 69  um, u8 enc){.  i
1e90: 6e 74 20 69 6e 63 72 20 3d 20 28 65 6e 63 3d 3d  nt incr = (enc==
1ea0: 53 51 4c 49 54 45 5f 55 54 46 38 3f 31 3a 32 29  SQLITE_UTF8?1:2)
1eb0: 3b 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  ;.  if( enc==SQL
1ec0: 49 54 45 5f 55 54 46 31 36 42 45 20 29 20 7a 2b  ITE_UTF16BE ) z+
1ed0: 2b 3b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27  +;.  if( *z=='-'
1ee0: 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 20   || *z=='+' ) z 
1ef0: 2b 3d 20 69 6e 63 72 3b 0a 20 20 69 66 28 20 21  += incr;.  if( !
1f00: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
1f10: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
1f20: 20 30 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 69   0;.  }.  z += i
1f30: 6e 63 72 3b 0a 20 20 2a 72 65 61 6c 6e 75 6d 20  ncr;.  *realnum 
1f40: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71  = 0;.  while( sq
1f50: 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a 7a 29  lite3Isdigit(*z)
1f60: 20 29 7b 20 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d   ){ z += incr; }
1f70: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29  .  if( *z=='.' )
1f80: 7b 0a 20 20 20 20 7a 20 2b 3d 20 69 6e 63 72 3b  {.    z += incr;
1f90: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
1fa0: 33 49 73 64 69 67 69 74 28 2a 7a 29 20 29 20 72  3Isdigit(*z) ) r
1fb0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69  eturn 0;.    whi
1fc0: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 64 69 67  le( sqlite3Isdig
1fd0: 69 74 28 2a 7a 29 20 29 7b 20 7a 20 2b 3d 20 69  it(*z) ){ z += i
1fe0: 6e 63 72 3b 20 7d 0a 20 20 20 20 2a 72 65 61 6c  ncr; }.    *real
1ff0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  num = 1;.  }.  i
2000: 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a  f( *z=='e' || *z
2010: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 20 2b  =='E' ){.    z +
2020: 3d 20 69 6e 63 72 3b 0a 20 20 20 20 69 66 28 20  = incr;.    if( 
2030: 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27  *z=='+' || *z=='
2040: 2d 27 20 29 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a  -' ) z += incr;.
2050: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
2060: 49 73 64 69 67 69 74 28 2a 7a 29 20 29 20 72 65  Isdigit(*z) ) re
2070: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
2080: 65 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  e( sqlite3Isdigi
2090: 74 28 2a 7a 29 20 29 7b 20 7a 20 2b 3d 20 69 6e  t(*z) ){ z += in
20a0: 63 72 3b 20 7d 0a 20 20 20 20 2a 72 65 61 6c 6e  cr; }.    *realn
20b0: 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  um = 1;.  }.  re
20c0: 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f  turn *z==0;.}../
20d0: 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20  *.** The string 
20e0: 7a 5b 5d 20 69 73 20 61 6e 20 41 53 43 49 49 20  z[] is an ASCII 
20f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2100: 66 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72 2e  f a real number.
2110: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 69 73  .** Convert this
2120: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 64 6f 75   string to a dou
2130: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
2140: 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
2150: 74 68 61 74 20 7a 5b 5d 20 72 65 61 6c 6c 79 20  that z[] really 
2160: 69 73 20 61 20 76 61 6c 69 64 20 6e 75 6d 62 65  is a valid numbe
2170: 72 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73 20  r.  If it.** is 
2180: 6e 6f 74 2c 20 74 68 65 20 72 65 73 75 6c 74 20  not, the result 
2190: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a  is undefined..**
21a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21b0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
21c0: 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   of the library 
21d0: 61 74 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  atof() function 
21e0: 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 6c  because.** the l
21f0: 69 62 72 61 72 79 20 61 74 6f 66 28 29 20 6d 69  ibrary atof() mi
2200: 67 68 74 20 77 61 6e 74 20 74 6f 20 75 73 65 20  ght want to use 
2210: 22 2c 22 20 61 73 20 74 68 65 20 64 65 63 69 6d  "," as the decim
2220: 61 6c 20 70 6f 69 6e 74 20 69 6e 73 74 65 61 64  al point instead
2230: 0a 2a 2a 20 6f 66 20 22 2e 22 20 64 65 70 65 6e  .** of "." depen
2240: 64 69 6e 67 20 6f 6e 20 68 6f 77 20 6c 6f 63 61  ding on how loca
2250: 6c 65 20 69 73 20 73 65 74 2e 20 20 42 75 74 20  le is set.  But 
2260: 74 68 61 74 20 77 6f 75 6c 64 20 63 61 75 73 65  that would cause
2270: 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a 20 66 6f 72   problems.** for
2280: 20 53 51 4c 2e 20 20 53 6f 20 74 68 69 73 20 72   SQL.  So this r
2290: 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 75 73  outine always us
22a0: 65 73 20 22 2e 22 20 72 65 67 61 72 64 6c 65 73  es "." regardles
22b0: 73 20 6f 66 20 6c 6f 63 61 6c 65 2e 0a 2a 2f 0a  s of locale..*/.
22c0: 69 6e 74 20 73 71 6c 69 74 65 33 41 74 6f 46 28  int sqlite3AtoF(
22d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 64  const char *z, d
22e0: 6f 75 62 6c 65 20 2a 70 52 65 73 75 6c 74 29 7b  ouble *pResult){
22f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2300: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
2310: 49 4e 54 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  INT.  const char
2320: 20 2a 7a 42 65 67 69 6e 20 3d 20 7a 3b 0a 20 20   *zBegin = z;.  
2330: 2f 2a 20 73 69 67 6e 20 2a 20 73 69 67 6e 69 66  /* sign * signif
2340: 69 63 61 6e 64 20 2a 20 28 31 30 20 5e 20 28 65  icand * (10 ^ (e
2350: 73 69 67 6e 20 2a 20 65 78 70 6f 6e 65 6e 74 29  sign * exponent)
2360: 29 20 2a 2f 0a 20 20 69 6e 74 20 73 69 67 6e 20  ) */.  int sign 
2370: 3d 20 31 3b 20 20 20 2f 2a 20 73 69 67 6e 20 6f  = 1;   /* sign o
2380: 66 20 73 69 67 6e 69 66 69 63 61 6e 64 20 2a 2f  f significand */
2390: 0a 20 20 69 36 34 20 73 20 3d 20 30 3b 20 20 20  .  i64 s = 0;   
23a0: 20 20 20 2f 2a 20 73 69 67 6e 69 66 69 63 61 6e     /* significan
23b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 20 3d 20 30  d */.  int d = 0
23c0: 3b 20 20 20 20 20 20 2f 2a 20 61 64 6a 75 73 74  ;      /* adjust
23d0: 20 65 78 70 6f 6e 65 6e 74 20 66 6f 72 20 73 68   exponent for sh
23e0: 69 66 74 69 6e 67 20 64 65 63 69 6d 61 6c 20 70  ifting decimal p
23f0: 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 73  oint */.  int es
2400: 69 67 6e 20 3d 20 31 3b 20 20 2f 2a 20 73 69 67  ign = 1;  /* sig
2410: 6e 20 6f 66 20 65 78 70 6f 6e 65 6e 74 20 2a 2f  n of exponent */
2420: 0a 20 20 69 6e 74 20 65 20 3d 20 30 3b 20 20 20  .  int e = 0;   
2430: 20 20 20 2f 2a 20 65 78 70 6f 6e 65 6e 74 20 2a     /* exponent *
2440: 2f 0a 20 20 64 6f 75 62 6c 65 20 72 65 73 75 6c  /.  double resul
2450: 74 3b 0a 20 20 69 6e 74 20 6e 44 69 67 69 74 73  t;.  int nDigits
2460: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 73 6b 69 70   = 0;..  /* skip
2470: 20 6c 65 61 64 69 6e 67 20 73 70 61 63 65 73 20   leading spaces 
2480: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  */.  while( sqli
2490: 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29  te3Isspace(*z) )
24a0: 20 7a 2b 2b 3b 0a 20 20 2f 2a 20 67 65 74 20 73   z++;.  /* get s
24b0: 69 67 6e 20 6f 66 20 73 69 67 6e 69 66 69 63 61  ign of significa
24c0: 6e 64 20 2a 2f 0a 20 20 69 66 28 20 2a 7a 3d 3d  nd */.  if( *z==
24d0: 27 2d 27 20 29 7b 0a 20 20 20 20 73 69 67 6e 20  '-' ){.    sign 
24e0: 3d 20 2d 31 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  = -1;.    z++;. 
24f0: 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 3d 3d 27   }else if( *z=='
2500: 2b 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  +' ){.    z++;. 
2510: 20 7d 0a 20 20 2f 2a 20 73 6b 69 70 20 6c 65 61   }.  /* skip lea
2520: 64 69 6e 67 20 7a 65 72 6f 65 73 20 2a 2f 0a 20  ding zeroes */. 
2530: 20 77 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 30   while( z[0]=='0
2540: 27 20 29 20 7a 2b 2b 2c 20 6e 44 69 67 69 74 73  ' ) z++, nDigits
2550: 2b 2b 3b 0a 0a 20 20 2f 2a 20 63 6f 70 79 20 6d  ++;..  /* copy m
2560: 61 78 20 73 69 67 6e 69 66 69 63 61 6e 74 20 64  ax significant d
2570: 69 67 69 74 73 20 74 6f 20 73 69 67 6e 69 66 69  igits to signifi
2580: 63 61 6e 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28  cand */.  while(
2590: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
25a0: 2a 7a 29 20 26 26 20 73 3c 28 28 4c 41 52 47 45  *z) && s<((LARGE
25b0: 53 54 5f 49 4e 54 36 34 2d 39 29 2f 31 30 29 20  ST_INT64-9)/10) 
25c0: 29 7b 0a 20 20 20 20 73 20 3d 20 73 2a 31 30 20  ){.    s = s*10 
25d0: 2b 20 28 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20  + (*z - '0');.  
25e0: 20 20 7a 2b 2b 2c 20 6e 44 69 67 69 74 73 2b 2b    z++, nDigits++
25f0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 73 6b 69 70 20  ;.  }.  /* skip 
2600: 6e 6f 6e 2d 73 69 67 6e 69 66 69 63 61 6e 74 20  non-significant 
2610: 73 69 67 6e 69 66 69 63 61 6e 64 20 64 69 67 69  significand digi
2620: 74 73 0a 20 20 2a 2a 20 28 69 6e 63 72 65 61 73  ts.  ** (increas
2630: 65 20 65 78 70 6f 6e 65 6e 74 20 62 79 20 64 20  e exponent by d 
2640: 74 6f 20 73 68 69 66 74 20 64 65 63 69 6d 61 6c  to shift decimal
2650: 20 6c 65 66 74 29 20 2a 2f 0a 20 20 77 68 69 6c   left) */.  whil
2660: 65 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  e( sqlite3Isdigi
2670: 74 28 2a 7a 29 20 29 20 7a 2b 2b 2c 20 6e 44 69  t(*z) ) z++, nDi
2680: 67 69 74 73 2b 2b 2c 20 64 2b 2b 3b 0a 0a 20 20  gits++, d++;..  
2690: 2f 2a 20 69 66 20 64 65 63 69 6d 61 6c 20 70 6f  /* if decimal po
26a0: 69 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a  int is present *
26b0: 2f 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20  /.  if( *z=='.' 
26c0: 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  ){.    z++;.    
26d0: 2f 2a 20 63 6f 70 79 20 64 69 67 69 74 73 20 66  /* copy digits f
26e0: 72 6f 6d 20 61 66 74 65 72 20 64 65 63 69 6d 61  rom after decima
26f0: 6c 20 74 6f 20 73 69 67 6e 69 66 69 63 61 6e 64  l to significand
2700: 0a 20 20 20 20 2a 2a 20 28 64 65 63 72 65 61 73  .    ** (decreas
2710: 65 20 65 78 70 6f 6e 65 6e 74 20 62 79 20 64 20  e exponent by d 
2720: 74 6f 20 73 68 69 66 74 20 64 65 63 69 6d 61 6c  to shift decimal
2730: 20 72 69 67 68 74 29 20 2a 2f 0a 20 20 20 20 77   right) */.    w
2740: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 64  hile( sqlite3Isd
2750: 69 67 69 74 28 2a 7a 29 20 26 26 20 73 3c 28 28  igit(*z) && s<((
2760: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2d 39 29  LARGEST_INT64-9)
2770: 2f 31 30 29 20 29 7b 0a 20 20 20 20 20 20 73 20  /10) ){.      s 
2780: 3d 20 73 2a 31 30 20 2b 20 28 2a 7a 20 2d 20 27  = s*10 + (*z - '
2790: 30 27 29 3b 0a 20 20 20 20 20 20 7a 2b 2b 2c 20  0');.      z++, 
27a0: 6e 44 69 67 69 74 73 2b 2b 2c 20 64 2d 2d 3b 0a  nDigits++, d--;.
27b0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 73 6b 69      }.    /* ski
27c0: 70 20 6e 6f 6e 2d 73 69 67 6e 69 66 69 63 61 6e  p non-significan
27d0: 74 20 64 69 67 69 74 73 20 2a 2f 0a 20 20 20 20  t digits */.    
27e0: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
27f0: 64 69 67 69 74 28 2a 7a 29 20 29 20 7a 2b 2b 2c  digit(*z) ) z++,
2800: 20 6e 44 69 67 69 74 73 2b 2b 3b 0a 20 20 7d 0a   nDigits++;.  }.
2810: 0a 20 20 2f 2a 20 69 66 20 65 78 70 6f 6e 65 6e  .  /* if exponen
2820: 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  t is present */.
2830: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
2840: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
2850: 7a 2b 2b 3b 0a 20 20 20 20 2f 2a 20 67 65 74 20  z++;.    /* get 
2860: 73 69 67 6e 20 6f 66 20 65 78 70 6f 6e 65 6e 74  sign of exponent
2870: 20 2a 2f 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d   */.    if( *z==
2880: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 65 73 69  '-' ){.      esi
2890: 67 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7a  gn = -1;.      z
28a0: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
28b0: 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a 20 20 20  ( *z=='+' ){.   
28c0: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     z++;.    }.  
28d0: 20 20 2f 2a 20 63 6f 70 79 20 64 69 67 69 74 73    /* copy digits
28e0: 20 74 6f 20 65 78 70 6f 6e 65 6e 74 20 2a 2f 0a   to exponent */.
28f0: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
2900: 65 33 49 73 64 69 67 69 74 28 2a 7a 29 20 29 7b  e3Isdigit(*z) ){
2910: 0a 20 20 20 20 20 20 65 20 3d 20 65 2a 31 30 20  .      e = e*10 
2920: 2b 20 28 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20  + (*z - '0');.  
2930: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      z++;.    }. 
2940: 20 7d 0a 0a 20 20 2f 2a 20 61 64 6a 75 73 74 20   }..  /* adjust 
2950: 65 78 70 6f 6e 65 6e 74 20 62 79 20 64 2c 20 61  exponent by d, a
2960: 6e 64 20 75 70 64 61 74 65 20 73 69 67 6e 20 2a  nd update sign *
2970: 2f 0a 20 20 65 20 3d 20 28 65 2a 65 73 69 67 6e  /.  e = (e*esign
2980: 29 20 2b 20 64 3b 0a 20 20 69 66 28 20 65 3c 30  ) + d;.  if( e<0
2990: 20 29 20 7b 0a 20 20 20 20 65 73 69 67 6e 20 3d   ) {.    esign =
29a0: 20 2d 31 3b 0a 20 20 20 20 65 20 2a 3d 20 2d 31   -1;.    e *= -1
29b0: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
29c0: 20 65 73 69 67 6e 20 3d 20 31 3b 0a 20 20 7d 0a   esign = 1;.  }.
29d0: 0a 20 20 2f 2a 20 69 66 20 30 20 73 69 67 6e 69  .  /* if 0 signi
29e0: 66 69 63 61 6e 64 20 2a 2f 0a 20 20 69 66 28 20  ficand */.  if( 
29f0: 21 73 20 29 20 7b 0a 20 20 20 20 2f 2a 20 49 6e  !s ) {.    /* In
2a00: 20 74 68 65 20 49 45 45 45 20 37 35 34 20 73 74   the IEEE 754 st
2a10: 61 6e 64 61 72 64 2c 20 7a 65 72 6f 20 69 73 20  andard, zero is 
2a20: 73 69 67 6e 65 64 2e 0a 20 20 20 20 2a 2a 20 41  signed..    ** A
2a30: 64 64 20 74 68 65 20 73 69 67 6e 20 69 66 20 77  dd the sign if w
2a40: 65 27 76 65 20 73 65 65 6e 20 61 74 20 6c 65 61  e've seen at lea
2a50: 73 74 20 6f 6e 65 20 64 69 67 69 74 20 2a 2f 0a  st one digit */.
2a60: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 28 73 69      result = (si
2a70: 67 6e 3c 30 20 26 26 20 6e 44 69 67 69 74 73 29  gn<0 && nDigits)
2a80: 20 3f 20 2d 28 64 6f 75 62 6c 65 29 30 20 3a 20   ? -(double)0 : 
2a90: 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 7d 20 65  (double)0;.  } e
2aa0: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 61 74 74  lse {.    /* att
2ab0: 65 6d 70 74 20 74 6f 20 72 65 64 75 63 65 20 65  empt to reduce e
2ac0: 78 70 6f 6e 65 6e 74 20 2a 2f 0a 20 20 20 20 69  xponent */.    i
2ad0: 66 28 20 65 73 69 67 6e 3e 30 20 29 7b 0a 20 20  f( esign>0 ){.  
2ae0: 20 20 20 20 77 68 69 6c 65 28 20 73 3c 28 4c 41      while( s<(LA
2af0: 52 47 45 53 54 5f 49 4e 54 36 34 2f 31 30 29 20  RGEST_INT64/10) 
2b00: 26 26 20 65 3e 30 20 29 20 65 2d 2d 2c 73 2a 3d  && e>0 ) e--,s*=
2b10: 31 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  10;.    }else{. 
2b20: 20 20 20 20 20 77 68 69 6c 65 28 20 21 28 73 25       while( !(s%
2b30: 31 30 29 20 26 26 20 65 3e 30 20 29 20 65 2d 2d  10) && e>0 ) e--
2b40: 2c 73 2f 3d 31 30 3b 0a 20 20 20 20 7d 0a 0a 20  ,s/=10;.    }.. 
2b50: 20 20 20 2f 2a 20 61 64 6a 75 73 74 20 74 68 65     /* adjust the
2b60: 20 73 69 67 6e 20 6f 66 20 73 69 67 6e 69 66 69   sign of signifi
2b70: 63 61 6e 64 20 2a 2f 0a 20 20 20 20 73 20 3d 20  cand */.    s = 
2b80: 73 69 67 6e 3c 30 20 3f 20 2d 73 20 3a 20 73 3b  sign<0 ? -s : s;
2b90: 0a 0a 20 20 20 20 2f 2a 20 69 66 20 65 78 70 6f  ..    /* if expo
2ba0: 6e 65 6e 74 2c 20 73 63 61 6c 65 20 73 69 67 6e  nent, scale sign
2bb0: 69 66 69 63 61 6e 64 20 61 73 20 61 70 70 72 6f  ificand as appro
2bc0: 70 72 69 61 74 65 0a 20 20 20 20 2a 2a 20 61 6e  priate.    ** an
2bd0: 64 20 73 74 6f 72 65 20 69 6e 20 72 65 73 75 6c  d store in resul
2be0: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 20  t. */.    if( e 
2bf0: 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  ){.      double 
2c00: 73 63 61 6c 65 20 3d 20 31 2e 30 3b 0a 20 20 20  scale = 1.0;.   
2c10: 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
2c20: 20 68 61 6e 64 6c 65 20 65 78 74 72 65 6d 65 6c   handle extremel
2c30: 79 20 73 6d 61 6c 6c 2f 6c 61 72 67 65 20 6e 75  y small/large nu
2c40: 6d 62 65 72 73 20 62 65 74 74 65 72 20 2a 2f 0a  mbers better */.
2c50: 20 20 20 20 20 20 69 66 28 20 65 3e 33 30 37 20        if( e>307 
2c60: 26 26 20 65 3c 33 34 32 20 29 7b 0a 20 20 20 20  && e<342 ){.    
2c70: 20 20 20 20 77 68 69 6c 65 28 20 65 25 33 30 38      while( e%308
2c80: 20 29 20 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e   ) { scale *= 1.
2c90: 30 65 2b 31 3b 20 65 20 2d 3d 20 31 3b 20 7d 0a  0e+1; e -= 1; }.
2ca0: 20 20 20 20 20 20 20 20 69 66 28 20 65 73 69 67          if( esig
2cb0: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
2cc0: 20 72 65 73 75 6c 74 20 3d 20 73 20 2f 20 73 63   result = s / sc
2cd0: 61 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ale;.          r
2ce0: 65 73 75 6c 74 20 2f 3d 20 31 2e 30 65 2b 33 30  esult /= 1.0e+30
2cf0: 38 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  8;.        }else
2d00: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 75  {.          resu
2d10: 6c 74 20 3d 20 73 20 2a 20 73 63 61 6c 65 3b 0a  lt = s * scale;.
2d20: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
2d30: 20 2a 3d 20 31 2e 30 65 2b 33 30 38 3b 0a 20 20   *= 1.0e+308;.  
2d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2d50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2d60: 31 2e 30 65 2b 32 32 20 69 73 20 74 68 65 20 6c  1.0e+22 is the l
2d70: 61 72 67 65 73 74 20 70 6f 77 65 72 20 6f 66 20  argest power of 
2d80: 31 30 20 74 68 61 6e 20 63 61 6e 20 62 65 20 0a  10 than can be .
2d90: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65          ** repre
2da0: 73 65 6e 74 65 64 20 65 78 61 63 74 6c 79 2e 20  sented exactly. 
2db0: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
2dc0: 28 20 65 25 32 32 20 29 20 7b 20 73 63 61 6c 65  ( e%22 ) { scale
2dd0: 20 2a 3d 20 31 2e 30 65 2b 31 3b 20 65 20 2d 3d   *= 1.0e+1; e -=
2de0: 20 31 3b 20 7d 0a 20 20 20 20 20 20 20 20 77 68   1; }.        wh
2df0: 69 6c 65 28 20 65 3e 30 20 29 20 7b 20 73 63 61  ile( e>0 ) { sca
2e00: 6c 65 20 2a 3d 20 31 2e 30 65 2b 32 32 3b 20 65  le *= 1.0e+22; e
2e10: 20 2d 3d 20 32 32 3b 20 7d 0a 20 20 20 20 20 20   -= 22; }.      
2e20: 20 20 69 66 28 20 65 73 69 67 6e 3c 30 20 29 7b    if( esign<0 ){
2e30: 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c  .          resul
2e40: 74 20 3d 20 73 20 2f 20 73 63 61 6c 65 3b 0a 20  t = s / scale;. 
2e50: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e60: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
2e70: 20 73 20 2a 20 73 63 61 6c 65 3b 0a 20 20 20 20   s * scale;.    
2e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e90: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2ea0: 20 72 65 73 75 6c 74 20 3d 20 28 64 6f 75 62 6c   result = (doubl
2eb0: 65 29 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  e)s;.    }.  }..
2ec0: 20 20 2f 2a 20 73 74 6f 72 65 20 74 68 65 20 72    /* store the r
2ed0: 65 73 75 6c 74 20 2a 2f 0a 20 20 2a 70 52 65 73  esult */.  *pRes
2ee0: 75 6c 74 20 3d 20 72 65 73 75 6c 74 3b 0a 0a 20  ult = result;.. 
2ef0: 20 2f 2a 20 72 65 74 75 72 6e 20 6e 75 6d 62 65   /* return numbe
2f00: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
2f10: 75 73 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  used */.  return
2f20: 20 28 69 6e 74 29 28 7a 20 2d 20 7a 42 65 67 69   (int)(z - zBegi
2f30: 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  n);.#else.  retu
2f40: 72 6e 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34  rn sqlite3Atoi64
2f50: 28 7a 2c 20 70 52 65 73 75 6c 74 29 3b 0a 23 65  (z, pResult);.#e
2f60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2f70: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
2f80: 4e 54 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  NT */.}../*.** C
2f90: 6f 6d 70 61 72 65 20 74 68 65 20 31 39 2d 63 68  ompare the 19-ch
2fa0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 7a  aracter string z
2fb0: 4e 75 6d 20 61 67 61 69 6e 73 74 20 74 68 65 20  Num against the 
2fc0: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
2fd0: 69 6f 6e 0a 2a 2a 20 76 61 6c 75 65 20 32 5e 36  ion.** value 2^6
2fe0: 33 3a 20 20 39 32 32 33 33 37 32 30 33 36 38 35  3:  922337203685
2ff0: 34 37 37 35 38 30 38 2e 20 20 52 65 74 75 72 6e  4775808.  Return
3000: 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
3010: 20 6f 72 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20   or positive.** 
3020: 69 66 20 7a 4e 75 6d 20 69 73 20 6c 65 73 73 20  if zNum is less 
3030: 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
3040: 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
3050: 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  the string..**.*
3060: 2a 20 55 6e 6c 69 6b 65 20 6d 65 6d 63 6d 70 28  * Unlike memcmp(
3070: 29 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  ) this routine i
3080: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
3090: 72 65 74 75 72 6e 20 74 68 65 20 64 69 66 66 65  return the diffe
30a0: 72 65 6e 63 65 0a 2a 2a 20 69 6e 20 74 68 65 20  rence.** in the 
30b0: 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 6c 61  values of the la
30c0: 73 74 20 64 69 67 69 74 20 69 66 20 74 68 65 20  st digit if the 
30d0: 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20  only difference 
30e0: 69 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6c 61 73  is in the.** las
30f0: 74 20 64 69 67 69 74 2e 20 20 53 6f 2c 20 66 6f  t digit.  So, fo
3100: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 0a 2a 2a  r example,.**.**
3110: 20 20 20 20 20 20 63 6f 6d 70 61 72 65 32 70 6f        compare2po
3120: 77 36 33 28 22 39 32 32 33 33 37 32 30 33 36 38  w63("92233720368
3130: 35 34 37 37 35 38 30 30 22 29 0a 2a 2a 0a 2a 2a  54775800").**.**
3140: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 2d 38 2e   will return -8.
3150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
3160: 6f 6d 70 61 72 65 32 70 6f 77 36 33 28 63 6f 6e  ompare2pow63(con
3170: 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d 29 7b 0a  st char *zNum){.
3180: 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 6d    int c;.  c = m
3190: 65 6d 63 6d 70 28 7a 4e 75 6d 2c 22 39 32 32 33  emcmp(zNum,"9223
31a0: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 22 2c  37203685477580",
31b0: 31 38 29 2a 31 30 3b 0a 20 20 69 66 28 20 63 3d  18)*10;.  if( c=
31c0: 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 7a 4e  =0 ){.    c = zN
31d0: 75 6d 5b 31 38 5d 20 2d 20 27 38 27 3b 0a 20 20  um[18] - '8';.  
31e0: 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  }.  return c;.}.
31f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
3200: 52 55 45 20 69 66 20 7a 4e 75 6d 20 69 73 20 61  RUE if zNum is a
3210: 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69   64-bit signed i
3220: 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65  nteger and write
3230: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
3240: 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 74   the integer int
3250: 6f 20 2a 70 4e 75 6d 2e 20 20 49 66 20 7a 4e 75  o *pNum.  If zNu
3260: 6d 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  m is not an inte
3270: 67 65 72 0a 2a 2a 20 6f 72 20 69 73 20 61 6e 20  ger.** or is an 
3280: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
3290: 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20  too large to be 
32a0: 65 78 70 72 65 73 73 65 64 20 77 69 74 68 20 36  expressed with 6
32b0: 34 20 62 69 74 73 2c 0a 2a 2a 20 74 68 65 6e 20  4 bits,.** then 
32c0: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2a  return false..**
32d0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
32e0: 75 74 69 6e 65 20 77 61 73 20 6f 72 69 67 69 6e  utine was origin
32f0: 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 74 20  ally written it 
3300: 64 65 61 6c 74 20 77 69 74 68 20 6f 6e 6c 79 0a  dealt with only.
3310: 2a 2a 20 33 32 2d 62 69 74 20 6e 75 6d 62 65 72  ** 32-bit number
3320: 73 2e 20 20 41 74 20 74 68 61 74 20 74 69 6d 65  s.  At that time
3330: 2c 20 69 74 20 77 61 73 20 6d 75 63 68 20 66 61  , it was much fa
3340: 73 74 65 72 20 74 68 61 6e 20 74 68 65 0a 2a 2a  ster than the.**
3350: 20 61 74 6f 69 28 29 20 6c 69 62 72 61 72 79 20   atoi() library 
3360: 72 6f 75 74 69 6e 65 20 69 6e 20 52 65 64 48 61  routine in RedHa
3370: 74 20 37 2e 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71  t 7.2..*/.int sq
3380: 6c 69 74 65 33 41 74 6f 69 36 34 28 63 6f 6e 73  lite3Atoi64(cons
3390: 74 20 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36  t char *zNum, i6
33a0: 34 20 2a 70 4e 75 6d 29 7b 0a 20 20 69 36 34 20  4 *pNum){.  i64 
33b0: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 65 67  v = 0;.  int neg
33c0: 3b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20  ;.  int i, c;.  
33d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
33e0: 72 74 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c  rt;.  while( sql
33f0: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 4e 75  ite3Isspace(*zNu
3400: 6d 29 20 29 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 69  m) ) zNum++;.  i
3410: 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 29 7b  f( *zNum=='-' ){
3420: 0a 20 20 20 20 6e 65 67 20 3d 20 31 3b 0a 20 20  .    neg = 1;.  
3430: 20 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 7d 65 6c 73    zNum++;.  }els
3440: 65 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2b 27  e if( *zNum=='+'
3450: 20 29 7b 0a 20 20 20 20 6e 65 67 20 3d 20 30 3b   ){.    neg = 0;
3460: 0a 20 20 20 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 7d  .    zNum++;.  }
3470: 65 6c 73 65 7b 0a 20 20 20 20 6e 65 67 20 3d 20  else{.    neg = 
3480: 30 3b 0a 20 20 7d 0a 20 20 7a 53 74 61 72 74 20  0;.  }.  zStart 
3490: 3d 20 7a 4e 75 6d 3b 0a 20 20 77 68 69 6c 65 28  = zNum;.  while(
34a0: 20 7a 4e 75 6d 5b 30 5d 3d 3d 27 30 27 20 29 7b   zNum[0]=='0' ){
34b0: 20 7a 4e 75 6d 2b 2b 3b 20 7d 20 2f 2a 20 53 6b   zNum++; } /* Sk
34c0: 69 70 20 6f 76 65 72 20 6c 65 61 64 69 6e 67 20  ip over leading 
34d0: 7a 65 72 6f 73 2e 20 54 69 63 6b 65 74 20 23 32  zeros. Ticket #2
34e0: 34 35 34 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  454 */.  for(i=0
34f0: 3b 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d 27  ; (c=zNum[i])>='
3500: 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69 2b  0' && c<='9'; i+
3510: 2b 29 7b 0a 20 20 20 20 76 20 3d 20 76 2a 31 30  +){.    v = v*10
3520: 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 7d 0a   + c - '0';.  }.
3530: 20 20 2a 70 4e 75 6d 20 3d 20 6e 65 67 20 3f 20    *pNum = neg ? 
3540: 2d 76 20 3a 20 76 3b 0a 20 20 69 66 28 20 63 21  -v : v;.  if( c!
3550: 3d 30 20 7c 7c 20 28 69 3d 3d 30 20 26 26 20 7a  =0 || (i==0 && z
3560: 53 74 61 72 74 3d 3d 7a 4e 75 6d 29 20 7c 7c 20  Start==zNum) || 
3570: 69 3e 31 39 20 29 7b 0a 20 20 20 20 2f 2a 20 7a  i>19 ){.    /* z
3580: 4e 75 6d 20 69 73 20 65 6d 70 74 79 20 6f 72 20  Num is empty or 
3590: 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 6e 75 6d  contains non-num
35a0: 65 72 69 63 20 74 65 78 74 20 6f 72 20 69 73 20  eric text or is 
35b0: 6c 6f 6e 67 65 72 0a 20 20 20 20 2a 2a 20 74 68  longer.    ** th
35c0: 61 6e 20 31 39 20 64 69 67 69 74 73 20 28 74 68  an 19 digits (th
35d0: 75 73 20 67 75 61 72 61 6e 74 69 6e 67 20 74 68  us guaranting th
35e0: 61 74 20 69 74 20 69 73 20 74 6f 6f 20 6c 61 72  at it is too lar
35f0: 67 65 29 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ge) */.    retur
3600: 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 0;.  }else if(
3610: 20 69 3c 31 39 20 29 7b 0a 20 20 20 20 2f 2a 20   i<19 ){.    /* 
3620: 4c 65 73 73 20 74 68 61 6e 20 31 39 20 64 69 67  Less than 19 dig
3630: 69 74 73 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20  its, so we know 
3640: 74 68 61 74 20 69 74 20 66 69 74 73 20 69 6e 20  that it fits in 
3650: 36 34 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 72  64 bits */.    r
3660: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
3670: 7b 0a 20 20 20 20 2f 2a 20 31 39 2d 64 69 67 69  {.    /* 19-digi
3680: 74 20 6e 75 6d 62 65 72 73 20 6d 75 73 74 20 62  t numbers must b
3690: 65 20 6e 6f 20 6c 61 72 67 65 72 20 74 68 61 6e  e no larger than
36a0: 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37   922337203685477
36b0: 35 38 30 37 20 69 66 20 70 6f 73 69 74 69 76 65  5807 if positive
36c0: 0a 20 20 20 20 2a 2a 20 6f 72 20 39 32 32 33 33  .    ** or 92233
36d0: 37 32 30 33 36 38 35 34 37 37 35 38 30 38 20 69  72036854775808 i
36e0: 66 20 6e 65 67 61 74 69 76 65 2e 20 20 4e 6f 74  f negative.  Not
36f0: 65 20 74 68 61 74 20 39 32 32 33 33 37 32 30 33  e that 922337203
3700: 36 38 35 34 36 36 35 38 30 38 0a 20 20 20 20 2a  6854665808.    *
3710: 2a 20 69 73 20 32 5e 36 33 2e 20 2a 2f 0a 20 20  * is 2^63. */.  
3720: 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 61 72 65    return compare
3730: 32 70 6f 77 36 33 28 7a 4e 75 6d 29 3c 6e 65 67  2pow63(zNum)<neg
3740: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3750: 68 65 20 73 74 72 69 6e 67 20 7a 4e 75 6d 20 72  he string zNum r
3760: 65 70 72 65 73 65 6e 74 73 20 61 6e 20 75 6e 73  epresents an uns
3770: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 20 20  igned integer.  
3780: 54 68 65 20 7a 4e 75 6d 20 73 74 72 69 6e 67 0a  The zNum string.
3790: 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 6f  ** consists of o
37a0: 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74  ne or more digit
37b0: 20 63 68 61 72 61 63 74 65 72 73 20 61 6e 64 20   characters and 
37c0: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  is terminated by
37d0: 0a 2a 2a 20 61 20 7a 65 72 6f 20 63 68 61 72 61  .** a zero chara
37e0: 63 74 65 72 2e 20 20 41 6e 79 20 73 74 72 61 79  cter.  Any stray
37f0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
3800: 4e 75 6d 20 72 65 73 75 6c 74 20 69 6e 20 75 6e  Num result in un
3810: 64 65 66 69 6e 65 64 0a 2a 2a 20 62 65 68 61 76  defined.** behav
3820: 69 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ior..**.** If th
3830: 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
3840: 65 72 20 74 68 61 74 20 7a 4e 75 6d 20 72 65 70  er that zNum rep
3850: 72 65 73 65 6e 74 73 20 77 69 6c 6c 20 66 69 74  resents will fit
3860: 20 69 6e 20 61 0a 2a 2a 20 36 34 2d 62 69 74 20   in a.** 64-bit 
3870: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2c 20  signed integer, 
3880: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 4f 74  return TRUE.  Ot
3890: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 46  herwise return F
38a0: 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALSE..**.** If t
38b0: 68 65 20 6e 65 67 46 6c 61 67 20 70 61 72 61 6d  he negFlag param
38c0: 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 74 68  eter is true, th
38d0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e  at means that zN
38e0: 75 6d 20 72 65 61 6c 6c 79 20 72 65 70 72 65 73  um really repres
38f0: 65 6e 74 73 0a 2a 2a 20 61 20 6e 65 67 61 74 69  ents.** a negati
3900: 76 65 20 6e 75 6d 62 65 72 2e 20 20 28 54 68 65  ve number.  (The
3910: 20 6c 65 61 64 69 6e 67 20 22 2d 22 20 69 73 20   leading "-" is 
3920: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 7a 4e 75  omitted from zNu
3930: 6d 2e 29 20 20 54 68 69 73 0a 2a 2a 20 70 61 72  m.)  This.** par
3940: 61 6d 65 74 65 72 20 69 73 20 6e 65 65 64 65 64  ameter is needed
3950: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 61 20   to determine a 
3960: 62 6f 75 6e 64 61 72 79 20 63 61 73 65 2e 20 20  boundary case.  
3970: 41 20 73 74 72 69 6e 67 0a 2a 2a 20 6f 66 20 22  A string.** of "
3980: 39 32 32 33 33 37 33 30 33 36 38 35 34 37 37 35  9223373036854775
3990: 38 30 38 22 20 72 65 74 75 72 6e 73 20 66 61 6c  808" returns fal
39a0: 73 65 20 69 66 20 6e 65 67 46 6c 61 67 20 69 73  se if negFlag is
39b0: 20 66 61 6c 73 65 20 6f 72 20 74 72 75 65 0a 2a   false or true.*
39c0: 2a 20 69 66 20 6e 65 67 46 6c 61 67 20 69 73 20  * if negFlag is 
39d0: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 61 64  true..**.** Lead
39e0: 69 6e 67 20 7a 65 72 6f 73 20 61 72 65 20 69 67  ing zeros are ig
39f0: 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
3a00: 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42 69 74  lite3FitsIn64Bit
3a10: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  s(const char *zN
3a20: 75 6d 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 29  um, int negFlag)
3a30: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
3a40: 20 6e 65 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73   neg = 0;..  ass
3a50: 65 72 74 28 20 7a 4e 75 6d 5b 30 5d 3e 3d 27 30  ert( zNum[0]>='0
3a60: 27 20 26 26 20 7a 4e 75 6d 5b 30 5d 3c 3d 27 39  ' && zNum[0]<='9
3a70: 27 20 29 3b 20 2f 2a 20 7a 4e 75 6d 20 69 73 20  ' ); /* zNum is 
3a80: 61 6e 20 75 6e 73 69 67 6e 65 64 20 6e 75 6d 62  an unsigned numb
3a90: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 65 67  er */..  if( neg
3aa0: 46 6c 61 67 20 29 20 6e 65 67 20 3d 20 31 2d 6e  Flag ) neg = 1-n
3ab0: 65 67 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 4e  eg;.  while( *zN
3ac0: 75 6d 3d 3d 27 30 27 20 29 7b 0a 20 20 20 20 7a  um=='0' ){.    z
3ad0: 4e 75 6d 2b 2b 3b 20 20 20 2f 2a 20 53 6b 69 70  Num++;   /* Skip
3ae0: 20 6c 65 61 64 69 6e 67 20 7a 65 72 6f 73 2e 20   leading zeros. 
3af0: 20 54 69 63 6b 65 74 20 23 32 34 35 34 20 2a 2f   Ticket #2454 */
3b00: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
3b10: 7a 4e 75 6d 5b 69 5d 3b 20 69 2b 2b 29 7b 20 61  zNum[i]; i++){ a
3b20: 73 73 65 72 74 28 20 7a 4e 75 6d 5b 69 5d 3e 3d  ssert( zNum[i]>=
3b30: 27 30 27 20 26 26 20 7a 4e 75 6d 5b 69 5d 3c 3d  '0' && zNum[i]<=
3b40: 27 39 27 20 29 3b 20 7d 0a 20 20 69 66 28 20 69  '9' ); }.  if( i
3b50: 3c 31 39 20 29 7b 0a 20 20 20 20 2f 2a 20 47 75  <19 ){.    /* Gu
3b60: 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
3b70: 69 66 20 6c 65 73 73 20 74 68 61 6e 20 31 39 20  if less than 19 
3b80: 64 69 67 69 74 73 20 2a 2f 0a 20 20 20 20 72 65  digits */.    re
3b90: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 20  turn 1;.  }else 
3ba0: 69 66 28 20 69 3e 31 39 20 29 7b 0a 20 20 20 20  if( i>19 ){.    
3bb0: 2f 2a 20 47 75 61 72 61 6e 74 65 65 64 20 74 6f  /* Guaranteed to
3bc0: 20 62 65 20 74 6f 6f 20 62 69 67 20 69 66 20 67   be too big if g
3bd0: 72 65 61 74 65 72 20 74 68 61 6e 20 31 39 20 64  reater than 19 d
3be0: 69 67 69 74 73 20 2a 2f 0a 20 20 20 20 72 65 74  igits */.    ret
3bf0: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
3c00: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61      /* Compare a
3c10: 67 61 69 6e 73 74 20 32 5e 36 33 2e 20 2a 2f 0a  gainst 2^63. */.
3c20: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 61      return compa
3c30: 72 65 32 70 6f 77 36 33 28 7a 4e 75 6d 29 3c 6e  re2pow63(zNum)<n
3c40: 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
3c50: 20 49 66 20 7a 4e 75 6d 20 72 65 70 72 65 73 65   If zNum represe
3c60: 6e 74 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74  nts an integer t
3c70: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
3c80: 33 32 2d 62 69 74 73 2c 20 74 68 65 6e 20 73 65  32-bits, then se
3c90: 74 0a 2a 2a 20 2a 70 56 61 6c 75 65 20 74 6f 20  t.** *pValue to 
3ca0: 74 68 61 74 20 69 6e 74 65 67 65 72 20 61 6e 64  that integer and
3cb0: 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 4f   return true.  O
3cc0: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
3cd0: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  false..**.** Any
3ce0: 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63 20 63 68 61   non-numeric cha
3cf0: 72 61 63 74 65 72 73 20 74 68 61 74 20 66 6f 6c  racters that fol
3d00: 6c 6f 77 69 6e 67 20 7a 4e 75 6d 20 61 72 65 20  lowing zNum are 
3d10: 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 54 68 69 73  ignored..** This
3d20: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
3d30: 6f 6d 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34  om sqlite3Atoi64
3d40: 28 29 20 77 68 69 63 68 20 72 65 71 75 69 72 65  () which require
3d50: 73 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 6e  s the.** input n
3d60: 75 6d 62 65 72 20 74 6f 20 62 65 20 7a 65 72 6f  umber to be zero
3d70: 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a  -terminated..*/.
3d80: 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 49 6e  int sqlite3GetIn
3d90: 74 33 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  t32(const char *
3da0: 7a 4e 75 6d 2c 20 69 6e 74 20 2a 70 56 61 6c 75  zNum, int *pValu
3db0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  e){.  sqlite_int
3dc0: 36 34 20 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 v = 0;.  int 
3dd0: 69 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 65 67 20  i, c;.  int neg 
3de0: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 4e 75 6d 5b  = 0;.  if( zNum[
3df0: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 6e  0]=='-' ){.    n
3e00: 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 75 6d  eg = 1;.    zNum
3e10: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ++;.  }else if( 
3e20: 7a 4e 75 6d 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a  zNum[0]=='+' ){.
3e30: 20 20 20 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 7d 0a      zNum++;.  }.
3e40: 20 20 77 68 69 6c 65 28 20 7a 4e 75 6d 5b 30 5d    while( zNum[0]
3e50: 3d 3d 27 30 27 20 29 20 7a 4e 75 6d 2b 2b 3b 0a  =='0' ) zNum++;.
3e60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 31 20    for(i=0; i<11 
3e70: 26 26 20 28 63 20 3d 20 7a 4e 75 6d 5b 69 5d 20  && (c = zNum[i] 
3e80: 2d 20 27 30 27 29 3e 3d 30 20 26 26 20 63 3c 3d  - '0')>=0 && c<=
3e90: 39 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d  9; i++){.    v =
3ea0: 20 76 2a 31 30 20 2b 20 63 3b 0a 20 20 7d 0a 0a   v*10 + c;.  }..
3eb0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6e 67 65 73 74    /* The longest
3ec0: 20 64 65 63 69 6d 61 6c 20 72 65 70 72 65 73 65   decimal represe
3ed0: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 33 32 20  ntation of a 32 
3ee0: 62 69 74 20 69 6e 74 65 67 65 72 20 69 73 20 31  bit integer is 1
3ef0: 30 20 64 69 67 69 74 73 3a 0a 20 20 2a 2a 0a 20  0 digits:.  **. 
3f00: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
3f10: 31 32 33 34 35 36 37 38 39 30 0a 20 20 2a 2a 20  1234567890.  ** 
3f20: 20 20 20 20 32 5e 33 31 20 2d 3e 20 32 31 34 37      2^31 -> 2147
3f30: 34 38 33 36 34 38 0a 20 20 2a 2f 0a 20 20 69 66  483648.  */.  if
3f40: 28 20 69 3e 31 30 20 29 7b 0a 20 20 20 20 72 65  ( i>10 ){.    re
3f50: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
3f60: 28 20 76 2d 6e 65 67 3e 32 31 34 37 34 38 33 36  ( v-neg>21474836
3f70: 34 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  47 ){.    return
3f80: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65   0;.  }.  if( ne
3f90: 67 20 29 7b 0a 20 20 20 20 76 20 3d 20 2d 76 3b  g ){.    v = -v;
3fa0: 0a 20 20 7d 0a 20 20 2a 70 56 61 6c 75 65 20 3d  .  }.  *pValue =
3fb0: 20 28 69 6e 74 29 76 3b 0a 20 20 72 65 74 75 72   (int)v;.  retur
3fc0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 1;.}../*.** Th
3fd0: 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74  e variable-lengt
3fe0: 68 20 69 6e 74 65 67 65 72 20 65 6e 63 6f 64 69  h integer encodi
3ff0: 6e 67 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ng is as follows
4000: 3a 0a 2a 2a 0a 2a 2a 20 4b 45 59 3a 0a 2a 2a 20  :.**.** KEY:.** 
4010: 20 20 20 20 20 20 20 20 41 20 3d 20 30 78 78 78          A = 0xxx
4020: 78 78 78 78 20 20 20 20 37 20 62 69 74 73 20 6f  xxxx    7 bits o
4030: 66 20 64 61 74 61 20 61 6e 64 20 6f 6e 65 20 66  f data and one f
4040: 6c 61 67 20 62 69 74 0a 2a 2a 20 20 20 20 20 20  lag bit.**      
4050: 20 20 20 42 20 3d 20 31 78 78 78 78 78 78 78 20     B = 1xxxxxxx 
4060: 20 20 20 37 20 62 69 74 73 20 6f 66 20 64 61 74     7 bits of dat
4070: 61 20 61 6e 64 20 6f 6e 65 20 66 6c 61 67 20 62  a and one flag b
4080: 69 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 43 20  it.**         C 
4090: 3d 20 78 78 78 78 78 78 78 78 20 20 20 20 38 20  = xxxxxxxx    8 
40a0: 62 69 74 73 20 6f 66 20 64 61 74 61 0a 2a 2a 0a  bits of data.**.
40b0: 2a 2a 20 20 37 20 62 69 74 73 20 2d 20 41 0a 2a  **  7 bits - A.*
40c0: 2a 20 31 34 20 62 69 74 73 20 2d 20 42 41 0a 2a  * 14 bits - BA.*
40d0: 2a 20 32 31 20 62 69 74 73 20 2d 20 42 42 41 0a  * 21 bits - BBA.
40e0: 2a 2a 20 32 38 20 62 69 74 73 20 2d 20 42 42 42  ** 28 bits - BBB
40f0: 41 0a 2a 2a 20 33 35 20 62 69 74 73 20 2d 20 42  A.** 35 bits - B
4100: 42 42 42 41 0a 2a 2a 20 34 32 20 62 69 74 73 20  BBBA.** 42 bits 
4110: 2d 20 42 42 42 42 42 41 0a 2a 2a 20 34 39 20 62  - BBBBBA.** 49 b
4120: 69 74 73 20 2d 20 42 42 42 42 42 42 41 0a 2a 2a  its - BBBBBBA.**
4130: 20 35 36 20 62 69 74 73 20 2d 20 42 42 42 42 42   56 bits - BBBBB
4140: 42 42 41 0a 2a 2a 20 36 34 20 62 69 74 73 20 2d  BBA.** 64 bits -
4150: 20 42 42 42 42 42 42 42 42 43 0a 2a 2f 0a 0a 2f   BBBBBBBBC.*/../
4160: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 36 34 2d  *.** Write a 64-
4170: 62 69 74 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e  bit variable-len
4180: 67 74 68 20 69 6e 74 65 67 65 72 20 74 6f 20 6d  gth integer to m
4190: 65 6d 6f 72 79 20 73 74 61 72 74 69 6e 67 20 61  emory starting a
41a0: 74 20 70 5b 30 5d 2e 0a 2a 2a 20 54 68 65 20 6c  t p[0]..** The l
41b0: 65 6e 67 74 68 20 6f 66 20 64 61 74 61 20 77 72  ength of data wr
41c0: 69 74 65 20 77 69 6c 6c 20 62 65 20 62 65 74 77  ite will be betw
41d0: 65 65 6e 20 31 20 61 6e 64 20 39 20 62 79 74 65  een 1 and 9 byte
41e0: 73 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  s.  The number.*
41f0: 2a 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  * of bytes writt
4200: 65 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  en is returned..
4210: 2a 2a 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65  **.** A variable
4220: 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20  -length integer 
4230: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
4240: 6c 6f 77 65 72 20 37 20 62 69 74 73 20 6f 66 20  lower 7 bits of 
4250: 65 61 63 68 20 62 79 74 65 0a 2a 2a 20 66 6f 72  each byte.** for
4260: 20 61 6c 6c 20 62 79 74 65 73 20 74 68 61 74 20   all bytes that 
4270: 68 61 76 65 20 74 68 65 20 38 74 68 20 62 69 74  have the 8th bit
4280: 20 73 65 74 20 61 6e 64 20 6f 6e 65 20 62 79 74   set and one byt
4290: 65 20 77 69 74 68 20 74 68 65 20 38 74 68 0a 2a  e with the 8th.*
42a0: 2a 20 62 69 74 20 63 6c 65 61 72 2e 20 20 45 78  * bit clear.  Ex
42b0: 63 65 70 74 2c 20 69 66 20 77 65 20 67 65 74 20  cept, if we get 
42c0: 74 6f 20 74 68 65 20 39 74 68 20 62 79 74 65 2c  to the 9th byte,
42d0: 20 69 74 20 73 74 6f 72 65 73 20 74 68 65 20 66   it stores the f
42e0: 75 6c 6c 0a 2a 2a 20 38 20 62 69 74 73 20 61 6e  ull.** 8 bits an
42f0: 64 20 69 73 20 74 68 65 20 6c 61 73 74 20 62 79  d is the last by
4300: 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  te..*/.int sqlit
4310: 65 33 50 75 74 56 61 72 69 6e 74 28 75 6e 73 69  e3PutVarint(unsi
4320: 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 36  gned char *p, u6
4330: 34 20 76 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  4 v){.  int i, j
4340: 2c 20 6e 3b 0a 20 20 75 38 20 62 75 66 5b 31 30  , n;.  u8 buf[10
4350: 5d 3b 0a 20 20 69 66 28 20 76 20 26 20 28 28 28  ];.  if( v & (((
4360: 75 36 34 29 30 78 66 66 30 30 30 30 30 30 29 3c  u64)0xff000000)<
4370: 3c 33 32 29 20 29 7b 0a 20 20 20 20 70 5b 38 5d  <32) ){.    p[8]
4380: 20 3d 20 28 75 38 29 76 3b 0a 20 20 20 20 76 20   = (u8)v;.    v 
4390: 3e 3e 3d 20 38 3b 0a 20 20 20 20 66 6f 72 28 69  >>= 8;.    for(i
43a0: 3d 37 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  =7; i>=0; i--){.
43b0: 20 20 20 20 20 20 70 5b 69 5d 20 3d 20 28 75 38        p[i] = (u8
43c0: 29 28 28 76 20 26 20 30 78 37 66 29 20 7c 20 30  )((v & 0x7f) | 0
43d0: 78 38 30 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  x80);.      v >>
43e0: 3d 20 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 7;.    }.    r
43f0: 65 74 75 72 6e 20 39 3b 0a 20 20 7d 20 20 20 20  eturn 9;.  }    
4400: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 7b 0a  .  n = 0;.  do{.
4410: 20 20 20 20 62 75 66 5b 6e 2b 2b 5d 20 3d 20 28      buf[n++] = (
4420: 75 38 29 28 28 76 20 26 20 30 78 37 66 29 20 7c  u8)((v & 0x7f) |
4430: 20 30 78 38 30 29 3b 0a 20 20 20 20 76 20 3e 3e   0x80);.    v >>
4440: 3d 20 37 3b 0a 20 20 7d 77 68 69 6c 65 28 20 76  = 7;.  }while( v
4450: 21 3d 30 20 29 3b 0a 20 20 62 75 66 5b 30 5d 20  !=0 );.  buf[0] 
4460: 26 3d 20 30 78 37 66 3b 0a 20 20 61 73 73 65 72  &= 0x7f;.  asser
4470: 74 28 20 6e 3c 3d 39 20 29 3b 0a 20 20 66 6f 72  t( n<=9 );.  for
4480: 28 69 3d 30 2c 20 6a 3d 6e 2d 31 3b 20 6a 3e 3d  (i=0, j=n-1; j>=
4490: 30 3b 20 6a 2d 2d 2c 20 69 2b 2b 29 7b 0a 20 20  0; j--, i++){.  
44a0: 20 20 70 5b 69 5d 20 3d 20 62 75 66 5b 6a 5d 3b    p[i] = buf[j];
44b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
44c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
44d0: 6f 75 74 69 6e 65 20 69 73 20 61 20 66 61 73 74  outine is a fast
44e0: 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  er version of sq
44f0: 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 28 29  lite3PutVarint()
4500: 20 74 68 61 74 20 6f 6e 6c 79 0a 2a 2a 20 77 6f   that only.** wo
4510: 72 6b 73 20 66 6f 72 20 33 32 2d 62 69 74 20 70  rks for 32-bit p
4520: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 73  ositive integers
4530: 20 61 6e 64 20 77 68 69 63 68 20 69 73 20 6f 70   and which is op
4540: 74 69 6d 69 7a 65 64 20 66 6f 72 0a 2a 2a 20 74  timized for.** t
4550: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
4560: 66 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73  f small integers
4570: 2e 20 20 41 20 4d 41 43 52 4f 20 76 65 72 73 69  .  A MACRO versi
4580: 6f 6e 2c 20 70 75 74 56 61 72 69 6e 74 33 32 2c  on, putVarint32,
4590: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
45a0: 77 68 69 63 68 20 69 6e 6c 69 6e 65 73 20 74 68  which inlines th
45b0: 65 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 63 61  e single-byte ca
45c0: 73 65 2e 20 20 41 6c 6c 20 63 6f 64 65 20 73 68  se.  All code sh
45d0: 6f 75 6c 64 20 75 73 65 0a 2a 2a 20 74 68 65 20  ould use.** the 
45e0: 4d 41 43 52 4f 20 76 65 72 73 69 6f 6e 20 61 73  MACRO version as
45f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
4600: 73 73 75 6d 65 73 20 74 68 65 20 73 69 6e 67 6c  ssumes the singl
4610: 65 2d 62 79 74 65 20 63 61 73 65 20 68 61 73 0a  e-byte case has.
4620: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4630: 68 61 6e 64 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20  handled..*/.int 
4640: 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74  sqlite3PutVarint
4650: 33 32 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  32(unsigned char
4660: 20 2a 70 2c 20 75 33 32 20 76 29 7b 0a 23 69 66   *p, u32 v){.#if
4670: 6e 64 65 66 20 70 75 74 56 61 72 69 6e 74 33 32  ndef putVarint32
4680: 0a 20 20 69 66 28 20 28 76 20 26 20 7e 30 78 37  .  if( (v & ~0x7
4690: 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 5b 30  f)==0 ){.    p[0
46a0: 5d 20 3d 20 76 3b 0a 20 20 20 20 72 65 74 75 72  ] = v;.    retur
46b0: 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 1;.  }.#endif.
46c0: 20 20 69 66 28 20 28 76 20 26 20 7e 30 78 33 66    if( (v & ~0x3f
46d0: 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 5b  ff)==0 ){.    p[
46e0: 30 5d 20 3d 20 28 75 38 29 28 28 76 3e 3e 37 29  0] = (u8)((v>>7)
46f0: 20 7c 20 30 78 38 30 29 3b 0a 20 20 20 20 70 5b   | 0x80);.    p[
4700: 31 5d 20 3d 20 28 75 38 29 28 76 20 26 20 30 78  1] = (u8)(v & 0x
4710: 37 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  7f);.    return 
4720: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
4730: 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74  sqlite3PutVarint
4740: 28 70 2c 20 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, v);.}../*.**
4750: 20 52 65 61 64 20 61 20 36 34 2d 62 69 74 20 76   Read a 64-bit v
4760: 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69  ariable-length i
4770: 6e 74 65 67 65 72 20 66 72 6f 6d 20 6d 65 6d 6f  nteger from memo
4780: 72 79 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ry starting at p
4790: 5b 30 5d 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  [0]..** Return t
47a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
47b0: 65 73 20 72 65 61 64 2e 20 20 54 68 65 20 76 61  es read.  The va
47c0: 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  lue is stored in
47d0: 20 2a 76 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74   *v..*/.u8 sqlit
47e0: 65 33 47 65 74 56 61 72 69 6e 74 28 63 6f 6e 73  e3GetVarint(cons
47f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4800: 2a 70 2c 20 75 36 34 20 2a 76 29 7b 0a 20 20 75  *p, u64 *v){.  u
4810: 33 32 20 61 2c 62 2c 73 3b 0a 0a 20 20 61 20 3d  32 a,b,s;..  a =
4820: 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70 30 20   *p;.  /* a: p0 
4830: 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20  (unmasked) */.  
4840: 69 66 20 28 21 28 61 26 30 78 38 30 29 29 0a 20  if (!(a&0x80)). 
4850: 20 7b 0a 20 20 20 20 2a 76 20 3d 20 61 3b 0a 20   {.    *v = a;. 
4860: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
4870: 0a 0a 20 20 70 2b 2b 3b 0a 20 20 62 20 3d 20 2a  ..  p++;.  b = *
4880: 70 3b 0a 20 20 2f 2a 20 62 3a 20 70 31 20 28 75  p;.  /* b: p1 (u
4890: 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66  nmasked) */.  if
48a0: 20 28 21 28 62 26 30 78 38 30 29 29 0a 20 20 7b   (!(b&0x80)).  {
48b0: 0a 20 20 20 20 61 20 26 3d 20 30 78 37 66 3b 0a  .    a &= 0x7f;.
48c0: 20 20 20 20 61 20 3d 20 61 3c 3c 37 3b 0a 20 20      a = a<<7;.  
48d0: 20 20 61 20 7c 3d 20 62 3b 0a 20 20 20 20 2a 76    a |= b;.    *v
48e0: 20 3d 20 61 3b 0a 20 20 20 20 72 65 74 75 72 6e   = a;.    return
48f0: 20 32 3b 0a 20 20 7d 0a 0a 20 20 70 2b 2b 3b 0a   2;.  }..  p++;.
4900: 20 20 61 20 3d 20 61 3c 3c 31 34 3b 0a 20 20 61    a = a<<14;.  a
4910: 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20   |= *p;.  /* a: 
4920: 70 30 3c 3c 31 34 20 7c 20 70 32 20 28 75 6e 6d  p0<<14 | p2 (unm
4930: 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28  asked) */.  if (
4940: 21 28 61 26 30 78 38 30 29 29 0a 20 20 7b 0a 20  !(a&0x80)).  {. 
4950: 20 20 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31     a &= (0x7f<<1
4960: 34 29 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 62  4)|(0x7f);.    b
4970: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 62 20   &= 0x7f;.    b 
4980: 3d 20 62 3c 3c 37 3b 0a 20 20 20 20 61 20 7c 3d  = b<<7;.    a |=
4990: 20 62 3b 0a 20 20 20 20 2a 76 20 3d 20 61 3b 0a   b;.    *v = a;.
49a0: 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
49b0: 7d 0a 0a 20 20 2f 2a 20 43 53 45 31 20 66 72 6f  }..  /* CSE1 fro
49c0: 6d 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 61 20 26  m below */.  a &
49d0: 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c 28 30 78  = (0x7f<<14)|(0x
49e0: 37 66 29 3b 0a 20 20 70 2b 2b 3b 0a 20 20 62 20  7f);.  p++;.  b 
49f0: 3d 20 62 3c 3c 31 34 3b 0a 20 20 62 20 7c 3d 20  = b<<14;.  b |= 
4a00: 2a 70 3b 0a 20 20 2f 2a 20 62 3a 20 70 31 3c 3c  *p;.  /* b: p1<<
4a10: 31 34 20 7c 20 70 33 20 28 75 6e 6d 61 73 6b 65  14 | p3 (unmaske
4a20: 64 29 20 2a 2f 0a 20 20 69 66 20 28 21 28 62 26  d) */.  if (!(b&
4a30: 30 78 38 30 29 29 0a 20 20 7b 0a 20 20 20 20 62  0x80)).  {.    b
4a40: 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c 28   &= (0x7f<<14)|(
4a50: 30 78 37 66 29 3b 0a 20 20 20 20 2f 2a 20 6d 6f  0x7f);.    /* mo
4a60: 76 65 64 20 43 53 45 31 20 75 70 20 2a 2f 0a 20  ved CSE1 up */. 
4a70: 20 20 20 2f 2a 20 61 20 26 3d 20 28 30 78 37 66     /* a &= (0x7f
4a80: 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 20 2a 2f  <<14)|(0x7f); */
4a90: 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37 3b 0a 20  .    a = a<<7;. 
4aa0: 20 20 20 61 20 7c 3d 20 62 3b 0a 20 20 20 20 2a     a |= b;.    *
4ab0: 76 20 3d 20 61 3b 0a 20 20 20 20 72 65 74 75 72  v = a;.    retur
4ac0: 6e 20 34 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61  n 4;.  }..  /* a
4ad0: 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32 20 28 6d  : p0<<14 | p2 (m
4ae0: 61 73 6b 65 64 29 20 2a 2f 0a 20 20 2f 2a 20 62  asked) */.  /* b
4af0: 3a 20 70 31 3c 3c 31 34 20 7c 20 70 33 20 28 75  : p1<<14 | p3 (u
4b00: 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 2f 2a  nmasked) */.  /*
4b10: 20 31 3a 73 61 76 65 20 6f 66 66 20 70 30 3c 3c   1:save off p0<<
4b20: 32 31 20 7c 20 70 31 3c 3c 31 34 20 7c 20 70 32  21 | p1<<14 | p2
4b30: 3c 3c 37 20 7c 20 70 33 20 28 6d 61 73 6b 65 64  <<7 | p3 (masked
4b40: 29 20 2a 2f 0a 20 20 2f 2a 20 6d 6f 76 65 64 20  ) */.  /* moved 
4b50: 43 53 45 31 20 75 70 20 2a 2f 0a 20 20 2f 2a 20  CSE1 up */.  /* 
4b60: 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c  a &= (0x7f<<14)|
4b70: 28 30 78 37 66 29 3b 20 2a 2f 0a 20 20 62 20 26  (0x7f); */.  b &
4b80: 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c 28 30 78  = (0x7f<<14)|(0x
4b90: 37 66 29 3b 0a 20 20 73 20 3d 20 61 3b 0a 20 20  7f);.  s = a;.  
4ba0: 2f 2a 20 73 3a 20 70 30 3c 3c 31 34 20 7c 20 70  /* s: p0<<14 | p
4bb0: 32 20 28 6d 61 73 6b 65 64 29 20 2a 2f 0a 0a 20  2 (masked) */.. 
4bc0: 20 70 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31   p++;.  a = a<<1
4bd0: 34 3b 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20  4;.  a |= *p;.  
4be0: 2f 2a 20 61 3a 20 70 30 3c 3c 32 38 20 7c 20 70  /* a: p0<<28 | p
4bf0: 32 3c 3c 31 34 20 7c 20 70 34 20 28 75 6e 6d 61  2<<14 | p4 (unma
4c00: 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21  sked) */.  if (!
4c10: 28 61 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20  (a&0x80)).  {.  
4c20: 20 20 2f 2a 20 77 65 20 63 61 6e 20 73 6b 69 70    /* we can skip
4c30: 20 74 68 65 73 65 20 63 61 75 73 65 20 74 68 65   these cause the
4c40: 79 20 77 65 72 65 20 28 65 66 66 65 63 74 69 76  y were (effectiv
4c50: 65 6c 79 29 20 64 6f 6e 65 20 61 62 6f 76 65 20  ely) done above 
4c60: 69 6e 20 63 61 6c 63 27 69 6e 67 20 73 20 2a 2f  in calc'ing s */
4c70: 0a 20 20 20 20 2f 2a 20 61 20 26 3d 20 28 30 78  .    /* a &= (0x
4c80: 37 66 3c 3c 32 38 29 7c 28 30 78 37 66 3c 3c 31  7f<<28)|(0x7f<<1
4c90: 34 29 7c 28 30 78 37 66 29 3b 20 2a 2f 0a 20 20  4)|(0x7f); */.  
4ca0: 20 20 2f 2a 20 62 20 26 3d 20 28 30 78 37 66 3c    /* b &= (0x7f<
4cb0: 3c 31 34 29 7c 28 30 78 37 66 29 3b 20 2a 2f 0a  <14)|(0x7f); */.
4cc0: 20 20 20 20 62 20 3d 20 62 3c 3c 37 3b 0a 20 20      b = b<<7;.  
4cd0: 20 20 61 20 7c 3d 20 62 3b 0a 20 20 20 20 73 20    a |= b;.    s 
4ce0: 3d 20 73 3e 3e 31 38 3b 0a 20 20 20 20 2a 76 20  = s>>18;.    *v 
4cf0: 3d 20 28 28 75 36 34 29 73 29 3c 3c 33 32 20 7c  = ((u64)s)<<32 |
4d00: 20 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 35   a;.    return 5
4d10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 32 3a 73 61  ;.  }..  /* 2:sa
4d20: 76 65 20 6f 66 66 20 70 30 3c 3c 32 31 20 7c 20  ve off p0<<21 | 
4d30: 70 31 3c 3c 31 34 20 7c 20 70 32 3c 3c 37 20 7c  p1<<14 | p2<<7 |
4d40: 20 70 33 20 28 6d 61 73 6b 65 64 29 20 2a 2f 0a   p3 (masked) */.
4d50: 20 20 73 20 3d 20 73 3c 3c 37 3b 0a 20 20 73 20    s = s<<7;.  s 
4d60: 7c 3d 20 62 3b 0a 20 20 2f 2a 20 73 3a 20 70 30  |= b;.  /* s: p0
4d70: 3c 3c 32 31 20 7c 20 70 31 3c 3c 31 34 20 7c 20  <<21 | p1<<14 | 
4d80: 70 32 3c 3c 37 20 7c 20 70 33 20 28 6d 61 73 6b  p2<<7 | p3 (mask
4d90: 65 64 29 20 2a 2f 0a 0a 20 20 70 2b 2b 3b 0a 20  ed) */..  p++;. 
4da0: 20 62 20 3d 20 62 3c 3c 31 34 3b 0a 20 20 62 20   b = b<<14;.  b 
4db0: 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 62 3a 20 70  |= *p;.  /* b: p
4dc0: 31 3c 3c 32 38 20 7c 20 70 33 3c 3c 31 34 20 7c  1<<28 | p3<<14 |
4dd0: 20 70 35 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a   p5 (unmasked) *
4de0: 2f 0a 20 20 69 66 20 28 21 28 62 26 30 78 38 30  /.  if (!(b&0x80
4df0: 29 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 77 65  )).  {.    /* we
4e00: 20 63 61 6e 20 73 6b 69 70 20 74 68 69 73 20 63   can skip this c
4e10: 61 75 73 65 20 69 74 20 77 61 73 20 28 65 66 66  ause it was (eff
4e20: 65 63 74 69 76 65 6c 79 29 20 64 6f 6e 65 20 61  ectively) done a
4e30: 62 6f 76 65 20 69 6e 20 63 61 6c 63 27 69 6e 67  bove in calc'ing
4e40: 20 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 62 20 26   s */.    /* b &
4e50: 3d 20 28 30 78 37 66 3c 3c 32 38 29 7c 28 30 78  = (0x7f<<28)|(0x
4e60: 37 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 20  7f<<14)|(0x7f); 
4e70: 2a 2f 0a 20 20 20 20 61 20 26 3d 20 28 30 78 37  */.    a &= (0x7
4e80: 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 0a 20  f<<14)|(0x7f);. 
4e90: 20 20 20 61 20 3d 20 61 3c 3c 37 3b 0a 20 20 20     a = a<<7;.   
4ea0: 20 61 20 7c 3d 20 62 3b 0a 20 20 20 20 73 20 3d   a |= b;.    s =
4eb0: 20 73 3e 3e 31 38 3b 0a 20 20 20 20 2a 76 20 3d   s>>18;.    *v =
4ec0: 20 28 28 75 36 34 29 73 29 3c 3c 33 32 20 7c 20   ((u64)s)<<32 | 
4ed0: 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  a;.    return 6;
4ee0: 0a 20 20 7d 0a 0a 20 20 70 2b 2b 3b 0a 20 20 61  .  }..  p++;.  a
4ef0: 20 3d 20 61 3c 3c 31 34 3b 0a 20 20 61 20 7c 3d   = a<<14;.  a |=
4f00: 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70 32 3c   *p;.  /* a: p2<
4f10: 3c 32 38 20 7c 20 70 34 3c 3c 31 34 20 7c 20 70  <28 | p4<<14 | p
4f20: 36 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a  6 (unmasked) */.
4f30: 20 20 69 66 20 28 21 28 61 26 30 78 38 30 29 29    if (!(a&0x80))
4f40: 0a 20 20 7b 0a 20 20 20 20 61 20 26 3d 20 28 30  .  {.    a &= (0
4f50: 78 31 66 3c 3c 32 38 29 7c 28 30 78 37 66 3c 3c  x1f<<28)|(0x7f<<
4f60: 31 34 29 7c 28 30 78 37 66 29 3b 0a 20 20 20 20  14)|(0x7f);.    
4f70: 62 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c  b &= (0x7f<<14)|
4f80: 28 30 78 37 66 29 3b 0a 20 20 20 20 62 20 3d 20  (0x7f);.    b = 
4f90: 62 3c 3c 37 3b 0a 20 20 20 20 61 20 7c 3d 20 62  b<<7;.    a |= b
4fa0: 3b 0a 20 20 20 20 73 20 3d 20 73 3e 3e 31 31 3b  ;.    s = s>>11;
4fb0: 0a 20 20 20 20 2a 76 20 3d 20 28 28 75 36 34 29  .    *v = ((u64)
4fc0: 73 29 3c 3c 33 32 20 7c 20 61 3b 0a 20 20 20 20  s)<<32 | a;.    
4fd0: 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 0a 20  return 7;.  }.. 
4fe0: 20 2f 2a 20 43 53 45 32 20 66 72 6f 6d 20 62 65   /* CSE2 from be
4ff0: 6c 6f 77 20 2a 2f 0a 20 20 61 20 26 3d 20 28 30  low */.  a &= (0
5000: 78 37 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b  x7f<<14)|(0x7f);
5010: 0a 20 20 70 2b 2b 3b 0a 20 20 62 20 3d 20 62 3c  .  p++;.  b = b<
5020: 3c 31 34 3b 0a 20 20 62 20 7c 3d 20 2a 70 3b 0a  <14;.  b |= *p;.
5030: 20 20 2f 2a 20 62 3a 20 70 33 3c 3c 32 38 20 7c    /* b: p3<<28 |
5040: 20 70 35 3c 3c 31 34 20 7c 20 70 37 20 28 75 6e   p5<<14 | p7 (un
5050: 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20  masked) */.  if 
5060: 28 21 28 62 26 30 78 38 30 29 29 0a 20 20 7b 0a  (!(b&0x80)).  {.
5070: 20 20 20 20 62 20 26 3d 20 28 30 78 31 66 3c 3c      b &= (0x1f<<
5080: 32 38 29 7c 28 30 78 37 66 3c 3c 31 34 29 7c 28  28)|(0x7f<<14)|(
5090: 30 78 37 66 29 3b 0a 20 20 20 20 2f 2a 20 6d 6f  0x7f);.    /* mo
50a0: 76 65 64 20 43 53 45 32 20 75 70 20 2a 2f 0a 20  ved CSE2 up */. 
50b0: 20 20 20 2f 2a 20 61 20 26 3d 20 28 30 78 37 66     /* a &= (0x7f
50c0: 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 20 2a 2f  <<14)|(0x7f); */
50d0: 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37 3b 0a 20  .    a = a<<7;. 
50e0: 20 20 20 61 20 7c 3d 20 62 3b 0a 20 20 20 20 73     a |= b;.    s
50f0: 20 3d 20 73 3e 3e 34 3b 0a 20 20 20 20 2a 76 20   = s>>4;.    *v 
5100: 3d 20 28 28 75 36 34 29 73 29 3c 3c 33 32 20 7c  = ((u64)s)<<32 |
5110: 20 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 38   a;.    return 8
5120: 3b 0a 20 20 7d 0a 0a 20 20 70 2b 2b 3b 0a 20 20  ;.  }..  p++;.  
5130: 61 20 3d 20 61 3c 3c 31 35 3b 0a 20 20 61 20 7c  a = a<<15;.  a |
5140: 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70 34  = *p;.  /* a: p4
5150: 3c 3c 32 39 20 7c 20 70 36 3c 3c 31 35 20 7c 20  <<29 | p6<<15 | 
5160: 70 38 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f  p8 (unmasked) */
5170: 0a 0a 20 20 2f 2a 20 6d 6f 76 65 64 20 43 53 45  ..  /* moved CSE
5180: 32 20 75 70 20 2a 2f 0a 20 20 2f 2a 20 61 20 26  2 up */.  /* a &
5190: 3d 20 28 30 78 37 66 3c 3c 32 39 29 7c 28 30 78  = (0x7f<<29)|(0x
51a0: 37 66 3c 3c 31 35 29 7c 28 30 78 66 66 29 3b 20  7f<<15)|(0xff); 
51b0: 2a 2f 0a 20 20 62 20 26 3d 20 28 30 78 37 66 3c  */.  b &= (0x7f<
51c0: 3c 31 34 29 7c 28 30 78 37 66 29 3b 0a 20 20 62  <14)|(0x7f);.  b
51d0: 20 3d 20 62 3c 3c 38 3b 0a 20 20 61 20 7c 3d 20   = b<<8;.  a |= 
51e0: 62 3b 0a 0a 20 20 73 20 3d 20 73 3c 3c 34 3b 0a  b;..  s = s<<4;.
51f0: 20 20 62 20 3d 20 70 5b 2d 34 5d 3b 0a 20 20 62    b = p[-4];.  b
5200: 20 26 3d 20 30 78 37 66 3b 0a 20 20 62 20 3d 20   &= 0x7f;.  b = 
5210: 62 3e 3e 33 3b 0a 20 20 73 20 7c 3d 20 62 3b 0a  b>>3;.  s |= b;.
5220: 0a 20 20 2a 76 20 3d 20 28 28 75 36 34 29 73 29  .  *v = ((u64)s)
5230: 3c 3c 33 32 20 7c 20 61 3b 0a 0a 20 20 72 65 74  <<32 | a;..  ret
5240: 75 72 6e 20 39 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 9;.}../*.** 
5250: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 76 61  Read a 32-bit va
5260: 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e  riable-length in
5270: 74 65 67 65 72 20 66 72 6f 6d 20 6d 65 6d 6f 72  teger from memor
5280: 79 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 5b  y starting at p[
5290: 30 5d 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  0]..** Return th
52a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
52b0: 73 20 72 65 61 64 2e 20 20 54 68 65 20 76 61 6c  s read.  The val
52c0: 75 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ue is stored in 
52d0: 2a 76 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  *v..**.** If the
52e0: 20 76 61 72 69 6e 74 20 73 74 6f 72 65 64 20 69   varint stored i
52f0: 6e 20 70 5b 30 5d 20 69 73 20 6c 61 72 67 65 72  n p[0] is larger
5300: 20 74 68 61 6e 20 63 61 6e 20 66 69 74 20 69 6e   than can fit in
5310: 20 61 20 33 32 2d 62 69 74 20 75 6e 73 69 67 6e   a 32-bit unsign
5320: 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74  ed.** integer, t
5330: 68 65 6e 20 73 65 74 20 2a 76 20 74 6f 20 30 78  hen set *v to 0x
5340: 66 66 66 66 66 66 66 66 2e 0a 2a 2a 0a 2a 2a 20  ffffffff..**.** 
5350: 41 20 4d 41 43 52 4f 20 76 65 72 73 69 6f 6e 2c  A MACRO version,
5360: 20 67 65 74 56 61 72 69 6e 74 33 32 2c 20 69 73   getVarint32, is
5370: 20 70 72 6f 76 69 64 65 64 20 77 68 69 63 68 20   provided which 
5380: 69 6e 6c 69 6e 65 73 20 74 68 65 20 0a 2a 2a 20  inlines the .** 
5390: 73 69 6e 67 6c 65 2d 62 79 74 65 20 63 61 73 65  single-byte case
53a0: 2e 20 20 41 6c 6c 20 63 6f 64 65 20 73 68 6f 75  .  All code shou
53b0: 6c 64 20 75 73 65 20 74 68 65 20 4d 41 43 52 4f  ld use the MACRO
53c0: 20 76 65 72 73 69 6f 6e 20 61 73 20 0a 2a 2a 20   version as .** 
53d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
53e0: 73 75 6d 65 73 20 74 68 65 20 73 69 6e 67 6c 65  sumes the single
53f0: 2d 62 79 74 65 20 63 61 73 65 20 68 61 73 20 61  -byte case has a
5400: 6c 72 65 61 64 79 20 62 65 65 6e 20 68 61 6e 64  lready been hand
5410: 6c 65 64 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  led..*/.u8 sqlit
5420: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 63 6f  e3GetVarint32(co
5430: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5440: 72 20 2a 70 2c 20 75 33 32 20 2a 76 29 7b 0a 20  r *p, u32 *v){. 
5450: 20 75 33 32 20 61 2c 62 3b 0a 0a 20 20 2f 2a 20   u32 a,b;..  /* 
5460: 54 68 65 20 31 2d 62 79 74 65 20 63 61 73 65 2e  The 1-byte case.
5470: 20 20 4f 76 65 72 77 68 65 6c 6d 69 6e 67 6c 79    Overwhelmingly
5480: 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e   the most common
5490: 2e 20 20 48 61 6e 64 6c 65 64 20 69 6e 6c 69 6e  .  Handled inlin
54a0: 65 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 67 65  e.  ** by the ge
54b0: 74 56 61 72 69 6e 33 32 28 29 20 6d 61 63 72 6f  tVarin32() macro
54c0: 20 2a 2f 0a 20 20 61 20 3d 20 2a 70 3b 0a 20 20   */.  a = *p;.  
54d0: 2f 2a 20 61 3a 20 70 30 20 28 75 6e 6d 61 73 6b  /* a: p0 (unmask
54e0: 65 64 29 20 2a 2f 0a 23 69 66 6e 64 65 66 20 67  ed) */.#ifndef g
54f0: 65 74 56 61 72 69 6e 74 33 32 0a 20 20 69 66 20  etVarint32.  if 
5500: 28 21 28 61 26 30 78 38 30 29 29 0a 20 20 7b 0a  (!(a&0x80)).  {.
5510: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65      /* Values be
5520: 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 37 20  tween 0 and 127 
5530: 2a 2f 0a 20 20 20 20 2a 76 20 3d 20 61 3b 0a 20  */.    *v = a;. 
5540: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
5550: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 68  .#endif..  /* Th
5560: 65 20 32 2d 62 79 74 65 20 63 61 73 65 20 2a 2f  e 2-byte case */
5570: 0a 20 20 70 2b 2b 3b 0a 20 20 62 20 3d 20 2a 70  .  p++;.  b = *p
5580: 3b 0a 20 20 2f 2a 20 62 3a 20 70 31 20 28 75 6e  ;.  /* b: p1 (un
5590: 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20  masked) */.  if 
55a0: 28 21 28 62 26 30 78 38 30 29 29 0a 20 20 7b 0a  (!(b&0x80)).  {.
55b0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65      /* Values be
55c0: 74 77 65 65 6e 20 31 32 38 20 61 6e 64 20 31 36  tween 128 and 16
55d0: 33 38 33 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20  383 */.    a &= 
55e0: 30 78 37 66 3b 0a 20 20 20 20 61 20 3d 20 61 3c  0x7f;.    a = a<
55f0: 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c  <7;.    *v = a |
5600: 20 62 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32   b;.    return 2
5610: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
5620: 33 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20  3-byte case */. 
5630: 20 70 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31   p++;.  a = a<<1
5640: 34 3b 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20  4;.  a |= *p;.  
5650: 2f 2a 20 61 3a 20 70 30 3c 3c 31 34 20 7c 20 70  /* a: p0<<14 | p
5660: 32 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a  2 (unmasked) */.
5670: 20 20 69 66 20 28 21 28 61 26 30 78 38 30 29 29    if (!(a&0x80))
5680: 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75  .  {.    /* Valu
5690: 65 73 20 62 65 74 77 65 65 6e 20 31 36 33 38 34  es between 16384
56a0: 20 61 6e 64 20 32 30 39 37 31 35 31 20 2a 2f 0a   and 2097151 */.
56b0: 20 20 20 20 61 20 26 3d 20 28 30 78 37 66 3c 3c      a &= (0x7f<<
56c0: 31 34 29 7c 28 30 78 37 66 29 3b 0a 20 20 20 20  14)|(0x7f);.    
56d0: 62 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 62  b &= 0x7f;.    b
56e0: 20 3d 20 62 3c 3c 37 3b 0a 20 20 20 20 2a 76 20   = b<<7;.    *v 
56f0: 3d 20 61 20 7c 20 62 3b 0a 20 20 20 20 72 65 74  = a | b;.    ret
5700: 75 72 6e 20 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 3;.  }..  /*
5710: 20 41 20 33 32 2d 62 69 74 20 76 61 72 69 6e 74   A 32-bit varint
5720: 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
5730: 65 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69  e size informati
5740: 6f 6e 20 69 6e 20 62 74 72 65 65 73 2e 0a 20 20  on in btrees..  
5750: 2a 2a 20 4f 62 6a 65 63 74 73 20 61 72 65 20 72  ** Objects are r
5760: 61 72 65 6c 79 20 6c 61 72 67 65 72 20 74 68 61  arely larger tha
5770: 6e 20 32 4d 69 42 20 6c 69 6d 69 74 20 6f 66 20  n 2MiB limit of 
5780: 61 20 33 2d 62 79 74 65 20 76 61 72 69 6e 74 2e  a 3-byte varint.
5790: 0a 20 20 2a 2a 20 41 20 33 2d 62 79 74 65 20 76  .  ** A 3-byte v
57a0: 61 72 69 6e 74 20 69 73 20 73 75 66 66 69 63 69  arint is suffici
57b0: 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ent, for example
57c0: 2c 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  , to record the 
57d0: 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 61 20 31  size.  ** of a 1
57e0: 30 34 38 35 36 39 2d 62 79 74 65 20 42 4c 4f 42  048569-byte BLOB
57f0: 20 6f 72 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2a   or string..  **
5800: 0a 20 20 2a 2a 20 57 65 20 6f 6e 6c 79 20 75 6e  .  ** We only un
5810: 72 6f 6c 6c 20 74 68 65 20 66 69 72 73 74 20 31  roll the first 1
5820: 2d 2c 20 32 2d 2c 20 61 6e 64 20 33 2d 20 62 79  -, 2-, and 3- by
5830: 74 65 20 63 61 73 65 73 2e 20 20 54 68 65 20 76  te cases.  The v
5840: 65 72 79 0a 20 20 2a 2a 20 72 61 72 65 20 6c 61  ery.  ** rare la
5850: 72 67 65 72 20 63 61 73 65 73 20 63 61 6e 20 62  rger cases can b
5860: 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65  e handled by the
5870: 20 73 6c 6f 77 65 72 20 36 34 2d 62 69 74 20 76   slower 64-bit v
5880: 61 72 69 6e 74 0a 20 20 2a 2a 20 72 6f 75 74 69  arint.  ** routi
5890: 6e 65 2e 0a 20 20 2a 2f 0a 23 69 66 20 31 0a 20  ne..  */.#if 1. 
58a0: 20 7b 0a 20 20 20 20 75 36 34 20 76 36 34 3b 0a   {.    u64 v64;.
58b0: 20 20 20 20 75 38 20 6e 3b 0a 0a 20 20 20 20 70      u8 n;..    p
58c0: 20 2d 3d 20 32 3b 0a 20 20 20 20 6e 20 3d 20 73   -= 2;.    n = s
58d0: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
58e0: 70 2c 20 26 76 36 34 29 3b 0a 20 20 20 20 61 73  p, &v64);.    as
58f0: 73 65 72 74 28 20 6e 3e 33 20 26 26 20 6e 3c 3d  sert( n>3 && n<=
5900: 39 20 29 3b 0a 20 20 20 20 69 66 28 20 28 76 36  9 );.    if( (v6
5910: 34 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  4 & SQLITE_MAX_U
5920: 33 32 29 21 3d 76 36 34 20 29 7b 0a 20 20 20 20  32)!=v64 ){.    
5930: 20 20 2a 76 20 3d 20 30 78 66 66 66 66 66 66 66    *v = 0xfffffff
5940: 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  f;.    }else{.  
5950: 20 20 20 20 2a 76 20 3d 20 28 75 33 32 29 76 36      *v = (u32)v6
5960: 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  4;.    }.    ret
5970: 75 72 6e 20 6e 3b 0a 20 20 7d 0a 0a 23 65 6c 73  urn n;.  }..#els
5980: 65 0a 20 20 2f 2a 20 46 6f 72 20 66 6f 6c 6c 6f  e.  /* For follo
5990: 77 69 6e 67 20 63 6f 64 65 20 28 6b 65 70 74 20  wing code (kept 
59a0: 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
59b0: 65 63 6f 72 64 20 6f 6e 6c 79 29 20 73 68 6f 77  ecord only) show
59c0: 73 20 61 6e 0a 20 20 2a 2a 20 75 6e 72 6f 6c 6c  s an.  ** unroll
59d0: 69 6e 67 20 66 6f 72 20 74 68 65 20 33 2d 20 61  ing for the 3- a
59e0: 6e 64 20 34 2d 62 79 74 65 20 76 61 72 69 6e 74  nd 4-byte varint
59f0: 20 63 61 73 65 73 2e 20 20 54 68 69 73 20 63 6f   cases.  This co
5a00: 64 65 20 69 73 0a 20 20 2a 2a 20 73 6c 69 67 68  de is.  ** sligh
5a10: 74 6c 79 20 66 61 73 74 65 72 2c 20 62 75 74 20  tly faster, but 
5a20: 69 74 20 69 73 20 61 6c 73 6f 20 6c 61 72 67 65  it is also large
5a30: 72 20 61 6e 64 20 6d 75 63 68 20 68 61 72 64 65  r and much harde
5a40: 72 20 74 6f 20 74 65 73 74 2e 0a 20 20 2a 2f 0a  r to test..  */.
5a50: 20 20 70 2b 2b 3b 0a 20 20 62 20 3d 20 62 3c 3c    p++;.  b = b<<
5a60: 31 34 3b 0a 20 20 62 20 7c 3d 20 2a 70 3b 0a 20  14;.  b |= *p;. 
5a70: 20 2f 2a 20 62 3a 20 70 31 3c 3c 31 34 20 7c 20   /* b: p1<<14 | 
5a80: 70 33 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f  p3 (unmasked) */
5a90: 0a 20 20 69 66 20 28 21 28 62 26 30 78 38 30 29  .  if (!(b&0x80)
5aa0: 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c  ).  {.    /* Val
5ab0: 75 65 73 20 62 65 74 77 65 65 6e 20 32 30 39 37  ues between 2097
5ac0: 31 35 32 20 61 6e 64 20 32 36 38 34 33 35 34 35  152 and 26843545
5ad0: 35 20 2a 2f 0a 20 20 20 20 62 20 26 3d 20 28 30  5 */.    b &= (0
5ae0: 78 37 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b  x7f<<14)|(0x7f);
5af0: 0a 20 20 20 20 61 20 26 3d 20 28 30 78 37 66 3c  .    a &= (0x7f<
5b00: 3c 31 34 29 7c 28 30 78 37 66 29 3b 0a 20 20 20  <14)|(0x7f);.   
5b10: 20 61 20 3d 20 61 3c 3c 37 3b 0a 20 20 20 20 2a   a = a<<7;.    *
5b20: 76 20 3d 20 61 20 7c 20 62 3b 0a 20 20 20 20 72  v = a | b;.    r
5b30: 65 74 75 72 6e 20 34 3b 0a 20 20 7d 0a 0a 20 20  eturn 4;.  }..  
5b40: 70 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34  p++;.  a = a<<14
5b50: 3b 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f  ;.  a |= *p;.  /
5b60: 2a 20 61 3a 20 70 30 3c 3c 32 38 20 7c 20 70 32  * a: p0<<28 | p2
5b70: 3c 3c 31 34 20 7c 20 70 34 20 28 75 6e 6d 61 73  <<14 | p4 (unmas
5b80: 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21 28  ked) */.  if (!(
5b90: 61 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20 20  a&0x80)).  {.   
5ba0: 20 2f 2a 20 57 61 6c 75 65 73 20 20 62 65 74 77   /* Walues  betw
5bb0: 65 65 6e 20 32 36 38 34 33 35 34 35 36 20 61 6e  een 268435456 an
5bc0: 64 20 33 34 33 35 39 37 33 38 33 36 37 20 2a 2f  d 34359738367 */
5bd0: 0a 20 20 20 20 61 20 26 3d 20 28 30 78 31 66 3c  .    a &= (0x1f<
5be0: 3c 32 38 29 7c 28 30 78 37 66 3c 3c 31 34 29 7c  <28)|(0x7f<<14)|
5bf0: 28 30 78 37 66 29 3b 0a 20 20 20 20 62 20 26 3d  (0x7f);.    b &=
5c00: 20 28 30 78 31 66 3c 3c 32 38 29 7c 28 30 78 37   (0x1f<<28)|(0x7
5c10: 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 0a 20  f<<14)|(0x7f);. 
5c20: 20 20 20 62 20 3d 20 62 3c 3c 37 3b 0a 20 20 20     b = b<<7;.   
5c30: 20 2a 76 20 3d 20 61 20 7c 20 62 3b 0a 20 20 20   *v = a | b;.   
5c40: 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 7d 0a 0a   return 5;.  }..
5c50: 20 20 2f 2a 20 57 65 20 63 61 6e 20 6f 6e 6c 79    /* We can only
5c60: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
5c70: 74 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 61  t when reading a
5c80: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
5c90: 65 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 20 49 6e  e.  ** file.  In
5ca0: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 61 72   that case we ar
5cb0: 65 20 6e 6f 74 20 69 6e 20 61 6e 79 20 68 75 72  e not in any hur
5cc0: 72 79 2e 20 20 55 73 65 20 74 68 65 20 28 72 65  ry.  Use the (re
5cd0: 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 73 6c  latively.  ** sl
5ce0: 6f 77 29 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  ow) general-purp
5cf0: 6f 73 65 20 73 71 6c 69 74 65 33 47 65 74 56 61  ose sqlite3GetVa
5d00: 72 69 6e 74 28 29 20 72 6f 75 74 69 6e 65 20 74  rint() routine t
5d10: 6f 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20  o extract the.  
5d20: 2a 2a 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 7b  ** value. */.  {
5d30: 0a 20 20 20 20 75 36 34 20 76 36 34 3b 0a 20 20  .    u64 v64;.  
5d40: 20 20 75 38 20 6e 3b 0a 0a 20 20 20 20 70 20 2d    u8 n;..    p -
5d50: 3d 20 34 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  = 4;.    n = sql
5d60: 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 70 2c  ite3GetVarint(p,
5d70: 20 26 76 36 34 29 3b 0a 20 20 20 20 61 73 73 65   &v64);.    asse
5d80: 72 74 28 20 6e 3e 35 20 26 26 20 6e 3c 3d 39 20  rt( n>5 && n<=9 
5d90: 29 3b 0a 20 20 20 20 2a 76 20 3d 20 28 75 33 32  );.    *v = (u32
5da0: 29 76 36 34 3b 0a 20 20 20 20 72 65 74 75 72 6e  )v64;.    return
5db0: 20 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   n;.  }.#endif.}
5dc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5dd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5de0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
5df0: 6e 65 65 64 65 64 20 74 6f 20 73 74 6f 72 65 20  needed to store 
5e00: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 36 34 2d  the given.** 64-
5e10: 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  bit integer..*/.
5e20: 69 6e 74 20 73 71 6c 69 74 65 33 56 61 72 69 6e  int sqlite3Varin
5e30: 74 4c 65 6e 28 75 36 34 20 76 29 7b 0a 20 20 69  tLen(u64 v){.  i
5e40: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 64 6f 7b 0a  nt i = 0;.  do{.
5e50: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 76 20 3e      i++;.    v >
5e60: 3e 3d 20 37 3b 0a 20 20 7d 77 68 69 6c 65 28 20  >= 7;.  }while( 
5e70: 76 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  v!=0 && ALWAYS(i
5e80: 3c 39 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  <9) );.  return 
5e90: 69 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  i;.}.../*.** Rea
5ea0: 64 20 6f 72 20 77 72 69 74 65 20 61 20 66 6f 75  d or write a fou
5eb0: 72 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  r-byte big-endia
5ec0: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  n integer value.
5ed0: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 47  .*/.u32 sqlite3G
5ee0: 65 74 34 62 79 74 65 28 63 6f 6e 73 74 20 75 38  et4byte(const u8
5ef0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
5f00: 70 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31  p[0]<<24) | (p[1
5f10: 5d 3c 3c 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c  ]<<16) | (p[2]<<
5f20: 38 29 20 7c 20 70 5b 33 5d 3b 0a 7d 0a 76 6f 69  8) | p[3];.}.voi
5f30: 64 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74  d sqlite3Put4byt
5f40: 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  e(unsigned char 
5f50: 2a 70 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b  *p, u32 v){.  p[
5f60: 30 5d 20 3d 20 28 75 38 29 28 76 3e 3e 32 34 29  0] = (u8)(v>>24)
5f70: 3b 0a 20 20 70 5b 31 5d 20 3d 20 28 75 38 29 28  ;.  p[1] = (u8)(
5f80: 76 3e 3e 31 36 29 3b 0a 20 20 70 5b 32 5d 20 3d  v>>16);.  p[2] =
5f90: 20 28 75 38 29 28 76 3e 3e 38 29 3b 0a 20 20 70   (u8)(v>>8);.  p
5fa0: 5b 33 5d 20 3d 20 28 75 38 29 76 3b 0a 7d 0a 0a  [3] = (u8)v;.}..
5fb0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5fc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
5fd0: 4c 49 54 45 52 41 4c 29 20 7c 7c 20 64 65 66 69  LITERAL) || defi
5fe0: 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
5ff0: 4f 44 45 43 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  ODEC)./*.** Tran
6000: 73 6c 61 74 65 20 61 20 73 69 6e 67 6c 65 20 62  slate a single b
6010: 79 74 65 20 6f 66 20 48 65 78 20 69 6e 74 6f 20  yte of Hex into 
6020: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 54  an integer..** T
6030: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
6040: 20 77 6f 72 6b 73 20 69 66 20 68 20 72 65 61 6c   works if h real
6050: 6c 79 20 69 73 20 61 20 76 61 6c 69 64 20 68 65  ly is a valid he
6060: 78 61 64 65 63 69 6d 61 6c 0a 2a 2a 20 63 68 61  xadecimal.** cha
6070: 72 61 63 74 65 72 3a 20 20 30 2e 2e 39 61 2e 2e  racter:  0..9a..
6080: 66 41 2e 2e 46 0a 2a 2f 0a 73 74 61 74 69 63 20  fA..F.*/.static 
6090: 75 38 20 68 65 78 54 6f 49 6e 74 28 69 6e 74 20  u8 hexToInt(int 
60a0: 68 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28 68  h){.  assert( (h
60b0: 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27 29  >='0' && h<='9')
60c0: 20 7c 7c 20 20 28 68 3e 3d 27 61 27 20 26 26 20   ||  (h>='a' && 
60d0: 68 3c 3d 27 66 27 29 20 7c 7c 20 20 28 68 3e 3d  h<='f') ||  (h>=
60e0: 27 41 27 20 26 26 20 68 3c 3d 27 46 27 29 20 29  'A' && h<='F') )
60f0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6100: 41 53 43 49 49 0a 20 20 68 20 2b 3d 20 39 2a 28  ASCII.  h += 9*(
6110: 31 26 28 68 3e 3e 36 29 29 3b 0a 23 65 6e 64 69  1&(h>>6));.#endi
6120: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
6130: 45 42 43 44 49 43 0a 20 20 68 20 2b 3d 20 39 2a  EBCDIC.  h += 9*
6140: 28 31 26 7e 28 68 3e 3e 34 29 29 3b 0a 23 65 6e  (1&~(h>>4));.#en
6150: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 28 75 38  dif.  return (u8
6160: 29 28 68 20 26 20 30 78 66 29 3b 0a 7d 0a 23 65  )(h & 0xf);.}.#e
6170: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
6180: 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
6190: 4c 20 7c 7c 20 53 51 4c 49 54 45 5f 48 41 53 5f  L || SQLITE_HAS_
61a0: 43 4f 44 45 43 20 2a 2f 0a 0a 23 69 66 20 21 64  CODEC */..#if !d
61b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
61c0: 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 29  IT_BLOB_LITERAL)
61d0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
61e0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 2f 2a  TE_HAS_CODEC)./*
61f0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 42 4c  .** Convert a BL
6200: 4f 42 20 6c 69 74 65 72 61 6c 20 6f 66 20 74 68  OB literal of th
6210: 65 20 66 6f 72 6d 20 22 78 27 68 68 68 68 68 68  e form "x'hhhhhh
6220: 27 22 20 69 6e 74 6f 20 69 74 73 20 62 69 6e 61  '" into its bina
6230: 72 79 0a 2a 2a 20 76 61 6c 75 65 2e 20 20 52 65  ry.** value.  Re
6240: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6250: 6f 20 69 74 73 20 62 69 6e 61 72 79 20 76 61 6c  o its binary val
6260: 75 65 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ue.  Space to ho
6270: 6c 64 20 74 68 65 0a 2a 2a 20 62 69 6e 61 72 79  ld the.** binary
6280: 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20   value has been 
6290: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
62a0: 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
62b0: 20 66 72 65 65 64 20 62 79 0a 2a 2a 20 74 68 65   freed by.** the
62c0: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
62d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
62e0: 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
62f0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
6300: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
6310: 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20    char *zBlob;. 
6320: 20 69 6e 74 20 69 3b 0a 0a 20 20 7a 42 6c 6f 62   int i;..  zBlob
6330: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
6340: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
6350: 2c 20 6e 2f 32 20 2b 20 31 29 3b 0a 20 20 6e 2d  , n/2 + 1);.  n-
6360: 2d 3b 0a 20 20 69 66 28 20 7a 42 6c 6f 62 20 29  -;.  if( zBlob )
6370: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
6380: 3c 6e 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  <n; i+=2){.     
6390: 20 7a 42 6c 6f 62 5b 69 2f 32 5d 20 3d 20 28 68   zBlob[i/2] = (h
63a0: 65 78 54 6f 49 6e 74 28 7a 5b 69 5d 29 3c 3c 34  exToInt(z[i])<<4
63b0: 29 20 7c 20 68 65 78 54 6f 49 6e 74 28 7a 5b 69  ) | hexToInt(z[i
63c0: 2b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  +1]);.    }.    
63d0: 7a 42 6c 6f 62 5b 69 2f 32 5d 20 3d 20 30 3b 0a  zBlob[i/2] = 0;.
63e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 42 6c    }.  return zBl
63f0: 6f 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ob;.}.#endif /* 
6400: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f  !SQLITE_OMIT_BLO
6410: 42 5f 4c 49 54 45 52 41 4c 20 7c 7c 20 53 51 4c  B_LITERAL || SQL
6420: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 2a 2f  ITE_HAS_CODEC */
6430: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 6e 20 65  ../*.** Log an e
6440: 72 72 6f 72 20 74 68 61 74 20 69 73 20 61 6e 20  rror that is an 
6450: 41 50 49 20 63 61 6c 6c 20 6f 6e 20 61 20 63 6f  API call on a co
6460: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
6470: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
6480: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 75 73  not have been us
6490: 65 64 2e 20 20 54 68 65 20 22 74 79 70 65 22 20  ed.  The "type" 
64a0: 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f  of connection po
64b0: 69 6e 74 65 72 20 69 73 20 67 69 76 65 6e 20 61  inter is given a
64c0: 73 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  s the.** argumen
64d0: 74 2e 20 20 54 68 65 20 7a 54 79 70 65 20 69 73  t.  The zType is
64e0: 20 61 20 77 6f 72 64 20 6c 69 6b 65 20 22 4e 55   a word like "NU
64f0: 4c 4c 22 20 6f 72 20 22 63 6c 6f 73 65 64 22 20  LL" or "closed" 
6500: 6f 72 20 22 69 6e 76 61 6c 69 64 22 2e 0a 2a 2f  or "invalid"..*/
6510: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 67  .static void log
6520: 42 61 64 43 6f 6e 6e 65 63 74 69 6f 6e 28 63 6f  BadConnection(co
6530: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 29  nst char *zType)
6540: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  {.  sqlite3_log(
6550: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a  SQLITE_MISUSE, .
6560: 20 20 20 20 20 22 41 50 49 20 63 61 6c 6c 20 77       "API call w
6570: 69 74 68 20 25 73 20 64 61 74 61 62 61 73 65 20  ith %s database 
6580: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
6590: 65 72 22 2c 0a 20 20 20 20 20 7a 54 79 70 65 0a  er",.     zType.
65a0: 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68    );.}../*.** Ch
65b0: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
65c0: 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64   we have a valid
65d0: 20 64 62 20 70 6f 69 6e 74 65 72 2e 20 20 54 68   db pointer.  Th
65e0: 69 73 20 74 65 73 74 20 69 73 20 6e 6f 74 0a 2a  is test is not.*
65f0: 2a 20 66 6f 6f 6c 70 72 6f 6f 66 20 62 75 74 20  * foolproof but 
6600: 69 74 20 64 6f 65 73 20 70 72 6f 76 69 64 65 20  it does provide 
6610: 73 6f 6d 65 20 6d 65 61 73 75 72 65 20 6f 66 20  some measure of 
6620: 70 72 6f 74 65 63 74 69 6f 6e 20 61 67 61 69 6e  protection again
6630: 73 74 0a 2a 2a 20 6d 69 73 75 73 65 20 6f 66 20  st.** misuse of 
6640: 74 68 65 20 69 6e 74 65 72 66 61 63 65 20 73 75  the interface su
6650: 63 68 20 61 73 20 70 61 73 73 69 6e 67 20 69 6e  ch as passing in
6660: 20 64 62 20 70 6f 69 6e 74 65 72 73 20 74 68 61   db pointers tha
6670: 74 20 61 72 65 0a 2a 2a 20 4e 55 4c 4c 20 6f 72  t are.** NULL or
6680: 20 77 68 69 63 68 20 68 61 76 65 20 62 65 65 6e   which have been
6690: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6c 6f 73   previously clos
66a0: 65 64 2e 20 20 49 66 20 74 68 69 73 20 72 6f 75  ed.  If this rou
66b0: 74 69 6e 65 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tine returns.** 
66c0: 31 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  1 it means that 
66d0: 74 68 65 20 64 62 20 70 6f 69 6e 74 65 72 20 69  the db pointer i
66e0: 73 20 76 61 6c 69 64 20 61 6e 64 20 30 20 69 66  s valid and 0 if
66f0: 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
6700: 65 0a 2a 2a 20 64 65 72 65 66 65 72 65 6e 63 65  e.** dereference
6710: 64 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  d for any reason
6720: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
6730: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 69  unction should i
6740: 6e 76 6f 6b 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  nvoke.** SQLITE_
6750: 4d 49 53 55 53 45 20 69 6d 6d 65 64 69 61 74 65  MISUSE immediate
6760: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ly..**.** sqlite
6770: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 29  3SafetyCheckOk()
6780: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74   requires that t
6790: 68 65 20 64 62 20 70 6f 69 6e 74 65 72 20 62 65  he db pointer be
67a0: 20 76 61 6c 69 64 20 66 6f 72 0a 2a 2a 20 75 73   valid for.** us
67b0: 65 2e 20 20 73 71 6c 69 74 65 33 53 61 66 65 74  e.  sqlite3Safet
67c0: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 29  yCheckSickOrOk()
67d0: 20 61 6c 6c 6f 77 73 20 61 20 64 62 20 70 6f 69   allows a db poi
67e0: 6e 74 65 72 20 74 68 61 74 20 66 61 69 6c 65 64  nter that failed
67f0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 70 72 6f 70   to.** open prop
6800: 65 72 6c 79 20 61 6e 64 20 69 73 20 6e 6f 74 20  erly and is not 
6810: 66 69 74 20 66 6f 72 20 67 65 6e 65 72 61 6c 20  fit for general 
6820: 75 73 65 20 62 75 74 20 77 68 69 63 68 20 63 61  use but which ca
6830: 6e 20 62 65 0a 2a 2a 20 75 73 65 64 20 61 73 20  n be.** used as 
6840: 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
6850: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 20  qlite3_errmsg() 
6860: 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  or sqlite3_close
6870: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
6880: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
6890: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
68a0: 75 33 32 20 6d 61 67 69 63 3b 0a 20 20 69 66 28  u32 magic;.  if(
68b0: 20 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 6c 6f   db==0 ){.    lo
68c0: 67 42 61 64 43 6f 6e 6e 65 63 74 69 6f 6e 28 22  gBadConnection("
68d0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 72 65 74 75  NULL");.    retu
68e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 61 67 69  rn 0;.  }.  magi
68f0: 63 20 3d 20 64 62 2d 3e 6d 61 67 69 63 3b 0a 20  c = db->magic;. 
6900: 20 69 66 28 20 6d 61 67 69 63 21 3d 53 51 4c 49   if( magic!=SQLI
6910: 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 29 7b  TE_MAGIC_OPEN ){
6920: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
6930: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
6940: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
6950: 20 20 6c 6f 67 42 61 64 43 6f 6e 6e 65 63 74 69    logBadConnecti
6960: 6f 6e 28 22 75 6e 6f 70 65 6e 65 64 22 29 3b 0a  on("unopened");.
6970: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
6980: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
6990: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
69a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 61 66 65  .int sqlite3Safe
69b0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
69c0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
69d0: 75 33 32 20 6d 61 67 69 63 3b 0a 20 20 6d 61 67  u32 magic;.  mag
69e0: 69 63 20 3d 20 64 62 2d 3e 6d 61 67 69 63 3b 0a  ic = db->magic;.
69f0: 20 20 69 66 28 20 6d 61 67 69 63 21 3d 53 51 4c    if( magic!=SQL
6a00: 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 20 26  ITE_MAGIC_SICK &
6a10: 26 0a 20 20 20 20 20 20 6d 61 67 69 63 21 3d 53  &.      magic!=S
6a20: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
6a30: 20 26 26 0a 20 20 20 20 20 20 6d 61 67 69 63 21   &&.      magic!
6a40: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55  =SQLITE_MAGIC_BU
6a50: 53 59 20 29 7b 0a 20 20 20 20 6c 6f 67 42 61 64  SY ){.    logBad
6a60: 43 6f 6e 6e 65 63 74 69 6f 6e 28 22 69 6e 76 61  Connection("inva
6a70: 6c 69 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  lid");.    retur
6a80: 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
6a90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
6aa0: 7d 0a                                            }.