/ Hex Artifact Content
Login

Artifact 4a167594e791abeed95e0a8db028822b5e8fe512:


0000: 2f 2a 0a 2a 2a 20 32 30 31 33 2d 31 30 2d 31 34  /*.** 2013-10-14
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 75 6e 63   implements func
01a0: 74 69 6f 6e 73 20 74 6f 69 6e 74 65 67 65 72 28  tions tointeger(
01b0: 58 29 20 61 6e 64 20 74 6f 72 65 61 6c 28 58 29  X) and toreal(X)
01c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
01d0: 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c  an integer, real
01e0: 2c 20 6f 72 20 73 74 72 69 6e 67 20 76 61 6c 75  , or string valu
01f0: 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a  e that can be.**
0200: 20 6c 6f 73 73 6c 65 73 73 6c 79 20 72 65 70 72   losslessly repr
0210: 65 73 65 6e 74 65 64 20 61 73 20 61 6e 20 69 6e  esented as an in
0220: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 6f 69 6e  teger, then toin
0230: 74 65 67 65 72 28 58 29 0a 2a 2a 20 72 65 74 75  teger(X).** retu
0240: 72 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f  rns the correspo
0250: 6e 64 69 6e 67 20 69 6e 74 65 67 65 72 20 76 61  nding integer va
0260: 6c 75 65 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20  lue..** If X is 
0270: 61 6e 20 38 2d 62 79 74 65 20 42 4c 4f 42 20 74  an 8-byte BLOB t
0280: 68 65 6e 20 74 68 61 74 20 62 6c 6f 62 20 69 73  hen that blob is
0290: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
02a0: 2a 2a 20 61 20 73 69 67 6e 65 64 20 74 77 6f 2d  ** a signed two-
02b0: 63 6f 6d 70 6c 69 6d 65 6e 74 20 6c 69 74 74 6c  compliment littl
02c0: 65 2d 65 6e 64 69 61 6e 20 65 6e 63 6f 64 69 6e  e-endian encodin
02d0: 67 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 0a  g of an integer.
02e0: 2a 2a 20 61 6e 64 20 74 6f 69 6e 74 65 67 65 72  ** and tointeger
02f0: 28 58 29 20 72 65 74 75 72 6e 73 20 74 68 65 20  (X) returns the 
0300: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
0310: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20  teger value..** 
0320: 4f 74 68 65 72 77 69 73 65 20 74 6f 69 6e 74 65  Otherwise tointe
0330: 67 65 72 28 58 29 20 72 65 74 75 72 6e 20 4e 55  ger(X) return NU
0340: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69  LL..**.** If X i
0350: 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65  s an integer, re
0360: 61 6c 2c 20 6f 72 20 73 74 72 69 6e 67 20 76 61  al, or string va
0370: 6c 75 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a  lue that can be.
0380: 2a 2a 20 63 6f 6e 76 65 72 74 20 69 6e 74 6f 20  ** convert into 
0390: 61 20 72 65 61 6c 20 6e 75 6d 62 65 72 2c 20 70  a real number, p
03a0: 72 65 73 65 72 76 69 6e 67 20 61 74 20 6c 65 61  reserving at lea
03b0: 73 74 20 31 35 20 64 69 67 69 74 73 0a 2a 2a 20  st 15 digits.** 
03c0: 6f 66 20 70 72 65 63 69 73 69 6f 6e 2c 20 74 68  of precision, th
03d0: 65 6e 20 74 6f 72 65 61 6c 28 58 29 20 72 65 74  en toreal(X) ret
03e0: 75 72 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70  urns the corresp
03f0: 6f 6e 64 69 6e 67 20 72 65 61 6c 20 76 61 6c 75  onding real valu
0400: 65 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 6e  e..** If X is an
0410: 20 38 2d 62 79 74 65 20 42 4c 4f 42 20 74 68 65   8-byte BLOB the
0420: 6e 20 74 68 61 74 20 62 6c 6f 62 20 69 73 20 69  n that blob is i
0430: 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
0440: 20 61 20 36 34 2d 62 69 74 20 49 45 45 45 37 35   a 64-bit IEEE75
0450: 34 20 62 69 67 2d 65 6e 64 69 61 6e 20 66 6c 6f  4 big-endian flo
0460: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
0470: 65 0a 2a 2a 20 61 6e 64 20 74 6f 72 65 61 6c 28  e.** and toreal(
0480: 58 29 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  X) returns the c
0490: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 65 61  orresponding rea
04a0: 6c 20 76 61 6c 75 65 2e 0a 2a 2a 20 4f 74 68 65  l value..** Othe
04b0: 72 77 69 73 65 20 74 6f 72 65 61 6c 28 58 29 20  rwise toreal(X) 
04c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
04d0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 6f 69  ** Note that toi
04e0: 6e 74 65 67 65 72 28 58 29 20 6f 66 20 61 6e 20  nteger(X) of an 
04f0: 38 2d 62 79 74 65 20 42 4c 4f 42 20 61 73 73 75  8-byte BLOB assu
0500: 6d 65 73 20 61 20 6c 69 74 74 6c 65 2d 65 6e 64  mes a little-end
0510: 69 61 6e 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ian.** encoding 
0520: 77 68 65 72 65 61 73 20 74 6f 72 65 61 6c 28 58  whereas toreal(X
0530: 29 20 6f 66 20 61 6e 20 38 2d 62 79 74 65 20 42  ) of an 8-byte B
0540: 4c 4f 42 20 61 73 73 75 6d 65 73 20 61 20 62 69  LOB assumes a bi
0550: 67 2d 65 6e 64 69 61 6e 0a 2a 2a 20 65 6e 63 6f  g-endian.** enco
0560: 64 69 6e 67 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ding..*/.#includ
0570: 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22  e "sqlite3ext.h"
0580: 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f  .SQLITE_EXTENSIO
0590: 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75 64 65  N_INIT1.#include
05a0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
05b0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
05c0: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
05d0: 20 69 66 20 74 68 69 73 20 69 73 20 72 75 6e 6e   if this is runn
05e0: 69 6e 67 20 6f 6e 20 61 20 62 69 67 2d 65 6e 64  ing on a big-end
05f0: 69 61 6e 20 6f 72 20 6c 69 74 74 6c 65 2d 65 6e  ian or little-en
0600: 64 69 61 6e 0a 2a 2a 20 70 72 6f 63 65 73 73 6f  dian.** processo
0610: 72 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  r.*/.#if defined
0620: 28 69 33 38 36 29 20 7c 7c 20 64 65 66 69 6e 65  (i386) || define
0630: 64 28 5f 5f 69 33 38 36 5f 5f 29 20 7c 7c 20 64  d(__i386__) || d
0640: 65 66 69 6e 65 64 28 5f 4d 5f 49 58 38 36 29 5c  efined(_M_IX86)\
0650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
0670: 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36 5f 36   defined(__x86_6
0680: 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  4) || defined(__
0690: 78 38 36 5f 36 34 5f 5f 29 0a 23 20 64 65 66 69  x86_64__).# defi
06a0: 6e 65 20 54 4f 54 59 50 45 5f 42 49 47 45 4e 44  ne TOTYPE_BIGEND
06b0: 49 41 4e 20 20 20 20 30 0a 23 20 64 65 66 69 6e  IAN    0.# defin
06c0: 65 20 54 4f 54 59 50 45 5f 4c 49 54 54 4c 45 45  e TOTYPE_LITTLEE
06d0: 4e 44 49 41 4e 20 31 0a 23 65 6c 73 65 0a 20 20  NDIAN 1.#else.  
06e0: 63 6f 6e 73 74 20 69 6e 74 20 74 6f 74 79 70 65  const int totype
06f0: 5f 6f 6e 65 20 3d 20 31 3b 0a 23 20 64 65 66 69  _one = 1;.# defi
0700: 6e 65 20 54 4f 54 59 50 45 5f 42 49 47 45 4e 44  ne TOTYPE_BIGEND
0710: 49 41 4e 20 20 20 20 28 2a 28 63 68 61 72 20 2a  IAN    (*(char *
0720: 29 28 26 74 6f 74 79 70 65 5f 6f 6e 65 29 3d 3d  )(&totype_one)==
0730: 30 29 0a 23 20 64 65 66 69 6e 65 20 54 4f 54 59  0).# define TOTY
0740: 50 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 20  PE_LITTLEENDIAN 
0750: 28 2a 28 63 68 61 72 20 2a 29 28 26 74 6f 74 79  (*(char *)(&toty
0760: 70 65 5f 6f 6e 65 29 3d 3d 31 29 0a 23 65 6e 64  pe_one)==1).#end
0770: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  if../*.** Consta
0780: 6e 74 73 20 66 6f 72 20 74 68 65 20 6c 61 72 67  nts for the larg
0790: 65 73 74 20 61 6e 64 20 73 6d 61 6c 6c 65 73 74  est and smallest
07a0: 20 70 6f 73 73 69 62 6c 65 20 36 34 2d 62 69 74   possible 64-bit
07b0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73   signed integers
07c0: 2e 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f  ..** These macro
07d0: 73 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74  s are designed t
07e0: 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  o work correctly
07f0: 20 6f 6e 20 62 6f 74 68 20 33 32 2d 62 69 74 20   on both 32-bit 
0800: 61 6e 64 20 36 34 2d 62 69 74 0a 2a 2a 20 63 6f  and 64-bit.** co
0810: 6d 70 69 6c 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e  mpilers..*/.#ifn
0820: 64 65 66 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  def LARGEST_INT6
0830: 34 0a 23 20 64 65 66 69 6e 65 20 4c 41 52 47 45  4.# define LARGE
0840: 53 54 5f 49 4e 54 36 34 20 20 20 28 30 78 66 66  ST_INT64   (0xff
0850: 66 66 66 66 66 66 7c 28 28 28 73 71 6c 69 74 65  ffffff|(((sqlite
0860: 33 5f 69 6e 74 36 34 29 30 78 37 66 66 66 66 66  3_int64)0x7fffff
0870: 66 66 29 3c 3c 33 32 29 29 0a 23 65 6e 64 69 66  ff)<<32)).#endif
0880: 0a 0a 23 69 66 6e 64 65 66 20 53 4d 41 4c 4c 45  ..#ifndef SMALLE
0890: 53 54 5f 49 4e 54 36 34 0a 23 20 64 65 66 69 6e  ST_INT64.# defin
08a0: 65 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  e SMALLEST_INT64
08b0: 20 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74    (((sqlite3_int
08c0: 36 34 29 2d 31 29 20 2d 20 4c 41 52 47 45 53 54  64)-1) - LARGEST
08d0: 5f 49 4e 54 36 34 29 0a 23 65 6e 64 69 66 0a 0a  _INT64).#endif..
08e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
08f0: 45 20 69 66 20 63 68 61 72 61 63 74 65 72 20 63  E if character c
0900: 20 69 73 20 61 20 77 68 69 74 65 73 70 61 63 65   is a whitespace
0910: 20 63 68 61 72 61 63 74 65 72 0a 2a 2f 0a 73 74   character.*/.st
0920: 61 74 69 63 20 69 6e 74 20 74 6f 74 79 70 65 49  atic int totypeI
0930: 73 73 70 61 63 65 28 75 6e 73 69 67 6e 65 64 20  sspace(unsigned 
0940: 63 68 61 72 20 63 29 7b 0a 20 20 72 65 74 75 72  char c){.  retur
0950: 6e 20 63 3d 3d 27 20 27 20 7c 7c 20 63 3d 3d 27  n c==' ' || c=='
0960: 5c 74 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c  \t' || c=='\n' |
0970: 7c 20 63 3d 3d 27 5c 76 27 20 7c 7c 20 63 3d 3d  | c=='\v' || c==
0980: 27 5c 66 27 20 7c 7c 20 63 3d 3d 27 5c 72 27 3b  '\f' || c=='\r';
0990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
09a0: 20 54 52 55 45 20 69 66 20 63 68 61 72 61 63 74   TRUE if charact
09b0: 65 72 20 63 20 69 73 20 61 20 64 69 67 69 74 0a  er c is a digit.
09c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6f  */.static int to
09d0: 74 79 70 65 49 73 64 69 67 69 74 28 75 6e 73 69  typeIsdigit(unsi
09e0: 67 6e 65 64 20 63 68 61 72 20 63 29 7b 0a 20 20  gned char c){.  
09f0: 72 65 74 75 72 6e 20 63 3e 3d 27 30 27 20 26 26  return c>='0' &&
0a00: 20 63 3c 3d 27 39 27 3b 0a 7d 0a 0a 2f 2a 0a 2a   c<='9';.}../*.*
0a10: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 31 39  * Compare the 19
0a20: 2d 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e  -character strin
0a30: 67 20 7a 4e 75 6d 20 61 67 61 69 6e 73 74 20 74  g zNum against t
0a40: 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
0a50: 74 61 74 69 6f 6e 0a 2a 2a 20 76 61 6c 75 65 20  tation.** value 
0a60: 32 5e 36 33 3a 20 20 39 32 32 33 33 37 32 30 33  2^63:  922337203
0a70: 36 38 35 34 37 37 35 38 30 38 2e 20 20 52 65 74  6854775808.  Ret
0a80: 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
0a90: 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 0a  ro, or positive.
0aa0: 2a 2a 20 69 66 20 7a 4e 75 6d 20 69 73 20 6c 65  ** if zNum is le
0ab0: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
0ac0: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
0ad0: 61 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a  an the string..*
0ae0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 7a 4e 75 6d  * Note that zNum
0af0: 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78   must contain ex
0b00: 61 63 74 6c 79 20 31 39 20 63 68 61 72 61 63 74  actly 19 charact
0b10: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b  ers..**.** Unlik
0b20: 65 20 6d 65 6d 63 6d 70 28 29 20 74 68 69 73 20  e memcmp() this 
0b30: 72 6f 75 74 69 6e 65 20 69 73 20 67 75 61 72 61  routine is guara
0b40: 6e 74 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20  nteed to return 
0b50: 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
0b60: 2a 20 69 6e 20 74 68 65 20 76 61 6c 75 65 73 20  * in the values 
0b70: 6f 66 20 74 68 65 20 6c 61 73 74 20 64 69 67 69  of the last digi
0b80: 74 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 64 69  t if the only di
0b90: 66 66 65 72 65 6e 63 65 20 69 73 20 69 6e 20 74  fference is in t
0ba0: 68 65 0a 2a 2a 20 6c 61 73 74 20 64 69 67 69 74  he.** last digit
0bb0: 2e 20 20 53 6f 2c 20 66 6f 72 20 65 78 61 6d 70  .  So, for examp
0bc0: 6c 65 2c 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 74  le,.**.**      t
0bd0: 6f 74 79 70 65 43 6f 6d 70 61 72 65 32 70 6f 77  otypeCompare2pow
0be0: 36 33 28 22 39 32 32 33 33 37 32 30 33 36 38 35  63("922337203685
0bf0: 34 37 37 35 38 30 30 22 29 0a 2a 2a 0a 2a 2a 20  4775800").**.** 
0c00: 77 69 6c 6c 20 72 65 74 75 72 6e 20 2d 38 2e 0a  will return -8..
0c10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6f  */.static int to
0c20: 74 79 70 65 43 6f 6d 70 61 72 65 32 70 6f 77 36  typeCompare2pow6
0c30: 33 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  3(const char *zN
0c40: 75 6d 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20 30  um){.  int c = 0
0c50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20  ;.  int i;.     
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c70: 2a 20 30 31 32 33 34 35 36 37 38 39 30 31 32 33  * 01234567890123
0c80: 34 35 36 37 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  4567 */.  const 
0c90: 63 68 61 72 20 2a 70 6f 77 36 33 20 3d 20 22 39  char *pow63 = "9
0ca0: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
0cb0: 30 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 63  0";.  for(i=0; c
0cc0: 3d 3d 30 20 26 26 20 69 3c 31 38 3b 20 69 2b 2b  ==0 && i<18; i++
0cd0: 29 7b 0a 20 20 20 20 63 20 3d 20 28 7a 4e 75 6d  ){.    c = (zNum
0ce0: 5b 69 5d 2d 70 6f 77 36 33 5b 69 5d 29 2a 31 30  [i]-pow63[i])*10
0cf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 30  ;.  }.  if( c==0
0d00: 20 29 7b 0a 20 20 20 20 63 20 3d 20 7a 4e 75 6d   ){.    c = zNum
0d10: 5b 31 38 5d 20 2d 20 27 38 27 3b 0a 20 20 7d 0a  [18] - '8';.  }.
0d20: 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
0d30: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 7a 4e 75  *.** Convert zNu
0d40: 6d 20 74 6f 20 61 20 36 34 2d 62 69 74 20 73 69  m to a 64-bit si
0d50: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
0d60: 0a 2a 2a 20 49 66 20 74 68 65 20 7a 4e 75 6d 20  .** If the zNum 
0d70: 76 61 6c 75 65 20 69 73 20 72 65 70 72 65 73 65  value is represe
0d80: 6e 74 61 62 6c 65 20 61 73 20 61 20 36 34 2d 62  ntable as a 64-b
0d90: 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  it twos-compleme
0da0: 6e 74 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74  nt.** integer, t
0db0: 68 65 6e 20 77 72 69 74 65 20 74 68 61 74 20 76  hen write that v
0dc0: 61 6c 75 65 20 69 6e 74 6f 20 2a 70 4e 75 6d 20  alue into *pNum 
0dd0: 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  and return 0..**
0de0: 0a 2a 2a 20 49 66 20 7a 4e 75 6d 20 69 73 20 65  .** If zNum is e
0df0: 78 61 63 74 6c 79 20 39 32 32 33 33 37 32 30 33  xactly 922337203
0e00: 36 38 35 34 36 36 35 38 30 38 2c 20 72 65 74 75  6854665808, retu
0e10: 72 6e 20 32 2e 20 20 54 68 69 73 20 73 70 65 63  rn 2.  This spec
0e20: 69 61 6c 0a 2a 2a 20 63 61 73 65 20 69 73 20 62  ial.** case is b
0e30: 72 6f 6b 65 6e 20 6f 75 74 20 62 65 63 61 75 73  roken out becaus
0e40: 65 20 77 68 69 6c 65 20 39 32 32 33 33 37 32 30  e while 92233720
0e50: 33 36 38 35 34 36 36 35 38 30 38 20 63 61 6e 6e  36854665808 cann
0e60: 6f 74 20 62 65 20 61 0a 2a 2a 20 73 69 67 6e 65  ot be a.** signe
0e70: 64 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  d 64-bit integer
0e80: 2c 20 69 74 73 20 6e 65 67 61 74 69 76 65 20 2d  , its negative -
0e90: 39 32 32 33 33 37 32 30 33 36 38 35 34 36 36 35  9223372036854665
0ea0: 38 30 38 20 63 61 6e 20 62 65 2e 0a 2a 2a 0a 2a  808 can be..**.*
0eb0: 2a 20 49 66 20 7a 4e 75 6d 20 69 73 20 74 6f 6f  * If zNum is too
0ec0: 20 62 69 67 20 66 6f 72 20 61 20 36 34 2d 62 69   big for a 64-bi
0ed0: 74 20 69 6e 74 65 67 65 72 20 61 6e 64 20 69 73  t integer and is
0ee0: 20 6e 6f 74 0a 2a 2a 20 39 32 32 33 33 37 32 30   not.** 92233720
0ef0: 33 36 38 35 34 36 36 35 38 30 38 20 20 6f 72 20  36854665808  or 
0f00: 69 66 20 7a 4e 75 6d 20 63 6f 6e 74 61 69 6e 73  if zNum contains
0f10: 20 61 6e 79 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63   any non-numeric
0f20: 20 74 65 78 74 2c 0a 2a 2a 20 74 68 65 6e 20 72   text,.** then r
0f30: 65 74 75 72 6e 20 31 2e 0a 2a 2a 0a 2a 2a 20 54  eturn 1..**.** T
0f40: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74  he string is not
0f50: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 7a 65 72   necessarily zer
0f60: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f  o-terminated..*/
0f70: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6f 74 79  .static int toty
0f80: 70 65 41 74 6f 69 36 34 28 63 6f 6e 73 74 20 63  peAtoi64(const c
0f90: 68 61 72 20 2a 7a 4e 75 6d 2c 20 73 71 6c 69 74  har *zNum, sqlit
0fa0: 65 33 5f 69 6e 74 36 34 20 2a 70 4e 75 6d 2c 20  e3_int64 *pNum, 
0fb0: 69 6e 74 20 6c 65 6e 67 74 68 29 7b 0a 20 20 73  int length){.  s
0fc0: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 20  qlite3_uint64 u 
0fd0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 65 67 20 3d  = 0;.  int neg =
0fe0: 20 30 3b 20 2f 2a 20 61 73 73 75 6d 65 20 70 6f   0; /* assume po
0ff0: 73 69 74 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20  sitive */.  int 
1000: 69 3b 0a 20 20 69 6e 74 20 63 20 3d 20 30 3b 0a  i;.  int c = 0;.
1010: 20 20 69 6e 74 20 6e 6f 6e 4e 75 6d 20 3d 20 30    int nonNum = 0
1020: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1030: 7a 53 74 61 72 74 3b 0a 20 20 63 6f 6e 73 74 20  zStart;.  const 
1040: 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 7a 4e 75  char *zEnd = zNu
1050: 6d 20 2b 20 6c 65 6e 67 74 68 3b 0a 0a 20 20 77  m + length;..  w
1060: 68 69 6c 65 28 20 7a 4e 75 6d 3c 7a 45 6e 64 20  hile( zNum<zEnd 
1070: 26 26 20 74 6f 74 79 70 65 49 73 73 70 61 63 65  && totypeIsspace
1080: 28 2a 7a 4e 75 6d 29 20 29 20 7a 4e 75 6d 2b 2b  (*zNum) ) zNum++
1090: 3b 0a 20 20 69 66 28 20 7a 4e 75 6d 3c 7a 45 6e  ;.  if( zNum<zEn
10a0: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 4e  d ){.    if( *zN
10b0: 75 6d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  um=='-' ){.     
10c0: 20 6e 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20   neg = 1;.      
10d0: 7a 4e 75 6d 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  zNum++;.    }els
10e0: 65 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2b 27  e if( *zNum=='+'
10f0: 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6d 2b 2b   ){.      zNum++
1100: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53  ;.    }.  }.  zS
1110: 74 61 72 74 20 3d 20 7a 4e 75 6d 3b 0a 20 20 77  tart = zNum;.  w
1120: 68 69 6c 65 28 20 7a 4e 75 6d 3c 7a 45 6e 64 20  hile( zNum<zEnd 
1130: 26 26 20 7a 4e 75 6d 5b 30 5d 3d 3d 27 30 27 20  && zNum[0]=='0' 
1140: 29 7b 20 7a 4e 75 6d 2b 2b 3b 20 7d 20 2f 2a 20  ){ zNum++; } /* 
1150: 53 6b 69 70 20 6c 65 61 64 69 6e 67 20 7a 65 72  Skip leading zer
1160: 6f 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  os. */.  for(i=0
1170: 3b 20 26 7a 4e 75 6d 5b 69 5d 3c 7a 45 6e 64 20  ; &zNum[i]<zEnd 
1180: 26 26 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d  && (c=zNum[i])>=
1190: 27 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69  '0' && c<='9'; i
11a0: 2b 2b 29 7b 0a 20 20 20 20 75 20 3d 20 75 2a 31  ++){.    u = u*1
11b0: 30 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 7d  0 + c - '0';.  }
11c0: 0a 20 20 69 66 28 20 75 3e 4c 41 52 47 45 53 54  .  if( u>LARGEST
11d0: 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20 20 2a 70  _INT64 ){.    *p
11e0: 4e 75 6d 20 3d 20 53 4d 41 4c 4c 45 53 54 5f 49  Num = SMALLEST_I
11f0: 4e 54 36 34 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT64;.  }else if
1200: 28 20 6e 65 67 20 29 7b 0a 20 20 20 20 2a 70 4e  ( neg ){.    *pN
1210: 75 6d 20 3d 20 2d 28 73 71 6c 69 74 65 33 5f 69  um = -(sqlite3_i
1220: 6e 74 36 34 29 75 3b 0a 20 20 7d 65 6c 73 65 7b  nt64)u;.  }else{
1230: 0a 20 20 20 20 2a 70 4e 75 6d 20 3d 20 28 73 71  .    *pNum = (sq
1240: 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 3b 0a 20  lite3_int64)u;. 
1250: 20 7d 0a 20 20 69 66 28 20 28 63 21 3d 30 20 26   }.  if( (c!=0 &
1260: 26 20 26 7a 4e 75 6d 5b 69 5d 3c 7a 45 6e 64 29  & &zNum[i]<zEnd)
1270: 20 7c 7c 20 28 69 3d 3d 30 20 26 26 20 7a 53 74   || (i==0 && zSt
1280: 61 72 74 3d 3d 7a 4e 75 6d 29 20 7c 7c 20 69 3e  art==zNum) || i>
1290: 31 39 20 7c 7c 20 6e 6f 6e 4e 75 6d 20 29 7b 0a  19 || nonNum ){.
12a0: 20 20 20 20 2f 2a 20 7a 4e 75 6d 20 69 73 20 65      /* zNum is e
12b0: 6d 70 74 79 20 6f 72 20 63 6f 6e 74 61 69 6e 73  mpty or contains
12c0: 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63 20 74 65 78   non-numeric tex
12d0: 74 20 6f 72 20 69 73 20 6c 6f 6e 67 65 72 0a 20  t or is longer. 
12e0: 20 20 20 2a 2a 20 74 68 61 6e 20 31 39 20 64 69     ** than 19 di
12f0: 67 69 74 73 20 28 74 68 75 73 20 67 75 61 72 61  gits (thus guara
1300: 6e 74 65 65 69 6e 67 20 74 68 61 74 20 69 74 20  nteeing that it 
1310: 69 73 20 74 6f 6f 20 6c 61 72 67 65 29 20 2a 2f  is too large) */
1320: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
1330: 20 7d 65 6c 73 65 20 69 66 28 20 69 3c 31 39 20   }else if( i<19 
1340: 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 73 73 20 74  ){.    /* Less t
1350: 68 61 6e 20 31 39 20 64 69 67 69 74 73 2c 20 73  han 19 digits, s
1360: 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69  o we know that i
1370: 74 20 66 69 74 73 20 69 6e 20 36 34 20 62 69 74  t fits in 64 bit
1380: 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
1390: 20 75 3c 3d 4c 41 52 47 45 53 54 5f 49 4e 54 36   u<=LARGEST_INT6
13a0: 34 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  4 );.    return 
13b0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
13c0: 2f 2a 20 7a 4e 75 6d 20 69 73 20 61 20 31 39 2d  /* zNum is a 19-
13d0: 64 69 67 69 74 20 6e 75 6d 62 65 72 73 2e 20 20  digit numbers.  
13e0: 43 6f 6d 70 61 72 65 20 69 74 20 61 67 61 69 6e  Compare it again
13f0: 73 74 20 39 32 32 33 33 37 32 30 33 36 38 35 34  st 9223372036854
1400: 37 37 35 38 30 38 2e 20 2a 2f 0a 20 20 20 20 63  775808. */.    c
1410: 20 3d 20 74 6f 74 79 70 65 43 6f 6d 70 61 72 65   = totypeCompare
1420: 32 70 6f 77 36 33 28 7a 4e 75 6d 29 3b 0a 20 20  2pow63(zNum);.  
1430: 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
1440: 20 20 20 2f 2a 20 7a 4e 75 6d 20 69 73 20 6c 65     /* zNum is le
1450: 73 73 20 74 68 61 6e 20 39 32 32 33 33 37 32 30  ss than 92233720
1460: 33 36 38 35 34 37 37 35 38 30 38 20 73 6f 20 69  36854775808 so i
1470: 74 20 66 69 74 73 20 2a 2f 0a 20 20 20 20 20 20  t fits */.      
1480: 61 73 73 65 72 74 28 20 75 3c 3d 4c 41 52 47 45  assert( u<=LARGE
1490: 53 54 5f 49 4e 54 36 34 20 29 3b 0a 20 20 20 20  ST_INT64 );.    
14a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
14b0: 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
14c0: 0a 20 20 20 20 20 20 2f 2a 20 7a 4e 75 6d 20 69  .      /* zNum i
14d0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 39  s greater than 9
14e0: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
14f0: 30 38 20 73 6f 20 69 74 20 6f 76 65 72 66 6c 6f  08 so it overflo
1500: 77 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ws */.      retu
1510: 72 6e 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 1;.    }else{
1520: 0a 20 20 20 20 20 20 2f 2a 20 7a 4e 75 6d 20 69  .      /* zNum i
1530: 73 20 65 78 61 63 74 6c 79 20 39 32 32 33 33 37  s exactly 922337
1540: 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 20 20  2036854775808.  
1550: 46 69 74 73 20 69 66 20 6e 65 67 61 74 69 76 65  Fits if negative
1560: 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
1570: 73 70 65 63 69 61 6c 20 63 61 73 65 20 32 20 6f  special case 2 o
1580: 76 65 72 66 6c 6f 77 20 69 66 20 70 6f 73 69 74  verflow if posit
1590: 69 76 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ive */.      ass
15a0: 65 72 74 28 20 75 2d 31 3d 3d 4c 41 52 47 45 53  ert( u-1==LARGES
15b0: 54 5f 49 4e 54 36 34 20 29 3b 0a 20 20 20 20 20  T_INT64 );.     
15c0: 20 61 73 73 65 72 74 28 20 28 2a 70 4e 75 6d 29   assert( (*pNum)
15d0: 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
15e0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
15f0: 20 6e 65 67 20 3f 20 30 20 3a 20 32 3b 0a 20 20   neg ? 0 : 2;.  
1600: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1610: 20 54 68 65 20 73 74 72 69 6e 67 20 7a 5b 5d 20   The string z[] 
1620: 69 73 20 61 6e 20 74 65 78 74 20 72 65 70 72 65  is an text repre
1630: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 72  sentation of a r
1640: 65 61 6c 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 43  eal number..** C
1650: 6f 6e 76 65 72 74 20 74 68 69 73 20 73 74 72 69  onvert this stri
1660: 6e 67 20 74 6f 20 61 20 64 6f 75 62 6c 65 20 61  ng to a double a
1670: 6e 64 20 77 72 69 74 65 20 69 74 20 69 6e 74 6f  nd write it into
1680: 20 2a 70 52 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a   *pResult..**.**
1690: 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e   The string is n
16a0: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 7a  ot necessarily z
16b0: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a  ero-terminated..
16c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
16d0: 45 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  E if the result 
16e0: 69 73 20 61 20 76 61 6c 69 64 20 72 65 61 6c 20  is a valid real 
16f0: 6e 75 6d 62 65 72 20 28 6f 72 20 69 6e 74 65 67  number (or integ
1700: 65 72 29 20 61 6e 64 20 46 41 4c 53 45 0a 2a 2a  er) and FALSE.**
1710: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 69   if the string i
1720: 73 20 65 6d 70 74 79 20 6f 72 20 63 6f 6e 74 61  s empty or conta
1730: 69 6e 73 20 65 78 74 72 61 6e 65 6f 75 73 20 74  ins extraneous t
1740: 65 78 74 2e 20 20 56 61 6c 69 64 20 6e 75 6d 62  ext.  Valid numb
1750: 65 72 73 0a 2a 2a 20 61 72 65 20 69 6e 20 6f 6e  ers.** are in on
1760: 65 20 6f 66 20 74 68 65 73 65 20 66 6f 72 6d 61  e of these forma
1770: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 5b 2b 2d  ts:.**.**    [+-
1780: 5d 64 69 67 69 74 73 5b 45 5b 2b 2d 5d 64 69 67  ]digits[E[+-]dig
1790: 69 74 73 5d 0a 2a 2a 20 20 20 20 5b 2b 2d 5d 64  its].**    [+-]d
17a0: 69 67 69 74 73 2e 5b 64 69 67 69 74 73 5d 5b 45  igits.[digits][E
17b0: 5b 2b 2d 5d 64 69 67 69 74 73 5d 0a 2a 2a 20 20  [+-]digits].**  
17c0: 20 20 5b 2b 2d 5d 2e 64 69 67 69 74 73 5b 45 5b    [+-].digits[E[
17d0: 2b 2d 5d 64 69 67 69 74 73 5d 0a 2a 2a 0a 2a 2a  +-]digits].**.**
17e0: 20 4c 65 61 64 69 6e 67 20 61 6e 64 20 74 72 61   Leading and tra
17f0: 69 6c 69 6e 67 20 77 68 69 74 65 73 70 61 63 65  iling whitespace
1800: 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
1810: 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 64  the purpose of d
1820: 65 74 65 72 6d 69 6e 69 6e 67 0a 2a 2a 20 76 61  etermining.** va
1830: 6c 69 64 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  lidity..**.** If
1840: 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66 20   some prefix of 
1850: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
1860: 20 69 73 20 61 20 76 61 6c 69 64 20 6e 75 6d 62   is a valid numb
1870: 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  er, this routine
1880: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 46 41 4c 53  .** returns FALS
1890: 45 20 62 75 74 20 69 74 20 73 74 69 6c 6c 20 63  E but it still c
18a0: 6f 6e 76 65 72 74 73 20 74 68 65 20 70 72 65 66  onverts the pref
18b0: 69 78 20 61 6e 64 20 77 72 69 74 65 73 20 74 68  ix and writes th
18c0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 74 6f  e result.** into
18d0: 20 2a 70 52 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74   *pResult..*/.st
18e0: 61 74 69 63 20 69 6e 74 20 74 6f 74 79 70 65 41  atic int totypeA
18f0: 74 6f 46 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  toF(const char *
1900: 7a 2c 20 64 6f 75 62 6c 65 20 2a 70 52 65 73 75  z, double *pResu
1910: 6c 74 2c 20 69 6e 74 20 6c 65 6e 67 74 68 29 7b  lt, int length){
1920: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1930: 45 6e 64 20 3d 20 7a 20 2b 20 6c 65 6e 67 74 68  End = z + length
1940: 3b 0a 20 20 2f 2a 20 73 69 67 6e 20 2a 20 73 69  ;.  /* sign * si
1950: 67 6e 69 66 69 63 61 6e 64 20 2a 20 28 31 30 20  gnificand * (10 
1960: 5e 20 28 65 73 69 67 6e 20 2a 20 65 78 70 6f 6e  ^ (esign * expon
1970: 65 6e 74 29 29 20 2a 2f 0a 20 20 69 6e 74 20 73  ent)) */.  int s
1980: 69 67 6e 20 3d 20 31 3b 20 20 20 20 2f 2a 20 73  ign = 1;    /* s
1990: 69 67 6e 20 6f 66 20 73 69 67 6e 69 66 69 63 61  ign of significa
19a0: 6e 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nd */.  sqlite3_
19b0: 69 6e 74 36 34 20 73 20 3d 20 30 3b 20 20 20 20  int64 s = 0;    
19c0: 20 20 20 2f 2a 20 73 69 67 6e 69 66 69 63 61 6e     /* significan
19d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 20 3d 20 30  d */.  int d = 0
19e0: 3b 20 20 20 20 20 20 20 2f 2a 20 61 64 6a 75 73  ;       /* adjus
19f0: 74 20 65 78 70 6f 6e 65 6e 74 20 66 6f 72 20 73  t exponent for s
1a00: 68 69 66 74 69 6e 67 20 64 65 63 69 6d 61 6c 20  hifting decimal 
1a10: 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65  point */.  int e
1a20: 73 69 67 6e 20 3d 20 31 3b 20 20 20 2f 2a 20 73  sign = 1;   /* s
1a30: 69 67 6e 20 6f 66 20 65 78 70 6f 6e 65 6e 74 20  ign of exponent 
1a40: 2a 2f 0a 20 20 69 6e 74 20 65 20 3d 20 30 3b 20  */.  int e = 0; 
1a50: 20 20 20 20 20 20 2f 2a 20 65 78 70 6f 6e 65 6e        /* exponen
1a60: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 56 61 6c 69  t */.  int eVali
1a70: 64 20 3d 20 31 3b 20 20 2f 2a 20 54 72 75 65 20  d = 1;  /* True 
1a80: 65 78 70 6f 6e 65 6e 74 20 69 73 20 65 69 74 68  exponent is eith
1a90: 65 72 20 6e 6f 74 20 75 73 65 64 20 6f 72 20 69  er not used or i
1aa0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 2a 2f  s well-formed */
1ab0: 0a 20 20 64 6f 75 62 6c 65 20 72 65 73 75 6c 74  .  double result
1ac0: 3b 0a 20 20 69 6e 74 20 6e 44 69 67 69 74 73 20  ;.  int nDigits 
1ad0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 6e 4e 75  = 0;.  int nonNu
1ae0: 6d 20 3d 20 30 3b 0a 0a 20 20 2a 70 52 65 73 75  m = 0;..  *pResu
1af0: 6c 74 20 3d 20 30 2e 30 3b 20 20 20 2f 2a 20 44  lt = 0.0;   /* D
1b00: 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20 76 61  efault return va
1b10: 6c 75 65 2c 20 69 6e 20 63 61 73 65 20 6f 66 20  lue, in case of 
1b20: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 2f  an error */..  /
1b30: 2a 20 73 6b 69 70 20 6c 65 61 64 69 6e 67 20 73  * skip leading s
1b40: 70 61 63 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65  paces */.  while
1b50: 28 20 7a 3c 7a 45 6e 64 20 26 26 20 74 6f 74 79  ( z<zEnd && toty
1b60: 70 65 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  peIsspace(*z) ) 
1b70: 7a 2b 2b 3b 0a 20 20 69 66 28 20 7a 3e 3d 7a 45  z++;.  if( z>=zE
1b80: 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  nd ) return 0;..
1b90: 20 20 2f 2a 20 67 65 74 20 73 69 67 6e 20 6f 66    /* get sign of
1ba0: 20 73 69 67 6e 69 66 69 63 61 6e 64 20 2a 2f 0a   significand */.
1bb0: 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b    if( *z=='-' ){
1bc0: 0a 20 20 20 20 73 69 67 6e 20 3d 20 2d 31 3b 0a  .    sign = -1;.
1bd0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 65 6c 73 65      z++;.  }else
1be0: 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a   if( *z=='+' ){.
1bf0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      z++;.  }..  
1c00: 2f 2a 20 73 6b 69 70 20 6c 65 61 64 69 6e 67 20  /* skip leading 
1c10: 7a 65 72 6f 65 73 20 2a 2f 0a 20 20 77 68 69 6c  zeroes */.  whil
1c20: 65 28 20 7a 3c 7a 45 6e 64 20 26 26 20 7a 5b 30  e( z<zEnd && z[0
1c30: 5d 3d 3d 27 30 27 20 29 20 7a 2b 2b 2c 20 6e 44  ]=='0' ) z++, nD
1c40: 69 67 69 74 73 2b 2b 3b 0a 0a 20 20 2f 2a 20 63  igits++;..  /* c
1c50: 6f 70 79 20 6d 61 78 20 73 69 67 6e 69 66 69 63  opy max signific
1c60: 61 6e 74 20 64 69 67 69 74 73 20 74 6f 20 73 69  ant digits to si
1c70: 67 6e 69 66 69 63 61 6e 64 20 2a 2f 0a 20 20 77  gnificand */.  w
1c80: 68 69 6c 65 28 20 7a 3c 7a 45 6e 64 20 26 26 20  hile( z<zEnd && 
1c90: 74 6f 74 79 70 65 49 73 64 69 67 69 74 28 2a 7a  totypeIsdigit(*z
1ca0: 29 20 26 26 20 73 3c 28 28 4c 41 52 47 45 53 54  ) && s<((LARGEST
1cb0: 5f 49 4e 54 36 34 2d 39 29 2f 31 30 29 20 29 7b  _INT64-9)/10) ){
1cc0: 0a 20 20 20 20 73 20 3d 20 73 2a 31 30 20 2b 20  .    s = s*10 + 
1cd0: 28 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20 20 20  (*z - '0');.    
1ce0: 7a 2b 2b 2c 20 6e 44 69 67 69 74 73 2b 2b 3b 0a  z++, nDigits++;.
1cf0: 20 20 7d 0a 0a 20 20 2f 2a 20 73 6b 69 70 20 6e    }..  /* skip n
1d00: 6f 6e 2d 73 69 67 6e 69 66 69 63 61 6e 74 20 73  on-significant s
1d10: 69 67 6e 69 66 69 63 61 6e 64 20 64 69 67 69 74  ignificand digit
1d20: 73 0a 20 20 2a 2a 20 28 69 6e 63 72 65 61 73 65  s.  ** (increase
1d30: 20 65 78 70 6f 6e 65 6e 74 20 62 79 20 64 20 74   exponent by d t
1d40: 6f 20 73 68 69 66 74 20 64 65 63 69 6d 61 6c 20  o shift decimal 
1d50: 6c 65 66 74 29 20 2a 2f 0a 20 20 77 68 69 6c 65  left) */.  while
1d60: 28 20 7a 3c 7a 45 6e 64 20 26 26 20 74 6f 74 79  ( z<zEnd && toty
1d70: 70 65 49 73 64 69 67 69 74 28 2a 7a 29 20 29 20  peIsdigit(*z) ) 
1d80: 7a 2b 2b 2c 20 6e 44 69 67 69 74 73 2b 2b 2c 20  z++, nDigits++, 
1d90: 64 2b 2b 3b 0a 20 20 69 66 28 20 7a 3e 3d 7a 45  d++;.  if( z>=zE
1da0: 6e 64 20 29 20 67 6f 74 6f 20 74 6f 74 79 70 65  nd ) goto totype
1db0: 5f 61 74 6f 66 5f 63 61 6c 63 3b 0a 0a 20 20 2f  _atof_calc;..  /
1dc0: 2a 20 69 66 20 64 65 63 69 6d 61 6c 20 70 6f 69  * if decimal poi
1dd0: 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  nt is present */
1de0: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29  .  if( *z=='.' )
1df0: 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 2f  {.    z++;.    /
1e00: 2a 20 63 6f 70 79 20 64 69 67 69 74 73 20 66 72  * copy digits fr
1e10: 6f 6d 20 61 66 74 65 72 20 64 65 63 69 6d 61 6c  om after decimal
1e20: 20 74 6f 20 73 69 67 6e 69 66 69 63 61 6e 64 0a   to significand.
1e30: 20 20 20 20 2a 2a 20 28 64 65 63 72 65 61 73 65      ** (decrease
1e40: 20 65 78 70 6f 6e 65 6e 74 20 62 79 20 64 20 74   exponent by d t
1e50: 6f 20 73 68 69 66 74 20 64 65 63 69 6d 61 6c 20  o shift decimal 
1e60: 72 69 67 68 74 29 20 2a 2f 0a 20 20 20 20 77 68  right) */.    wh
1e70: 69 6c 65 28 20 7a 3c 7a 45 6e 64 20 26 26 20 74  ile( z<zEnd && t
1e80: 6f 74 79 70 65 49 73 64 69 67 69 74 28 2a 7a 29  otypeIsdigit(*z)
1e90: 20 26 26 20 73 3c 28 28 4c 41 52 47 45 53 54 5f   && s<((LARGEST_
1ea0: 49 4e 54 36 34 2d 39 29 2f 31 30 29 20 29 7b 0a  INT64-9)/10) ){.
1eb0: 20 20 20 20 20 20 73 20 3d 20 73 2a 31 30 20 2b        s = s*10 +
1ec0: 20 28 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20 20   (*z - '0');.   
1ed0: 20 20 20 7a 2b 2b 2c 20 6e 44 69 67 69 74 73 2b     z++, nDigits+
1ee0: 2b 2c 20 64 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  +, d--;.    }.  
1ef0: 20 20 2f 2a 20 73 6b 69 70 20 6e 6f 6e 2d 73 69    /* skip non-si
1f00: 67 6e 69 66 69 63 61 6e 74 20 64 69 67 69 74 73  gnificant digits
1f10: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   */.    while( z
1f20: 3c 7a 45 6e 64 20 26 26 20 74 6f 74 79 70 65 49  <zEnd && totypeI
1f30: 73 64 69 67 69 74 28 2a 7a 29 20 29 20 7a 2b 2b  sdigit(*z) ) z++
1f40: 2c 20 6e 44 69 67 69 74 73 2b 2b 3b 0a 20 20 7d  , nDigits++;.  }
1f50: 0a 20 20 69 66 28 20 7a 3e 3d 7a 45 6e 64 20 29  .  if( z>=zEnd )
1f60: 20 67 6f 74 6f 20 74 6f 74 79 70 65 5f 61 74 6f   goto totype_ato
1f70: 66 5f 63 61 6c 63 3b 0a 0a 20 20 2f 2a 20 69 66  f_calc;..  /* if
1f80: 20 65 78 70 6f 6e 65 6e 74 20 69 73 20 70 72 65   exponent is pre
1f90: 73 65 6e 74 20 2a 2f 0a 20 20 69 66 28 20 2a 7a  sent */.  if( *z
1fa0: 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27  =='e' || *z=='E'
1fb0: 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20   ){.    z++;.   
1fc0: 20 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20   eValid = 0;.   
1fd0: 20 69 66 28 20 7a 3e 3d 7a 45 6e 64 20 29 20 67   if( z>=zEnd ) g
1fe0: 6f 74 6f 20 74 6f 74 79 70 65 5f 61 74 6f 66 5f  oto totype_atof_
1ff0: 63 61 6c 63 3b 0a 20 20 20 20 2f 2a 20 67 65 74  calc;.    /* get
2000: 20 73 69 67 6e 20 6f 66 20 65 78 70 6f 6e 65 6e   sign of exponen
2010: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 2a 7a 3d  t */.    if( *z=
2020: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 65 73  ='-' ){.      es
2030: 69 67 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ign = -1;.      
2040: 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  z++;.    }else i
2050: 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a 20 20  f( *z=='+' ){.  
2060: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      z++;.    }. 
2070: 20 20 20 2f 2a 20 63 6f 70 79 20 64 69 67 69 74     /* copy digit
2080: 73 20 74 6f 20 65 78 70 6f 6e 65 6e 74 20 2a 2f  s to exponent */
2090: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 3c 7a 45  .    while( z<zE
20a0: 6e 64 20 26 26 20 74 6f 74 79 70 65 49 73 64 69  nd && totypeIsdi
20b0: 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 20  git(*z) ){.     
20c0: 20 65 20 3d 20 65 3c 31 30 30 30 30 20 3f 20 28   e = e<10000 ? (
20d0: 65 2a 31 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27  e*10 + (*z - '0'
20e0: 29 29 20 3a 20 31 30 30 30 30 3b 0a 20 20 20 20  )) : 10000;.    
20f0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 65 56 61    z++;.      eVa
2100: 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  lid = 1;.    }. 
2110: 20 7d 0a 0a 20 20 2f 2a 20 73 6b 69 70 20 74 72   }..  /* skip tr
2120: 61 69 6c 69 6e 67 20 73 70 61 63 65 73 20 2a 2f  ailing spaces */
2130: 0a 20 20 69 66 28 20 6e 44 69 67 69 74 73 20 26  .  if( nDigits &
2140: 26 20 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  & eValid ){.    
2150: 77 68 69 6c 65 28 20 7a 3c 7a 45 6e 64 20 26 26  while( z<zEnd &&
2160: 20 74 6f 74 79 70 65 49 73 73 70 61 63 65 28 2a   totypeIsspace(*
2170: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 0a 74  z) ) z++;.  }..t
2180: 6f 74 79 70 65 5f 61 74 6f 66 5f 63 61 6c 63 3a  otype_atof_calc:
2190: 0a 20 20 2f 2a 20 61 64 6a 75 73 74 20 65 78 70  .  /* adjust exp
21a0: 6f 6e 65 6e 74 20 62 79 20 64 2c 20 61 6e 64 20  onent by d, and 
21b0: 75 70 64 61 74 65 20 73 69 67 6e 20 2a 2f 0a 20  update sign */. 
21c0: 20 65 20 3d 20 28 65 2a 65 73 69 67 6e 29 20 2b   e = (e*esign) +
21d0: 20 64 3b 0a 20 20 69 66 28 20 65 3c 30 20 29 20   d;.  if( e<0 ) 
21e0: 7b 0a 20 20 20 20 65 73 69 67 6e 20 3d 20 2d 31  {.    esign = -1
21f0: 3b 0a 20 20 20 20 65 20 2a 3d 20 2d 31 3b 0a 20  ;.    e *= -1;. 
2200: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 65 73   } else {.    es
2210: 69 67 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ign = 1;.  }..  
2220: 2f 2a 20 69 66 20 30 20 73 69 67 6e 69 66 69 63  /* if 0 signific
2230: 61 6e 64 20 2a 2f 0a 20 20 69 66 28 20 21 73 20  and */.  if( !s 
2240: 29 20 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  ) {.    /* In th
2250: 65 20 49 45 45 45 20 37 35 34 20 73 74 61 6e 64  e IEEE 754 stand
2260: 61 72 64 2c 20 7a 65 72 6f 20 69 73 20 73 69 67  ard, zero is sig
2270: 6e 65 64 2e 0a 20 20 20 20 2a 2a 20 41 64 64 20  ned..    ** Add 
2280: 74 68 65 20 73 69 67 6e 20 69 66 20 77 65 27 76  the sign if we'v
2290: 65 20 73 65 65 6e 20 61 74 20 6c 65 61 73 74 20  e seen at least 
22a0: 6f 6e 65 20 64 69 67 69 74 20 2a 2f 0a 20 20 20  one digit */.   
22b0: 20 72 65 73 75 6c 74 20 3d 20 28 73 69 67 6e 3c   result = (sign<
22c0: 30 20 26 26 20 6e 44 69 67 69 74 73 29 20 3f 20  0 && nDigits) ? 
22d0: 2d 28 64 6f 75 62 6c 65 29 30 20 3a 20 28 64 6f  -(double)0 : (do
22e0: 75 62 6c 65 29 30 3b 0a 20 20 7d 20 65 6c 73 65  uble)0;.  } else
22f0: 20 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70   {.    /* attemp
2300: 74 20 74 6f 20 72 65 64 75 63 65 20 65 78 70 6f  t to reduce expo
2310: 6e 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  nent */.    if( 
2320: 65 73 69 67 6e 3e 30 20 29 7b 0a 20 20 20 20 20  esign>0 ){.     
2330: 20 77 68 69 6c 65 28 20 73 3c 28 4c 41 52 47 45   while( s<(LARGE
2340: 53 54 5f 49 4e 54 36 34 2f 31 30 29 20 26 26 20  ST_INT64/10) && 
2350: 65 3e 30 20 29 20 65 2d 2d 2c 73 2a 3d 31 30 3b  e>0 ) e--,s*=10;
2360: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2370: 20 20 77 68 69 6c 65 28 20 21 28 73 25 31 30 29    while( !(s%10)
2380: 20 26 26 20 65 3e 30 20 29 20 65 2d 2d 2c 73 2f   && e>0 ) e--,s/
2390: 3d 31 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  =10;.    }..    
23a0: 2f 2a 20 61 64 6a 75 73 74 20 74 68 65 20 73 69  /* adjust the si
23b0: 67 6e 20 6f 66 20 73 69 67 6e 69 66 69 63 61 6e  gn of significan
23c0: 64 20 2a 2f 0a 20 20 20 20 73 20 3d 20 73 69 67  d */.    s = sig
23d0: 6e 3c 30 20 3f 20 2d 73 20 3a 20 73 3b 0a 0a 20  n<0 ? -s : s;.. 
23e0: 20 20 20 2f 2a 20 69 66 20 65 78 70 6f 6e 65 6e     /* if exponen
23f0: 74 2c 20 73 63 61 6c 65 20 73 69 67 6e 69 66 69  t, scale signifi
2400: 63 61 6e 64 20 61 73 20 61 70 70 72 6f 70 72 69  cand as appropri
2410: 61 74 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73  ate.    ** and s
2420: 74 6f 72 65 20 69 6e 20 72 65 73 75 6c 74 2e 20  tore in result. 
2430: 2a 2f 0a 20 20 20 20 69 66 28 20 65 20 29 7b 0a  */.    if( e ){.
2440: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 73 63 61        double sca
2450: 6c 65 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20  le = 1.0;.      
2460: 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 68 61  /* attempt to ha
2470: 6e 64 6c 65 20 65 78 74 72 65 6d 65 6c 79 20 73  ndle extremely s
2480: 6d 61 6c 6c 2f 6c 61 72 67 65 20 6e 75 6d 62 65  mall/large numbe
2490: 72 73 20 62 65 74 74 65 72 20 2a 2f 0a 20 20 20  rs better */.   
24a0: 20 20 20 69 66 28 20 65 3e 33 30 37 20 26 26 20     if( e>307 && 
24b0: 65 3c 33 34 32 20 29 7b 0a 20 20 20 20 20 20 20  e<342 ){.       
24c0: 20 77 68 69 6c 65 28 20 65 25 33 30 38 20 29 20   while( e%308 ) 
24d0: 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b  { scale *= 1.0e+
24e0: 31 3b 20 65 20 2d 3d 20 31 3b 20 7d 0a 20 20 20  1; e -= 1; }.   
24f0: 20 20 20 20 20 69 66 28 20 65 73 69 67 6e 3c 30       if( esign<0
2500: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2510: 73 75 6c 74 20 3d 20 73 20 2f 20 73 63 61 6c 65  sult = s / scale
2520: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 75  ;.          resu
2530: 6c 74 20 2f 3d 20 31 2e 30 65 2b 33 30 38 3b 0a  lt /= 1.0e+308;.
2540: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2550: 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20           result 
2560: 3d 20 73 20 2a 20 73 63 61 6c 65 3b 0a 20 20 20  = s * scale;.   
2570: 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 2a 3d         result *=
2580: 20 31 2e 30 65 2b 33 30 38 3b 0a 20 20 20 20 20   1.0e+308;.     
2590: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
25a0: 20 69 66 28 20 65 3e 3d 33 34 32 20 29 7b 0a 20   if( e>=342 ){. 
25b0: 20 20 20 20 20 20 20 69 66 28 20 65 73 69 67 6e         if( esign
25c0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
25d0: 72 65 73 75 6c 74 20 3d 20 30 2e 30 2a 73 3b 0a  result = 0.0*s;.
25e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25f0: 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20           result 
2600: 3d 20 31 65 33 30 38 2a 31 65 33 30 38 2a 73 3b  = 1e308*1e308*s;
2610: 20 20 2f 2a 20 49 6e 66 69 6e 69 74 79 20 2a 2f    /* Infinity */
2620: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2640: 2f 2a 20 31 2e 30 65 2b 32 32 20 69 73 20 74 68  /* 1.0e+22 is th
2650: 65 20 6c 61 72 67 65 73 74 20 70 6f 77 65 72 20  e largest power 
2660: 6f 66 20 31 30 20 74 68 61 6e 20 63 61 6e 20 62  of 10 than can b
2670: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70  e.        ** rep
2680: 72 65 73 65 6e 74 65 64 20 65 78 61 63 74 6c 79  resented exactly
2690: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  . */.        whi
26a0: 6c 65 28 20 65 25 32 32 20 29 20 7b 20 73 63 61  le( e%22 ) { sca
26b0: 6c 65 20 2a 3d 20 31 2e 30 65 2b 31 3b 20 65 20  le *= 1.0e+1; e 
26c0: 2d 3d 20 31 3b 20 7d 0a 20 20 20 20 20 20 20 20  -= 1; }.        
26d0: 77 68 69 6c 65 28 20 65 3e 30 20 29 20 7b 20 73  while( e>0 ) { s
26e0: 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 32 32 3b  cale *= 1.0e+22;
26f0: 20 65 20 2d 3d 20 32 32 3b 20 7d 0a 20 20 20 20   e -= 22; }.    
2700: 20 20 20 20 69 66 28 20 65 73 69 67 6e 3c 30 20      if( esign<0 
2710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
2720: 75 6c 74 20 3d 20 73 20 2f 20 73 63 61 6c 65 3b  ult = s / scale;
2730: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2740: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
2750: 20 3d 20 73 20 2a 20 73 63 61 6c 65 3b 0a 20 20   = s * scale;.  
2760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2770: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2780: 20 20 20 72 65 73 75 6c 74 20 3d 20 28 64 6f 75     result = (dou
2790: 62 6c 65 29 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  ble)s;.    }.  }
27a0: 0a 0a 20 20 2f 2a 20 73 74 6f 72 65 20 74 68 65  ..  /* store the
27b0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 2a 70 52   result */.  *pR
27c0: 65 73 75 6c 74 20 3d 20 72 65 73 75 6c 74 3b 0a  esult = result;.
27d0: 0a 20 20 2f 2a 20 72 65 74 75 72 6e 20 74 72 75  .  /* return tru
27e0: 65 20 69 66 20 6e 75 6d 62 65 72 20 61 6e 64 20  e if number and 
27f0: 6e 6f 20 65 78 74 72 61 20 6e 6f 6e 2d 77 68 69  no extra non-whi
2800: 74 65 73 70 61 63 65 20 63 68 72 61 63 74 65 72  tespace chracter
2810: 73 20 61 66 74 65 72 20 2a 2f 0a 20 20 72 65 74  s after */.  ret
2820: 75 72 6e 20 7a 3e 3d 7a 45 6e 64 20 26 26 20 6e  urn z>=zEnd && n
2830: 44 69 67 69 74 73 3e 30 20 26 26 20 65 56 61 6c  Digits>0 && eVal
2840: 69 64 20 26 26 20 6e 6f 6e 4e 75 6d 3d 3d 30 3b  id && nonNum==0;
2850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 6f 69 6e 74 65  .}../*.** tointe
2860: 67 65 72 28 58 29 3a 20 20 49 66 20 58 20 69 73  ger(X):  If X is
2870: 20 61 6e 79 20 76 61 6c 75 65 20 28 69 6e 74 65   any value (inte
2880: 67 65 72 2c 20 64 6f 75 62 6c 65 2c 20 62 6c 6f  ger, double, blo
2890: 62 2c 20 6f 72 20 73 74 72 69 6e 67 29 20 74 68  b, or string) th
28a0: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6c 6f 73  at.** can be los
28b0: 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65  slessly converte
28c0: 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  d into an intege
28d0: 72 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65  r, then make the
28e0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 61 6e 64 0a   conversion and.
28f0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  ** return the re
2900: 73 75 6c 74 2e 20 20 4f 74 68 65 72 77 69 73 65  sult.  Otherwise
2910: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
2920: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f  /.static void to
2930: 69 6e 74 65 67 65 72 46 75 6e 63 28 0a 20 20 73  integerFunc(.  s
2940: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2950: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
2960: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
2970: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
2980: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
2990: 20 29 3b 0a 20 20 28 76 6f 69 64 29 61 72 67 63   );.  (void)argc
29a0: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
29b0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
29c0: 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63  rgv[0]) ){.    c
29d0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
29e0: 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  : {.      double
29f0: 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   rVal = sqlite3_
2a00: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
2a10: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  v[0]);.      sql
2a20: 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61 6c 20  ite3_int64 iVal 
2a30: 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
2a40: 29 72 56 61 6c 3b 0a 20 20 20 20 20 20 69 66 28  )rVal;.      if(
2a50: 20 72 56 61 6c 3d 3d 28 64 6f 75 62 6c 65 29 69   rVal==(double)i
2a60: 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Val ){.        s
2a70: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
2a80: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 69 56 61  t64(context, iVa
2a90: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
2aa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2ab0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
2ac0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
2ad0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2ae0: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71  nt64(context, sq
2af0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
2b00: 34 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 20  4(argv[0]));.   
2b10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2b20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2b30: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 63 6f  BLOB: {.      co
2b40: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2b50: 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74  r *zBlob = sqlit
2b60: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
2b70: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66  gv[0]);.      if
2b80: 28 20 7a 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  ( zBlob ){.     
2b90: 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73     int nBlob = s
2ba0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2bb0: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
2bc0: 20 20 20 20 20 69 66 28 20 6e 42 6c 6f 62 3d 3d       if( nBlob==
2bd0: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69  sizeof(sqlite3_i
2be0: 6e 74 36 34 29 20 29 7b 0a 20 20 20 20 20 20 20  nt64) ){.       
2bf0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2c00: 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20   iVal;.         
2c10: 20 69 66 28 20 54 4f 54 59 50 45 5f 42 49 47 45   if( TOTYPE_BIGE
2c20: 4e 44 49 41 4e 20 29 7b 0a 20 20 20 20 20 20 20  NDIAN ){.       
2c30: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2c40: 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
2c50: 20 63 68 61 72 20 7a 42 6c 6f 62 52 65 76 5b 73   char zBlobRev[s
2c60: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e  izeof(sqlite3_in
2c70: 74 36 34 29 5d 3b 0a 20 20 20 20 20 20 20 20 20  t64)];.         
2c80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
2c90: 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74  zeof(sqlite3_int
2ca0: 36 34 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  64); i++){.     
2cb0: 20 20 20 20 20 20 20 20 20 7a 42 6c 6f 62 52 65           zBlobRe
2cc0: 76 5b 69 5d 20 3d 20 7a 42 6c 6f 62 5b 73 69 7a  v[i] = zBlob[siz
2cd0: 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  eof(sqlite3_int6
2ce0: 34 29 2d 31 2d 69 5d 3b 0a 20 20 20 20 20 20 20  4)-1-i];.       
2cf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d00: 20 20 20 6d 65 6d 63 70 79 28 26 69 56 61 6c 2c     memcpy(&iVal,
2d10: 20 7a 42 6c 6f 62 52 65 76 2c 20 73 69 7a 65 6f   zBlobRev, sizeo
2d20: 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  f(sqlite3_int64)
2d30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2d40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2d50: 6d 65 6d 63 70 79 28 26 69 56 61 6c 2c 20 7a 42  memcpy(&iVal, zB
2d60: 6c 6f 62 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  lob, sizeof(sqli
2d70: 74 65 33 5f 69 6e 74 36 34 29 29 3b 0a 20 20 20  te3_int64));.   
2d80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d90: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2da0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
2db0: 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   iVal);.        
2dc0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2dd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2de0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
2df0: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
2e00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2e10: 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  zStr = sqlite3_v
2e20: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
2e30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53  ]);.      if( zS
2e40: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  tr ){.        in
2e50: 74 20 6e 53 74 72 20 3d 20 73 71 6c 69 74 65 33  t nStr = sqlite3
2e60: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
2e70: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  v[0]);.        i
2e80: 66 28 20 6e 53 74 72 20 26 26 20 21 74 6f 74 79  f( nStr && !toty
2e90: 70 65 49 73 73 70 61 63 65 28 7a 53 74 72 5b 30  peIsspace(zStr[0
2ea0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
2eb0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56  sqlite3_int64 iV
2ec0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  al;.          if
2ed0: 28 20 21 74 6f 74 79 70 65 41 74 6f 69 36 34 28  ( !totypeAtoi64(
2ee0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 74  (const char*)zSt
2ef0: 72 2c 20 26 69 56 61 6c 2c 20 6e 53 74 72 29 20  r, &iVal, nStr) 
2f00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2f10: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
2f20: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 69 56 61  t64(context, iVa
2f30: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  l);.          }.
2f40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f50: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
2f60: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
2f70: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
2f80: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2f90: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53  type(argv[0])==S
2fa0: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20  QLITE_NULL );.  
2fb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2fc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 6f  .  }.}../*.** to
2fd0: 72 65 61 6c 28 58 29 3a 20 49 66 20 58 20 69 73  real(X): If X is
2fe0: 20 61 6e 79 20 76 61 6c 75 65 20 28 69 6e 74 65   any value (inte
2ff0: 67 65 72 2c 20 64 6f 75 62 6c 65 2c 20 62 6c 6f  ger, double, blo
3000: 62 2c 20 6f 72 20 73 74 72 69 6e 67 29 20 74 68  b, or string) th
3010: 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 6c 6f 73  at can.** be los
3020: 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65  slessly converte
3030: 64 20 69 6e 74 6f 20 61 20 72 65 61 6c 20 6e 75  d into a real nu
3040: 6d 62 65 72 2c 20 74 68 65 6e 20 64 6f 20 73 6f  mber, then do so
3050: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
3060: 0a 2a 2a 20 72 65 61 6c 20 6e 75 6d 62 65 72 2e  .** real number.
3070: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
3080: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20  rn NULL..*/.#if 
3090: 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52  defined(_MSC_VER
30a0: 29 0a 23 70 72 61 67 6d 61 20 77 61 72 6e 69 6e  ).#pragma warnin
30b0: 67 28 64 69 73 61 62 6c 65 3a 20 34 37 34 38 29  g(disable: 4748)
30c0: 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a  .#pragma optimiz
30d0: 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69  e("", off).#endi
30e0: 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f  f.static void to
30f0: 72 65 61 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  realFunc(.  sqli
3100: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3110: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
3120: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
3130: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 61 73  e **argv.){.  as
3140: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
3150: 0a 20 20 28 76 6f 69 64 29 61 72 67 63 3b 0a 20  .  (void)argc;. 
3160: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
3170: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
3180: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65  [0]) ){.    case
3190: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
31a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
31b0: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
31c0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
31d0: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
31e0: 30 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  0]));.      brea
31f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3200: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
3210: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
3220: 33 5f 69 6e 74 36 34 20 69 56 61 6c 20 3d 20 73  3_int64 iVal = s
3230: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
3240: 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  64(argv[0]);.   
3250: 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 20 3d     double rVal =
3260: 20 28 64 6f 75 62 6c 65 29 69 56 61 6c 3b 0a 20   (double)iVal;. 
3270: 20 20 20 20 20 69 66 28 20 69 56 61 6c 3d 3d 28       if( iVal==(
3280: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 72 56  sqlite3_int64)rV
3290: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
32a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
32b0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 56 61  ble(context, rVa
32c0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
32d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
32e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
32f0: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  LOB: {.      con
3300: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
3310: 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *zBlob = sqlite
3320: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
3330: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[0]);.      if(
3340: 20 7a 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20   zBlob ){.      
3350: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
3360: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
3370: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
3380: 20 20 20 20 69 66 28 20 6e 42 6c 6f 62 3d 3d 73      if( nBlob==s
3390: 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29 20 29 7b  izeof(double) ){
33a0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
33b0: 65 20 72 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  e rVal;.        
33c0: 20 20 69 66 28 20 54 4f 54 59 50 45 5f 4c 49 54    if( TOTYPE_LIT
33d0: 54 4c 45 45 4e 44 49 41 4e 20 29 7b 0a 20 20 20  TLEENDIAN ){.   
33e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69              unsi
3400: 67 6e 65 64 20 63 68 61 72 20 7a 42 6c 6f 62 52  gned char zBlobR
3410: 65 76 5b 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65  ev[sizeof(double
3420: 29 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )];.            
3430: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
3440: 66 28 64 6f 75 62 6c 65 29 3b 20 69 2b 2b 29 7b  f(double); i++){
3450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
3460: 42 6c 6f 62 52 65 76 5b 69 5d 20 3d 20 7a 42 6c  BlobRev[i] = zBl
3470: 6f 62 5b 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65  ob[sizeof(double
3480: 29 2d 31 2d 69 5d 3b 0a 20 20 20 20 20 20 20 20  )-1-i];.        
3490: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34a0: 20 20 6d 65 6d 63 70 79 28 26 72 56 61 6c 2c 20    memcpy(&rVal, 
34b0: 7a 42 6c 6f 62 52 65 76 2c 20 73 69 7a 65 6f 66  zBlobRev, sizeof
34c0: 28 64 6f 75 62 6c 65 29 29 3b 0a 20 20 20 20 20  (double));.     
34d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34e0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
34f0: 72 56 61 6c 2c 20 7a 42 6c 6f 62 2c 20 73 69 7a  rVal, zBlob, siz
3500: 65 6f 66 28 64 6f 75 62 6c 65 29 29 3b 0a 20 20  eof(double));.  
3510: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3520: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3530: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
3540: 74 2c 20 72 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, rVal);.      
3550: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3570: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
3580: 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  EXT: {.      con
3590: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
35a0: 20 2a 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33   *zStr = sqlite3
35b0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
35c0: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [0]);.      if( 
35d0: 7a 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zStr ){.        
35e0: 69 6e 74 20 6e 53 74 72 20 3d 20 73 71 6c 69 74  int nStr = sqlit
35f0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
3600: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[0]);.       
3610: 20 69 66 28 20 6e 53 74 72 20 26 26 20 21 74 6f   if( nStr && !to
3620: 74 79 70 65 49 73 73 70 61 63 65 28 7a 53 74 72  typeIsspace(zStr
3630: 5b 30 5d 29 20 26 26 20 21 74 6f 74 79 70 65 49  [0]) && !totypeI
3640: 73 73 70 61 63 65 28 7a 53 74 72 5b 6e 53 74 72  sspace(zStr[nStr
3650: 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
3660: 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 20    double rVal;. 
3670: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 74           if( tot
3680: 79 70 65 41 74 6f 46 28 28 63 6f 6e 73 74 20 63  ypeAtoF((const c
3690: 68 61 72 2a 29 7a 53 74 72 2c 20 26 72 56 61 6c  har*)zStr, &rVal
36a0: 2c 20 6e 53 74 72 29 20 29 7b 0a 20 20 20 20 20  , nStr) ){.     
36b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
36c0: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
36d0: 74 65 78 74 2c 20 72 56 61 6c 29 3b 0a 20 20 20  text, rVal);.   
36e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
36f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3720: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
3730: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
3740: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
3750: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
3760: 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TE_NULL );.     
3770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3780: 7d 0a 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28  }.}.#if defined(
3790: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
37a0: 61 20 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f  a optimize("", o
37b0: 6e 29 0a 23 70 72 61 67 6d 61 20 77 61 72 6e 69  n).#pragma warni
37c0: 6e 67 28 64 65 66 61 75 6c 74 3a 20 34 37 34 38  ng(default: 4748
37d0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ).#endif..#ifdef
37e0: 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70   _WIN32.__declsp
37f0: 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65  ec(dllexport).#e
3800: 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33  ndif.int sqlite3
3810: 5f 74 6f 74 79 70 65 5f 69 6e 69 74 28 0a 20 20  _totype_init(.  
3820: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
3830: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a  har **pzErrMsg,.
3840: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
3850: 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41  api_routines *pA
3860: 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pi.){.  int rc =
3870: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 51   SQLITE_OK;.  SQ
3880: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
3890: 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20 28 76  NIT2(pApi);.  (v
38a0: 6f 69 64 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f  oid)pzErrMsg;  /
38b0: 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d 65 74  * Unused paramet
38c0: 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  er */.  rc = sql
38d0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
38e0: 74 69 6f 6e 28 64 62 2c 20 22 74 6f 69 6e 74 65  tion(db, "tointe
38f0: 67 65 72 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ger", 1, SQLITE_
3900: 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 20 20 20 20 74 6f 69 6e 74 65 67 65          tointege
3930: 72 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  rFunc, 0, 0);.  
3940: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3950: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
3960: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
3970: 63 74 69 6f 6e 28 64 62 2c 20 22 74 6f 72 65 61  ction(db, "torea
3980: 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  l", 1, SQLITE_UT
3990: 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 74 6f 72 65 61 6c 46 75          torealFu
39c0: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  nc, 0, 0);.  }. 
39d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.