/ Hex Artifact Content
Login

Artifact 94464ad0f6d893b439f773aa6acfb9c3220fd251f5ffd025529e290de6a1e2f7:


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 6e 63 6c 75  stdarg.h>.#inclu
0240: 64 65 20 3c 6d 61 74 68 2e 68 3e 0a 0a 2f 2a 0a  de <math.h>../*.
0250: 2a 2a 20 52 6f 75 74 69 6e 65 20 6e 65 65 64 65  ** Routine neede
0260: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65  d to support the
0270: 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
0280: 6f 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  o..*/.#ifdef SQL
0290: 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
02a0: 54 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  T.void sqlite3Co
02b0: 76 65 72 61 67 65 28 69 6e 74 20 78 29 7b 0a 20  verage(int x){. 
02c0: 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64   static unsigned
02d0: 20 64 75 6d 6d 79 20 3d 20 30 3b 0a 20 20 64 75   dummy = 0;.  du
02e0: 6d 6d 79 20 2b 3d 20 28 75 6e 73 69 67 6e 65 64  mmy += (unsigned
02f0: 29 78 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  )x;.}.#endif../*
0300: 0a 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 73 71 6c  .** Calls to sql
0310: 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 61  ite3FaultSim() a
0320: 72 65 20 75 73 65 64 20 74 6f 20 73 69 6d 75 6c  re used to simul
0330: 61 74 65 20 61 20 66 61 69 6c 75 72 65 20 64 75  ate a failure du
0340: 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 0a 2a 2a  ring testing,.**
0350: 20 6f 72 20 74 6f 20 62 79 70 61 73 73 20 6e 6f   or to bypass no
0360: 72 6d 61 6c 20 65 72 72 6f 72 20 64 65 74 65 63  rmal error detec
0370: 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 65 73 74  tion during test
0380: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ing in order to 
0390: 6c 65 74 20 0a 2a 2a 20 65 78 65 63 75 74 65 20  let .** execute 
03a0: 70 72 6f 63 65 65 64 20 66 75 74 68 65 72 20 64  proceed futher d
03b0: 6f 77 6e 73 74 72 65 61 6d 2e 0a 2a 2a 0a 2a 2a  ownstream..**.**
03c0: 20 49 6e 20 64 65 70 6c 6f 79 6d 65 6e 74 2c 20   In deployment, 
03d0: 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
03e0: 29 20 2a 61 6c 77 61 79 73 2a 20 72 65 74 75 72  ) *always* retur
03f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e  n SQLITE_OK (0).
0400: 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
0410: 46 61 75 6c 74 53 69 6d 28 29 20 66 75 6e 63 74  FaultSim() funct
0420: 69 6f 6e 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73  ion only returns
0430: 20 6e 6f 6e 2d 7a 65 72 6f 20 64 75 72 69 6e 67   non-zero during
0440: 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   testing..**.** 
0450: 44 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20  During testing, 
0460: 69 66 20 74 68 65 20 74 65 73 74 20 68 61 72 6e  if the test harn
0470: 65 73 73 20 68 61 73 20 73 65 74 20 61 20 66 61  ess has set a fa
0480: 75 6c 74 2d 73 69 6d 20 63 61 6c 6c 62 61 63 6b  ult-sim callback
0490: 20 75 73 69 6e 67 0a 2a 2a 20 61 20 63 61 6c 6c   using.** a call
04a0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 74 65 73 74   to sqlite3_test
04b0: 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
04c0: 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49  TESTCTRL_FAULT_I
04d0: 4e 53 54 41 4c 4c 29 2c 20 74 68 65 6e 0a 2a 2a  NSTALL), then.**
04e0: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71   each call to sq
04f0: 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20  lite3FaultSim() 
0500: 69 73 20 72 65 6c 61 79 65 64 20 74 6f 20 74 68  is relayed to th
0510: 61 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 73  at application-s
0520: 75 70 70 6c 69 65 64 0a 2a 2a 20 63 61 6c 6c 62  upplied.** callb
0530: 61 63 6b 20 61 6e 64 20 74 68 65 20 69 6e 74 65  ack and the inte
0540: 67 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ger return value
0550: 20 66 6f 72 6d 20 74 68 65 20 61 70 70 6c 69 63   form the applic
0560: 61 74 69 6f 6e 2d 73 75 70 70 6c 69 65 64 0a 2a  ation-supplied.*
0570: 2a 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 65  * callback is re
0580: 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
0590: 33 46 61 75 6c 74 53 69 6d 28 29 2e 0a 2a 2a 0a  3FaultSim()..**.
05a0: 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 61  ** The integer a
05b0: 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
05c0: 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20  e3FaultSim() is 
05d0: 61 20 63 6f 64 65 20 74 6f 20 69 64 65 6e 74 69  a code to identi
05e0: 66 79 20 77 68 69 63 68 0a 2a 2a 20 73 71 6c 69  fy which.** sqli
05f0: 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 6e  te3FaultSim() in
0600: 73 74 61 6e 63 65 20 69 73 20 62 65 69 6e 67 20  stance is being 
0610: 69 6e 76 6f 6b 65 64 2e 20 45 61 63 68 20 63 61  invoked. Each ca
0620: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 61 75  ll to sqlite3Fau
0630: 6c 74 53 69 6d 28 29 0a 2a 2a 20 73 68 6f 75 6c  ltSim().** shoul
0640: 64 20 68 61 76 65 20 61 20 75 6e 69 71 75 65 20  d have a unique 
0650: 63 6f 64 65 2e 20 20 54 6f 20 70 72 65 76 65 6e  code.  To preven
0660: 74 20 6c 65 67 61 63 79 20 74 65 73 74 69 6e 67  t legacy testing
0670: 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 66 72   applications fr
0680: 6f 6d 0a 2a 2a 20 62 72 65 61 6b 69 6e 67 2c 20  om.** breaking, 
0690: 74 68 65 20 63 6f 64 65 73 20 73 68 6f 75 6c 64  the codes should
06a0: 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20   not be changed 
06b0: 6f 72 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 23 69  or reused..*/.#i
06c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54  fndef SQLITE_UNT
06d0: 45 53 54 41 42 4c 45 0a 69 6e 74 20 73 71 6c 69  ESTABLE.int sqli
06e0: 74 65 33 46 61 75 6c 74 53 69 6d 28 69 6e 74 20  te3FaultSim(int 
06f0: 69 54 65 73 74 29 7b 0a 20 20 69 6e 74 20 28 2a  iTest){.  int (*
0700: 78 43 61 6c 6c 62 61 63 6b 29 28 69 6e 74 29 20  xCallback)(int) 
0710: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
0720: 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62  onfig.xTestCallb
0730: 61 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 78 43  ack;.  return xC
0740: 61 6c 6c 62 61 63 6b 20 3f 20 78 43 61 6c 6c 62  allback ? xCallb
0750: 61 63 6b 28 69 54 65 73 74 29 20 3a 20 53 51 4c  ack(iTest) : SQL
0760: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0770: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0780: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
0790: 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  OINT./*.** Retur
07a0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66 6c  n true if the fl
07b0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
07c0: 75 65 20 69 73 20 4e 6f 74 20 61 20 4e 75 6d 62  ue is Not a Numb
07d0: 65 72 20 28 4e 61 4e 29 2e 0a 2a 2a 0a 2a 2a 20  er (NaN)..**.** 
07e0: 55 73 65 20 74 68 65 20 6d 61 74 68 20 6c 69 62  Use the math lib
07f0: 72 61 72 79 20 69 73 6e 61 6e 28 29 20 66 75 6e  rary isnan() fun
0800: 63 74 69 6f 6e 20 69 66 20 63 6f 6d 70 69 6c 65  ction if compile
0810: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 48 41  d with SQLITE_HA
0820: 56 45 5f 49 53 4e 41 4e 2e 0a 2a 2a 20 4f 74 68  VE_ISNAN..** Oth
0830: 65 72 77 69 73 65 2c 20 77 65 20 68 61 76 65 20  erwise, we have 
0840: 6f 75 72 20 6f 77 6e 20 69 6d 70 6c 65 6d 65 6e  our own implemen
0850: 74 61 74 69 6f 6e 20 74 68 61 74 20 77 6f 72 6b  tation that work
0860: 73 20 6f 6e 20 6d 6f 73 74 20 73 79 73 74 65 6d  s on most system
0870: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
0880: 33 49 73 4e 61 4e 28 64 6f 75 62 6c 65 20 78 29  3IsNaN(double x)
0890: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 2f 2a  {.  int rc;   /*
08a0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
08b0: 6e 20 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  n */.#if !SQLITE
08c0: 5f 48 41 56 45 5f 49 53 4e 41 4e 20 26 26 20 21  _HAVE_ISNAN && !
08d0: 48 41 56 45 5f 49 53 4e 41 4e 0a 20 20 2f 2a 0a  HAVE_ISNAN.  /*.
08e0: 20 20 2a 2a 20 53 79 73 74 65 6d 73 20 74 68 61    ** Systems tha
08f0: 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 69 73  t support the is
0900: 6e 61 6e 28 29 20 6c 69 62 72 61 72 79 20 66 75  nan() library fu
0910: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 70 72  nction should pr
0920: 6f 62 61 62 6c 79 0a 20 20 2a 2a 20 6d 61 6b 65  obably.  ** make
0930: 20 75 73 65 20 6f 66 20 69 74 20 62 79 20 63 6f   use of it by co
0940: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 44 53  mpiling with -DS
0950: 51 4c 49 54 45 5f 48 41 56 45 5f 49 53 4e 41 4e  QLITE_HAVE_ISNAN
0960: 2e 20 20 42 75 74 20 77 65 20 68 61 76 65 0a 20  .  But we have. 
0970: 20 2a 2a 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   ** found that m
0980: 61 6e 79 20 73 79 73 74 65 6d 73 20 64 6f 20 6e  any systems do n
0990: 6f 74 20 68 61 76 65 20 61 20 77 6f 72 6b 69 6e  ot have a workin
09a0: 67 20 69 73 6e 61 6e 28 29 20 66 75 6e 63 74 69  g isnan() functi
09b0: 6f 6e 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20  on so.  ** this 
09c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
09d0: 73 20 70 72 6f 76 69 64 65 64 20 61 73 20 61 6e  s provided as an
09e0: 20 61 6c 74 65 72 6e 61 74 69 76 65 2e 0a 20 20   alternative..  
09f0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 4e 61 4e  **.  ** This NaN
0a00: 20 74 65 73 74 20 73 6f 6d 65 74 69 6d 65 73 20   test sometimes 
0a10: 66 61 69 6c 73 20 69 66 20 63 6f 6d 70 69 6c 65  fails if compile
0a20: 64 20 6f 6e 20 47 43 43 20 77 69 74 68 20 2d 66  d on GCC with -f
0a30: 66 61 73 74 2d 6d 61 74 68 2e 0a 20 20 2a 2a 20  fast-math..  ** 
0a40: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
0a50: 64 2c 20 74 68 65 20 75 73 65 20 6f 66 20 2d 66  d, the use of -f
0a60: 66 61 73 74 2d 6d 61 74 68 20 63 6f 6d 65 73 20  fast-math comes 
0a70: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
0a80: 6e 67 0a 20 20 2a 2a 20 77 61 72 6e 69 6e 67 3a  ng.  ** warning:
0a90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
0aa0: 54 68 69 73 20 6f 70 74 69 6f 6e 20 5b 2d 66 66  This option [-ff
0ab0: 61 73 74 2d 6d 61 74 68 5d 20 73 68 6f 75 6c 64  ast-math] should
0ac0: 20 6e 65 76 65 72 20 62 65 20 74 75 72 6e 65 64   never be turned
0ad0: 20 6f 6e 20 62 79 20 61 6e 79 0a 20 20 2a 2a 20   on by any.  ** 
0ae0: 20 20 20 20 20 2d 4f 20 6f 70 74 69 6f 6e 20 73       -O option s
0af0: 69 6e 63 65 20 69 74 20 63 61 6e 20 72 65 73 75  ince it can resu
0b00: 6c 74 20 69 6e 20 69 6e 63 6f 72 72 65 63 74 20  lt in incorrect 
0b10: 6f 75 74 70 75 74 20 66 6f 72 20 70 72 6f 67 72  output for progr
0b20: 61 6d 73 0a 20 20 2a 2a 20 20 20 20 20 20 77 68  ams.  **      wh
0b30: 69 63 68 20 64 65 70 65 6e 64 20 6f 6e 20 61 6e  ich depend on an
0b40: 20 65 78 61 63 74 20 69 6d 70 6c 65 6d 65 6e 74   exact implement
0b50: 61 74 69 6f 6e 20 6f 66 20 49 45 45 45 20 6f 72  ation of IEEE or
0b60: 20 49 53 4f 20 0a 20 20 2a 2a 20 20 20 20 20 20   ISO .  **      
0b70: 72 75 6c 65 73 2f 73 70 65 63 69 66 69 63 61 74  rules/specificat
0b80: 69 6f 6e 73 20 66 6f 72 20 6d 61 74 68 20 66 75  ions for math fu
0b90: 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20  nctions..  **.  
0ba0: 2a 2a 20 55 6e 64 65 72 20 4d 53 56 43 2c 20 74  ** Under MSVC, t
0bb0: 68 69 73 20 4e 61 4e 20 74 65 73 74 20 6d 61 79  his NaN test may
0bc0: 20 66 61 69 6c 20 69 66 20 63 6f 6d 70 69 6c 65   fail if compile
0bd0: 64 20 77 69 74 68 20 61 20 66 6c 6f 61 74 69 6e  d with a floatin
0be0: 67 2d 0a 20 20 2a 2a 20 70 6f 69 6e 74 20 70 72  g-.  ** point pr
0bf0: 65 63 69 73 69 6f 6e 20 6d 6f 64 65 20 6f 74 68  ecision mode oth
0c00: 65 72 20 74 68 61 6e 20 2f 66 70 3a 70 72 65 63  er than /fp:prec
0c10: 69 73 65 2e 20 20 46 72 6f 6d 20 74 68 65 20 4d  ise.  From the M
0c20: 53 44 4e 20 0a 20 20 2a 2a 20 64 6f 63 75 6d 65  SDN .  ** docume
0c30: 6e 74 61 74 69 6f 6e 3a 0a 20 20 2a 2a 0a 20 20  ntation:.  **.  
0c40: 2a 2a 20 20 20 20 20 20 54 68 65 20 63 6f 6d 70  **      The comp
0c50: 69 6c 65 72 20 5b 77 69 74 68 20 2f 66 70 3a 70  iler [with /fp:p
0c60: 72 65 63 69 73 65 5d 20 77 69 6c 6c 20 70 72 6f  recise] will pro
0c70: 70 65 72 6c 79 20 68 61 6e 64 6c 65 20 63 6f 6d  perly handle com
0c80: 70 61 72 69 73 6f 6e 73 20 0a 20 20 2a 2a 20 20  parisons .  **  
0c90: 20 20 20 20 69 6e 76 6f 6c 76 69 6e 67 20 4e 61      involving Na
0ca0: 4e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  N. For example, 
0cb0: 78 20 21 3d 20 78 20 65 76 61 6c 75 61 74 65 73  x != x evaluates
0cc0: 20 74 6f 20 74 72 75 65 20 69 66 20 78 20 69 73   to true if x is
0cd0: 20 4e 61 4e 20 0a 20 20 2a 2a 20 20 20 20 20 20   NaN .  **      
0ce0: 2e 2e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ....  */.#ifdef 
0cf0: 5f 5f 46 41 53 54 5f 4d 41 54 48 5f 5f 0a 23 20  __FAST_MATH__.# 
0d00: 65 72 72 6f 72 20 53 51 4c 69 74 65 20 77 69 6c  error SQLite wil
0d10: 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
0d20: 63 74 6c 79 20 77 69 74 68 20 74 68 65 20 2d 66  ctly with the -f
0d30: 66 61 73 74 2d 6d 61 74 68 20 6f 70 74 69 6f 6e  fast-math option
0d40: 20 6f 66 20 47 43 43 2e 0a 23 65 6e 64 69 66 0a   of GCC..#endif.
0d50: 20 20 76 6f 6c 61 74 69 6c 65 20 64 6f 75 62 6c    volatile doubl
0d60: 65 20 79 20 3d 20 78 3b 0a 20 20 76 6f 6c 61 74  e y = x;.  volat
0d70: 69 6c 65 20 64 6f 75 62 6c 65 20 7a 20 3d 20 79  ile double z = y
0d80: 3b 0a 20 20 72 63 20 3d 20 28 79 21 3d 7a 29 3b  ;.  rc = (y!=z);
0d90: 0a 23 65 6c 73 65 20 20 2f 2a 20 69 66 20 48 41  .#else  /* if HA
0da0: 56 45 5f 49 53 4e 41 4e 20 2a 2f 0a 20 20 72 63  VE_ISNAN */.  rc
0db0: 20 3d 20 69 73 6e 61 6e 28 78 29 3b 0a 23 65 6e   = isnan(x);.#en
0dc0: 64 69 66 20 2f 2a 20 48 41 56 45 5f 49 53 4e 41  dif /* HAVE_ISNA
0dd0: 4e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  N */.  testcase(
0de0: 20 72 63 20 29 3b 0a 20 20 72 65 74 75 72 6e 20   rc );.  return 
0df0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
0e00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
0e10: 54 49 4e 47 5f 50 4f 49 4e 54 20 2a 2f 0a 0a 2f  TING_POINT */../
0e20: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
0e30: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61  tring length tha
0e40: 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20  t is limited to 
0e50: 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72  what can be stor
0e60: 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33  ed in.** lower 3
0e70: 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62  0 bits of a 32-b
0e80: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
0e90: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  r..**.** The val
0ea0: 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ue returned will
0eb0: 20 6e 65 76 65 72 20 62 65 20 6e 65 67 61 74 69   never be negati
0ec0: 76 65 2e 20 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ve.  Nor will it
0ed0: 20 65 76 65 72 20 62 65 20 67 72 65 61 74 65 72   ever be greater
0ee0: 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 63 74  .** than the act
0ef0: 75 61 6c 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  ual length of th
0f00: 65 20 73 74 72 69 6e 67 2e 20 20 46 6f 72 20 76  e string.  For v
0f10: 65 72 79 20 6c 6f 6e 67 20 73 74 72 69 6e 67 73  ery long strings
0f20: 20 28 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61   (greater.** tha
0f30: 6e 20 31 47 69 42 29 20 74 68 65 20 76 61 6c 75  n 1GiB) the valu
0f40: 65 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  e returned might
0f50: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68   be less than th
0f60: 65 20 74 72 75 65 20 73 74 72 69 6e 67 20 6c 65  e true string le
0f70: 6e 67 74 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ngth..*/.int sql
0f80: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 63 6f 6e  ite3Strlen30(con
0f90: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
0fa0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
0fb0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 78 33   0;.  return 0x3
0fc0: 66 66 66 66 66 66 66 20 26 20 28 69 6e 74 29 73  fffffff & (int)s
0fd0: 74 72 6c 65 6e 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  trlen(z);.}../*.
0fe0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
0ff0: 63 6c 61 72 65 64 20 74 79 70 65 20 6f 66 20 61  clared type of a
1000: 20 63 6f 6c 75 6d 6e 2e 20 20 4f 72 20 72 65 74   column.  Or ret
1010: 75 72 6e 20 7a 44 66 6c 74 20 69 66 20 74 68 65  urn zDflt if the
1020: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 68 61 73 20   column .** has 
1030: 6e 6f 20 64 65 63 6c 61 72 65 64 20 74 79 70 65  no declared type
1040: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  ..**.** The colu
1050: 6d 6e 20 74 79 70 65 20 69 73 20 61 6e 20 65 78  mn type is an ex
1060: 74 72 61 20 73 74 72 69 6e 67 20 73 74 6f 72 65  tra string store
1070: 64 20 61 66 74 65 72 20 74 68 65 20 7a 65 72 6f  d after the zero
1080: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 6f 6e 0a 2a  -terminator on.*
1090: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * the column nam
10a0: 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  e if and only if
10b0: 20 74 68 65 20 43 4f 4c 46 4c 41 47 5f 48 41 53   the COLFLAG_HAS
10c0: 54 59 50 45 20 66 6c 61 67 20 69 73 20 73 65 74  TYPE flag is set
10d0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
10e0: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 43 6f 6c  e3ColumnType(Col
10f0: 75 6d 6e 20 2a 70 43 6f 6c 2c 20 63 68 61 72 20  umn *pCol, char 
1100: 2a 7a 44 66 6c 74 29 7b 0a 20 20 69 66 28 20 28  *zDflt){.  if( (
1110: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
1120: 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45   COLFLAG_HASTYPE
1130: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 44  )==0 ) return zD
1140: 66 6c 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  flt;.  return pC
1150: 6f 6c 2d 3e 7a 4e 61 6d 65 20 2b 20 73 74 72 6c  ol->zName + strl
1160: 65 6e 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20  en(pCol->zName) 
1170: 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  + 1;.}../*.** He
1180: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
1190: 72 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 29  r sqlite3Error()
11a0: 20 2d 20 63 61 6c 6c 65 64 20 72 61 72 65 6c 79   - called rarely
11b0: 2e 20 20 42 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  .  Broken out in
11c0: 74 6f 0a 2a 2a 20 61 20 73 65 70 61 72 61 74 65  to.** a separate
11d0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69   routine to avoi
11e0: 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 72 65  d unnecessary re
11f0: 67 69 73 74 65 72 20 73 61 76 65 73 20 6f 6e 20  gister saves on 
1200: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 73 71 6c 69  entry to.** sqli
1210: 74 65 33 45 72 72 6f 72 28 29 2e 0a 2a 2f 0a 73  te3Error()..*/.s
1220: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
1230: 4e 4c 49 4e 45 20 76 6f 69 64 20 20 73 71 6c 69  NLINE void  sqli
1240: 74 65 33 45 72 72 6f 72 46 69 6e 69 73 68 28 73  te3ErrorFinish(s
1250: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1260: 65 72 72 5f 63 6f 64 65 29 7b 0a 20 20 69 66 28  err_code){.  if(
1270: 20 64 62 2d 3e 70 45 72 72 20 29 20 73 71 6c 69   db->pErr ) sqli
1280: 74 65 33 56 61 6c 75 65 53 65 74 4e 75 6c 6c 28  te3ValueSetNull(
1290: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c  db->pErr);.  sql
12a0: 69 74 65 33 53 79 73 74 65 6d 45 72 72 6f 72 28  ite3SystemError(
12b0: 64 62 2c 20 65 72 72 5f 63 6f 64 65 29 3b 0a 7d  db, err_code);.}
12c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
12d0: 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f  current error co
12e0: 64 65 20 74 6f 20 65 72 72 5f 63 6f 64 65 20 61  de to err_code a
12f0: 6e 64 20 63 6c 65 61 72 20 61 6e 79 20 70 72 69  nd clear any pri
1300: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
1310: 2e 0a 2a 2a 20 41 6c 73 6f 20 73 65 74 20 69 53  ..** Also set iS
1320: 79 73 45 72 72 6e 6f 20 28 62 79 20 63 61 6c 6c  ysErrno (by call
1330: 69 6e 67 20 73 71 6c 69 74 65 33 53 79 73 74 65  ing sqlite3Syste
1340: 6d 29 20 69 66 20 74 68 65 20 65 72 72 5f 63 6f  m) if the err_co
1350: 64 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  de indicates.** 
1360: 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 61 70  that would be ap
1370: 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 76 6f  propriate..*/.vo
1380: 69 64 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  id sqlite3Error(
1390: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
13a0: 20 65 72 72 5f 63 6f 64 65 29 7b 0a 20 20 61 73   err_code){.  as
13b0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
13c0: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 65   db->errCode = e
13d0: 72 72 5f 63 6f 64 65 3b 0a 20 20 69 66 28 20 65  rr_code;.  if( e
13e0: 72 72 5f 63 6f 64 65 20 7c 7c 20 64 62 2d 3e 70  rr_code || db->p
13f0: 45 72 72 20 29 20 73 71 6c 69 74 65 33 45 72 72  Err ) sqlite3Err
1400: 6f 72 46 69 6e 69 73 68 28 64 62 2c 20 65 72 72  orFinish(db, err
1410: 5f 63 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _code);.}../*.**
1420: 20 4c 6f 61 64 20 74 68 65 20 73 71 6c 69 74 65   Load the sqlite
1430: 33 2e 69 53 79 73 45 72 72 6e 6f 20 66 69 65 6c  3.iSysErrno fiel
1440: 64 20 69 66 20 74 68 61 74 20 69 73 20 61 6e 20  d if that is an 
1450: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
1460: 67 0a 2a 2a 20 74 6f 20 64 6f 20 62 61 73 65 64  g.** to do based
1470: 20 6f 6e 20 74 68 65 20 53 51 4c 69 74 65 20 65   on the SQLite e
1480: 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 72 63 2e  rror code in rc.
1490: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14a0: 53 79 73 74 65 6d 45 72 72 6f 72 28 73 71 6c 69  SystemError(sqli
14b0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 72 63 29  te3 *db, int rc)
14c0: 7b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  {.  if( rc==SQLI
14d0: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
14e0: 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20 26 3d   return;.  rc &=
14f0: 20 30 78 66 66 3b 0a 20 20 69 66 28 20 72 63 3d   0xff;.  if( rc=
1500: 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
1510: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49   || rc==SQLITE_I
1520: 4f 45 52 52 20 29 7b 0a 20 20 20 20 64 62 2d 3e  OERR ){.    db->
1530: 69 53 79 73 45 72 72 6e 6f 20 3d 20 73 71 6c 69  iSysErrno = sqli
1540: 74 65 33 4f 73 47 65 74 4c 61 73 74 45 72 72 6f  te3OsGetLastErro
1550: 72 28 64 62 2d 3e 70 56 66 73 29 3b 0a 20 20 7d  r(db->pVfs);.  }
1560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1570: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
1580: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
1590: 6f 72 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  or string for th
15a0: 65 20 73 71 6c 69 74 65 0a 2a 2a 20 68 61 6e 64  e sqlite.** hand
15b0: 6c 65 20 22 64 62 22 2e 20 54 68 65 20 65 72 72  le "db". The err
15c0: 6f 72 20 63 6f 64 65 20 69 73 20 73 65 74 20 74  or code is set t
15d0: 6f 20 22 65 72 72 5f 63 6f 64 65 22 2e 0a 2a 2a  o "err_code"..**
15e0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
15f0: 20 4e 55 4c 4c 2c 20 73 74 72 69 6e 67 20 7a 46   NULL, string zF
1600: 6f 72 6d 61 74 20 73 70 65 63 69 66 69 65 73 20  ormat specifies 
1610: 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  the format of th
1620: 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74 72 69 6e  e.** error strin
1630: 67 20 69 6e 20 74 68 65 20 73 74 79 6c 65 20 6f  g in the style o
1640: 66 20 74 68 65 20 70 72 69 6e 74 66 20 66 75 6e  f the printf fun
1650: 63 74 69 6f 6e 73 3a 20 54 68 65 20 66 6f 6c 6c  ctions: The foll
1660: 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d 61 74 20  owing.** format 
1670: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 61  characters are a
1680: 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  llowed:.**.**   
1690: 20 20 20 25 73 20 20 20 20 20 20 49 6e 73 65 72     %s      Inser
16a0: 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 20 20  t a string.**   
16b0: 20 20 20 25 7a 20 20 20 20 20 20 41 20 73 74 72     %z      A str
16c0: 69 6e 67 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ing that should 
16d0: 62 65 20 66 72 65 65 64 20 61 66 74 65 72 20 75  be freed after u
16e0: 73 65 0a 2a 2a 20 20 20 20 20 20 25 64 20 20 20  se.**      %d   
16f0: 20 20 20 49 6e 73 65 72 74 20 61 6e 20 69 6e 74     Insert an int
1700: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 25 54 20  eger.**      %T 
1710: 20 20 20 20 20 49 6e 73 65 72 74 20 61 20 74 6f       Insert a to
1720: 6b 65 6e 0a 2a 2a 20 20 20 20 20 20 25 53 20 20  ken.**      %S  
1730: 20 20 20 20 49 6e 73 65 72 74 20 74 68 65 20 66      Insert the f
1740: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  irst element of 
1750: 61 20 53 72 63 4c 69 73 74 0a 2a 2a 0a 2a 2a 20  a SrcList.**.** 
1760: 7a 46 6f 72 6d 61 74 20 61 6e 64 20 61 6e 79 20  zFormat and any 
1770: 73 74 72 69 6e 67 20 74 6f 6b 65 6e 73 20 74 68  string tokens th
1780: 61 74 20 66 6f 6c 6c 6f 77 20 69 74 20 61 72 65  at follow it are
1790: 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 0a 2a   assumed to be.*
17a0: 2a 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46  * encoded in UTF
17b0: 2d 38 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 63 6c 65  -8..**.** To cle
17c0: 61 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ar the most rece
17d0: 6e 74 20 65 72 72 6f 72 20 66 6f 72 20 73 71 6c  nt error for sql
17e0: 69 74 65 20 68 61 6e 64 6c 65 20 22 64 62 22 2c  ite handle "db",
17f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 0a 2a 2a   sqlite3Error.**
1800: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
1810: 64 20 77 69 74 68 20 65 72 72 5f 63 6f 64 65 20  d with err_code 
1820: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
1830: 20 61 6e 64 20 7a 46 6f 72 6d 61 74 20 73 65 74   and zFormat set
1840: 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a  .** to NULL..*/.
1850: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 72 72 6f  void sqlite3Erro
1860: 72 57 69 74 68 4d 73 67 28 73 71 6c 69 74 65 33  rWithMsg(sqlite3
1870: 20 2a 64 62 2c 20 69 6e 74 20 65 72 72 5f 63 6f   *db, int err_co
1880: 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  de, const char *
1890: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
18a0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
18b0: 3b 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20  ;.  db->errCode 
18c0: 3d 20 65 72 72 5f 63 6f 64 65 3b 0a 20 20 73 71  = err_code;.  sq
18d0: 6c 69 74 65 33 53 79 73 74 65 6d 45 72 72 6f 72  lite3SystemError
18e0: 28 64 62 2c 20 65 72 72 5f 63 6f 64 65 29 3b 0a  (db, err_code);.
18f0: 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 3d 3d 30    if( zFormat==0
1900: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1910: 72 72 6f 72 28 64 62 2c 20 65 72 72 5f 63 6f 64  rror(db, err_cod
1920: 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  e);.  }else if( 
1930: 64 62 2d 3e 70 45 72 72 20 7c 7c 20 28 64 62 2d  db->pErr || (db-
1940: 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
1950: 61 6c 75 65 4e 65 77 28 64 62 29 29 21 3d 30 20  alueNew(db))!=0 
1960: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  ){.    char *z;.
1970: 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a      va_list ap;.
1980: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
1990: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 7a   zFormat);.    z
19a0: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
19b0: 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  tf(db, zFormat, 
19c0: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
19d0: 61 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ap);.    sqlite3
19e0: 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
19f0: 70 45 72 72 2c 20 2d 31 2c 20 7a 2c 20 53 51 4c  pErr, -1, z, SQL
1a00: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
1a10: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
1a20: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65  ../*.** Add an e
1a30: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
1a40: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
1a50: 61 6e 64 20 69 6e 63 72 65 6d 65 6e 74 20 70 50  and increment pP
1a60: 61 72 73 65 2d 3e 6e 45 72 72 2e 0a 2a 2a 20 54  arse->nErr..** T
1a70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
1a80: 6d 61 74 74 69 6e 67 20 63 68 61 72 61 63 74 65  matting characte
1a90: 72 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 3a 0a  rs are allowed:.
1aa0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 25 73 20 20 20  **.**      %s   
1ab0: 20 20 20 49 6e 73 65 72 74 20 61 20 73 74 72 69     Insert a stri
1ac0: 6e 67 0a 2a 2a 20 20 20 20 20 20 25 7a 20 20 20  ng.**      %z   
1ad0: 20 20 20 41 20 73 74 72 69 6e 67 20 74 68 61 74     A string that
1ae0: 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64   should be freed
1af0: 20 61 66 74 65 72 20 75 73 65 0a 2a 2a 20 20 20   after use.**   
1b00: 20 20 20 25 64 20 20 20 20 20 20 49 6e 73 65 72     %d      Inser
1b10: 74 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20  t an integer.** 
1b20: 20 20 20 20 20 25 54 20 20 20 20 20 20 49 6e 73       %T      Ins
1b30: 65 72 74 20 61 20 74 6f 6b 65 6e 0a 2a 2a 20 20  ert a token.**  
1b40: 20 20 20 20 25 53 20 20 20 20 20 20 49 6e 73 65      %S      Inse
1b50: 72 74 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  rt the first ele
1b60: 6d 65 6e 74 20 6f 66 20 61 20 53 72 63 4c 69 73  ment of a SrcLis
1b70: 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  t.**.** This fun
1b80: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
1b90: 75 73 65 64 20 74 6f 20 72 65 70 6f 72 74 20 61  used to report a
1ba0: 6e 79 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  ny error that oc
1bb0: 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 63 6f  curs while.** co
1bc0: 6d 70 69 6c 69 6e 67 20 61 6e 20 53 51 4c 20 73  mpiling an SQL s
1bd0: 74 61 74 65 6d 65 6e 74 20 28 69 2e 65 2e 20 77  tatement (i.e. w
1be0: 69 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 70 72  ithin sqlite3_pr
1bf0: 65 70 61 72 65 28 29 29 2e 20 54 68 65 0a 2a 2a  epare()). The.**
1c00: 20 6c 61 73 74 20 74 68 69 6e 67 20 74 68 65 20   last thing the 
1c10: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
1c20: 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  ) function does 
1c30: 69 73 20 63 6f 70 79 20 74 68 65 20 65 72 72 6f  is copy the erro
1c40: 72 0a 2a 2a 20 73 74 6f 72 65 64 20 62 79 20 74  r.** stored by t
1c50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74  his function int
1c60: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
1c70: 61 6e 64 6c 65 20 75 73 69 6e 67 20 73 71 6c 69  andle using sqli
1c80: 74 65 33 45 72 72 6f 72 28 29 2e 0a 2a 2a 20 46  te3Error()..** F
1c90: 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33  unctions sqlite3
1ca0: 45 72 72 6f 72 28 29 20 6f 72 20 73 71 6c 69 74  Error() or sqlit
1cb0: 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 29  e3ErrorWithMsg()
1cc0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 0a   should be used.
1cd0: 2a 2a 20 64 75 72 69 6e 67 20 73 74 61 74 65 6d  ** during statem
1ce0: 65 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 28 73  ent execution (s
1cf0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 65 74  qlite3_step() et
1d00: 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
1d10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 50 61 72  ite3ErrorMsg(Par
1d20: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
1d30: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1d40: 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ...){.  char *z
1d50: 4d 73 67 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61  Msg;.  va_list a
1d60: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
1d70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1d80: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1d90: 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d  ormat);.  zMsg =
1da0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
1db0: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
1dc0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1dd0: 0a 20 20 69 66 28 20 64 62 2d 3e 73 75 70 70 72  .  if( db->suppr
1de0: 65 73 73 45 72 72 20 29 7b 0a 20 20 20 20 73 71  essErr ){.    sq
1df0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1e00: 7a 4d 73 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zMsg);.  }else{.
1e10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
1e20: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ++;.    sqlite3D
1e30: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
1e40: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
1e50: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
1e60: 3d 20 7a 4d 73 67 3b 0a 20 20 20 20 70 50 61 72  = zMsg;.    pPar
1e70: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1e80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ERROR;.  }.}../*
1e90: 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1ea0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73  connection db is
1eb0: 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 73 69   currently parsi
1ec0: 6e 67 20 53 51 4c 2c 20 74 68 65 6e 20 74 72 61  ng SQL, then tra
1ed0: 6e 73 66 65 72 0a 2a 2a 20 65 72 72 6f 72 20 63  nsfer.** error c
1ee0: 6f 64 65 20 65 72 72 43 6f 64 65 20 74 6f 20 74  ode errCode to t
1ef0: 68 61 74 20 70 61 72 73 65 72 20 69 66 20 74 68  hat parser if th
1f00: 65 20 70 61 72 73 65 72 20 68 61 73 20 6e 6f 74  e parser has not
1f10: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 6e 63 6f   already.** enco
1f20: 75 6e 74 65 72 65 64 20 73 6f 6d 65 20 6f 74 68  untered some oth
1f30: 65 72 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  er kind of error
1f40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f50: 45 72 72 6f 72 54 6f 50 61 72 73 65 72 28 73 71  ErrorToParser(sq
1f60: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 65  lite3 *db, int e
1f70: 72 72 43 6f 64 65 29 7b 0a 20 20 50 61 72 73 65  rrCode){.  Parse
1f80: 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20   *pParse;.  if( 
1f90: 64 62 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  db==0 || (pParse
1fa0: 20 3d 20 64 62 2d 3e 70 50 61 72 73 65 29 3d 3d   = db->pParse)==
1fb0: 30 20 29 20 72 65 74 75 72 6e 20 65 72 72 43 6f  0 ) return errCo
1fc0: 64 65 3b 0a 20 20 70 50 61 72 73 65 2d 3e 72 63  de;.  pParse->rc
1fd0: 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 70 50   = errCode;.  pP
1fe0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
1ff0: 72 65 74 75 72 6e 20 65 72 72 43 6f 64 65 3b 0a  return errCode;.
2000: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
2010: 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71 75   an SQL-style qu
2020: 6f 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74 6f  oted string into
2030: 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e 67   a normal string
2040: 20 62 79 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20   by removing.** 
2050: 74 68 65 20 71 75 6f 74 65 20 63 68 61 72 61 63  the quote charac
2060: 74 65 72 73 2e 20 20 54 68 65 20 63 6f 6e 76 65  ters.  The conve
2070: 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e  rsion is done in
2080: 2d 70 6c 61 63 65 2e 20 20 49 66 20 74 68 65 0a  -place.  If the.
2090: 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73 20 6e 6f  ** input does no
20a0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 71  t begin with a q
20b0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 2c 20  uote character, 
20c0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
20d0: 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  e.** is a no-op.
20e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  .**.** The input
20f0: 20 73 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20   string must be 
2100: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
2110: 20 20 41 20 6e 65 77 20 7a 65 72 6f 2d 74 65 72    A new zero-ter
2120: 6d 69 6e 61 74 6f 72 0a 2a 2a 20 69 73 20 61 64  minator.** is ad
2130: 64 65 64 20 74 6f 20 74 68 65 20 64 65 71 75 6f  ded to the dequo
2140: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
2150: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2160: 75 65 20 69 73 20 2d 31 20 69 66 20 6e 6f 20 64  ue is -1 if no d
2170: 65 71 75 6f 74 69 6e 67 20 6f 63 63 75 72 73 20  equoting occurs 
2180: 6f 72 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  or the length of
2190: 20 74 68 65 0a 2a 2a 20 64 65 71 75 6f 74 65 64   the.** dequoted
21a0: 20 73 74 72 69 6e 67 2c 20 65 78 63 6c 75 73 69   string, exclusi
21b0: 76 65 20 6f 66 20 74 68 65 20 7a 65 72 6f 20 74  ve of the zero t
21c0: 65 72 6d 69 6e 61 74 6f 72 2c 20 69 66 20 64 65  erminator, if de
21d0: 71 75 6f 74 69 6e 67 20 64 6f 65 73 0a 2a 2a 20  quoting does.** 
21e0: 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  occur..**.** 200
21f0: 32 2d 30 32 2d 31 34 3a 20 54 68 69 73 20 72 6f  2-02-14: This ro
2200: 75 74 69 6e 65 20 69 73 20 65 78 74 65 6e 64 65  utine is extende
2210: 64 20 74 6f 20 72 65 6d 6f 76 65 20 4d 53 2d 41  d to remove MS-A
2220: 63 63 65 73 73 20 73 74 79 6c 65 0a 2a 2a 20 62  ccess style.** b
2230: 72 61 63 6b 65 74 73 20 66 72 6f 6d 20 61 72 6f  rackets from aro
2240: 75 6e 64 20 69 64 65 6e 74 69 66 69 65 72 73 2e  und identifiers.
2250: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 20 20    For example:  
2260: 22 5b 61 2d 62 2d 63 5d 22 20 62 65 63 6f 6d 65  "[a-b-c]" become
2270: 73 0a 2a 2a 20 22 61 2d 62 2d 63 22 2e 0a 2a 2f  s.** "a-b-c"..*/
2280: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71  .void sqlite3Deq
2290: 75 6f 74 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20  uote(char *z){. 
22a0: 20 63 68 61 72 20 71 75 6f 74 65 3b 0a 20 20 69   char quote;.  i
22b0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 7a  nt i, j;.  if( z
22c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
22d0: 71 75 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20  quote = z[0];.  
22e0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 71 75  if( !sqlite3Isqu
22f0: 6f 74 65 28 71 75 6f 74 65 29 20 29 20 72 65 74  ote(quote) ) ret
2300: 75 72 6e 3b 0a 20 20 69 66 28 20 71 75 6f 74 65  urn;.  if( quote
2310: 3d 3d 27 5b 27 20 29 20 71 75 6f 74 65 20 3d 20  =='[' ) quote = 
2320: 27 5d 27 3b 0a 20 20 66 6f 72 28 69 3d 31 2c 20  ']';.  for(i=1, 
2330: 6a 3d 30 3b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  j=0;; i++){.    
2340: 61 73 73 65 72 74 28 20 7a 5b 69 5d 20 29 3b 0a  assert( z[i] );.
2350: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 71 75      if( z[i]==qu
2360: 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ote ){.      if(
2370: 20 7a 5b 69 2b 31 5d 3d 3d 71 75 6f 74 65 20 29   z[i+1]==quote )
2380: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
2390: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 20 20   = quote;.      
23a0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c    i++;.      }el
23b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  se{.        brea
23c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
23d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 6a 2b  else{.      z[j+
23e0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 7d  +] = z[i];.    }
23f0: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
2400: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  .}.void sqlite3D
2410: 65 71 75 6f 74 65 45 78 70 72 28 45 78 70 72 20  equoteExpr(Expr 
2420: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
2430: 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28 70 2d  qlite3Isquote(p-
2440: 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 3b  >u.zToken[0]) );
2450: 0a 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  .  p->flags |= p
2460: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
2470: 22 27 20 3f 20 45 50 5f 51 75 6f 74 65 64 7c 45  "' ? EP_Quoted|E
2480: 50 5f 44 62 6c 51 75 6f 74 65 64 20 3a 20 45 50  P_DblQuoted : EP
2490: 5f 51 75 6f 74 65 64 3b 0a 20 20 73 71 6c 69 74  _Quoted;.  sqlit
24a0: 65 33 44 65 71 75 6f 74 65 28 70 2d 3e 75 2e 7a  e3Dequote(p->u.z
24b0: 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Token);.}../*.**
24c0: 20 47 65 6e 65 72 61 74 65 20 61 20 54 6f 6b 65   Generate a Toke
24d0: 6e 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 61 20  n object from a 
24e0: 73 74 72 69 6e 67 0a 2a 2f 0a 76 6f 69 64 20 73  string.*/.void s
24f0: 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
2500: 54 6f 6b 65 6e 20 2a 70 2c 20 63 68 61 72 20 2a  Token *p, char *
2510: 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 7a 3b 0a  z){.  p->z = z;.
2520: 20 20 70 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33    p->n = sqlite3
2530: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 7d 0a 0a  Strlen30(z);.}..
2540: 2f 2a 20 43 6f 6e 76 65 6e 69 65 6e 74 20 73 68  /* Convenient sh
2550: 6f 72 74 2d 68 61 6e 64 20 2a 2f 0a 23 64 65 66  ort-hand */.#def
2560: 69 6e 65 20 55 70 70 65 72 54 6f 4c 6f 77 65 72  ine UpperToLower
2570: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
2580: 6f 77 65 72 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ower../*.** Some
2590: 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 73 74   systems have st
25a0: 72 69 63 6d 70 28 29 2e 20 20 4f 74 68 65 72 73  ricmp().  Others
25b0: 20 68 61 76 65 20 73 74 72 63 61 73 65 63 6d 70   have strcasecmp
25c0: 28 29 2e 20 20 42 65 63 61 75 73 65 0a 2a 2a 20  ().  Because.** 
25d0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 73  there is no cons
25e0: 69 73 74 65 6e 63 79 2c 20 77 65 20 77 69 6c 6c  istency, we will
25f0: 20 64 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e 2e   define our own.
2600: 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  .**.** IMPLEMENT
2610: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 30 32 34  ATION-OF: R-3024
2620: 33 2d 30 32 34 39 34 20 54 68 65 20 73 71 6c 69  3-02494 The sqli
2630: 74 65 33 5f 73 74 72 69 63 6d 70 28 29 20 61 6e  te3_stricmp() an
2640: 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 72  d.** sqlite3_str
2650: 6e 69 63 6d 70 28 29 20 41 50 49 73 20 61 6c 6c  nicmp() APIs all
2660: 6f 77 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ow applications 
2670: 61 6e 64 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  and extensions t
2680: 6f 20 63 6f 6d 70 61 72 65 0a 2a 2a 20 74 68 65  o compare.** the
2690: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 77 6f   contents of two
26a0: 20 62 75 66 66 65 72 73 20 63 6f 6e 74 61 69 6e   buffers contain
26b0: 69 6e 67 20 55 54 46 2d 38 20 73 74 72 69 6e 67  ing UTF-8 string
26c0: 73 20 69 6e 20 61 0a 2a 2a 20 63 61 73 65 2d 69  s in a.** case-i
26d0: 6e 64 65 70 65 6e 64 65 6e 74 20 66 61 73 68 69  ndependent fashi
26e0: 6f 6e 2c 20 75 73 69 6e 67 20 74 68 65 20 73 61  on, using the sa
26f0: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
2700: 20 22 63 61 73 65 0a 2a 2a 20 69 6e 64 65 70 65   "case.** indepe
2710: 6e 64 65 6e 63 65 22 20 74 68 61 74 20 53 51 4c  ndence" that SQL
2720: 69 74 65 20 75 73 65 73 20 69 6e 74 65 72 6e 61  ite uses interna
2730: 6c 6c 79 20 77 68 65 6e 20 63 6f 6d 70 61 72 69  lly when compari
2740: 6e 67 20 69 64 65 6e 74 69 66 69 65 72 73 2e 0a  ng identifiers..
2750: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
2760: 74 72 69 63 6d 70 28 63 6f 6e 73 74 20 63 68 61  tricmp(const cha
2770: 72 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20  r *zLeft, const 
2780: 63 68 61 72 20 2a 7a 52 69 67 68 74 29 7b 0a 20  char *zRight){. 
2790: 20 69 66 28 20 7a 4c 65 66 74 3d 3d 30 20 29 7b   if( zLeft==0 ){
27a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 52 69 67  .    return zRig
27b0: 68 74 20 3f 20 2d 31 20 3a 20 30 3b 0a 20 20 7d  ht ? -1 : 0;.  }
27c0: 65 6c 73 65 20 69 66 28 20 7a 52 69 67 68 74 3d  else if( zRight=
27d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
27e0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
27f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2800: 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 29 3b 0a  zLeft, zRight);.
2810: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 74 72  }.int sqlite3Str
2820: 49 43 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20  ICmp(const char 
2830: 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63 68  *zLeft, const ch
2840: 61 72 20 2a 7a 52 69 67 68 74 29 7b 0a 20 20 75  ar *zRight){.  u
2850: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c  nsigned char *a,
2860: 20 2a 62 3b 0a 20 20 69 6e 74 20 63 2c 20 78 3b   *b;.  int c, x;
2870: 0a 20 20 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  .  a = (unsigned
2880: 20 63 68 61 72 20 2a 29 7a 4c 65 66 74 3b 0a 20   char *)zLeft;. 
2890: 20 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63   b = (unsigned c
28a0: 68 61 72 20 2a 29 7a 52 69 67 68 74 3b 0a 20 20  har *)zRight;.  
28b0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 63 20 3d  for(;;){.    c =
28c0: 20 2a 61 3b 0a 20 20 20 20 78 20 3d 20 2a 62 3b   *a;.    x = *b;
28d0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 78 20 29 7b  .    if( c==x ){
28e0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
28f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
2900: 73 65 7b 0a 20 20 20 20 20 20 63 20 3d 20 28 69  se{.      c = (i
2910: 6e 74 29 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  nt)UpperToLower[
2920: 63 5d 20 2d 20 28 69 6e 74 29 55 70 70 65 72 54  c] - (int)UpperT
2930: 6f 4c 6f 77 65 72 5b 78 5d 3b 0a 20 20 20 20 20  oLower[x];.     
2940: 20 69 66 28 20 63 20 29 20 62 72 65 61 6b 3b 0a   if( c ) break;.
2950: 20 20 20 20 7d 0a 20 20 20 20 61 2b 2b 3b 0a 20      }.    a++;. 
2960: 20 20 20 62 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65     b++;.  }.  re
2970: 74 75 72 6e 20 63 3b 0a 7d 0a 69 6e 74 20 73 71  turn c;.}.int sq
2980: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 63  lite3_strnicmp(c
2990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74  onst char *zLeft
29a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52  , const char *zR
29b0: 69 67 68 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ight, int N){.  
29c0: 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65  register unsigne
29d0: 64 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20  d char *a, *b;. 
29e0: 20 69 66 28 20 7a 4c 65 66 74 3d 3d 30 20 29 7b   if( zLeft==0 ){
29f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 52 69 67  .    return zRig
2a00: 68 74 20 3f 20 2d 31 20 3a 20 30 3b 0a 20 20 7d  ht ? -1 : 0;.  }
2a10: 65 6c 73 65 20 69 66 28 20 7a 52 69 67 68 74 3d  else if( zRight=
2a20: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2a30: 20 31 3b 0a 20 20 7d 0a 20 20 61 20 3d 20 28 75   1;.  }.  a = (u
2a40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a  nsigned char *)z
2a50: 4c 65 66 74 3b 0a 20 20 62 20 3d 20 28 75 6e 73  Left;.  b = (uns
2a60: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 52 69  igned char *)zRi
2a70: 67 68 74 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d  ght;.  while( N-
2a80: 2d 20 3e 20 30 20 26 26 20 2a 61 21 3d 30 20 26  - > 0 && *a!=0 &
2a90: 26 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  & UpperToLower[*
2aa0: 61 5d 3d 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72  a]==UpperToLower
2ab0: 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b  [*b]){ a++; b++;
2ac0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e 3c 30 20   }.  return N<0 
2ad0: 3f 20 30 20 3a 20 55 70 70 65 72 54 6f 4c 6f 77  ? 0 : UpperToLow
2ae0: 65 72 5b 2a 61 5d 20 2d 20 55 70 70 65 72 54 6f  er[*a] - UpperTo
2af0: 4c 6f 77 65 72 5b 2a 62 5d 3b 0a 7d 0a 0a 2f 2a  Lower[*b];.}../*
2b00: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 31 30 20 74  .** Compute 10 t
2b10: 6f 20 74 68 65 20 45 2d 74 68 20 70 6f 77 65 72  o the E-th power
2b20: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20 20 45 3d  .  Examples:  E=
2b30: 3d 31 20 72 65 73 75 6c 74 73 20 69 6e 20 31 30  =1 results in 10
2b40: 2e 0a 2a 2a 20 45 3d 3d 32 20 72 65 73 75 6c 74  ..** E==2 result
2b50: 73 20 69 6e 20 31 30 30 2e 20 20 45 3d 3d 35 30  s in 100.  E==50
2b60: 20 72 65 73 75 6c 74 73 20 69 6e 20 31 2e 30 65   results in 1.0e
2b70: 35 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  50..**.** This r
2b80: 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 77 6f 72 6b  outine only work
2b90: 73 20 66 6f 72 20 76 61 6c 75 65 73 20 6f 66 20  s for values of 
2ba0: 45 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  E between 1 and 
2bb0: 33 34 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  341..*/.static L
2bc0: 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 73  ONGDOUBLE_TYPE s
2bd0: 71 6c 69 74 65 33 50 6f 77 31 30 28 69 6e 74 20  qlite3Pow10(int 
2be0: 45 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  E){.#if defined(
2bf0: 5f 4d 53 43 5f 56 45 52 29 0a 20 20 73 74 61 74  _MSC_VER).  stat
2c00: 69 63 20 63 6f 6e 73 74 20 4c 4f 4e 47 44 4f 55  ic const LONGDOU
2c10: 42 4c 45 5f 54 59 50 45 20 78 5b 5d 20 3d 20 7b  BLE_TYPE x[] = {
2c20: 0a 20 20 20 20 31 2e 30 65 2b 30 30 31 4c 2c 0a  .    1.0e+001L,.
2c30: 20 20 20 20 31 2e 30 65 2b 30 30 32 4c 2c 0a 20      1.0e+002L,. 
2c40: 20 20 20 31 2e 30 65 2b 30 30 34 4c 2c 0a 20 20     1.0e+004L,.  
2c50: 20 20 31 2e 30 65 2b 30 30 38 4c 2c 0a 20 20 20    1.0e+008L,.   
2c60: 20 31 2e 30 65 2b 30 31 36 4c 2c 0a 20 20 20 20   1.0e+016L,.    
2c70: 31 2e 30 65 2b 30 33 32 4c 2c 0a 20 20 20 20 31  1.0e+032L,.    1
2c80: 2e 30 65 2b 30 36 34 4c 2c 0a 20 20 20 20 31 2e  .0e+064L,.    1.
2c90: 30 65 2b 31 32 38 4c 2c 0a 20 20 20 20 31 2e 30  0e+128L,.    1.0
2ca0: 65 2b 32 35 36 4c 0a 20 20 7d 3b 0a 20 20 4c 4f  e+256L.  };.  LO
2cb0: 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 72 20  NGDOUBLE_TYPE r 
2cc0: 3d 20 31 2e 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  = 1.0;.  int i;.
2cd0: 20 20 61 73 73 65 72 74 28 20 45 3e 3d 30 20 26    assert( E>=0 &
2ce0: 26 20 45 3c 3d 33 30 37 20 29 3b 0a 20 20 66 6f  & E<=307 );.  fo
2cf0: 72 28 69 3d 30 3b 20 45 21 3d 30 3b 20 69 2b 2b  r(i=0; E!=0; i++
2d00: 2c 20 45 20 3e 3e 3d 31 29 7b 0a 20 20 20 20 69  , E >>=1){.    i
2d10: 66 28 20 45 20 26 20 31 20 29 20 72 20 2a 3d 20  f( E & 1 ) r *= 
2d20: 78 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  x[i];.  }.  retu
2d30: 72 6e 20 72 3b 0a 23 65 6c 73 65 0a 20 20 4c 4f  rn r;.#else.  LO
2d40: 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78 20  NGDOUBLE_TYPE x 
2d50: 3d 20 31 30 2e 30 3b 0a 20 20 4c 4f 4e 47 44 4f  = 10.0;.  LONGDO
2d60: 55 42 4c 45 5f 54 59 50 45 20 72 20 3d 20 31 2e  UBLE_TYPE r = 1.
2d70: 30 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20  0;.  while(1){. 
2d80: 20 20 20 69 66 28 20 45 20 26 20 31 20 29 20 72     if( E & 1 ) r
2d90: 20 2a 3d 20 78 3b 0a 20 20 20 20 45 20 3e 3e 3d   *= x;.    E >>=
2da0: 20 31 3b 0a 20 20 20 20 69 66 28 20 45 3d 3d 30   1;.    if( E==0
2db0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 20   ) break;.    x 
2dc0: 2a 3d 20 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  *= x;.  }.  retu
2dd0: 72 6e 20 72 3b 20 0a 23 65 6e 64 69 66 0a 7d 0a  rn r; .#endif.}.
2de0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e  ./*.** The strin
2df0: 67 20 7a 5b 5d 20 69 73 20 61 6e 20 74 65 78 74  g z[] is an text
2e00: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2e10: 6f 66 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72  of a real number
2e20: 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 69  ..** Convert thi
2e30: 73 20 73 74 72 69 6e 67 20 74 6f 20 61 20 64 6f  s string to a do
2e40: 75 62 6c 65 20 61 6e 64 20 77 72 69 74 65 20 69  uble and write i
2e50: 74 20 69 6e 74 6f 20 2a 70 52 65 73 75 6c 74 2e  t into *pResult.
2e60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e  .**.** The strin
2e70: 67 20 7a 5b 5d 20 69 73 20 6c 65 6e 67 74 68 20  g z[] is length 
2e80: 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 20  bytes in length 
2e90: 28 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61 72  (bytes, not char
2ea0: 61 63 74 65 72 73 29 20 61 6e 64 0a 2a 2a 20 75  acters) and.** u
2eb0: 73 65 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  ses the encoding
2ec0: 20 65 6e 63 2e 20 20 54 68 65 20 73 74 72 69 6e   enc.  The strin
2ed0: 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  g is not necessa
2ee0: 72 69 6c 79 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  rily zero-termin
2ef0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
2f00: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 72  rn TRUE if the r
2f10: 65 73 75 6c 74 20 69 73 20 61 20 76 61 6c 69 64  esult is a valid
2f20: 20 72 65 61 6c 20 6e 75 6d 62 65 72 20 28 6f 72   real number (or
2f30: 20 69 6e 74 65 67 65 72 29 20 61 6e 64 20 46 41   integer) and FA
2f40: 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 73 74  LSE.** if the st
2f50: 72 69 6e 67 20 69 73 20 65 6d 70 74 79 20 6f 72  ring is empty or
2f60: 20 63 6f 6e 74 61 69 6e 73 20 65 78 74 72 61 6e   contains extran
2f70: 65 6f 75 73 20 74 65 78 74 2e 20 20 56 61 6c 69  eous text.  Vali
2f80: 64 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 61 72 65  d numbers.** are
2f90: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   in one of these
2fa0: 20 66 6f 72 6d 61 74 73 3a 0a 2a 2a 0a 2a 2a 20   formats:.**.** 
2fb0: 20 20 20 5b 2b 2d 5d 64 69 67 69 74 73 5b 45 5b     [+-]digits[E[
2fc0: 2b 2d 5d 64 69 67 69 74 73 5d 0a 2a 2a 20 20 20  +-]digits].**   
2fd0: 20 5b 2b 2d 5d 64 69 67 69 74 73 2e 5b 64 69 67   [+-]digits.[dig
2fe0: 69 74 73 5d 5b 45 5b 2b 2d 5d 64 69 67 69 74 73  its][E[+-]digits
2ff0: 5d 0a 2a 2a 20 20 20 20 5b 2b 2d 5d 2e 64 69 67  ].**    [+-].dig
3000: 69 74 73 5b 45 5b 2b 2d 5d 64 69 67 69 74 73 5d  its[E[+-]digits]
3010: 0a 2a 2a 0a 2a 2a 20 4c 65 61 64 69 6e 67 20 61  .**.** Leading a
3020: 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69 74  nd trailing whit
3030: 65 73 70 61 63 65 20 69 73 20 69 67 6e 6f 72 65  espace is ignore
3040: 64 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  d for the purpos
3050: 65 20 6f 66 20 64 65 74 65 72 6d 69 6e 69 6e 67  e of determining
3060: 0a 2a 2a 20 76 61 6c 69 64 69 74 79 2e 0a 2a 2a  .** validity..**
3070: 0a 2a 2a 20 49 66 20 73 6f 6d 65 20 70 72 65 66  .** If some pref
3080: 69 78 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ix of the input 
3090: 73 74 72 69 6e 67 20 69 73 20 61 20 76 61 6c 69  string is a vali
30a0: 64 20 6e 75 6d 62 65 72 2c 20 74 68 69 73 20 72  d number, this r
30b0: 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
30c0: 73 20 46 41 4c 53 45 20 62 75 74 20 69 74 20 73  s FALSE but it s
30d0: 74 69 6c 6c 20 63 6f 6e 76 65 72 74 73 20 74 68  till converts th
30e0: 65 20 70 72 65 66 69 78 20 61 6e 64 20 77 72 69  e prefix and wri
30f0: 74 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  tes the result.*
3100: 2a 20 69 6e 74 6f 20 2a 70 52 65 73 75 6c 74 2e  * into *pResult.
3110: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41  .*/.int sqlite3A
3120: 74 6f 46 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  toF(const char *
3130: 7a 2c 20 64 6f 75 62 6c 65 20 2a 70 52 65 73 75  z, double *pResu
3140: 6c 74 2c 20 69 6e 74 20 6c 65 6e 67 74 68 2c 20  lt, int length, 
3150: 75 38 20 65 6e 63 29 7b 0a 23 69 66 6e 64 65 66  u8 enc){.#ifndef
3160: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
3170: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 69 6e  ATING_POINT.  in
3180: 74 20 69 6e 63 72 3b 0a 20 20 63 6f 6e 73 74 20  t incr;.  const 
3190: 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 7a 20 2b  char *zEnd = z +
31a0: 20 6c 65 6e 67 74 68 3b 0a 20 20 2f 2a 20 73 69   length;.  /* si
31b0: 67 6e 20 2a 20 73 69 67 6e 69 66 69 63 61 6e 64  gn * significand
31c0: 20 2a 20 28 31 30 20 5e 20 28 65 73 69 67 6e 20   * (10 ^ (esign 
31d0: 2a 20 65 78 70 6f 6e 65 6e 74 29 29 20 2a 2f 0a  * exponent)) */.
31e0: 20 20 69 6e 74 20 73 69 67 6e 20 3d 20 31 3b 20    int sign = 1; 
31f0: 20 20 20 2f 2a 20 73 69 67 6e 20 6f 66 20 73 69     /* sign of si
3200: 67 6e 69 66 69 63 61 6e 64 20 2a 2f 0a 20 20 69  gnificand */.  i
3210: 36 34 20 73 20 3d 20 30 3b 20 20 20 20 20 20 20  64 s = 0;       
3220: 2f 2a 20 73 69 67 6e 69 66 69 63 61 6e 64 20 2a  /* significand *
3230: 2f 0a 20 20 69 6e 74 20 64 20 3d 20 30 3b 20 20  /.  int d = 0;  
3240: 20 20 20 20 20 2f 2a 20 61 64 6a 75 73 74 20 65       /* adjust e
3250: 78 70 6f 6e 65 6e 74 20 66 6f 72 20 73 68 69 66  xponent for shif
3260: 74 69 6e 67 20 64 65 63 69 6d 61 6c 20 70 6f 69  ting decimal poi
3270: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 73 69 67  nt */.  int esig
3280: 6e 20 3d 20 31 3b 20 20 20 2f 2a 20 73 69 67 6e  n = 1;   /* sign
3290: 20 6f 66 20 65 78 70 6f 6e 65 6e 74 20 2a 2f 0a   of exponent */.
32a0: 20 20 69 6e 74 20 65 20 3d 20 30 3b 20 20 20 20    int e = 0;    
32b0: 20 20 20 2f 2a 20 65 78 70 6f 6e 65 6e 74 20 2a     /* exponent *
32c0: 2f 0a 20 20 69 6e 74 20 65 56 61 6c 69 64 20 3d  /.  int eValid =
32d0: 20 31 3b 20 20 2f 2a 20 54 72 75 65 20 65 78 70   1;  /* True exp
32e0: 6f 6e 65 6e 74 20 69 73 20 65 69 74 68 65 72 20  onent is either 
32f0: 6e 6f 74 20 75 73 65 64 20 6f 72 20 69 73 20 77  not used or is w
3300: 65 6c 6c 2d 66 6f 72 6d 65 64 20 2a 2f 0a 20 20  ell-formed */.  
3310: 64 6f 75 62 6c 65 20 72 65 73 75 6c 74 3b 0a 20  double result;. 
3320: 20 69 6e 74 20 6e 44 69 67 69 74 73 20 3d 20 30   int nDigits = 0
3330: 3b 0a 20 20 69 6e 74 20 6e 6f 6e 4e 75 6d 20 3d  ;.  int nonNum =
3340: 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20   0;  /* True if 
3350: 69 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 55  input contains U
3360: 54 46 31 36 20 77 69 74 68 20 68 69 67 68 20 62  TF16 with high b
3370: 79 74 65 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a  yte non-zero */.
3380: 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63 3d 3d  .  assert( enc==
3390: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
33a0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
33b0: 4c 45 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54  LE || enc==SQLIT
33c0: 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 2a  E_UTF16BE );.  *
33d0: 70 52 65 73 75 6c 74 20 3d 20 30 2e 30 3b 20 20  pResult = 0.0;  
33e0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 72 65 74 75   /* Default retu
33f0: 72 6e 20 76 61 6c 75 65 2c 20 69 6e 20 63 61 73  rn value, in cas
3400: 65 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 2a 2f  e of an error */
3410: 0a 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  ..  if( enc==SQL
3420: 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
3430: 69 6e 63 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  incr = 1;.  }els
3440: 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
3450: 20 20 69 6e 63 72 20 3d 20 32 3b 0a 20 20 20 20    incr = 2;.    
3460: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 55  assert( SQLITE_U
3470: 54 46 31 36 4c 45 3d 3d 32 20 26 26 20 53 51 4c  TF16LE==2 && SQL
3480: 49 54 45 5f 55 54 46 31 36 42 45 3d 3d 33 20 29  ITE_UTF16BE==3 )
3490: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 65 6e  ;.    for(i=3-en
34a0: 63 3b 20 69 3c 6c 65 6e 67 74 68 20 26 26 20 7a  c; i<length && z
34b0: 5b 69 5d 3d 3d 30 3b 20 69 2b 3d 32 29 7b 7d 0a  [i]==0; i+=2){}.
34c0: 20 20 20 20 6e 6f 6e 4e 75 6d 20 3d 20 69 3c 6c      nonNum = i<l
34d0: 65 6e 67 74 68 3b 0a 20 20 20 20 7a 45 6e 64 20  ength;.    zEnd 
34e0: 3d 20 26 7a 5b 69 5e 31 5d 3b 0a 20 20 20 20 7a  = &z[i^1];.    z
34f0: 20 2b 3d 20 28 65 6e 63 26 31 29 3b 0a 20 20 7d   += (enc&1);.  }
3500: 0a 0a 20 20 2f 2a 20 73 6b 69 70 20 6c 65 61 64  ..  /* skip lead
3510: 69 6e 67 20 73 70 61 63 65 73 20 2a 2f 0a 20 20  ing spaces */.  
3520: 77 68 69 6c 65 28 20 7a 3c 7a 45 6e 64 20 26 26  while( z<zEnd &&
3530: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
3540: 2a 7a 29 20 29 20 7a 2b 3d 69 6e 63 72 3b 0a 20  *z) ) z+=incr;. 
3550: 20 69 66 28 20 7a 3e 3d 7a 45 6e 64 20 29 20 72   if( z>=zEnd ) r
3560: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 67  eturn 0;..  /* g
3570: 65 74 20 73 69 67 6e 20 6f 66 20 73 69 67 6e 69  et sign of signi
3580: 66 69 63 61 6e 64 20 2a 2f 0a 20 20 69 66 28 20  ficand */.  if( 
3590: 2a 7a 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 73  *z=='-' ){.    s
35a0: 69 67 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7a 2b  ign = -1;.    z+
35b0: 3d 69 6e 63 72 3b 0a 20 20 7d 65 6c 73 65 20 69  =incr;.  }else i
35c0: 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a 20 20  f( *z=='+' ){.  
35d0: 20 20 7a 2b 3d 69 6e 63 72 3b 0a 20 20 7d 0a 0a    z+=incr;.  }..
35e0: 20 20 2f 2a 20 63 6f 70 79 20 6d 61 78 20 73 69    /* copy max si
35f0: 67 6e 69 66 69 63 61 6e 74 20 64 69 67 69 74 73  gnificant digits
3600: 20 74 6f 20 73 69 67 6e 69 66 69 63 61 6e 64 20   to significand 
3610: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 3c 7a 45  */.  while( z<zE
3620: 6e 64 20 26 26 20 73 71 6c 69 74 65 33 49 73 64  nd && sqlite3Isd
3630: 69 67 69 74 28 2a 7a 29 20 26 26 20 73 3c 28 28  igit(*z) && s<((
3640: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2d 39 29  LARGEST_INT64-9)
3650: 2f 31 30 29 20 29 7b 0a 20 20 20 20 73 20 3d 20  /10) ){.    s = 
3660: 73 2a 31 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27  s*10 + (*z - '0'
3670: 29 3b 0a 20 20 20 20 7a 2b 3d 69 6e 63 72 3b 20  );.    z+=incr; 
3680: 6e 44 69 67 69 74 73 2b 2b 3b 0a 20 20 7d 0a 0a  nDigits++;.  }..
3690: 20 20 2f 2a 20 73 6b 69 70 20 6e 6f 6e 2d 73 69    /* skip non-si
36a0: 67 6e 69 66 69 63 61 6e 74 20 73 69 67 6e 69 66  gnificant signif
36b0: 69 63 61 6e 64 20 64 69 67 69 74 73 0a 20 20 2a  icand digits.  *
36c0: 2a 20 28 69 6e 63 72 65 61 73 65 20 65 78 70 6f  * (increase expo
36d0: 6e 65 6e 74 20 62 79 20 64 20 74 6f 20 73 68 69  nent by d to shi
36e0: 66 74 20 64 65 63 69 6d 61 6c 20 6c 65 66 74 29  ft decimal left)
36f0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 3c 7a   */.  while( z<z
3700: 45 6e 64 20 26 26 20 73 71 6c 69 74 65 33 49 73  End && sqlite3Is
3710: 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 3d  digit(*z) ){ z+=
3720: 69 6e 63 72 3b 20 6e 44 69 67 69 74 73 2b 2b 3b  incr; nDigits++;
3730: 20 64 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 7a 3e   d++; }.  if( z>
3740: 3d 7a 45 6e 64 20 29 20 67 6f 74 6f 20 64 6f 5f  =zEnd ) goto do_
3750: 61 74 6f 66 5f 63 61 6c 63 3b 0a 0a 20 20 2f 2a  atof_calc;..  /*
3760: 20 69 66 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e   if decimal poin
3770: 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  t is present */.
3780: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
3790: 0a 20 20 20 20 7a 2b 3d 69 6e 63 72 3b 0a 20 20  .    z+=incr;.  
37a0: 20 20 2f 2a 20 63 6f 70 79 20 64 69 67 69 74 73    /* copy digits
37b0: 20 66 72 6f 6d 20 61 66 74 65 72 20 64 65 63 69   from after deci
37c0: 6d 61 6c 20 74 6f 20 73 69 67 6e 69 66 69 63 61  mal to significa
37d0: 6e 64 0a 20 20 20 20 2a 2a 20 28 64 65 63 72 65  nd.    ** (decre
37e0: 61 73 65 20 65 78 70 6f 6e 65 6e 74 20 62 79 20  ase exponent by 
37f0: 64 20 74 6f 20 73 68 69 66 74 20 64 65 63 69 6d  d to shift decim
3800: 61 6c 20 72 69 67 68 74 29 20 2a 2f 0a 20 20 20  al right) */.   
3810: 20 77 68 69 6c 65 28 20 7a 3c 7a 45 6e 64 20 26   while( z<zEnd &
3820: 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  & sqlite3Isdigit
3830: 28 2a 7a 29 20 29 7b 0a 20 20 20 20 20 20 69 66  (*z) ){.      if
3840: 28 20 73 3c 28 28 4c 41 52 47 45 53 54 5f 49 4e  ( s<((LARGEST_IN
3850: 54 36 34 2d 39 29 2f 31 30 29 20 29 7b 0a 20 20  T64-9)/10) ){.  
3860: 20 20 20 20 20 20 73 20 3d 20 73 2a 31 30 20 2b        s = s*10 +
3870: 20 28 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20 20   (*z - '0');.   
3880: 20 20 20 20 20 64 2d 2d 3b 0a 20 20 20 20 20 20       d--;.      
3890: 7d 0a 20 20 20 20 20 20 7a 2b 3d 69 6e 63 72 3b  }.      z+=incr;
38a0: 20 6e 44 69 67 69 74 73 2b 2b 3b 0a 20 20 20 20   nDigits++;.    
38b0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3e 3d 7a  }.  }.  if( z>=z
38c0: 45 6e 64 20 29 20 67 6f 74 6f 20 64 6f 5f 61 74  End ) goto do_at
38d0: 6f 66 5f 63 61 6c 63 3b 0a 0a 20 20 2f 2a 20 69  of_calc;..  /* i
38e0: 66 20 65 78 70 6f 6e 65 6e 74 20 69 73 20 70 72  f exponent is pr
38f0: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 66 28 20 2a  esent */.  if( *
3900: 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45  z=='e' || *z=='E
3910: 27 20 29 7b 0a 20 20 20 20 7a 2b 3d 69 6e 63 72  ' ){.    z+=incr
3920: 3b 0a 20 20 20 20 65 56 61 6c 69 64 20 3d 20 30  ;.    eValid = 0
3930: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  ;..    /* This b
3940: 72 61 6e 63 68 20 69 73 20 6e 65 65 64 65 64 20  ranch is needed 
3950: 74 6f 20 61 76 6f 69 64 20 61 20 28 68 61 72 6d  to avoid a (harm
3960: 6c 65 73 73 29 20 62 75 66 66 65 72 20 6f 76 65  less) buffer ove
3970: 72 72 65 61 64 2e 20 20 54 68 65 20 0a 20 20 20  rread.  The .   
3980: 20 2a 2a 20 73 70 65 63 69 61 6c 20 63 6f 6d 6d   ** special comm
3990: 65 6e 74 20 61 6c 65 72 74 73 20 74 68 65 20 6d  ent alerts the m
39a0: 75 74 61 74 69 6f 6e 20 74 65 73 74 65 72 20 74  utation tester t
39b0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
39c0: 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73  answer.    ** is
39d0: 20 6f 62 74 61 69 6e 65 64 20 65 76 65 6e 20 69   obtained even i
39e0: 66 20 74 68 65 20 62 72 61 6e 63 68 20 69 73 20  f the branch is 
39f0: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20 20 69  omitted */.    i
3a00: 66 28 20 7a 3e 3d 7a 45 6e 64 20 29 20 67 6f 74  f( z>=zEnd ) got
3a10: 6f 20 64 6f 5f 61 74 6f 66 5f 63 61 6c 63 3b 20  o do_atof_calc; 
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 50               /*P
3a30: 52 45 56 45 4e 54 53 2d 48 41 52 4d 4c 45 53 53  REVENTS-HARMLESS
3a40: 2d 4f 56 45 52 52 45 41 44 2a 2f 0a 0a 20 20 20  -OVERREAD*/..   
3a50: 20 2f 2a 20 67 65 74 20 73 69 67 6e 20 6f 66 20   /* get sign of 
3a60: 65 78 70 6f 6e 65 6e 74 20 2a 2f 0a 20 20 20 20  exponent */.    
3a70: 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b 0a 20  if( *z=='-' ){. 
3a80: 20 20 20 20 20 65 73 69 67 6e 20 3d 20 2d 31 3b       esign = -1;
3a90: 0a 20 20 20 20 20 20 7a 2b 3d 69 6e 63 72 3b 0a  .      z+=incr;.
3aa0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a      }else if( *z
3ab0: 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 20 20 7a  =='+' ){.      z
3ac0: 2b 3d 69 6e 63 72 3b 0a 20 20 20 20 7d 0a 20 20  +=incr;.    }.  
3ad0: 20 20 2f 2a 20 63 6f 70 79 20 64 69 67 69 74 73    /* copy digits
3ae0: 20 74 6f 20 65 78 70 6f 6e 65 6e 74 20 2a 2f 0a   to exponent */.
3af0: 20 20 20 20 77 68 69 6c 65 28 20 7a 3c 7a 45 6e      while( z<zEn
3b00: 64 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  d && sqlite3Isdi
3b10: 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 20  git(*z) ){.     
3b20: 20 65 20 3d 20 65 3c 31 30 30 30 30 20 3f 20 28   e = e<10000 ? (
3b30: 65 2a 31 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27  e*10 + (*z - '0'
3b40: 29 29 20 3a 20 31 30 30 30 30 3b 0a 20 20 20 20  )) : 10000;.    
3b50: 20 20 7a 2b 3d 69 6e 63 72 3b 0a 20 20 20 20 20    z+=incr;.     
3b60: 20 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20   eValid = 1;.   
3b70: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 73 6b 69   }.  }..  /* ski
3b80: 70 20 74 72 61 69 6c 69 6e 67 20 73 70 61 63 65  p trailing space
3b90: 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 3c  s */.  while( z<
3ba0: 7a 45 6e 64 20 26 26 20 73 71 6c 69 74 65 33 49  zEnd && sqlite3I
3bb0: 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 3d  sspace(*z) ) z+=
3bc0: 69 6e 63 72 3b 0a 0a 64 6f 5f 61 74 6f 66 5f 63  incr;..do_atof_c
3bd0: 61 6c 63 3a 0a 20 20 2f 2a 20 61 64 6a 75 73 74  alc:.  /* adjust
3be0: 20 65 78 70 6f 6e 65 6e 74 20 62 79 20 64 2c 20   exponent by d, 
3bf0: 61 6e 64 20 75 70 64 61 74 65 20 73 69 67 6e 20  and update sign 
3c00: 2a 2f 0a 20 20 65 20 3d 20 28 65 2a 65 73 69 67  */.  e = (e*esig
3c10: 6e 29 20 2b 20 64 3b 0a 20 20 69 66 28 20 65 3c  n) + d;.  if( e<
3c20: 30 20 29 20 7b 0a 20 20 20 20 65 73 69 67 6e 20  0 ) {.    esign 
3c30: 3d 20 2d 31 3b 0a 20 20 20 20 65 20 2a 3d 20 2d  = -1;.    e *= -
3c40: 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  1;.  } else {.  
3c50: 20 20 65 73 69 67 6e 20 3d 20 31 3b 0a 20 20 7d    esign = 1;.  }
3c60: 0a 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 20 7b  ..  if( s==0 ) {
3c70: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 49  .    /* In the I
3c80: 45 45 45 20 37 35 34 20 73 74 61 6e 64 61 72 64  EEE 754 standard
3c90: 2c 20 7a 65 72 6f 20 69 73 20 73 69 67 6e 65 64  , zero is signed
3ca0: 2e 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 20  . */.    result 
3cb0: 3d 20 73 69 67 6e 3c 30 20 3f 20 2d 28 64 6f 75  = sign<0 ? -(dou
3cc0: 62 6c 65 29 30 20 3a 20 28 64 6f 75 62 6c 65 29  ble)0 : (double)
3cd0: 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  0;.  } else {.  
3ce0: 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
3cf0: 72 65 64 75 63 65 20 65 78 70 6f 6e 65 6e 74 2e  reduce exponent.
3d00: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42  .    **.    ** B
3d10: 72 61 6e 63 68 65 73 20 74 68 61 74 20 61 72 65  ranches that are
3d20: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f   not required fo
3d30: 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  r the correct an
3d40: 73 77 65 72 20 62 75 74 20 77 68 69 63 68 20 6f  swer but which o
3d50: 6e 6c 79 0a 20 20 20 20 2a 2a 20 68 65 6c 70 20  nly.    ** help 
3d60: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 63 6f  to obtain the co
3d70: 72 72 65 63 74 20 61 6e 73 77 65 72 20 66 61 73  rrect answer fas
3d80: 74 65 72 20 61 72 65 20 6d 61 72 6b 65 64 20 77  ter are marked w
3d90: 69 74 68 20 73 70 65 63 69 61 6c 0a 20 20 20 20  ith special.    
3da0: 2a 2a 20 63 6f 6d 6d 65 6e 74 73 2c 20 61 73 20  ** comments, as 
3db0: 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 6d 75  a hint to the mu
3dc0: 74 61 74 69 6f 6e 20 74 65 73 74 65 72 2e 0a 20  tation tester.. 
3dd0: 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
3de0: 20 65 3e 30 20 29 7b 20 20 20 20 20 20 20 20 20   e>0 ){         
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e10: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d  OPTIMIZATION-IF-
3e20: 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 69 66 28  TRUE*/.      if(
3e30: 20 65 73 69 67 6e 3e 30 20 29 7b 0a 20 20 20 20   esign>0 ){.    
3e40: 20 20 20 20 69 66 28 20 73 3e 3d 28 4c 41 52 47      if( s>=(LARG
3e50: 45 53 54 5f 49 4e 54 36 34 2f 31 30 29 20 29 20  EST_INT64/10) ) 
3e60: 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20  break;          
3e70: 20 20 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f     /*OPTIMIZATIO
3e80: 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20  N-IF-FALSE*/.   
3e90: 20 20 20 20 20 73 20 2a 3d 20 31 30 3b 0a 20 20       s *= 10;.  
3ea0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3eb0: 20 20 20 69 66 28 20 73 25 31 30 21 3d 30 20 29     if( s%10!=0 )
3ec0: 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20   break;         
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e    /*OPTIMIZATION
3ef0: 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20  -IF-FALSE*/.    
3f00: 20 20 20 20 73 20 2f 3d 20 31 30 3b 0a 20 20 20      s /= 10;.   
3f10: 20 20 20 7d 0a 20 20 20 20 20 20 65 2d 2d 3b 0a     }.      e--;.
3f20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 64      }..    /* ad
3f30: 6a 75 73 74 20 74 68 65 20 73 69 67 6e 20 6f 66  just the sign of
3f40: 20 73 69 67 6e 69 66 69 63 61 6e 64 20 2a 2f 0a   significand */.
3f50: 20 20 20 20 73 20 3d 20 73 69 67 6e 3c 30 20 3f      s = sign<0 ?
3f60: 20 2d 73 20 3a 20 73 3b 0a 0a 20 20 20 20 69 66   -s : s;..    if
3f70: 28 20 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ( e==0 ){       
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 20 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e    /*OPTIMIZATION
3fb0: 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20  -IF-TRUE*/.     
3fc0: 20 72 65 73 75 6c 74 20 3d 20 28 64 6f 75 62 6c   result = (doubl
3fd0: 65 29 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e)s;.    }else{.
3fe0: 20 20 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74        /* attempt
3ff0: 20 74 6f 20 68 61 6e 64 6c 65 20 65 78 74 72 65   to handle extre
4000: 6d 65 6c 79 20 73 6d 61 6c 6c 2f 6c 61 72 67 65  mely small/large
4010: 20 6e 75 6d 62 65 72 73 20 62 65 74 74 65 72 20   numbers better 
4020: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 65 3e 33  */.      if( e>3
4030: 30 37 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  07 ){           
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4f 50 54             /*OPT
4060: 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52 55  IMIZATION-IF-TRU
4070: 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20  E*/.        if( 
4080: 65 3c 33 34 32 20 29 7b 20 20 20 20 20 20 20 20  e<342 ){        
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4f 50              /*OP
40b0: 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52  TIMIZATION-IF-TR
40c0: 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4c  UE*/.          L
40d0: 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 73  ONGDOUBLE_TYPE s
40e0: 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 6f  cale = sqlite3Po
40f0: 77 31 30 28 65 2d 33 30 38 29 3b 0a 20 20 20 20  w10(e-308);.    
4100: 20 20 20 20 20 20 69 66 28 20 65 73 69 67 6e 3c        if( esign<
4110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
4120: 20 72 65 73 75 6c 74 20 3d 20 73 20 2f 20 73 63   result = s / sc
4130: 61 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ale;.           
4140: 20 72 65 73 75 6c 74 20 2f 3d 20 31 2e 30 65 2b   result /= 1.0e+
4150: 33 30 38 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  308;.          }
4160: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4170: 20 20 72 65 73 75 6c 74 20 3d 20 73 20 2a 20 73    result = s * s
4180: 63 61 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  cale;.          
4190: 20 20 72 65 73 75 6c 74 20 2a 3d 20 31 2e 30 65    result *= 1.0e
41a0: 2b 33 30 38 3b 0a 20 20 20 20 20 20 20 20 20 20  +308;.          
41b0: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
41c0: 20 61 73 73 65 72 74 28 20 65 3e 3d 33 34 32 20   assert( e>=342 
41d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
41e0: 20 65 73 69 67 6e 3c 30 20 29 7b 0a 20 20 20 20   esign<0 ){.    
41f0: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
4200: 20 30 2e 30 2a 73 3b 0a 20 20 20 20 20 20 20 20   0.0*s;.        
4210: 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20    }else{.#ifdef 
4220: 49 4e 46 49 4e 49 54 59 0a 20 20 20 20 20 20 20  INFINITY.       
4230: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 49 4e       result = IN
4240: 46 49 4e 49 54 59 2a 73 3b 0a 23 65 6c 73 65 0a  FINITY*s;.#else.
4250: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
4260: 6c 74 20 3d 20 31 65 33 30 38 2a 31 65 33 30 38  lt = 1e308*1e308
4270: 2a 73 3b 20 20 2f 2a 20 49 6e 66 69 6e 69 74 79  *s;  /* Infinity
4280: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   */.#endif.     
4290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
42a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
42b0: 20 20 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45        LONGDOUBLE
42c0: 5f 54 59 50 45 20 73 63 61 6c 65 20 3d 20 73 71  _TYPE scale = sq
42d0: 6c 69 74 65 33 50 6f 77 31 30 28 65 29 3b 0a 20  lite3Pow10(e);. 
42e0: 20 20 20 20 20 20 20 69 66 28 20 65 73 69 67 6e         if( esign
42f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
4300: 72 65 73 75 6c 74 20 3d 20 73 20 2f 20 73 63 61  result = s / sca
4310: 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  le;.        }els
4320: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
4330: 75 6c 74 20 3d 20 73 20 2a 20 73 63 61 6c 65 3b  ult = s * scale;
4340: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4350: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
4360: 2f 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  /* store the res
4370: 75 6c 74 20 2a 2f 0a 20 20 2a 70 52 65 73 75 6c  ult */.  *pResul
4380: 74 20 3d 20 72 65 73 75 6c 74 3b 0a 0a 20 20 2f  t = result;..  /
4390: 2a 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66  * return true if
43a0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 6e 6f 20 65   number and no e
43b0: 78 74 72 61 20 6e 6f 6e 2d 77 68 69 74 65 73 70  xtra non-whitesp
43c0: 61 63 65 20 63 68 72 61 63 74 65 72 73 20 61 66  ace chracters af
43d0: 74 65 72 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ter */.  return 
43e0: 7a 3d 3d 7a 45 6e 64 20 26 26 20 6e 44 69 67 69  z==zEnd && nDigi
43f0: 74 73 3e 30 20 26 26 20 65 56 61 6c 69 64 20 26  ts>0 && eValid &
4400: 26 20 6e 6f 6e 4e 75 6d 3d 3d 30 3b 0a 23 65 6c  & nonNum==0;.#el
4410: 73 65 0a 20 20 72 65 74 75 72 6e 20 21 73 71 6c  se.  return !sql
4420: 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 70 52  ite3Atoi64(z, pR
4430: 65 73 75 6c 74 2c 20 6c 65 6e 67 74 68 2c 20 65  esult, length, e
4440: 6e 63 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  nc);.#endif /* S
4450: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
4460: 49 4e 47 5f 50 4f 49 4e 54 20 2a 2f 0a 7d 0a 0a  ING_POINT */.}..
4470: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
4480: 65 20 31 39 2d 63 68 61 72 61 63 74 65 72 20 73  e 19-character s
4490: 74 72 69 6e 67 20 7a 4e 75 6d 20 61 67 61 69 6e  tring zNum again
44a0: 73 74 20 74 68 65 20 74 65 78 74 20 72 65 70 72  st the text repr
44b0: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 76 61  esentation.** va
44c0: 6c 75 65 20 32 5e 36 33 3a 20 20 39 32 32 33 33  lue 2^63:  92233
44d0: 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 20  72036854775808. 
44e0: 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
44f0: 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
4500: 69 76 65 0a 2a 2a 20 69 66 20 7a 4e 75 6d 20 69  ive.** if zNum i
4510: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
4520: 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
4530: 72 20 74 68 61 6e 20 74 68 65 20 73 74 72 69 6e  r than the strin
4540: 67 2e 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  g..** Note that 
4550: 7a 4e 75 6d 20 6d 75 73 74 20 63 6f 6e 74 61 69  zNum must contai
4560: 6e 20 65 78 61 63 74 6c 79 20 31 39 20 63 68 61  n exactly 19 cha
4570: 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 55  racters..**.** U
4580: 6e 6c 69 6b 65 20 6d 65 6d 63 6d 70 28 29 20 74  nlike memcmp() t
4590: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 67  his routine is g
45a0: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 72 65 74  uaranteed to ret
45b0: 75 72 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e  urn the differen
45c0: 63 65 0a 2a 2a 20 69 6e 20 74 68 65 20 76 61 6c  ce.** in the val
45d0: 75 65 73 20 6f 66 20 74 68 65 20 6c 61 73 74 20  ues of the last 
45e0: 64 69 67 69 74 20 69 66 20 74 68 65 20 6f 6e 6c  digit if the onl
45f0: 79 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  y difference is 
4600: 69 6e 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 64  in the.** last d
4610: 69 67 69 74 2e 20 20 53 6f 2c 20 66 6f 72 20 65  igit.  So, for e
4620: 78 61 6d 70 6c 65 2c 0a 2a 2a 0a 2a 2a 20 20 20  xample,.**.**   
4630: 20 20 20 63 6f 6d 70 61 72 65 32 70 6f 77 36 33     compare2pow63
4640: 28 22 39 32 32 33 33 37 32 30 33 36 38 35 34 37  ("92233720368547
4650: 37 35 38 30 30 22 2c 20 31 29 0a 2a 2a 0a 2a 2a  75800", 1).**.**
4660: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 2d 38 2e   will return -8.
4670: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
4680: 6f 6d 70 61 72 65 32 70 6f 77 36 33 28 63 6f 6e  ompare2pow63(con
4690: 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69  st char *zNum, i
46a0: 6e 74 20 69 6e 63 72 29 7b 0a 20 20 69 6e 74 20  nt incr){.  int 
46b0: 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  c = 0;.  int i;.
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 20 2f 2a 20 30 31 32 33 34 35 36 37 38      /* 012345678
46e0: 39 30 31 32 33 34 35 36 37 20 2a 2f 0a 20 20 63  901234567 */.  c
46f0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 6f 77 36 33  onst char *pow63
4700: 20 3d 20 22 39 32 32 33 33 37 32 30 33 36 38 35   = "922337203685
4710: 34 37 37 35 38 30 22 3b 0a 20 20 66 6f 72 28 69  477580";.  for(i
4720: 3d 30 3b 20 63 3d 3d 30 20 26 26 20 69 3c 31 38  =0; c==0 && i<18
4730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 20 3d 20  ; i++){.    c = 
4740: 28 7a 4e 75 6d 5b 69 2a 69 6e 63 72 5d 2d 70 6f  (zNum[i*incr]-po
4750: 77 36 33 5b 69 5d 29 2a 31 30 3b 0a 20 20 7d 0a  w63[i])*10;.  }.
4760: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
4770: 20 20 63 20 3d 20 7a 4e 75 6d 5b 31 38 2a 69 6e    c = zNum[18*in
4780: 63 72 5d 20 2d 20 27 38 27 3b 0a 20 20 20 20 74  cr] - '8';.    t
4790: 65 73 74 63 61 73 65 28 20 63 3d 3d 28 2d 31 29  estcase( c==(-1)
47a0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
47b0: 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  ( c==0 );.    te
47c0: 73 74 63 61 73 65 28 20 63 3d 3d 28 2b 31 29 20  stcase( c==(+1) 
47d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
47e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  c;.}../*.** Conv
47f0: 65 72 74 20 7a 4e 75 6d 20 74 6f 20 61 20 36 34  ert zNum to a 64
4800: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
4810: 67 65 72 2e 20 20 7a 4e 75 6d 20 6d 75 73 74 20  ger.  zNum must 
4820: 62 65 20 64 65 63 69 6d 61 6c 2e 20 54 68 69 73  be decimal. This
4830: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  .** routine does
4840: 20 2a 6e 6f 74 2a 20 61 63 63 65 70 74 20 68 65   *not* accept he
4850: 78 61 64 65 63 69 6d 61 6c 20 6e 6f 74 61 74 69  xadecimal notati
4860: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  on..**.** Return
4870: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 20 20  s:.**.**     0  
4880: 20 20 53 75 63 63 65 73 73 66 75 6c 20 74 72 61    Successful tra
4890: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 46 69  nsformation.  Fi
48a0: 74 73 20 69 6e 20 61 20 36 34 2d 62 69 74 20 73  ts in a 64-bit s
48b0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
48c0: 2a 20 20 20 20 20 31 20 20 20 20 45 78 63 65 73  *     1    Exces
48d0: 73 20 6e 6f 6e 2d 73 70 61 63 65 20 74 65 78 74  s non-space text
48e0: 20 61 66 74 65 72 20 74 68 65 20 69 6e 74 65 67   after the integ
48f0: 65 72 20 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20  er value.**     
4900: 32 20 20 20 20 49 6e 74 65 67 65 72 20 74 6f 6f  2    Integer too
4910: 20 6c 61 72 67 65 20 66 6f 72 20 61 20 36 34 2d   large for a 64-
4920: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
4930: 65 72 20 6f 72 20 69 73 20 6d 61 6c 66 6f 72 6d  er or is malform
4940: 65 64 0a 2a 2a 20 20 20 20 20 33 20 20 20 20 53  ed.**     3    S
4950: 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 39  pecial case of 9
4960: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
4970: 30 38 0a 2a 2a 0a 2a 2a 20 6c 65 6e 67 74 68 20  08.**.** length 
4980: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
4990: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 73 74   bytes in the st
49a0: 72 69 6e 67 20 28 62 79 74 65 73 2c 20 6e 6f 74  ring (bytes, not
49b0: 20 63 68 61 72 61 63 74 65 72 73 29 2e 0a 2a 2a   characters)..**
49c0: 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e   The string is n
49d0: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 7a  ot necessarily z
49e0: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
49f0: 20 54 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73   The encoding is
4a00: 0a 2a 2a 20 67 69 76 65 6e 20 62 79 20 65 6e 63  .** given by enc
4a10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4a20: 41 74 6f 69 36 34 28 63 6f 6e 73 74 20 63 68 61  Atoi64(const cha
4a30: 72 20 2a 7a 4e 75 6d 2c 20 69 36 34 20 2a 70 4e  r *zNum, i64 *pN
4a40: 75 6d 2c 20 69 6e 74 20 6c 65 6e 67 74 68 2c 20  um, int length, 
4a50: 75 38 20 65 6e 63 29 7b 0a 20 20 69 6e 74 20 69  u8 enc){.  int i
4a60: 6e 63 72 3b 0a 20 20 75 36 34 20 75 20 3d 20 30  ncr;.  u64 u = 0
4a70: 3b 0a 20 20 69 6e 74 20 6e 65 67 20 3d 20 30 3b  ;.  int neg = 0;
4a80: 20 2f 2a 20 61 73 73 75 6d 65 20 70 6f 73 69 74   /* assume posit
4a90: 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ive */.  int i;.
4aa0: 20 20 69 6e 74 20 63 20 3d 20 30 3b 0a 20 20 69    int c = 0;.  i
4ab0: 6e 74 20 6e 6f 6e 4e 75 6d 20 3d 20 30 3b 20 20  nt nonNum = 0;  
4ac0: 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 70 75 74  /* True if input
4ad0: 20 63 6f 6e 74 61 69 6e 73 20 55 54 46 31 36 20   contains UTF16 
4ae0: 77 69 74 68 20 68 69 67 68 20 62 79 74 65 20 6e  with high byte n
4af0: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  on-zero */.  int
4b00: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   rc;          /*
4b10: 20 42 61 73 65 6c 69 6e 65 20 72 65 74 75 72 6e   Baseline return
4b20: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   code */.  const
4b30: 20 63 68 61 72 20 2a 7a 53 74 61 72 74 3b 0a 20   char *zStart;. 
4b40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
4b50: 64 20 3d 20 7a 4e 75 6d 20 2b 20 6c 65 6e 67 74  d = zNum + lengt
4b60: 68 3b 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63  h;.  assert( enc
4b70: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
4b80: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
4b90: 31 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c  16LE || enc==SQL
4ba0: 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20  ITE_UTF16BE );. 
4bb0: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
4bc0: 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 69 6e 63  _UTF8 ){.    inc
4bd0: 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r = 1;.  }else{.
4be0: 20 20 20 20 69 6e 63 72 20 3d 20 32 3b 0a 20 20      incr = 2;.  
4bf0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
4c00: 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26 26 20 53  _UTF16LE==2 && S
4c10: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d 33  QLITE_UTF16BE==3
4c20: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d   );.    for(i=3-
4c30: 65 6e 63 3b 20 69 3c 6c 65 6e 67 74 68 20 26 26  enc; i<length &&
4c40: 20 7a 4e 75 6d 5b 69 5d 3d 3d 30 3b 20 69 2b 3d   zNum[i]==0; i+=
4c50: 32 29 7b 7d 0a 20 20 20 20 6e 6f 6e 4e 75 6d 20  2){}.    nonNum 
4c60: 3d 20 69 3c 6c 65 6e 67 74 68 3b 0a 20 20 20 20  = i<length;.    
4c70: 7a 45 6e 64 20 3d 20 26 7a 4e 75 6d 5b 69 5e 31  zEnd = &zNum[i^1
4c80: 5d 3b 0a 20 20 20 20 7a 4e 75 6d 20 2b 3d 20 28  ];.    zNum += (
4c90: 65 6e 63 26 31 29 3b 0a 20 20 7d 0a 20 20 77 68  enc&1);.  }.  wh
4ca0: 69 6c 65 28 20 7a 4e 75 6d 3c 7a 45 6e 64 20 26  ile( zNum<zEnd &
4cb0: 26 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  & sqlite3Isspace
4cc0: 28 2a 7a 4e 75 6d 29 20 29 20 7a 4e 75 6d 2b 3d  (*zNum) ) zNum+=
4cd0: 69 6e 63 72 3b 0a 20 20 69 66 28 20 7a 4e 75 6d  incr;.  if( zNum
4ce0: 3c 7a 45 6e 64 20 29 7b 0a 20 20 20 20 69 66 28  <zEnd ){.    if(
4cf0: 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 29 7b 0a 20   *zNum=='-' ){. 
4d00: 20 20 20 20 20 6e 65 67 20 3d 20 31 3b 0a 20 20       neg = 1;.  
4d10: 20 20 20 20 7a 4e 75 6d 2b 3d 69 6e 63 72 3b 0a      zNum+=incr;.
4d20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a      }else if( *z
4d30: 4e 75 6d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20  Num=='+' ){.    
4d40: 20 20 7a 4e 75 6d 2b 3d 69 6e 63 72 3b 0a 20 20    zNum+=incr;.  
4d50: 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 74 61 72 74    }.  }.  zStart
4d60: 20 3d 20 7a 4e 75 6d 3b 0a 20 20 77 68 69 6c 65   = zNum;.  while
4d70: 28 20 7a 4e 75 6d 3c 7a 45 6e 64 20 26 26 20 7a  ( zNum<zEnd && z
4d80: 4e 75 6d 5b 30 5d 3d 3d 27 30 27 20 29 7b 20 7a  Num[0]=='0' ){ z
4d90: 4e 75 6d 2b 3d 69 6e 63 72 3b 20 7d 20 2f 2a 20  Num+=incr; } /* 
4da0: 53 6b 69 70 20 6c 65 61 64 69 6e 67 20 7a 65 72  Skip leading zer
4db0: 6f 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  os. */.  for(i=0
4dc0: 3b 20 26 7a 4e 75 6d 5b 69 5d 3c 7a 45 6e 64 20  ; &zNum[i]<zEnd 
4dd0: 26 26 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d  && (c=zNum[i])>=
4de0: 27 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69  '0' && c<='9'; i
4df0: 2b 3d 69 6e 63 72 29 7b 0a 20 20 20 20 75 20 3d  +=incr){.    u =
4e00: 20 75 2a 31 30 20 2b 20 63 20 2d 20 27 30 27 3b   u*10 + c - '0';
4e10: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
4e20: 20 69 3d 3d 31 38 2a 69 6e 63 72 20 29 3b 0a 20   i==18*incr );. 
4e30: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 39   testcase( i==19
4e40: 2a 69 6e 63 72 20 29 3b 0a 20 20 74 65 73 74 63  *incr );.  testc
4e50: 61 73 65 28 20 69 3d 3d 32 30 2a 69 6e 63 72 20  ase( i==20*incr 
4e60: 29 3b 0a 20 20 69 66 28 20 75 3e 4c 41 52 47 45  );.  if( u>LARGE
4e70: 53 54 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20 20  ST_INT64 ){.    
4e80: 2f 2a 20 54 68 69 73 20 74 65 73 74 20 61 6e 64  /* This test and
4e90: 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 73 20 6e   assignment is n
4ea0: 65 65 64 65 64 20 6f 6e 6c 79 20 74 6f 20 73 75  eeded only to su
4eb0: 70 70 72 65 73 73 20 55 42 20 77 61 72 6e 69 6e  ppress UB warnin
4ec0: 67 73 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 63  gs.    ** from c
4ed0: 6c 61 6e 67 20 61 6e 64 20 2d 66 73 61 6e 69 74  lang and -fsanit
4ee0: 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64 2e 20 20  ize=undefined.  
4ef0: 54 68 69 73 20 74 65 73 74 20 61 6e 64 20 61 73  This test and as
4f00: 73 69 67 6e 6d 65 6e 74 20 6d 61 6b 65 0a 20 20  signment make.  
4f10: 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 20    ** the code a 
4f20: 6c 69 74 74 6c 65 20 6c 61 72 67 65 72 20 61 6e  little larger an
4f30: 64 20 73 6c 6f 77 65 72 2c 20 61 6e 64 20 6e 6f  d slower, and no
4f40: 20 68 61 72 6d 20 63 6f 6d 65 73 20 66 72 6f 6d   harm comes from
4f50: 20 6f 6d 69 74 74 69 6e 67 0a 20 20 20 20 2a 2a   omitting.    **
4f60: 20 74 68 65 6d 2c 20 62 75 74 20 77 65 20 6d 75   them, but we mu
4f70: 73 74 20 61 70 70 61 69 73 65 20 74 68 65 20 75  st appaise the u
4f80: 6e 64 65 66 69 6e 65 64 2d 62 65 68 61 76 69 6f  ndefined-behavio
4f90: 72 20 70 68 61 72 69 73 65 65 73 2e 20 2a 2f 0a  r pharisees. */.
4fa0: 20 20 20 20 2a 70 4e 75 6d 20 3d 20 6e 65 67 20      *pNum = neg 
4fb0: 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
4fc0: 20 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   : LARGEST_INT64
4fd0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 65  ;.  }else if( ne
4fe0: 67 20 29 7b 0a 20 20 20 20 2a 70 4e 75 6d 20 3d  g ){.    *pNum =
4ff0: 20 2d 28 69 36 34 29 75 3b 0a 20 20 7d 65 6c 73   -(i64)u;.  }els
5000: 65 7b 0a 20 20 20 20 2a 70 4e 75 6d 20 3d 20 28  e{.    *pNum = (
5010: 69 36 34 29 75 3b 0a 20 20 7d 0a 20 20 72 63 20  i64)u;.  }.  rc 
5020: 3d 20 30 3b 0a 20 20 69 66 28 20 28 69 3d 3d 30  = 0;.  if( (i==0
5030: 20 26 26 20 7a 53 74 61 72 74 3d 3d 7a 4e 75 6d   && zStart==zNum
5040: 29 20 20 20 20 20 2f 2a 20 4e 6f 20 64 69 67 69  )     /* No digi
5050: 74 73 20 2a 2f 0a 20 20 20 7c 7c 20 6e 6f 6e 4e  ts */.   || nonN
5060: 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  um              
5070: 20 20 20 20 20 20 20 2f 2a 20 55 54 46 31 36 20         /* UTF16 
5080: 77 69 74 68 20 68 69 67 68 2d 6f 72 64 65 72 20  with high-order 
5090: 62 79 74 65 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a  bytes non-zero *
50a0: 2f 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  /.  ){.    rc = 
50b0: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 26  1;.  }else if( &
50c0: 7a 4e 75 6d 5b 69 5d 3c 7a 45 6e 64 20 29 7b 20  zNum[i]<zEnd ){ 
50d0: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
50e0: 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 2a 2f  es at the end */
50f0: 0a 20 20 20 20 69 6e 74 20 6a 6a 20 3d 20 69 3b  .    int jj = i;
5100: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
5110: 66 28 20 21 73 71 6c 69 74 65 33 49 73 73 70 61  f( !sqlite3Isspa
5120: 63 65 28 7a 4e 75 6d 5b 6a 6a 5d 29 20 29 7b 0a  ce(zNum[jj]) ){.
5130: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 20          rc = 1; 
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
5150: 61 20 6e 6f 6e 2d 73 70 61 63 65 20 74 65 78 74  a non-space text
5160: 20 61 66 74 65 72 20 74 68 65 20 69 6e 74 65 67   after the integ
5170: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  er */.        br
5180: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5190: 20 20 20 6a 6a 20 2b 3d 20 69 6e 63 72 3b 0a 20     jj += incr;. 
51a0: 20 20 20 7d 77 68 69 6c 65 28 20 26 7a 4e 75 6d     }while( &zNum
51b0: 5b 6a 6a 5d 3c 7a 45 6e 64 20 29 3b 0a 20 20 7d  [jj]<zEnd );.  }
51c0: 0a 20 20 69 66 28 20 69 3c 31 39 2a 69 6e 63 72  .  if( i<19*incr
51d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 73 73 20   ){.    /* Less 
51e0: 74 68 61 6e 20 31 39 20 64 69 67 69 74 73 2c 20  than 19 digits, 
51f0: 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
5200: 69 74 20 66 69 74 73 20 69 6e 20 36 34 20 62 69  it fits in 64 bi
5210: 74 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ts */.    assert
5220: 28 20 75 3c 3d 4c 41 52 47 45 53 54 5f 49 4e 54  ( u<=LARGEST_INT
5230: 36 34 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  64 );.    return
5240: 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
5250: 20 20 2f 2a 20 7a 4e 75 6d 20 69 73 20 61 20 31    /* zNum is a 1
5260: 39 2d 64 69 67 69 74 20 6e 75 6d 62 65 72 73 2e  9-digit numbers.
5270: 20 20 43 6f 6d 70 61 72 65 20 69 74 20 61 67 61    Compare it aga
5280: 69 6e 73 74 20 39 32 32 33 33 37 32 30 33 36 38  inst 92233720368
5290: 35 34 37 37 35 38 30 38 2e 20 2a 2f 0a 20 20 20  54775808. */.   
52a0: 20 63 20 3d 20 69 3e 31 39 2a 69 6e 63 72 20 3f   c = i>19*incr ?
52b0: 20 31 20 3a 20 63 6f 6d 70 61 72 65 32 70 6f 77   1 : compare2pow
52c0: 36 33 28 7a 4e 75 6d 2c 20 69 6e 63 72 29 3b 0a  63(zNum, incr);.
52d0: 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
52e0: 20 20 20 20 20 2f 2a 20 7a 4e 75 6d 20 69 73 20       /* zNum is 
52f0: 6c 65 73 73 20 74 68 61 6e 20 39 32 32 33 33 37  less than 922337
5300: 32 30 33 36 38 35 34 37 37 35 38 30 38 20 73 6f  2036854775808 so
5310: 20 69 74 20 66 69 74 73 20 2a 2f 0a 20 20 20 20   it fits */.    
5320: 20 20 61 73 73 65 72 74 28 20 75 3c 3d 4c 41 52    assert( u<=LAR
5330: 47 45 53 54 5f 49 4e 54 36 34 20 29 3b 0a 20 20  GEST_INT64 );.  
5340: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5360: 2a 70 4e 75 6d 20 3d 20 6e 65 67 20 3f 20 53 4d  *pNum = neg ? SM
5370: 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c  ALLEST_INT64 : L
5380: 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
5390: 20 20 20 20 69 66 28 20 63 3e 30 20 29 7b 0a 20      if( c>0 ){. 
53a0: 20 20 20 20 20 20 20 2f 2a 20 7a 4e 75 6d 20 69         /* zNum i
53b0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 39  s greater than 9
53c0: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
53d0: 30 38 20 73 6f 20 69 74 20 6f 76 65 72 66 6c 6f  08 so it overflo
53e0: 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ws */.        re
53f0: 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 65  turn 2;.      }e
5400: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
5410: 7a 4e 75 6d 20 69 73 20 65 78 61 63 74 6c 79 20  zNum is exactly 
5420: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
5430: 38 30 38 2e 20 20 46 69 74 73 20 69 66 20 6e 65  808.  Fits if ne
5440: 67 61 74 69 76 65 2e 20 20 54 68 65 0a 20 20 20  gative.  The.   
5450: 20 20 20 20 20 2a 2a 20 73 70 65 63 69 61 6c 20       ** special 
5460: 63 61 73 65 20 32 20 6f 76 65 72 66 6c 6f 77 20  case 2 overflow 
5470: 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
5480: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75         assert( u
5490: 2d 31 3d 3d 4c 41 52 47 45 53 54 5f 49 4e 54 36  -1==LARGEST_INT6
54a0: 34 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  4 );.        ret
54b0: 75 72 6e 20 6e 65 67 20 3f 20 72 63 20 3a 20 33  urn neg ? rc : 3
54c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
54d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61    }.}../*.** Tra
54e0: 6e 73 66 6f 72 6d 20 61 20 55 54 46 2d 38 20 69  nsform a UTF-8 i
54f0: 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 2c 20  nteger literal, 
5500: 69 6e 20 65 69 74 68 65 72 20 64 65 63 69 6d 61  in either decima
5510: 6c 20 6f 72 20 68 65 78 61 64 65 63 69 6d 61 6c  l or hexadecimal
5520: 2c 0a 2a 2a 20 69 6e 74 6f 20 61 20 36 34 2d 62  ,.** into a 64-b
5530: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
5540: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
5550: 20 61 63 63 65 70 74 73 20 68 65 78 61 64 65 63   accepts hexadec
5560: 69 6d 61 6c 20 6c 69 74 65 72 61 6c 73 2c 0a 2a  imal literals,.*
5570: 2a 20 77 68 65 72 65 61 73 20 73 71 6c 69 74 65  * whereas sqlite
5580: 33 41 74 6f 69 36 34 28 29 20 64 6f 65 73 20 6e  3Atoi64() does n
5590: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ot..**.** Return
55a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 20 20  s:.**.**     0  
55b0: 20 20 53 75 63 63 65 73 73 66 75 6c 20 74 72 61    Successful tra
55c0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 46 69  nsformation.  Fi
55d0: 74 73 20 69 6e 20 61 20 36 34 2d 62 69 74 20 73  ts in a 64-bit s
55e0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
55f0: 2a 20 20 20 20 20 31 20 20 20 20 45 78 63 65 73  *     1    Exces
5600: 73 20 74 65 78 74 20 61 66 74 65 72 20 74 68 65  s text after the
5610: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a   integer value.*
5620: 2a 20 20 20 20 20 32 20 20 20 20 49 6e 74 65 67  *     2    Integ
5630: 65 72 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72  er too large for
5640: 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64   a 64-bit signed
5650: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 73 20 6d   integer or is m
5660: 61 6c 66 6f 72 6d 65 64 0a 2a 2a 20 20 20 20 20  alformed.**     
5670: 33 20 20 20 20 53 70 65 63 69 61 6c 20 63 61 73  3    Special cas
5680: 65 20 6f 66 20 39 32 32 33 33 37 32 30 33 36 38  e of 92233720368
5690: 35 34 37 37 35 38 30 38 0a 2a 2f 0a 69 6e 74 20  54775808.*/.int 
56a0: 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
56b0: 6f 49 36 34 28 63 6f 6e 73 74 20 63 68 61 72 20  oI64(const char 
56c0: 2a 7a 2c 20 69 36 34 20 2a 70 4f 75 74 29 7b 0a  *z, i64 *pOut){.
56d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
56e0: 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a  MIT_HEX_INTEGER.
56f0: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30 27 0a    if( z[0]=='0'.
5700: 20 20 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 78 27     && (z[1]=='x'
5710: 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 58 27 29 0a 20   || z[1]=='X'). 
5720: 20 29 7b 0a 20 20 20 20 75 36 34 20 75 20 3d 20   ){.    u64 u = 
5730: 30 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b  0;.    int i, k;
5740: 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 7a 5b  .    for(i=2; z[
5750: 69 5d 3d 3d 27 30 27 3b 20 69 2b 2b 29 7b 7d 0a  i]=='0'; i++){}.
5760: 20 20 20 20 66 6f 72 28 6b 3d 69 3b 20 73 71 6c      for(k=i; sql
5770: 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 5b 6b  ite3Isxdigit(z[k
5780: 5d 29 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); k++){.      
5790: 75 20 3d 20 75 2a 31 36 20 2b 20 73 71 6c 69 74  u = u*16 + sqlit
57a0: 65 33 48 65 78 54 6f 49 6e 74 28 7a 5b 6b 5d 29  e3HexToInt(z[k])
57b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
57c0: 70 79 28 70 4f 75 74 2c 20 26 75 2c 20 38 29 3b  py(pOut, &u, 8);
57d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 7a 5b 6b  .    return (z[k
57e0: 5d 3d 3d 30 20 26 26 20 6b 2d 69 3c 3d 31 36 29  ]==0 && k-i<=16)
57f0: 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 65 6c 73   ? 0 : 2;.  }els
5800: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
5810: 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45  TE_OMIT_HEX_INTE
5820: 47 45 52 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 72  GER */.  {.    r
5830: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 74 6f  eturn sqlite3Ato
5840: 69 36 34 28 7a 2c 20 70 4f 75 74 2c 20 73 71 6c  i64(z, pOut, sql
5850: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
5860: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
5870: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 7a   }.}../*.** If z
5880: 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20 61  Num represents a
5890: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 77  n integer that w
58a0: 69 6c 6c 20 66 69 74 20 69 6e 20 33 32 2d 62 69  ill fit in 32-bi
58b0: 74 73 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20  ts, then set.** 
58c0: 2a 70 56 61 6c 75 65 20 74 6f 20 74 68 61 74 20  *pValue to that 
58d0: 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74 75  integer and retu
58e0: 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65 72 77  rn true.  Otherw
58f0: 69 73 65 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ise return false
5900: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5910: 74 69 6e 65 20 61 63 63 65 70 74 73 20 62 6f 74  tine accepts bot
5920: 68 20 64 65 63 69 6d 61 6c 20 61 6e 64 20 68 65  h decimal and he
5930: 78 61 64 65 63 69 6d 61 6c 20 6e 6f 74 61 74 69  xadecimal notati
5940: 6f 6e 20 66 6f 72 20 69 6e 74 65 67 65 72 73 2e  on for integers.
5950: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 6e 6f 6e 2d 6e  .**.** Any non-n
5960: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
5970: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 69 6e 67  s that following
5980: 20 7a 4e 75 6d 20 61 72 65 20 69 67 6e 6f 72 65   zNum are ignore
5990: 64 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 64 69  d..** This is di
59a0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 73 71 6c  fferent from sql
59b0: 69 74 65 33 41 74 6f 69 36 34 28 29 20 77 68 69  ite3Atoi64() whi
59c0: 63 68 20 72 65 71 75 69 72 65 73 20 74 68 65 0a  ch requires the.
59d0: 2a 2a 20 69 6e 70 75 74 20 6e 75 6d 62 65 72 20  ** input number 
59e0: 74 6f 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  to be zero-termi
59f0: 6e 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nated..*/.int sq
5a00: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 63 6f  lite3GetInt32(co
5a10: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d 2c 20  nst char *zNum, 
5a20: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
5a30: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
5a40: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a   0;.  int i, c;.
5a50: 20 20 69 6e 74 20 6e 65 67 20 3d 20 30 3b 0a 20    int neg = 0;. 
5a60: 20 69 66 28 20 7a 4e 75 6d 5b 30 5d 3d 3d 27 2d   if( zNum[0]=='-
5a70: 27 20 29 7b 0a 20 20 20 20 6e 65 67 20 3d 20 31  ' ){.    neg = 1
5a80: 3b 0a 20 20 20 20 7a 4e 75 6d 2b 2b 3b 0a 20 20  ;.    zNum++;.  
5a90: 7d 65 6c 73 65 20 69 66 28 20 7a 4e 75 6d 5b 30  }else if( zNum[0
5aa0: 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 4e  ]=='+' ){.    zN
5ab0: 75 6d 2b 2b 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  um++;.  }.#ifnde
5ac0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45  f SQLITE_OMIT_HE
5ad0: 58 5f 49 4e 54 45 47 45 52 0a 20 20 65 6c 73 65  X_INTEGER.  else
5ae0: 20 69 66 28 20 7a 4e 75 6d 5b 30 5d 3d 3d 27 30   if( zNum[0]=='0
5af0: 27 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a 4e  '.        && (zN
5b00: 75 6d 5b 31 5d 3d 3d 27 78 27 20 7c 7c 20 7a 4e  um[1]=='x' || zN
5b10: 75 6d 5b 31 5d 3d 3d 27 58 27 29 0a 20 20 20 20  um[1]=='X').    
5b20: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
5b30: 78 64 69 67 69 74 28 7a 4e 75 6d 5b 32 5d 29 0a  xdigit(zNum[2]).
5b40: 20 20 29 7b 0a 20 20 20 20 75 33 32 20 75 20 3d    ){.    u32 u =
5b50: 20 30 3b 0a 20 20 20 20 7a 4e 75 6d 20 2b 3d 20   0;.    zNum += 
5b60: 32 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4e  2;.    while( zN
5b70: 75 6d 5b 30 5d 3d 3d 27 30 27 20 29 20 7a 4e 75  um[0]=='0' ) zNu
5b80: 6d 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  m++;.    for(i=0
5b90: 3b 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69  ; sqlite3Isxdigi
5ba0: 74 28 7a 4e 75 6d 5b 69 5d 29 20 26 26 20 69 3c  t(zNum[i]) && i<
5bb0: 38 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  8; i++){.      u
5bc0: 20 3d 20 75 2a 31 36 20 2b 20 73 71 6c 69 74 65   = u*16 + sqlite
5bd0: 33 48 65 78 54 6f 49 6e 74 28 7a 4e 75 6d 5b 69  3HexToInt(zNum[i
5be0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ]);.    }.    if
5bf0: 28 20 28 75 26 30 78 38 30 30 30 30 30 30 30 29  ( (u&0x80000000)
5c00: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  ==0 && sqlite3Is
5c10: 78 64 69 67 69 74 28 7a 4e 75 6d 5b 69 5d 29 3d  xdigit(zNum[i])=
5c20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 ){.      memc
5c30: 70 79 28 70 56 61 6c 75 65 2c 20 26 75 2c 20 34  py(pValue, &u, 4
5c40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5c50: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
5c60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5c70: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
5c80: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 64   if( !sqlite3Isd
5c90: 69 67 69 74 28 7a 4e 75 6d 5b 30 5d 29 20 29 20  igit(zNum[0]) ) 
5ca0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
5cb0: 65 28 20 7a 4e 75 6d 5b 30 5d 3d 3d 27 30 27 20  e( zNum[0]=='0' 
5cc0: 29 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 66 6f 72 28  ) zNum++;.  for(
5cd0: 69 3d 30 3b 20 69 3c 31 31 20 26 26 20 28 63 20  i=0; i<11 && (c 
5ce0: 3d 20 7a 4e 75 6d 5b 69 5d 20 2d 20 27 30 27 29  = zNum[i] - '0')
5cf0: 3e 3d 30 20 26 26 20 63 3c 3d 39 3b 20 69 2b 2b  >=0 && c<=9; i++
5d00: 29 7b 0a 20 20 20 20 76 20 3d 20 76 2a 31 30 20  ){.    v = v*10 
5d10: 2b 20 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  + c;.  }..  /* T
5d20: 68 65 20 6c 6f 6e 67 65 73 74 20 64 65 63 69 6d  he longest decim
5d30: 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
5d40: 6e 20 6f 66 20 61 20 33 32 20 62 69 74 20 69 6e  n of a 32 bit in
5d50: 74 65 67 65 72 20 69 73 20 31 30 20 64 69 67 69  teger is 10 digi
5d60: 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ts:.  **.  **   
5d70: 20 20 20 20 20 20 20 20 20 20 31 32 33 34 35 36            123456
5d80: 37 38 39 30 0a 20 20 2a 2a 20 20 20 20 20 32 5e  7890.  **     2^
5d90: 33 31 20 2d 3e 20 32 31 34 37 34 38 33 36 34 38  31 -> 2147483648
5da0: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
5db0: 28 20 69 3d 3d 31 30 20 29 3b 0a 20 20 69 66 28  ( i==10 );.  if(
5dc0: 20 69 3e 31 30 20 29 7b 0a 20 20 20 20 72 65 74   i>10 ){.    ret
5dd0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 74 65 73  urn 0;.  }.  tes
5de0: 74 63 61 73 65 28 20 76 2d 6e 65 67 3d 3d 32 31  tcase( v-neg==21
5df0: 34 37 34 38 33 36 34 37 20 29 3b 0a 20 20 69 66  47483647 );.  if
5e00: 28 20 76 2d 6e 65 67 3e 32 31 34 37 34 38 33 36  ( v-neg>21474836
5e10: 34 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  47 ){.    return
5e20: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65   0;.  }.  if( ne
5e30: 67 20 29 7b 0a 20 20 20 20 76 20 3d 20 2d 76 3b  g ){.    v = -v;
5e40: 0a 20 20 7d 0a 20 20 2a 70 56 61 6c 75 65 20 3d  .  }.  *pValue =
5e50: 20 28 69 6e 74 29 76 3b 0a 20 20 72 65 74 75 72   (int)v;.  retur
5e60: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 1;.}../*.** Re
5e70: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  turn a 32-bit in
5e80: 74 65 67 65 72 20 76 61 6c 75 65 20 65 78 74 72  teger value extr
5e90: 61 63 74 65 64 20 66 72 6f 6d 20 61 20 73 74 72  acted from a str
5ea0: 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ing.  If the.** 
5eb0: 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 61 6e  string is not an
5ec0: 20 69 6e 74 65 67 65 72 2c 20 6a 75 73 74 20 72   integer, just r
5ed0: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 69 6e 74 20  eturn 0..*/.int 
5ee0: 73 71 6c 69 74 65 33 41 74 6f 69 28 63 6f 6e 73  sqlite3Atoi(cons
5ef0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
5f00: 74 20 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  t x = 0;.  if( z
5f10: 20 29 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74   ) sqlite3GetInt
5f20: 33 32 28 7a 2c 20 26 78 29 3b 0a 20 20 72 65 74  32(z, &x);.  ret
5f30: 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn x;.}../*.** 
5f40: 54 68 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e  The variable-len
5f50: 67 74 68 20 69 6e 74 65 67 65 72 20 65 6e 63 6f  gth integer enco
5f60: 64 69 6e 67 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ding is as follo
5f70: 77 73 3a 0a 2a 2a 0a 2a 2a 20 4b 45 59 3a 0a 2a  ws:.**.** KEY:.*
5f80: 2a 20 20 20 20 20 20 20 20 20 41 20 3d 20 30 78  *         A = 0x
5f90: 78 78 78 78 78 78 20 20 20 20 37 20 62 69 74 73  xxxxxx    7 bits
5fa0: 20 6f 66 20 64 61 74 61 20 61 6e 64 20 6f 6e 65   of data and one
5fb0: 20 66 6c 61 67 20 62 69 74 0a 2a 2a 20 20 20 20   flag bit.**    
5fc0: 20 20 20 20 20 42 20 3d 20 31 78 78 78 78 78 78       B = 1xxxxxx
5fd0: 78 20 20 20 20 37 20 62 69 74 73 20 6f 66 20 64  x    7 bits of d
5fe0: 61 74 61 20 61 6e 64 20 6f 6e 65 20 66 6c 61 67  ata and one flag
5ff0: 20 62 69 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   bit.**         
6000: 43 20 3d 20 78 78 78 78 78 78 78 78 20 20 20 20  C = xxxxxxxx    
6010: 38 20 62 69 74 73 20 6f 66 20 64 61 74 61 0a 2a  8 bits of data.*
6020: 2a 0a 2a 2a 20 20 37 20 62 69 74 73 20 2d 20 41  *.**  7 bits - A
6030: 0a 2a 2a 20 31 34 20 62 69 74 73 20 2d 20 42 41  .** 14 bits - BA
6040: 0a 2a 2a 20 32 31 20 62 69 74 73 20 2d 20 42 42  .** 21 bits - BB
6050: 41 0a 2a 2a 20 32 38 20 62 69 74 73 20 2d 20 42  A.** 28 bits - B
6060: 42 42 41 0a 2a 2a 20 33 35 20 62 69 74 73 20 2d  BBA.** 35 bits -
6070: 20 42 42 42 42 41 0a 2a 2a 20 34 32 20 62 69 74   BBBBA.** 42 bit
6080: 73 20 2d 20 42 42 42 42 42 41 0a 2a 2a 20 34 39  s - BBBBBA.** 49
6090: 20 62 69 74 73 20 2d 20 42 42 42 42 42 42 41 0a   bits - BBBBBBA.
60a0: 2a 2a 20 35 36 20 62 69 74 73 20 2d 20 42 42 42  ** 56 bits - BBB
60b0: 42 42 42 42 41 0a 2a 2a 20 36 34 20 62 69 74 73  BBBBA.** 64 bits
60c0: 20 2d 20 42 42 42 42 42 42 42 42 43 0a 2a 2f 0a   - BBBBBBBBC.*/.
60d0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 36  ./*.** Write a 6
60e0: 34 2d 62 69 74 20 76 61 72 69 61 62 6c 65 2d 6c  4-bit variable-l
60f0: 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 74 6f  ength integer to
6100: 20 6d 65 6d 6f 72 79 20 73 74 61 72 74 69 6e 67   memory starting
6110: 20 61 74 20 70 5b 30 5d 2e 0a 2a 2a 20 54 68 65   at p[0]..** The
6120: 20 6c 65 6e 67 74 68 20 6f 66 20 64 61 74 61 20   length of data 
6130: 77 72 69 74 65 20 77 69 6c 6c 20 62 65 20 62 65  write will be be
6140: 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20 62 79  tween 1 and 9 by
6150: 74 65 73 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  tes.  The number
6160: 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 77 72 69  .** of bytes wri
6170: 74 74 65 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tten is returned
6180: 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 61 72 69 61 62  ..**.** A variab
6190: 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le-length intege
61a0: 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  r consists of th
61b0: 65 20 6c 6f 77 65 72 20 37 20 62 69 74 73 20 6f  e lower 7 bits o
61c0: 66 20 65 61 63 68 20 62 79 74 65 0a 2a 2a 20 66  f each byte.** f
61d0: 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 74 68 61  or all bytes tha
61e0: 74 20 68 61 76 65 20 74 68 65 20 38 74 68 20 62  t have the 8th b
61f0: 69 74 20 73 65 74 20 61 6e 64 20 6f 6e 65 20 62  it set and one b
6200: 79 74 65 20 77 69 74 68 20 74 68 65 20 38 74 68  yte with the 8th
6210: 0a 2a 2a 20 62 69 74 20 63 6c 65 61 72 2e 20 20  .** bit clear.  
6220: 45 78 63 65 70 74 2c 20 69 66 20 77 65 20 67 65  Except, if we ge
6230: 74 20 74 6f 20 74 68 65 20 39 74 68 20 62 79 74  t to the 9th byt
6240: 65 2c 20 69 74 20 73 74 6f 72 65 73 20 74 68 65  e, it stores the
6250: 20 66 75 6c 6c 0a 2a 2a 20 38 20 62 69 74 73 20   full.** 8 bits 
6260: 61 6e 64 20 69 73 20 74 68 65 20 6c 61 73 74 20  and is the last 
6270: 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
6280: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
6290: 49 4e 45 20 70 75 74 56 61 72 69 6e 74 36 34 28  INE putVarint64(
62a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
62b0: 2c 20 75 36 34 20 76 29 7b 0a 20 20 69 6e 74 20  , u64 v){.  int 
62c0: 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 62 75  i, j, n;.  u8 bu
62d0: 66 5b 31 30 5d 3b 0a 20 20 69 66 28 20 76 20 26  f[10];.  if( v &
62e0: 20 28 28 28 75 36 34 29 30 78 66 66 30 30 30 30   (((u64)0xff0000
62f0: 30 30 29 3c 3c 33 32 29 20 29 7b 0a 20 20 20 20  00)<<32) ){.    
6300: 70 5b 38 5d 20 3d 20 28 75 38 29 76 3b 0a 20 20  p[8] = (u8)v;.  
6310: 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 66    v >>= 8;.    f
6320: 6f 72 28 69 3d 37 3b 20 69 3e 3d 30 3b 20 69 2d  or(i=7; i>=0; i-
6330: 2d 29 7b 0a 20 20 20 20 20 20 70 5b 69 5d 20 3d  -){.      p[i] =
6340: 20 28 75 38 29 28 28 76 20 26 20 30 78 37 66 29   (u8)((v & 0x7f)
6350: 20 7c 20 30 78 38 30 29 3b 0a 20 20 20 20 20 20   | 0x80);.      
6360: 76 20 3e 3e 3d 20 37 3b 0a 20 20 20 20 7d 0a 20  v >>= 7;.    }. 
6370: 20 20 20 72 65 74 75 72 6e 20 39 3b 0a 20 20 7d     return 9;.  }
6380: 20 20 20 20 0a 20 20 6e 20 3d 20 30 3b 0a 20 20      .  n = 0;.  
6390: 64 6f 7b 0a 20 20 20 20 62 75 66 5b 6e 2b 2b 5d  do{.    buf[n++]
63a0: 20 3d 20 28 75 38 29 28 28 76 20 26 20 30 78 37   = (u8)((v & 0x7
63b0: 66 29 20 7c 20 30 78 38 30 29 3b 0a 20 20 20 20  f) | 0x80);.    
63c0: 76 20 3e 3e 3d 20 37 3b 0a 20 20 7d 77 68 69 6c  v >>= 7;.  }whil
63d0: 65 28 20 76 21 3d 30 20 29 3b 0a 20 20 62 75 66  e( v!=0 );.  buf
63e0: 5b 30 5d 20 26 3d 20 30 78 37 66 3b 0a 20 20 61  [0] &= 0x7f;.  a
63f0: 73 73 65 72 74 28 20 6e 3c 3d 39 20 29 3b 0a 20  ssert( n<=9 );. 
6400: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 2d 31 3b   for(i=0, j=n-1;
6410: 20 6a 3e 3d 30 3b 20 6a 2d 2d 2c 20 69 2b 2b 29   j>=0; j--, i++)
6420: 7b 0a 20 20 20 20 70 5b 69 5d 20 3d 20 62 75 66  {.    p[i] = buf
6430: 5b 6a 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [j];.  }.  retur
6440: 6e 20 6e 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  n n;.}.int sqlit
6450: 65 33 50 75 74 56 61 72 69 6e 74 28 75 6e 73 69  e3PutVarint(unsi
6460: 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 36  gned char *p, u6
6470: 34 20 76 29 7b 0a 20 20 69 66 28 20 76 3c 3d 30  4 v){.  if( v<=0
6480: 78 37 66 20 29 7b 0a 20 20 20 20 70 5b 30 5d 20  x7f ){.    p[0] 
6490: 3d 20 76 26 30 78 37 66 3b 0a 20 20 20 20 72 65  = v&0x7f;.    re
64a0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
64b0: 28 20 76 3c 3d 30 78 33 66 66 66 20 29 7b 0a 20  ( v<=0x3fff ){. 
64c0: 20 20 20 70 5b 30 5d 20 3d 20 28 28 76 3e 3e 37     p[0] = ((v>>7
64d0: 29 26 30 78 37 66 29 7c 30 78 38 30 3b 0a 20 20  )&0x7f)|0x80;.  
64e0: 20 20 70 5b 31 5d 20 3d 20 76 26 30 78 37 66 3b    p[1] = v&0x7f;
64f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
6500: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 75 74 56   }.  return putV
6510: 61 72 69 6e 74 36 34 28 70 2c 76 29 3b 0a 7d 0a  arint64(p,v);.}.
6520: 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20  ./*.** Bitmasks 
6530: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 47  used by sqlite3G
6540: 65 74 56 61 72 69 6e 74 28 29 2e 20 20 54 68 65  etVarint().  The
6550: 73 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20 63  se precomputed c
6560: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 61 72 65 20  onstants.** are 
6570: 64 65 66 69 6e 65 64 20 68 65 72 65 20 72 61 74  defined here rat
6580: 68 65 72 20 74 68 61 6e 20 73 69 6d 70 6c 79 20  her than simply 
6590: 70 75 74 74 69 6e 67 20 74 68 65 20 63 6f 6e 73  putting the cons
65a0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  tant expressions
65b0: 0a 2a 2a 20 69 6e 6c 69 6e 65 20 69 6e 20 6f 72  .** inline in or
65c0: 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  der to work arou
65d0: 6e 64 20 62 75 67 73 20 69 6e 20 74 68 65 20 52  nd bugs in the R
65e0: 56 54 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 0a  VT compiler..**.
65f0: 2a 2a 20 53 4c 4f 54 5f 32 5f 30 20 20 20 20 20  ** SLOT_2_0     
6600: 41 20 6d 61 73 6b 20 66 6f 72 20 20 28 30 78 37  A mask for  (0x7
6610: 66 3c 3c 31 34 29 20 7c 20 30 78 37 66 0a 2a 2a  f<<14) | 0x7f.**
6620: 0a 2a 2a 20 53 4c 4f 54 5f 34 5f 32 5f 30 20 20  .** SLOT_4_2_0  
6630: 20 41 20 6d 61 73 6b 20 66 6f 72 20 20 28 30 78   A mask for  (0x
6640: 37 66 3c 3c 32 38 29 20 7c 20 53 4c 4f 54 5f 32  7f<<28) | SLOT_2
6650: 5f 30 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 4c  _0.*/.#define SL
6660: 4f 54 5f 32 5f 30 20 20 20 20 20 30 78 30 30 31  OT_2_0     0x001
6670: 66 63 30 37 66 0a 23 64 65 66 69 6e 65 20 53 4c  fc07f.#define SL
6680: 4f 54 5f 34 5f 32 5f 30 20 20 20 30 78 66 30 31  OT_4_2_0   0xf01
6690: 66 63 30 37 66 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  fc07f.../*.** Re
66a0: 61 64 20 61 20 36 34 2d 62 69 74 20 76 61 72 69  ad a 64-bit vari
66b0: 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65  able-length inte
66c0: 67 65 72 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20  ger from memory 
66d0: 73 74 61 72 74 69 6e 67 20 61 74 20 70 5b 30 5d  starting at p[0]
66e0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
66f0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6700: 72 65 61 64 2e 20 20 54 68 65 20 76 61 6c 75 65  read.  The value
6710: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 76   is stored in *v
6720: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
6730: 65 74 56 61 72 69 6e 74 28 63 6f 6e 73 74 20 75  etVarint(const u
6740: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c  nsigned char *p,
6750: 20 75 36 34 20 2a 76 29 7b 0a 20 20 75 33 32 20   u64 *v){.  u32 
6760: 61 2c 62 2c 73 3b 0a 0a 20 20 69 66 28 20 28 28  a,b,s;..  if( ((
6770: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 29 5b  signed char*)p)[
6780: 30 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20  0]>=0 ){.    *v 
6790: 3d 20 2a 70 3b 0a 20 20 20 20 72 65 74 75 72 6e  = *p;.    return
67a0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 28   1;.  }.  if( ((
67b0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 29 5b  signed char*)p)[
67c0: 31 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 2a 76 20  1]>=0 ){.    *v 
67d0: 3d 20 28 28 75 33 32 29 28 70 5b 30 5d 26 30 78  = ((u32)(p[0]&0x
67e0: 37 66 29 3c 3c 37 29 20 7c 20 70 5b 31 5d 3b 0a  7f)<<7) | p[1];.
67f0: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
6800: 7d 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  }..  /* Verify t
6810: 68 61 74 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  hat constants ar
6820: 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20 63 6f  e precomputed co
6830: 72 72 65 63 74 6c 79 20 2a 2f 0a 20 20 61 73 73  rrectly */.  ass
6840: 65 72 74 28 20 53 4c 4f 54 5f 32 5f 30 20 3d 3d  ert( SLOT_2_0 ==
6850: 20 28 28 30 78 37 66 3c 3c 31 34 29 20 7c 20 28   ((0x7f<<14) | (
6860: 30 78 37 66 29 29 20 29 3b 0a 20 20 61 73 73 65  0x7f)) );.  asse
6870: 72 74 28 20 53 4c 4f 54 5f 34 5f 32 5f 30 20 3d  rt( SLOT_4_2_0 =
6880: 3d 20 28 28 30 78 66 55 3c 3c 32 38 29 20 7c 20  = ((0xfU<<28) | 
6890: 28 30 78 37 66 3c 3c 31 34 29 20 7c 20 28 30 78  (0x7f<<14) | (0x
68a0: 37 66 29 29 20 29 3b 0a 0a 20 20 61 20 3d 20 28  7f)) );..  a = (
68b0: 28 75 33 32 29 70 5b 30 5d 29 3c 3c 31 34 3b 0a  (u32)p[0])<<14;.
68c0: 20 20 62 20 3d 20 70 5b 31 5d 3b 0a 20 20 70 20    b = p[1];.  p 
68d0: 2b 3d 20 32 3b 0a 20 20 61 20 7c 3d 20 2a 70 3b  += 2;.  a |= *p;
68e0: 0a 20 20 2f 2a 20 61 3a 20 70 30 3c 3c 31 34 20  .  /* a: p0<<14 
68f0: 7c 20 70 32 20 28 75 6e 6d 61 73 6b 65 64 29 20  | p2 (unmasked) 
6900: 2a 2f 0a 20 20 69 66 20 28 21 28 61 26 30 78 38  */.  if (!(a&0x8
6910: 30 29 29 0a 20 20 7b 0a 20 20 20 20 61 20 26 3d  0)).  {.    a &=
6920: 20 53 4c 4f 54 5f 32 5f 30 3b 0a 20 20 20 20 62   SLOT_2_0;.    b
6930: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 62 20   &= 0x7f;.    b 
6940: 3d 20 62 3c 3c 37 3b 0a 20 20 20 20 61 20 7c 3d  = b<<7;.    a |=
6950: 20 62 3b 0a 20 20 20 20 2a 76 20 3d 20 61 3b 0a   b;.    *v = a;.
6960: 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
6970: 7d 0a 0a 20 20 2f 2a 20 43 53 45 31 20 66 72 6f  }..  /* CSE1 fro
6980: 6d 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 61 20 26  m below */.  a &
6990: 3d 20 53 4c 4f 54 5f 32 5f 30 3b 0a 20 20 70 2b  = SLOT_2_0;.  p+
69a0: 2b 3b 0a 20 20 62 20 3d 20 62 3c 3c 31 34 3b 0a  +;.  b = b<<14;.
69b0: 20 20 62 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20    b |= *p;.  /* 
69c0: 62 3a 20 70 31 3c 3c 31 34 20 7c 20 70 33 20 28  b: p1<<14 | p3 (
69d0: 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69  unmasked) */.  i
69e0: 66 20 28 21 28 62 26 30 78 38 30 29 29 0a 20 20  f (!(b&0x80)).  
69f0: 7b 0a 20 20 20 20 62 20 26 3d 20 53 4c 4f 54 5f  {.    b &= SLOT_
6a00: 32 5f 30 3b 0a 20 20 20 20 2f 2a 20 6d 6f 76 65  2_0;.    /* move
6a10: 64 20 43 53 45 31 20 75 70 20 2a 2f 0a 20 20 20  d CSE1 up */.   
6a20: 20 2f 2a 20 61 20 26 3d 20 28 30 78 37 66 3c 3c   /* a &= (0x7f<<
6a30: 31 34 29 7c 28 30 78 37 66 29 3b 20 2a 2f 0a 20  14)|(0x7f); */. 
6a40: 20 20 20 61 20 3d 20 61 3c 3c 37 3b 0a 20 20 20     a = a<<7;.   
6a50: 20 61 20 7c 3d 20 62 3b 0a 20 20 20 20 2a 76 20   a |= b;.    *v 
6a60: 3d 20 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = a;.    return 
6a70: 34 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 3a 20  4;.  }..  /* a: 
6a80: 70 30 3c 3c 31 34 20 7c 20 70 32 20 28 6d 61 73  p0<<14 | p2 (mas
6a90: 6b 65 64 29 20 2a 2f 0a 20 20 2f 2a 20 62 3a 20  ked) */.  /* b: 
6aa0: 70 31 3c 3c 31 34 20 7c 20 70 33 20 28 75 6e 6d  p1<<14 | p3 (unm
6ab0: 61 73 6b 65 64 29 20 2a 2f 0a 20 20 2f 2a 20 31  asked) */.  /* 1
6ac0: 3a 73 61 76 65 20 6f 66 66 20 70 30 3c 3c 32 31  :save off p0<<21
6ad0: 20 7c 20 70 31 3c 3c 31 34 20 7c 20 70 32 3c 3c   | p1<<14 | p2<<
6ae0: 37 20 7c 20 70 33 20 28 6d 61 73 6b 65 64 29 20  7 | p3 (masked) 
6af0: 2a 2f 0a 20 20 2f 2a 20 6d 6f 76 65 64 20 43 53  */.  /* moved CS
6b00: 45 31 20 75 70 20 2a 2f 0a 20 20 2f 2a 20 61 20  E1 up */.  /* a 
6b10: 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c 28 30  &= (0x7f<<14)|(0
6b20: 78 37 66 29 3b 20 2a 2f 0a 20 20 62 20 26 3d 20  x7f); */.  b &= 
6b30: 53 4c 4f 54 5f 32 5f 30 3b 0a 20 20 73 20 3d 20  SLOT_2_0;.  s = 
6b40: 61 3b 0a 20 20 2f 2a 20 73 3a 20 70 30 3c 3c 31  a;.  /* s: p0<<1
6b50: 34 20 7c 20 70 32 20 28 6d 61 73 6b 65 64 29 20  4 | p2 (masked) 
6b60: 2a 2f 0a 0a 20 20 70 2b 2b 3b 0a 20 20 61 20 3d  */..  p++;.  a =
6b70: 20 61 3c 3c 31 34 3b 0a 20 20 61 20 7c 3d 20 2a   a<<14;.  a |= *
6b80: 70 3b 0a 20 20 2f 2a 20 61 3a 20 70 30 3c 3c 32  p;.  /* a: p0<<2
6b90: 38 20 7c 20 70 32 3c 3c 31 34 20 7c 20 70 34 20  8 | p2<<14 | p4 
6ba0: 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20  (unmasked) */.  
6bb0: 69 66 20 28 21 28 61 26 30 78 38 30 29 29 0a 20  if (!(a&0x80)). 
6bc0: 20 7b 0a 20 20 20 20 2f 2a 20 77 65 20 63 61 6e   {.    /* we can
6bd0: 20 73 6b 69 70 20 74 68 65 73 65 20 63 61 75 73   skip these caus
6be0: 65 20 74 68 65 79 20 77 65 72 65 20 28 65 66 66  e they were (eff
6bf0: 65 63 74 69 76 65 6c 79 29 20 64 6f 6e 65 20 61  ectively) done a
6c00: 62 6f 76 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c  bove.    ** whil
6c10: 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 73 20  e calculating s 
6c20: 2a 2f 0a 20 20 20 20 2f 2a 20 61 20 26 3d 20 28  */.    /* a &= (
6c30: 30 78 37 66 3c 3c 32 38 29 7c 28 30 78 37 66 3c  0x7f<<28)|(0x7f<
6c40: 3c 31 34 29 7c 28 30 78 37 66 29 3b 20 2a 2f 0a  <14)|(0x7f); */.
6c50: 20 20 20 20 2f 2a 20 62 20 26 3d 20 28 30 78 37      /* b &= (0x7
6c60: 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 20 2a  f<<14)|(0x7f); *
6c70: 2f 0a 20 20 20 20 62 20 3d 20 62 3c 3c 37 3b 0a  /.    b = b<<7;.
6c80: 20 20 20 20 61 20 7c 3d 20 62 3b 0a 20 20 20 20      a |= b;.    
6c90: 73 20 3d 20 73 3e 3e 31 38 3b 0a 20 20 20 20 2a  s = s>>18;.    *
6ca0: 76 20 3d 20 28 28 75 36 34 29 73 29 3c 3c 33 32  v = ((u64)s)<<32
6cb0: 20 7c 20 61 3b 0a 20 20 20 20 72 65 74 75 72 6e   | a;.    return
6cc0: 20 35 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 32 3a   5;.  }..  /* 2:
6cd0: 73 61 76 65 20 6f 66 66 20 70 30 3c 3c 32 31 20  save off p0<<21 
6ce0: 7c 20 70 31 3c 3c 31 34 20 7c 20 70 32 3c 3c 37  | p1<<14 | p2<<7
6cf0: 20 7c 20 70 33 20 28 6d 61 73 6b 65 64 29 20 2a   | p3 (masked) *
6d00: 2f 0a 20 20 73 20 3d 20 73 3c 3c 37 3b 0a 20 20  /.  s = s<<7;.  
6d10: 73 20 7c 3d 20 62 3b 0a 20 20 2f 2a 20 73 3a 20  s |= b;.  /* s: 
6d20: 70 30 3c 3c 32 31 20 7c 20 70 31 3c 3c 31 34 20  p0<<21 | p1<<14 
6d30: 7c 20 70 32 3c 3c 37 20 7c 20 70 33 20 28 6d 61  | p2<<7 | p3 (ma
6d40: 73 6b 65 64 29 20 2a 2f 0a 0a 20 20 70 2b 2b 3b  sked) */..  p++;
6d50: 0a 20 20 62 20 3d 20 62 3c 3c 31 34 3b 0a 20 20  .  b = b<<14;.  
6d60: 62 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 62 3a  b |= *p;.  /* b:
6d70: 20 70 31 3c 3c 32 38 20 7c 20 70 33 3c 3c 31 34   p1<<28 | p3<<14
6d80: 20 7c 20 70 35 20 28 75 6e 6d 61 73 6b 65 64 29   | p5 (unmasked)
6d90: 20 2a 2f 0a 20 20 69 66 20 28 21 28 62 26 30 78   */.  if (!(b&0x
6da0: 38 30 29 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20  80)).  {.    /* 
6db0: 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 69 73  we can skip this
6dc0: 20 63 61 75 73 65 20 69 74 20 77 61 73 20 28 65   cause it was (e
6dd0: 66 66 65 63 74 69 76 65 6c 79 29 20 64 6f 6e 65  ffectively) done
6de0: 20 61 62 6f 76 65 20 69 6e 20 63 61 6c 63 27 69   above in calc'i
6df0: 6e 67 20 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 62  ng s */.    /* b
6e00: 20 26 3d 20 28 30 78 37 66 3c 3c 32 38 29 7c 28   &= (0x7f<<28)|(
6e10: 30 78 37 66 3c 3c 31 34 29 7c 28 30 78 37 66 29  0x7f<<14)|(0x7f)
6e20: 3b 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20 53 4c  ; */.    a &= SL
6e30: 4f 54 5f 32 5f 30 3b 0a 20 20 20 20 61 20 3d 20  OT_2_0;.    a = 
6e40: 61 3c 3c 37 3b 0a 20 20 20 20 61 20 7c 3d 20 62  a<<7;.    a |= b
6e50: 3b 0a 20 20 20 20 73 20 3d 20 73 3e 3e 31 38 3b  ;.    s = s>>18;
6e60: 0a 20 20 20 20 2a 76 20 3d 20 28 28 75 36 34 29  .    *v = ((u64)
6e70: 73 29 3c 3c 33 32 20 7c 20 61 3b 0a 20 20 20 20  s)<<32 | a;.    
6e80: 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 0a 20  return 6;.  }.. 
6e90: 20 70 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31   p++;.  a = a<<1
6ea0: 34 3b 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20  4;.  a |= *p;.  
6eb0: 2f 2a 20 61 3a 20 70 32 3c 3c 32 38 20 7c 20 70  /* a: p2<<28 | p
6ec0: 34 3c 3c 31 34 20 7c 20 70 36 20 28 75 6e 6d 61  4<<14 | p6 (unma
6ed0: 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21  sked) */.  if (!
6ee0: 28 61 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20  (a&0x80)).  {.  
6ef0: 20 20 61 20 26 3d 20 53 4c 4f 54 5f 34 5f 32 5f    a &= SLOT_4_2_
6f00: 30 3b 0a 20 20 20 20 62 20 26 3d 20 53 4c 4f 54  0;.    b &= SLOT
6f10: 5f 32 5f 30 3b 0a 20 20 20 20 62 20 3d 20 62 3c  _2_0;.    b = b<
6f20: 3c 37 3b 0a 20 20 20 20 61 20 7c 3d 20 62 3b 0a  <7;.    a |= b;.
6f30: 20 20 20 20 73 20 3d 20 73 3e 3e 31 31 3b 0a 20      s = s>>11;. 
6f40: 20 20 20 2a 76 20 3d 20 28 28 75 36 34 29 73 29     *v = ((u64)s)
6f50: 3c 3c 33 32 20 7c 20 61 3b 0a 20 20 20 20 72 65  <<32 | a;.    re
6f60: 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 7;.  }..  /
6f70: 2a 20 43 53 45 32 20 66 72 6f 6d 20 62 65 6c 6f  * CSE2 from belo
6f80: 77 20 2a 2f 0a 20 20 61 20 26 3d 20 53 4c 4f 54  w */.  a &= SLOT
6f90: 5f 32 5f 30 3b 0a 20 20 70 2b 2b 3b 0a 20 20 62  _2_0;.  p++;.  b
6fa0: 20 3d 20 62 3c 3c 31 34 3b 0a 20 20 62 20 7c 3d   = b<<14;.  b |=
6fb0: 20 2a 70 3b 0a 20 20 2f 2a 20 62 3a 20 70 33 3c   *p;.  /* b: p3<
6fc0: 3c 32 38 20 7c 20 70 35 3c 3c 31 34 20 7c 20 70  <28 | p5<<14 | p
6fd0: 37 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a  7 (unmasked) */.
6fe0: 20 20 69 66 20 28 21 28 62 26 30 78 38 30 29 29    if (!(b&0x80))
6ff0: 0a 20 20 7b 0a 20 20 20 20 62 20 26 3d 20 53 4c  .  {.    b &= SL
7000: 4f 54 5f 34 5f 32 5f 30 3b 0a 20 20 20 20 2f 2a  OT_4_2_0;.    /*
7010: 20 6d 6f 76 65 64 20 43 53 45 32 20 75 70 20 2a   moved CSE2 up *
7020: 2f 0a 20 20 20 20 2f 2a 20 61 20 26 3d 20 28 30  /.    /* a &= (0
7030: 78 37 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b  x7f<<14)|(0x7f);
7040: 20 2a 2f 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37   */.    a = a<<7
7050: 3b 0a 20 20 20 20 61 20 7c 3d 20 62 3b 0a 20 20  ;.    a |= b;.  
7060: 20 20 73 20 3d 20 73 3e 3e 34 3b 0a 20 20 20 20    s = s>>4;.    
7070: 2a 76 20 3d 20 28 28 75 36 34 29 73 29 3c 3c 33  *v = ((u64)s)<<3
7080: 32 20 7c 20 61 3b 0a 20 20 20 20 72 65 74 75 72  2 | a;.    retur
7090: 6e 20 38 3b 0a 20 20 7d 0a 0a 20 20 70 2b 2b 3b  n 8;.  }..  p++;
70a0: 0a 20 20 61 20 3d 20 61 3c 3c 31 35 3b 0a 20 20  .  a = a<<15;.  
70b0: 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a  a |= *p;.  /* a:
70c0: 20 70 34 3c 3c 32 39 20 7c 20 70 36 3c 3c 31 35   p4<<29 | p6<<15
70d0: 20 7c 20 70 38 20 28 75 6e 6d 61 73 6b 65 64 29   | p8 (unmasked)
70e0: 20 2a 2f 0a 0a 20 20 2f 2a 20 6d 6f 76 65 64 20   */..  /* moved 
70f0: 43 53 45 32 20 75 70 20 2a 2f 0a 20 20 2f 2a 20  CSE2 up */.  /* 
7100: 61 20 26 3d 20 28 30 78 37 66 3c 3c 32 39 29 7c  a &= (0x7f<<29)|
7110: 28 30 78 37 66 3c 3c 31 35 29 7c 28 30 78 66 66  (0x7f<<15)|(0xff
7120: 29 3b 20 2a 2f 0a 20 20 62 20 26 3d 20 53 4c 4f  ); */.  b &= SLO
7130: 54 5f 32 5f 30 3b 0a 20 20 62 20 3d 20 62 3c 3c  T_2_0;.  b = b<<
7140: 38 3b 0a 20 20 61 20 7c 3d 20 62 3b 0a 0a 20 20  8;.  a |= b;..  
7150: 73 20 3d 20 73 3c 3c 34 3b 0a 20 20 62 20 3d 20  s = s<<4;.  b = 
7160: 70 5b 2d 34 5d 3b 0a 20 20 62 20 26 3d 20 30 78  p[-4];.  b &= 0x
7170: 37 66 3b 0a 20 20 62 20 3d 20 62 3e 3e 33 3b 0a  7f;.  b = b>>3;.
7180: 20 20 73 20 7c 3d 20 62 3b 0a 0a 20 20 2a 76 20    s |= b;..  *v 
7190: 3d 20 28 28 75 36 34 29 73 29 3c 3c 33 32 20 7c  = ((u64)s)<<32 |
71a0: 20 61 3b 0a 0a 20 20 72 65 74 75 72 6e 20 39 3b   a;..  return 9;
71b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
71c0: 20 33 32 2d 62 69 74 20 76 61 72 69 61 62 6c 65   32-bit variable
71d0: 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20  -length integer 
71e0: 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 73 74 61 72  from memory star
71f0: 74 69 6e 67 20 61 74 20 70 5b 30 5d 2e 0a 2a 2a  ting at p[0]..**
7200: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7210: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
7220: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 20  .  The value is 
7230: 73 74 6f 72 65 64 20 69 6e 20 2a 76 2e 0a 2a 2a  stored in *v..**
7240: 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 72 69 6e  .** If the varin
7250: 74 20 73 74 6f 72 65 64 20 69 6e 20 70 5b 30 5d  t stored in p[0]
7260: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
7270: 63 61 6e 20 66 69 74 20 69 6e 20 61 20 33 32 2d  can fit in a 32-
7280: 62 69 74 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  bit unsigned.** 
7290: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 73 65  integer, then se
72a0: 74 20 2a 76 20 74 6f 20 30 78 66 66 66 66 66 66  t *v to 0xffffff
72b0: 66 66 2e 0a 2a 2a 0a 2a 2a 20 41 20 4d 41 43 52  ff..**.** A MACR
72c0: 4f 20 76 65 72 73 69 6f 6e 2c 20 67 65 74 56 61  O version, getVa
72d0: 72 69 6e 74 33 32 2c 20 69 73 20 70 72 6f 76 69  rint32, is provi
72e0: 64 65 64 20 77 68 69 63 68 20 69 6e 6c 69 6e 65  ded which inline
72f0: 73 20 74 68 65 20 0a 2a 2a 20 73 69 6e 67 6c 65  s the .** single
7300: 2d 62 79 74 65 20 63 61 73 65 2e 20 20 41 6c 6c  -byte case.  All
7310: 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 75 73 65   code should use
7320: 20 74 68 65 20 4d 41 43 52 4f 20 76 65 72 73 69   the MACRO versi
7330: 6f 6e 20 61 73 20 0a 2a 2a 20 74 68 69 73 20 66  on as .** this f
7340: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
7350: 74 68 65 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  the single-byte 
7360: 63 61 73 65 20 68 61 73 20 61 6c 72 65 61 64 79  case has already
7370: 20 62 65 65 6e 20 68 61 6e 64 6c 65 64 2e 0a 2a   been handled..*
7380: 2f 0a 75 38 20 73 71 6c 69 74 65 33 47 65 74 56  /.u8 sqlite3GetV
7390: 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e  arint32(const un
73a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20  signed char *p, 
73b0: 75 33 32 20 2a 76 29 7b 0a 20 20 75 33 32 20 61  u32 *v){.  u32 a
73c0: 2c 62 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 31 2d  ,b;..  /* The 1-
73d0: 62 79 74 65 20 63 61 73 65 2e 20 20 4f 76 65 72  byte case.  Over
73e0: 77 68 65 6c 6d 69 6e 67 6c 79 20 74 68 65 20 6d  whelmingly the m
73f0: 6f 73 74 20 63 6f 6d 6d 6f 6e 2e 20 20 48 61 6e  ost common.  Han
7400: 64 6c 65 64 20 69 6e 6c 69 6e 65 0a 20 20 2a 2a  dled inline.  **
7410: 20 62 79 20 74 68 65 20 67 65 74 56 61 72 69 6e   by the getVarin
7420: 33 32 28 29 20 6d 61 63 72 6f 20 2a 2f 0a 20 20  32() macro */.  
7430: 61 20 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20  a = *p;.  /* a: 
7440: 70 30 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f  p0 (unmasked) */
7450: 0a 23 69 66 6e 64 65 66 20 67 65 74 56 61 72 69  .#ifndef getVari
7460: 6e 74 33 32 0a 20 20 69 66 20 28 21 28 61 26 30  nt32.  if (!(a&0
7470: 78 38 30 29 29 0a 20 20 7b 0a 20 20 20 20 2f 2a  x80)).  {.    /*
7480: 20 56 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   Values between 
7490: 30 20 61 6e 64 20 31 32 37 20 2a 2f 0a 20 20 20  0 and 127 */.   
74a0: 20 2a 76 20 3d 20 61 3b 0a 20 20 20 20 72 65 74   *v = a;.    ret
74b0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
74c0: 66 0a 0a 20 20 2f 2a 20 54 68 65 20 32 2d 62 79  f..  /* The 2-by
74d0: 74 65 20 63 61 73 65 20 2a 2f 0a 20 20 70 2b 2b  te case */.  p++
74e0: 3b 0a 20 20 62 20 3d 20 2a 70 3b 0a 20 20 2f 2a  ;.  b = *p;.  /*
74f0: 20 62 3a 20 70 31 20 28 75 6e 6d 61 73 6b 65 64   b: p1 (unmasked
7500: 29 20 2a 2f 0a 20 20 69 66 20 28 21 28 62 26 30  ) */.  if (!(b&0
7510: 78 38 30 29 29 0a 20 20 7b 0a 20 20 20 20 2f 2a  x80)).  {.    /*
7520: 20 56 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   Values between 
7530: 31 32 38 20 61 6e 64 20 31 36 33 38 33 20 2a 2f  128 and 16383 */
7540: 0a 20 20 20 20 61 20 26 3d 20 30 78 37 66 3b 0a  .    a &= 0x7f;.
7550: 20 20 20 20 61 20 3d 20 61 3c 3c 37 3b 0a 20 20      a = a<<7;.  
7560: 20 20 2a 76 20 3d 20 61 20 7c 20 62 3b 0a 20 20    *v = a | b;.  
7570: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
7580: 0a 20 20 2f 2a 20 54 68 65 20 33 2d 62 79 74 65  .  /* The 3-byte
7590: 20 63 61 73 65 20 2a 2f 0a 20 20 70 2b 2b 3b 0a   case */.  p++;.
75a0: 20 20 61 20 3d 20 61 3c 3c 31 34 3b 0a 20 20 61    a = a<<14;.  a
75b0: 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20   |= *p;.  /* a: 
75c0: 70 30 3c 3c 31 34 20 7c 20 70 32 20 28 75 6e 6d  p0<<14 | p2 (unm
75d0: 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28  asked) */.  if (
75e0: 21 28 61 26 30 78 38 30 29 29 0a 20 20 7b 0a 20  !(a&0x80)).  {. 
75f0: 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74     /* Values bet
7600: 77 65 65 6e 20 31 36 33 38 34 20 61 6e 64 20 32  ween 16384 and 2
7610: 30 39 37 31 35 31 20 2a 2f 0a 20 20 20 20 61 20  097151 */.    a 
7620: 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c 28 30  &= (0x7f<<14)|(0
7630: 78 37 66 29 3b 0a 20 20 20 20 62 20 26 3d 20 30  x7f);.    b &= 0
7640: 78 37 66 3b 0a 20 20 20 20 62 20 3d 20 62 3c 3c  x7f;.    b = b<<
7650: 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20  7;.    *v = a | 
7660: 62 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 33 3b  b;.    return 3;
7670: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 33 32 2d  .  }..  /* A 32-
7680: 62 69 74 20 76 61 72 69 6e 74 20 69 73 20 75 73  bit varint is us
7690: 65 64 20 74 6f 20 73 74 6f 72 65 20 73 69 7a 65  ed to store size
76a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
76b0: 62 74 72 65 65 73 2e 0a 20 20 2a 2a 20 4f 62 6a  btrees..  ** Obj
76c0: 65 63 74 73 20 61 72 65 20 72 61 72 65 6c 79 20  ects are rarely 
76d0: 6c 61 72 67 65 72 20 74 68 61 6e 20 32 4d 69 42  larger than 2MiB
76e0: 20 6c 69 6d 69 74 20 6f 66 20 61 20 33 2d 62 79   limit of a 3-by
76f0: 74 65 20 76 61 72 69 6e 74 2e 0a 20 20 2a 2a 20  te varint..  ** 
7700: 41 20 33 2d 62 79 74 65 20 76 61 72 69 6e 74 20  A 3-byte varint 
7710: 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 66  is sufficient, f
7720: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 72  or example, to r
7730: 65 63 6f 72 64 20 74 68 65 20 73 69 7a 65 0a 20  ecord the size. 
7740: 20 2a 2a 20 6f 66 20 61 20 31 30 34 38 35 36 39   ** of a 1048569
7750: 2d 62 79 74 65 20 42 4c 4f 42 20 6f 72 20 73 74  -byte BLOB or st
7760: 72 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ring..  **.  ** 
7770: 57 65 20 6f 6e 6c 79 20 75 6e 72 6f 6c 6c 20 74  We only unroll t
7780: 68 65 20 66 69 72 73 74 20 31 2d 2c 20 32 2d 2c  he first 1-, 2-,
7790: 20 61 6e 64 20 33 2d 20 62 79 74 65 20 63 61 73   and 3- byte cas
77a0: 65 73 2e 20 20 54 68 65 20 76 65 72 79 0a 20 20  es.  The very.  
77b0: 2a 2a 20 72 61 72 65 20 6c 61 72 67 65 72 20 63  ** rare larger c
77c0: 61 73 65 73 20 63 61 6e 20 62 65 20 68 61 6e 64  ases can be hand
77d0: 6c 65 64 20 62 79 20 74 68 65 20 73 6c 6f 77 65  led by the slowe
77e0: 72 20 36 34 2d 62 69 74 20 76 61 72 69 6e 74 0a  r 64-bit varint.
77f0: 20 20 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 20 20    ** routine..  
7800: 2a 2f 0a 23 69 66 20 31 0a 20 20 7b 0a 20 20 20  */.#if 1.  {.   
7810: 20 75 36 34 20 76 36 34 3b 0a 20 20 20 20 75 38   u64 v64;.    u8
7820: 20 6e 3b 0a 0a 20 20 20 20 70 20 2d 3d 20 32 3b   n;..    p -= 2;
7830: 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
7840: 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 76 36  GetVarint(p, &v6
7850: 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  4);.    assert( 
7860: 6e 3e 33 20 26 26 20 6e 3c 3d 39 20 29 3b 0a 20  n>3 && n<=9 );. 
7870: 20 20 20 69 66 28 20 28 76 36 34 20 26 20 53 51     if( (v64 & SQ
7880: 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 21 3d 76  LITE_MAX_U32)!=v
7890: 36 34 20 29 7b 0a 20 20 20 20 20 20 2a 76 20 3d  64 ){.      *v =
78a0: 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 20   0xffffffff;.   
78b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 76   }else{.      *v
78c0: 20 3d 20 28 75 33 32 29 76 36 34 3b 0a 20 20 20   = (u32)v64;.   
78d0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 3b   }.    return n;
78e0: 0a 20 20 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a  .  }..#else.  /*
78f0: 20 46 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   For following c
7900: 6f 64 65 20 28 6b 65 70 74 20 66 6f 72 20 68 69  ode (kept for hi
7910: 73 74 6f 72 69 63 61 6c 20 72 65 63 6f 72 64 20  storical record 
7920: 6f 6e 6c 79 29 20 73 68 6f 77 73 20 61 6e 0a 20  only) shows an. 
7930: 20 2a 2a 20 75 6e 72 6f 6c 6c 69 6e 67 20 66 6f   ** unrolling fo
7940: 72 20 74 68 65 20 33 2d 20 61 6e 64 20 34 2d 62  r the 3- and 4-b
7950: 79 74 65 20 76 61 72 69 6e 74 20 63 61 73 65 73  yte varint cases
7960: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 0a  .  This code is.
7970: 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 66 61    ** slightly fa
7980: 73 74 65 72 2c 20 62 75 74 20 69 74 20 69 73 20  ster, but it is 
7990: 61 6c 73 6f 20 6c 61 72 67 65 72 20 61 6e 64 20  also larger and 
79a0: 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f 20 74  much harder to t
79b0: 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 2b 2b 3b  est..  */.  p++;
79c0: 0a 20 20 62 20 3d 20 62 3c 3c 31 34 3b 0a 20 20  .  b = b<<14;.  
79d0: 62 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 62 3a  b |= *p;.  /* b:
79e0: 20 70 31 3c 3c 31 34 20 7c 20 70 33 20 28 75 6e   p1<<14 | p3 (un
79f0: 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20  masked) */.  if 
7a00: 28 21 28 62 26 30 78 38 30 29 29 0a 20 20 7b 0a  (!(b&0x80)).  {.
7a10: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65      /* Values be
7a20: 74 77 65 65 6e 20 32 30 39 37 31 35 32 20 61 6e  tween 2097152 an
7a30: 64 20 32 36 38 34 33 35 34 35 35 20 2a 2f 0a 20  d 268435455 */. 
7a40: 20 20 20 62 20 26 3d 20 28 30 78 37 66 3c 3c 31     b &= (0x7f<<1
7a50: 34 29 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 61  4)|(0x7f);.    a
7a60: 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c 28   &= (0x7f<<14)|(
7a70: 30 78 37 66 29 3b 0a 20 20 20 20 61 20 3d 20 61  0x7f);.    a = a
7a80: 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20  <<7;.    *v = a 
7a90: 7c 20 62 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  | b;.    return 
7aa0: 34 3b 0a 20 20 7d 0a 0a 20 20 70 2b 2b 3b 0a 20  4;.  }..  p++;. 
7ab0: 20 61 20 3d 20 61 3c 3c 31 34 3b 0a 20 20 61 20   a = a<<14;.  a 
7ac0: 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70  |= *p;.  /* a: p
7ad0: 30 3c 3c 32 38 20 7c 20 70 32 3c 3c 31 34 20 7c  0<<28 | p2<<14 |
7ae0: 20 70 34 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a   p4 (unmasked) *
7af0: 2f 0a 20 20 69 66 20 28 21 28 61 26 30 78 38 30  /.  if (!(a&0x80
7b00: 29 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61  )).  {.    /* Va
7b10: 6c 75 65 73 20 20 62 65 74 77 65 65 6e 20 32 36  lues  between 26
7b20: 38 34 33 35 34 35 36 20 61 6e 64 20 33 34 33 35  8435456 and 3435
7b30: 39 37 33 38 33 36 37 20 2a 2f 0a 20 20 20 20 61  9738367 */.    a
7b40: 20 26 3d 20 53 4c 4f 54 5f 34 5f 32 5f 30 3b 0a   &= SLOT_4_2_0;.
7b50: 20 20 20 20 62 20 26 3d 20 53 4c 4f 54 5f 34 5f      b &= SLOT_4_
7b60: 32 5f 30 3b 0a 20 20 20 20 62 20 3d 20 62 3c 3c  2_0;.    b = b<<
7b70: 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20  7;.    *v = a | 
7b80: 62 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 35 3b  b;.    return 5;
7b90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 63 61  .  }..  /* We ca
7ba0: 6e 20 6f 6e 6c 79 20 72 65 61 63 68 20 74 68 69  n only reach thi
7bb0: 73 20 70 6f 69 6e 74 20 77 68 65 6e 20 72 65 61  s point when rea
7bc0: 64 69 6e 67 20 61 20 63 6f 72 72 75 70 74 20 64  ding a corrupt d
7bd0: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c  atabase.  ** fil
7be0: 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
7bf0: 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 61   we are not in a
7c00: 6e 79 20 68 75 72 72 79 2e 20 20 55 73 65 20 74  ny hurry.  Use t
7c10: 68 65 20 28 72 65 6c 61 74 69 76 65 6c 79 0a 20  he (relatively. 
7c20: 20 2a 2a 20 73 6c 6f 77 29 20 67 65 6e 65 72 61   ** slow) genera
7c30: 6c 2d 70 75 72 70 6f 73 65 20 73 71 6c 69 74 65  l-purpose sqlite
7c40: 33 47 65 74 56 61 72 69 6e 74 28 29 20 72 6f 75  3GetVarint() rou
7c50: 74 69 6e 65 20 74 6f 20 65 78 74 72 61 63 74 20  tine to extract 
7c60: 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  the.  ** value. 
7c70: 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 36 34 20 76  */.  {.    u64 v
7c80: 36 34 3b 0a 20 20 20 20 75 38 20 6e 3b 0a 0a 20  64;.    u8 n;.. 
7c90: 20 20 20 70 20 2d 3d 20 34 3b 0a 20 20 20 20 6e     p -= 4;.    n
7ca0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72   = sqlite3GetVar
7cb0: 69 6e 74 28 70 2c 20 26 76 36 34 29 3b 0a 20 20  int(p, &v64);.  
7cc0: 20 20 61 73 73 65 72 74 28 20 6e 3e 35 20 26 26    assert( n>5 &&
7cd0: 20 6e 3c 3d 39 20 29 3b 0a 20 20 20 20 2a 76 20   n<=9 );.    *v 
7ce0: 3d 20 28 75 33 32 29 76 36 34 3b 0a 20 20 20 20  = (u32)v64;.    
7cf0: 72 65 74 75 72 6e 20 6e 3b 0a 20 20 7d 0a 23 65  return n;.  }.#e
7d00: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
7d10: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
7d20: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 77 69  of bytes that wi
7d30: 6c 6c 20 62 65 20 6e 65 65 64 65 64 20 74 6f 20  ll be needed to 
7d40: 73 74 6f 72 65 20 74 68 65 20 67 69 76 65 6e 0a  store the given.
7d50: 2a 2a 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  ** 64-bit intege
7d60: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
7d70: 33 56 61 72 69 6e 74 4c 65 6e 28 75 36 34 20 76  3VarintLen(u64 v
7d80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
7d90: 72 28 69 3d 31 3b 20 28 76 20 3e 3e 3d 20 37 29  r(i=1; (v >>= 7)
7da0: 21 3d 30 3b 20 69 2b 2b 29 7b 20 61 73 73 65 72  !=0; i++){ asser
7db0: 74 28 20 69 3c 31 30 20 29 3b 20 7d 0a 20 20 72  t( i<10 ); }.  r
7dc0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn i;.}.../*.
7dd0: 2a 2a 20 52 65 61 64 20 6f 72 20 77 72 69 74 65  ** Read or write
7de0: 20 61 20 66 6f 75 72 2d 62 79 74 65 20 62 69 67   a four-byte big
7df0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
7e00: 76 61 6c 75 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  value..*/.u32 sq
7e10: 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 63 6f  lite3Get4byte(co
7e20: 6e 73 74 20 75 38 20 2a 70 29 7b 0a 23 69 66 20  nst u8 *p){.#if 
7e30: 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52  SQLITE_BYTEORDER
7e40: 3d 3d 34 33 32 31 0a 20 20 75 33 32 20 78 3b 0a  ==4321.  u32 x;.
7e50: 20 20 6d 65 6d 63 70 79 28 26 78 2c 70 2c 34 29    memcpy(&x,p,4)
7e60: 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 23 65  ;.  return x;.#e
7e70: 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  lif SQLITE_BYTEO
7e80: 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20 47 43  RDER==1234 && GC
7e90: 43 5f 56 45 52 53 49 4f 4e 3e 3d 34 30 30 33 30  C_VERSION>=40030
7ea0: 30 30 0a 20 20 75 33 32 20 78 3b 0a 20 20 6d 65  00.  u32 x;.  me
7eb0: 6d 63 70 79 28 26 78 2c 70 2c 34 29 3b 0a 20 20  mcpy(&x,p,4);.  
7ec0: 72 65 74 75 72 6e 20 5f 5f 62 75 69 6c 74 69 6e  return __builtin
7ed0: 5f 62 73 77 61 70 33 32 28 78 29 3b 0a 23 65 6c  _bswap32(x);.#el
7ee0: 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52  if SQLITE_BYTEOR
7ef0: 44 45 52 3d 3d 31 32 33 34 20 26 26 20 4d 53 56  DER==1234 && MSV
7f00: 43 5f 56 45 52 53 49 4f 4e 3e 3d 31 33 30 30 0a  C_VERSION>=1300.
7f10: 20 20 75 33 32 20 78 3b 0a 20 20 6d 65 6d 63 70    u32 x;.  memcp
7f20: 79 28 26 78 2c 70 2c 34 29 3b 0a 20 20 72 65 74  y(&x,p,4);.  ret
7f30: 75 72 6e 20 5f 62 79 74 65 73 77 61 70 5f 75 6c  urn _byteswap_ul
7f40: 6f 6e 67 28 78 29 3b 0a 23 65 6c 73 65 0a 20 20  ong(x);.#else.  
7f50: 74 65 73 74 63 61 73 65 28 20 70 5b 30 5d 26 30  testcase( p[0]&0
7f60: 78 38 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  x80 );.  return 
7f70: 28 28 75 6e 73 69 67 6e 65 64 29 70 5b 30 5d 3c  ((unsigned)p[0]<
7f80: 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c 3c 31 36  <24) | (p[1]<<16
7f90: 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29 20 7c 20  ) | (p[2]<<8) | 
7fa0: 70 5b 33 5d 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76  p[3];.#endif.}.v
7fb0: 6f 69 64 20 73 71 6c 69 74 65 33 50 75 74 34 62  oid sqlite3Put4b
7fc0: 79 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61  yte(unsigned cha
7fd0: 72 20 2a 70 2c 20 75 33 32 20 76 29 7b 0a 23 69  r *p, u32 v){.#i
7fe0: 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44  f SQLITE_BYTEORD
7ff0: 45 52 3d 3d 34 33 32 31 0a 20 20 6d 65 6d 63 70  ER==4321.  memcp
8000: 79 28 70 2c 26 76 2c 34 29 3b 0a 23 65 6c 69 66  y(p,&v,4);.#elif
8010: 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45   SQLITE_BYTEORDE
8020: 52 3d 3d 31 32 33 34 20 26 26 20 47 43 43 5f 56  R==1234 && GCC_V
8030: 45 52 53 49 4f 4e 3e 3d 34 30 30 33 30 30 30 0a  ERSION>=4003000.
8040: 20 20 75 33 32 20 78 20 3d 20 5f 5f 62 75 69 6c    u32 x = __buil
8050: 74 69 6e 5f 62 73 77 61 70 33 32 28 76 29 3b 0a  tin_bswap32(v);.
8060: 20 20 6d 65 6d 63 70 79 28 70 2c 26 78 2c 34 29    memcpy(p,&x,4)
8070: 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 42  ;.#elif SQLITE_B
8080: 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 20 26  YTEORDER==1234 &
8090: 26 20 4d 53 56 43 5f 56 45 52 53 49 4f 4e 3e 3d  & MSVC_VERSION>=
80a0: 31 33 30 30 0a 20 20 75 33 32 20 78 20 3d 20 5f  1300.  u32 x = _
80b0: 62 79 74 65 73 77 61 70 5f 75 6c 6f 6e 67 28 76  byteswap_ulong(v
80c0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2c 26 78  );.  memcpy(p,&x
80d0: 2c 34 29 3b 0a 23 65 6c 73 65 0a 20 20 70 5b 30  ,4);.#else.  p[0
80e0: 5d 20 3d 20 28 75 38 29 28 76 3e 3e 32 34 29 3b  ] = (u8)(v>>24);
80f0: 0a 20 20 70 5b 31 5d 20 3d 20 28 75 38 29 28 76  .  p[1] = (u8)(v
8100: 3e 3e 31 36 29 3b 0a 20 20 70 5b 32 5d 20 3d 20  >>16);.  p[2] = 
8110: 28 75 38 29 28 76 3e 3e 38 29 3b 0a 20 20 70 5b  (u8)(v>>8);.  p[
8120: 33 5d 20 3d 20 28 75 38 29 76 3b 0a 23 65 6e 64  3] = (u8)v;.#end
8130: 69 66 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  if.}..../*.** Tr
8140: 61 6e 73 6c 61 74 65 20 61 20 73 69 6e 67 6c 65  anslate a single
8150: 20 62 79 74 65 20 6f 66 20 48 65 78 20 69 6e 74   byte of Hex int
8160: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  o an integer..**
8170: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   This routine on
8180: 6c 79 20 77 6f 72 6b 73 20 69 66 20 68 20 72 65  ly works if h re
8190: 61 6c 6c 79 20 69 73 20 61 20 76 61 6c 69 64 20  ally is a valid 
81a0: 68 65 78 61 64 65 63 69 6d 61 6c 0a 2a 2a 20 63  hexadecimal.** c
81b0: 68 61 72 61 63 74 65 72 3a 20 20 30 2e 2e 39 61  haracter:  0..9a
81c0: 2e 2e 66 41 2e 2e 46 0a 2a 2f 0a 75 38 20 73 71  ..fA..F.*/.u8 sq
81d0: 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 69 6e  lite3HexToInt(in
81e0: 74 20 68 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t h){.  assert( 
81f0: 28 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39  (h>='0' && h<='9
8200: 27 29 20 7c 7c 20 20 28 68 3e 3d 27 61 27 20 26  ') ||  (h>='a' &
8210: 26 20 68 3c 3d 27 66 27 29 20 7c 7c 20 20 28 68  & h<='f') ||  (h
8220: 3e 3d 27 41 27 20 26 26 20 68 3c 3d 27 46 27 29  >='A' && h<='F')
8230: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
8240: 45 5f 41 53 43 49 49 0a 20 20 68 20 2b 3d 20 39  E_ASCII.  h += 9
8250: 2a 28 31 26 28 68 3e 3e 36 29 29 3b 0a 23 65 6e  *(1&(h>>6));.#en
8260: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
8270: 45 5f 45 42 43 44 49 43 0a 20 20 68 20 2b 3d 20  E_EBCDIC.  h += 
8280: 39 2a 28 31 26 7e 28 68 3e 3e 34 29 29 3b 0a 23  9*(1&~(h>>4));.#
8290: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 28  endif.  return (
82a0: 75 38 29 28 68 20 26 20 30 78 66 29 3b 0a 7d 0a  u8)(h & 0xf);.}.
82b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
82c0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
82d0: 49 54 45 52 41 4c 29 20 7c 7c 20 64 65 66 69 6e  ITERAL) || defin
82e0: 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
82f0: 44 45 43 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  DEC)./*.** Conve
8300: 72 74 20 61 20 42 4c 4f 42 20 6c 69 74 65 72 61  rt a BLOB litera
8310: 6c 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78  l of the form "x
8320: 27 68 68 68 68 68 68 27 22 20 69 6e 74 6f 20 69  'hhhhhh'" into i
8330: 74 73 20 62 69 6e 61 72 79 0a 2a 2a 20 76 61 6c  ts binary.** val
8340: 75 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ue.  Return a po
8350: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 62 69 6e  inter to its bin
8360: 61 72 79 20 76 61 6c 75 65 2e 20 20 53 70 61 63  ary value.  Spac
8370: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  e to hold the.**
8380: 20 62 69 6e 61 72 79 20 76 61 6c 75 65 20 68 61   binary value ha
8390: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
83a0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
83b0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
83c0: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  .** the calling 
83d0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64  routine..*/.void
83e0: 20 2a 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c   *sqlite3HexToBl
83f0: 6f 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ob(sqlite3 *db, 
8400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
8410: 6e 74 20 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a  nt n){.  char *z
8420: 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Blob;.  int i;..
8430: 20 20 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72 20    zBlob = (char 
8440: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
8450: 63 52 61 77 4e 4e 28 64 62 2c 20 6e 2f 32 20 2b  cRawNN(db, n/2 +
8460: 20 31 29 3b 0a 20 20 6e 2d 2d 3b 0a 20 20 69 66   1);.  n--;.  if
8470: 28 20 7a 42 6c 6f 62 20 29 7b 0a 20 20 20 20 66  ( zBlob ){.    f
8480: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 3d  or(i=0; i<n; i+=
8490: 32 29 7b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 5b  2){.      zBlob[
84a0: 69 2f 32 5d 20 3d 20 28 73 71 6c 69 74 65 33 48  i/2] = (sqlite3H
84b0: 65 78 54 6f 49 6e 74 28 7a 5b 69 5d 29 3c 3c 34  exToInt(z[i])<<4
84c0: 29 20 7c 20 73 71 6c 69 74 65 33 48 65 78 54 6f  ) | sqlite3HexTo
84d0: 49 6e 74 28 7a 5b 69 2b 31 5d 29 3b 0a 20 20 20  Int(z[i+1]);.   
84e0: 20 7d 0a 20 20 20 20 7a 42 6c 6f 62 5b 69 2f 32   }.    zBlob[i/2
84f0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  ] = 0;.  }.  ret
8500: 75 72 6e 20 7a 42 6c 6f 62 3b 0a 7d 0a 23 65 6e  urn zBlob;.}.#en
8510: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
8520: 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
8530: 20 7c 7c 20 53 51 4c 49 54 45 5f 48 41 53 5f 43   || SQLITE_HAS_C
8540: 4f 44 45 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c  ODEC */../*.** L
8550: 6f 67 20 61 6e 20 65 72 72 6f 72 20 74 68 61 74  og an error that
8560: 20 69 73 20 61 6e 20 41 50 49 20 63 61 6c 6c 20   is an API call 
8570: 6f 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  on a connection 
8580: 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
8590: 75 6c 64 0a 2a 2a 20 6e 6f 74 20 68 61 76 65 20  uld.** not have 
85a0: 62 65 65 6e 20 75 73 65 64 2e 20 20 54 68 65 20  been used.  The 
85b0: 22 74 79 70 65 22 20 6f 66 20 63 6f 6e 6e 65 63  "type" of connec
85c0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20  tion pointer is 
85d0: 67 69 76 65 6e 20 61 73 20 74 68 65 0a 2a 2a 20  given as the.** 
85e0: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 7a  argument.  The z
85f0: 54 79 70 65 20 69 73 20 61 20 77 6f 72 64 20 6c  Type is a word l
8600: 69 6b 65 20 22 4e 55 4c 4c 22 20 6f 72 20 22 63  ike "NULL" or "c
8610: 6c 6f 73 65 64 22 20 6f 72 20 22 69 6e 76 61 6c  losed" or "inval
8620: 69 64 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id"..*/.static v
8630: 6f 69 64 20 6c 6f 67 42 61 64 43 6f 6e 6e 65 63  oid logBadConnec
8640: 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  tion(const char 
8650: 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  *zType){.  sqlit
8660: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49  e3_log(SQLITE_MI
8670: 53 55 53 45 2c 20 0a 20 20 20 20 20 22 41 50 49  SUSE, .     "API
8680: 20 63 61 6c 6c 20 77 69 74 68 20 25 73 20 64 61   call with %s da
8690: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
86a0: 6e 20 70 6f 69 6e 74 65 72 22 2c 0a 20 20 20 20  n pointer",.    
86b0: 20 7a 54 79 70 65 0a 20 20 29 3b 0a 7d 0a 0a 2f   zType.  );.}../
86c0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61  *.** Check to ma
86d0: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
86e0: 61 20 76 61 6c 69 64 20 64 62 20 70 6f 69 6e 74  a valid db point
86f0: 65 72 2e 20 20 54 68 69 73 20 74 65 73 74 20 69  er.  This test i
8700: 73 20 6e 6f 74 0a 2a 2a 20 66 6f 6f 6c 70 72 6f  s not.** foolpro
8710: 6f 66 20 62 75 74 20 69 74 20 64 6f 65 73 20 70  of but it does p
8720: 72 6f 76 69 64 65 20 73 6f 6d 65 20 6d 65 61 73  rovide some meas
8730: 75 72 65 20 6f 66 20 70 72 6f 74 65 63 74 69 6f  ure of protectio
8740: 6e 20 61 67 61 69 6e 73 74 0a 2a 2a 20 6d 69 73  n against.** mis
8750: 75 73 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72  use of the inter
8760: 66 61 63 65 20 73 75 63 68 20 61 73 20 70 61 73  face such as pas
8770: 73 69 6e 67 20 69 6e 20 64 62 20 70 6f 69 6e 74  sing in db point
8780: 65 72 73 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  ers that are.** 
8790: 4e 55 4c 4c 20 6f 72 20 77 68 69 63 68 20 68 61  NULL or which ha
87a0: 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ve been previous
87b0: 6c 79 20 63 6c 6f 73 65 64 2e 20 20 49 66 20 74  ly closed.  If t
87c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
87d0: 72 6e 73 0a 2a 2a 20 31 20 69 74 20 6d 65 61 6e  rns.** 1 it mean
87e0: 73 20 74 68 61 74 20 74 68 65 20 64 62 20 70 6f  s that the db po
87f0: 69 6e 74 65 72 20 69 73 20 76 61 6c 69 64 20 61  inter is valid a
8800: 6e 64 20 30 20 69 66 20 69 74 20 73 68 6f 75 6c  nd 0 if it shoul
8810: 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 64 65 72 65  d not be.** dere
8820: 66 65 72 65 6e 63 65 64 20 66 6f 72 20 61 6e 79  ferenced for any
8830: 20 72 65 61 73 6f 6e 2e 20 20 54 68 65 20 63 61   reason.  The ca
8840: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73  lling function s
8850: 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 0a 2a 2a 20  hould invoke.** 
8860: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 6d  SQLITE_MISUSE im
8870: 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  mediately..**.**
8880: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68   sqlite3SafetyCh
8890: 65 63 6b 4f 6b 28 29 20 72 65 71 75 69 72 65 73  eckOk() requires
88a0: 20 74 68 61 74 20 74 68 65 20 64 62 20 70 6f 69   that the db poi
88b0: 6e 74 65 72 20 62 65 20 76 61 6c 69 64 20 66 6f  nter be valid fo
88c0: 72 0a 2a 2a 20 75 73 65 2e 20 20 73 71 6c 69 74  r.** use.  sqlit
88d0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
88e0: 6b 4f 72 4f 6b 28 29 20 61 6c 6c 6f 77 73 20 61  kOrOk() allows a
88f0: 20 64 62 20 70 6f 69 6e 74 65 72 20 74 68 61 74   db pointer that
8900: 20 66 61 69 6c 65 64 20 74 6f 0a 2a 2a 20 6f 70   failed to.** op
8910: 65 6e 20 70 72 6f 70 65 72 6c 79 20 61 6e 64 20  en properly and 
8920: 69 73 20 6e 6f 74 20 66 69 74 20 66 6f 72 20 67  is not fit for g
8930: 65 6e 65 72 61 6c 20 75 73 65 20 62 75 74 20 77  eneral use but w
8940: 68 69 63 68 20 63 61 6e 20 62 65 0a 2a 2a 20 75  hich can be.** u
8950: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
8960: 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72  nt to sqlite3_er
8970: 72 6d 73 67 28 29 20 6f 72 20 73 71 6c 69 74 65  rmsg() or sqlite
8980: 33 5f 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 69 6e  3_close()..*/.in
8990: 74 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43  t sqlite3SafetyC
89a0: 68 65 63 6b 4f 6b 28 73 71 6c 69 74 65 33 20 2a  heckOk(sqlite3 *
89b0: 64 62 29 7b 0a 20 20 75 33 32 20 6d 61 67 69 63  db){.  u32 magic
89c0: 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 7b  ;.  if( db==0 ){
89d0: 0a 20 20 20 20 6c 6f 67 42 61 64 43 6f 6e 6e 65  .    logBadConne
89e0: 63 74 69 6f 6e 28 22 4e 55 4c 4c 22 29 3b 0a 20  ction("NULL");. 
89f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8a00: 0a 20 20 6d 61 67 69 63 20 3d 20 64 62 2d 3e 6d  .  magic = db->m
8a10: 61 67 69 63 3b 0a 20 20 69 66 28 20 6d 61 67 69  agic;.  if( magi
8a20: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
8a30: 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 66 28 20  OPEN ){.    if( 
8a40: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
8a50: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
8a60: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
8a70: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
8a80: 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
8a90: 0a 20 20 20 20 20 20 6c 6f 67 42 61 64 43 6f 6e  .      logBadCon
8aa0: 6e 65 63 74 69 6f 6e 28 22 75 6e 6f 70 65 6e 65  nection("unopene
8ab0: 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  d");.    }.    r
8ac0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
8ad0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
8ae0: 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65    }.}.int sqlite
8af0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
8b00: 4f 72 4f 6b 28 73 71 6c 69 74 65 33 20 2a 64 62  OrOk(sqlite3 *db
8b10: 29 7b 0a 20 20 75 33 32 20 6d 61 67 69 63 3b 0a  ){.  u32 magic;.
8b20: 20 20 6d 61 67 69 63 20 3d 20 64 62 2d 3e 6d 61    magic = db->ma
8b30: 67 69 63 3b 0a 20 20 69 66 28 20 6d 61 67 69 63  gic;.  if( magic
8b40: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53  !=SQLITE_MAGIC_S
8b50: 49 43 4b 20 26 26 0a 20 20 20 20 20 20 6d 61 67  ICK &&.      mag
8b60: 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic!=SQLITE_MAGIC
8b70: 5f 4f 50 45 4e 20 26 26 0a 20 20 20 20 20 20 6d  _OPEN &&.      m
8b80: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
8b90: 49 43 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 74  IC_BUSY ){.    t
8ba0: 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
8bb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
8bc0: 67 21 3d 30 20 29 3b 0a 20 20 20 20 6c 6f 67 42  g!=0 );.    logB
8bd0: 61 64 43 6f 6e 6e 65 63 74 69 6f 6e 28 22 69 6e  adConnection("in
8be0: 76 61 6c 69 64 22 29 3b 0a 20 20 20 20 72 65 74  valid");.    ret
8bf0: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
8c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8c10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
8c20: 70 74 20 74 6f 20 61 64 64 2c 20 73 75 62 73 74  pt to add, subst
8c30: 72 61 63 74 2c 20 6f 72 20 6d 75 6c 74 69 70 6c  ract, or multipl
8c40: 79 20 74 68 65 20 36 34 2d 62 69 74 20 73 69 67  y the 64-bit sig
8c50: 6e 65 64 20 76 61 6c 75 65 20 69 42 20 61 67 61  ned value iB aga
8c60: 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6f 74 68 65  inst.** the othe
8c70: 72 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20  r 64-bit signed 
8c80: 69 6e 74 65 67 65 72 20 61 74 20 2a 70 41 20 61  integer at *pA a
8c90: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
8ca0: 75 6c 74 20 69 6e 20 2a 70 41 2e 0a 2a 2a 20 52  ult in *pA..** R
8cb0: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
8cc0: 73 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20 6f  ss.  Or if the o
8cd0: 70 65 72 61 74 69 6f 6e 20 77 6f 75 6c 64 20 68  peration would h
8ce0: 61 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ave resulted in 
8cf0: 61 6e 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 2c 20  an.** overflow, 
8d00: 6c 65 61 76 65 20 2a 70 41 20 75 6e 63 68 61 6e  leave *pA unchan
8d10: 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 31  ged and return 1
8d20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8d30: 41 64 64 49 6e 74 36 34 28 69 36 34 20 2a 70 41  AddInt64(i64 *pA
8d40: 2c 20 69 36 34 20 69 42 29 7b 0a 23 69 66 20 47  , i64 iB){.#if G
8d50: 43 43 5f 56 45 52 53 49 4f 4e 3e 3d 35 30 30 34  CC_VERSION>=5004
8d60: 30 30 30 20 26 26 20 21 64 65 66 69 6e 65 64 28  000 && !defined(
8d70: 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52  __INTEL_COMPILER
8d80: 29 0a 20 20 72 65 74 75 72 6e 20 5f 5f 62 75 69  ).  return __bui
8d90: 6c 74 69 6e 5f 61 64 64 5f 6f 76 65 72 66 6c 6f  ltin_add_overflo
8da0: 77 28 2a 70 41 2c 20 69 42 2c 20 70 41 29 3b 0a  w(*pA, iB, pA);.
8db0: 23 65 6c 73 65 0a 20 20 69 36 34 20 69 41 20 3d  #else.  i64 iA =
8dc0: 20 2a 70 41 3b 0a 20 20 74 65 73 74 63 61 73 65   *pA;.  testcase
8dd0: 28 20 69 41 3d 3d 30 20 29 3b 20 74 65 73 74 63  ( iA==0 ); testc
8de0: 61 73 65 28 20 69 41 3d 3d 31 20 29 3b 0a 20 20  ase( iA==1 );.  
8df0: 74 65 73 74 63 61 73 65 28 20 69 42 3d 3d 2d 31  testcase( iB==-1
8e00: 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 69 42   ); testcase( iB
8e10: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 42 3e  ==0 );.  if( iB>
8e20: 3d 30 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  =0 ){.    testca
8e30: 73 65 28 20 69 41 3e 30 20 26 26 20 4c 41 52 47  se( iA>0 && LARG
8e40: 45 53 54 5f 49 4e 54 36 34 20 2d 20 69 41 20 3d  EST_INT64 - iA =
8e50: 3d 20 69 42 20 29 3b 0a 20 20 20 20 74 65 73 74  = iB );.    test
8e60: 63 61 73 65 28 20 69 41 3e 30 20 26 26 20 4c 41  case( iA>0 && LA
8e70: 52 47 45 53 54 5f 49 4e 54 36 34 20 2d 20 69 41  RGEST_INT64 - iA
8e80: 20 3d 3d 20 69 42 20 2d 20 31 20 29 3b 0a 20 20   == iB - 1 );.  
8e90: 20 20 69 66 28 20 69 41 3e 30 20 26 26 20 4c 41    if( iA>0 && LA
8ea0: 52 47 45 53 54 5f 49 4e 54 36 34 20 2d 20 69 41  RGEST_INT64 - iA
8eb0: 20 3c 20 69 42 20 29 20 72 65 74 75 72 6e 20 31   < iB ) return 1
8ec0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
8ed0: 65 73 74 63 61 73 65 28 20 69 41 3c 30 20 26 26  estcase( iA<0 &&
8ee0: 20 2d 28 69 41 20 2b 20 4c 41 52 47 45 53 54 5f   -(iA + LARGEST_
8ef0: 49 4e 54 36 34 29 20 3d 3d 20 69 42 20 2b 20 31  INT64) == iB + 1
8f00: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8f10: 28 20 69 41 3c 30 20 26 26 20 2d 28 69 41 20 2b  ( iA<0 && -(iA +
8f20: 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 29 20   LARGEST_INT64) 
8f30: 3d 3d 20 69 42 20 2b 20 32 20 29 3b 0a 20 20 20  == iB + 2 );.   
8f40: 20 69 66 28 20 69 41 3c 30 20 26 26 20 2d 28 69   if( iA<0 && -(i
8f50: 41 20 2b 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  A + LARGEST_INT6
8f60: 34 29 20 3e 20 69 42 20 2b 20 31 20 29 20 72 65  4) > iB + 1 ) re
8f70: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 2a 70  turn 1;.  }.  *p
8f80: 41 20 2b 3d 20 69 42 3b 0a 20 20 72 65 74 75 72  A += iB;.  retur
8f90: 6e 20 30 3b 20 0a 23 65 6e 64 69 66 0a 7d 0a 69  n 0; .#endif.}.i
8fa0: 6e 74 20 73 71 6c 69 74 65 33 53 75 62 49 6e 74  nt sqlite3SubInt
8fb0: 36 34 28 69 36 34 20 2a 70 41 2c 20 69 36 34 20  64(i64 *pA, i64 
8fc0: 69 42 29 7b 0a 23 69 66 20 47 43 43 5f 56 45 52  iB){.#if GCC_VER
8fd0: 53 49 4f 4e 3e 3d 35 30 30 34 30 30 30 20 26 26  SION>=5004000 &&
8fe0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e 54 45   !defined(__INTE
8ff0: 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 20 20 72 65  L_COMPILER).  re
9000: 74 75 72 6e 20 5f 5f 62 75 69 6c 74 69 6e 5f 73  turn __builtin_s
9010: 75 62 5f 6f 76 65 72 66 6c 6f 77 28 2a 70 41 2c  ub_overflow(*pA,
9020: 20 69 42 2c 20 70 41 29 3b 0a 23 65 6c 73 65 0a   iB, pA);.#else.
9030: 20 20 74 65 73 74 63 61 73 65 28 20 69 42 3d 3d    testcase( iB==
9040: 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 2b 31  SMALLEST_INT64+1
9050: 20 29 3b 0a 20 20 69 66 28 20 69 42 3d 3d 53 4d   );.  if( iB==SM
9060: 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 7b 0a  ALLEST_INT64 ){.
9070: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 2a      testcase( (*
9080: 70 41 29 3d 3d 28 2d 31 29 20 29 3b 20 74 65 73  pA)==(-1) ); tes
9090: 74 63 61 73 65 28 20 28 2a 70 41 29 3d 3d 30 20  tcase( (*pA)==0 
90a0: 29 3b 0a 20 20 20 20 69 66 28 20 28 2a 70 41 29  );.    if( (*pA)
90b0: 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  >=0 ) return 1;.
90c0: 20 20 20 20 2a 70 41 20 2d 3d 20 69 42 3b 0a 20      *pA -= iB;. 
90d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
90e0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
90f0: 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34   sqlite3AddInt64
9100: 28 70 41 2c 20 2d 69 42 29 3b 0a 20 20 7d 0a 23  (pA, -iB);.  }.#
9110: 65 6e 64 69 66 0a 7d 0a 69 6e 74 20 73 71 6c 69  endif.}.int sqli
9120: 74 65 33 4d 75 6c 49 6e 74 36 34 28 69 36 34 20  te3MulInt64(i64 
9130: 2a 70 41 2c 20 69 36 34 20 69 42 29 7b 0a 23 69  *pA, i64 iB){.#i
9140: 66 20 47 43 43 5f 56 45 52 53 49 4f 4e 3e 3d 35  f GCC_VERSION>=5
9150: 30 30 34 30 30 30 20 26 26 20 21 64 65 66 69 6e  004000 && !defin
9160: 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49  ed(__INTEL_COMPI
9170: 4c 45 52 29 0a 20 20 72 65 74 75 72 6e 20 5f 5f  LER).  return __
9180: 62 75 69 6c 74 69 6e 5f 6d 75 6c 5f 6f 76 65 72  builtin_mul_over
9190: 66 6c 6f 77 28 2a 70 41 2c 20 69 42 2c 20 70 41  flow(*pA, iB, pA
91a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 36 34 20 69  );.#else.  i64 i
91b0: 41 20 3d 20 2a 70 41 3b 0a 20 20 69 66 28 20 69  A = *pA;.  if( i
91c0: 42 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  B>0 ){.    if( i
91d0: 41 3e 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2f  A>LARGEST_INT64/
91e0: 69 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  iB ) return 1;. 
91f0: 20 20 20 69 66 28 20 69 41 3c 53 4d 41 4c 4c 45     if( iA<SMALLE
9200: 53 54 5f 49 4e 54 36 34 2f 69 42 20 29 20 72 65  ST_INT64/iB ) re
9210: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 20  turn 1;.  }else 
9220: 69 66 28 20 69 42 3c 30 20 29 7b 0a 20 20 20 20  if( iB<0 ){.    
9230: 69 66 28 20 69 41 3e 30 20 29 7b 0a 20 20 20 20  if( iA>0 ){.    
9240: 20 20 69 66 28 20 69 42 3c 53 4d 41 4c 4c 45 53    if( iB<SMALLES
9250: 54 5f 49 4e 54 36 34 2f 69 41 20 29 20 72 65 74  T_INT64/iA ) ret
9260: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 1;.    }else
9270: 20 69 66 28 20 69 41 3c 30 20 29 7b 0a 20 20 20   if( iA<0 ){.   
9280: 20 20 20 69 66 28 20 69 42 3d 3d 53 4d 41 4c 4c     if( iB==SMALL
9290: 45 53 54 5f 49 4e 54 36 34 20 29 20 72 65 74 75  EST_INT64 ) retu
92a0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 1;.      if( 
92b0: 69 41 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  iA==SMALLEST_INT
92c0: 36 34 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  64 ) return 1;. 
92d0: 20 20 20 20 20 69 66 28 20 2d 69 41 3e 4c 41 52       if( -iA>LAR
92e0: 47 45 53 54 5f 49 4e 54 36 34 2f 2d 69 42 20 29  GEST_INT64/-iB )
92f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
9300: 0a 20 20 7d 0a 20 20 2a 70 41 20 3d 20 69 41 2a  .  }.  *pA = iA*
9310: 69 42 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  iB;.  return 0;.
9320: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
9330: 43 6f 6d 70 75 74 65 20 74 68 65 20 61 62 73 6f  Compute the abso
9340: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 61 20  lute value of a 
9350: 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  32-bit signed in
9360: 74 65 67 65 72 2c 20 6f 66 20 70 6f 73 73 69 62  teger, of possib
9370: 6c 65 2e 20 20 4f 72 20 0a 2a 2a 20 69 66 20 74  le.  Or .** if t
9380: 68 65 20 69 6e 74 65 67 65 72 20 68 61 73 20 61  he integer has a
9390: 20 76 61 6c 75 65 20 6f 66 20 2d 32 31 34 37 34   value of -21474
93a0: 38 33 36 34 38 2c 20 72 65 74 75 72 6e 20 2b 32  83648, return +2
93b0: 31 34 37 34 38 33 36 34 37 0a 2a 2f 0a 69 6e 74  147483647.*/.int
93c0: 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
93d0: 28 69 6e 74 20 78 29 7b 0a 20 20 69 66 28 20 78  (int x){.  if( x
93e0: 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 78 3b 0a  >=0 ) return x;.
93f0: 20 20 69 66 28 20 78 3d 3d 28 69 6e 74 29 30 78    if( x==(int)0x
9400: 38 30 30 30 30 30 30 30 20 29 20 72 65 74 75 72  80000000 ) retur
9410: 6e 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  n 0x7fffffff;.  
9420: 72 65 74 75 72 6e 20 2d 78 3b 0a 7d 0a 0a 23 69  return -x;.}..#i
9430: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9440: 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 2f 2a 0a  LE_8_3_NAMES./*.
9450: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41  ** If SQLITE_ENA
9460: 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73  BLE_8_3_NAMES is
9470: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
9480: 74 69 6d 65 20 61 6e 64 20 69 66 20 74 68 65 20  time and if the 
9490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
94a0: 6e 61 6d 65 20 69 6e 20 7a 42 61 73 65 46 69 6c  name in zBaseFil
94b0: 65 6e 61 6d 65 20 69 73 20 61 20 55 52 49 20 77  ename is a URI w
94c0: 69 74 68 20 74 68 65 20 22 38 5f 33 5f 6e 61 6d  ith the "8_3_nam
94d0: 65 73 3d 31 22 20 70 61 72 61 6d 65 74 65 72 20  es=1" parameter 
94e0: 61 6e 64 0a 2a 2a 20 69 66 20 66 69 6c 65 6e 61  and.** if filena
94f0: 6d 65 20 69 6e 20 7a 5b 5d 20 68 61 73 20 61 20  me in z[] has a 
9500: 73 75 66 66 69 78 20 28 61 2e 6b 2e 61 2e 20 22  suffix (a.k.a. "
9510: 65 78 74 65 6e 73 69 6f 6e 22 29 20 74 68 61 74  extension") that
9520: 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a   is longer than.
9530: 2a 2a 20 74 68 72 65 65 20 63 68 61 72 61 63 74  ** three charact
9540: 65 72 73 2c 20 74 68 65 6e 20 73 68 6f 72 74 65  ers, then shorte
9550: 6e 20 74 68 65 20 73 75 66 66 69 78 20 6f 6e 20  n the suffix on 
9560: 7a 5b 5d 20 74 6f 20 62 65 20 74 68 65 20 6c 61  z[] to be the la
9570: 73 74 20 74 68 72 65 65 0a 2a 2a 20 63 68 61 72  st three.** char
9580: 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 6f 72  acters of the or
9590: 69 67 69 6e 61 6c 20 73 75 66 66 69 78 2e 0a 2a  iginal suffix..*
95a0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45  *.** If SQLITE_E
95b0: 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
95c0: 69 73 20 73 65 74 20 74 6f 20 32 20 61 74 20 63  is set to 2 at c
95d0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20 74 68 65  ompile-time, the
95e0: 6e 20 61 6c 77 61 79 73 0a 2a 2a 20 64 6f 20 74  n always.** do t
95f0: 68 65 20 73 75 66 66 69 78 20 73 68 6f 72 74 65  he suffix shorte
9600: 6e 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ning regardless 
9610: 6f 66 20 55 52 49 20 70 61 72 61 6d 65 74 65 72  of URI parameter
9620: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ..**.** Examples
9630: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 74 65 73 74  :.**.**     test
9640: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 3d  .db-journal    =
9650: 3e 20 20 20 74 65 73 74 2e 6e 61 6c 0a 2a 2a 20  >   test.nal.** 
9660: 20 20 20 20 74 65 73 74 2e 64 62 2d 77 61 6c 20      test.db-wal 
9670: 20 20 20 20 20 20 20 3d 3e 20 20 20 74 65 73 74         =>   test
9680: 2e 77 61 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74  .wal.**     test
9690: 2e 64 62 2d 73 68 6d 20 20 20 20 20 20 20 20 3d  .db-shm        =
96a0: 3e 20 20 20 74 65 73 74 2e 73 68 6d 0a 2a 2a 20  >   test.shm.** 
96b0: 20 20 20 20 74 65 73 74 2e 64 62 2d 6d 6a 37 66      test.db-mj7f
96c0: 33 33 31 39 66 61 20 3d 3e 20 20 20 74 65 73 74  3319fa =>   test
96d0: 2e 39 66 61 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  .9fa.*/.void sql
96e0: 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
96f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73  const char *zBas
9700: 65 46 69 6c 65 6e 61 6d 65 2c 20 63 68 61 72 20  eFilename, char 
9710: 2a 7a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  *z){.#if SQLITE_
9720: 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
9730: 3c 32 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  <2.  if( sqlite3
9740: 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 42 61  _uri_boolean(zBa
9750: 73 65 46 69 6c 65 6e 61 6d 65 2c 20 22 38 5f 33  seFilename, "8_3
9760: 5f 6e 61 6d 65 73 22 2c 20 30 29 20 29 0a 23 65  _names", 0) ).#e
9770: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 6e 74  ndif.  {.    int
9780: 20 69 2c 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d   i, sz;.    sz =
9790: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
97a0: 28 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73  (z);.    for(i=s
97b0: 7a 2d 31 3b 20 69 3e 30 20 26 26 20 7a 5b 69 5d  z-1; i>0 && z[i]
97c0: 21 3d 27 2f 27 20 26 26 20 7a 5b 69 5d 21 3d 27  !='/' && z[i]!='
97d0: 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 69  .'; i--){}.    i
97e0: 66 28 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26 20  f( z[i]=='.' && 
97f0: 41 4c 57 41 59 53 28 73 7a 3e 69 2b 34 29 20 29  ALWAYS(sz>i+4) )
9800: 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b 31 5d   memmove(&z[i+1]
9810: 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29 3b 0a  , &z[sz-3], 4);.
9820: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
9830: 20 0a 2a 2a 20 46 69 6e 64 20 28 61 6e 20 61 70   .** Find (an ap
9840: 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20 6f  proximate) sum o
9850: 66 20 74 77 6f 20 4c 6f 67 45 73 74 20 76 61 6c  f two LogEst val
9860: 75 65 73 2e 20 20 54 68 69 73 20 63 6f 6d 70 75  ues.  This compu
9870: 74 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74  tation is.** not
9880: 20 61 20 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70   a simple "+" op
9890: 65 72 61 74 6f 72 20 62 65 63 61 75 73 65 20 4c  erator because L
98a0: 6f 67 45 73 74 20 69 73 20 73 74 6f 72 65 64 20  ogEst is stored 
98b0: 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69 63  as a logarithmic
98c0: 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a 2a  .** value..** .*
98d0: 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69 74 65 33  /.LogEst sqlite3
98e0: 4c 6f 67 45 73 74 41 64 64 28 4c 6f 67 45 73 74  LogEstAdd(LogEst
98f0: 20 61 2c 20 4c 6f 67 45 73 74 20 62 29 7b 0a 20   a, LogEst b){. 
9900: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
9910: 73 69 67 6e 65 64 20 63 68 61 72 20 78 5b 5d 20  signed char x[] 
9920: 3d 20 7b 0a 20 20 20 20 20 31 30 2c 20 31 30 2c  = {.     10, 10,
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9940: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 2c 31 20           /* 0,1 
9950: 2a 2f 0a 20 20 20 20 20 20 39 2c 20 39 2c 20 20  */.      9, 9,  
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9970: 20 20 20 20 20 20 20 20 2f 2a 20 32 2c 33 20 2a          /* 2,3 *
9980: 2f 0a 20 20 20 20 20 20 38 2c 20 38 2c 20 20 20  /.      8, 8,   
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 20 20 20 20 20 20 20 2f 2a 20 34 2c 35 20 2a 2f         /* 4,5 */
99b0: 0a 20 20 20 20 20 20 37 2c 20 37 2c 20 37 2c 20  .      7, 7, 7, 
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 20 20 20 2f 2a 20 36 2c 37 2c 38 20 2a        /* 6,7,8 *
99e0: 2f 0a 20 20 20 20 20 20 36 2c 20 36 2c 20 36 2c  /.      6, 6, 6,
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 20 20 20 20 2f 2a 20 39 2c 31 30 2c 31         /* 9,10,1
9a10: 31 20 2a 2f 0a 20 20 20 20 20 20 35 2c 20 35 2c  1 */.      5, 5,
9a20: 20 35 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   5,             
9a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32 2d            /* 12-
9a40: 31 34 20 2a 2f 0a 20 20 20 20 20 20 34 2c 20 34  14 */.      4, 4
9a50: 2c 20 34 2c 20 34 2c 20 20 20 20 20 20 20 20 20  , 4, 4,         
9a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 35             /* 15
9a70: 2d 31 38 20 2a 2f 0a 20 20 20 20 20 20 33 2c 20  -18 */.      3, 
9a80: 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 20  3, 3, 3, 3, 3,  
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
9aa0: 39 2d 32 34 20 2a 2f 0a 20 20 20 20 20 20 32 2c  9-24 */.      2,
9ab0: 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20   2, 2, 2, 2, 2, 
9ac0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2,           /* 
9ad0: 32 35 2d 33 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20  25-31 */.  };.  
9ae0: 69 66 28 20 61 3e 3d 62 20 29 7b 0a 20 20 20 20  if( a>=b ){.    
9af0: 69 66 28 20 61 3e 62 2b 34 39 20 29 20 72 65 74  if( a>b+49 ) ret
9b00: 75 72 6e 20 61 3b 0a 20 20 20 20 69 66 28 20 61  urn a;.    if( a
9b10: 3e 62 2b 33 31 20 29 20 72 65 74 75 72 6e 20 61  >b+31 ) return a
9b20: 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  +1;.    return a
9b30: 2b 78 5b 61 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65  +x[a-b];.  }else
9b40: 7b 0a 20 20 20 20 69 66 28 20 62 3e 61 2b 34 39  {.    if( b>a+49
9b50: 20 29 20 72 65 74 75 72 6e 20 62 3b 0a 20 20 20   ) return b;.   
9b60: 20 69 66 28 20 62 3e 61 2b 33 31 20 29 20 72 65   if( b>a+31 ) re
9b70: 74 75 72 6e 20 62 2b 31 3b 0a 20 20 20 20 72 65  turn b+1;.    re
9b80: 74 75 72 6e 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20  turn b+x[b-a];. 
9b90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76   }.}../*.** Conv
9ba0: 65 72 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69  ert an integer i
9bb0: 6e 74 6f 20 61 20 4c 6f 67 45 73 74 2e 20 20 49  nto a LogEst.  I
9bc0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63  n other words, c
9bd0: 6f 6d 70 75 74 65 20 61 6e 0a 2a 2a 20 61 70 70  ompute an.** app
9be0: 72 6f 78 69 6d 61 74 69 6f 6e 20 66 6f 72 20 31  roximation for 1
9bf0: 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a 4c 6f  0*log2(x)..*/.Lo
9c00: 67 45 73 74 20 73 71 6c 69 74 65 33 4c 6f 67 45  gEst sqlite3LogE
9c10: 73 74 28 75 36 34 20 78 29 7b 0a 20 20 73 74 61  st(u64 x){.  sta
9c20: 74 69 63 20 4c 6f 67 45 73 74 20 61 5b 5d 20 3d  tic LogEst a[] =
9c30: 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35 2c 20 36   { 0, 2, 3, 5, 6
9c40: 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a 20 20 4c  , 7, 8, 9 };.  L
9c50: 6f 67 45 73 74 20 79 20 3d 20 34 30 3b 0a 20 20  ogEst y = 40;.  
9c60: 69 66 28 20 78 3c 38 20 29 7b 0a 20 20 20 20 69  if( x<8 ){.    i
9c70: 66 28 20 78 3c 32 20 29 20 72 65 74 75 72 6e 20  f( x<2 ) return 
9c80: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3c  0;.    while( x<
9c90: 38 20 29 7b 20 20 79 20 2d 3d 20 31 30 3b 20 78  8 ){  y -= 10; x
9ca0: 20 3c 3c 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c 73   <<= 1; }.  }els
9cb0: 65 7b 0a 23 69 66 20 47 43 43 5f 56 45 52 53 49  e{.#if GCC_VERSI
9cc0: 4f 4e 3e 3d 35 30 30 34 30 30 30 0a 20 20 20 20  ON>=5004000.    
9cd0: 69 6e 74 20 69 20 3d 20 36 30 20 2d 20 5f 5f 62  int i = 60 - __b
9ce0: 75 69 6c 74 69 6e 5f 63 6c 7a 6c 6c 28 78 29 3b  uiltin_clzll(x);
9cf0: 0a 20 20 20 20 79 20 2b 3d 20 69 2a 31 30 3b 0a  .    y += i*10;.
9d00: 20 20 20 20 78 20 3e 3e 3d 20 69 3b 0a 23 65 6c      x >>= i;.#el
9d10: 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e  se.    while( x>
9d20: 32 35 35 20 29 7b 20 79 20 2b 3d 20 34 30 3b 20  255 ){ y += 40; 
9d30: 78 20 3e 3e 3d 20 34 3b 20 7d 20 20 2f 2a 4f 50  x >>= 4; }  /*OP
9d40: 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52  TIMIZATION-IF-TR
9d50: 55 45 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  UE*/.    while( 
9d60: 78 3e 31 35 20 29 7b 20 20 79 20 2b 3d 20 31 30  x>15 ){  y += 10
9d70: 3b 20 78 20 3e 3e 3d 20 31 3b 20 7d 0a 23 65 6e  ; x >>= 1; }.#en
9d80: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
9d90: 20 61 5b 78 26 37 5d 20 2b 20 79 20 2d 20 31 30   a[x&7] + y - 10
9da0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
9db0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
9dc0: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  TABLE./*.** Conv
9dd0: 65 72 74 20 61 20 64 6f 75 62 6c 65 20 69 6e 74  ert a double int
9de0: 6f 20 61 20 4c 6f 67 45 73 74 0a 2a 2a 20 49 6e  o a LogEst.** In
9df0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63 6f   other words, co
9e00: 6d 70 75 74 65 20 61 6e 20 61 70 70 72 6f 78 69  mpute an approxi
9e10: 6d 61 74 69 6f 6e 20 66 6f 72 20 31 30 2a 6c 6f  mation for 10*lo
9e20: 67 32 28 78 29 2e 0a 2a 2f 0a 4c 6f 67 45 73 74  g2(x)..*/.LogEst
9e30: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
9e40: 6f 6d 44 6f 75 62 6c 65 28 64 6f 75 62 6c 65 20  omDouble(double 
9e50: 78 29 7b 0a 20 20 75 36 34 20 61 3b 0a 20 20 4c  x){.  u64 a;.  L
9e60: 6f 67 45 73 74 20 65 3b 0a 20 20 61 73 73 65 72  ogEst e;.  asser
9e70: 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
9e80: 26 26 20 73 69 7a 65 6f 66 28 61 29 3d 3d 38 20  && sizeof(a)==8 
9e90: 29 3b 0a 20 20 69 66 28 20 78 3c 3d 31 20 29 20  );.  if( x<=1 ) 
9ea0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
9eb0: 78 3c 3d 32 30 30 30 30 30 30 30 30 30 20 29 20  x<=2000000000 ) 
9ec0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f  return sqlite3Lo
9ed0: 67 45 73 74 28 28 75 36 34 29 78 29 3b 0a 20 20  gEst((u64)x);.  
9ee0: 6d 65 6d 63 70 79 28 26 61 2c 20 26 78 2c 20 38  memcpy(&a, &x, 8
9ef0: 29 3b 0a 20 20 65 20 3d 20 28 61 3e 3e 35 32 29  );.  e = (a>>52)
9f00: 20 2d 20 31 30 32 32 3b 0a 20 20 72 65 74 75 72   - 1022;.  retur
9f10: 6e 20 65 2a 31 30 3b 0a 7d 0a 23 65 6e 64 69 66  n e*10;.}.#endif
9f20: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9f30: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
9f40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
9f50: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
9f60: 53 43 41 4e 53 54 41 54 55 53 29 20 7c 7c 20 5c  SCANSTATUS) || \
9f70: 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c  .    defined(SQL
9f80: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
9f90: 5f 4f 52 5f 53 54 41 54 34 29 20 7c 7c 20 5c 0a  _OR_STAT4) || \.
9fa0: 20 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49      defined(SQLI
9fb0: 54 45 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49 4d  TE_EXPLAIN_ESTIM
9fc0: 41 54 45 44 5f 52 4f 57 53 29 0a 2f 2a 0a 2a 2a  ATED_ROWS)./*.**
9fd0: 20 43 6f 6e 76 65 72 74 20 61 20 4c 6f 67 45 73   Convert a LogEs
9fe0: 74 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  t into an intege
9ff0: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  r..**.** Note th
a000: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  at this routine 
a010: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
a020: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
a030: 20 76 61 72 69 6f 75 73 0a 2a 2a 20 6e 6f 6e 2d   various.** non-
a040: 73 74 61 6e 64 61 72 64 20 63 6f 6d 70 69 6c 65  standard compile
a050: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 69 73  -time options is
a060: 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 75 36 34   enabled..*/.u64
a070: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
a080: 49 6e 74 28 4c 6f 67 45 73 74 20 78 29 7b 0a 20  Int(LogEst x){. 
a090: 20 75 36 34 20 6e 3b 0a 20 20 6e 20 3d 20 78 25   u64 n;.  n = x%
a0a0: 31 30 3b 0a 20 20 78 20 2f 3d 20 31 30 3b 0a 20  10;.  x /= 10;. 
a0b0: 20 69 66 28 20 6e 3e 3d 35 20 29 20 6e 20 2d 3d   if( n>=5 ) n -=
a0c0: 20 32 3b 0a 20 20 65 6c 73 65 20 69 66 28 20 6e   2;.  else if( n
a0d0: 3e 3d 31 20 29 20 6e 20 2d 3d 20 31 3b 0a 23 69  >=1 ) n -= 1;.#i
a0e0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
a0f0: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
a100: 4e 53 54 41 54 55 53 29 20 7c 7c 20 5c 0a 20 20  NSTATUS) || \.  
a110: 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45    defined(SQLITE
a120: 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49 4d 41 54  _EXPLAIN_ESTIMAT
a130: 45 44 5f 52 4f 57 53 29 0a 20 20 69 66 28 20 78  ED_ROWS).  if( x
a140: 3e 36 30 20 29 20 72 65 74 75 72 6e 20 28 75 36  >60 ) return (u6
a150: 34 29 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  4)LARGEST_INT64;
a160: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 6f  .#else.  /* If o
a170: 6e 6c 79 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  nly SQLITE_ENABL
a180: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
a190: 20 69 73 20 6f 6e 2c 20 74 68 65 6e 20 74 68 65   is on, then the
a1a0: 20 6c 61 72 67 65 73 74 20 69 6e 70 75 74 0a 20   largest input. 
a1b0: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   ** possible to 
a1c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a1d0: 33 31 30 2c 20 72 65 73 75 6c 74 69 6e 67 20 69  310, resulting i
a1e0: 6e 20 61 20 6d 61 78 69 6d 75 6d 20 78 20 6f 66  n a maximum x of
a1f0: 20 33 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   31 */.  assert(
a200: 20 78 3c 3d 36 30 20 29 3b 0a 23 65 6e 64 69 66   x<=60 );.#endif
a210: 0a 20 20 72 65 74 75 72 6e 20 78 3e 3d 33 20 3f  .  return x>=3 ?
a220: 20 28 6e 2b 38 29 3c 3c 28 78 2d 33 29 20 3a 20   (n+8)<<(x-3) : 
a230: 28 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d 0a  (n+8)>>(3-x);.}.
a240: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
a250: 64 20 53 43 41 4e 53 54 41 54 20 6f 72 20 53 54  d SCANSTAT or ST
a260: 41 54 34 20 6f 72 20 45 53 54 49 4d 41 54 45 44  AT4 or ESTIMATED
a270: 5f 52 4f 57 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _ROWS */../*.** 
a280: 41 64 64 20 61 20 6e 65 77 20 6e 61 6d 65 2f 6e  Add a new name/n
a290: 75 6d 62 65 72 20 70 61 69 72 20 74 6f 20 61 20  umber pair to a 
a2a0: 56 4c 69 73 74 2e 20 20 54 68 69 73 20 6d 69 67  VList.  This mig
a2b0: 68 74 20 72 65 71 75 69 72 65 20 74 68 61 74 20  ht require that 
a2c0: 74 68 65 0a 2a 2a 20 56 4c 69 73 74 20 6f 62 6a  the.** VList obj
a2d0: 65 63 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ect be reallocat
a2e0: 65 64 2c 20 73 6f 20 72 65 74 75 72 6e 20 74 68  ed, so return th
a2f0: 65 20 6e 65 77 20 56 4c 69 73 74 2e 20 20 49 66  e new VList.  If
a300: 20 61 6e 20 4f 4f 4d 0a 2a 2a 20 65 72 72 6f 72   an OOM.** error
a310: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6f 72 69   occurs, the ori
a320: 67 69 6e 61 6c 20 56 4c 69 73 74 20 72 65 74 75  ginal VList retu
a330: 72 6e 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rned and the.** 
a340: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a350: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a   flag is set..**
a360: 0a 2a 2a 20 41 20 56 4c 69 73 74 20 69 73 20 72  .** A VList is r
a370: 65 61 6c 6c 79 20 6a 75 73 74 20 61 6e 20 61 72  eally just an ar
a380: 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 2e  ray of integers.
a390: 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 20 56    To destroy a V
a3a0: 4c 69 73 74 2c 0a 2a 2a 20 73 69 6d 70 6c 79 20  List,.** simply 
a3b0: 70 61 73 73 20 69 74 20 74 6f 20 73 71 6c 69 74  pass it to sqlit
a3c0: 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  e3DbFree()..**.*
a3d0: 2a 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  * The first inte
a3e0: 67 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ger is the numbe
a3f0: 72 20 6f 66 20 69 6e 74 65 67 65 72 73 20 61 6c  r of integers al
a400: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
a410: 77 68 6f 6c 65 0a 2a 2a 20 56 4c 69 73 74 2e 20  whole.** VList. 
a420: 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
a430: 67 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ger is the numbe
a440: 72 20 6f 66 20 69 6e 74 65 67 65 72 73 20 61 63  r of integers ac
a450: 74 75 61 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a 20  tually used..** 
a460: 45 61 63 68 20 6e 61 6d 65 2f 6e 75 6d 62 65 72  Each name/number
a470: 20 70 61 69 72 20 69 73 20 65 6e 63 6f 64 65 64   pair is encoded
a480: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 67   by subsequent g
a490: 72 6f 75 70 73 20 6f 66 20 33 20 6f 72 20 6d 6f  roups of 3 or mo
a4a0: 72 65 0a 2a 2a 20 69 6e 74 65 67 65 72 73 2e 0a  re.** integers..
a4b0: 2a 2a 0a 2a 2a 20 45 61 63 68 20 6e 61 6d 65 2f  **.** Each name/
a4c0: 6e 75 6d 62 65 72 20 70 61 69 72 20 73 74 61 72  number pair star
a4d0: 74 73 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  ts with two inte
a4e0: 67 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74  gers which are t
a4f0: 68 65 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 76 61  he numeric.** va
a500: 6c 75 65 20 66 6f 72 20 74 68 65 20 70 61 69 72  lue for the pair
a510: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
a520: 20 74 68 65 20 6e 61 6d 65 2f 6e 75 6d 62 65 72   the name/number
a530: 20 70 61 69 72 2c 20 72 65 73 70 65 63 74 69 76   pair, respectiv
a540: 65 6c 79 2e 0a 2a 2a 20 54 68 65 20 74 65 78 74  ely..** The text
a550: 20 6e 61 6d 65 20 6f 76 65 72 6c 61 79 73 20 6f   name overlays o
a560: 6e 65 20 6f 72 20 6d 6f 72 65 20 66 6f 6c 6c 6f  ne or more follo
a570: 77 69 6e 67 20 69 6e 74 65 67 65 72 73 2e 20 20  wing integers.  
a580: 54 68 65 20 74 65 78 74 20 6e 61 6d 65 0a 2a 2a  The text name.**
a590: 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2d   is always zero-
a5a0: 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a 0a 2a  terminated..**.*
a5b0: 2a 20 43 6f 6e 63 65 70 74 75 61 6c 6c 79 3a 0a  * Conceptually:.
a5c0: 2a 2a 0a 2a 2a 20 20 20 20 73 74 72 75 63 74 20  **.**    struct 
a5d0: 56 4c 69 73 74 20 7b 0a 2a 2a 20 20 20 20 20 20  VList {.**      
a5e0: 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 2f 2f  int nAlloc;   //
a5f0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63   Number of alloc
a600: 61 74 65 64 20 73 6c 6f 74 73 20 0a 2a 2a 20 20  ated slots .**  
a610: 20 20 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20      int nUsed;  
a620: 20 20 2f 2f 20 4e 75 6d 62 65 72 20 6f 66 20 75    // Number of u
a630: 73 65 64 20 73 6c 6f 74 73 20 0a 2a 2a 20 20 20  sed slots .**   
a640: 20 20 20 73 74 72 75 63 74 20 56 4c 69 73 74 45     struct VListE
a650: 6e 74 72 79 20 7b 0a 2a 2a 20 20 20 20 20 20 20  ntry {.**       
a660: 20 69 6e 74 20 69 56 61 6c 75 65 3b 20 20 20 20   int iValue;    
a670: 2f 2f 20 56 61 6c 75 65 20 66 6f 72 20 74 68 69  // Value for thi
a680: 73 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20  s entry.**      
a690: 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20    int nSlot;    
a6a0: 20 2f 2f 20 53 6c 6f 74 73 20 75 73 65 64 20 62   // Slots used b
a6b0: 79 20 74 68 69 73 20 65 6e 74 72 79 0a 2a 2a 20  y this entry.** 
a6c0: 20 20 20 20 20 20 20 2f 2f 20 2e 2e 2e 20 76 61         // ... va
a6d0: 72 69 61 62 6c 65 20 6e 61 6d 65 20 67 6f 65 73  riable name goes
a6e0: 20 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 7d 20   here.**      } 
a6f0: 61 5b 30 5d 3b 0a 2a 2a 20 20 20 20 7d 0a 2a 2a  a[0];.**    }.**
a700: 0a 2a 2a 20 44 75 72 69 6e 67 20 63 6f 64 65 20  .** During code 
a710: 67 65 6e 65 72 61 74 69 6f 6e 2c 20 70 6f 69 6e  generation, poin
a720: 74 65 72 73 20 74 6f 20 74 68 65 20 76 61 72 69  ters to the vari
a730: 61 62 6c 65 20 6e 61 6d 65 73 20 77 69 74 68 69  able names withi
a740: 6e 20 74 68 65 0a 2a 2a 20 56 4c 69 73 74 20 61  n the.** VList a
a750: 72 65 20 74 61 6b 65 6e 2e 20 20 57 68 65 6e 20  re taken.  When 
a760: 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 6e 41  that happens, nA
a770: 6c 6c 6f 63 20 69 73 20 73 65 74 20 74 6f 20 7a  lloc is set to z
a780: 65 72 6f 20 61 73 20 61 6e 20 0a 2a 2a 20 69 6e  ero as an .** in
a790: 64 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68  dication that th
a7a0: 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 65 76 65  e VList may neve
a7b0: 72 20 61 67 61 69 6e 20 62 65 20 65 6e 6c 61 72  r again be enlar
a7c0: 67 65 64 2c 20 73 69 6e 63 65 20 74 68 65 0a 2a  ged, since the.*
a7d0: 2a 20 61 63 63 6f 6d 70 61 6e 79 69 6e 67 20 72  * accompanying r
a7e0: 65 61 6c 6c 6f 63 28 29 20 77 6f 75 6c 64 20 69  ealloc() would i
a7f0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 70 6f  nvalidate the po
a800: 69 6e 74 65 72 73 2e 0a 2a 2f 0a 56 4c 69 73 74  inters..*/.VList
a810: 20 2a 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64   *sqlite3VListAd
a820: 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
a830: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
a840: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
a850: 65 63 74 69 6f 6e 20 75 73 65 64 20 66 6f 72 20  ection used for 
a860: 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 56 4c  malloc() */.  VL
a870: 69 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  ist *pIn,       
a880: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75       /* The inpu
a890: 74 20 56 4c 69 73 74 2e 20 20 4d 69 67 68 74 20  t VList.  Might 
a8a0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  be NULL */.  con
a8b0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
a8c0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
a8d0: 79 6d 62 6f 6c 20 74 6f 20 61 64 64 20 2a 2f 0a  ymbol to add */.
a8e0: 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20 20    int nName,    
a8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
a900: 73 20 6f 66 20 74 65 78 74 20 69 6e 20 7a 4e 61  s of text in zNa
a910: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c  me */.  int iVal
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a930: 2a 20 56 61 6c 75 65 20 74 6f 20 61 73 73 6f 63  * Value to assoc
a940: 69 61 74 65 20 77 69 74 68 20 7a 4e 61 6d 65 20  iate with zName 
a950: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 49 6e 74  */.){.  int nInt
a960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a970: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 7a 65  * number of size
a980: 6f 66 28 69 6e 74 29 20 6f 62 6a 65 63 74 73 20  of(int) objects 
a990: 6e 65 65 64 65 64 20 66 6f 72 20 7a 4e 61 6d 65  needed for zName
a9a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9c0: 50 6f 69 6e 74 65 72 20 74 6f 20 77 68 65 72 65  Pointer to where
a9d0: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 73   zName will be s
a9e0: 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  tored */.  int i
a9f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aa00: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 49    /* Index in pI
aa10: 6e 5b 5d 20 77 68 65 72 65 20 7a 4e 61 6d 65 20  n[] where zName 
aa20: 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 0a 20 20  is stored */..  
aa30: 6e 49 6e 74 20 3d 20 6e 4e 61 6d 65 2f 34 20 2b  nInt = nName/4 +
aa40: 20 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   3;.  assert( pI
aa50: 6e 3d 3d 30 20 7c 7c 20 70 49 6e 5b 30 5d 3e 3d  n==0 || pIn[0]>=
aa60: 33 20 29 3b 20 20 2f 2a 20 56 65 72 69 66 79 20  3 );  /* Verify 
aa70: 6f 6b 20 74 6f 20 61 64 64 20 6e 65 77 20 65 6c  ok to add new el
aa80: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20  ements */.  if( 
aa90: 70 49 6e 3d 3d 30 20 7c 7c 20 70 49 6e 5b 31 5d  pIn==0 || pIn[1]
aaa0: 2b 6e 49 6e 74 20 3e 20 70 49 6e 5b 30 5d 20 29  +nInt > pIn[0] )
aab0: 7b 0a 20 20 20 20 2f 2a 20 45 6e 6c 61 72 67 65  {.    /* Enlarge
aac0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
aad0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
aae0: 6e 74 36 34 20 6e 41 6c 6c 6f 63 20 3d 20 28 70  nt64 nAlloc = (p
aaf0: 49 6e 20 3f 20 32 2a 28 73 71 6c 69 74 65 33 5f  In ? 2*(sqlite3_
ab00: 69 6e 74 36 34 29 70 49 6e 5b 30 5d 20 3a 20 31  int64)pIn[0] : 1
ab10: 30 29 20 2b 20 6e 49 6e 74 3b 0a 20 20 20 20 56  0) + nInt;.    V
ab20: 4c 69 73 74 20 2a 70 4f 75 74 20 3d 20 73 71 6c  List *pOut = sql
ab30: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
ab40: 2c 20 70 49 6e 2c 20 6e 41 6c 6c 6f 63 2a 73 69  , pIn, nAlloc*si
ab50: 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
ab60: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 72 65  if( pOut==0 ) re
ab70: 74 75 72 6e 20 70 49 6e 3b 0a 20 20 20 20 69 66  turn pIn;.    if
ab80: 28 20 70 49 6e 3d 3d 30 20 29 20 70 4f 75 74 5b  ( pIn==0 ) pOut[
ab90: 31 5d 20 3d 20 32 3b 0a 20 20 20 20 70 49 6e 20  1] = 2;.    pIn 
aba0: 3d 20 70 4f 75 74 3b 0a 20 20 20 20 70 49 6e 5b  = pOut;.    pIn[
abb0: 30 5d 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d  0] = nAlloc;.  }
abc0: 0a 20 20 69 20 3d 20 70 49 6e 5b 31 5d 3b 0a 20  .  i = pIn[1];. 
abd0: 20 70 49 6e 5b 69 5d 20 3d 20 69 56 61 6c 3b 0a   pIn[i] = iVal;.
abe0: 20 20 70 49 6e 5b 69 2b 31 5d 20 3d 20 6e 49 6e    pIn[i+1] = nIn
abf0: 74 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  t;.  z = (char*)
ac00: 26 70 49 6e 5b 69 2b 32 5d 3b 0a 20 20 70 49 6e  &pIn[i+2];.  pIn
ac10: 5b 31 5d 20 3d 20 69 2b 6e 49 6e 74 3b 0a 20 20  [1] = i+nInt;.  
ac20: 61 73 73 65 72 74 28 20 70 49 6e 5b 31 5d 3c 3d  assert( pIn[1]<=
ac30: 70 49 6e 5b 30 5d 20 29 3b 0a 20 20 6d 65 6d 63  pIn[0] );.  memc
ac40: 70 79 28 7a 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  py(z, zName, nNa
ac50: 6d 65 29 3b 0a 20 20 7a 5b 6e 4e 61 6d 65 5d 20  me);.  z[nName] 
ac60: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  = 0;.  return pI
ac70: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
ac80: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
ac90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
aca0: 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 67 69  riable in the gi
acb0: 76 65 6e 20 56 4c 69 73 74 20 74 68 61 74 0a 2a  ven VList that.*
acc0: 2a 20 68 61 73 20 74 68 65 20 76 61 6c 75 65 20  * has the value 
acd0: 69 56 61 6c 2e 20 20 4f 72 20 72 65 74 75 72 6e  iVal.  Or return
ace0: 20 61 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65   a NULL if there
acf0: 20 69 73 20 6e 6f 20 73 75 63 68 20 76 61 72 69   is no such vari
ad00: 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 6c  able in.** the l
ad10: 69 73 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ist.*/.const cha
ad20: 72 20 2a 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  r *sqlite3VListN
ad30: 75 6d 54 6f 4e 61 6d 65 28 56 4c 69 73 74 20 2a  umToName(VList *
ad40: 70 49 6e 2c 20 69 6e 74 20 69 56 61 6c 29 7b 0a  pIn, int iVal){.
ad50: 20 20 69 6e 74 20 69 2c 20 6d 78 3b 0a 20 20 69    int i, mx;.  i
ad60: 66 28 20 70 49 6e 3d 3d 30 20 29 20 72 65 74 75  f( pIn==0 ) retu
ad70: 72 6e 20 30 3b 0a 20 20 6d 78 20 3d 20 70 49 6e  rn 0;.  mx = pIn
ad80: 5b 31 5d 3b 0a 20 20 69 20 3d 20 32 3b 0a 20 20  [1];.  i = 2;.  
ad90: 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 5b  do{.    if( pIn[
ada0: 69 5d 3d 3d 69 56 61 6c 20 29 20 72 65 74 75 72  i]==iVal ) retur
adb0: 6e 20 28 63 68 61 72 2a 29 26 70 49 6e 5b 69 2b  n (char*)&pIn[i+
adc0: 32 5d 3b 0a 20 20 20 20 69 20 2b 3d 20 70 49 6e  2];.    i += pIn
add0: 5b 69 2b 31 5d 3b 0a 20 20 7d 77 68 69 6c 65 28  [i+1];.  }while(
ade0: 20 69 3c 6d 78 20 29 3b 0a 20 20 72 65 74 75 72   i<mx );.  retur
adf0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
ae00: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
ae10: 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  of the variable 
ae20: 6e 61 6d 65 64 20 7a 4e 61 6d 65 2c 20 69 66 20  named zName, if 
ae30: 69 74 20 69 73 20 69 6e 20 56 4c 69 73 74 2e 0a  it is in VList..
ae40: 2a 2a 20 6f 72 20 72 65 74 75 72 6e 20 30 20 69  ** or return 0 i
ae50: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
ae60: 63 68 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  ch variable..*/.
ae70: 69 6e 74 20 73 71 6c 69 74 65 33 56 4c 69 73 74  int sqlite3VList
ae80: 4e 61 6d 65 54 6f 4e 75 6d 28 56 4c 69 73 74 20  NameToNum(VList 
ae90: 2a 70 49 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pIn, const char
aea0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61   *zName, int nNa
aeb0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6d 78  me){.  int i, mx
aec0: 3b 0a 20 20 69 66 28 20 70 49 6e 3d 3d 30 20 29  ;.  if( pIn==0 )
aed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 78 20   return 0;.  mx 
aee0: 3d 20 70 49 6e 5b 31 5d 3b 0a 20 20 69 20 3d 20  = pIn[1];.  i = 
aef0: 32 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6f 6e  2;.  do{.    con
af00: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
af10: 6e 73 74 20 63 68 61 72 2a 29 26 70 49 6e 5b 69  nst char*)&pIn[i
af20: 2b 32 5d 3b 0a 20 20 20 20 69 66 28 20 73 74 72  +2];.    if( str
af30: 6e 63 6d 70 28 7a 2c 7a 4e 61 6d 65 2c 6e 4e 61  ncmp(z,zName,nNa
af40: 6d 65 29 3d 3d 30 20 26 26 20 7a 5b 6e 4e 61 6d  me)==0 && z[nNam
af50: 65 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 70  e]==0 ) return p
af60: 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 20 2b 3d 20  In[i];.    i += 
af70: 70 49 6e 5b 69 2b 31 5d 3b 0a 20 20 7d 77 68 69  pIn[i+1];.  }whi
af80: 6c 65 28 20 69 3c 6d 78 20 29 3b 0a 20 20 72 65  le( i<mx );.  re
af90: 74 75 72 6e 20 30 3b 0a 7d 0a                    turn 0;.}.