/ Hex Artifact Content
Login

Artifact 5061987401c2e8003177fa30d73196aa036727c8f04bf36a2df0c82b1904a236:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74  ******.** Utilit
0180: 79 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64  y functions used
0190: 20 74 68 72 6f 75 67 68 6f 75 74 20 73 71 6c 69   throughout sqli
01a0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  te..**.** This f
01b0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 66 75 6e  ile contains fun
01c0: 63 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 6f 63  ctions for alloc
01d0: 61 74 69 6e 67 20 6d 65 6d 6f 72 79 2c 20 63 6f  ating memory, co
01e0: 6d 70 61 72 69 6e 67 0a 2a 2a 20 73 74 72 69 6e  mparing.** strin
01f0: 67 73 2c 20 61 6e 64 20 73 74 75 66 66 20 6c 69  gs, and stuff li
0200: 6b 65 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2f 0a 23  ke that..**.*/.#
0210: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0220: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0230: 73 74 64 61 72 67 2e 68 3e 0a 23 69 66 20 48 41  stdarg.h>.#if HA
0240: 56 45 5f 49 53 4e 41 4e 20 7c 7c 20 53 51 4c 49  VE_ISNAN || SQLI
0250: 54 45 5f 48 41 56 45 5f 49 53 4e 41 4e 0a 23 20  TE_HAVE_ISNAN.# 
0260: 69 6e 63 6c 75 64 65 20 3c 6d 61 74 68 2e 68 3e  include <math.h>
0270: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0280: 6f 75 74 69 6e 65 20 6e 65 65 64 65 64 20 74 6f  outine needed to
0290: 20 73 75 70 70 6f 72 74 20 74 68 65 20 74 65 73   support the tes
02a0: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 2e 0a 2a  tcase() macro..*
02b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
02c0: 43 4f 56 45 52 41 47 45 5f 54 45 53 54 0a 76 6f  COVERAGE_TEST.vo
02d0: 69 64 20 73 71 6c 69 74 65 33 43 6f 76 65 72 61  id sqlite3Covera
02e0: 67 65 28 69 6e 74 20 78 29 7b 0a 20 20 73 74 61  ge(int x){.  sta
02f0: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 64 75 6d  tic unsigned dum
0300: 6d 79 20 3d 20 30 3b 0a 20 20 64 75 6d 6d 79 20  my = 0;.  dummy 
0310: 2b 3d 20 28 75 6e 73 69 67 6e 65 64 29 78 3b 0a  += (unsigned)x;.
0320: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0330: 43 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  Calls to sqlite3
0340: 46 61 75 6c 74 53 69 6d 28 29 20 61 72 65 20 75  FaultSim() are u
0350: 73 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  sed to simulate 
0360: 61 20 66 61 69 6c 75 72 65 20 64 75 72 69 6e 67  a failure during
0370: 20 74 65 73 74 69 6e 67 2c 0a 2a 2a 20 6f 72 20   testing,.** or 
0380: 74 6f 20 62 79 70 61 73 73 20 6e 6f 72 6d 61 6c  to bypass normal
0390: 20 65 72 72 6f 72 20 64 65 74 65 63 74 69 6f 6e   error detection
03a0: 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
03b0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6c 65 74 20  in order to let 
03c0: 0a 2a 2a 20 65 78 65 63 75 74 65 20 70 72 6f 63  .** execute proc
03d0: 65 65 64 20 66 75 74 68 65 72 20 64 6f 77 6e 73  eed futher downs
03e0: 74 72 65 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  tream..**.** In 
03f0: 64 65 70 6c 6f 79 6d 65 6e 74 2c 20 73 71 6c 69  deployment, sqli
0400: 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 2a 61  te3FaultSim() *a
0410: 6c 77 61 79 73 2a 20 72 65 74 75 72 6e 20 53 51  lways* return SQ
0420: 4c 49 54 45 5f 4f 4b 20 28 30 29 2e 20 20 54 68  LITE_OK (0).  Th
0430: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 61 75 6c  e.** sqlite3Faul
0440: 74 53 69 6d 28 29 20 66 75 6e 63 74 69 6f 6e 20  tSim() function 
0450: 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 6e 6f 6e  only returns non
0460: 2d 7a 65 72 6f 20 64 75 72 69 6e 67 20 74 65 73  -zero during tes
0470: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 72 69  ting..**.** Duri
0480: 6e 67 20 74 65 73 74 69 6e 67 2c 20 69 66 20 74  ng testing, if t
0490: 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73 20  he test harness 
04a0: 68 61 73 20 73 65 74 20 61 20 66 61 75 6c 74 2d  has set a fault-
04b0: 73 69 6d 20 63 61 6c 6c 62 61 63 6b 20 75 73 69  sim callback usi
04c0: 6e 67 0a 2a 2a 20 61 20 63 61 6c 6c 20 74 6f 20  ng.** a call to 
04d0: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
04e0: 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
04f0: 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41  CTRL_FAULT_INSTA
0500: 4c 4c 29 2c 20 74 68 65 6e 0a 2a 2a 20 65 61 63  LL), then.** eac
0510: 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
0520: 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20 72  3FaultSim() is r
0530: 65 6c 61 79 65 64 20 74 6f 20 74 68 61 74 20 61  elayed to that a
0540: 70 70 6c 69 63 61 74 69 6f 6e 2d 73 75 70 70 6c  pplication-suppl
0550: 69 65 64 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  ied.** callback 
0560: 61 6e 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  and the integer 
0570: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72  return value for
0580: 6d 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  m the applicatio
0590: 6e 2d 73 75 70 70 6c 69 65 64 0a 2a 2a 20 63 61  n-supplied.** ca
05a0: 6c 6c 62 61 63 6b 20 69 73 20 72 65 74 75 72 6e  llback is return
05b0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 46 61 75  ed by sqlite3Fau
05c0: 6c 74 53 69 6d 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ltSim()..**.** T
05d0: 68 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  he integer argum
05e0: 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 46 61  ent to sqlite3Fa
05f0: 75 6c 74 53 69 6d 28 29 20 69 73 20 61 20 63 6f  ultSim() is a co
0600: 64 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 77  de to identify w
0610: 68 69 63 68 0a 2a 2a 20 73 71 6c 69 74 65 33 46  hich.** sqlite3F
0620: 61 75 6c 74 53 69 6d 28 29 20 69 6e 73 74 61 6e  aultSim() instan
0630: 63 65 20 69 73 20 62 65 69 6e 67 20 69 6e 76 6f  ce is being invo
0640: 6b 65 64 2e 20 45 61 63 68 20 63 61 6c 6c 20 74  ked. Each call t
0650: 6f 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  o sqlite3FaultSi
0660: 6d 28 29 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61  m().** should ha
0670: 76 65 20 61 20 75 6e 69 71 75 65 20 63 6f 64 65  ve a unique code
0680: 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20 6c 65  .  To prevent le
0690: 67 61 63 79 20 74 65 73 74 69 6e 67 20 61 70 70  gacy testing app
06a0: 6c 69 63 61 74 69 6f 6e 73 20 66 72 6f 6d 0a 2a  lications from.*
06b0: 2a 20 62 72 65 61 6b 69 6e 67 2c 20 74 68 65 20  * breaking, the 
06c0: 63 6f 64 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74  codes should not
06d0: 20 62 65 20 63 68 61 6e 67 65 64 20 6f 72 20 72   be changed or r
06e0: 65 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  eused..*/.#ifnde
06f0: 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41  f SQLITE_UNTESTA
0700: 42 4c 45 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  BLE.int sqlite3F
0710: 61 75 6c 74 53 69 6d 28 69 6e 74 20 69 54 65 73  aultSim(int iTes
0720: 74 29 7b 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c  t){.  int (*xCal
0730: 6c 62 61 63 6b 29 28 69 6e 74 29 20 3d 20 73 71  lback)(int) = sq
0740: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0750: 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 3b  g.xTestCallback;
0760: 0a 20 20 72 65 74 75 72 6e 20 78 43 61 6c 6c 62  .  return xCallb
0770: 61 63 6b 20 3f 20 78 43 61 6c 6c 62 61 63 6b 28  ack ? xCallback(
0780: 69 54 65 73 74 29 20 3a 20 53 51 4c 49 54 45 5f  iTest) : SQLITE_
0790: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
07a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
07b0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
07c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
07d0: 75 65 20 69 66 20 74 68 65 20 66 6c 6f 61 74 69  ue if the floati
07e0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 69  ng point value i
07f0: 73 20 4e 6f 74 20 61 20 4e 75 6d 62 65 72 20 28  s Not a Number (
0800: 4e 61 4e 29 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  NaN)..**.** Use 
0810: 74 68 65 20 6d 61 74 68 20 6c 69 62 72 61 72 79  the math library
0820: 20 69 73 6e 61 6e 28 29 20 66 75 6e 63 74 69 6f   isnan() functio
0830: 6e 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  n if compiled wi
0840: 74 68 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 49  th SQLITE_HAVE_I
0850: 53 4e 41 4e 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  SNAN..** Otherwi
0860: 73 65 2c 20 77 65 20 68 61 76 65 20 6f 75 72 20  se, we have our 
0870: 6f 77 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  own implementati
0880: 6f 6e 20 74 68 61 74 20 77 6f 72 6b 73 20 6f 6e  on that works on
0890: 20 6d 6f 73 74 20 73 79 73 74 65 6d 73 2e 0a 2a   most systems..*
08a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 4e  /.int sqlite3IsN
08b0: 61 4e 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20 20  aN(double x){.  
08c0: 69 6e 74 20 72 63 3b 20 20 20 2f 2a 20 54 68 65  int rc;   /* The
08d0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 20 2a 2f   value return */
08e0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 48 41 56  .#if !SQLITE_HAV
08f0: 45 5f 49 53 4e 41 4e 20 26 26 20 21 48 41 56 45  E_ISNAN && !HAVE
0900: 5f 49 53 4e 41 4e 0a 20 20 2f 2a 0a 20 20 2a 2a  _ISNAN.  /*.  **
0910: 20 53 79 73 74 65 6d 73 20 74 68 61 74 20 73 75   Systems that su
0920: 70 70 6f 72 74 20 74 68 65 20 69 73 6e 61 6e 28  pport the isnan(
0930: 29 20 6c 69 62 72 61 72 79 20 66 75 6e 63 74 69  ) library functi
0940: 6f 6e 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  on should probab
0950: 6c 79 0a 20 20 2a 2a 20 6d 61 6b 65 20 75 73 65  ly.  ** make use
0960: 20 6f 66 20 69 74 20 62 79 20 63 6f 6d 70 69 6c   of it by compil
0970: 69 6e 67 20 77 69 74 68 20 2d 44 53 51 4c 49 54  ing with -DSQLIT
0980: 45 5f 48 41 56 45 5f 49 53 4e 41 4e 2e 20 20 42  E_HAVE_ISNAN.  B
0990: 75 74 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ut we have.  ** 
09a0: 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 6e 79 20  found that many 
09b0: 73 79 73 74 65 6d 73 20 64 6f 20 6e 6f 74 20 68  systems do not h
09c0: 61 76 65 20 61 20 77 6f 72 6b 69 6e 67 20 69 73  ave a working is
09d0: 6e 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 73  nan() function s
09e0: 6f 0a 20 20 2a 2a 20 74 68 69 73 20 69 6d 70 6c  o.  ** this impl
09f0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 70 72  ementation is pr
0a00: 6f 76 69 64 65 64 20 61 73 20 61 6e 20 61 6c 74  ovided as an alt
0a10: 65 72 6e 61 74 69 76 65 2e 0a 20 20 2a 2a 0a 20  ernative..  **. 
0a20: 20 2a 2a 20 54 68 69 73 20 4e 61 4e 20 74 65 73   ** This NaN tes
0a30: 74 20 73 6f 6d 65 74 69 6d 65 73 20 66 61 69 6c  t sometimes fail
0a40: 73 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e  s if compiled on
0a50: 20 47 43 43 20 77 69 74 68 20 2d 66 66 61 73 74   GCC with -ffast
0a60: 2d 6d 61 74 68 2e 0a 20 20 2a 2a 20 4f 6e 20 74  -math..  ** On t
0a70: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
0a80: 68 65 20 75 73 65 20 6f 66 20 2d 66 66 61 73 74  he use of -ffast
0a90: 2d 6d 61 74 68 20 63 6f 6d 65 73 20 77 69 74 68  -math comes with
0aa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
0ab0: 20 2a 2a 20 77 61 72 6e 69 6e 67 3a 0a 20 20 2a   ** warning:.  *
0ac0: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 54 68 69 73  *.  **      This
0ad0: 20 6f 70 74 69 6f 6e 20 5b 2d 66 66 61 73 74 2d   option [-ffast-
0ae0: 6d 61 74 68 5d 20 73 68 6f 75 6c 64 20 6e 65 76  math] should nev
0af0: 65 72 20 62 65 20 74 75 72 6e 65 64 20 6f 6e 20  er be turned on 
0b00: 62 79 20 61 6e 79 0a 20 20 2a 2a 20 20 20 20 20  by any.  **     
0b10: 20 2d 4f 20 6f 70 74 69 6f 6e 20 73 69 6e 63 65   -O option since
0b20: 20 69 74 20 63 61 6e 20 72 65 73 75 6c 74 20 69   it can result i
0b30: 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f 75 74 70  n incorrect outp
0b40: 75 74 20 66 6f 72 20 70 72 6f 67 72 61 6d 73 0a  ut for programs.
0b50: 20 20 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20    **      which 
0b60: 64 65 70 65 6e 64 20 6f 6e 20 61 6e 20 65 78 61  depend on an exa
0b70: 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
0b80: 6e 20 6f 66 20 49 45 45 45 20 6f 72 20 49 53 4f  n of IEEE or ISO
0b90: 20 0a 20 20 2a 2a 20 20 20 20 20 20 72 75 6c 65   .  **      rule
0ba0: 73 2f 73 70 65 63 69 66 69 63 61 74 69 6f 6e 73  s/specifications
0bb0: 20 66 6f 72 20 6d 61 74 68 20 66 75 6e 63 74 69   for math functi
0bc0: 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  ons..  **.  ** U
0bd0: 6e 64 65 72 20 4d 53 56 43 2c 20 74 68 69 73 20  nder MSVC, this 
0be0: 4e 61 4e 20 74 65 73 74 20 6d 61 79 20 66 61 69  NaN test may fai
0bf0: 6c 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  l if compiled wi
0c00: 74 68 20 61 20 66 6c 6f 61 74 69 6e 67 2d 0a 20  th a floating-. 
0c10: 20 2a 2a 20 70 6f 69 6e 74 20 70 72 65 63 69 73   ** point precis
0c20: 69 6f 6e 20 6d 6f 64 65 20 6f 74 68 65 72 20 74  ion mode other t
0c30: 68 61 6e 20 2f 66 70 3a 70 72 65 63 69 73 65 2e  han /fp:precise.
0c40: 20 20 46 72 6f 6d 20 74 68 65 20 4d 53 44 4e 20    From the MSDN 
0c50: 0a 20 20 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74  .  ** documentat
0c60: 69 6f 6e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ion:.  **.  **  
0c70: 20 20 20 20 54 68 65 20 63 6f 6d 70 69 6c 65 72      The compiler
0c80: 20 5b 77 69 74 68 20 2f 66 70 3a 70 72 65 63 69   [with /fp:preci
0c90: 73 65 5d 20 77 69 6c 6c 20 70 72 6f 70 65 72 6c  se] will properl
0ca0: 79 20 68 61 6e 64 6c 65 20 63 6f 6d 70 61 72 69  y handle compari
0cb0: 73 6f 6e 73 20 0a 20 20 2a 2a 20 20 20 20 20 20  sons .  **      
0cc0: 69 6e 76 6f 6c 76 69 6e 67 20 4e 61 4e 2e 20 46  involving NaN. F
0cd0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 78 20 21 3d  or example, x !=
0ce0: 20 78 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20   x evaluates to 
0cf0: 74 72 75 65 20 69 66 20 78 20 69 73 20 4e 61 4e  true if x is NaN
0d00: 20 0a 20 20 2a 2a 20 20 20 20 20 20 2e 2e 2e 0a   .  **      ....
0d10: 20 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 46 41    */.#ifdef __FA
0d20: 53 54 5f 4d 41 54 48 5f 5f 0a 23 20 65 72 72 6f  ST_MATH__.# erro
0d30: 72 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  r SQLite will no
0d40: 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
0d50: 20 77 69 74 68 20 74 68 65 20 2d 66 66 61 73 74   with the -ffast
0d60: 2d 6d 61 74 68 20 6f 70 74 69 6f 6e 20 6f 66 20  -math option of 
0d70: 47 43 43 2e 0a 23 65 6e 64 69 66 0a 20 20 76 6f  GCC..#endif.  vo
0d80: 6c 61 74 69 6c 65 20 64 6f 75 62 6c 65 20 79 20  latile double y 
0d90: 3d 20 78 3b 0a 20 20 76 6f 6c 61 74 69 6c 65 20  = x;.  volatile 
0da0: 64 6f 75 62 6c 65 20 7a 20 3d 20 79 3b 0a 20 20  double z = y;.  
0db0: 72 63 20 3d 20 28 79 21 3d 7a 29 3b 0a 23 65 6c  rc = (y!=z);.#el
0dc0: 73 65 20 20 2f 2a 20 69 66 20 48 41 56 45 5f 49  se  /* if HAVE_I
0dd0: 53 4e 41 4e 20 2a 2f 0a 20 20 72 63 20 3d 20 69  SNAN */.  rc = i
0de0: 73 6e 61 6e 28 78 29 3b 0a 23 65 6e 64 69 66 20  snan(x);.#endif 
0df0: 2f 2a 20 48 41 56 45 5f 49 53 4e 41 4e 20 2a 2f  /* HAVE_ISNAN */
0e00: 0a 20 20 74 65 73 74 63 61 73 65 28 20 72 63 20  .  testcase( rc 
0e10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
0e20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
0e30: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
0e40: 5f 50 4f 49 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _POINT */../*.**
0e50: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
0e60: 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20 69 73  g length that is
0e70: 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68 61 74   limited to what
0e80: 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
0e90: 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62 69  n.** lower 30 bi
0ea0: 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74 20 73  ts of a 32-bit s
0eb0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
0ec0: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
0ed0: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 65 76  eturned will nev
0ee0: 65 72 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  er be negative. 
0ef0: 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 65 76 65   Nor will it eve
0f00: 72 20 62 65 20 67 72 65 61 74 65 72 0a 2a 2a 20  r be greater.** 
0f10: 74 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20  than the actual 
0f20: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74  length of the st
0f30: 72 69 6e 67 2e 20 20 46 6f 72 20 76 65 72 79 20  ring.  For very 
0f40: 6c 6f 6e 67 20 73 74 72 69 6e 67 73 20 28 67 72  long strings (gr
0f50: 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 31 47  eater.** than 1G
0f60: 69 42 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  iB) the value re
0f70: 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62 65 20  turned might be 
0f80: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 74 72  less than the tr
0f90: 75 65 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  ue string length
0fa0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0fb0: 53 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63  Strlen30(const c
0fc0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 7a  har *z){.  if( z
0fd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
0fe0: 20 20 72 65 74 75 72 6e 20 30 78 33 66 66 66 66    return 0x3ffff
0ff0: 66 66 66 20 26 20 28 69 6e 74 29 73 74 72 6c 65  fff & (int)strle
1000: 6e 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(z);.}../*.** R
1010: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
1020: 65 64 20 74 79 70 65 20 6f 66 20 61 20 63 6f 6c  ed type of a col
1030: 75 6d 6e 2e 20 20 4f 72 20 72 65 74 75 72 6e 20  umn.  Or return 
1040: 7a 44 66 6c 74 20 69 66 20 74 68 65 20 63 6f 6c  zDflt if the col
1050: 75 6d 6e 20 0a 2a 2a 20 68 61 73 20 6e 6f 20 64  umn .** has no d
1060: 65 63 6c 61 72 65 64 20 74 79 70 65 2e 0a 2a 2a  eclared type..**
1070: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 74  .** The column t
1080: 79 70 65 20 69 73 20 61 6e 20 65 78 74 72 61 20  ype is an extra 
1090: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 61 66  string stored af
10a0: 74 65 72 20 74 68 65 20 7a 65 72 6f 2d 74 65 72  ter the zero-ter
10b0: 6d 69 6e 61 74 6f 72 20 6f 6e 0a 2a 2a 20 74 68  minator on.** th
10c0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 66  e column name if
10d0: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65   and only if the
10e0: 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45   COLFLAG_HASTYPE
10f0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a 2f   flag is set..*/
1100: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 43 6f  .char *sqlite3Co
1110: 6c 75 6d 6e 54 79 70 65 28 43 6f 6c 75 6d 6e 20  lumnType(Column 
1120: 2a 70 43 6f 6c 2c 20 63 68 61 72 20 2a 7a 44 66  *pCol, char *zDf
1130: 6c 74 29 7b 0a 20 20 69 66 28 20 28 70 43 6f 6c  lt){.  if( (pCol
1140: 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ->colFlags & COL
1150: 46 4c 41 47 5f 48 41 53 54 59 50 45 29 3d 3d 30  FLAG_HASTYPE)==0
1160: 20 29 20 72 65 74 75 72 6e 20 7a 44 66 6c 74 3b   ) return zDflt;
1170: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e  .  return pCol->
1180: 7a 4e 61 6d 65 20 2b 20 73 74 72 6c 65 6e 28 70  zName + strlen(p
1190: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 31 3b  Col->zName) + 1;
11a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
11b0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71   function for sq
11c0: 6c 69 74 65 33 45 72 72 6f 72 28 29 20 2d 20 63  lite3Error() - c
11d0: 61 6c 6c 65 64 20 72 61 72 65 6c 79 2e 20 20 42  alled rarely.  B
11e0: 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 0a 2a  roken out into.*
11f0: 2a 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75  * a separate rou
1200: 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 75 6e  tine to avoid un
1210: 6e 65 63 65 73 73 61 72 79 20 72 65 67 69 73 74  necessary regist
1220: 65 72 20 73 61 76 65 73 20 6f 6e 20 65 6e 74 72  er saves on entr
1230: 79 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  y to.** sqlite3E
1240: 72 72 6f 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  rror()..*/.stati
1250: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1260: 45 20 76 6f 69 64 20 20 73 71 6c 69 74 65 33 45  E void  sqlite3E
1270: 72 72 6f 72 46 69 6e 69 73 68 28 73 71 6c 69 74  rrorFinish(sqlit
1280: 65 33 20 2a 64 62 2c 20 69 6e 74 20 65 72 72 5f  e3 *db, int err_
1290: 63 6f 64 65 29 7b 0a 20 20 69 66 28 20 64 62 2d  code){.  if( db-
12a0: 3e 70 45 72 72 20 29 20 73 71 6c 69 74 65 33 56  >pErr ) sqlite3V
12b0: 61 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e  alueSetNull(db->
12c0: 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pErr);.  sqlite3
12d0: 53 79 73 74 65 6d 45 72 72 6f 72 28 64 62 2c 20  SystemError(db, 
12e0: 65 72 72 5f 63 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a  err_code);.}../*
12f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 75 72 72  .** Set the curr
1300: 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 74  ent error code t
1310: 6f 20 65 72 72 5f 63 6f 64 65 20 61 6e 64 20 63  o err_code and c
1320: 6c 65 61 72 20 61 6e 79 20 70 72 69 6f 72 20 65  lear any prior e
1330: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
1340: 20 41 6c 73 6f 20 73 65 74 20 69 53 79 73 45 72   Also set iSysEr
1350: 72 6e 6f 20 28 62 79 20 63 61 6c 6c 69 6e 67 20  rno (by calling 
1360: 73 71 6c 69 74 65 33 53 79 73 74 65 6d 29 20 69  sqlite3System) i
1370: 66 20 74 68 65 20 65 72 72 5f 63 6f 64 65 20 69  f the err_code i
1380: 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
1390: 20 77 6f 75 6c 64 20 62 65 20 61 70 70 72 6f 70   would be approp
13a0: 72 69 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  riate..*/.void s
13b0: 71 6c 69 74 65 33 45 72 72 6f 72 28 73 71 6c 69  qlite3Error(sqli
13c0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 65 72 72  te3 *db, int err
13d0: 5f 63 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  _code){.  assert
13e0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 64 62 2d  ( db!=0 );.  db-
13f0: 3e 65 72 72 43 6f 64 65 20 3d 20 65 72 72 5f 63  >errCode = err_c
1400: 6f 64 65 3b 0a 20 20 69 66 28 20 65 72 72 5f 63  ode;.  if( err_c
1410: 6f 64 65 20 7c 7c 20 64 62 2d 3e 70 45 72 72 20  ode || db->pErr 
1420: 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 46 69  ) sqlite3ErrorFi
1430: 6e 69 73 68 28 64 62 2c 20 65 72 72 5f 63 6f 64  nish(db, err_cod
1440: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  e);.}../*.** Loa
1450: 64 20 74 68 65 20 73 71 6c 69 74 65 33 2e 69 53  d the sqlite3.iS
1460: 79 73 45 72 72 6e 6f 20 66 69 65 6c 64 20 69 66  ysErrno field if
1470: 20 74 68 61 74 20 69 73 20 61 6e 20 61 70 70 72   that is an appr
1480: 6f 70 72 69 61 74 65 20 74 68 69 6e 67 0a 2a 2a  opriate thing.**
1490: 20 74 6f 20 64 6f 20 62 61 73 65 64 20 6f 6e 20   to do based on 
14a0: 74 68 65 20 53 51 4c 69 74 65 20 65 72 72 6f 72  the SQLite error
14b0: 20 63 6f 64 65 20 69 6e 20 72 63 2e 0a 2a 2f 0a   code in rc..*/.
14c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 79 73 74  void sqlite3Syst
14d0: 65 6d 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20  emError(sqlite3 
14e0: 2a 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  *db, int rc){.  
14f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1500: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 20 72 65 74  OERR_NOMEM ) ret
1510: 75 72 6e 3b 0a 20 20 72 63 20 26 3d 20 30 78 66  urn;.  rc &= 0xf
1520: 66 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  f;.  if( rc==SQL
1530: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 7c 7c 20  ITE_CANTOPEN || 
1540: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1550: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 69 53 79 73   ){.    db->iSys
1560: 45 72 72 6e 6f 20 3d 20 73 71 6c 69 74 65 33 4f  Errno = sqlite3O
1570: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 64 62  sGetLastError(db
1580: 2d 3e 70 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pVfs);.  }.}..
1590: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 6f  /*.** Set the mo
15a0: 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
15b0: 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 73  code and error s
15c0: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 73 71  tring for the sq
15d0: 6c 69 74 65 0a 2a 2a 20 68 61 6e 64 6c 65 20 22  lite.** handle "
15e0: 64 62 22 2e 20 54 68 65 20 65 72 72 6f 72 20 63  db". The error c
15f0: 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 22 65  ode is set to "e
1600: 72 72 5f 63 6f 64 65 22 2e 0a 2a 2a 0a 2a 2a 20  rr_code"..**.** 
1610: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
1620: 4c 2c 20 73 74 72 69 6e 67 20 7a 46 6f 72 6d 61  L, string zForma
1630: 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  t specifies the 
1640: 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 0a 2a 2a  format of the.**
1650: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e   error string in
1660: 20 74 68 65 20 73 74 79 6c 65 20 6f 66 20 74 68   the style of th
1670: 65 20 70 72 69 6e 74 66 20 66 75 6e 63 74 69 6f  e printf functio
1680: 6e 73 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ns: The followin
1690: 67 0a 2a 2a 20 66 6f 72 6d 61 74 20 63 68 61 72  g.** format char
16a0: 61 63 74 65 72 73 20 61 72 65 20 61 6c 6c 6f 77  acters are allow
16b0: 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 25  ed:.**.**      %
16c0: 73 20 20 20 20 20 20 49 6e 73 65 72 74 20 61 20  s      Insert a 
16d0: 73 74 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 25  string.**      %
16e0: 7a 20 20 20 20 20 20 41 20 73 74 72 69 6e 67 20  z      A string 
16f0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 66  that should be f
1700: 72 65 65 64 20 61 66 74 65 72 20 75 73 65 0a 2a  reed after use.*
1710: 2a 20 20 20 20 20 20 25 64 20 20 20 20 20 20 49  *      %d      I
1720: 6e 73 65 72 74 20 61 6e 20 69 6e 74 65 67 65 72  nsert an integer
1730: 0a 2a 2a 20 20 20 20 20 20 25 54 20 20 20 20 20  .**      %T     
1740: 20 49 6e 73 65 72 74 20 61 20 74 6f 6b 65 6e 0a   Insert a token.
1750: 2a 2a 20 20 20 20 20 20 25 53 20 20 20 20 20 20  **      %S      
1760: 49 6e 73 65 72 74 20 74 68 65 20 66 69 72 73 74  Insert the first
1770: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 20 53 72   element of a Sr
1780: 63 4c 69 73 74 0a 2a 2a 0a 2a 2a 20 7a 46 6f 72  cList.**.** zFor
1790: 6d 61 74 20 61 6e 64 20 61 6e 79 20 73 74 72 69  mat and any stri
17a0: 6e 67 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 66  ng tokens that f
17b0: 6f 6c 6c 6f 77 20 69 74 20 61 72 65 20 61 73 73  ollow it are ass
17c0: 75 6d 65 64 20 74 6f 20 62 65 0a 2a 2a 20 65 6e  umed to be.** en
17d0: 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  coded in UTF-8..
17e0: 2a 2a 0a 2a 2a 20 54 6f 20 63 6c 65 61 72 20 74  **.** To clear t
17f0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
1800: 72 72 6f 72 20 66 6f 72 20 73 71 6c 69 74 65 20  rror for sqlite 
1810: 68 61 6e 64 6c 65 20 22 64 62 22 2c 20 73 71 6c  handle "db", sql
1820: 69 74 65 33 45 72 72 6f 72 0a 2a 2a 20 73 68 6f  ite3Error.** sho
1830: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
1840: 74 68 20 65 72 72 5f 63 6f 64 65 20 73 65 74 20  th err_code set 
1850: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  to SQLITE_OK and
1860: 20 7a 46 6f 72 6d 61 74 20 73 65 74 0a 2a 2a 20   zFormat set.** 
1870: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64  to NULL..*/.void
1880: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
1890: 68 4d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62  hMsg(sqlite3 *db
18a0: 2c 20 69 6e 74 20 65 72 72 5f 63 6f 64 65 2c 20  , int err_code, 
18b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
18c0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 61 73 73  mat, ...){.  ass
18d0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
18e0: 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 65 72  db->errCode = er
18f0: 72 5f 63 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65  r_code;.  sqlite
1900: 33 53 79 73 74 65 6d 45 72 72 6f 72 28 64 62 2c  3SystemError(db,
1910: 20 65 72 72 5f 63 6f 64 65 29 3b 0a 20 20 69 66   err_code);.  if
1920: 28 20 7a 46 6f 72 6d 61 74 3d 3d 30 20 29 7b 0a  ( zFormat==0 ){.
1930: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1940: 28 64 62 2c 20 65 72 72 5f 63 6f 64 65 29 3b 0a  (db, err_code);.
1950: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
1960: 70 45 72 72 20 7c 7c 20 28 64 62 2d 3e 70 45 72  pErr || (db->pEr
1970: 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  r = sqlite3Value
1980: 4e 65 77 28 64 62 29 29 21 3d 30 20 29 7b 0a 20  New(db))!=0 ){. 
1990: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
19a0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20  va_list ap;.    
19b0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
19c0: 72 6d 61 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73  rmat);.    z = s
19d0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64  qlite3VMPrintf(d
19e0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
19f0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
1a00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
1a10: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
1a20: 2c 20 2d 31 2c 20 7a 2c 20 53 51 4c 49 54 45 5f  , -1, z, SQLITE_
1a30: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 44 59 4e  UTF8, SQLITE_DYN
1a40: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
1a50: 0a 2a 2a 20 41 64 64 20 61 6e 20 65 72 72 6f 72  .** Add an error
1a60: 20 6d 65 73 73 61 67 65 20 74 6f 20 70 50 61 72   message to pPar
1a70: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 61 6e 64 20  se->zErrMsg and 
1a80: 69 6e 63 72 65 6d 65 6e 74 20 70 50 61 72 73 65  increment pParse
1a90: 2d 3e 6e 45 72 72 2e 0a 2a 2a 20 54 68 65 20 66  ->nErr..** The f
1aa0: 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 74  ollowing formatt
1ab0: 69 6e 67 20 63 68 61 72 61 63 74 65 72 73 20 61  ing characters a
1ac0: 72 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  re allowed:.**.*
1ad0: 2a 20 20 20 20 20 20 25 73 20 20 20 20 20 20 49  *      %s      I
1ae0: 6e 73 65 72 74 20 61 20 73 74 72 69 6e 67 0a 2a  nsert a string.*
1af0: 2a 20 20 20 20 20 20 25 7a 20 20 20 20 20 20 41  *      %z      A
1b00: 20 73 74 72 69 6e 67 20 74 68 61 74 20 73 68 6f   string that sho
1b10: 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 66 74  uld be freed aft
1b20: 65 72 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 25  er use.**      %
1b30: 64 20 20 20 20 20 20 49 6e 73 65 72 74 20 61 6e  d      Insert an
1b40: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
1b50: 20 25 54 20 20 20 20 20 20 49 6e 73 65 72 74 20   %T      Insert 
1b60: 61 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 20  a token.**      
1b70: 25 53 20 20 20 20 20 20 49 6e 73 65 72 74 20 74  %S      Insert t
1b80: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
1b90: 20 6f 66 20 61 20 53 72 63 4c 69 73 74 0a 2a 2a   of a SrcList.**
1ba0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1bb0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  n should be used
1bc0: 20 74 6f 20 72 65 70 6f 72 74 20 61 6e 79 20 65   to report any e
1bd0: 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73  rror that occurs
1be0: 20 77 68 69 6c 65 0a 2a 2a 20 63 6f 6d 70 69 6c   while.** compil
1bf0: 69 6e 67 20 61 6e 20 53 51 4c 20 73 74 61 74 65  ing an SQL state
1c00: 6d 65 6e 74 20 28 69 2e 65 2e 20 77 69 74 68 69  ment (i.e. withi
1c10: 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  n sqlite3_prepar
1c20: 65 28 29 29 2e 20 54 68 65 0a 2a 2a 20 6c 61 73  e()). The.** las
1c30: 74 20 74 68 69 6e 67 20 74 68 65 20 73 71 6c 69  t thing the sqli
1c40: 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 66 75  te3_prepare() fu
1c50: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 69 73 20 63  nction does is c
1c60: 6f 70 79 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  opy the error.**
1c70: 20 73 74 6f 72 65 64 20 62 79 20 74 68 69 73 20   stored by this 
1c80: 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  function into th
1c90: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1ca0: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 45  e using sqlite3E
1cb0: 72 72 6f 72 28 29 2e 0a 2a 2a 20 46 75 6e 63 74  rror()..** Funct
1cc0: 69 6f 6e 73 20 73 71 6c 69 74 65 33 45 72 72 6f  ions sqlite3Erro
1cd0: 72 28 29 20 6f 72 20 73 71 6c 69 74 65 33 45 72  r() or sqlite3Er
1ce0: 72 6f 72 57 69 74 68 4d 73 67 28 29 20 73 68 6f  rorWithMsg() sho
1cf0: 75 6c 64 20 62 65 20 75 73 65 64 0a 2a 2a 20 64  uld be used.** d
1d00: 75 72 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  uring statement 
1d10: 65 78 65 63 75 74 69 6f 6e 20 28 73 71 6c 69 74  execution (sqlit
1d20: 65 33 5f 73 74 65 70 28 29 20 65 74 63 2e 29 2e  e3_step() etc.).
1d30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d40: 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a  ErrorMsg(Parse *
1d50: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1d60: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
1d70: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  ){.  char *zMsg;
1d80: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1d90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1da0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 61 5f  Parse->db;.  va_
1db0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1dc0: 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71 6c  t);.  zMsg = sql
1dd0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c  ite3VMPrintf(db,
1de0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
1df0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
1e00: 66 28 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45  f( db->suppressE
1e10: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
1e20: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 73 67  3DbFree(db, zMsg
1e30: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
1e50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1e60: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 7a 45  e(db, pParse->zE
1e70: 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 50 61 72  rrMsg);.    pPar
1e80: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 7a 4d  se->zErrMsg = zM
1e90: 73 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  sg;.    pParse->
1ea0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1eb0: 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  R;.  }.}../*.** 
1ec0: 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  If database conn
1ed0: 65 63 74 69 6f 6e 20 64 62 20 69 73 20 63 75 72  ection db is cur
1ee0: 72 65 6e 74 6c 79 20 70 61 72 73 69 6e 67 20 53  rently parsing S
1ef0: 51 4c 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  QL, then transfe
1f00: 72 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  r.** error code 
1f10: 65 72 72 43 6f 64 65 20 74 6f 20 74 68 61 74 20  errCode to that 
1f20: 70 61 72 73 65 72 20 69 66 20 74 68 65 20 70 61  parser if the pa
1f30: 72 73 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72  rser has not alr
1f40: 65 61 64 79 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65  eady.** encounte
1f50: 72 65 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 6b  red some other k
1f60: 69 6e 64 20 6f 66 20 65 72 72 6f 72 2e 0a 2a 2f  ind of error..*/
1f70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 72 72 6f  .int sqlite3Erro
1f80: 72 54 6f 50 61 72 73 65 72 28 73 71 6c 69 74 65  rToParser(sqlite
1f90: 33 20 2a 64 62 2c 20 69 6e 74 20 65 72 72 43 6f  3 *db, int errCo
1fa0: 64 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  de){.  Parse *pP
1fb0: 61 72 73 65 3b 0a 20 20 69 66 28 20 64 62 3d 3d  arse;.  if( db==
1fc0: 30 20 7c 7c 20 28 70 50 61 72 73 65 20 3d 20 64  0 || (pParse = d
1fd0: 62 2d 3e 70 50 61 72 73 65 29 3d 3d 30 20 29 20  b->pParse)==0 ) 
1fe0: 72 65 74 75 72 6e 20 65 72 72 43 6f 64 65 3b 0a  return errCode;.
1ff0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 65    pParse->rc = e
2000: 72 72 43 6f 64 65 3b 0a 20 20 70 50 61 72 73 65  rrCode;.  pParse
2010: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 72 65 74 75  ->nErr++;.  retu
2020: 72 6e 20 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn errCode;.}../
2030: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
2040: 53 51 4c 2d 73 74 79 6c 65 20 71 75 6f 74 65 64  SQL-style quoted
2050: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 6e   string into a n
2060: 6f 72 6d 61 6c 20 73 74 72 69 6e 67 20 62 79 20  ormal string by 
2070: 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20 74 68 65 20  removing.** the 
2080: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
2090: 2e 20 20 54 68 65 20 63 6f 6e 76 65 72 73 69 6f  .  The conversio
20a0: 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70 6c 61  n is done in-pla
20b0: 63 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 69  ce.  If the.** i
20c0: 6e 70 75 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  nput does not be
20d0: 67 69 6e 20 77 69 74 68 20 61 20 71 75 6f 74 65  gin with a quote
20e0: 20 63 68 61 72 61 63 74 65 72 2c 20 74 68 65 6e   character, then
20f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2100: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2110: 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 73 74 72  ** The input str
2120: 69 6e 67 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  ing must be zero
2130: 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 41 20  -terminated.  A 
2140: 6e 65 77 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  new zero-termina
2150: 74 6f 72 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  tor.** is added 
2160: 74 6f 20 74 68 65 20 64 65 71 75 6f 74 65 64 20  to the dequoted 
2170: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
2180: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2190: 73 20 2d 31 20 69 66 20 6e 6f 20 64 65 71 75 6f  s -1 if no dequo
21a0: 74 69 6e 67 20 6f 63 63 75 72 73 20 6f 72 20 74  ting occurs or t
21b0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
21c0: 0a 2a 2a 20 64 65 71 75 6f 74 65 64 20 73 74 72  .** dequoted str
21d0: 69 6e 67 2c 20 65 78 63 6c 75 73 69 76 65 20 6f  ing, exclusive o
21e0: 66 20 74 68 65 20 7a 65 72 6f 20 74 65 72 6d 69  f the zero termi
21f0: 6e 61 74 6f 72 2c 20 69 66 20 64 65 71 75 6f 74  nator, if dequot
2200: 69 6e 67 20 64 6f 65 73 0a 2a 2a 20 6f 63 63 75  ing does.** occu
2210: 72 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 32 2d 30 32  r..**.** 2002-02
2220: 2d 31 34 3a 20 54 68 69 73 20 72 6f 75 74 69 6e  -14: This routin
2230: 65 20 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f  e is extended to
2240: 20 72 65 6d 6f 76 65 20 4d 53 2d 41 63 63 65 73   remove MS-Acces
2250: 73 20 73 74 79 6c 65 0a 2a 2a 20 62 72 61 63 6b  s style.** brack
2260: 65 74 73 20 66 72 6f 6d 20 61 72 6f 75 6e 64 20  ets from around 
2270: 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 46 6f  identifiers.  Fo
2280: 72 20 65 78 61 6d 70 6c 65 3a 20 20 22 5b 61 2d  r example:  "[a-
2290: 62 2d 63 5d 22 20 62 65 63 6f 6d 65 73 0a 2a 2a  b-c]" becomes.**
22a0: 20 22 61 2d 62 2d 63 22 2e 0a 2a 2f 0a 76 6f 69   "a-b-c"..*/.voi
22b0: 64 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  d sqlite3Dequote
22c0: 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61  (char *z){.  cha
22d0: 72 20 71 75 6f 74 65 3b 0a 20 20 69 6e 74 20 69  r quote;.  int i
22e0: 2c 20 6a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  , j;.  if( z==0 
22f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 71 75 6f 74  ) return;.  quot
2300: 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66 28 20  e = z[0];.  if( 
2310: 21 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28  !sqlite3Isquote(
2320: 71 75 6f 74 65 29 20 29 20 72 65 74 75 72 6e 3b  quote) ) return;
2330: 0a 20 20 69 66 28 20 71 75 6f 74 65 3d 3d 27 5b  .  if( quote=='[
2340: 27 20 29 20 71 75 6f 74 65 20 3d 20 27 5d 27 3b  ' ) quote = ']';
2350: 0a 20 20 66 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b  .  for(i=1, j=0;
2360: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2370: 72 74 28 20 7a 5b 69 5d 20 29 3b 0a 20 20 20 20  rt( z[i] );.    
2380: 69 66 28 20 7a 5b 69 5d 3d 3d 71 75 6f 74 65 20  if( z[i]==quote 
2390: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
23a0: 2b 31 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20  +1]==quote ){.  
23b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 71        z[j++] = q
23c0: 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 69 2b  uote;.        i+
23d0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
23e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2400: 7b 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d  {.      z[j++] =
2410: 20 7a 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d   z[i];.    }.  }
2420: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 76  .  z[j] = 0;.}.v
2430: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71 75 6f  oid sqlite3Dequo
2440: 74 65 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b  teExpr(Expr *p){
2450: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2460: 65 33 49 73 71 75 6f 74 65 28 70 2d 3e 75 2e 7a  e3Isquote(p->u.z
2470: 54 6f 6b 65 6e 5b 30 5d 29 20 29 3b 0a 20 20 70  Token[0]) );.  p
2480: 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 2d 3e 75 2e  ->flags |= p->u.
2490: 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 3f  zToken[0]=='"' ?
24a0: 20 45 50 5f 51 75 6f 74 65 64 7c 45 50 5f 44 62   EP_Quoted|EP_Db
24b0: 6c 51 75 6f 74 65 64 20 3a 20 45 50 5f 51 75 6f  lQuoted : EP_Quo
24c0: 74 65 64 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ted;.  sqlite3De
24d0: 71 75 6f 74 65 28 70 2d 3e 75 2e 7a 54 6f 6b 65  quote(p->u.zToke
24e0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  n);.}../*.** Gen
24f0: 65 72 61 74 65 20 61 20 54 6f 6b 65 6e 20 6f 62  erate a Token ob
2500: 6a 65 63 74 20 66 72 6f 6d 20 61 20 73 74 72 69  ject from a stri
2510: 6e 67 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ng.*/.void sqlit
2520: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 54 6f 6b 65  e3TokenInit(Toke
2530: 6e 20 2a 70 2c 20 63 68 61 72 20 2a 7a 29 7b 0a  n *p, char *z){.
2540: 20 20 70 2d 3e 7a 20 3d 20 7a 3b 0a 20 20 70 2d    p->z = z;.  p-
2550: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
2560: 65 6e 33 30 28 7a 29 3b 0a 7d 0a 0a 2f 2a 20 43  en30(z);.}../* C
2570: 6f 6e 76 65 6e 69 65 6e 74 20 73 68 6f 72 74 2d  onvenient short-
2580: 68 61 6e 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  hand */.#define 
2590: 55 70 70 65 72 54 6f 4c 6f 77 65 72 20 73 71 6c  UpperToLower sql
25a0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
25b0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 73 79 73  ../*.** Some sys
25c0: 74 65 6d 73 20 68 61 76 65 20 73 74 72 69 63 6d  tems have stricm
25d0: 70 28 29 2e 20 20 4f 74 68 65 72 73 20 68 61 76  p().  Others hav
25e0: 65 20 73 74 72 63 61 73 65 63 6d 70 28 29 2e 20  e strcasecmp(). 
25f0: 20 42 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 72   Because.** ther
2600: 65 20 69 73 20 6e 6f 20 63 6f 6e 73 69 73 74 65  e is no consiste
2610: 6e 63 79 2c 20 77 65 20 77 69 6c 6c 20 64 65 66  ncy, we will def
2620: 69 6e 65 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2a 0a  ine our own..**.
2630: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
2640: 4e 2d 4f 46 3a 20 52 2d 33 30 32 34 33 2d 30 32  N-OF: R-30243-02
2650: 34 39 34 20 54 68 65 20 73 71 6c 69 74 65 33 5f  494 The sqlite3_
2660: 73 74 72 69 63 6d 70 28 29 20 61 6e 64 0a 2a 2a  stricmp() and.**
2670: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
2680: 70 28 29 20 41 50 49 73 20 61 6c 6c 6f 77 20 61  p() APIs allow a
2690: 70 70 6c 69 63 61 74 69 6f 6e 73 20 61 6e 64 20  pplications and 
26a0: 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f 20 63 6f  extensions to co
26b0: 6d 70 61 72 65 0a 2a 2a 20 74 68 65 20 63 6f 6e  mpare.** the con
26c0: 74 65 6e 74 73 20 6f 66 20 74 77 6f 20 62 75 66  tents of two buf
26d0: 66 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  fers containing 
26e0: 55 54 46 2d 38 20 73 74 72 69 6e 67 73 20 69 6e  UTF-8 strings in
26f0: 20 61 0a 2a 2a 20 63 61 73 65 2d 69 6e 64 65 70   a.** case-indep
2700: 65 6e 64 65 6e 74 20 66 61 73 68 69 6f 6e 2c 20  endent fashion, 
2710: 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  using the same d
2720: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 63 61  efinition of "ca
2730: 73 65 0a 2a 2a 20 69 6e 64 65 70 65 6e 64 65 6e  se.** independen
2740: 63 65 22 20 74 68 61 74 20 53 51 4c 69 74 65 20  ce" that SQLite 
2750: 75 73 65 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  uses internally 
2760: 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 69  when comparing i
2770: 64 65 6e 74 69 66 69 65 72 73 2e 0a 2a 2f 0a 69  dentifiers..*/.i
2780: 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  nt sqlite3_stric
2790: 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  mp(const char *z
27a0: 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Left, const char
27b0: 20 2a 7a 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *zRight){.  if(
27c0: 20 7a 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   zLeft==0 ){.   
27d0: 20 72 65 74 75 72 6e 20 7a 52 69 67 68 74 20 3f   return zRight ?
27e0: 20 2d 31 20 3a 20 30 3b 0a 20 20 7d 65 6c 73 65   -1 : 0;.  }else
27f0: 20 69 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29   if( zRight==0 )
2800: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
2810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
2820: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66  ite3StrICmp(zLef
2830: 74 2c 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 69 6e  t, zRight);.}.in
2840: 74 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  t sqlite3StrICmp
2850: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65  (const char *zLe
2860: 66 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ft, const char *
2870: 7a 52 69 67 68 74 29 7b 0a 20 20 75 6e 73 69 67  zRight){.  unsig
2880: 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b  ned char *a, *b;
2890: 0a 20 20 69 6e 74 20 63 2c 20 78 3b 0a 20 20 61  .  int c, x;.  a
28a0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
28b0: 72 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20 3d  r *)zLeft;.  b =
28c0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
28d0: 2a 29 7a 52 69 67 68 74 3b 0a 20 20 66 6f 72 28  *)zRight;.  for(
28e0: 3b 3b 29 7b 0a 20 20 20 20 63 20 3d 20 2a 61 3b  ;;){.    c = *a;
28f0: 0a 20 20 20 20 78 20 3d 20 2a 62 3b 0a 20 20 20  .    x = *b;.   
2900: 20 69 66 28 20 63 3d 3d 78 20 29 7b 0a 20 20 20   if( c==x ){.   
2910: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 62 72     if( c==0 ) br
2920: 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
2930: 20 20 20 20 20 20 63 20 3d 20 28 69 6e 74 29 55        c = (int)U
2940: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 20 2d  pperToLower[c] -
2950: 20 28 69 6e 74 29 55 70 70 65 72 54 6f 4c 6f 77   (int)UpperToLow
2960: 65 72 5b 78 5d 3b 0a 20 20 20 20 20 20 69 66 28  er[x];.      if(
2970: 20 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20   c ) break;.    
2980: 7d 0a 20 20 20 20 61 2b 2b 3b 0a 20 20 20 20 62  }.    a++;.    b
2990: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
29a0: 20 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   c;.}.int sqlite
29b0: 33 5f 73 74 72 6e 69 63 6d 70 28 63 6f 6e 73 74  3_strnicmp(const
29c0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63 6f   char *zLeft, co
29d0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 69 67 68 74  nst char *zRight
29e0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 67 69  , int N){.  regi
29f0: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 63 68  ster unsigned ch
2a00: 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20 69 66 28  ar *a, *b;.  if(
2a10: 20 7a 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   zLeft==0 ){.   
2a20: 20 72 65 74 75 72 6e 20 7a 52 69 67 68 74 20 3f   return zRight ?
2a30: 20 2d 31 20 3a 20 30 3b 0a 20 20 7d 65 6c 73 65   -1 : 0;.  }else
2a40: 20 69 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29   if( zRight==0 )
2a50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
2a60: 20 20 7d 0a 20 20 61 20 3d 20 28 75 6e 73 69 67    }.  a = (unsig
2a70: 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c 65 66 74  ned char *)zLeft
2a80: 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e 65  ;.  b = (unsigne
2a90: 64 20 63 68 61 72 20 2a 29 7a 52 69 67 68 74 3b  d char *)zRight;
2aa0: 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20  .  while( N-- > 
2ab0: 30 20 26 26 20 2a 61 21 3d 30 20 26 26 20 55 70  0 && *a!=0 && Up
2ac0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d 3d  perToLower[*a]==
2ad0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d  UpperToLower[*b]
2ae0: 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a 20  ){ a++; b++; }. 
2af0: 20 72 65 74 75 72 6e 20 4e 3c 30 20 3f 20 30 20   return N<0 ? 0 
2b00: 3a 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  : UpperToLower[*
2b10: 61 5d 20 2d 20 55 70 70 65 72 54 6f 4c 6f 77 65  a] - UpperToLowe
2b20: 72 5b 2a 62 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r[*b];.}../*.** 
2b30: 43 6f 6d 70 75 74 65 20 31 30 20 74 6f 20 74 68  Compute 10 to th
2b40: 65 20 45 2d 74 68 20 70 6f 77 65 72 2e 20 20 45  e E-th power.  E
2b50: 78 61 6d 70 6c 65 73 3a 20 20 45 3d 3d 31 20 72  xamples:  E==1 r
2b60: 65 73 75 6c 74 73 20 69 6e 20 31 30 2e 0a 2a 2a  esults in 10..**
2b70: 20 45 3d 3d 32 20 72 65 73 75 6c 74 73 20 69 6e   E==2 results in
2b80: 20 31 30 30 2e 20 20 45 3d 3d 35 30 20 72 65 73   100.  E==50 res
2b90: 75 6c 74 73 20 69 6e 20 31 2e 30 65 35 30 2e 0a  ults in 1.0e50..
2ba0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2bb0: 6e 65 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ne only works fo
2bc0: 72 20 76 61 6c 75 65 73 20 6f 66 20 45 20 62 65  r values of E be
2bd0: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 34 31 2e  tween 1 and 341.
2be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 4f 4e 47 44  .*/.static LONGD
2bf0: 4f 55 42 4c 45 5f 54 59 50 45 20 73 71 6c 69 74  OUBLE_TYPE sqlit
2c00: 65 33 50 6f 77 31 30 28 69 6e 74 20 45 29 7b 0a  e3Pow10(int E){.
2c10: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
2c20: 5f 56 45 52 29 0a 20 20 73 74 61 74 69 63 20 63  _VER).  static c
2c30: 6f 6e 73 74 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  onst LONGDOUBLE_
2c40: 54 59 50 45 20 78 5b 5d 20 3d 20 7b 0a 20 20 20  TYPE x[] = {.   
2c50: 20 31 2e 30 65 2b 30 30 31 2c 0a 20 20 20 20 31   1.0e+001,.    1
2c60: 2e 30 65 2b 30 30 32 2c 0a 20 20 20 20 31 2e 30  .0e+002,.    1.0
2c70: 65 2b 30 30 34 2c 0a 20 20 20 20 31 2e 30 65 2b  e+004,.    1.0e+
2c80: 30 30 38 2c 0a 20 20 20 20 31 2e 30 65 2b 30 31  008,.    1.0e+01
2c90: 36 2c 0a 20 20 20 20 31 2e 30 65 2b 30 33 32 2c  6,.    1.0e+032,
2ca0: 0a 20 20 20 20 31 2e 30 65 2b 30 36 34 2c 0a 20  .    1.0e+064,. 
2cb0: 20 20 20 31 2e 30 65 2b 31 32 38 2c 0a 20 20 20     1.0e+128,.   
2cc0: 20 31 2e 30 65 2b 32 35 36 0a 20 20 7d 3b 0a 20   1.0e+256.  };. 
2cd0: 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45   LONGDOUBLE_TYPE
2ce0: 20 72 20 3d 20 31 2e 30 3b 0a 20 20 69 6e 74 20   r = 1.0;.  int 
2cf0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 45 3e 3d  i;.  assert( E>=
2d00: 30 20 26 26 20 45 3c 3d 33 30 37 20 29 3b 0a 20  0 && E<=307 );. 
2d10: 20 66 6f 72 28 69 3d 30 3b 20 45 21 3d 30 3b 20   for(i=0; E!=0; 
2d20: 69 2b 2b 2c 20 45 20 3e 3e 3d 31 29 7b 0a 20 20  i++, E >>=1){.  
2d30: 20 20 69 66 28 20 45 20 26 20 31 20 29 20 72 20    if( E & 1 ) r 
2d40: 2a 3d 20 78 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  *= x[i];.  }.  r
2d50: 65 74 75 72 6e 20 72 3b 0a 23 65 6c 73 65 0a 20  eturn r;.#else. 
2d60: 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45   LONGDOUBLE_TYPE
2d70: 20 78 20 3d 20 31 30 2e 30 3b 0a 20 20 4c 4f 4e   x = 10.0;.  LON
2d80: 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 72 20 3d  GDOUBLE_TYPE r =
2d90: 20 31 2e 30 3b 0a 20 20 77 68 69 6c 65 28 31 29   1.0;.  while(1)
2da0: 7b 0a 20 20 20 20 69 66 28 20 45 20 26 20 31 20  {.    if( E & 1 
2db0: 29 20 72 20 2a 3d 20 78 3b 0a 20 20 20 20 45 20  ) r *= x;.    E 
2dc0: 3e 3e 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 45  >>= 1;.    if( E
2dd0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2de0: 20 78 20 2a 3d 20 78 3b 0a 20 20 7d 0a 20 20 72   x *= x;.  }.  r
2df0: 65 74 75 72 6e 20 72 3b 20 0a 23 65 6e 64 69 66  eturn r; .#endif
2e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
2e10: 72 69 6e 67 20 7a 5b 5d 20 69 73 20 61 6e 20 74  ring z[] is an t
2e20: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
2e30: 6f 6e 20 6f 66 20 61 20 72 65 61 6c 20 6e 75 6d  on of a real num
2e40: 62 65 72 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ber..** Convert 
2e50: 74 68 69 73 20 73 74 72 69 6e 67 20 74 6f 20 61  this string to a
2e60: 20 64 6f 75 62 6c 65 20 61 6e 64 20 77 72 69 74   double and writ
2e70: 65 20 69 74 20 69 6e 74 6f 20 2a 70 52 65 73 75  e it into *pResu
2e80: 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74  lt..**.** The st
2e90: 72 69 6e 67 20 7a 5b 5d 20 69 73 20 6c 65 6e 67  ring z[] is leng
2ea0: 74 68 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  th bytes in leng
2eb0: 74 68 20 28 62 79 74 65 73 2c 20 6e 6f 74 20 63  th (bytes, not c
2ec0: 68 61 72 61 63 74 65 72 73 29 20 61 6e 64 0a 2a  haracters) and.*
2ed0: 2a 20 75 73 65 73 20 74 68 65 20 65 6e 63 6f 64  * uses the encod
2ee0: 69 6e 67 20 65 6e 63 2e 20 20 54 68 65 20 73 74  ing enc.  The st
2ef0: 72 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65  ring is not nece
2f00: 73 73 61 72 69 6c 79 20 7a 65 72 6f 2d 74 65 72  ssarily zero-ter
2f10: 6d 69 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  minated..**.** R
2f20: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2f30: 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 76 61  e result is a va
2f40: 6c 69 64 20 72 65 61 6c 20 6e 75 6d 62 65 72 20  lid real number 
2f50: 28 6f 72 20 69 6e 74 65 67 65 72 29 20 61 6e 64  (or integer) and
2f60: 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
2f70: 20 73 74 72 69 6e 67 20 69 73 20 65 6d 70 74 79   string is empty
2f80: 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 65 78 74   or contains ext
2f90: 72 61 6e 65 6f 75 73 20 74 65 78 74 2e 20 20 56  raneous text.  V
2fa0: 61 6c 69 64 20 6e 75 6d 62 65 72 73 0a 2a 2a 20  alid numbers.** 
2fb0: 61 72 65 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68  are in one of th
2fc0: 65 73 65 20 66 6f 72 6d 61 74 73 3a 0a 2a 2a 0a  ese formats:.**.
2fd0: 2a 2a 20 20 20 20 5b 2b 2d 5d 64 69 67 69 74 73  **    [+-]digits
2fe0: 5b 45 5b 2b 2d 5d 64 69 67 69 74 73 5d 0a 2a 2a  [E[+-]digits].**
2ff0: 20 20 20 20 5b 2b 2d 5d 64 69 67 69 74 73 2e 5b      [+-]digits.[
3000: 64 69 67 69 74 73 5d 5b 45 5b 2b 2d 5d 64 69 67  digits][E[+-]dig
3010: 69 74 73 5d 0a 2a 2a 20 20 20 20 5b 2b 2d 5d 2e  its].**    [+-].
3020: 64 69 67 69 74 73 5b 45 5b 2b 2d 5d 64 69 67 69  digits[E[+-]digi
3030: 74 73 5d 0a 2a 2a 0a 2a 2a 20 4c 65 61 64 69 6e  ts].**.** Leadin
3040: 67 20 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77  g and trailing w
3050: 68 69 74 65 73 70 61 63 65 20 69 73 20 69 67 6e  hitespace is ign
3060: 6f 72 65 64 20 66 6f 72 20 74 68 65 20 70 75 72  ored for the pur
3070: 70 6f 73 65 20 6f 66 20 64 65 74 65 72 6d 69 6e  pose of determin
3080: 69 6e 67 0a 2a 2a 20 76 61 6c 69 64 69 74 79 2e  ing.** validity.
3090: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d 65 20 70  .**.** If some p
30a0: 72 65 66 69 78 20 6f 66 20 74 68 65 20 69 6e 70  refix of the inp
30b0: 75 74 20 73 74 72 69 6e 67 20 69 73 20 61 20 76  ut string is a v
30c0: 61 6c 69 64 20 6e 75 6d 62 65 72 2c 20 74 68 69  alid number, thi
30d0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
30e0: 75 72 6e 73 20 46 41 4c 53 45 20 62 75 74 20 69  urns FALSE but i
30f0: 74 20 73 74 69 6c 6c 20 63 6f 6e 76 65 72 74 73  t still converts
3100: 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20   the prefix and 
3110: 77 72 69 74 65 73 20 74 68 65 20 72 65 73 75 6c  writes the resul
3120: 74 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 65 73 75  t.** into *pResu
3130: 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
3140: 65 33 41 74 6f 46 28 63 6f 6e 73 74 20 63 68 61  e3AtoF(const cha
3150: 72 20 2a 7a 2c 20 64 6f 75 62 6c 65 20 2a 70 52  r *z, double *pR
3160: 65 73 75 6c 74 2c 20 69 6e 74 20 6c 65 6e 67 74  esult, int lengt
3170: 68 2c 20 75 38 20 65 6e 63 29 7b 0a 23 69 66 6e  h, u8 enc){.#ifn
3180: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3190: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
31a0: 20 69 6e 74 20 69 6e 63 72 3b 0a 20 20 63 6f 6e   int incr;.  con
31b0: 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20  st char *zEnd = 
31c0: 7a 20 2b 20 6c 65 6e 67 74 68 3b 0a 20 20 2f 2a  z + length;.  /*
31d0: 20 73 69 67 6e 20 2a 20 73 69 67 6e 69 66 69 63   sign * signific
31e0: 61 6e 64 20 2a 20 28 31 30 20 5e 20 28 65 73 69  and * (10 ^ (esi
31f0: 67 6e 20 2a 20 65 78 70 6f 6e 65 6e 74 29 29 20  gn * exponent)) 
3200: 2a 2f 0a 20 20 69 6e 74 20 73 69 67 6e 20 3d 20  */.  int sign = 
3210: 31 3b 20 20 20 20 2f 2a 20 73 69 67 6e 20 6f 66  1;    /* sign of
3220: 20 73 69 67 6e 69 66 69 63 61 6e 64 20 2a 2f 0a   significand */.
3230: 20 20 69 36 34 20 73 20 3d 20 30 3b 20 20 20 20    i64 s = 0;    
3240: 20 20 20 2f 2a 20 73 69 67 6e 69 66 69 63 61 6e     /* significan
3250: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 20 3d 20 30  d */.  int d = 0
3260: 3b 20 20 20 20 20 20 20 2f 2a 20 61 64 6a 75 73  ;       /* adjus
3270: 74 20 65 78 70 6f 6e 65 6e 74 20 66 6f 72 20 73  t exponent for s
3280: 68 69 66 74 69 6e 67 20 64 65 63 69 6d 61 6c 20  hifting decimal 
3290: 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65  point */.  int e
32a0: 73 69 67 6e 20 3d 20 31 3b 20 20 20 2f 2a 20 73  sign = 1;   /* s
32b0: 69 67 6e 20 6f 66 20 65 78 70 6f 6e 65 6e 74 20  ign of exponent 
32c0: 2a 2f 0a 20 20 69 6e 74 20 65 20 3d 20 30 3b 20  */.  int e = 0; 
32d0: 20 20 20 20 20 20 2f 2a 20 65 78 70 6f 6e 65 6e        /* exponen
32e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 56 61 6c 69  t */.  int eVali
32f0: 64 20 3d 20 31 3b 20 20 2f 2a 20 54 72 75 65 20  d = 1;  /* True 
3300: 65 78 70 6f 6e 65 6e 74 20 69 73 20 65 69 74 68  exponent is eith
3310: 65 72 20 6e 6f 74 20 75 73 65 64 20 6f 72 20 69  er not used or i
3320: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 2a 2f  s well-formed */
3330: 0a 20 20 64 6f 75 62 6c 65 20 72 65 73 75 6c 74  .  double result
3340: 3b 0a 20 20 69 6e 74 20 6e 44 69 67 69 74 73 20  ;.  int nDigits 
3350: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 6e 4e 75  = 0;.  int nonNu
3360: 6d 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20  m = 0;  /* True 
3370: 69 66 20 69 6e 70 75 74 20 63 6f 6e 74 61 69 6e  if input contain
3380: 73 20 55 54 46 31 36 20 77 69 74 68 20 68 69 67  s UTF16 with hig
3390: 68 20 62 79 74 65 20 6e 6f 6e 2d 7a 65 72 6f 20  h byte non-zero 
33a0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 65 6e  */..  assert( en
33b0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c==SQLITE_UTF8 |
33c0: 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  | enc==SQLITE_UT
33d0: 46 31 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d 53 51  F16LE || enc==SQ
33e0: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
33f0: 20 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 2e 30    *pResult = 0.0
3400: 3b 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 72  ;   /* Default r
3410: 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 69 6e 20  eturn value, in 
3420: 63 61 73 65 20 6f 66 20 61 6e 20 65 72 72 6f 72  case of an error
3430: 20 2a 2f 0a 0a 20 20 69 66 28 20 65 6e 63 3d 3d   */..  if( enc==
3440: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
3450: 20 20 20 69 6e 63 72 20 3d 20 31 3b 0a 20 20 7d     incr = 1;.  }
3460: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
3470: 0a 20 20 20 20 69 6e 63 72 20 3d 20 32 3b 0a 20  .    incr = 2;. 
3480: 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
3490: 45 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26 26 20  E_UTF16LE==2 && 
34a0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d  SQLITE_UTF16BE==
34b0: 33 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  3 );.    for(i=3
34c0: 2d 65 6e 63 3b 20 69 3c 6c 65 6e 67 74 68 20 26  -enc; i<length &
34d0: 26 20 7a 5b 69 5d 3d 3d 30 3b 20 69 2b 3d 32 29  & z[i]==0; i+=2)
34e0: 7b 7d 0a 20 20 20 20 6e 6f 6e 4e 75 6d 20 3d 20  {}.    nonNum = 
34f0: 69 3c 6c 65 6e 67 74 68 3b 0a 20 20 20 20 7a 45  i<length;.    zE
3500: 6e 64 20 3d 20 26 7a 5b 69 5e 31 5d 3b 0a 20 20  nd = &z[i^1];.  
3510: 20 20 7a 20 2b 3d 20 28 65 6e 63 26 31 29 3b 0a    z += (enc&1);.
3520: 20 20 7d 0a 0a 20 20 2f 2a 20 73 6b 69 70 20 6c    }..  /* skip l
3530: 65 61 64 69 6e 67 20 73 70 61 63 65 73 20 2a 2f  eading spaces */
3540: 0a 20 20 77 68 69 6c 65 28 20 7a 3c 7a 45 6e 64  .  while( z<zEnd
3550: 20 26 26 20 73 71 6c 69 74 65 33 49 73 73 70 61   && sqlite3Isspa
3560: 63 65 28 2a 7a 29 20 29 20 7a 2b 3d 69 6e 63 72  ce(*z) ) z+=incr
3570: 3b 0a 20 20 69 66 28 20 7a 3e 3d 7a 45 6e 64 20  ;.  if( z>=zEnd 
3580: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
3590: 2a 20 67 65 74 20 73 69 67 6e 20 6f 66 20 73 69  * get sign of si
35a0: 67 6e 69 66 69 63 61 6e 64 20 2a 2f 0a 20 20 69  gnificand */.  i
35b0: 66 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b 0a 20 20  f( *z=='-' ){.  
35c0: 20 20 73 69 67 6e 20 3d 20 2d 31 3b 0a 20 20 20    sign = -1;.   
35d0: 20 7a 2b 3d 69 6e 63 72 3b 0a 20 20 7d 65 6c 73   z+=incr;.  }els
35e0: 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b  e if( *z=='+' ){
35f0: 0a 20 20 20 20 7a 2b 3d 69 6e 63 72 3b 0a 20 20  .    z+=incr;.  
3600: 7d 0a 0a 20 20 2f 2a 20 63 6f 70 79 20 6d 61 78  }..  /* copy max
3610: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 64 69 67   significant dig
3620: 69 74 73 20 74 6f 20 73 69 67 6e 69 66 69 63 61  its to significa
3630: 6e 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a  nd */.  while( z
3640: 3c 7a 45 6e 64 20 26 26 20 73 71 6c 69 74 65 33  <zEnd && sqlite3
3650: 49 73 64 69 67 69 74 28 2a 7a 29 20 26 26 20 73  Isdigit(*z) && s
3660: 3c 28 28 4c 41 52 47 45 53 54 5f 49 4e 54 36 34  <((LARGEST_INT64
3670: 2d 39 29 2f 31 30 29 20 29 7b 0a 20 20 20 20 73  -9)/10) ){.    s
3680: 20 3d 20 73 2a 31 30 20 2b 20 28 2a 7a 20 2d 20   = s*10 + (*z - 
3690: 27 30 27 29 3b 0a 20 20 20 20 7a 2b 3d 69 6e 63  '0');.    z+=inc
36a0: 72 3b 20 6e 44 69 67 69 74 73 2b 2b 3b 0a 20 20  r; nDigits++;.  
36b0: 7d 0a 0a 20 20 2f 2a 20 73 6b 69 70 20 6e 6f 6e  }..  /* skip non
36c0: 2d 73 69 67 6e 69 66 69 63 61 6e 74 20 73 69 67  -significant sig
36d0: 6e 69 66 69 63 61 6e 64 20 64 69 67 69 74 73 0a  nificand digits.
36e0: 20 20 2a 2a 20 28 69 6e 63 72 65 61 73 65 20 65    ** (increase e
36f0: 78 70 6f 6e 65 6e 74 20 62 79 20 64 20 74 6f 20  xponent by d to 
3700: 73 68 69 66 74 20 64 65 63 69 6d 61 6c 20 6c 65  shift decimal le
3710: 66 74 29 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ft) */.  while( 
3720: 7a 3c 7a 45 6e 64 20 26 26 20 73 71 6c 69 74 65  z<zEnd && sqlite
3730: 33 49 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20  3Isdigit(*z) ){ 
3740: 7a 2b 3d 69 6e 63 72 3b 20 6e 44 69 67 69 74 73  z+=incr; nDigits
3750: 2b 2b 3b 20 64 2b 2b 3b 20 7d 0a 20 20 69 66 28  ++; d++; }.  if(
3760: 20 7a 3e 3d 7a 45 6e 64 20 29 20 67 6f 74 6f 20   z>=zEnd ) goto 
3770: 64 6f 5f 61 74 6f 66 5f 63 61 6c 63 3b 0a 0a 20  do_atof_calc;.. 
3780: 20 2f 2a 20 69 66 20 64 65 63 69 6d 61 6c 20 70   /* if decimal p
3790: 6f 69 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20  oint is present 
37a0: 2a 2f 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27  */.  if( *z=='.'
37b0: 20 29 7b 0a 20 20 20 20 7a 2b 3d 69 6e 63 72 3b   ){.    z+=incr;
37c0: 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 64 69 67  .    /* copy dig
37d0: 69 74 73 20 66 72 6f 6d 20 61 66 74 65 72 20 64  its from after d
37e0: 65 63 69 6d 61 6c 20 74 6f 20 73 69 67 6e 69 66  ecimal to signif
37f0: 69 63 61 6e 64 0a 20 20 20 20 2a 2a 20 28 64 65  icand.    ** (de
3800: 63 72 65 61 73 65 20 65 78 70 6f 6e 65 6e 74 20  crease exponent 
3810: 62 79 20 64 20 74 6f 20 73 68 69 66 74 20 64 65  by d to shift de
3820: 63 69 6d 61 6c 20 72 69 67 68 74 29 20 2a 2f 0a  cimal right) */.
3830: 20 20 20 20 77 68 69 6c 65 28 20 7a 3c 7a 45 6e      while( z<zEn
3840: 64 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  d && sqlite3Isdi
3850: 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 20  git(*z) ){.     
3860: 20 69 66 28 20 73 3c 28 28 4c 41 52 47 45 53 54   if( s<((LARGEST
3870: 5f 49 4e 54 36 34 2d 39 29 2f 31 30 29 20 29 7b  _INT64-9)/10) ){
3880: 0a 20 20 20 20 20 20 20 20 73 20 3d 20 73 2a 31  .        s = s*1
3890: 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27 29 3b 0a  0 + (*z - '0');.
38a0: 20 20 20 20 20 20 20 20 64 2d 2d 3b 0a 20 20 20          d--;.   
38b0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 3d 69 6e     }.      z+=in
38c0: 63 72 3b 20 6e 44 69 67 69 74 73 2b 2b 3b 0a 20  cr; nDigits++;. 
38d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
38e0: 3e 3d 7a 45 6e 64 20 29 20 67 6f 74 6f 20 64 6f  >=zEnd ) goto do
38f0: 5f 61 74 6f 66 5f 63 61 6c 63 3b 0a 0a 20 20 2f  _atof_calc;..  /
3900: 2a 20 69 66 20 65 78 70 6f 6e 65 6e 74 20 69 73  * if exponent is
3910: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 66   present */.  if
3920: 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d  ( *z=='e' || *z=
3930: 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 3d 69  ='E' ){.    z+=i
3940: 6e 63 72 3b 0a 20 20 20 20 65 56 61 6c 69 64 20  ncr;.    eValid 
3950: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  = 0;..    /* Thi
3960: 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65 65 64  s branch is need
3970: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 28 68  ed to avoid a (h
3980: 61 72 6d 6c 65 73 73 29 20 62 75 66 66 65 72 20  armless) buffer 
3990: 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 0a  overread.  The .
39a0: 20 20 20 20 2a 2a 20 73 70 65 63 69 61 6c 20 63      ** special c
39b0: 6f 6d 6d 65 6e 74 20 61 6c 65 72 74 73 20 74 68  omment alerts th
39c0: 65 20 6d 75 74 61 74 69 6f 6e 20 74 65 73 74 65  e mutation teste
39d0: 72 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  r that the corre
39e0: 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a  ct answer.    **
39f0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65 76 65   is obtained eve
3a00: 6e 20 69 66 20 74 68 65 20 62 72 61 6e 63 68 20  n if the branch 
3a10: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
3a20: 20 20 69 66 28 20 7a 3e 3d 7a 45 6e 64 20 29 20    if( z>=zEnd ) 
3a30: 67 6f 74 6f 20 64 6f 5f 61 74 6f 66 5f 63 61 6c  goto do_atof_cal
3a40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3a50: 2f 2a 50 52 45 56 45 4e 54 53 2d 48 41 52 4d 4c  /*PREVENTS-HARML
3a60: 45 53 53 2d 4f 56 45 52 52 45 41 44 2a 2f 0a 0a  ESS-OVERREAD*/..
3a70: 20 20 20 20 2f 2a 20 67 65 74 20 73 69 67 6e 20      /* get sign 
3a80: 6f 66 20 65 78 70 6f 6e 65 6e 74 20 2a 2f 0a 20  of exponent */. 
3a90: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 29     if( *z=='-' )
3aa0: 7b 0a 20 20 20 20 20 20 65 73 69 67 6e 20 3d 20  {.      esign = 
3ab0: 2d 31 3b 0a 20 20 20 20 20 20 7a 2b 3d 69 6e 63  -1;.      z+=inc
3ac0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
3ad0: 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20   *z=='+' ){.    
3ae0: 20 20 7a 2b 3d 69 6e 63 72 3b 0a 20 20 20 20 7d    z+=incr;.    }
3af0: 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 64 69 67  .    /* copy dig
3b00: 69 74 73 20 74 6f 20 65 78 70 6f 6e 65 6e 74 20  its to exponent 
3b10: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 3c  */.    while( z<
3b20: 7a 45 6e 64 20 26 26 20 73 71 6c 69 74 65 33 49  zEnd && sqlite3I
3b30: 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20  sdigit(*z) ){.  
3b40: 20 20 20 20 65 20 3d 20 65 3c 31 30 30 30 30 20      e = e<10000 
3b50: 3f 20 28 65 2a 31 30 20 2b 20 28 2a 7a 20 2d 20  ? (e*10 + (*z - 
3b60: 27 30 27 29 29 20 3a 20 31 30 30 30 30 3b 0a 20  '0')) : 10000;. 
3b70: 20 20 20 20 20 7a 2b 3d 69 6e 63 72 3b 0a 20 20       z+=incr;.  
3b80: 20 20 20 20 65 56 61 6c 69 64 20 3d 20 31 3b 0a      eValid = 1;.
3b90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
3ba0: 73 6b 69 70 20 74 72 61 69 6c 69 6e 67 20 73 70  skip trailing sp
3bb0: 61 63 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28  aces */.  while(
3bc0: 20 7a 3c 7a 45 6e 64 20 26 26 20 73 71 6c 69 74   z<zEnd && sqlit
3bd0: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
3be0: 7a 2b 3d 69 6e 63 72 3b 0a 0a 64 6f 5f 61 74 6f  z+=incr;..do_ato
3bf0: 66 5f 63 61 6c 63 3a 0a 20 20 2f 2a 20 61 64 6a  f_calc:.  /* adj
3c00: 75 73 74 20 65 78 70 6f 6e 65 6e 74 20 62 79 20  ust exponent by 
3c10: 64 2c 20 61 6e 64 20 75 70 64 61 74 65 20 73 69  d, and update si
3c20: 67 6e 20 2a 2f 0a 20 20 65 20 3d 20 28 65 2a 65  gn */.  e = (e*e
3c30: 73 69 67 6e 29 20 2b 20 64 3b 0a 20 20 69 66 28  sign) + d;.  if(
3c40: 20 65 3c 30 20 29 20 7b 0a 20 20 20 20 65 73 69   e<0 ) {.    esi
3c50: 67 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 65 20 2a  gn = -1;.    e *
3c60: 3d 20 2d 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  = -1;.  } else {
3c70: 0a 20 20 20 20 65 73 69 67 6e 20 3d 20 31 3b 0a  .    esign = 1;.
3c80: 20 20 7d 0a 0a 20 20 69 66 28 20 73 3d 3d 30 20    }..  if( s==0 
3c90: 29 20 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  ) {.    /* In th
3ca0: 65 20 49 45 45 45 20 37 35 34 20 73 74 61 6e 64  e IEEE 754 stand
3cb0: 61 72 64 2c 20 7a 65 72 6f 20 69 73 20 73 69 67  ard, zero is sig
3cc0: 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 73 75  ned. */.    resu
3cd0: 6c 74 20 3d 20 73 69 67 6e 3c 30 20 3f 20 2d 28  lt = sign<0 ? -(
3ce0: 64 6f 75 62 6c 65 29 30 20 3a 20 28 64 6f 75 62  double)0 : (doub
3cf0: 6c 65 29 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  le)0;.  } else {
3d00: 0a 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  .    /* Attempt 
3d10: 74 6f 20 72 65 64 75 63 65 20 65 78 70 6f 6e 65  to reduce expone
3d20: 6e 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nt..    **.    *
3d30: 2a 20 42 72 61 6e 63 68 65 73 20 74 68 61 74 20  * Branches that 
3d40: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
3d50: 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
3d60: 20 61 6e 73 77 65 72 20 62 75 74 20 77 68 69 63   answer but whic
3d70: 68 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 68 65  h only.    ** he
3d80: 6c 70 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  lp to obtain the
3d90: 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
3da0: 66 61 73 74 65 72 20 61 72 65 20 6d 61 72 6b 65  faster are marke
3db0: 64 20 77 69 74 68 20 73 70 65 63 69 61 6c 0a 20  d with special. 
3dc0: 20 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 73 2c 20     ** comments, 
3dd0: 61 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  as a hint to the
3de0: 20 6d 75 74 61 74 69 6f 6e 20 74 65 73 74 65 72   mutation tester
3df0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
3e00: 6c 65 28 20 65 3e 30 20 29 7b 20 20 20 20 20 20  le( e>0 ){      
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e30: 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d   /*OPTIMIZATION-
3e40: 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20  IF-TRUE*/.      
3e50: 69 66 28 20 65 73 69 67 6e 3e 30 20 29 7b 0a 20  if( esign>0 ){. 
3e60: 20 20 20 20 20 20 20 69 66 28 20 73 3e 3d 28 4c         if( s>=(L
3e70: 41 52 47 45 53 54 5f 49 4e 54 36 34 2f 31 30 29  ARGEST_INT64/10)
3e80: 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
3e90: 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a 41        /*OPTIMIZA
3ea0: 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a  TION-IF-FALSE*/.
3eb0: 20 20 20 20 20 20 20 20 73 20 2a 3d 20 31 30 3b          s *= 10;
3ec0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3ed0: 20 20 20 20 20 20 69 66 28 20 73 25 31 30 21 3d        if( s%10!=
3ee0: 30 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20  0 ) break;      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a 41 54       /*OPTIMIZAT
3f10: 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20  ION-IF-FALSE*/. 
3f20: 20 20 20 20 20 20 20 73 20 2f 3d 20 31 30 3b 0a         s /= 10;.
3f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 2d        }.      e-
3f40: 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  -;.    }..    /*
3f50: 20 61 64 6a 75 73 74 20 74 68 65 20 73 69 67 6e   adjust the sign
3f60: 20 6f 66 20 73 69 67 6e 69 66 69 63 61 6e 64 20   of significand 
3f70: 2a 2f 0a 20 20 20 20 73 20 3d 20 73 69 67 6e 3c  */.    s = sign<
3f80: 30 20 3f 20 2d 73 20 3a 20 73 3b 0a 0a 20 20 20  0 ? -s : s;..   
3f90: 20 69 66 28 20 65 3d 3d 30 20 29 7b 20 20 20 20   if( e==0 ){    
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a 41 54       /*OPTIMIZAT
3fd0: 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20  ION-IF-TRUE*/.  
3fe0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 28 64 6f      result = (do
3ff0: 75 62 6c 65 29 73 3b 0a 20 20 20 20 7d 65 6c 73  uble)s;.    }els
4000: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 61 74 74 65  e{.      /* atte
4010: 6d 70 74 20 74 6f 20 68 61 6e 64 6c 65 20 65 78  mpt to handle ex
4020: 74 72 65 6d 65 6c 79 20 73 6d 61 6c 6c 2f 6c 61  tremely small/la
4030: 72 67 65 20 6e 75 6d 62 65 72 73 20 62 65 74 74  rge numbers bett
4040: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  er */.      if( 
4050: 65 3e 33 30 37 20 29 7b 20 20 20 20 20 20 20 20  e>307 ){        
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4080: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d  OPTIMIZATION-IF-
4090: 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69  TRUE*/.        i
40a0: 66 28 20 65 3c 33 34 32 20 29 7b 20 20 20 20 20  f( e<342 ){     
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40d0: 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
40e0: 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20  -TRUE*/.        
40f0: 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50    LONGDOUBLE_TYP
4100: 45 20 73 63 61 6c 65 20 3d 20 73 71 6c 69 74 65  E scale = sqlite
4110: 33 50 6f 77 31 30 28 65 2d 33 30 38 29 3b 0a 20  3Pow10(e-308);. 
4120: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 73 69           if( esi
4130: 67 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  gn<0 ){.        
4140: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 73 20 2f      result = s /
4150: 20 73 63 61 6c 65 3b 0a 20 20 20 20 20 20 20 20   scale;.        
4160: 20 20 20 20 72 65 73 75 6c 74 20 2f 3d 20 31 2e      result /= 1.
4170: 30 65 2b 33 30 38 3b 0a 20 20 20 20 20 20 20 20  0e+308;.        
4180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4190: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 73 20       result = s 
41a0: 2a 20 73 63 61 6c 65 3b 0a 20 20 20 20 20 20 20  * scale;.       
41b0: 20 20 20 20 20 72 65 73 75 6c 74 20 2a 3d 20 31       result *= 1
41c0: 2e 30 65 2b 33 30 38 3b 0a 20 20 20 20 20 20 20  .0e+308;.       
41d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
41e0: 73 65 7b 20 61 73 73 65 72 74 28 20 65 3e 3d 33  se{ assert( e>=3
41f0: 34 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  42 );.          
4200: 69 66 28 20 65 73 69 67 6e 3c 30 20 29 7b 0a 20  if( esign<0 ){. 
4210: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
4220: 74 20 3d 20 30 2e 30 2a 73 3b 0a 20 20 20 20 20  t = 0.0*s;.     
4230: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
4240: 65 66 20 49 4e 46 49 4e 49 54 59 0a 20 20 20 20  ef INFINITY.    
4250: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
4260: 20 49 4e 46 49 4e 49 54 59 2a 73 3b 0a 23 65 6c   INFINITY*s;.#el
4270: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  se.            r
4280: 65 73 75 6c 74 20 3d 20 31 65 33 30 38 2a 31 65  esult = 1e308*1e
4290: 33 30 38 2a 73 3b 20 20 2f 2a 20 49 6e 66 69 6e  308*s;  /* Infin
42a0: 69 74 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ity */.#endif.  
42b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
42c0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
42d0: 0a 20 20 20 20 20 20 20 20 4c 4f 4e 47 44 4f 55  .        LONGDOU
42e0: 42 4c 45 5f 54 59 50 45 20 73 63 61 6c 65 20 3d  BLE_TYPE scale =
42f0: 20 73 71 6c 69 74 65 33 50 6f 77 31 30 28 65 29   sqlite3Pow10(e)
4300: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 73  ;.        if( es
4310: 69 67 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ign<0 ){.       
4320: 20 20 20 72 65 73 75 6c 74 20 3d 20 73 20 2f 20     result = s / 
4330: 73 63 61 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d  scale;.        }
4340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4350: 72 65 73 75 6c 74 20 3d 20 73 20 2a 20 73 63 61  result = s * sca
4360: 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  le;.        }.  
4370: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4380: 0a 20 20 2f 2a 20 73 74 6f 72 65 20 74 68 65 20  .  /* store the 
4390: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 2a 70 52 65  result */.  *pRe
43a0: 73 75 6c 74 20 3d 20 72 65 73 75 6c 74 3b 0a 0a  sult = result;..
43b0: 20 20 2f 2a 20 72 65 74 75 72 6e 20 74 72 75 65    /* return true
43c0: 20 69 66 20 6e 75 6d 62 65 72 20 61 6e 64 20 6e   if number and n
43d0: 6f 20 65 78 74 72 61 20 6e 6f 6e 2d 77 68 69 74  o extra non-whit
43e0: 65 73 70 61 63 65 20 63 68 72 61 63 74 65 72 73  espace chracters
43f0: 20 61 66 74 65 72 20 2a 2f 0a 20 20 72 65 74 75   after */.  retu
4400: 72 6e 20 7a 3d 3d 7a 45 6e 64 20 26 26 20 6e 44  rn z==zEnd && nD
4410: 69 67 69 74 73 3e 30 20 26 26 20 65 56 61 6c 69  igits>0 && eVali
4420: 64 20 26 26 20 6e 6f 6e 4e 75 6d 3d 3d 30 3b 0a  d && nonNum==0;.
4430: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 21  #else.  return !
4440: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c  sqlite3Atoi64(z,
4450: 20 70 52 65 73 75 6c 74 2c 20 6c 65 6e 67 74 68   pResult, length
4460: 2c 20 65 6e 63 29 3b 0a 23 65 6e 64 69 66 20 2f  , enc);.#endif /
4470: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  * SQLITE_OMIT_FL
4480: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20 2a 2f 0a  OATING_POINT */.
4490: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
44a0: 20 74 68 65 20 31 39 2d 63 68 61 72 61 63 74 65   the 19-characte
44b0: 72 20 73 74 72 69 6e 67 20 7a 4e 75 6d 20 61 67  r string zNum ag
44c0: 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20 72  ainst the text r
44d0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
44e0: 20 76 61 6c 75 65 20 32 5e 36 33 3a 20 20 39 32   value 2^63:  92
44f0: 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
4500: 38 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  8.  Return negat
4510: 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
4520: 73 69 74 69 76 65 0a 2a 2a 20 69 66 20 7a 4e 75  sitive.** if zNu
4530: 6d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  m is less than, 
4540: 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
4550: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 74  ater than the st
4560: 72 69 6e 67 2e 0a 2a 2a 20 4e 6f 74 65 20 74 68  ring..** Note th
4570: 61 74 20 7a 4e 75 6d 20 6d 75 73 74 20 63 6f 6e  at zNum must con
4580: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 31 39 20  tain exactly 19 
4590: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
45a0: 2a 20 55 6e 6c 69 6b 65 20 6d 65 6d 63 6d 70 28  * Unlike memcmp(
45b0: 29 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  ) this routine i
45c0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
45d0: 72 65 74 75 72 6e 20 74 68 65 20 64 69 66 66 65  return the diffe
45e0: 72 65 6e 63 65 0a 2a 2a 20 69 6e 20 74 68 65 20  rence.** in the 
45f0: 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 6c 61  values of the la
4600: 73 74 20 64 69 67 69 74 20 69 66 20 74 68 65 20  st digit if the 
4610: 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20  only difference 
4620: 69 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6c 61 73  is in the.** las
4630: 74 20 64 69 67 69 74 2e 20 20 53 6f 2c 20 66 6f  t digit.  So, fo
4640: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 0a 2a 2a  r example,.**.**
4650: 20 20 20 20 20 20 63 6f 6d 70 61 72 65 32 70 6f        compare2po
4660: 77 36 33 28 22 39 32 32 33 33 37 32 30 33 36 38  w63("92233720368
4670: 35 34 37 37 35 38 30 30 22 2c 20 31 29 0a 2a 2a  54775800", 1).**
4680: 0a 2a 2a 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  .** will return 
4690: 2d 38 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  -8..*/.static in
46a0: 74 20 63 6f 6d 70 61 72 65 32 70 6f 77 36 33 28  t compare2pow63(
46b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d  const char *zNum
46c0: 2c 20 69 6e 74 20 69 6e 63 72 29 7b 0a 20 20 69  , int incr){.  i
46d0: 6e 74 20 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt c = 0;.  int 
46e0: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
46f0: 20 20 20 20 20 20 20 2f 2a 20 30 31 32 33 34 35         /* 012345
4700: 36 37 38 39 30 31 32 33 34 35 36 37 20 2a 2f 0a  678901234567 */.
4710: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 6f    const char *po
4720: 77 36 33 20 3d 20 22 39 32 32 33 33 37 32 30 33  w63 = "922337203
4730: 36 38 35 34 37 37 35 38 30 22 3b 0a 20 20 66 6f  685477580";.  fo
4740: 72 28 69 3d 30 3b 20 63 3d 3d 30 20 26 26 20 69  r(i=0; c==0 && i
4750: 3c 31 38 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  <18; i++){.    c
4760: 20 3d 20 28 7a 4e 75 6d 5b 69 2a 69 6e 63 72 5d   = (zNum[i*incr]
4770: 2d 70 6f 77 36 33 5b 69 5d 29 2a 31 30 3b 0a 20  -pow63[i])*10;. 
4780: 20 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b   }.  if( c==0 ){
4790: 0a 20 20 20 20 63 20 3d 20 7a 4e 75 6d 5b 31 38  .    c = zNum[18
47a0: 2a 69 6e 63 72 5d 20 2d 20 27 38 27 3b 0a 20 20  *incr] - '8';.  
47b0: 20 20 74 65 73 74 63 61 73 65 28 20 63 3d 3d 28    testcase( c==(
47c0: 2d 31 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  -1) );.    testc
47d0: 61 73 65 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20  ase( c==0 );.   
47e0: 20 74 65 73 74 63 61 73 65 28 20 63 3d 3d 28 2b   testcase( c==(+
47f0: 31 29 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  1) );.  }.  retu
4800: 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn c;.}../*.** C
4810: 6f 6e 76 65 72 74 20 7a 4e 75 6d 20 74 6f 20 61  onvert zNum to a
4820: 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69   64-bit signed i
4830: 6e 74 65 67 65 72 2e 20 20 7a 4e 75 6d 20 6d 75  nteger.  zNum mu
4840: 73 74 20 62 65 20 64 65 63 69 6d 61 6c 2e 20 54  st be decimal. T
4850: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  his.** routine d
4860: 6f 65 73 20 2a 6e 6f 74 2a 20 61 63 63 65 70 74  oes *not* accept
4870: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 6e 6f 74   hexadecimal not
4880: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ation..**.** Ret
4890: 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  urns:.**.**     
48a0: 30 20 20 20 20 53 75 63 63 65 73 73 66 75 6c 20  0    Successful 
48b0: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 20  transformation. 
48c0: 20 46 69 74 73 20 69 6e 20 61 20 36 34 2d 62 69   Fits in a 64-bi
48d0: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
48e0: 2e 0a 2a 2a 20 20 20 20 20 31 20 20 20 20 45 78  ..**     1    Ex
48f0: 63 65 73 73 20 6e 6f 6e 2d 73 70 61 63 65 20 74  cess non-space t
4900: 65 78 74 20 61 66 74 65 72 20 74 68 65 20 69 6e  ext after the in
4910: 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 20  teger value.**  
4920: 20 20 20 32 20 20 20 20 49 6e 74 65 67 65 72 20     2    Integer 
4930: 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 61 20  too large for a 
4940: 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
4950: 74 65 67 65 72 20 6f 72 20 69 73 20 6d 61 6c 66  teger or is malf
4960: 6f 72 6d 65 64 0a 2a 2a 20 20 20 20 20 33 20 20  ormed.**     3  
4970: 20 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f    Special case o
4980: 66 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37  f 92233720368547
4990: 37 35 38 30 38 0a 2a 2a 0a 2a 2a 20 6c 65 6e 67  75808.**.** leng
49a0: 74 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  th is the number
49b0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
49c0: 20 73 74 72 69 6e 67 20 28 62 79 74 65 73 2c 20   string (bytes, 
49d0: 6e 6f 74 20 63 68 61 72 61 63 74 65 72 73 29 2e  not characters).
49e0: 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20 69  .** The string i
49f0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
4a00: 79 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  y zero-terminate
4a10: 64 2e 20 20 54 68 65 20 65 6e 63 6f 64 69 6e 67  d.  The encoding
4a20: 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 62 79 20   is.** given by 
4a30: 65 6e 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  enc..*/.int sqli
4a40: 74 65 33 41 74 6f 69 36 34 28 63 6f 6e 73 74 20  te3Atoi64(const 
4a50: 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36 34 20  char *zNum, i64 
4a60: 2a 70 4e 75 6d 2c 20 69 6e 74 20 6c 65 6e 67 74  *pNum, int lengt
4a70: 68 2c 20 75 38 20 65 6e 63 29 7b 0a 20 20 69 6e  h, u8 enc){.  in
4a80: 74 20 69 6e 63 72 3b 0a 20 20 75 36 34 20 75 20  t incr;.  u64 u 
4a90: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 65 67 20 3d  = 0;.  int neg =
4aa0: 20 30 3b 20 2f 2a 20 61 73 73 75 6d 65 20 70 6f   0; /* assume po
4ab0: 73 69 74 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20  sitive */.  int 
4ac0: 69 3b 0a 20 20 69 6e 74 20 63 20 3d 20 30 3b 0a  i;.  int c = 0;.
4ad0: 20 20 69 6e 74 20 6e 6f 6e 4e 75 6d 20 3d 20 30    int nonNum = 0
4ae0: 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e  ;  /* True if in
4af0: 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 55 54 46  put contains UTF
4b00: 31 36 20 77 69 74 68 20 68 69 67 68 20 62 79 74  16 with high byt
4b10: 65 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  e non-zero */.  
4b20: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
4b30: 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 72 65 74   /* Baseline ret
4b40: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  urn code */.  co
4b50: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
4b60: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4b70: 7a 45 6e 64 20 3d 20 7a 4e 75 6d 20 2b 20 6c 65  zEnd = zNum + le
4b80: 6e 67 74 68 3b 0a 20 20 61 73 73 65 72 74 28 20  ngth;.  assert( 
4b90: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
4ba0: 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f   || enc==SQLITE_
4bb0: 55 54 46 31 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d  UTF16LE || enc==
4bc0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
4bd0: 3b 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  ;.  if( enc==SQL
4be0: 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
4bf0: 69 6e 63 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  incr = 1;.  }els
4c00: 65 7b 0a 20 20 20 20 69 6e 63 72 20 3d 20 32 3b  e{.    incr = 2;
4c10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c  .    assert( SQL
4c20: 49 54 45 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26  ITE_UTF16LE==2 &
4c30: 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  & SQLITE_UTF16BE
4c40: 3d 3d 33 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==3 );.    for(i
4c50: 3d 33 2d 65 6e 63 3b 20 69 3c 6c 65 6e 67 74 68  =3-enc; i<length
4c60: 20 26 26 20 7a 4e 75 6d 5b 69 5d 3d 3d 30 3b 20   && zNum[i]==0; 
4c70: 69 2b 3d 32 29 7b 7d 0a 20 20 20 20 6e 6f 6e 4e  i+=2){}.    nonN
4c80: 75 6d 20 3d 20 69 3c 6c 65 6e 67 74 68 3b 0a 20  um = i<length;. 
4c90: 20 20 20 7a 45 6e 64 20 3d 20 26 7a 4e 75 6d 5b     zEnd = &zNum[
4ca0: 69 5e 31 5d 3b 0a 20 20 20 20 7a 4e 75 6d 20 2b  i^1];.    zNum +
4cb0: 3d 20 28 65 6e 63 26 31 29 3b 0a 20 20 7d 0a 20  = (enc&1);.  }. 
4cc0: 20 77 68 69 6c 65 28 20 7a 4e 75 6d 3c 7a 45 6e   while( zNum<zEn
4cd0: 64 20 26 26 20 73 71 6c 69 74 65 33 49 73 73 70  d && sqlite3Issp
4ce0: 61 63 65 28 2a 7a 4e 75 6d 29 20 29 20 7a 4e 75  ace(*zNum) ) zNu
4cf0: 6d 2b 3d 69 6e 63 72 3b 0a 20 20 69 66 28 20 7a  m+=incr;.  if( z
4d00: 4e 75 6d 3c 7a 45 6e 64 20 29 7b 0a 20 20 20 20  Num<zEnd ){.    
4d10: 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 29  if( *zNum=='-' )
4d20: 7b 0a 20 20 20 20 20 20 6e 65 67 20 3d 20 31 3b  {.      neg = 1;
4d30: 0a 20 20 20 20 20 20 7a 4e 75 6d 2b 3d 69 6e 63  .      zNum+=inc
4d40: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
4d50: 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20 29 7b 0a 20   *zNum=='+' ){. 
4d60: 20 20 20 20 20 7a 4e 75 6d 2b 3d 69 6e 63 72 3b       zNum+=incr;
4d70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 74  .    }.  }.  zSt
4d80: 61 72 74 20 3d 20 7a 4e 75 6d 3b 0a 20 20 77 68  art = zNum;.  wh
4d90: 69 6c 65 28 20 7a 4e 75 6d 3c 7a 45 6e 64 20 26  ile( zNum<zEnd &
4da0: 26 20 7a 4e 75 6d 5b 30 5d 3d 3d 27 30 27 20 29  & zNum[0]=='0' )
4db0: 7b 20 7a 4e 75 6d 2b 3d 69 6e 63 72 3b 20 7d 20  { zNum+=incr; } 
4dc0: 2f 2a 20 53 6b 69 70 20 6c 65 61 64 69 6e 67 20  /* Skip leading 
4dd0: 7a 65 72 6f 73 2e 20 2a 2f 0a 20 20 66 6f 72 28  zeros. */.  for(
4de0: 69 3d 30 3b 20 26 7a 4e 75 6d 5b 69 5d 3c 7a 45  i=0; &zNum[i]<zE
4df0: 6e 64 20 26 26 20 28 63 3d 7a 4e 75 6d 5b 69 5d  nd && (c=zNum[i]
4e00: 29 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27  )>='0' && c<='9'
4e10: 3b 20 69 2b 3d 69 6e 63 72 29 7b 0a 20 20 20 20  ; i+=incr){.    
4e20: 75 20 3d 20 75 2a 31 30 20 2b 20 63 20 2d 20 27  u = u*10 + c - '
4e30: 30 27 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61  0';.  }.  testca
4e40: 73 65 28 20 69 3d 3d 31 38 2a 69 6e 63 72 20 29  se( i==18*incr )
4e50: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
4e60: 3d 31 39 2a 69 6e 63 72 20 29 3b 0a 20 20 74 65  =19*incr );.  te
4e70: 73 74 63 61 73 65 28 20 69 3d 3d 32 30 2a 69 6e  stcase( i==20*in
4e80: 63 72 20 29 3b 0a 20 20 69 66 28 20 75 3e 4c 41  cr );.  if( u>LA
4e90: 52 47 45 53 54 5f 49 4e 54 36 34 20 29 7b 0a 20  RGEST_INT64 ){. 
4ea0: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 73 74 20     /* This test 
4eb0: 61 6e 64 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  and assignment i
4ec0: 73 20 6e 65 65 64 65 64 20 6f 6e 6c 79 20 74 6f  s needed only to
4ed0: 20 73 75 70 70 72 65 73 73 20 55 42 20 77 61 72   suppress UB war
4ee0: 6e 69 6e 67 73 0a 20 20 20 20 2a 2a 20 66 72 6f  nings.    ** fro
4ef0: 6d 20 63 6c 61 6e 67 20 61 6e 64 20 2d 66 73 61  m clang and -fsa
4f00: 6e 69 74 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64  nitize=undefined
4f10: 2e 20 20 54 68 69 73 20 74 65 73 74 20 61 6e 64  .  This test and
4f20: 20 61 73 73 69 67 6e 6d 65 6e 74 20 6d 61 6b 65   assignment make
4f30: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  .    ** the code
4f40: 20 61 20 6c 69 74 74 6c 65 20 6c 61 72 67 65 72   a little larger
4f50: 20 61 6e 64 20 73 6c 6f 77 65 72 2c 20 61 6e 64   and slower, and
4f60: 20 6e 6f 20 68 61 72 6d 20 63 6f 6d 65 73 20 66   no harm comes f
4f70: 72 6f 6d 20 6f 6d 69 74 74 69 6e 67 0a 20 20 20  rom omitting.   
4f80: 20 2a 2a 20 74 68 65 6d 2c 20 62 75 74 20 77 65   ** them, but we
4f90: 20 6d 75 73 74 20 61 70 70 61 69 73 65 20 74 68   must appaise th
4fa0: 65 20 75 6e 64 65 66 69 6e 65 64 2d 62 65 68 61  e undefined-beha
4fb0: 76 69 6f 72 20 70 68 61 72 69 73 65 65 73 2e 20  vior pharisees. 
4fc0: 2a 2f 0a 20 20 20 20 2a 70 4e 75 6d 20 3d 20 6e  */.    *pNum = n
4fd0: 65 67 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  eg ? SMALLEST_IN
4fe0: 54 36 34 20 3a 20 4c 41 52 47 45 53 54 5f 49 4e  T64 : LARGEST_IN
4ff0: 54 36 34 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  T64;.  }else if(
5000: 20 6e 65 67 20 29 7b 0a 20 20 20 20 2a 70 4e 75   neg ){.    *pNu
5010: 6d 20 3d 20 2d 28 69 36 34 29 75 3b 0a 20 20 7d  m = -(i64)u;.  }
5020: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 75 6d 20  else{.    *pNum 
5030: 3d 20 28 69 36 34 29 75 3b 0a 20 20 7d 0a 20 20  = (i64)u;.  }.  
5040: 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 28 69  rc = 0;.  if( (i
5050: 3d 3d 30 20 26 26 20 7a 53 74 61 72 74 3d 3d 7a  ==0 && zStart==z
5060: 4e 75 6d 29 20 20 20 20 20 2f 2a 20 4e 6f 20 64  Num)     /* No d
5070: 69 67 69 74 73 20 2a 2f 0a 20 20 20 7c 7c 20 6e  igits */.   || n
5080: 6f 6e 4e 75 6d 20 20 20 20 20 20 20 20 20 20 20  onNum           
5090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54 46            /* UTF
50a0: 31 36 20 77 69 74 68 20 68 69 67 68 2d 6f 72 64  16 with high-ord
50b0: 65 72 20 62 79 74 65 73 20 6e 6f 6e 2d 7a 65 72  er bytes non-zer
50c0: 6f 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 72 63  o */.  ){.    rc
50d0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
50e0: 28 20 26 7a 4e 75 6d 5b 69 5d 3c 7a 45 6e 64 20  ( &zNum[i]<zEnd 
50f0: 29 7b 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20  ){     /* Extra 
5100: 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64  bytes at the end
5110: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 6a 20 3d   */.    int jj =
5120: 20 69 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   i;.    do{.    
5130: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
5140: 73 70 61 63 65 28 7a 4e 75 6d 5b 6a 6a 5d 29 20  space(zNum[jj]) 
5150: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
5160: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  1;          /* E
5170: 78 74 72 61 20 6e 6f 6e 2d 73 70 61 63 65 20 74  xtra non-space t
5180: 65 78 74 20 61 66 74 65 72 20 74 68 65 20 69 6e  ext after the in
5190: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  teger */.       
51a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
51b0: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 69 6e 63 72        jj += incr
51c0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 26 7a  ;.    }while( &z
51d0: 4e 75 6d 5b 6a 6a 5d 3c 7a 45 6e 64 20 29 3b 0a  Num[jj]<zEnd );.
51e0: 20 20 7d 0a 20 20 69 66 28 20 69 3c 31 39 2a 69    }.  if( i<19*i
51f0: 6e 63 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65  ncr ){.    /* Le
5200: 73 73 20 74 68 61 6e 20 31 39 20 64 69 67 69 74  ss than 19 digit
5210: 73 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  s, so we know th
5220: 61 74 20 69 74 20 66 69 74 73 20 69 6e 20 36 34  at it fits in 64
5230: 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 61 73 73   bits */.    ass
5240: 65 72 74 28 20 75 3c 3d 4c 41 52 47 45 53 54 5f  ert( u<=LARGEST_
5250: 49 4e 54 36 34 20 29 3b 0a 20 20 20 20 72 65 74  INT64 );.    ret
5260: 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  urn rc;.  }else{
5270: 0a 20 20 20 20 2f 2a 20 7a 4e 75 6d 20 69 73 20  .    /* zNum is 
5280: 61 20 31 39 2d 64 69 67 69 74 20 6e 75 6d 62 65  a 19-digit numbe
5290: 72 73 2e 20 20 43 6f 6d 70 61 72 65 20 69 74 20  rs.  Compare it 
52a0: 61 67 61 69 6e 73 74 20 39 32 32 33 33 37 32 30  against 92233720
52b0: 33 36 38 35 34 37 37 35 38 30 38 2e 20 2a 2f 0a  36854775808. */.
52c0: 20 20 20 20 63 20 3d 20 69 3e 31 39 2a 69 6e 63      c = i>19*inc
52d0: 72 20 3f 20 31 20 3a 20 63 6f 6d 70 61 72 65 32  r ? 1 : compare2
52e0: 70 6f 77 36 33 28 7a 4e 75 6d 2c 20 69 6e 63 72  pow63(zNum, incr
52f0: 29 3b 0a 20 20 20 20 69 66 28 20 63 3c 30 20 29  );.    if( c<0 )
5300: 7b 0a 20 20 20 20 20 20 2f 2a 20 7a 4e 75 6d 20  {.      /* zNum 
5310: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 39 32 32  is less than 922
5320: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
5330: 20 73 6f 20 69 74 20 66 69 74 73 20 2a 2f 0a 20   so it fits */. 
5340: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 3c 3d       assert( u<=
5350: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 29 3b  LARGEST_INT64 );
5360: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
5370: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5380: 20 20 20 2a 70 4e 75 6d 20 3d 20 6e 65 67 20 3f     *pNum = neg ?
5390: 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
53a0: 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  : LARGEST_INT64;
53b0: 0a 20 20 20 20 20 20 69 66 28 20 63 3e 30 20 29  .      if( c>0 )
53c0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 75  {.        /* zNu
53d0: 6d 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  m is greater tha
53e0: 6e 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37  n 92233720368547
53f0: 37 35 38 30 38 20 73 6f 20 69 74 20 6f 76 65 72  75808 so it over
5400: 66 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20  flows */.       
5410: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
5420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5430: 2f 2a 20 7a 4e 75 6d 20 69 73 20 65 78 61 63 74  /* zNum is exact
5440: 6c 79 20 39 32 32 33 33 37 32 30 33 36 38 35 34  ly 9223372036854
5450: 37 37 35 38 30 38 2e 20 20 46 69 74 73 20 69 66  775808.  Fits if
5460: 20 6e 65 67 61 74 69 76 65 2e 20 20 54 68 65 0a   negative.  The.
5470: 20 20 20 20 20 20 20 20 2a 2a 20 73 70 65 63 69          ** speci
5480: 61 6c 20 63 61 73 65 20 32 20 6f 76 65 72 66 6c  al case 2 overfl
5490: 6f 77 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  ow if positive *
54a0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
54b0: 28 20 75 2d 31 3d 3d 4c 41 52 47 45 53 54 5f 49  ( u-1==LARGEST_I
54c0: 4e 54 36 34 20 29 3b 0a 20 20 20 20 20 20 20 20  NT64 );.        
54d0: 72 65 74 75 72 6e 20 6e 65 67 20 3f 20 72 63 20  return neg ? rc 
54e0: 3a 20 33 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  : 3;.      }.   
54f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
5500: 54 72 61 6e 73 66 6f 72 6d 20 61 20 55 54 46 2d  Transform a UTF-
5510: 38 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61  8 integer litera
5520: 6c 2c 20 69 6e 20 65 69 74 68 65 72 20 64 65 63  l, in either dec
5530: 69 6d 61 6c 20 6f 72 20 68 65 78 61 64 65 63 69  imal or hexadeci
5540: 6d 61 6c 2c 0a 2a 2a 20 69 6e 74 6f 20 61 20 36  mal,.** into a 6
5550: 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
5560: 65 67 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  eger.  This rout
5570: 69 6e 65 20 61 63 63 65 70 74 73 20 68 65 78 61  ine accepts hexa
5580: 64 65 63 69 6d 61 6c 20 6c 69 74 65 72 61 6c 73  decimal literals
5590: 2c 0a 2a 2a 20 77 68 65 72 65 61 73 20 73 71 6c  ,.** whereas sql
55a0: 69 74 65 33 41 74 6f 69 36 34 28 29 20 64 6f 65  ite3Atoi64() doe
55b0: 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  s not..**.** Ret
55c0: 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  urns:.**.**     
55d0: 30 20 20 20 20 53 75 63 63 65 73 73 66 75 6c 20  0    Successful 
55e0: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 20  transformation. 
55f0: 20 46 69 74 73 20 69 6e 20 61 20 36 34 2d 62 69   Fits in a 64-bi
5600: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
5610: 2e 0a 2a 2a 20 20 20 20 20 31 20 20 20 20 45 78  ..**     1    Ex
5620: 63 65 73 73 20 74 65 78 74 20 61 66 74 65 72 20  cess text after 
5630: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
5640: 65 0a 2a 2a 20 20 20 20 20 32 20 20 20 20 49 6e  e.**     2    In
5650: 74 65 67 65 72 20 74 6f 6f 20 6c 61 72 67 65 20  teger too large 
5660: 66 6f 72 20 61 20 36 34 2d 62 69 74 20 73 69 67  for a 64-bit sig
5670: 6e 65 64 20 69 6e 74 65 67 65 72 20 6f 72 20 69  ned integer or i
5680: 73 20 6d 61 6c 66 6f 72 6d 65 64 0a 2a 2a 20 20  s malformed.**  
5690: 20 20 20 33 20 20 20 20 53 70 65 63 69 61 6c 20     3    Special 
56a0: 63 61 73 65 20 6f 66 20 39 32 32 33 33 37 32 30  case of 92233720
56b0: 33 36 38 35 34 37 37 35 38 30 38 0a 2a 2f 0a 69  36854775808.*/.i
56c0: 6e 74 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48  nt sqlite3DecOrH
56d0: 65 78 54 6f 49 36 34 28 63 6f 6e 73 74 20 63 68  exToI64(const ch
56e0: 61 72 20 2a 7a 2c 20 69 36 34 20 2a 70 4f 75 74  ar *z, i64 *pOut
56f0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
5700: 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47  E_OMIT_HEX_INTEG
5710: 45 52 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  ER.  if( z[0]=='
5720: 30 27 0a 20 20 20 26 26 20 28 7a 5b 31 5d 3d 3d  0'.   && (z[1]==
5730: 27 78 27 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 58 27  'x' || z[1]=='X'
5740: 29 0a 20 20 29 7b 0a 20 20 20 20 75 36 34 20 75  ).  ){.    u64 u
5750: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 2c   = 0;.    int i,
5760: 20 6b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b   k;.    for(i=2;
5770: 20 7a 5b 69 5d 3d 3d 27 30 27 3b 20 69 2b 2b 29   z[i]=='0'; i++)
5780: 7b 7d 0a 20 20 20 20 66 6f 72 28 6b 3d 69 3b 20  {}.    for(k=i; 
5790: 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
57a0: 7a 5b 6b 5d 29 3b 20 6b 2b 2b 29 7b 0a 20 20 20  z[k]); k++){.   
57b0: 20 20 20 75 20 3d 20 75 2a 31 36 20 2b 20 73 71     u = u*16 + sq
57c0: 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 5b  lite3HexToInt(z[
57d0: 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  k]);.    }.    m
57e0: 65 6d 63 70 79 28 70 4f 75 74 2c 20 26 75 2c 20  emcpy(pOut, &u, 
57f0: 38 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  8);.    return (
5800: 7a 5b 6b 5d 3d 3d 30 20 26 26 20 6b 2d 69 3c 3d  z[k]==0 && k-i<=
5810: 31 36 29 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  16) ? 0 : 2;.  }
5820: 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
5830: 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49  QLITE_OMIT_HEX_I
5840: 4e 54 45 47 45 52 20 2a 2f 0a 20 20 7b 0a 20 20  NTEGER */.  {.  
5850: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5860: 41 74 6f 69 36 34 28 7a 2c 20 70 4f 75 74 2c 20  Atoi64(z, pOut, 
5870: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5880: 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
5890: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
58a0: 66 20 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74  f zNum represent
58b0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  s an integer tha
58c0: 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 33 32  t will fit in 32
58d0: 2d 62 69 74 73 2c 20 74 68 65 6e 20 73 65 74 0a  -bits, then set.
58e0: 2a 2a 20 2a 70 56 61 6c 75 65 20 74 6f 20 74 68  ** *pValue to th
58f0: 61 74 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72  at integer and r
5900: 65 74 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68  eturn true.  Oth
5910: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 66 61  erwise return fa
5920: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lse..**.** This 
5930: 72 6f 75 74 69 6e 65 20 61 63 63 65 70 74 73 20  routine accepts 
5940: 62 6f 74 68 20 64 65 63 69 6d 61 6c 20 61 6e 64  both decimal and
5950: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 6e 6f 74   hexadecimal not
5960: 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74 65 67 65  ation for intege
5970: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 6e 6f  rs..**.** Any no
5980: 6e 2d 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63  n-numeric charac
5990: 74 65 72 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ters that follow
59a0: 69 6e 67 20 7a 4e 75 6d 20 61 72 65 20 69 67 6e  ing zNum are ign
59b0: 6f 72 65 64 2e 0a 2a 2a 20 54 68 69 73 20 69 73  ored..** This is
59c0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
59d0: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 29 20  sqlite3Atoi64() 
59e0: 77 68 69 63 68 20 72 65 71 75 69 72 65 73 20 74  which requires t
59f0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 6e 75 6d 62  he.** input numb
5a00: 65 72 20 74 6f 20 62 65 20 7a 65 72 6f 2d 74 65  er to be zero-te
5a10: 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  rminated..*/.int
5a20: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
5a30: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75  (const char *zNu
5a40: 6d 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  m, int *pValue){
5a50: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
5a60: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  v = 0;.  int i, 
5a70: 63 3b 0a 20 20 69 6e 74 20 6e 65 67 20 3d 20 30  c;.  int neg = 0
5a80: 3b 0a 20 20 69 66 28 20 7a 4e 75 6d 5b 30 5d 3d  ;.  if( zNum[0]=
5a90: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 6e 65 67 20  ='-' ){.    neg 
5aa0: 3d 20 31 3b 0a 20 20 20 20 7a 4e 75 6d 2b 2b 3b  = 1;.    zNum++;
5ab0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4e 75  .  }else if( zNu
5ac0: 6d 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20  m[0]=='+' ){.   
5ad0: 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 7d 0a 23 69 66   zNum++;.  }.#if
5ae0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5af0: 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 65  _HEX_INTEGER.  e
5b00: 6c 73 65 20 69 66 28 20 7a 4e 75 6d 5b 30 5d 3d  lse if( zNum[0]=
5b10: 3d 27 30 27 0a 20 20 20 20 20 20 20 20 26 26 20  ='0'.        && 
5b20: 28 7a 4e 75 6d 5b 31 5d 3d 3d 27 78 27 20 7c 7c  (zNum[1]=='x' ||
5b30: 20 7a 4e 75 6d 5b 31 5d 3d 3d 27 58 27 29 0a 20   zNum[1]=='X'). 
5b40: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
5b50: 33 49 73 78 64 69 67 69 74 28 7a 4e 75 6d 5b 32  3Isxdigit(zNum[2
5b60: 5d 29 0a 20 20 29 7b 0a 20 20 20 20 75 33 32 20  ]).  ){.    u32 
5b70: 75 20 3d 20 30 3b 0a 20 20 20 20 7a 4e 75 6d 20  u = 0;.    zNum 
5b80: 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65 28  += 2;.    while(
5b90: 20 7a 4e 75 6d 5b 30 5d 3d 3d 27 30 27 20 29 20   zNum[0]=='0' ) 
5ba0: 7a 4e 75 6d 2b 2b 3b 0a 20 20 20 20 66 6f 72 28  zNum++;.    for(
5bb0: 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 78 64  i=0; sqlite3Isxd
5bc0: 69 67 69 74 28 7a 4e 75 6d 5b 69 5d 29 20 26 26  igit(zNum[i]) &&
5bd0: 20 69 3c 38 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<8; i++){.    
5be0: 20 20 75 20 3d 20 75 2a 31 36 20 2b 20 73 71 6c    u = u*16 + sql
5bf0: 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 4e 75  ite3HexToInt(zNu
5c00: 6d 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m[i]);.    }.   
5c10: 20 69 66 28 20 28 75 26 30 78 38 30 30 30 30 30   if( (u&0x800000
5c20: 30 30 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  00)==0 && sqlite
5c30: 33 49 73 78 64 69 67 69 74 28 7a 4e 75 6d 5b 69  3Isxdigit(zNum[i
5c40: 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ])==0 ){.      m
5c50: 65 6d 63 70 79 28 70 56 61 6c 75 65 2c 20 26 75  emcpy(pValue, &u
5c60: 2c 20 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 4);.      retu
5c70: 72 6e 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 1;.    }else{
5c80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
5c90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
5ca0: 66 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  f.  if( !sqlite3
5cb0: 49 73 64 69 67 69 74 28 7a 4e 75 6d 5b 30 5d 29  Isdigit(zNum[0])
5cc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
5cd0: 68 69 6c 65 28 20 7a 4e 75 6d 5b 30 5d 3d 3d 27  hile( zNum[0]=='
5ce0: 30 27 20 29 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 66  0' ) zNum++;.  f
5cf0: 6f 72 28 69 3d 30 3b 20 69 3c 31 31 20 26 26 20  or(i=0; i<11 && 
5d00: 28 63 20 3d 20 7a 4e 75 6d 5b 69 5d 20 2d 20 27  (c = zNum[i] - '
5d10: 30 27 29 3e 3d 30 20 26 26 20 63 3c 3d 39 3b 20  0')>=0 && c<=9; 
5d20: 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d 20 76 2a  i++){.    v = v*
5d30: 31 30 20 2b 20 63 3b 0a 20 20 7d 0a 0a 20 20 2f  10 + c;.  }..  /
5d40: 2a 20 54 68 65 20 6c 6f 6e 67 65 73 74 20 64 65  * The longest de
5d50: 63 69 6d 61 6c 20 72 65 70 72 65 73 65 6e 74 61  cimal representa
5d60: 74 69 6f 6e 20 6f 66 20 61 20 33 32 20 62 69 74  tion of a 32 bit
5d70: 20 69 6e 74 65 67 65 72 20 69 73 20 31 30 20 64   integer is 10 d
5d80: 69 67 69 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  igits:.  **.  **
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 32 33               123
5da0: 34 35 36 37 38 39 30 0a 20 20 2a 2a 20 20 20 20  4567890.  **    
5db0: 20 32 5e 33 31 20 2d 3e 20 32 31 34 37 34 38 33   2^31 -> 2147483
5dc0: 36 34 38 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  648.  */.  testc
5dd0: 61 73 65 28 20 69 3d 3d 31 30 20 29 3b 0a 20 20  ase( i==10 );.  
5de0: 69 66 28 20 69 3e 31 30 20 29 7b 0a 20 20 20 20  if( i>10 ){.    
5df0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5e00: 74 65 73 74 63 61 73 65 28 20 76 2d 6e 65 67 3d  testcase( v-neg=
5e10: 3d 32 31 34 37 34 38 33 36 34 37 20 29 3b 0a 20  =2147483647 );. 
5e20: 20 69 66 28 20 76 2d 6e 65 67 3e 32 31 34 37 34   if( v-neg>21474
5e30: 38 33 36 34 37 20 29 7b 0a 20 20 20 20 72 65 74  83647 ){.    ret
5e40: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
5e50: 20 6e 65 67 20 29 7b 0a 20 20 20 20 76 20 3d 20   neg ){.    v = 
5e60: 2d 76 3b 0a 20 20 7d 0a 20 20 2a 70 56 61 6c 75  -v;.  }.  *pValu
5e70: 65 20 3d 20 28 69 6e 74 29 76 3b 0a 20 20 72 65  e = (int)v;.  re
5e80: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
5e90: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
5ea0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 65   integer value e
5eb0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 61 20  xtracted from a 
5ec0: 73 74 72 69 6e 67 2e 20 20 49 66 20 74 68 65 0a  string.  If the.
5ed0: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74  ** string is not
5ee0: 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75 73   an integer, jus
5ef0: 74 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 69  t return 0..*/.i
5f00: 6e 74 20 73 71 6c 69 74 65 33 41 74 6f 69 28 63  nt sqlite3Atoi(c
5f10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
5f20: 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 69 66   int x = 0;.  if
5f30: 28 20 7a 20 29 20 73 71 6c 69 74 65 33 47 65 74  ( z ) sqlite3Get
5f40: 49 6e 74 33 32 28 7a 2c 20 26 78 29 3b 0a 20 20  Int32(z, &x);.  
5f50: 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 0a  return x;.}../*.
5f60: 2a 2a 20 54 68 65 20 76 61 72 69 61 62 6c 65 2d  ** The variable-
5f70: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 65  length integer e
5f80: 6e 63 6f 64 69 6e 67 20 69 73 20 61 73 20 66 6f  ncoding is as fo
5f90: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 4b 45 59  llows:.**.** KEY
5fa0: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 20 3d  :.**         A =
5fb0: 20 30 78 78 78 78 78 78 78 20 20 20 20 37 20 62   0xxxxxxx    7 b
5fc0: 69 74 73 20 6f 66 20 64 61 74 61 20 61 6e 64 20  its of data and 
5fd0: 6f 6e 65 20 66 6c 61 67 20 62 69 74 0a 2a 2a 20  one flag bit.** 
5fe0: 20 20 20 20 20 20 20 20 42 20 3d 20 31 78 78 78          B = 1xxx
5ff0: 78 78 78 78 20 20 20 20 37 20 62 69 74 73 20 6f  xxxx    7 bits o
6000: 66 20 64 61 74 61 20 61 6e 64 20 6f 6e 65 20 66  f data and one f
6010: 6c 61 67 20 62 69 74 0a 2a 2a 20 20 20 20 20 20  lag bit.**      
6020: 20 20 20 43 20 3d 20 78 78 78 78 78 78 78 78 20     C = xxxxxxxx 
6030: 20 20 20 38 20 62 69 74 73 20 6f 66 20 64 61 74     8 bits of dat
6040: 61 0a 2a 2a 0a 2a 2a 20 20 37 20 62 69 74 73 20  a.**.**  7 bits 
6050: 2d 20 41 0a 2a 2a 20 31 34 20 62 69 74 73 20 2d  - A.** 14 bits -
6060: 20 42 41 0a 2a 2a 20 32 31 20 62 69 74 73 20 2d   BA.** 21 bits -
6070: 20 42 42 41 0a 2a 2a 20 32 38 20 62 69 74 73 20   BBA.** 28 bits 
6080: 2d 20 42 42 42 41 0a 2a 2a 20 33 35 20 62 69 74  - BBBA.** 35 bit
6090: 73 20 2d 20 42 42 42 42 41 0a 2a 2a 20 34 32 20  s - BBBBA.** 42 
60a0: 62 69 74 73 20 2d 20 42 42 42 42 42 41 0a 2a 2a  bits - BBBBBA.**
60b0: 20 34 39 20 62 69 74 73 20 2d 20 42 42 42 42 42   49 bits - BBBBB
60c0: 42 41 0a 2a 2a 20 35 36 20 62 69 74 73 20 2d 20  BA.** 56 bits - 
60d0: 42 42 42 42 42 42 42 41 0a 2a 2a 20 36 34 20 62  BBBBBBBA.** 64 b
60e0: 69 74 73 20 2d 20 42 42 42 42 42 42 42 42 43 0a  its - BBBBBBBBC.
60f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  */../*.** Write 
6100: 61 20 36 34 2d 62 69 74 20 76 61 72 69 61 62 6c  a 64-bit variabl
6110: 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e-length integer
6120: 20 74 6f 20 6d 65 6d 6f 72 79 20 73 74 61 72 74   to memory start
6130: 69 6e 67 20 61 74 20 70 5b 30 5d 2e 0a 2a 2a 20  ing at p[0]..** 
6140: 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 64 61  The length of da
6150: 74 61 20 77 72 69 74 65 20 77 69 6c 6c 20 62 65  ta write will be
6160: 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39   between 1 and 9
6170: 20 62 79 74 65 73 2e 20 20 54 68 65 20 6e 75 6d   bytes.  The num
6180: 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
6190: 77 72 69 74 74 65 6e 20 69 73 20 72 65 74 75 72  written is retur
61a0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 61 72  ned..**.** A var
61b0: 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74  iable-length int
61c0: 65 67 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66  eger consists of
61d0: 20 74 68 65 20 6c 6f 77 65 72 20 37 20 62 69 74   the lower 7 bit
61e0: 73 20 6f 66 20 65 61 63 68 20 62 79 74 65 0a 2a  s of each byte.*
61f0: 2a 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20  * for all bytes 
6200: 74 68 61 74 20 68 61 76 65 20 74 68 65 20 38 74  that have the 8t
6210: 68 20 62 69 74 20 73 65 74 20 61 6e 64 20 6f 6e  h bit set and on
6220: 65 20 62 79 74 65 20 77 69 74 68 20 74 68 65 20  e byte with the 
6230: 38 74 68 0a 2a 2a 20 62 69 74 20 63 6c 65 61 72  8th.** bit clear
6240: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 77 65  .  Except, if we
6250: 20 67 65 74 20 74 6f 20 74 68 65 20 39 74 68 20   get to the 9th 
6260: 62 79 74 65 2c 20 69 74 20 73 74 6f 72 65 73 20  byte, it stores 
6270: 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 38 20 62 69  the full.** 8 bi
6280: 74 73 20 61 6e 64 20 69 73 20 74 68 65 20 6c 61  ts and is the la
6290: 73 74 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  st byte..*/.stat
62a0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
62b0: 49 4e 4c 49 4e 45 20 70 75 74 56 61 72 69 6e 74  INLINE putVarint
62c0: 36 34 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  64(unsigned char
62d0: 20 2a 70 2c 20 75 36 34 20 76 29 7b 0a 20 20 69   *p, u64 v){.  i
62e0: 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38  nt i, j, n;.  u8
62f0: 20 62 75 66 5b 31 30 5d 3b 0a 20 20 69 66 28 20   buf[10];.  if( 
6300: 76 20 26 20 28 28 28 75 36 34 29 30 78 66 66 30  v & (((u64)0xff0
6310: 30 30 30 30 30 29 3c 3c 33 32 29 20 29 7b 0a 20  00000)<<32) ){. 
6320: 20 20 20 70 5b 38 5d 20 3d 20 28 75 38 29 76 3b     p[8] = (u8)v;
6330: 0a 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20  .    v >>= 8;.  
6340: 20 20 66 6f 72 28 69 3d 37 3b 20 69 3e 3d 30 3b    for(i=7; i>=0;
6350: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 5b 69   i--){.      p[i
6360: 5d 20 3d 20 28 75 38 29 28 28 76 20 26 20 30 78  ] = (u8)((v & 0x
6370: 37 66 29 20 7c 20 30 78 38 30 29 3b 0a 20 20 20  7f) | 0x80);.   
6380: 20 20 20 76 20 3e 3e 3d 20 37 3b 0a 20 20 20 20     v >>= 7;.    
6390: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 39 3b 0a  }.    return 9;.
63a0: 20 20 7d 20 20 20 20 0a 20 20 6e 20 3d 20 30 3b    }    .  n = 0;
63b0: 0a 20 20 64 6f 7b 0a 20 20 20 20 62 75 66 5b 6e  .  do{.    buf[n
63c0: 2b 2b 5d 20 3d 20 28 75 38 29 28 28 76 20 26 20  ++] = (u8)((v & 
63d0: 30 78 37 66 29 20 7c 20 30 78 38 30 29 3b 0a 20  0x7f) | 0x80);. 
63e0: 20 20 20 76 20 3e 3e 3d 20 37 3b 0a 20 20 7d 77     v >>= 7;.  }w
63f0: 68 69 6c 65 28 20 76 21 3d 30 20 29 3b 0a 20 20  hile( v!=0 );.  
6400: 62 75 66 5b 30 5d 20 26 3d 20 30 78 37 66 3b 0a  buf[0] &= 0x7f;.
6410: 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 39 20 29    assert( n<=9 )
6420: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e  ;.  for(i=0, j=n
6430: 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 2c 20 69  -1; j>=0; j--, i
6440: 2b 2b 29 7b 0a 20 20 20 20 70 5b 69 5d 20 3d 20  ++){.    p[i] = 
6450: 62 75 66 5b 6a 5d 3b 0a 20 20 7d 0a 20 20 72 65  buf[j];.  }.  re
6460: 74 75 72 6e 20 6e 3b 0a 7d 0a 69 6e 74 20 73 71  turn n;.}.int sq
6470: 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 28 75  lite3PutVarint(u
6480: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c  nsigned char *p,
6490: 20 75 36 34 20 76 29 7b 0a 20 20 69 66 28 20 76   u64 v){.  if( v
64a0: 3c 3d 30 78 37 66 20 29 7b 0a 20 20 20 20 70 5b  <=0x7f ){.    p[
64b0: 30 5d 20 3d 20 76 26 30 78 37 66 3b 0a 20 20 20  0] = v&0x7f;.   
64c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
64d0: 20 69 66 28 20 76 3c 3d 30 78 33 66 66 66 20 29   if( v<=0x3fff )
64e0: 7b 0a 20 20 20 20 70 5b 30 5d 20 3d 20 28 28 76  {.    p[0] = ((v
64f0: 3e 3e 37 29 26 30 78 37 66 29 7c 30 78 38 30 3b  >>7)&0x7f)|0x80;
6500: 0a 20 20 20 20 70 5b 31 5d 20 3d 20 76 26 30 78  .    p[1] = v&0x
6510: 37 66 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32  7f;.    return 2
6520: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
6530: 75 74 56 61 72 69 6e 74 36 34 28 70 2c 76 29 3b  utVarint64(p,v);
6540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73  .}../*.** Bitmas
6550: 6b 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  ks used by sqlit
6560: 65 33 47 65 74 56 61 72 69 6e 74 28 29 2e 20 20  e3GetVarint().  
6570: 54 68 65 73 65 20 70 72 65 63 6f 6d 70 75 74 65  These precompute
6580: 64 20 63 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 61  d constants.** a
6590: 72 65 20 64 65 66 69 6e 65 64 20 68 65 72 65 20  re defined here 
65a0: 72 61 74 68 65 72 20 74 68 61 6e 20 73 69 6d 70  rather than simp
65b0: 6c 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 63  ly putting the c
65c0: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
65d0: 6f 6e 73 0a 2a 2a 20 69 6e 6c 69 6e 65 20 69 6e  ons.** inline in
65e0: 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61   order to work a
65f0: 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
6600: 65 20 52 56 54 20 63 6f 6d 70 69 6c 65 72 2e 0a  e RVT compiler..
6610: 2a 2a 0a 2a 2a 20 53 4c 4f 54 5f 32 5f 30 20 20  **.** SLOT_2_0  
6620: 20 20 20 41 20 6d 61 73 6b 20 66 6f 72 20 20 28     A mask for  (
6630: 30 78 37 66 3c 3c 31 34 29 20 7c 20 30 78 37 66  0x7f<<14) | 0x7f
6640: 0a 2a 2a 0a 2a 2a 20 53 4c 4f 54 5f 34 5f 32 5f  .**.** SLOT_4_2_
6650: 30 20 20 20 41 20 6d 61 73 6b 20 66 6f 72 20 20  0   A mask for  
6660: 28 30 78 37 66 3c 3c 32 38 29 20 7c 20 53 4c 4f  (0x7f<<28) | SLO
6670: 54 5f 32 5f 30 0a 2a 2f 0a 23 64 65 66 69 6e 65  T_2_0.*/.#define
6680: 20 53 4c 4f 54 5f 32 5f 30 20 20 20 20 20 30 78   SLOT_2_0     0x
6690: 30 30 31 66 63 30 37 66 0a 23 64 65 66 69 6e 65  001fc07f.#define
66a0: 20 53 4c 4f 54 5f 34 5f 32 5f 30 20 20 20 30 78   SLOT_4_2_0   0x
66b0: 66 30 31 66 63 30 37 66 0a 0a 0a 2f 2a 0a 2a 2a  f01fc07f.../*.**
66c0: 20 52 65 61 64 20 61 20 36 34 2d 62 69 74 20 76   Read a 64-bit v
66d0: 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69  ariable-length i
66e0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 6d 65 6d 6f  nteger from memo
66f0: 72 79 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ry starting at p
6700: 5b 30 5d 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  [0]..** Return t
6710: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
6720: 65 73 20 72 65 61 64 2e 20 20 54 68 65 20 76 61  es read.  The va
6730: 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  lue is stored in
6740: 20 2a 76 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74   *v..*/.u8 sqlit
6750: 65 33 47 65 74 56 61 72 69 6e 74 28 63 6f 6e 73  e3GetVarint(cons
6760: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
6770: 2a 70 2c 20 75 36 34 20 2a 76 29 7b 0a 20 20 75  *p, u64 *v){.  u
6780: 33 32 20 61 2c 62 2c 73 3b 0a 0a 20 20 69 66 28  32 a,b,s;..  if(
6790: 20 28 28 73 69 67 6e 65 64 20 63 68 61 72 2a 29   ((signed char*)
67a0: 70 29 5b 30 5d 3e 3d 30 20 29 7b 0a 20 20 20 20  p)[0]>=0 ){.    
67b0: 2a 76 20 3d 20 2a 70 3b 0a 20 20 20 20 72 65 74  *v = *p;.    ret
67c0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
67d0: 20 28 28 73 69 67 6e 65 64 20 63 68 61 72 2a 29   ((signed char*)
67e0: 70 29 5b 31 5d 3e 3d 30 20 29 7b 0a 20 20 20 20  p)[1]>=0 ){.    
67f0: 2a 76 20 3d 20 28 28 75 33 32 29 28 70 5b 30 5d  *v = ((u32)(p[0]
6800: 26 30 78 37 66 29 3c 3c 37 29 20 7c 20 70 5b 31  &0x7f)<<7) | p[1
6810: 5d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  ];.    return 2;
6820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 65 72 69 66  .  }..  /* Verif
6830: 79 20 74 68 61 74 20 63 6f 6e 73 74 61 6e 74 73  y that constants
6840: 20 61 72 65 20 70 72 65 63 6f 6d 70 75 74 65 64   are precomputed
6850: 20 63 6f 72 72 65 63 74 6c 79 20 2a 2f 0a 20 20   correctly */.  
6860: 61 73 73 65 72 74 28 20 53 4c 4f 54 5f 32 5f 30  assert( SLOT_2_0
6870: 20 3d 3d 20 28 28 30 78 37 66 3c 3c 31 34 29 20   == ((0x7f<<14) 
6880: 7c 20 28 30 78 37 66 29 29 20 29 3b 0a 20 20 61  | (0x7f)) );.  a
6890: 73 73 65 72 74 28 20 53 4c 4f 54 5f 34 5f 32 5f  ssert( SLOT_4_2_
68a0: 30 20 3d 3d 20 28 28 30 78 66 55 3c 3c 32 38 29  0 == ((0xfU<<28)
68b0: 20 7c 20 28 30 78 37 66 3c 3c 31 34 29 20 7c 20   | (0x7f<<14) | 
68c0: 28 30 78 37 66 29 29 20 29 3b 0a 0a 20 20 61 20  (0x7f)) );..  a 
68d0: 3d 20 28 28 75 33 32 29 70 5b 30 5d 29 3c 3c 31  = ((u32)p[0])<<1
68e0: 34 3b 0a 20 20 62 20 3d 20 70 5b 31 5d 3b 0a 20  4;.  b = p[1];. 
68f0: 20 70 20 2b 3d 20 32 3b 0a 20 20 61 20 7c 3d 20   p += 2;.  a |= 
6900: 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70 30 3c 3c  *p;.  /* a: p0<<
6910: 31 34 20 7c 20 70 32 20 28 75 6e 6d 61 73 6b 65  14 | p2 (unmaske
6920: 64 29 20 2a 2f 0a 20 20 69 66 20 28 21 28 61 26  d) */.  if (!(a&
6930: 30 78 38 30 29 29 0a 20 20 7b 0a 20 20 20 20 61  0x80)).  {.    a
6940: 20 26 3d 20 53 4c 4f 54 5f 32 5f 30 3b 0a 20 20   &= SLOT_2_0;.  
6950: 20 20 62 20 26 3d 20 30 78 37 66 3b 0a 20 20 20    b &= 0x7f;.   
6960: 20 62 20 3d 20 62 3c 3c 37 3b 0a 20 20 20 20 61   b = b<<7;.    a
6970: 20 7c 3d 20 62 3b 0a 20 20 20 20 2a 76 20 3d 20   |= b;.    *v = 
6980: 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 33 3b  a;.    return 3;
6990: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 53 45 31 20  .  }..  /* CSE1 
69a0: 66 72 6f 6d 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  from below */.  
69b0: 61 20 26 3d 20 53 4c 4f 54 5f 32 5f 30 3b 0a 20  a &= SLOT_2_0;. 
69c0: 20 70 2b 2b 3b 0a 20 20 62 20 3d 20 62 3c 3c 31   p++;.  b = b<<1
69d0: 34 3b 0a 20 20 62 20 7c 3d 20 2a 70 3b 0a 20 20  4;.  b |= *p;.  
69e0: 2f 2a 20 62 3a 20 70 31 3c 3c 31 34 20 7c 20 70  /* b: p1<<14 | p
69f0: 33 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a  3 (unmasked) */.
6a00: 20 20 69 66 20 28 21 28 62 26 30 78 38 30 29 29    if (!(b&0x80))
6a10: 0a 20 20 7b 0a 20 20 20 20 62 20 26 3d 20 53 4c  .  {.    b &= SL
6a20: 4f 54 5f 32 5f 30 3b 0a 20 20 20 20 2f 2a 20 6d  OT_2_0;.    /* m
6a30: 6f 76 65 64 20 43 53 45 31 20 75 70 20 2a 2f 0a  oved CSE1 up */.
6a40: 20 20 20 20 2f 2a 20 61 20 26 3d 20 28 30 78 37      /* a &= (0x7
6a50: 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 20 2a  f<<14)|(0x7f); *
6a60: 2f 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37 3b 0a  /.    a = a<<7;.
6a70: 20 20 20 20 61 20 7c 3d 20 62 3b 0a 20 20 20 20      a |= b;.    
6a80: 2a 76 20 3d 20 61 3b 0a 20 20 20 20 72 65 74 75  *v = a;.    retu
6a90: 72 6e 20 34 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 4;.  }..  /* 
6aa0: 61 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32 20 28  a: p0<<14 | p2 (
6ab0: 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 2f 2a 20  masked) */.  /* 
6ac0: 62 3a 20 70 31 3c 3c 31 34 20 7c 20 70 33 20 28  b: p1<<14 | p3 (
6ad0: 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 2f  unmasked) */.  /
6ae0: 2a 20 31 3a 73 61 76 65 20 6f 66 66 20 70 30 3c  * 1:save off p0<
6af0: 3c 32 31 20 7c 20 70 31 3c 3c 31 34 20 7c 20 70  <21 | p1<<14 | p
6b00: 32 3c 3c 37 20 7c 20 70 33 20 28 6d 61 73 6b 65  2<<7 | p3 (maske
6b10: 64 29 20 2a 2f 0a 20 20 2f 2a 20 6d 6f 76 65 64  d) */.  /* moved
6b20: 20 43 53 45 31 20 75 70 20 2a 2f 0a 20 20 2f 2a   CSE1 up */.  /*
6b30: 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29   a &= (0x7f<<14)
6b40: 7c 28 30 78 37 66 29 3b 20 2a 2f 0a 20 20 62 20  |(0x7f); */.  b 
6b50: 26 3d 20 53 4c 4f 54 5f 32 5f 30 3b 0a 20 20 73  &= SLOT_2_0;.  s
6b60: 20 3d 20 61 3b 0a 20 20 2f 2a 20 73 3a 20 70 30   = a;.  /* s: p0
6b70: 3c 3c 31 34 20 7c 20 70 32 20 28 6d 61 73 6b 65  <<14 | p2 (maske
6b80: 64 29 20 2a 2f 0a 0a 20 20 70 2b 2b 3b 0a 20 20  d) */..  p++;.  
6b90: 61 20 3d 20 61 3c 3c 31 34 3b 0a 20 20 61 20 7c  a = a<<14;.  a |
6ba0: 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70 30  = *p;.  /* a: p0
6bb0: 3c 3c 32 38 20 7c 20 70 32 3c 3c 31 34 20 7c 20  <<28 | p2<<14 | 
6bc0: 70 34 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f  p4 (unmasked) */
6bd0: 0a 20 20 69 66 20 28 21 28 61 26 30 78 38 30 29  .  if (!(a&0x80)
6be0: 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 77 65 20  ).  {.    /* we 
6bf0: 63 61 6e 20 73 6b 69 70 20 74 68 65 73 65 20 63  can skip these c
6c00: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 28  ause they were (
6c10: 65 66 66 65 63 74 69 76 65 6c 79 29 20 64 6f 6e  effectively) don
6c20: 65 20 61 62 6f 76 65 0a 20 20 20 20 2a 2a 20 77  e above.    ** w
6c30: 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
6c40: 20 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 61 20 26   s */.    /* a &
6c50: 3d 20 28 30 78 37 66 3c 3c 32 38 29 7c 28 30 78  = (0x7f<<28)|(0x
6c60: 37 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 20  7f<<14)|(0x7f); 
6c70: 2a 2f 0a 20 20 20 20 2f 2a 20 62 20 26 3d 20 28  */.    /* b &= (
6c80: 30 78 37 66 3c 3c 31 34 29 7c 28 30 78 37 66 29  0x7f<<14)|(0x7f)
6c90: 3b 20 2a 2f 0a 20 20 20 20 62 20 3d 20 62 3c 3c  ; */.    b = b<<
6ca0: 37 3b 0a 20 20 20 20 61 20 7c 3d 20 62 3b 0a 20  7;.    a |= b;. 
6cb0: 20 20 20 73 20 3d 20 73 3e 3e 31 38 3b 0a 20 20     s = s>>18;.  
6cc0: 20 20 2a 76 20 3d 20 28 28 75 36 34 29 73 29 3c    *v = ((u64)s)<
6cd0: 3c 33 32 20 7c 20 61 3b 0a 20 20 20 20 72 65 74  <32 | a;.    ret
6ce0: 75 72 6e 20 35 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 5;.  }..  /*
6cf0: 20 32 3a 73 61 76 65 20 6f 66 66 20 70 30 3c 3c   2:save off p0<<
6d00: 32 31 20 7c 20 70 31 3c 3c 31 34 20 7c 20 70 32  21 | p1<<14 | p2
6d10: 3c 3c 37 20 7c 20 70 33 20 28 6d 61 73 6b 65 64  <<7 | p3 (masked
6d20: 29 20 2a 2f 0a 20 20 73 20 3d 20 73 3c 3c 37 3b  ) */.  s = s<<7;
6d30: 0a 20 20 73 20 7c 3d 20 62 3b 0a 20 20 2f 2a 20  .  s |= b;.  /* 
6d40: 73 3a 20 70 30 3c 3c 32 31 20 7c 20 70 31 3c 3c  s: p0<<21 | p1<<
6d50: 31 34 20 7c 20 70 32 3c 3c 37 20 7c 20 70 33 20  14 | p2<<7 | p3 
6d60: 28 6d 61 73 6b 65 64 29 20 2a 2f 0a 0a 20 20 70  (masked) */..  p
6d70: 2b 2b 3b 0a 20 20 62 20 3d 20 62 3c 3c 31 34 3b  ++;.  b = b<<14;
6d80: 0a 20 20 62 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a  .  b |= *p;.  /*
6d90: 20 62 3a 20 70 31 3c 3c 32 38 20 7c 20 70 33 3c   b: p1<<28 | p3<
6da0: 3c 31 34 20 7c 20 70 35 20 28 75 6e 6d 61 73 6b  <14 | p5 (unmask
6db0: 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21 28 62  ed) */.  if (!(b
6dc0: 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20 20 20  &0x80)).  {.    
6dd0: 2f 2a 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74  /* we can skip t
6de0: 68 69 73 20 63 61 75 73 65 20 69 74 20 77 61 73  his cause it was
6df0: 20 28 65 66 66 65 63 74 69 76 65 6c 79 29 20 64   (effectively) d
6e00: 6f 6e 65 20 61 62 6f 76 65 20 69 6e 20 63 61 6c  one above in cal
6e10: 63 27 69 6e 67 20 73 20 2a 2f 0a 20 20 20 20 2f  c'ing s */.    /
6e20: 2a 20 62 20 26 3d 20 28 30 78 37 66 3c 3c 32 38  * b &= (0x7f<<28
6e30: 29 7c 28 30 78 37 66 3c 3c 31 34 29 7c 28 30 78  )|(0x7f<<14)|(0x
6e40: 37 66 29 3b 20 2a 2f 0a 20 20 20 20 61 20 26 3d  7f); */.    a &=
6e50: 20 53 4c 4f 54 5f 32 5f 30 3b 0a 20 20 20 20 61   SLOT_2_0;.    a
6e60: 20 3d 20 61 3c 3c 37 3b 0a 20 20 20 20 61 20 7c   = a<<7;.    a |
6e70: 3d 20 62 3b 0a 20 20 20 20 73 20 3d 20 73 3e 3e  = b;.    s = s>>
6e80: 31 38 3b 0a 20 20 20 20 2a 76 20 3d 20 28 28 75  18;.    *v = ((u
6e90: 36 34 29 73 29 3c 3c 33 32 20 7c 20 61 3b 0a 20  64)s)<<32 | a;. 
6ea0: 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
6eb0: 0a 0a 20 20 70 2b 2b 3b 0a 20 20 61 20 3d 20 61  ..  p++;.  a = a
6ec0: 3c 3c 31 34 3b 0a 20 20 61 20 7c 3d 20 2a 70 3b  <<14;.  a |= *p;
6ed0: 0a 20 20 2f 2a 20 61 3a 20 70 32 3c 3c 32 38 20  .  /* a: p2<<28 
6ee0: 7c 20 70 34 3c 3c 31 34 20 7c 20 70 36 20 28 75  | p4<<14 | p6 (u
6ef0: 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66  nmasked) */.  if
6f00: 20 28 21 28 61 26 30 78 38 30 29 29 0a 20 20 7b   (!(a&0x80)).  {
6f10: 0a 20 20 20 20 61 20 26 3d 20 53 4c 4f 54 5f 34  .    a &= SLOT_4
6f20: 5f 32 5f 30 3b 0a 20 20 20 20 62 20 26 3d 20 53  _2_0;.    b &= S
6f30: 4c 4f 54 5f 32 5f 30 3b 0a 20 20 20 20 62 20 3d  LOT_2_0;.    b =
6f40: 20 62 3c 3c 37 3b 0a 20 20 20 20 61 20 7c 3d 20   b<<7;.    a |= 
6f50: 62 3b 0a 20 20 20 20 73 20 3d 20 73 3e 3e 31 31  b;.    s = s>>11
6f60: 3b 0a 20 20 20 20 2a 76 20 3d 20 28 28 75 36 34  ;.    *v = ((u64
6f70: 29 73 29 3c 3c 33 32 20 7c 20 61 3b 0a 20 20 20  )s)<<32 | a;.   
6f80: 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 0a   return 7;.  }..
6f90: 20 20 2f 2a 20 43 53 45 32 20 66 72 6f 6d 20 62    /* CSE2 from b
6fa0: 65 6c 6f 77 20 2a 2f 0a 20 20 61 20 26 3d 20 53  elow */.  a &= S
6fb0: 4c 4f 54 5f 32 5f 30 3b 0a 20 20 70 2b 2b 3b 0a  LOT_2_0;.  p++;.
6fc0: 20 20 62 20 3d 20 62 3c 3c 31 34 3b 0a 20 20 62    b = b<<14;.  b
6fd0: 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 62 3a 20   |= *p;.  /* b: 
6fe0: 70 33 3c 3c 32 38 20 7c 20 70 35 3c 3c 31 34 20  p3<<28 | p5<<14 
6ff0: 7c 20 70 37 20 28 75 6e 6d 61 73 6b 65 64 29 20  | p7 (unmasked) 
7000: 2a 2f 0a 20 20 69 66 20 28 21 28 62 26 30 78 38  */.  if (!(b&0x8
7010: 30 29 29 0a 20 20 7b 0a 20 20 20 20 62 20 26 3d  0)).  {.    b &=
7020: 20 53 4c 4f 54 5f 34 5f 32 5f 30 3b 0a 20 20 20   SLOT_4_2_0;.   
7030: 20 2f 2a 20 6d 6f 76 65 64 20 43 53 45 32 20 75   /* moved CSE2 u
7040: 70 20 2a 2f 0a 20 20 20 20 2f 2a 20 61 20 26 3d  p */.    /* a &=
7050: 20 28 30 78 37 66 3c 3c 31 34 29 7c 28 30 78 37   (0x7f<<14)|(0x7
7060: 66 29 3b 20 2a 2f 0a 20 20 20 20 61 20 3d 20 61  f); */.    a = a
7070: 3c 3c 37 3b 0a 20 20 20 20 61 20 7c 3d 20 62 3b  <<7;.    a |= b;
7080: 0a 20 20 20 20 73 20 3d 20 73 3e 3e 34 3b 0a 20  .    s = s>>4;. 
7090: 20 20 20 2a 76 20 3d 20 28 28 75 36 34 29 73 29     *v = ((u64)s)
70a0: 3c 3c 33 32 20 7c 20 61 3b 0a 20 20 20 20 72 65  <<32 | a;.    re
70b0: 74 75 72 6e 20 38 3b 0a 20 20 7d 0a 0a 20 20 70  turn 8;.  }..  p
70c0: 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 35 3b  ++;.  a = a<<15;
70d0: 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a  .  a |= *p;.  /*
70e0: 20 61 3a 20 70 34 3c 3c 32 39 20 7c 20 70 36 3c   a: p4<<29 | p6<
70f0: 3c 31 35 20 7c 20 70 38 20 28 75 6e 6d 61 73 6b  <15 | p8 (unmask
7100: 65 64 29 20 2a 2f 0a 0a 20 20 2f 2a 20 6d 6f 76  ed) */..  /* mov
7110: 65 64 20 43 53 45 32 20 75 70 20 2a 2f 0a 20 20  ed CSE2 up */.  
7120: 2f 2a 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 32  /* a &= (0x7f<<2
7130: 39 29 7c 28 30 78 37 66 3c 3c 31 35 29 7c 28 30  9)|(0x7f<<15)|(0
7140: 78 66 66 29 3b 20 2a 2f 0a 20 20 62 20 26 3d 20  xff); */.  b &= 
7150: 53 4c 4f 54 5f 32 5f 30 3b 0a 20 20 62 20 3d 20  SLOT_2_0;.  b = 
7160: 62 3c 3c 38 3b 0a 20 20 61 20 7c 3d 20 62 3b 0a  b<<8;.  a |= b;.
7170: 0a 20 20 73 20 3d 20 73 3c 3c 34 3b 0a 20 20 62  .  s = s<<4;.  b
7180: 20 3d 20 70 5b 2d 34 5d 3b 0a 20 20 62 20 26 3d   = p[-4];.  b &=
7190: 20 30 78 37 66 3b 0a 20 20 62 20 3d 20 62 3e 3e   0x7f;.  b = b>>
71a0: 33 3b 0a 20 20 73 20 7c 3d 20 62 3b 0a 0a 20 20  3;.  s |= b;..  
71b0: 2a 76 20 3d 20 28 28 75 36 34 29 73 29 3c 3c 33  *v = ((u64)s)<<3
71c0: 32 20 7c 20 61 3b 0a 0a 20 20 72 65 74 75 72 6e  2 | a;..  return
71d0: 20 39 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61   9;.}../*.** Rea
71e0: 64 20 61 20 33 32 2d 62 69 74 20 76 61 72 69 61  d a 32-bit varia
71f0: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
7200: 65 72 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 73  er from memory s
7210: 74 61 72 74 69 6e 67 20 61 74 20 70 5b 30 5d 2e  tarting at p[0].
7220: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
7230: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
7240: 65 61 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ead.  The value 
7250: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 76 2e  is stored in *v.
7260: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 61  .**.** If the va
7270: 72 69 6e 74 20 73 74 6f 72 65 64 20 69 6e 20 70  rint stored in p
7280: 5b 30 5d 20 69 73 20 6c 61 72 67 65 72 20 74 68  [0] is larger th
7290: 61 6e 20 63 61 6e 20 66 69 74 20 69 6e 20 61 20  an can fit in a 
72a0: 33 32 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 0a  32-bit unsigned.
72b0: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  ** integer, then
72c0: 20 73 65 74 20 2a 76 20 74 6f 20 30 78 66 66 66   set *v to 0xfff
72d0: 66 66 66 66 66 2e 0a 2a 2a 0a 2a 2a 20 41 20 4d  fffff..**.** A M
72e0: 41 43 52 4f 20 76 65 72 73 69 6f 6e 2c 20 67 65  ACRO version, ge
72f0: 74 56 61 72 69 6e 74 33 32 2c 20 69 73 20 70 72  tVarint32, is pr
7300: 6f 76 69 64 65 64 20 77 68 69 63 68 20 69 6e 6c  ovided which inl
7310: 69 6e 65 73 20 74 68 65 20 0a 2a 2a 20 73 69 6e  ines the .** sin
7320: 67 6c 65 2d 62 79 74 65 20 63 61 73 65 2e 20 20  gle-byte case.  
7330: 41 6c 6c 20 63 6f 64 65 20 73 68 6f 75 6c 64 20  All code should 
7340: 75 73 65 20 74 68 65 20 4d 41 43 52 4f 20 76 65  use the MACRO ve
7350: 72 73 69 6f 6e 20 61 73 20 0a 2a 2a 20 74 68 69  rsion as .** thi
7360: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
7370: 65 73 20 74 68 65 20 73 69 6e 67 6c 65 2d 62 79  es the single-by
7380: 74 65 20 63 61 73 65 20 68 61 73 20 61 6c 72 65  te case has alre
7390: 61 64 79 20 62 65 65 6e 20 68 61 6e 64 6c 65 64  ady been handled
73a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
73b0: 65 74 56 61 72 69 6e 74 33 32 28 63 6f 6e 73 74  etVarint32(const
73c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
73d0: 70 2c 20 75 33 32 20 2a 76 29 7b 0a 20 20 75 33  p, u32 *v){.  u3
73e0: 32 20 61 2c 62 3b 0a 0a 20 20 2f 2a 20 54 68 65  2 a,b;..  /* The
73f0: 20 31 2d 62 79 74 65 20 63 61 73 65 2e 20 20 4f   1-byte case.  O
7400: 76 65 72 77 68 65 6c 6d 69 6e 67 6c 79 20 74 68  verwhelmingly th
7410: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 2e 20 20  e most common.  
7420: 48 61 6e 64 6c 65 64 20 69 6e 6c 69 6e 65 0a 20  Handled inline. 
7430: 20 2a 2a 20 62 79 20 74 68 65 20 67 65 74 56 61   ** by the getVa
7440: 72 69 6e 33 32 28 29 20 6d 61 63 72 6f 20 2a 2f  rin32() macro */
7450: 0a 20 20 61 20 3d 20 2a 70 3b 0a 20 20 2f 2a 20  .  a = *p;.  /* 
7460: 61 3a 20 70 30 20 28 75 6e 6d 61 73 6b 65 64 29  a: p0 (unmasked)
7470: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 67 65 74 56   */.#ifndef getV
7480: 61 72 69 6e 74 33 32 0a 20 20 69 66 20 28 21 28  arint32.  if (!(
7490: 61 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20 20  a&0x80)).  {.   
74a0: 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77 65   /* Values betwe
74b0: 65 6e 20 30 20 61 6e 64 20 31 32 37 20 2a 2f 0a  en 0 and 127 */.
74c0: 20 20 20 20 2a 76 20 3d 20 61 3b 0a 20 20 20 20      *v = a;.    
74d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65  return 1;.  }.#e
74e0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 68 65 20 32  ndif..  /* The 2
74f0: 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20  -byte case */.  
7500: 70 2b 2b 3b 0a 20 20 62 20 3d 20 2a 70 3b 0a 20  p++;.  b = *p;. 
7510: 20 2f 2a 20 62 3a 20 70 31 20 28 75 6e 6d 61 73   /* b: p1 (unmas
7520: 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21 28  ked) */.  if (!(
7530: 62 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20 20  b&0x80)).  {.   
7540: 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77 65   /* Values betwe
7550: 65 6e 20 31 32 38 20 61 6e 64 20 31 36 33 38 33  en 128 and 16383
7560: 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20 30 78 37   */.    a &= 0x7
7570: 66 3b 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37 3b  f;.    a = a<<7;
7580: 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20 62 3b  .    *v = a | b;
7590: 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
75a0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 33 2d 62   }..  /* The 3-b
75b0: 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20 70 2b  yte case */.  p+
75c0: 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34 3b 0a  +;.  a = a<<14;.
75d0: 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20    a |= *p;.  /* 
75e0: 61 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32 20 28  a: p0<<14 | p2 (
75f0: 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69  unmasked) */.  i
7600: 66 20 28 21 28 61 26 30 78 38 30 29 29 0a 20 20  f (!(a&0x80)).  
7610: 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20  {.    /* Values 
7620: 62 65 74 77 65 65 6e 20 31 36 33 38 34 20 61 6e  between 16384 an
7630: 64 20 32 30 39 37 31 35 31 20 2a 2f 0a 20 20 20  d 2097151 */.   
7640: 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29   a &= (0x7f<<14)
7650: 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 62 20 26  |(0x7f);.    b &
7660: 3d 20 30 78 37 66 3b 0a 20 20 20 20 62 20 3d 20  = 0x7f;.    b = 
7670: 62 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61  b<<7;.    *v = a
7680: 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75 72 6e   | b;.    return
7690: 20 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20   3;.  }..  /* A 
76a0: 33 32 2d 62 69 74 20 76 61 72 69 6e 74 20 69 73  32-bit varint is
76b0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 73   used to store s
76c0: 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ize information 
76d0: 69 6e 20 62 74 72 65 65 73 2e 0a 20 20 2a 2a 20  in btrees..  ** 
76e0: 4f 62 6a 65 63 74 73 20 61 72 65 20 72 61 72 65  Objects are rare
76f0: 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 32  ly larger than 2
7700: 4d 69 42 20 6c 69 6d 69 74 20 6f 66 20 61 20 33  MiB limit of a 3
7710: 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20 20  -byte varint..  
7720: 2a 2a 20 41 20 33 2d 62 79 74 65 20 76 61 72 69  ** A 3-byte vari
7730: 6e 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  nt is sufficient
7740: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
7750: 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 69 7a  o record the siz
7760: 65 0a 20 20 2a 2a 20 6f 66 20 61 20 31 30 34 38  e.  ** of a 1048
7770: 35 36 39 2d 62 79 74 65 20 42 4c 4f 42 20 6f 72  569-byte BLOB or
7780: 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20   string..  **.  
7790: 2a 2a 20 57 65 20 6f 6e 6c 79 20 75 6e 72 6f 6c  ** We only unrol
77a0: 6c 20 74 68 65 20 66 69 72 73 74 20 31 2d 2c 20  l the first 1-, 
77b0: 32 2d 2c 20 61 6e 64 20 33 2d 20 62 79 74 65 20  2-, and 3- byte 
77c0: 63 61 73 65 73 2e 20 20 54 68 65 20 76 65 72 79  cases.  The very
77d0: 0a 20 20 2a 2a 20 72 61 72 65 20 6c 61 72 67 65  .  ** rare large
77e0: 72 20 63 61 73 65 73 20 63 61 6e 20 62 65 20 68  r cases can be h
77f0: 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 73 6c  andled by the sl
7800: 6f 77 65 72 20 36 34 2d 62 69 74 20 76 61 72 69  ower 64-bit vari
7810: 6e 74 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 2e  nt.  ** routine.
7820: 0a 20 20 2a 2f 0a 23 69 66 20 31 0a 20 20 7b 0a  .  */.#if 1.  {.
7830: 20 20 20 20 75 36 34 20 76 36 34 3b 0a 20 20 20      u64 v64;.   
7840: 20 75 38 20 6e 3b 0a 0a 20 20 20 20 70 20 2d 3d   u8 n;..    p -=
7850: 20 32 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69   2;.    n = sqli
7860: 74 65 33 47 65 74 56 61 72 69 6e 74 28 70 2c 20  te3GetVarint(p, 
7870: 26 76 36 34 29 3b 0a 20 20 20 20 61 73 73 65 72  &v64);.    asser
7880: 74 28 20 6e 3e 33 20 26 26 20 6e 3c 3d 39 20 29  t( n>3 && n<=9 )
7890: 3b 0a 20 20 20 20 69 66 28 20 28 76 36 34 20 26  ;.    if( (v64 &
78a0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29   SQLITE_MAX_U32)
78b0: 21 3d 76 36 34 20 29 7b 0a 20 20 20 20 20 20 2a  !=v64 ){.      *
78c0: 76 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  v = 0xffffffff;.
78d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
78e0: 20 2a 76 20 3d 20 28 75 33 32 29 76 36 34 3b 0a   *v = (u32)v64;.
78f0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
7900: 20 6e 3b 0a 20 20 7d 0a 0a 23 65 6c 73 65 0a 20   n;.  }..#else. 
7910: 20 2f 2a 20 46 6f 72 20 66 6f 6c 6c 6f 77 69 6e   /* For followin
7920: 67 20 63 6f 64 65 20 28 6b 65 70 74 20 66 6f 72  g code (kept for
7930: 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 63 6f   historical reco
7940: 72 64 20 6f 6e 6c 79 29 20 73 68 6f 77 73 20 61  rd only) shows a
7950: 6e 0a 20 20 2a 2a 20 75 6e 72 6f 6c 6c 69 6e 67  n.  ** unrolling
7960: 20 66 6f 72 20 74 68 65 20 33 2d 20 61 6e 64 20   for the 3- and 
7970: 34 2d 62 79 74 65 20 76 61 72 69 6e 74 20 63 61  4-byte varint ca
7980: 73 65 73 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ses.  This code 
7990: 69 73 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  is.  ** slightly
79a0: 20 66 61 73 74 65 72 2c 20 62 75 74 20 69 74 20   faster, but it 
79b0: 69 73 20 61 6c 73 6f 20 6c 61 72 67 65 72 20 61  is also larger a
79c0: 6e 64 20 6d 75 63 68 20 68 61 72 64 65 72 20 74  nd much harder t
79d0: 6f 20 74 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 70  o test..  */.  p
79e0: 2b 2b 3b 0a 20 20 62 20 3d 20 62 3c 3c 31 34 3b  ++;.  b = b<<14;
79f0: 0a 20 20 62 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a  .  b |= *p;.  /*
7a00: 20 62 3a 20 70 31 3c 3c 31 34 20 7c 20 70 33 20   b: p1<<14 | p3 
7a10: 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20  (unmasked) */.  
7a20: 69 66 20 28 21 28 62 26 30 78 38 30 29 29 0a 20  if (!(b&0x80)). 
7a30: 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73   {.    /* Values
7a40: 20 62 65 74 77 65 65 6e 20 32 30 39 37 31 35 32   between 2097152
7a50: 20 61 6e 64 20 32 36 38 34 33 35 34 35 35 20 2a   and 268435455 *
7a60: 2f 0a 20 20 20 20 62 20 26 3d 20 28 30 78 37 66  /.    b &= (0x7f
7a70: 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 0a 20 20  <<14)|(0x7f);.  
7a80: 20 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34    a &= (0x7f<<14
7a90: 29 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 61 20  )|(0x7f);.    a 
7aa0: 3d 20 61 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d  = a<<7;.    *v =
7ab0: 20 61 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75   a | b;.    retu
7ac0: 72 6e 20 34 3b 0a 20 20 7d 0a 0a 20 20 70 2b 2b  rn 4;.  }..  p++
7ad0: 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34 3b 0a 20  ;.  a = a<<14;. 
7ae0: 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61   a |= *p;.  /* a
7af0: 3a 20 70 30 3c 3c 32 38 20 7c 20 70 32 3c 3c 31  : p0<<28 | p2<<1
7b00: 34 20 7c 20 70 34 20 28 75 6e 6d 61 73 6b 65 64  4 | p4 (unmasked
7b10: 29 20 2a 2f 0a 20 20 69 66 20 28 21 28 61 26 30  ) */.  if (!(a&0
7b20: 78 38 30 29 29 0a 20 20 7b 0a 20 20 20 20 2f 2a  x80)).  {.    /*
7b30: 20 56 61 6c 75 65 73 20 20 62 65 74 77 65 65 6e   Values  between
7b40: 20 32 36 38 34 33 35 34 35 36 20 61 6e 64 20 33   268435456 and 3
7b50: 34 33 35 39 37 33 38 33 36 37 20 2a 2f 0a 20 20  4359738367 */.  
7b60: 20 20 61 20 26 3d 20 53 4c 4f 54 5f 34 5f 32 5f    a &= SLOT_4_2_
7b70: 30 3b 0a 20 20 20 20 62 20 26 3d 20 53 4c 4f 54  0;.    b &= SLOT
7b80: 5f 34 5f 32 5f 30 3b 0a 20 20 20 20 62 20 3d 20  _4_2_0;.    b = 
7b90: 62 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61  b<<7;.    *v = a
7ba0: 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75 72 6e   | b;.    return
7bb0: 20 35 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65   5;.  }..  /* We
7bc0: 20 63 61 6e 20 6f 6e 6c 79 20 72 65 61 63 68 20   can only reach 
7bd0: 74 68 69 73 20 70 6f 69 6e 74 20 77 68 65 6e 20  this point when 
7be0: 72 65 61 64 69 6e 67 20 61 20 63 6f 72 72 75 70  reading a corrup
7bf0: 74 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  t database.  ** 
7c00: 66 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  file.  In that c
7c10: 61 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 69  ase we are not i
7c20: 6e 20 61 6e 79 20 68 75 72 72 79 2e 20 20 55 73  n any hurry.  Us
7c30: 65 20 74 68 65 20 28 72 65 6c 61 74 69 76 65 6c  e the (relativel
7c40: 79 0a 20 20 2a 2a 20 73 6c 6f 77 29 20 67 65 6e  y.  ** slow) gen
7c50: 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 73 71 6c  eral-purpose sql
7c60: 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 29 20  ite3GetVarint() 
7c70: 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 74 72 61  routine to extra
7c80: 63 74 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  ct the.  ** valu
7c90: 65 2e 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 36  e. */.  {.    u6
7ca0: 34 20 76 36 34 3b 0a 20 20 20 20 75 38 20 6e 3b  4 v64;.    u8 n;
7cb0: 0a 0a 20 20 20 20 70 20 2d 3d 20 34 3b 0a 20 20  ..    p -= 4;.  
7cc0: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 47 65 74    n = sqlite3Get
7cd0: 56 61 72 69 6e 74 28 70 2c 20 26 76 36 34 29 3b  Varint(p, &v64);
7ce0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 35  .    assert( n>5
7cf0: 20 26 26 20 6e 3c 3d 39 20 29 3b 0a 20 20 20 20   && n<=9 );.    
7d00: 2a 76 20 3d 20 28 75 33 32 29 76 36 34 3b 0a 20  *v = (u32)v64;. 
7d10: 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 7d     return n;.  }
7d20: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
7d30: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7d40: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
7d50: 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 65 64 20   will be needed 
7d60: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 67 69 76  to store the giv
7d70: 65 6e 0a 2a 2a 20 36 34 2d 62 69 74 20 69 6e 74  en.** 64-bit int
7d80: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
7d90: 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 75 36  ite3VarintLen(u6
7da0: 34 20 76 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  4 v){.  int i;. 
7db0: 20 66 6f 72 28 69 3d 31 3b 20 28 76 20 3e 3e 3d   for(i=1; (v >>=
7dc0: 20 37 29 21 3d 30 3b 20 69 2b 2b 29 7b 20 61 73   7)!=0; i++){ as
7dd0: 73 65 72 74 28 20 69 3c 31 30 20 29 3b 20 7d 0a  sert( i<10 ); }.
7de0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 0a    return i;.}...
7df0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 6f 72 20 77 72  /*.** Read or wr
7e00: 69 74 65 20 61 20 66 6f 75 72 2d 62 79 74 65 20  ite a four-byte 
7e10: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
7e20: 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 75 33 32  er value..*/.u32
7e30: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
7e40: 28 63 6f 6e 73 74 20 75 38 20 2a 70 29 7b 0a 23  (const u8 *p){.#
7e50: 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52  if SQLITE_BYTEOR
7e60: 44 45 52 3d 3d 34 33 32 31 0a 20 20 75 33 32 20  DER==4321.  u32 
7e70: 78 3b 0a 20 20 6d 65 6d 63 70 79 28 26 78 2c 70  x;.  memcpy(&x,p
7e80: 2c 34 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b  ,4);.  return x;
7e90: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59  .#elif SQLITE_BY
7ea0: 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26  TEORDER==1234 &&
7eb0: 20 47 43 43 5f 56 45 52 53 49 4f 4e 3e 3d 34 30   GCC_VERSION>=40
7ec0: 30 33 30 30 30 0a 20 20 75 33 32 20 78 3b 0a 20  03000.  u32 x;. 
7ed0: 20 6d 65 6d 63 70 79 28 26 78 2c 70 2c 34 29 3b   memcpy(&x,p,4);
7ee0: 0a 20 20 72 65 74 75 72 6e 20 5f 5f 62 75 69 6c  .  return __buil
7ef0: 74 69 6e 5f 62 73 77 61 70 33 32 28 78 29 3b 0a  tin_bswap32(x);.
7f00: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54  #elif SQLITE_BYT
7f10: 45 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20  EORDER==1234 && 
7f20: 4d 53 56 43 5f 56 45 52 53 49 4f 4e 3e 3d 31 33  MSVC_VERSION>=13
7f30: 30 30 0a 20 20 75 33 32 20 78 3b 0a 20 20 6d 65  00.  u32 x;.  me
7f40: 6d 63 70 79 28 26 78 2c 70 2c 34 29 3b 0a 20 20  mcpy(&x,p,4);.  
7f50: 72 65 74 75 72 6e 20 5f 62 79 74 65 73 77 61 70  return _byteswap
7f60: 5f 75 6c 6f 6e 67 28 78 29 3b 0a 23 65 6c 73 65  _ulong(x);.#else
7f70: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 5b 30  .  testcase( p[0
7f80: 5d 26 30 78 38 30 20 29 3b 0a 20 20 72 65 74 75  ]&0x80 );.  retu
7f90: 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 29 70 5b  rn ((unsigned)p[
7fa0: 30 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c  0]<<24) | (p[1]<
7fb0: 3c 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29  <16) | (p[2]<<8)
7fc0: 20 7c 20 70 5b 33 5d 3b 0a 23 65 6e 64 69 66 0a   | p[3];.#endif.
7fd0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 75  }.void sqlite3Pu
7fe0: 74 34 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20  t4byte(unsigned 
7ff0: 63 68 61 72 20 2a 70 2c 20 75 33 32 20 76 29 7b  char *p, u32 v){
8000: 0a 23 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45  .#if SQLITE_BYTE
8010: 4f 52 44 45 52 3d 3d 34 33 32 31 0a 20 20 6d 65  ORDER==4321.  me
8020: 6d 63 70 79 28 70 2c 26 76 2c 34 29 3b 0a 23 65  mcpy(p,&v,4);.#e
8030: 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  lif SQLITE_BYTEO
8040: 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20 47 43  RDER==1234 && GC
8050: 43 5f 56 45 52 53 49 4f 4e 3e 3d 34 30 30 33 30  C_VERSION>=40030
8060: 30 30 0a 20 20 75 33 32 20 78 20 3d 20 5f 5f 62  00.  u32 x = __b
8070: 75 69 6c 74 69 6e 5f 62 73 77 61 70 33 32 28 76  uiltin_bswap32(v
8080: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2c 26 78  );.  memcpy(p,&x
8090: 2c 34 29 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54  ,4);.#elif SQLIT
80a0: 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33  E_BYTEORDER==123
80b0: 34 20 26 26 20 4d 53 56 43 5f 56 45 52 53 49 4f  4 && MSVC_VERSIO
80c0: 4e 3e 3d 31 33 30 30 0a 20 20 75 33 32 20 78 20  N>=1300.  u32 x 
80d0: 3d 20 5f 62 79 74 65 73 77 61 70 5f 75 6c 6f 6e  = _byteswap_ulon
80e0: 67 28 76 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  g(v);.  memcpy(p
80f0: 2c 26 78 2c 34 29 3b 0a 23 65 6c 73 65 0a 20 20  ,&x,4);.#else.  
8100: 70 5b 30 5d 20 3d 20 28 75 38 29 28 76 3e 3e 32  p[0] = (u8)(v>>2
8110: 34 29 3b 0a 20 20 70 5b 31 5d 20 3d 20 28 75 38  4);.  p[1] = (u8
8120: 29 28 76 3e 3e 31 36 29 3b 0a 20 20 70 5b 32 5d  )(v>>16);.  p[2]
8130: 20 3d 20 28 75 38 29 28 76 3e 3e 38 29 3b 0a 20   = (u8)(v>>8);. 
8140: 20 70 5b 33 5d 20 3d 20 28 75 38 29 76 3b 0a 23   p[3] = (u8)v;.#
8150: 65 6e 64 69 66 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  endif.}..../*.**
8160: 20 54 72 61 6e 73 6c 61 74 65 20 61 20 73 69 6e   Translate a sin
8170: 67 6c 65 20 62 79 74 65 20 6f 66 20 48 65 78 20  gle byte of Hex 
8180: 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  into an integer.
8190: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
81a0: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 68   only works if h
81b0: 20 72 65 61 6c 6c 79 20 69 73 20 61 20 76 61 6c   really is a val
81c0: 69 64 20 68 65 78 61 64 65 63 69 6d 61 6c 0a 2a  id hexadecimal.*
81d0: 2a 20 63 68 61 72 61 63 74 65 72 3a 20 20 30 2e  * character:  0.
81e0: 2e 39 61 2e 2e 66 41 2e 2e 46 0a 2a 2f 0a 75 38  .9a..fA..F.*/.u8
81f0: 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
8200: 28 69 6e 74 20 68 29 7b 0a 20 20 61 73 73 65 72  (int h){.  asser
8210: 74 28 20 28 68 3e 3d 27 30 27 20 26 26 20 68 3c  t( (h>='0' && h<
8220: 3d 27 39 27 29 20 7c 7c 20 20 28 68 3e 3d 27 61  ='9') ||  (h>='a
8230: 27 20 26 26 20 68 3c 3d 27 66 27 29 20 7c 7c 20  ' && h<='f') || 
8240: 20 28 68 3e 3d 27 41 27 20 26 26 20 68 3c 3d 27   (h>='A' && h<='
8250: 46 27 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51  F') );.#ifdef SQ
8260: 4c 49 54 45 5f 41 53 43 49 49 0a 20 20 68 20 2b  LITE_ASCII.  h +
8270: 3d 20 39 2a 28 31 26 28 68 3e 3e 36 29 29 3b 0a  = 9*(1&(h>>6));.
8280: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
8290: 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20 68 20  LITE_EBCDIC.  h 
82a0: 2b 3d 20 39 2a 28 31 26 7e 28 68 3e 3e 34 29 29  += 9*(1&~(h>>4))
82b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
82c0: 6e 20 28 75 38 29 28 68 20 26 20 30 78 66 29 3b  n (u8)(h & 0xf);
82d0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
82e0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f  (SQLITE_OMIT_BLO
82f0: 42 5f 4c 49 54 45 52 41 4c 29 20 7c 7c 20 64 65  B_LITERAL) || de
8300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
8310: 5f 43 4f 44 45 43 29 0a 2f 2a 0a 2a 2a 20 43 6f  _CODEC)./*.** Co
8320: 6e 76 65 72 74 20 61 20 42 4c 4f 42 20 6c 69 74  nvert a BLOB lit
8330: 65 72 61 6c 20 6f 66 20 74 68 65 20 66 6f 72 6d  eral of the form
8340: 20 22 78 27 68 68 68 68 68 68 27 22 20 69 6e 74   "x'hhhhhh'" int
8350: 6f 20 69 74 73 20 62 69 6e 61 72 79 0a 2a 2a 20  o its binary.** 
8360: 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 61  value.  Return a
8370: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20   pointer to its 
8380: 62 69 6e 61 72 79 20 76 61 6c 75 65 2e 20 20 53  binary value.  S
8390: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
83a0: 0a 2a 2a 20 62 69 6e 61 72 79 20 76 61 6c 75 65  .** binary value
83b0: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
83c0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61  ed from malloc a
83d0: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
83e0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 69   by.** the calli
83f0: 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76  ng routine..*/.v
8400: 6f 69 64 20 2a 73 71 6c 69 74 65 33 48 65 78 54  oid *sqlite3HexT
8410: 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 20 2a 64  oBlob(sqlite3 *d
8420: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
8430: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 63 68 61 72  , int n){.  char
8440: 20 2a 7a 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 69   *zBlob;.  int i
8450: 3b 0a 0a 20 20 7a 42 6c 6f 62 20 3d 20 28 63 68  ;..  zBlob = (ch
8460: 61 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  ar *)sqlite3DbMa
8470: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 2f  llocRawNN(db, n/
8480: 32 20 2b 20 31 29 3b 0a 20 20 6e 2d 2d 3b 0a 20  2 + 1);.  n--;. 
8490: 20 69 66 28 20 7a 42 6c 6f 62 20 29 7b 0a 20 20   if( zBlob ){.  
84a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
84b0: 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 7a 42 6c  i+=2){.      zBl
84c0: 6f 62 5b 69 2f 32 5d 20 3d 20 28 73 71 6c 69 74  ob[i/2] = (sqlit
84d0: 65 33 48 65 78 54 6f 49 6e 74 28 7a 5b 69 5d 29  e3HexToInt(z[i])
84e0: 3c 3c 34 29 20 7c 20 73 71 6c 69 74 65 33 48 65  <<4) | sqlite3He
84f0: 78 54 6f 49 6e 74 28 7a 5b 69 2b 31 5d 29 3b 0a  xToInt(z[i+1]);.
8500: 20 20 20 20 7d 0a 20 20 20 20 7a 42 6c 6f 62 5b      }.    zBlob[
8510: 69 2f 32 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  i/2] = 0;.  }.  
8520: 72 65 74 75 72 6e 20 7a 42 6c 6f 62 3b 0a 7d 0a  return zBlob;.}.
8530: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
8540: 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
8550: 52 41 4c 20 7c 7c 20 53 51 4c 49 54 45 5f 48 41  RAL || SQLITE_HA
8560: 53 5f 43 4f 44 45 43 20 2a 2f 0a 0a 2f 2a 0a 2a  S_CODEC */../*.*
8570: 2a 20 4c 6f 67 20 61 6e 20 65 72 72 6f 72 20 74  * Log an error t
8580: 68 61 74 20 69 73 20 61 6e 20 41 50 49 20 63 61  hat is an API ca
8590: 6c 6c 20 6f 6e 20 61 20 63 6f 6e 6e 65 63 74 69  ll on a connecti
85a0: 6f 6e 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20  on pointer that 
85b0: 73 68 6f 75 6c 64 0a 2a 2a 20 6e 6f 74 20 68 61  should.** not ha
85c0: 76 65 20 62 65 65 6e 20 75 73 65 64 2e 20 20 54  ve been used.  T
85d0: 68 65 20 22 74 79 70 65 22 20 6f 66 20 63 6f 6e  he "type" of con
85e0: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  nection pointer 
85f0: 69 73 20 67 69 76 65 6e 20 61 73 20 74 68 65 0a  is given as the.
8600: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  ** argument.  Th
8610: 65 20 7a 54 79 70 65 20 69 73 20 61 20 77 6f 72  e zType is a wor
8620: 64 20 6c 69 6b 65 20 22 4e 55 4c 4c 22 20 6f 72  d like "NULL" or
8630: 20 22 63 6c 6f 73 65 64 22 20 6f 72 20 22 69 6e   "closed" or "in
8640: 76 61 6c 69 64 22 2e 0a 2a 2f 0a 73 74 61 74 69  valid"..*/.stati
8650: 63 20 76 6f 69 64 20 6c 6f 67 42 61 64 43 6f 6e  c void logBadCon
8660: 6e 65 63 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68  nection(const ch
8670: 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71  ar *zType){.  sq
8680: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
8690: 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20 22  _MISUSE, .     "
86a0: 41 50 49 20 63 61 6c 6c 20 77 69 74 68 20 25 73  API call with %s
86b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
86c0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 22 2c 0a 20  tion pointer",. 
86d0: 20 20 20 20 7a 54 79 70 65 0a 20 20 29 3b 0a 7d      zType.  );.}
86e0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
86f0: 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   make sure we ha
8700: 76 65 20 61 20 76 61 6c 69 64 20 64 62 20 70 6f  ve a valid db po
8710: 69 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73  inter.  This tes
8720: 74 20 69 73 20 6e 6f 74 0a 2a 2a 20 66 6f 6f 6c  t is not.** fool
8730: 70 72 6f 6f 66 20 62 75 74 20 69 74 20 64 6f 65  proof but it doe
8740: 73 20 70 72 6f 76 69 64 65 20 73 6f 6d 65 20 6d  s provide some m
8750: 65 61 73 75 72 65 20 6f 66 20 70 72 6f 74 65 63  easure of protec
8760: 74 69 6f 6e 20 61 67 61 69 6e 73 74 0a 2a 2a 20  tion against.** 
8770: 6d 69 73 75 73 65 20 6f 66 20 74 68 65 20 69 6e  misuse of the in
8780: 74 65 72 66 61 63 65 20 73 75 63 68 20 61 73 20  terface such as 
8790: 70 61 73 73 69 6e 67 20 69 6e 20 64 62 20 70 6f  passing in db po
87a0: 69 6e 74 65 72 73 20 74 68 61 74 20 61 72 65 0a  inters that are.
87b0: 2a 2a 20 4e 55 4c 4c 20 6f 72 20 77 68 69 63 68  ** NULL or which
87c0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69   have been previ
87d0: 6f 75 73 6c 79 20 63 6c 6f 73 65 64 2e 20 20 49  ously closed.  I
87e0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
87f0: 65 74 75 72 6e 73 0a 2a 2a 20 31 20 69 74 20 6d  eturns.** 1 it m
8800: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 62  eans that the db
8810: 20 70 6f 69 6e 74 65 72 20 69 73 20 76 61 6c 69   pointer is vali
8820: 64 20 61 6e 64 20 30 20 69 66 20 69 74 20 73 68  d and 0 if it sh
8830: 6f 75 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 64  ould not be.** d
8840: 65 72 65 66 65 72 65 6e 63 65 64 20 66 6f 72 20  ereferenced for 
8850: 61 6e 79 20 72 65 61 73 6f 6e 2e 20 20 54 68 65  any reason.  The
8860: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
8870: 6e 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 0a  n should invoke.
8880: 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ** SQLITE_MISUSE
8890: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2a   immediately..**
88a0: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 61 66 65 74  .** sqlite3Safet
88b0: 79 43 68 65 63 6b 4f 6b 28 29 20 72 65 71 75 69  yCheckOk() requi
88c0: 72 65 73 20 74 68 61 74 20 74 68 65 20 64 62 20  res that the db 
88d0: 70 6f 69 6e 74 65 72 20 62 65 20 76 61 6c 69 64  pointer be valid
88e0: 20 66 6f 72 0a 2a 2a 20 75 73 65 2e 20 20 73 71   for.** use.  sq
88f0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
8900: 53 69 63 6b 4f 72 4f 6b 28 29 20 61 6c 6c 6f 77  SickOrOk() allow
8910: 73 20 61 20 64 62 20 70 6f 69 6e 74 65 72 20 74  s a db pointer t
8920: 68 61 74 20 66 61 69 6c 65 64 20 74 6f 0a 2a 2a  hat failed to.**
8930: 20 6f 70 65 6e 20 70 72 6f 70 65 72 6c 79 20 61   open properly a
8940: 6e 64 20 69 73 20 6e 6f 74 20 66 69 74 20 66 6f  nd is not fit fo
8950: 72 20 67 65 6e 65 72 61 6c 20 75 73 65 20 62 75  r general use bu
8960: 74 20 77 68 69 63 68 20 63 61 6e 20 62 65 0a 2a  t which can be.*
8970: 2a 20 75 73 65 64 20 61 73 20 61 6e 20 61 72 67  * used as an arg
8980: 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
8990: 5f 65 72 72 6d 73 67 28 29 20 6f 72 20 73 71 6c  _errmsg() or sql
89a0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 2e 0a 2a 2f  ite3_close()..*/
89b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 61 66 65  .int sqlite3Safe
89c0: 74 79 43 68 65 63 6b 4f 6b 28 73 71 6c 69 74 65  tyCheckOk(sqlite
89d0: 33 20 2a 64 62 29 7b 0a 20 20 75 33 32 20 6d 61  3 *db){.  u32 ma
89e0: 67 69 63 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30  gic;.  if( db==0
89f0: 20 29 7b 0a 20 20 20 20 6c 6f 67 42 61 64 43 6f   ){.    logBadCo
8a00: 6e 6e 65 63 74 69 6f 6e 28 22 4e 55 4c 4c 22 29  nnection("NULL")
8a10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
8a20: 20 20 7d 0a 20 20 6d 61 67 69 63 20 3d 20 64 62    }.  magic = db
8a30: 2d 3e 6d 61 67 69 63 3b 0a 20 20 69 66 28 20 6d  ->magic;.  if( m
8a40: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
8a50: 49 43 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  IC_OPEN ){.    i
8a60: 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  f( sqlite3Safety
8a70: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
8a80: 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
8a90: 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
8aa0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
8ab0: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 67 42 61 64   );.      logBad
8ac0: 43 6f 6e 6e 65 63 74 69 6f 6e 28 22 75 6e 6f 70  Connection("unop
8ad0: 65 6e 65 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ened");.    }.  
8ae0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
8af0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
8b00: 31 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c  1;.  }.}.int sql
8b10: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
8b20: 69 63 6b 4f 72 4f 6b 28 73 71 6c 69 74 65 33 20  ickOrOk(sqlite3 
8b30: 2a 64 62 29 7b 0a 20 20 75 33 32 20 6d 61 67 69  *db){.  u32 magi
8b40: 63 3b 0a 20 20 6d 61 67 69 63 20 3d 20 64 62 2d  c;.  magic = db-
8b50: 3e 6d 61 67 69 63 3b 0a 20 20 69 66 28 20 6d 61  >magic;.  if( ma
8b60: 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic!=SQLITE_MAGI
8b70: 43 5f 53 49 43 4b 20 26 26 0a 20 20 20 20 20 20  C_SICK &&.      
8b80: 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41  magic!=SQLITE_MA
8b90: 47 49 43 5f 4f 50 45 4e 20 26 26 0a 20 20 20 20  GIC_OPEN &&.    
8ba0: 20 20 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f    magic!=SQLITE_
8bb0: 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a 20 20  MAGIC_BUSY ){.  
8bc0: 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
8bd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
8be0: 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 6c  xLog!=0 );.    l
8bf0: 6f 67 42 61 64 43 6f 6e 6e 65 63 74 69 6f 6e 28  ogBadConnection(
8c00: 22 69 6e 76 61 6c 69 64 22 29 3b 0a 20 20 20 20  "invalid");.    
8c10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
8c20: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
8c30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
8c40: 74 65 6d 70 74 20 74 6f 20 61 64 64 2c 20 73 75  tempt to add, su
8c50: 62 73 74 72 61 63 74 2c 20 6f 72 20 6d 75 6c 74  bstract, or mult
8c60: 69 70 6c 79 20 74 68 65 20 36 34 2d 62 69 74 20  iply the 64-bit 
8c70: 73 69 67 6e 65 64 20 76 61 6c 75 65 20 69 42 20  signed value iB 
8c80: 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6f  against.** the o
8c90: 74 68 65 72 20 36 34 2d 62 69 74 20 73 69 67 6e  ther 64-bit sign
8ca0: 65 64 20 69 6e 74 65 67 65 72 20 61 74 20 2a 70  ed integer at *p
8cb0: 41 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  A and store the 
8cc0: 72 65 73 75 6c 74 20 69 6e 20 2a 70 41 2e 0a 2a  result in *pA..*
8cd0: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
8ce0: 63 63 65 73 73 2e 20 20 4f 72 20 69 66 20 74 68  ccess.  Or if th
8cf0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 6f 75 6c  e operation woul
8d00: 64 20 68 61 76 65 20 72 65 73 75 6c 74 65 64 20  d have resulted 
8d10: 69 6e 20 61 6e 0a 2a 2a 20 6f 76 65 72 66 6c 6f  in an.** overflo
8d20: 77 2c 20 6c 65 61 76 65 20 2a 70 41 20 75 6e 63  w, leave *pA unc
8d30: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
8d40: 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n 1..*/.int sqli
8d50: 74 65 33 41 64 64 49 6e 74 36 34 28 69 36 34 20  te3AddInt64(i64 
8d60: 2a 70 41 2c 20 69 36 34 20 69 42 29 7b 0a 23 69  *pA, i64 iB){.#i
8d70: 66 20 47 43 43 5f 56 45 52 53 49 4f 4e 3e 3d 35  f GCC_VERSION>=5
8d80: 30 30 34 30 30 30 20 26 26 20 21 64 65 66 69 6e  004000 && !defin
8d90: 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49  ed(__INTEL_COMPI
8da0: 4c 45 52 29 0a 20 20 72 65 74 75 72 6e 20 5f 5f  LER).  return __
8db0: 62 75 69 6c 74 69 6e 5f 61 64 64 5f 6f 76 65 72  builtin_add_over
8dc0: 66 6c 6f 77 28 2a 70 41 2c 20 69 42 2c 20 70 41  flow(*pA, iB, pA
8dd0: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 36 34 20 69  );.#else.  i64 i
8de0: 41 20 3d 20 2a 70 41 3b 0a 20 20 74 65 73 74 63  A = *pA;.  testc
8df0: 61 73 65 28 20 69 41 3d 3d 30 20 29 3b 20 74 65  ase( iA==0 ); te
8e00: 73 74 63 61 73 65 28 20 69 41 3d 3d 31 20 29 3b  stcase( iA==1 );
8e10: 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 42 3d  .  testcase( iB=
8e20: 3d 2d 31 20 29 3b 20 74 65 73 74 63 61 73 65 28  =-1 ); testcase(
8e30: 20 69 42 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20   iB==0 );.  if( 
8e40: 69 42 3e 3d 30 20 29 7b 0a 20 20 20 20 74 65 73  iB>=0 ){.    tes
8e50: 74 63 61 73 65 28 20 69 41 3e 30 20 26 26 20 4c  tcase( iA>0 && L
8e60: 41 52 47 45 53 54 5f 49 4e 54 36 34 20 2d 20 69  ARGEST_INT64 - i
8e70: 41 20 3d 3d 20 69 42 20 29 3b 0a 20 20 20 20 74  A == iB );.    t
8e80: 65 73 74 63 61 73 65 28 20 69 41 3e 30 20 26 26  estcase( iA>0 &&
8e90: 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 2d   LARGEST_INT64 -
8ea0: 20 69 41 20 3d 3d 20 69 42 20 2d 20 31 20 29 3b   iA == iB - 1 );
8eb0: 0a 20 20 20 20 69 66 28 20 69 41 3e 30 20 26 26  .    if( iA>0 &&
8ec0: 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 2d   LARGEST_INT64 -
8ed0: 20 69 41 20 3c 20 69 42 20 29 20 72 65 74 75 72   iA < iB ) retur
8ee0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
8ef0: 20 20 74 65 73 74 63 61 73 65 28 20 69 41 3c 30    testcase( iA<0
8f00: 20 26 26 20 2d 28 69 41 20 2b 20 4c 41 52 47 45   && -(iA + LARGE
8f10: 53 54 5f 49 4e 54 36 34 29 20 3d 3d 20 69 42 20  ST_INT64) == iB 
8f20: 2b 20 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63  + 1 );.    testc
8f30: 61 73 65 28 20 69 41 3c 30 20 26 26 20 2d 28 69  ase( iA<0 && -(i
8f40: 41 20 2b 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  A + LARGEST_INT6
8f50: 34 29 20 3d 3d 20 69 42 20 2b 20 32 20 29 3b 0a  4) == iB + 2 );.
8f60: 20 20 20 20 69 66 28 20 69 41 3c 30 20 26 26 20      if( iA<0 && 
8f70: 2d 28 69 41 20 2b 20 4c 41 52 47 45 53 54 5f 49  -(iA + LARGEST_I
8f80: 4e 54 36 34 29 20 3e 20 69 42 20 2b 20 31 20 29  NT64) > iB + 1 )
8f90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
8fa0: 20 2a 70 41 20 2b 3d 20 69 42 3b 0a 20 20 72 65   *pA += iB;.  re
8fb0: 74 75 72 6e 20 30 3b 20 0a 23 65 6e 64 69 66 0a  turn 0; .#endif.
8fc0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 75 62  }.int sqlite3Sub
8fd0: 49 6e 74 36 34 28 69 36 34 20 2a 70 41 2c 20 69  Int64(i64 *pA, i
8fe0: 36 34 20 69 42 29 7b 0a 23 69 66 20 47 43 43 5f  64 iB){.#if GCC_
8ff0: 56 45 52 53 49 4f 4e 3e 3d 35 30 30 34 30 30 30  VERSION>=5004000
9000: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 49   && !defined(__I
9010: 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 20  NTEL_COMPILER). 
9020: 20 72 65 74 75 72 6e 20 5f 5f 62 75 69 6c 74 69   return __builti
9030: 6e 5f 73 75 62 5f 6f 76 65 72 66 6c 6f 77 28 2a  n_sub_overflow(*
9040: 70 41 2c 20 69 42 2c 20 70 41 29 3b 0a 23 65 6c  pA, iB, pA);.#el
9050: 73 65 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  se.  testcase( i
9060: 42 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  B==SMALLEST_INT6
9070: 34 2b 31 20 29 3b 0a 20 20 69 66 28 20 69 42 3d  4+1 );.  if( iB=
9080: 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20  =SMALLEST_INT64 
9090: 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
90a0: 20 28 2a 70 41 29 3d 3d 28 2d 31 29 20 29 3b 20   (*pA)==(-1) ); 
90b0: 74 65 73 74 63 61 73 65 28 20 28 2a 70 41 29 3d  testcase( (*pA)=
90c0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 2a  =0 );.    if( (*
90d0: 70 41 29 3e 3d 30 20 29 20 72 65 74 75 72 6e 20  pA)>=0 ) return 
90e0: 31 3b 0a 20 20 20 20 2a 70 41 20 2d 3d 20 69 42  1;.    *pA -= iB
90f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
9100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
9110: 75 72 6e 20 73 71 6c 69 74 65 33 41 64 64 49 6e  urn sqlite3AddIn
9120: 74 36 34 28 70 41 2c 20 2d 69 42 29 3b 0a 20 20  t64(pA, -iB);.  
9130: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 69 6e 74 20 73  }.#endif.}.int s
9140: 71 6c 69 74 65 33 4d 75 6c 49 6e 74 36 34 28 69  qlite3MulInt64(i
9150: 36 34 20 2a 70 41 2c 20 69 36 34 20 69 42 29 7b  64 *pA, i64 iB){
9160: 0a 23 69 66 20 47 43 43 5f 56 45 52 53 49 4f 4e  .#if GCC_VERSION
9170: 3e 3d 35 30 30 34 30 30 30 20 26 26 20 21 64 65  >=5004000 && !de
9180: 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f  fined(__INTEL_CO
9190: 4d 50 49 4c 45 52 29 0a 20 20 72 65 74 75 72 6e  MPILER).  return
91a0: 20 5f 5f 62 75 69 6c 74 69 6e 5f 6d 75 6c 5f 6f   __builtin_mul_o
91b0: 76 65 72 66 6c 6f 77 28 2a 70 41 2c 20 69 42 2c  verflow(*pA, iB,
91c0: 20 70 41 29 3b 0a 23 65 6c 73 65 0a 20 20 69 36   pA);.#else.  i6
91d0: 34 20 69 41 20 3d 20 2a 70 41 3b 0a 20 20 69 66  4 iA = *pA;.  if
91e0: 28 20 69 42 3e 30 20 29 7b 0a 20 20 20 20 69 66  ( iB>0 ){.    if
91f0: 28 20 69 41 3e 4c 41 52 47 45 53 54 5f 49 4e 54  ( iA>LARGEST_INT
9200: 36 34 2f 69 42 20 29 20 72 65 74 75 72 6e 20 31  64/iB ) return 1
9210: 3b 0a 20 20 20 20 69 66 28 20 69 41 3c 53 4d 41  ;.    if( iA<SMA
9220: 4c 4c 45 53 54 5f 49 4e 54 36 34 2f 69 42 20 29  LLEST_INT64/iB )
9230: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
9240: 73 65 20 69 66 28 20 69 42 3c 30 20 29 7b 0a 20  se if( iB<0 ){. 
9250: 20 20 20 69 66 28 20 69 41 3e 30 20 29 7b 0a 20     if( iA>0 ){. 
9260: 20 20 20 20 20 69 66 28 20 69 42 3c 53 4d 41 4c       if( iB<SMAL
9270: 4c 45 53 54 5f 49 4e 54 36 34 2f 69 41 20 29 20  LEST_INT64/iA ) 
9280: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 65  return 1;.    }e
9290: 6c 73 65 20 69 66 28 20 69 41 3c 30 20 29 7b 0a  lse if( iA<0 ){.
92a0: 20 20 20 20 20 20 69 66 28 20 69 42 3d 3d 53 4d        if( iB==SM
92b0: 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 72  ALLEST_INT64 ) r
92c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69  eturn 1;.      i
92d0: 66 28 20 69 41 3d 3d 53 4d 41 4c 4c 45 53 54 5f  f( iA==SMALLEST_
92e0: 49 4e 54 36 34 20 29 20 72 65 74 75 72 6e 20 31  INT64 ) return 1
92f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 2d 69 41 3e  ;.      if( -iA>
9300: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2f 2d 69  LARGEST_INT64/-i
9310: 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
9320: 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 20 3d 20    }.  }.  *pA = 
9330: 69 41 2a 69 42 3b 0a 20 20 72 65 74 75 72 6e 20  iA*iB;.  return 
9340: 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
9350: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  ** Compute the a
9360: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66  bsolute value of
9370: 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64   a 32-bit signed
9380: 20 69 6e 74 65 67 65 72 2c 20 6f 66 20 70 6f 73   integer, of pos
9390: 73 69 62 6c 65 2e 20 20 4f 72 20 0a 2a 2a 20 69  sible.  Or .** i
93a0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 68 61  f the integer ha
93b0: 73 20 61 20 76 61 6c 75 65 20 6f 66 20 2d 32 31  s a value of -21
93c0: 34 37 34 38 33 36 34 38 2c 20 72 65 74 75 72 6e  47483648, return
93d0: 20 2b 32 31 34 37 34 38 33 36 34 37 0a 2a 2f 0a   +2147483647.*/.
93e0: 69 6e 74 20 73 71 6c 69 74 65 33 41 62 73 49 6e  int sqlite3AbsIn
93f0: 74 33 32 28 69 6e 74 20 78 29 7b 0a 20 20 69 66  t32(int x){.  if
9400: 28 20 78 3e 3d 30 20 29 20 72 65 74 75 72 6e 20  ( x>=0 ) return 
9410: 78 3b 0a 20 20 69 66 28 20 78 3d 3d 28 69 6e 74  x;.  if( x==(int
9420: 29 30 78 38 30 30 30 30 30 30 30 20 29 20 72 65  )0x80000000 ) re
9430: 74 75 72 6e 20 30 78 37 66 66 66 66 66 66 66 3b  turn 0x7fffffff;
9440: 0a 20 20 72 65 74 75 72 6e 20 2d 78 3b 0a 7d 0a  .  return -x;.}.
9450: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9460: 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a  NABLE_8_3_NAMES.
9470: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
9480: 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
9490: 20 69 73 20 73 65 74 20 61 74 20 63 6f 6d 70 69   is set at compi
94a0: 6c 65 2d 74 69 6d 65 20 61 6e 64 20 69 66 20 74  le-time and if t
94b0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
94c0: 69 6c 65 6e 61 6d 65 20 69 6e 20 7a 42 61 73 65  ilename in zBase
94d0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 55 52  Filename is a UR
94e0: 49 20 77 69 74 68 20 74 68 65 20 22 38 5f 33 5f  I with the "8_3_
94f0: 6e 61 6d 65 73 3d 31 22 20 70 61 72 61 6d 65 74  names=1" paramet
9500: 65 72 20 61 6e 64 0a 2a 2a 20 69 66 20 66 69 6c  er and.** if fil
9510: 65 6e 61 6d 65 20 69 6e 20 7a 5b 5d 20 68 61 73  ename in z[] has
9520: 20 61 20 73 75 66 66 69 78 20 28 61 2e 6b 2e 61   a suffix (a.k.a
9530: 2e 20 22 65 78 74 65 6e 73 69 6f 6e 22 29 20 74  . "extension") t
9540: 68 61 74 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  hat is longer th
9550: 61 6e 0a 2a 2a 20 74 68 72 65 65 20 63 68 61 72  an.** three char
9560: 61 63 74 65 72 73 2c 20 74 68 65 6e 20 73 68 6f  acters, then sho
9570: 72 74 65 6e 20 74 68 65 20 73 75 66 66 69 78 20  rten the suffix 
9580: 6f 6e 20 7a 5b 5d 20 74 6f 20 62 65 20 74 68 65  on z[] to be the
9590: 20 6c 61 73 74 20 74 68 72 65 65 0a 2a 2a 20 63   last three.** c
95a0: 68 61 72 61 63 74 65 72 73 20 6f 66 20 74 68 65  haracters of the
95b0: 20 6f 72 69 67 69 6e 61 6c 20 73 75 66 66 69 78   original suffix
95c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
95d0: 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
95e0: 45 53 20 69 73 20 73 65 74 20 74 6f 20 32 20 61  ES is set to 2 a
95f0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20  t compile-time, 
9600: 74 68 65 6e 20 61 6c 77 61 79 73 0a 2a 2a 20 64  then always.** d
9610: 6f 20 74 68 65 20 73 75 66 66 69 78 20 73 68 6f  o the suffix sho
9620: 72 74 65 6e 69 6e 67 20 72 65 67 61 72 64 6c 65  rtening regardle
9630: 73 73 20 6f 66 20 55 52 49 20 70 61 72 61 6d 65  ss of URI parame
9640: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  ter..**.** Examp
9650: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 74  les:.**.**     t
9660: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 20  est.db-journal  
9670: 20 20 3d 3e 20 20 20 74 65 73 74 2e 6e 61 6c 0a    =>   test.nal.
9680: 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d 77  **     test.db-w
9690: 61 6c 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74  al        =>   t
96a0: 65 73 74 2e 77 61 6c 0a 2a 2a 20 20 20 20 20 74  est.wal.**     t
96b0: 65 73 74 2e 64 62 2d 73 68 6d 20 20 20 20 20 20  est.db-shm      
96c0: 20 20 3d 3e 20 20 20 74 65 73 74 2e 73 68 6d 0a    =>   test.shm.
96d0: 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d 6d  **     test.db-m
96e0: 6a 37 66 33 33 31 39 66 61 20 3d 3e 20 20 20 74  j7f3319fa =>   t
96f0: 65 73 74 2e 39 66 61 0a 2a 2f 0a 76 6f 69 64 20  est.9fa.*/.void 
9700: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
9710: 78 33 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x3(const char *z
9720: 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20 63 68  BaseFilename, ch
9730: 61 72 20 2a 7a 29 7b 0a 23 69 66 20 53 51 4c 49  ar *z){.#if SQLI
9740: 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
9750: 4d 45 53 3c 32 0a 20 20 69 66 28 20 73 71 6c 69  MES<2.  if( sqli
9760: 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
9770: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20 22  zBaseFilename, "
9780: 38 5f 33 5f 6e 61 6d 65 73 22 2c 20 30 29 20 29  8_3_names", 0) )
9790: 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
97a0: 69 6e 74 20 69 2c 20 73 7a 3b 0a 20 20 20 20 73  int i, sz;.    s
97b0: 7a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  z = sqlite3Strle
97c0: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 66 6f 72 28  n30(z);.    for(
97d0: 69 3d 73 7a 2d 31 3b 20 69 3e 30 20 26 26 20 7a  i=sz-1; i>0 && z
97e0: 5b 69 5d 21 3d 27 2f 27 20 26 26 20 7a 5b 69 5d  [i]!='/' && z[i]
97f0: 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='.'; i--){}.  
9800: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2e 27 20    if( z[i]=='.' 
9810: 26 26 20 41 4c 57 41 59 53 28 73 7a 3e 69 2b 34  && ALWAYS(sz>i+4
9820: 29 20 29 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69  ) ) memmove(&z[i
9830: 2b 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34  +1], &z[sz-3], 4
9840: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
9850: 0a 2f 2a 20 0a 2a 2a 20 46 69 6e 64 20 28 61 6e  ./* .** Find (an
9860: 20 61 70 70 72 6f 78 69 6d 61 74 65 29 20 73 75   approximate) su
9870: 6d 20 6f 66 20 74 77 6f 20 4c 6f 67 45 73 74 20  m of two LogEst 
9880: 76 61 6c 75 65 73 2e 20 20 54 68 69 73 20 63 6f  values.  This co
9890: 6d 70 75 74 61 74 69 6f 6e 20 69 73 0a 2a 2a 20  mputation is.** 
98a0: 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 22 2b 22  not a simple "+"
98b0: 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73   operator becaus
98c0: 65 20 4c 6f 67 45 73 74 20 69 73 20 73 74 6f 72  e LogEst is stor
98d0: 65 64 20 61 73 20 61 20 6c 6f 67 61 72 69 74 68  ed as a logarith
98e0: 6d 69 63 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  mic.** value..**
98f0: 20 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69   .*/.LogEst sqli
9900: 74 65 33 4c 6f 67 45 73 74 41 64 64 28 4c 6f 67  te3LogEstAdd(Log
9910: 45 73 74 20 61 2c 20 4c 6f 67 45 73 74 20 62 29  Est a, LogEst b)
9920: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
9930: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 78   unsigned char x
9940: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 31 30 2c 20  [] = {.     10, 
9950: 31 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  10,             
9960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
9970: 2c 31 20 2a 2f 0a 20 20 20 20 20 20 39 2c 20 39  ,1 */.      9, 9
9980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 2c             /* 2,
99a0: 33 20 2a 2f 0a 20 20 20 20 20 20 38 2c 20 38 2c  3 */.      8, 8,
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 2c 35            /* 4,5
99d0: 20 2a 2f 0a 20 20 20 20 20 20 37 2c 20 37 2c 20   */.      7, 7, 
99e0: 37 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7,              
99f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 36 2c 37 2c           /* 6,7,
9a00: 38 20 2a 2f 0a 20 20 20 20 20 20 36 2c 20 36 2c  8 */.      6, 6,
9a10: 20 36 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   6,             
9a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 39 2c 31            /* 9,1
9a30: 30 2c 31 31 20 2a 2f 0a 20 20 20 20 20 20 35 2c  0,11 */.      5,
9a40: 20 35 2c 20 35 2c 20 20 20 20 20 20 20 20 20 20   5, 5,          
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a60: 31 32 2d 31 34 20 2a 2f 0a 20 20 20 20 20 20 34  12-14 */.      4
9a70: 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20 20 20 20  , 4, 4, 4,      
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a90: 20 31 35 2d 31 38 20 2a 2f 0a 20 20 20 20 20 20   15-18 */.      
9aa0: 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33  3, 3, 3, 3, 3, 3
9ab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9ac0: 2a 20 31 39 2d 32 34 20 2a 2f 0a 20 20 20 20 20  * 19-24 */.     
9ad0: 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20   2, 2, 2, 2, 2, 
9ae0: 32 2c 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  2, 2,           
9af0: 2f 2a 20 32 35 2d 33 31 20 2a 2f 0a 20 20 7d 3b  /* 25-31 */.  };
9b00: 0a 20 20 69 66 28 20 61 3e 3d 62 20 29 7b 0a 20  .  if( a>=b ){. 
9b10: 20 20 20 69 66 28 20 61 3e 62 2b 34 39 20 29 20     if( a>b+49 ) 
9b20: 72 65 74 75 72 6e 20 61 3b 0a 20 20 20 20 69 66  return a;.    if
9b30: 28 20 61 3e 62 2b 33 31 20 29 20 72 65 74 75 72  ( a>b+31 ) retur
9b40: 6e 20 61 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  n a+1;.    retur
9b50: 6e 20 61 2b 78 5b 61 2d 62 5d 3b 0a 20 20 7d 65  n a+x[a-b];.  }e
9b60: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 3e 61  lse{.    if( b>a
9b70: 2b 34 39 20 29 20 72 65 74 75 72 6e 20 62 3b 0a  +49 ) return b;.
9b80: 20 20 20 20 69 66 28 20 62 3e 61 2b 33 31 20 29      if( b>a+31 )
9b90: 20 72 65 74 75 72 6e 20 62 2b 31 3b 0a 20 20 20   return b+1;.   
9ba0: 20 72 65 74 75 72 6e 20 62 2b 78 5b 62 2d 61 5d   return b+x[b-a]
9bb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
9bc0: 6f 6e 76 65 72 74 20 61 6e 20 69 6e 74 65 67 65  onvert an intege
9bd0: 72 20 69 6e 74 6f 20 61 20 4c 6f 67 45 73 74 2e  r into a LogEst.
9be0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
9bf0: 2c 20 63 6f 6d 70 75 74 65 20 61 6e 0a 2a 2a 20  , compute an.** 
9c00: 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 66 6f  approximation fo
9c10: 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f  r 10*log2(x)..*/
9c20: 0a 4c 6f 67 45 73 74 20 73 71 6c 69 74 65 33 4c  .LogEst sqlite3L
9c30: 6f 67 45 73 74 28 75 36 34 20 78 29 7b 0a 20 20  ogEst(u64 x){.  
9c40: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 61 5b  static LogEst a[
9c50: 5d 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35  ] = { 0, 2, 3, 5
9c60: 2c 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a  , 6, 7, 8, 9 };.
9c70: 20 20 4c 6f 67 45 73 74 20 79 20 3d 20 34 30 3b    LogEst y = 40;
9c80: 0a 20 20 69 66 28 20 78 3c 38 20 29 7b 0a 20 20  .  if( x<8 ){.  
9c90: 20 20 69 66 28 20 78 3c 32 20 29 20 72 65 74 75    if( x<2 ) retu
9ca0: 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28  rn 0;.    while(
9cb0: 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d 20 31 30   x<8 ){  y -= 10
9cc0: 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a 20 20 7d  ; x <<= 1; }.  }
9cd0: 65 6c 73 65 7b 0a 23 69 66 20 47 43 43 5f 56 45  else{.#if GCC_VE
9ce0: 52 53 49 4f 4e 3e 3d 35 30 30 34 30 30 30 0a 20  RSION>=5004000. 
9cf0: 20 20 20 69 6e 74 20 69 20 3d 20 36 30 20 2d 20     int i = 60 - 
9d00: 5f 5f 62 75 69 6c 74 69 6e 5f 63 6c 7a 6c 6c 28  __builtin_clzll(
9d10: 78 29 3b 0a 20 20 20 20 79 20 2b 3d 20 69 2a 31  x);.    y += i*1
9d20: 30 3b 0a 20 20 20 20 78 20 3e 3e 3d 20 69 3b 0a  0;.    x >>= i;.
9d30: 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
9d40: 20 78 3e 32 35 35 20 29 7b 20 79 20 2b 3d 20 34   x>255 ){ y += 4
9d50: 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d 20 20 2f  0; x >>= 4; }  /
9d60: 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
9d70: 2d 54 52 55 45 2a 2f 0a 20 20 20 20 77 68 69 6c  -TRUE*/.    whil
9d80: 65 28 20 78 3e 31 35 20 29 7b 20 20 79 20 2b 3d  e( x>15 ){  y +=
9d90: 20 31 30 3b 20 78 20 3e 3e 3d 20 31 3b 20 7d 0a   10; x >>= 1; }.
9da0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
9db0: 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79 20 2d  urn a[x&7] + y -
9dc0: 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   10;.}..#ifndef 
9dd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9de0: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
9df0: 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c 65 20  onvert a double 
9e00: 69 6e 74 6f 20 61 20 4c 6f 67 45 73 74 0a 2a 2a  into a LogEst.**
9e10: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
9e20: 20 63 6f 6d 70 75 74 65 20 61 6e 20 61 70 70 72   compute an appr
9e30: 6f 78 69 6d 61 74 69 6f 6e 20 66 6f 72 20 31 30  oximation for 10
9e40: 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a 4c 6f 67  *log2(x)..*/.Log
9e50: 45 73 74 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  Est sqlite3LogEs
9e60: 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75 62  tFromDouble(doub
9e70: 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b 0a  le x){.  u64 a;.
9e80: 20 20 4c 6f 67 45 73 74 20 65 3b 0a 20 20 61 73    LogEst e;.  as
9e90: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
9ea0: 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 61 29 3d  =8 && sizeof(a)=
9eb0: 3d 38 20 29 3b 0a 20 20 69 66 28 20 78 3c 3d 31  =8 );.  if( x<=1
9ec0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
9ed0: 66 28 20 78 3c 3d 32 30 30 30 30 30 30 30 30 30  f( x<=2000000000
9ee0: 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65   ) return sqlite
9ef0: 33 4c 6f 67 45 73 74 28 28 75 36 34 29 78 29 3b  3LogEst((u64)x);
9f00: 0a 20 20 6d 65 6d 63 70 79 28 26 61 2c 20 26 78  .  memcpy(&a, &x
9f10: 2c 20 38 29 3b 0a 20 20 65 20 3d 20 28 61 3e 3e  , 8);.  e = (a>>
9f20: 35 32 29 20 2d 20 31 30 32 32 3b 0a 20 20 72 65  52) - 1022;.  re
9f30: 74 75 72 6e 20 65 2a 31 30 3b 0a 7d 0a 23 65 6e  turn e*10;.}.#en
9f40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9f50: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
9f60: 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
9f70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
9f80: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 20 7c  MT_SCANSTATUS) |
9f90: 7c 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28  | \.    defined(
9fa0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
9fb0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 29 20 7c 7c  AT3_OR_STAT4) ||
9fc0: 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53   \.    defined(S
9fd0: 51 4c 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45 53  QLITE_EXPLAIN_ES
9fe0: 54 49 4d 41 54 45 44 5f 52 4f 57 53 29 0a 2f 2a  TIMATED_ROWS)./*
9ff0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 4c 6f  .** Convert a Lo
a000: 67 45 73 74 20 69 6e 74 6f 20 61 6e 20 69 6e 74  gEst into an int
a010: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  eger..**.** Note
a020: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
a030: 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ne is only used 
a040: 77 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  when one or more
a050: 20 6f 66 20 76 61 72 69 6f 75 73 0a 2a 2a 20 6e   of various.** n
a060: 6f 6e 2d 73 74 61 6e 64 61 72 64 20 63 6f 6d 70  on-standard comp
a070: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
a080: 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a   is enabled..*/.
a090: 75 36 34 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  u64 sqlite3LogEs
a0a0: 74 54 6f 49 6e 74 28 4c 6f 67 45 73 74 20 78 29  tToInt(LogEst x)
a0b0: 7b 0a 20 20 75 36 34 20 6e 3b 0a 20 20 6e 20 3d  {.  u64 n;.  n =
a0c0: 20 78 25 31 30 3b 0a 20 20 78 20 2f 3d 20 31 30   x%10;.  x /= 10
a0d0: 3b 0a 20 20 69 66 28 20 6e 3e 3d 35 20 29 20 6e  ;.  if( n>=5 ) n
a0e0: 20 2d 3d 20 32 3b 0a 20 20 65 6c 73 65 20 69 66   -= 2;.  else if
a0f0: 28 20 6e 3e 3d 31 20 29 20 6e 20 2d 3d 20 31 3b  ( n>=1 ) n -= 1;
a100: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
a110: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
a120: 53 43 41 4e 53 54 41 54 55 53 29 20 7c 7c 20 5c  SCANSTATUS) || \
a130: 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c  .    defined(SQL
a140: 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49  ITE_EXPLAIN_ESTI
a150: 4d 41 54 45 44 5f 52 4f 57 53 29 0a 20 20 69 66  MATED_ROWS).  if
a160: 28 20 78 3e 36 30 20 29 20 72 65 74 75 72 6e 20  ( x>60 ) return 
a170: 28 75 36 34 29 4c 41 52 47 45 53 54 5f 49 4e 54  (u64)LARGEST_INT
a180: 36 34 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49  64;.#else.  /* I
a190: 66 20 6f 6e 6c 79 20 53 51 4c 49 54 45 5f 45 4e  f only SQLITE_EN
a1a0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
a1b0: 41 54 34 20 69 73 20 6f 6e 2c 20 74 68 65 6e 20  AT4 is on, then 
a1c0: 74 68 65 20 6c 61 72 67 65 73 74 20 69 6e 70 75  the largest inpu
a1d0: 74 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20  t.  ** possible 
a1e0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
a1f0: 69 73 20 33 31 30 2c 20 72 65 73 75 6c 74 69 6e  is 310, resultin
a200: 67 20 69 6e 20 61 20 6d 61 78 69 6d 75 6d 20 78  g in a maximum x
a210: 20 6f 66 20 33 31 20 2a 2f 0a 20 20 61 73 73 65   of 31 */.  asse
a220: 72 74 28 20 78 3c 3d 36 30 20 29 3b 0a 23 65 6e  rt( x<=60 );.#en
a230: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 78 3e 3d  dif.  return x>=
a240: 33 20 3f 20 28 6e 2b 38 29 3c 3c 28 78 2d 33 29  3 ? (n+8)<<(x-3)
a250: 20 3a 20 28 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b   : (n+8)>>(3-x);
a260: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  .}.#endif /* def
a270: 69 6e 65 64 20 53 43 41 4e 53 54 41 54 20 6f 72  ined SCANSTAT or
a280: 20 53 54 41 54 34 20 6f 72 20 45 53 54 49 4d 41   STAT4 or ESTIMA
a290: 54 45 44 5f 52 4f 57 53 20 2a 2f 0a 0a 2f 2a 0a  TED_ROWS */../*.
a2a0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 6e 61 6d  ** Add a new nam
a2b0: 65 2f 6e 75 6d 62 65 72 20 70 61 69 72 20 74 6f  e/number pair to
a2c0: 20 61 20 56 4c 69 73 74 2e 20 20 54 68 69 73 20   a VList.  This 
a2d0: 6d 69 67 68 74 20 72 65 71 75 69 72 65 20 74 68  might require th
a2e0: 61 74 20 74 68 65 0a 2a 2a 20 56 4c 69 73 74 20  at the.** VList 
a2f0: 6f 62 6a 65 63 74 20 62 65 20 72 65 61 6c 6c 6f  object be reallo
a300: 63 61 74 65 64 2c 20 73 6f 20 72 65 74 75 72 6e  cated, so return
a310: 20 74 68 65 20 6e 65 77 20 56 4c 69 73 74 2e 20   the new VList. 
a320: 20 49 66 20 61 6e 20 4f 4f 4d 0a 2a 2a 20 65 72   If an OOM.** er
a330: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
a340: 6f 72 69 67 69 6e 61 6c 20 56 4c 69 73 74 20 72  original VList r
a350: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 0a  eturned and the.
a360: 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
a370: 6c 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2e  led flag is set.
a380: 0a 2a 2a 0a 2a 2a 20 41 20 56 4c 69 73 74 20 69  .**.** A VList i
a390: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 6e  s really just an
a3a0: 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
a3b0: 72 73 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20  rs.  To destroy 
a3c0: 61 20 56 4c 69 73 74 2c 0a 2a 2a 20 73 69 6d 70  a VList,.** simp
a3d0: 6c 79 20 70 61 73 73 20 69 74 20 74 6f 20 73 71  ly pass it to sq
a3e0: 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a  lite3DbFree()..*
a3f0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 69  *.** The first i
a400: 6e 74 65 67 65 72 20 69 73 20 74 68 65 20 6e 75  nteger is the nu
a410: 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73  mber of integers
a420: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
a430: 68 65 20 77 68 6f 6c 65 0a 2a 2a 20 56 4c 69 73  he whole.** VLis
a440: 74 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69  t.  The second i
a450: 6e 74 65 67 65 72 20 69 73 20 74 68 65 20 6e 75  nteger is the nu
a460: 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73  mber of integers
a470: 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 2e 0a   actually used..
a480: 2a 2a 20 45 61 63 68 20 6e 61 6d 65 2f 6e 75 6d  ** Each name/num
a490: 62 65 72 20 70 61 69 72 20 69 73 20 65 6e 63 6f  ber pair is enco
a4a0: 64 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ded by subsequen
a4b0: 74 20 67 72 6f 75 70 73 20 6f 66 20 33 20 6f 72  t groups of 3 or
a4c0: 20 6d 6f 72 65 0a 2a 2a 20 69 6e 74 65 67 65 72   more.** integer
a4d0: 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 6e 61  s..**.** Each na
a4e0: 6d 65 2f 6e 75 6d 62 65 72 20 70 61 69 72 20 73  me/number pair s
a4f0: 74 61 72 74 73 20 77 69 74 68 20 74 77 6f 20 69  tarts with two i
a500: 6e 74 65 67 65 72 73 20 77 68 69 63 68 20 61 72  ntegers which ar
a510: 65 20 74 68 65 20 6e 75 6d 65 72 69 63 0a 2a 2a  e the numeric.**
a520: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 70   value for the p
a530: 61 69 72 20 61 6e 64 20 74 68 65 20 73 69 7a 65  air and the size
a540: 20 6f 66 20 74 68 65 20 6e 61 6d 65 2f 6e 75 6d   of the name/num
a550: 62 65 72 20 70 61 69 72 2c 20 72 65 73 70 65 63  ber pair, respec
a560: 74 69 76 65 6c 79 2e 0a 2a 2a 20 54 68 65 20 74  tively..** The t
a570: 65 78 74 20 6e 61 6d 65 20 6f 76 65 72 6c 61 79  ext name overlay
a580: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 66 6f  s one or more fo
a590: 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 67 65 72 73  llowing integers
a5a0: 2e 20 20 54 68 65 20 74 65 78 74 20 6e 61 6d 65  .  The text name
a5b0: 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 7a 65  .** is always ze
a5c0: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ro-terminated..*
a5d0: 2a 0a 2a 2a 20 43 6f 6e 63 65 70 74 75 61 6c 6c  *.** Conceptuall
a5e0: 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 74 72 75  y:.**.**    stru
a5f0: 63 74 20 56 4c 69 73 74 20 7b 0a 2a 2a 20 20 20  ct VList {.**   
a600: 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20     int nAlloc;  
a610: 20 2f 2f 20 4e 75 6d 62 65 72 20 6f 66 20 61 6c   // Number of al
a620: 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 0a 2a  located slots .*
a630: 2a 20 20 20 20 20 20 69 6e 74 20 6e 55 73 65 64  *      int nUsed
a640: 3b 20 20 20 20 2f 2f 20 4e 75 6d 62 65 72 20 6f  ;    // Number o
a650: 66 20 75 73 65 64 20 73 6c 6f 74 73 20 0a 2a 2a  f used slots .**
a660: 20 20 20 20 20 20 73 74 72 75 63 74 20 56 4c 69        struct VLi
a670: 73 74 45 6e 74 72 79 20 7b 0a 2a 2a 20 20 20 20  stEntry {.**    
a680: 20 20 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 20      int iValue; 
a690: 20 20 20 2f 2f 20 56 61 6c 75 65 20 66 6f 72 20     // Value for 
a6a0: 74 68 69 73 20 65 6e 74 72 79 0a 2a 2a 20 20 20  this entry.**   
a6b0: 20 20 20 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20       int nSlot; 
a6c0: 20 20 20 20 2f 2f 20 53 6c 6f 74 73 20 75 73 65      // Slots use
a6d0: 64 20 62 79 20 74 68 69 73 20 65 6e 74 72 79 0a  d by this entry.
a6e0: 2a 2a 20 20 20 20 20 20 20 20 2f 2f 20 2e 2e 2e  **        // ...
a6f0: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 67   variable name g
a700: 6f 65 73 20 68 65 72 65 0a 2a 2a 20 20 20 20 20  oes here.**     
a710: 20 7d 20 61 5b 30 5d 3b 0a 2a 2a 20 20 20 20 7d   } a[0];.**    }
a720: 0a 2a 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 63 6f  .**.** During co
a730: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 70  de generation, p
a740: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 76  ointers to the v
a750: 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 77 69  ariable names wi
a760: 74 68 69 6e 20 74 68 65 0a 2a 2a 20 56 4c 69 73  thin the.** VLis
a770: 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 57 68  t are taken.  Wh
a780: 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c  en that happens,
a790: 20 6e 41 6c 6c 6f 63 20 69 73 20 73 65 74 20 74   nAlloc is set t
a7a0: 6f 20 7a 65 72 6f 20 61 73 20 61 6e 20 0a 2a 2a  o zero as an .**
a7b0: 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 68 61 74   indication that
a7c0: 20 74 68 65 20 56 4c 69 73 74 20 6d 61 79 20 6e   the VList may n
a7d0: 65 76 65 72 20 61 67 61 69 6e 20 62 65 20 65 6e  ever again be en
a7e0: 6c 61 72 67 65 64 2c 20 73 69 6e 63 65 20 74 68  larged, since th
a7f0: 65 0a 2a 2a 20 61 63 63 6f 6d 70 61 6e 79 69 6e  e.** accompanyin
a800: 67 20 72 65 61 6c 6c 6f 63 28 29 20 77 6f 75 6c  g realloc() woul
a810: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  d invalidate the
a820: 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 56 4c   pointers..*/.VL
a830: 69 73 74 20 2a 73 71 6c 69 74 65 33 56 4c 69 73  ist *sqlite3VLis
a840: 74 41 64 64 28 0a 20 20 73 71 6c 69 74 65 33 20  tAdd(.  sqlite3 
a850: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
a860: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
a870: 6f 6e 6e 65 63 74 69 6f 6e 20 75 73 65 64 20 66  onnection used f
a880: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 20  or malloc() */. 
a890: 20 56 4c 69 73 74 20 2a 70 49 6e 2c 20 20 20 20   VList *pIn,    
a8a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
a8b0: 6e 70 75 74 20 56 4c 69 73 74 2e 20 20 4d 69 67  nput VList.  Mig
a8c0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
a8d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
a8e0: 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
a8f0: 66 20 73 79 6d 62 6f 6c 20 74 6f 20 61 64 64 20  f symbol to add 
a900: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20  */.  int nName, 
a910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
a920: 79 74 65 73 20 6f 66 20 74 65 78 74 20 69 6e 20  ytes of text in 
a930: 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
a940: 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Val             
a950: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 61 73    /* Value to as
a960: 73 6f 63 69 61 74 65 20 77 69 74 68 20 7a 4e 61  sociate with zNa
a970: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  me */.){.  int n
a980: 49 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Int;            
a990: 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73    /* number of s
a9a0: 69 7a 65 6f 66 28 69 6e 74 29 20 6f 62 6a 65 63  izeof(int) objec
a9b0: 74 73 20 6e 65 65 64 65 64 20 66 6f 72 20 7a 4e  ts needed for zN
a9c0: 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ame */.  char *z
a9d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a9e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 77 68  /* Pointer to wh
a9f0: 65 72 65 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62  ere zName will b
aa00: 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e  e stored */.  in
aa10: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
aa20: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
aa30: 20 70 49 6e 5b 5d 20 77 68 65 72 65 20 7a 4e 61   pIn[] where zNa
aa40: 6d 65 20 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a  me is stored */.
aa50: 0a 20 20 6e 49 6e 74 20 3d 20 6e 4e 61 6d 65 2f  .  nInt = nName/
aa60: 34 20 2b 20 33 3b 0a 20 20 61 73 73 65 72 74 28  4 + 3;.  assert(
aa70: 20 70 49 6e 3d 3d 30 20 7c 7c 20 70 49 6e 5b 30   pIn==0 || pIn[0
aa80: 5d 3e 3d 33 20 29 3b 20 20 2f 2a 20 56 65 72 69  ]>=3 );  /* Veri
aa90: 66 79 20 6f 6b 20 74 6f 20 61 64 64 20 6e 65 77  fy ok to add new
aaa0: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
aab0: 66 28 20 70 49 6e 3d 3d 30 20 7c 7c 20 70 49 6e  f( pIn==0 || pIn
aac0: 5b 31 5d 2b 6e 49 6e 74 20 3e 20 70 49 6e 5b 30  [1]+nInt > pIn[0
aad0: 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 45 6e 6c 61  ] ){.    /* Enla
aae0: 72 67 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  rge the allocati
aaf0: 6f 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  on */.    sqlite
ab00: 33 5f 69 6e 74 36 34 20 6e 41 6c 6c 6f 63 20 3d  3_int64 nAlloc =
ab10: 20 28 70 49 6e 20 3f 20 32 2a 28 73 71 6c 69 74   (pIn ? 2*(sqlit
ab20: 65 33 5f 69 6e 74 36 34 29 70 49 6e 5b 30 5d 20  e3_int64)pIn[0] 
ab30: 3a 20 31 30 29 20 2b 20 6e 49 6e 74 3b 0a 20 20  : 10) + nInt;.  
ab40: 20 20 56 4c 69 73 74 20 2a 70 4f 75 74 20 3d 20    VList *pOut = 
ab50: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
ab60: 28 64 62 2c 20 70 49 6e 2c 20 6e 41 6c 6c 6f 63  (db, pIn, nAlloc
ab70: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
ab80: 20 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29     if( pOut==0 )
ab90: 20 72 65 74 75 72 6e 20 70 49 6e 3b 0a 20 20 20   return pIn;.   
aba0: 20 69 66 28 20 70 49 6e 3d 3d 30 20 29 20 70 4f   if( pIn==0 ) pO
abb0: 75 74 5b 31 5d 20 3d 20 32 3b 0a 20 20 20 20 70  ut[1] = 2;.    p
abc0: 49 6e 20 3d 20 70 4f 75 74 3b 0a 20 20 20 20 70  In = pOut;.    p
abd0: 49 6e 5b 30 5d 20 3d 20 6e 41 6c 6c 6f 63 3b 0a  In[0] = nAlloc;.
abe0: 20 20 7d 0a 20 20 69 20 3d 20 70 49 6e 5b 31 5d    }.  i = pIn[1]
abf0: 3b 0a 20 20 70 49 6e 5b 69 5d 20 3d 20 69 56 61  ;.  pIn[i] = iVa
ac00: 6c 3b 0a 20 20 70 49 6e 5b 69 2b 31 5d 20 3d 20  l;.  pIn[i+1] = 
ac10: 6e 49 6e 74 3b 0a 20 20 7a 20 3d 20 28 63 68 61  nInt;.  z = (cha
ac20: 72 2a 29 26 70 49 6e 5b 69 2b 32 5d 3b 0a 20 20  r*)&pIn[i+2];.  
ac30: 70 49 6e 5b 31 5d 20 3d 20 69 2b 6e 49 6e 74 3b  pIn[1] = i+nInt;
ac40: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 5b 31  .  assert( pIn[1
ac50: 5d 3c 3d 70 49 6e 5b 30 5d 20 29 3b 0a 20 20 6d  ]<=pIn[0] );.  m
ac60: 65 6d 63 70 79 28 7a 2c 20 7a 4e 61 6d 65 2c 20  emcpy(z, zName, 
ac70: 6e 4e 61 6d 65 29 3b 0a 20 20 7a 5b 6e 4e 61 6d  nName);.  z[nNam
ac80: 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e] = 0;.  return
ac90: 20 70 49 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pIn;.}../*.** R
aca0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
acb0: 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  to the name of a
acc0: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
acd0: 20 67 69 76 65 6e 20 56 4c 69 73 74 20 74 68 61   given VList tha
ace0: 74 0a 2a 2a 20 68 61 73 20 74 68 65 20 76 61 6c  t.** has the val
acf0: 75 65 20 69 56 61 6c 2e 20 20 4f 72 20 72 65 74  ue iVal.  Or ret
ad00: 75 72 6e 20 61 20 4e 55 4c 4c 20 69 66 20 74 68  urn a NULL if th
ad10: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 76  ere is no such v
ad20: 61 72 69 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  ariable in.** th
ad30: 65 20 6c 69 73 74 0a 2a 2f 0a 63 6f 6e 73 74 20  e list.*/.const 
ad40: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 56 4c 69  char *sqlite3VLi
ad50: 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 56 4c 69 73  stNumToName(VLis
ad60: 74 20 2a 70 49 6e 2c 20 69 6e 74 20 69 56 61 6c  t *pIn, int iVal
ad70: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6d 78 3b 0a  ){.  int i, mx;.
ad80: 20 20 69 66 28 20 70 49 6e 3d 3d 30 20 29 20 72    if( pIn==0 ) r
ad90: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 78 20 3d 20  eturn 0;.  mx = 
ada0: 70 49 6e 5b 31 5d 3b 0a 20 20 69 20 3d 20 32 3b  pIn[1];.  i = 2;
adb0: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70  .  do{.    if( p
adc0: 49 6e 5b 69 5d 3d 3d 69 56 61 6c 20 29 20 72 65  In[i]==iVal ) re
add0: 74 75 72 6e 20 28 63 68 61 72 2a 29 26 70 49 6e  turn (char*)&pIn
ade0: 5b 69 2b 32 5d 3b 0a 20 20 20 20 69 20 2b 3d 20  [i+2];.    i += 
adf0: 70 49 6e 5b 69 2b 31 5d 3b 0a 20 20 7d 77 68 69  pIn[i+1];.  }whi
ae00: 6c 65 28 20 69 3c 6d 78 20 29 3b 0a 20 20 72 65  le( i<mx );.  re
ae10: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ae20: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
ae30: 65 72 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  er of the variab
ae40: 6c 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2c 20  le named zName, 
ae50: 69 66 20 69 74 20 69 73 20 69 6e 20 56 4c 69 73  if it is in VLis
ae60: 74 2e 0a 2a 2a 20 6f 72 20 72 65 74 75 72 6e 20  t..** or return 
ae70: 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  0 if there is no
ae80: 20 73 75 63 68 20 76 61 72 69 61 62 6c 65 2e 0a   such variable..
ae90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 4c  */.int sqlite3VL
aea0: 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 56 4c 69  istNameToNum(VLi
aeb0: 73 74 20 2a 70 49 6e 2c 20 63 6f 6e 73 74 20 63  st *pIn, const c
aec0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
aed0: 6e 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nName){.  int i,
aee0: 20 6d 78 3b 0a 20 20 69 66 28 20 70 49 6e 3d 3d   mx;.  if( pIn==
aef0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
af00: 6d 78 20 3d 20 70 49 6e 5b 31 5d 3b 0a 20 20 69  mx = pIn[1];.  i
af10: 20 3d 20 32 3b 0a 20 20 64 6f 7b 0a 20 20 20 20   = 2;.  do{.    
af20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
af30: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 70 49  (const char*)&pI
af40: 6e 5b 69 2b 32 5d 3b 0a 20 20 20 20 69 66 28 20  n[i+2];.    if( 
af50: 73 74 72 6e 63 6d 70 28 7a 2c 7a 4e 61 6d 65 2c  strncmp(z,zName,
af60: 6e 4e 61 6d 65 29 3d 3d 30 20 26 26 20 7a 5b 6e  nName)==0 && z[n
af70: 4e 61 6d 65 5d 3d 3d 30 20 29 20 72 65 74 75 72  Name]==0 ) retur
af80: 6e 20 70 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 20  n pIn[i];.    i 
af90: 2b 3d 20 70 49 6e 5b 69 2b 31 5d 3b 0a 20 20 7d  += pIn[i+1];.  }
afa0: 77 68 69 6c 65 28 20 69 3c 6d 78 20 29 3b 0a 20  while( i<mx );. 
afb0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a            return 0;.}.