System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact cf472240cc05d3bef351bf5e95a293caec323783:


0000: 2f 2a 0a 54 68 69 73 20 6c 69 62 72 61 72 79 20  /*.This library 
0010: 77 69 6c 6c 20 70 72 6f 76 69 64 65 20 63 6f 6d  will provide com
0020: 6d 6f 6e 20 6d 61 74 68 65 6d 61 74 69 63 61 6c  mon mathematical
0030: 20 61 6e 64 20 73 74 72 69 6e 67 20 66 75 6e 63   and string func
0040: 74 69 6f 6e 73 20 69 6e 0a 53 51 4c 20 71 75 65  tions in.SQL que
0050: 72 69 65 73 20 75 73 69 6e 67 20 74 68 65 20 6f  ries using the o
0060: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
0070: 6d 61 74 68 20 6c 69 62 72 61 72 79 2e 20 20 49  math library.  I
0080: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 0a 66  t includes the.f
0090: 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
00a0: 6e 73 3a 0a 0a 4d 61 74 68 3a 20 61 63 6f 73 2c  ns:..Math: acos,
00b0: 20 61 73 69 6e 2c 20 61 74 61 6e 2c 20 61 74 6e   asin, atan, atn
00c0: 32 2c 20 61 74 61 6e 32 2c 20 61 63 6f 73 68 2c  2, atan2, acosh,
00d0: 20 61 73 69 6e 68 2c 20 61 74 61 6e 68 2c 20 64   asinh, atanh, d
00e0: 69 66 66 65 72 65 6e 63 65 2c 0a 64 65 67 72 65  ifference,.degre
00f0: 65 73 2c 20 72 61 64 69 61 6e 73 2c 20 63 6f 73  es, radians, cos
0100: 2c 20 73 69 6e 2c 20 74 61 6e 2c 20 63 6f 74 2c  , sin, tan, cot,
0110: 20 63 6f 73 68 2c 20 73 69 6e 68 2c 20 74 61 6e   cosh, sinh, tan
0120: 68 2c 20 63 6f 74 68 2c 20 65 78 70 2c 0a 6c 6f  h, coth, exp,.lo
0130: 67 2c 20 6c 6f 67 31 30 2c 20 70 6f 77 65 72 2c  g, log10, power,
0140: 20 73 69 67 6e 2c 20 73 71 72 74 2c 20 73 71 75   sign, sqrt, squ
0150: 61 72 65 2c 20 63 65 69 6c 2c 20 66 6c 6f 6f 72  are, ceil, floor
0160: 2c 20 70 69 2e 0a 0a 53 74 72 69 6e 67 3a 20 72  , pi...String: r
0170: 65 70 6c 69 63 61 74 65 2c 20 63 68 61 72 69 6e  eplicate, charin
0180: 64 65 78 2c 20 6c 65 66 74 73 74 72 2c 20 72 69  dex, leftstr, ri
0190: 67 68 74 73 74 72 2c 20 6c 74 72 69 6d 2c 20 72  ghtstr, ltrim, r
01a0: 74 72 69 6d 2c 20 74 72 69 6d 2c 0a 72 65 70 6c  trim, trim,.repl
01b0: 61 63 65 2c 20 72 65 76 65 72 73 65 2c 20 70 72  ace, reverse, pr
01c0: 6f 70 65 72 2c 20 70 61 64 6c 2c 20 70 61 64 72  oper, padl, padr
01d0: 2c 20 70 61 64 63 2c 20 73 74 72 66 69 6c 74 65  , padc, strfilte
01e0: 72 2e 0a 0a 41 67 67 72 65 67 61 74 65 3a 20 73  r...Aggregate: s
01f0: 74 64 65 76 2c 20 76 61 72 69 61 6e 63 65 2c 20  tdev, variance, 
0200: 6d 6f 64 65 2c 20 6d 65 64 69 61 6e 2c 20 6c 6f  mode, median, lo
0210: 77 65 72 5f 71 75 61 72 74 69 6c 65 2c 0a 75 70  wer_quartile,.up
0220: 70 65 72 5f 71 75 61 72 74 69 6c 65 2e 0a 0a 54  per_quartile...T
0230: 68 65 20 73 74 72 69 6e 67 20 66 75 6e 63 74 69  he string functi
0240: 6f 6e 73 20 6c 74 72 69 6d 2c 20 72 74 72 69 6d  ons ltrim, rtrim
0250: 2c 20 74 72 69 6d 2c 20 72 65 70 6c 61 63 65 20  , trim, replace 
0260: 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a  are included in.
0270: 72 65 63 65 6e 74 20 76 65 72 73 69 6f 6e 73 20  recent versions 
0280: 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 73 6f  of SQLite and so
0290: 20 62 79 20 64 65 66 61 75 6c 74 20 64 6f 20 6e   by default do n
02a0: 6f 74 20 62 75 69 6c 64 2e 0a 0a 49 6e 73 74 72  ot build...Instr
02b0: 75 63 74 69 6f 6e 73 3a 0a 31 29 20 43 6f 6d 70  uctions:.1) Comp
02c0: 69 6c 65 20 77 69 74 68 0a 20 20 20 4c 69 6e 75  ile with.   Linu
02d0: 78 3a 0a 20 20 20 20 20 67 63 63 20 2d 66 50 49  x:.     gcc -fPI
02e0: 43 20 2d 6c 6d 20 2d 73 68 61 72 65 64 20 65 78  C -lm -shared ex
02f0: 74 65 6e 73 69 6f 6e 2d 66 75 6e 63 74 69 6f 6e  tension-function
0300: 73 2e 63 20 2d 6f 20 6c 69 62 73 71 6c 69 74 65  s.c -o libsqlite
0310: 66 75 6e 63 74 69 6f 6e 73 2e 73 6f 0a 20 20 20  functions.so.   
0320: 4d 61 63 20 4f 53 20 58 3a 0a 20 20 20 20 20 67  Mac OS X:.     g
0330: 63 63 20 2d 66 6e 6f 2d 63 6f 6d 6d 6f 6e 20 2d  cc -fno-common -
0340: 64 79 6e 61 6d 69 63 6c 69 62 20 65 78 74 65 6e  dynamiclib exten
0350: 73 69 6f 6e 2d 66 75 6e 63 74 69 6f 6e 73 2e 63  sion-functions.c
0360: 20 2d 6f 20 6c 69 62 73 71 6c 69 74 65 66 75 6e   -o libsqlitefun
0370: 63 74 69 6f 6e 73 2e 64 79 6c 69 62 0a 20 20 20  ctions.dylib.   
0380: 28 59 6f 75 20 6d 61 79 20 6e 65 65 64 20 74 6f  (You may need to
0390: 20 61 64 64 20 66 6c 61 67 73 0a 20 20 20 20 2d   add flags.    -
03a0: 49 20 2f 6f 70 74 2f 6c 6f 63 61 6c 2f 69 6e 63  I /opt/local/inc
03b0: 6c 75 64 65 2f 20 2d 4c 2f 6f 70 74 2f 6c 6f 63  lude/ -L/opt/loc
03c0: 61 6c 2f 6c 69 62 20 2d 6c 73 71 6c 69 74 65 33  al/lib -lsqlite3
03d0: 0a 20 20 20 20 69 66 20 79 6f 75 72 20 73 71 6c  .    if your sql
03e0: 69 74 65 33 20 69 73 20 69 6e 73 74 61 6c 6c 65  ite3 is installe
03f0: 64 20 66 72 6f 6d 20 4d 61 63 20 70 6f 72 74 73  d from Mac ports
0400: 2c 20 6f 72 0a 20 20 20 20 2d 49 20 2f 73 77 2f  , or.    -I /sw/
0410: 69 6e 63 6c 75 64 65 2f 20 2d 4c 2f 73 77 2f 6c  include/ -L/sw/l
0420: 69 62 20 2d 6c 73 71 6c 69 74 65 33 0a 20 20 20  ib -lsqlite3.   
0430: 20 69 66 20 69 6e 73 74 61 6c 6c 65 64 20 77 69   if installed wi
0440: 74 68 20 46 69 6e 6b 2e 29 0a 32 29 20 49 6e 20  th Fink.).2) In 
0450: 79 6f 75 72 20 61 70 70 6c 69 63 61 74 69 6f 6e  your application
0460: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65  , call sqlite3_e
0470: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
0480: 73 69 6f 6e 28 64 62 2c 31 29 20 74 6f 0a 20 20  sion(db,1) to.  
0490: 20 61 6c 6c 6f 77 20 6c 6f 61 64 69 6e 67 20 65   allow loading e
04a0: 78 74 65 72 6e 61 6c 20 6c 69 62 72 61 72 69 65  xternal librarie
04b0: 73 2e 20 20 54 68 65 6e 20 6c 6f 61 64 20 74 68  s.  Then load th
04c0: 65 20 6c 69 62 72 61 72 79 20 6c 69 62 73 71 6c  e library libsql
04d0: 69 74 65 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  itefunctions.   
04e0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
04f0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 3b 20 74 68  ad_extension; th
0500: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
0510: 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 0a 20 20   should be 0..  
0520: 20 53 65 65 20 68 74 74 70 73 3a 2f 2f 77 77 77   See https://www
0530: 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 63 76 73 74  .sqlite.org/cvst
0540: 72 61 63 2f 77 69 6b 69 3f 70 3d 4c 6f 61 64 61  rac/wiki?p=Loada
0550: 62 6c 65 45 78 74 65 6e 73 69 6f 6e 73 2e 0a 33  bleExtensions..3
0560: 29 20 55 73 65 2c 20 66 6f 72 20 65 78 61 6d 70  ) Use, for examp
0570: 6c 65 3a 0a 20 20 20 53 45 4c 45 43 54 20 63 6f  le:.   SELECT co
0580: 73 28 72 61 64 69 61 6e 73 28 69 6e 63 6c 69 6e  s(radians(inclin
0590: 61 74 69 6f 6e 29 29 20 46 52 4f 4d 20 73 61 74  ation)) FROM sat
05a0: 73 75 6d 20 57 48 45 52 45 20 73 61 74 6e 75 6d  sum WHERE satnum
05b0: 20 3d 20 32 35 35 34 34 3b 0a 0a 4e 6f 74 65 3a   = 25544;..Note:
05c0: 20 4c 6f 61 64 69 6e 67 20 65 78 74 65 6e 73 69   Loading extensi
05d0: 6f 6e 73 20 69 73 20 62 79 20 64 65 66 61 75 6c  ons is by defaul
05e0: 74 20 70 72 6f 68 69 62 69 74 65 64 20 61 73 20  t prohibited as 
05f0: 61 0a 73 65 63 75 72 69 74 79 20 6d 65 61 73 75  a.security measu
0600: 72 65 3b 20 73 65 65 20 22 53 65 63 75 72 69 74  re; see "Securit
0610: 79 20 43 6f 6e 73 69 64 65 72 61 74 69 6f 6e 73  y Considerations
0620: 22 20 69 6e 0a 68 74 74 70 73 3a 2f 2f 77 77 77  " in.https://www
0630: 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 63 76 73 74  .sqlite.org/cvst
0640: 72 61 63 2f 77 69 6b 69 3f 70 3d 4c 6f 61 64 61  rac/wiki?p=Loada
0650: 62 6c 65 45 78 74 65 6e 73 69 6f 6e 73 2e 0a 49  bleExtensions..I
0660: 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 70 72  f the sqlite3 pr
0670: 6f 67 72 61 6d 20 61 6e 64 20 6c 69 62 72 61 72  ogram and librar
0680: 79 20 61 72 65 20 62 75 69 6c 74 20 74 68 69 73  y are built this
0690: 0a 77 61 79 2c 20 79 6f 75 20 63 61 6e 6e 6f 74  .way, you cannot
06a0: 20 75 73 65 20 74 68 65 73 65 20 66 75 6e 63 74   use these funct
06b0: 69 6f 6e 73 20 66 72 6f 6d 20 74 68 65 20 70 72  ions from the pr
06c0: 6f 67 72 61 6d 2c 20 79 6f 75 0a 6d 75 73 74 20  ogram, you.must 
06d0: 77 72 69 74 65 20 79 6f 75 72 20 6f 77 6e 20 70  write your own p
06e0: 72 6f 67 72 61 6d 20 75 73 69 6e 67 20 74 68 65  rogram using the
06f0: 20 73 71 6c 69 74 65 33 20 41 50 49 2c 20 61 6e   sqlite3 API, an
0700: 64 20 63 61 6c 6c 0a 73 71 6c 69 74 65 33 5f 65  d call.sqlite3_e
0710: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
0720: 73 69 6f 6e 20 61 73 20 64 65 73 63 72 69 62 65  sion as describe
0730: 64 20 61 62 6f 76 65 2e 0a 0a 49 66 20 74 68 65  d above...If the
0740: 20 70 72 6f 67 72 61 6d 20 69 73 20 62 75 69 6c   program is buil
0750: 74 20 73 6f 20 74 68 61 74 20 6c 6f 61 64 69 6e  t so that loadin
0760: 67 20 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20  g extensions is 
0770: 70 65 72 6d 69 74 74 65 64 2c 0a 74 68 65 20 66  permitted,.the f
0780: 6f 6c 6c 6f 77 69 6e 67 20 77 69 6c 6c 20 77 6f  ollowing will wo
0790: 72 6b 3a 0a 73 71 6c 69 74 65 3e 20 53 45 4c 45  rk:.sqlite> SELE
07a0: 43 54 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  CT load_extensio
07b0: 6e 28 27 2e 2f 6c 69 62 73 71 6c 69 74 65 66 75  n('./libsqlitefu
07c0: 6e 63 74 69 6f 6e 73 2e 73 6f 27 29 3b 0a 73 71  nctions.so');.sq
07d0: 6c 69 74 65 3e 20 73 65 6c 65 63 74 20 63 6f 73  lite> select cos
07e0: 28 72 61 64 69 61 6e 73 28 34 35 29 29 3b 0a 30  (radians(45));.0
07f0: 2e 37 30 37 31 30 36 37 38 31 31 38 36 35 34 38  .707106781186548
0800: 0a 0a 41 6c 74 65 72 61 74 69 6f 6e 73 3a 0a 54  ..Alterations:.T
0810: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  he instructions 
0820: 61 72 65 20 66 6f 72 20 4c 69 6e 75 78 20 6f 72  are for Linux or
0830: 20 4d 61 63 20 4f 53 20 58 3b 20 75 73 65 72 73   Mac OS X; users
0840: 20 6f 66 20 6f 74 68 65 72 20 4f 53 65 73 20 6d   of other OSes m
0850: 61 79 0a 6e 65 65 64 20 74 6f 20 6d 6f 64 69 66  ay.need to modif
0860: 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  y this procedure
0870: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
0880: 2c 20 69 66 20 79 6f 75 72 20 6d 61 74 68 20 6c  , if your math l
0890: 69 62 72 61 72 79 0a 6c 61 63 6b 73 20 6f 6e 65  ibrary.lacks one
08a0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
08b0: 6e 65 65 64 65 64 20 74 72 69 67 20 6f 72 20 6c  needed trig or l
08c0: 6f 67 20 66 75 6e 63 74 69 6f 6e 73 2c 20 63 6f  og functions, co
08d0: 6d 6d 65 6e 74 20 6f 75 74 20 74 68 65 0a 61 70  mment out the.ap
08e0: 70 72 6f 70 72 69 61 74 65 20 48 41 56 45 5f 20  propriate HAVE_ 
08f0: 23 64 65 66 69 6e 65 20 61 74 20 74 68 65 20 74  #define at the t
0900: 6f 70 20 6f 66 20 66 69 6c 65 2e 20 20 49 66 20  op of file.  If 
0910: 79 6f 75 20 64 6f 20 6e 6f 74 0a 77 69 73 68 20  you do not.wish 
0920: 74 6f 20 6d 61 6b 65 20 61 20 6c 6f 61 64 61 62  to make a loadab
0930: 6c 65 20 6d 6f 64 75 6c 65 2c 20 63 6f 6d 6d 65  le module, comme
0940: 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e  nt out the defin
0950: 65 20 66 6f 72 0a 43 4f 4d 50 49 4c 45 5f 53 51  e for.COMPILE_SQ
0960: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 5f  LITE_EXTENSIONS_
0970: 41 53 5f 4c 4f 41 44 41 42 4c 45 5f 4d 4f 44 55  AS_LOADABLE_MODU
0980: 4c 45 2e 20 20 49 66 20 79 6f 75 20 61 72 65 20  LE.  If you are 
0990: 75 73 69 6e 67 20 61 0a 76 65 72 73 69 6f 6e 20  using a.version 
09a0: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
09b0: 74 20 74 68 65 20 74 72 69 6d 20 66 75 6e 63 74  t the trim funct
09c0: 69 6f 6e 73 20 61 6e 64 20 72 65 70 6c 61 63 65  ions and replace
09d0: 2c 20 63 6f 6d 6d 65 6e 74 20 6f 75 74 0a 74 68  , comment out.th
09e0: 65 20 48 41 56 45 5f 54 52 49 4d 20 23 64 65 66  e HAVE_TRIM #def
09f0: 69 6e 65 2e 0a 0a 4c 69 61 6d 20 48 65 61 6c 79  ine...Liam Healy
0a00: 0a 0a 48 69 73 74 6f 72 79 3a 0a 32 30 30 38 2d  ..History:.2008-
0a10: 30 36 2d 31 33 20 43 68 61 6e 67 65 20 74 6f 20  06-13 Change to 
0a20: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 6f 20  instructions to 
0a30: 69 6e 64 69 63 61 74 65 20 75 73 65 20 6f 66 20  indicate use of 
0a40: 74 68 65 20 6d 61 74 68 20 6c 69 62 72 61 72 79  the math library
0a50: 0a 61 6e 64 20 74 68 61 74 20 70 72 6f 67 72 61  .and that progra
0a60: 6d 20 6d 69 67 68 74 20 77 6f 72 6b 2e 0a 32 30  m might work..20
0a70: 30 37 2d 31 30 2d 30 31 20 4d 69 6e 6f 72 20 63  07-10-01 Minor c
0a80: 6c 61 72 69 66 69 63 61 74 69 6f 6e 20 74 6f 20  larification to 
0a90: 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 0a 32 30  instructions..20
0aa0: 30 37 2d 30 39 2d 32 39 20 43 6f 6d 70 69 6c 61  07-09-29 Compila
0ab0: 74 69 6f 6e 20 61 73 20 6c 6f 61 64 61 62 6c 65  tion as loadable
0ac0: 20 6d 6f 64 75 6c 65 20 69 73 20 6f 70 74 69 6f   module is optio
0ad0: 6e 61 6c 20 77 69 74 68 0a 43 4f 4d 50 49 4c 45  nal with.COMPILE
0ae0: 5f 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f  _SQLITE_EXTENSIO
0af0: 4e 53 5f 41 53 5f 4c 4f 41 44 41 42 4c 45 5f 4d  NS_AS_LOADABLE_M
0b00: 4f 44 55 4c 45 2e 0a 32 30 30 37 2d 30 39 2d 32  ODULE..2007-09-2
0b10: 38 20 55 73 65 20 73 71 6c 69 74 65 33 5f 65 78  8 Use sqlite3_ex
0b20: 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 20 61 6e 64  tension_init and
0b30: 20 6d 61 63 72 6f 73 0a 53 51 4c 49 54 45 5f 45   macros.SQLITE_E
0b40: 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 2c 20  XTENSION_INIT1, 
0b50: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
0b60: 5f 49 4e 49 54 32 2c 20 73 6f 20 74 68 61 74 20  _INIT2, so that 
0b70: 69 74 20 77 6f 72 6b 73 20 77 69 74 68 0a 73 71  it works with.sq
0b80: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
0b90: 73 69 6f 6e 2e 20 20 54 68 61 6e 6b 73 20 74 6f  sion.  Thanks to
0ba0: 20 45 72 69 63 20 48 69 67 61 73 68 69 6e 6f 20   Eric Higashino 
0bb0: 61 6e 64 20 4a 6f 65 20 57 69 6c 73 6f 6e 2e 0a  and Joe Wilson..
0bc0: 4e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  New instructions
0bd0: 20 66 6f 72 20 4d 61 63 20 63 6f 6d 70 69 6c 61   for Mac compila
0be0: 74 69 6f 6e 2e 0a 32 30 30 37 2d 30 39 2d 31 37  tion..2007-09-17
0bf0: 20 57 69 74 68 20 68 65 6c 70 20 66 72 6f 6d 20   With help from 
0c00: 4a 6f 65 20 57 69 6c 73 6f 6e 20 61 6e 64 20 4e  Joe Wilson and N
0c10: 75 6e 6f 20 4c 75 63 61 2c 20 6d 61 64 65 20 75  uno Luca, made u
0c20: 73 65 20 6f 66 0a 65 78 74 65 72 6e 61 6c 20 69  se of.external i
0c30: 6e 74 65 72 66 61 63 65 73 20 73 6f 20 74 68 61  nterfaces so tha
0c40: 74 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 69 73  t compilation is
0c50: 20 6e 6f 20 6c 6f 6e 67 65 72 20 64 65 70 65 6e   no longer depen
0c60: 64 65 6e 74 20 6f 6e 0a 53 51 4c 69 74 65 20 73  dent on.SQLite s
0c70: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 4d 65 72  ource code.  Mer
0c80: 67 65 64 20 73 6f 75 72 63 65 2c 20 68 65 61 64  ged source, head
0c90: 65 72 2c 20 61 6e 64 20 52 45 41 44 4d 45 20 69  er, and README i
0ca0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 0a 66 69 6c  nto a single.fil
0cb0: 65 2e 20 20 41 64 64 65 64 20 63 61 73 74 73 20  e.  Added casts 
0cc0: 73 6f 20 74 68 61 74 20 4d 61 63 20 77 69 6c 6c  so that Mac will
0cd0: 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74   compile without
0ce0: 20 77 61 72 6e 69 6e 67 73 20 28 75 6e 73 69 67   warnings (unsig
0cf0: 6e 65 64 0a 61 6e 64 20 73 69 67 6e 65 64 20 63  ned.and signed c
0d00: 68 61 72 29 2e 0a 32 30 30 37 2d 30 39 2d 30 35  har)..2007-09-05
0d10: 20 49 6e 63 6c 75 64 65 64 20 73 6f 6d 65 20 64   Included some d
0d20: 65 66 69 6e 69 74 69 6f 6e 73 20 66 72 6f 6d 20  efinitions from 
0d30: 73 71 6c 69 74 65 20 33 2e 33 2e 31 33 20 73 6f  sqlite 3.3.13 so
0d40: 20 74 68 61 74 20 74 68 69 73 0a 77 69 6c 6c 20   that this.will 
0d50: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 77 6f 72 6b  continue to work
0d60: 20 69 6e 20 6e 65 77 65 72 20 76 65 72 73 69 6f   in newer versio
0d70: 6e 73 20 6f 66 20 73 71 6c 69 74 65 2e 20 20 43  ns of sqlite.  C
0d80: 6f 6d 70 6c 65 74 65 64 0a 64 65 73 63 72 69 70  ompleted.descrip
0d90: 74 69 6f 6e 20 6f 66 20 66 75 6e 63 74 69 6f 6e  tion of function
0da0: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 32 30 30  s available..200
0db0: 37 2d 30 33 2d 32 37 20 52 65 76 69 73 65 64 20  7-03-27 Revised 
0dc0: 64 65 73 63 72 69 70 74 69 6f 6e 2e 0a 32 30 30  description..200
0dd0: 37 2d 30 33 2d 32 33 20 53 6d 61 6c 6c 20 63 6c  7-03-23 Small cl
0de0: 65 61 6e 75 70 20 61 6e 64 20 61 20 62 75 67 20  eanup and a bug 
0df0: 66 69 78 20 6f 6e 20 74 68 65 20 63 6f 64 65 2e  fix on the code.
0e00: 20 20 54 68 69 73 20 77 61 73 20 6d 61 69 6e 6c    This was mainl
0e10: 79 0a 6c 65 74 74 69 6e 67 20 65 72 72 6e 6f 20  y.letting errno 
0e20: 66 6c 61 67 20 65 72 72 6f 72 73 20 65 6e 63 6f  flag errors enco
0e30: 75 6e 74 65 72 65 64 20 69 6e 20 74 68 65 20 6d  untered in the m
0e40: 61 74 68 20 6c 69 62 72 61 72 79 20 61 6e 64 20  ath library and 
0e50: 63 68 65 63 6b 69 6e 67 0a 74 68 65 20 72 65 73  checking.the res
0e60: 75 6c 74 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ult, rather than
0e70: 20 70 72 65 2d 63 68 65 63 6b 69 6e 67 2e 20 20   pre-checking.  
0e80: 54 68 69 73 20 66 69 78 65 73 20 61 20 62 75 67  This fixes a bug
0e90: 20 69 6e 20 70 6f 77 65 72 20 74 68 61 74 0a 77   in power that.w
0ea0: 6f 75 6c 64 20 63 61 75 73 65 20 61 6e 20 65 72  ould cause an er
0eb0: 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 70  ror if any non-p
0ec0: 6f 73 69 74 69 76 65 20 6e 75 6d 62 65 72 20 77  ositive number w
0ed0: 61 73 20 72 61 69 73 65 64 20 74 6f 20 61 6e 79  as raised to any
0ee0: 0a 70 6f 77 65 72 2e 0a 32 30 30 37 2d 30 32 2d  .power..2007-02-
0ef0: 30 37 20 70 6f 73 74 65 64 20 62 79 20 4d 69 6b  07 posted by Mik
0f00: 65 79 20 43 20 74 6f 20 73 71 6c 69 74 65 20 6d  ey C to sqlite m
0f10: 61 69 6c 69 6e 67 20 6c 69 73 74 2e 0a 4f 72 69  ailing list..Ori
0f20: 67 69 6e 61 6c 20 63 6f 64 65 20 32 30 30 36 20  ginal code 2006 
0f30: 4a 75 6e 65 20 30 35 20 62 79 20 72 65 6c 69 63  June 05 by relic
0f40: 6f 64 65 72 2e 0a 0a 2a 2f 0a 0a 2f 2a 20 23 69  oder...*/../* #i
0f50: 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68  nclude "config.h
0f60: 22 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  " */.#if defined
0f70: 28 5f 57 49 4e 33 32 29 0a 23 20 20 69 6e 63 6c  (_WIN32).#  incl
0f80: 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a  ude <windows.h>.
0f90: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
0fa0: 6e 65 20 43 4f 4d 50 49 4c 45 5f 53 51 4c 49 54  ne COMPILE_SQLIT
0fb0: 45 5f 45 58 54 45 4e 53 49 4f 4e 53 5f 41 53 5f  E_EXTENSIONS_AS_
0fc0: 4c 4f 41 44 41 42 4c 45 5f 4d 4f 44 55 4c 45 20  LOADABLE_MODULE 
0fd0: 2a 2f 0a 0a 2f 2a 20 4e 4f 54 45 3a 20 4d 6f 72  */../* NOTE: Mor
0fe0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  e functions are 
0ff0: 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 4d  available with M
1000: 53 56 43 20 32 30 31 33 2e 20 2a 2f 0a 23 69 66  SVC 2013. */.#if
1010: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
1020: 29 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 5f 4d  ) || (defined(_M
1030: 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f  SC_VER) && _MSC_
1040: 56 45 52 20 3e 3d 20 31 38 30 30 29 0a 23 20 20  VER >= 1800).#  
1050: 64 65 66 69 6e 65 20 48 41 56 45 5f 41 43 4f 53  define HAVE_ACOS
1060: 48 09 09 31 0a 23 20 20 64 65 66 69 6e 65 20 48  H..1.#  define H
1070: 41 56 45 5f 41 53 49 4e 48 09 09 31 0a 23 20 20  AVE_ASINH..1.#  
1080: 64 65 66 69 6e 65 20 48 41 56 45 5f 41 54 41 4e  define HAVE_ATAN
1090: 48 09 09 31 0a 23 20 20 64 65 66 69 6e 65 20 48  H..1.#  define H
10a0: 41 56 45 5f 49 53 42 4c 41 4e 4b 09 09 31 0a 23  AVE_ISBLANK..1.#
10b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48  endif..#define H
10c0: 41 56 45 5f 53 49 4e 48 09 09 31 0a 23 64 65 66  AVE_SINH..1.#def
10d0: 69 6e 65 20 48 41 56 45 5f 43 4f 53 48 09 09 31  ine HAVE_COSH..1
10e0: 0a 23 64 65 66 69 6e 65 20 48 41 56 45 5f 54 41  .#define HAVE_TA
10f0: 4e 48 09 09 31 0a 23 64 65 66 69 6e 65 20 48 41  NH..1.#define HA
1100: 56 45 5f 4c 4f 47 31 30 09 09 31 0a 23 64 65 66  VE_LOG10..1.#def
1110: 69 6e 65 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44  ine SQLITE_SOUND
1120: 45 58 09 09 31 0a 0a 2f 2a 20 4c 4d 48 20 32 30  EX..1../* LMH 20
1130: 30 37 2d 30 33 2d 32 35 20 69 66 20 53 51 4c 69  07-03-25 if SQLi
1140: 74 65 20 68 61 73 20 74 72 69 6d 20 66 75 6e 63  te has trim func
1150: 74 69 6f 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65  tions */.#define
1160: 20 48 41 56 45 5f 54 52 49 4d 09 09 31 0a 0a 23   HAVE_TRIM..1..#
1170: 69 66 64 65 66 20 43 4f 4d 50 49 4c 45 5f 53 51  ifdef COMPILE_SQ
1180: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 5f  LITE_EXTENSIONS_
1190: 41 53 5f 4c 4f 41 44 41 42 4c 45 5f 4d 4f 44 55  AS_LOADABLE_MODU
11a0: 4c 45 0a 23 69 6e 63 6c 75 64 65 20 22 2e 2e 2f  LE.#include "../
11b0: 63 6f 72 65 2f 73 71 6c 69 74 65 33 65 78 74 2e  core/sqlite3ext.
11c0: 68 22 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  h".SQLITE_EXTENS
11d0: 49 4f 4e 5f 49 4e 49 54 31 0a 23 65 6c 73 65 0a  ION_INIT1.#else.
11e0: 23 69 6e 63 6c 75 64 65 20 22 2e 2e 2f 63 6f 72  #include "../cor
11f0: 65 2f 73 71 6c 69 74 65 33 2e 68 22 0a 23 65 6e  e/sqlite3.h".#en
1200: 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 63  dif..#include <c
1210: 74 79 70 65 2e 68 3e 0a 2f 2a 20 72 65 6c 69 63  type.h>./* relic
1220: 6f 64 65 72 20 2a 2f 0a 23 69 6e 63 6c 75 64 65  oder */.#include
1230: 20 3c 6d 61 74 68 2e 68 3e 0a 23 69 6e 63 6c 75   <math.h>.#inclu
1240: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
1250: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
1260: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
1270: 57 49 4e 33 32 5f 57 43 45 29 20 7c 7c 20 64 65  WIN32_WCE) || de
1280: 66 69 6e 65 64 28 48 41 56 45 5f 45 52 52 4e 4f  fined(HAVE_ERRNO
1290: 5f 48 29 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  _H).#  include <
12a0: 65 72 72 6e 6f 2e 68 3e 09 09 2f 2a 20 4c 4d 48  errno.h>../* LMH
12b0: 20 32 30 30 37 2d 30 33 2d 32 35 20 2a 2f 0a 23   2007-03-25 */.#
12c0: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  elif defined(_WI
12d0: 4e 33 32 29 0a 69 6e 74 20 65 72 72 6e 6f 3b 0a  N32).int errno;.
12e0: 23 20 20 64 65 66 69 6e 65 20 73 74 72 65 72 72  #  define strerr
12f0: 6f 72 28 78 29 09 09 22 22 0a 23 65 6c 73 65 0a  or(x).."".#else.
1300: 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e  #  include <errn
1310: 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  o.h>.#endif..#in
1320: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
1330: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
1340: 74 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20 5f 4d  t.h>..#ifndef _M
1350: 41 50 5f 48 5f 0a 23 64 65 66 69 6e 65 20 5f 4d  AP_H_.#define _M
1360: 41 50 5f 48 5f 0a 0a 23 69 66 20 64 65 66 69 6e  AP_H_..#if defin
1370: 65 64 28 5f 57 49 4e 33 32 29 0a 74 79 70 65 64  ed(_WIN32).typed
1380: 65 66 20 73 69 67 6e 65 64 20 63 68 61 72 20 69  ef signed char i
1390: 6e 74 38 5f 74 3b 0a 74 79 70 65 64 65 66 20 75  nt8_t;.typedef u
13a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 69 6e  nsigned char uin
13b0: 74 38 5f 74 3b 0a 74 79 70 65 64 65 66 20 73 69  t8_t;.typedef si
13c0: 67 6e 65 64 20 69 6e 74 20 69 6e 74 31 36 5f 74  gned int int16_t
13d0: 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ;.typedef unsign
13e0: 65 64 20 69 6e 74 20 75 69 6e 74 31 36 5f 74 3b  ed int uint16_t;
13f0: 0a 74 79 70 65 64 65 66 20 73 69 67 6e 65 64 20  .typedef signed 
1400: 6c 6f 6e 67 20 69 6e 74 20 69 6e 74 33 32 5f 74  long int int32_t
1410: 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ;.typedef unsign
1420: 65 64 20 6c 6f 6e 67 20 69 6e 74 20 75 69 6e 74  ed long int uint
1430: 33 32 5f 74 3b 0a 74 79 70 65 64 65 66 20 73 69  32_t;.typedef si
1440: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69  gned long long i
1450: 6e 74 20 69 6e 74 36 34 5f 74 3b 0a 74 79 70 65  nt int64_t;.type
1460: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  def unsigned lon
1470: 67 20 6c 6f 6e 67 20 69 6e 74 20 75 69 6e 74 36  g long int uint6
1480: 34 5f 74 3b 0a 23 65 6c 73 65 0a 23 20 20 69 6e  4_t;.#else.#  in
1490: 63 6c 75 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e  clude <stdint.h>
14a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
14b0: 69 6d 70 6c 65 20 62 69 6e 61 72 79 20 74 72 65  imple binary tre
14c0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
14d0: 20 74 6f 20 75 73 65 20 69 6e 20 6d 65 64 69 61   to use in media
14e0: 6e 2c 20 6d 6f 64 65 20 61 6e 64 20 71 75 61 72  n, mode and quar
14f0: 74 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6f 6e  tile calculation
1500: 73 0a 2a 2a 20 54 72 65 65 20 69 73 20 6e 6f 74  s.** Tree is not
1510: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 61 6c   necessarily bal
1520: 61 6e 63 65 64 2e 20 54 68 61 74 20 77 6f 75 6c  anced. That woul
1530: 64 20 72 65 71 75 69 72 65 20 73 6f 6d 65 74 68  d require someth
1540: 69 6e 67 20 6c 69 6b 65 20 72 65 64 26 62 6c 61  ing like red&bla
1550: 63 6b 20 74 72 65 65 73 20 6f 66 20 41 56 4c 0a  ck trees of AVL.
1560: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 69 6e 74 28  */..typedef int(
1570: 2a 63 6d 70 5f 66 75 6e 63 29 28 63 6f 6e 73 74  *cmp_func)(const
1580: 20 76 6f 69 64 20 2a 2c 20 63 6f 6e 73 74 20 76   void *, const v
1590: 6f 69 64 20 2a 29 3b 0a 74 79 70 65 64 65 66 20  oid *);.typedef 
15a0: 76 6f 69 64 28 2a 6d 61 70 5f 69 74 65 72 61 74  void(*map_iterat
15b0: 6f 72 29 28 76 6f 69 64 2a 2c 20 69 6e 74 36 34  or)(void*, int64
15c0: 5f 74 2c 20 76 6f 69 64 2a 29 3b 0a 0a 74 79 70  _t, void*);..typ
15d0: 65 64 65 66 20 73 74 72 75 63 74 20 6e 6f 64 65  edef struct node
15e0: 7b 0a 20 20 73 74 72 75 63 74 20 6e 6f 64 65 20  {.  struct node 
15f0: 2a 6c 3b 0a 20 20 73 74 72 75 63 74 20 6e 6f 64  *l;.  struct nod
1600: 65 20 2a 72 3b 0a 20 20 76 6f 69 64 2a 20 64 61  e *r;.  void* da
1610: 74 61 3b 0a 20 20 69 6e 74 36 34 5f 74 20 63 6f  ta;.  int64_t co
1620: 75 6e 74 3b 0a 7d 20 6e 6f 64 65 3b 0a 0a 74 79  unt;.} node;..ty
1630: 70 65 64 65 66 20 73 74 72 75 63 74 20 6d 61 70  pedef struct map
1640: 7b 0a 20 20 6e 6f 64 65 20 2a 62 61 73 65 3b 0a  {.  node *base;.
1650: 20 20 63 6d 70 5f 66 75 6e 63 20 63 6d 70 3b 0a    cmp_func cmp;.
1660: 20 20 73 68 6f 72 74 20 66 72 65 65 3b 0a 7d 20    short free;.} 
1670: 6d 61 70 3b 0a 0a 2f 2a 0a 2a 2a 20 63 72 65 61  map;../*.** crea
1680: 74 65 73 20 61 20 6d 61 70 20 67 69 76 65 6e 20  tes a map given 
1690: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  a comparison fun
16a0: 63 74 69 6f 6e 0a 2a 2f 0a 6d 61 70 20 6d 61 70  ction.*/.map map
16b0: 5f 6d 61 6b 65 28 63 6d 70 5f 66 75 6e 63 20 63  _make(cmp_func c
16c0: 6d 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 69 6e 73 65  mp);../*.** inse
16d0: 72 74 73 20 74 68 65 20 65 6c 65 6d 65 6e 74 20  rts the element 
16e0: 65 20 69 6e 74 6f 20 6d 61 70 20 6d 0a 2a 2f 0a  e into map m.*/.
16f0: 76 6f 69 64 20 6d 61 70 5f 69 6e 73 65 72 74 28  void map_insert(
1700: 6d 61 70 20 2a 6d 2c 20 76 6f 69 64 20 2a 65 29  map *m, void *e)
1710: 3b 0a 0a 2f 2a 0a 2a 2a 20 65 78 65 63 75 74 65  ;../*.** execute
1720: 73 20 66 75 6e 63 74 69 6f 6e 20 69 74 65 72 20  s function iter 
1730: 6f 76 65 72 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  over all element
1740: 73 20 69 6e 20 74 68 65 20 6d 61 70 2c 20 69 6e  s in the map, in
1750: 20 6b 65 79 20 69 6e 63 72 65 61 73 69 6e 67 20   key increasing 
1760: 6f 72 64 65 72 0a 2a 2f 0a 76 6f 69 64 20 6d 61  order.*/.void ma
1770: 70 5f 69 74 65 72 61 74 65 28 6d 61 70 20 2a 6d  p_iterate(map *m
1780: 2c 20 6d 61 70 5f 69 74 65 72 61 74 6f 72 20 69  , map_iterator i
1790: 74 65 72 2c 20 76 6f 69 64 2a 20 70 29 3b 0a 0a  ter, void* p);..
17a0: 2f 2a 0a 2a 2a 20 66 72 65 65 73 20 61 6c 6c 20  /*.** frees all 
17b0: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
17c0: 20 6d 61 70 0a 2a 2f 0a 76 6f 69 64 20 6d 61 70   map.*/.void map
17d0: 5f 64 65 73 74 72 6f 79 28 6d 61 70 20 2a 6d 29  _destroy(map *m)
17e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 63 6f 6d 70 61 72 65  ;../*.** compare
17f0: 73 20 32 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  s 2 integers.** 
1800: 74 6f 20 75 73 65 20 77 69 74 68 20 6d 61 70 5f  to use with map_
1810: 6d 61 6b 65 0a 2a 2f 0a 69 6e 74 20 69 6e 74 5f  make.*/.int int_
1820: 63 6d 70 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  cmp(const void *
1830: 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62  a, const void *b
1840: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 63 6f 6d 70 61 72  );../*.** compar
1850: 65 73 20 32 20 64 6f 75 62 6c 65 73 0a 2a 2a 20  es 2 doubles.** 
1860: 74 6f 20 75 73 65 20 77 69 74 68 20 6d 61 70 5f  to use with map_
1870: 6d 61 6b 65 0a 2a 2f 0a 69 6e 74 20 64 6f 75 62  make.*/.int doub
1880: 6c 65 5f 63 6d 70 28 63 6f 6e 73 74 20 76 6f 69  le_cmp(const voi
1890: 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *a, const void
18a0: 20 2a 62 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a   *b);..#endif /*
18b0: 20 5f 4d 41 50 5f 48 5f 20 2a 2f 0a 0a 23 69 66   _MAP_H_ */..#if
18c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18d0: 5f 43 4f 52 45 29 0a 74 79 70 65 64 65 66 20 75  _CORE).typedef u
18e0: 69 6e 74 38 5f 74 20 20 20 20 20 20 20 20 20 75  int8_t         u
18f0: 38 3b 0a 2f 2a 20 74 79 70 65 64 65 66 20 75 69  8;./* typedef ui
1900: 6e 74 31 36 5f 74 20 20 20 20 20 20 20 20 75 31  nt16_t        u1
1910: 36 3b 20 2a 2f 0a 74 79 70 65 64 65 66 20 69 6e  6; */.typedef in
1920: 74 36 34 5f 74 20 20 20 20 20 20 20 20 20 69 36  t64_t         i6
1930: 34 3b 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  4;.#endif..stati
1940: 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 53  c char *sqlite3S
1950: 74 72 44 75 70 28 20 63 6f 6e 73 74 20 63 68 61  trDup( const cha
1960: 72 20 2a 7a 20 29 20 7b 0a 20 20 20 20 63 68 61  r *z ) {.    cha
1970: 72 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33  r *res = sqlite3
1980: 5f 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28  _malloc( strlen(
1990: 7a 29 2b 31 20 29 3b 0a 20 20 20 20 72 65 74 75  z)+1 );.    retu
19a0: 72 6e 20 73 74 72 63 70 79 28 20 72 65 73 2c 20  rn strcpy( res, 
19b0: 7a 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  z );.}../*.** Th
19c0: 65 73 65 20 61 72 65 20 63 6f 70 69 65 64 20 76  ese are copied v
19d0: 65 72 62 61 74 69 6d 20 66 72 6f 6d 20 66 75 6e  erbatim from fun
19e0: 2e 63 20 73 6f 20 61 73 20 74 6f 20 6e 6f 74 20  .c so as to not 
19f0: 68 61 76 65 20 74 68 65 20 6e 61 6d 65 73 20 65  have the names e
1a00: 78 70 6f 72 74 65 64 0a 2a 2f 0a 0a 2f 2a 20 4c  xported.*/../* L
1a10: 4d 48 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 20  MH from sqlite3 
1a20: 33 2e 33 2e 31 33 20 2a 2f 0a 2f 2a 0a 2a 2a 20  3.3.13 */./*.** 
1a30: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 70 73 20  This table maps 
1a40: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 62  from the first b
1a50: 79 74 65 20 6f 66 20 61 20 55 54 46 2d 38 20 63  yte of a UTF-8 c
1a60: 68 61 72 61 63 74 65 72 20 74 6f 20 74 68 65 20  haracter to the 
1a70: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 74 72 61  number.** of tra
1a80: 69 6c 69 6e 67 20 62 79 74 65 73 20 65 78 70 65  iling bytes expe
1a90: 63 74 65 64 2e 20 41 20 76 61 6c 75 65 20 27 34  cted. A value '4
1aa0: 27 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  ' indicates that
1ab0: 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79 0a 2a   the table key.*
1ac0: 2a 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  * is not a legal
1ad0: 20 66 69 72 73 74 20 62 79 74 65 20 66 6f 72 20   first byte for 
1ae0: 61 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  a UTF-8 characte
1af0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  r..*/.static con
1b00: 73 74 20 75 38 20 78 74 72 61 5f 75 74 66 38 5f  st u8 xtra_utf8_
1b10: 62 79 74 65 73 5b 32 35 36 5d 20 20 3d 20 7b 0a  bytes[256]  = {.
1b20: 2f 2a 20 30 78 78 78 78 78 78 78 20 2a 2f 0a 30  /* 0xxxxxxx */.0
1b30: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
1b40: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
1b50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1b60: 30 2c 0a 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0,.0, 0, 0, 0, 0
1b70: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
1b80: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
1b90: 20 30 2c 20 30 2c 0a 30 2c 20 30 2c 20 30 2c 20   0, 0,.0, 0, 0, 
1ba0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
1bb0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
1bc0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 30 2c 20 30 2c  , 0, 0, 0,.0, 0,
1bd0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1be0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
1bf0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 30  0, 0, 0, 0, 0,.0
1c00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
1c10: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
1c20: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1c30: 30 2c 0a 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0,.0, 0, 0, 0, 0
1c40: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
1c50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
1c60: 20 30 2c 20 30 2c 0a 30 2c 20 30 2c 20 30 2c 20   0, 0,.0, 0, 0, 
1c70: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
1c80: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
1c90: 2c 20 30 2c 20 30 2c 20 30 2c 0a 30 2c 20 30 2c  , 0, 0, 0,.0, 0,
1ca0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1cb0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
1cc0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 0a  0, 0, 0, 0, 0,..
1cd0: 2f 2a 20 31 30 77 77 77 77 77 77 20 2a 2f 0a 34  /* 10wwwwww */.4
1ce0: 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c  , 4, 4, 4, 4, 4,
1cf0: 20 34 2c 20 34 2c 20 20 20 20 20 34 2c 20 34 2c   4, 4,     4, 4,
1d00: 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20   4, 4, 4, 4, 4, 
1d10: 34 2c 0a 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34  4,.4, 4, 4, 4, 4
1d20: 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20 20 20 34  , 4, 4, 4,     4
1d30: 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c  , 4, 4, 4, 4, 4,
1d40: 20 34 2c 20 34 2c 0a 34 2c 20 34 2c 20 34 2c 20   4, 4,.4, 4, 4, 
1d50: 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20  4, 4, 4, 4, 4,  
1d60: 20 20 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34     4, 4, 4, 4, 4
1d70: 2c 20 34 2c 20 34 2c 20 34 2c 0a 34 2c 20 34 2c  , 4, 4, 4,.4, 4,
1d80: 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20   4, 4, 4, 4, 4, 
1d90: 34 2c 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20  4,     4, 4, 4, 
1da0: 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 0a 0a  4, 4, 4, 4, 4,..
1db0: 2f 2a 20 31 31 30 79 79 79 79 79 20 2a 2f 0a 31  /* 110yyyyy */.1
1dc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
1dd0: 20 31 2c 20 31 2c 20 20 20 20 20 31 2c 20 31 2c   1, 1,     1, 1,
1de0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
1df0: 31 2c 0a 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1,.1, 1, 1, 1, 1
1e00: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 20 20 31  , 1, 1, 1,     1
1e10: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
1e20: 20 31 2c 20 31 2c 0a 0a 2f 2a 20 31 31 31 30 7a   1, 1,../* 1110z
1e30: 7a 7a 7a 20 2a 2f 0a 32 2c 20 32 2c 20 32 2c 20  zzz */.2, 2, 2, 
1e40: 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20  2, 2, 2, 2, 2,  
1e50: 20 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32     2, 2, 2, 2, 2
1e60: 2c 20 32 2c 20 32 2c 20 32 2c 0a 0a 2f 2a 20 31  , 2, 2, 2,../* 1
1e70: 31 31 31 30 79 79 79 20 2a 2f 0a 33 2c 20 33 2c  1110yyy */.3, 3,
1e80: 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20   3, 3, 3, 3, 3, 
1e90: 33 2c 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20  3,     4, 4, 4, 
1ea0: 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 0a 7d  4, 4, 4, 4, 4,.}
1eb0: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 74  ;.../*.** This t
1ec0: 61 62 6c 65 20 6d 61 70 73 20 66 72 6f 6d 20 74  able maps from t
1ed0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 72 61  he number of tra
1ee0: 69 6c 69 6e 67 20 62 79 74 65 73 20 69 6e 20 61  iling bytes in a
1ef0: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
1f00: 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  .** to an intege
1f10: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
1f20: 69 73 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  is effectively c
1f30: 61 6c 63 75 6c 61 74 65 64 20 66 6f 72 20 65 61  alculated for ea
1f40: 63 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  ch character.** 
1f50: 72 65 61 64 20 62 79 20 61 20 6e 61 69 76 65 20  read by a naive 
1f60: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1f70: 66 20 61 20 55 54 46 2d 38 20 63 68 61 72 61 63  f a UTF-8 charac
1f80: 74 65 72 20 72 65 61 64 65 72 2e 20 54 68 65 20  ter reader. The 
1f90: 63 6f 64 65 0a 2a 2a 20 69 6e 20 74 68 65 20 52  code.** in the R
1fa0: 45 41 44 5f 55 54 46 38 20 6d 61 63 72 6f 20 65  EAD_UTF8 macro e
1fb0: 78 70 6c 61 69 6e 73 20 74 68 69 6e 67 73 20 62  xplains things b
1fc0: 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  est..*/.static c
1fd0: 6f 6e 73 74 20 69 6e 74 20 78 74 72 61 5f 75 74  onst int xtra_ut
1fe0: 66 38 5f 62 69 74 73 5b 5d 20 3d 20 20 7b 0a 20  f8_bits[] =  {. 
1ff0: 20 30 2c 0a 20 20 31 32 34 31 36 2c 20 20 20 20   0,.  12416,    
2000: 20 20 20 20 20 20 2f 2a 20 28 30 78 43 30 20 3c        /* (0xC0 <
2010: 3c 20 36 29 20 2b 20 28 30 78 38 30 29 20 2a 2f  < 6) + (0x80) */
2020: 0a 20 20 39 32 35 38 32 34 2c 20 20 20 20 20 20  .  925824,      
2030: 20 20 20 2f 2a 20 28 30 78 45 30 20 3c 3c 20 31     /* (0xE0 << 1
2040: 32 29 20 2b 20 28 30 78 38 30 20 3c 3c 20 36 29  2) + (0x80 << 6)
2050: 20 2b 20 28 30 78 38 30 29 20 2a 2f 0a 20 20 36   + (0x80) */.  6
2060: 33 34 34 37 31 36 38 20 20 20 20 20 20 20 20 2f  3447168        /
2070: 2a 20 28 30 78 46 30 20 3c 3c 20 31 38 29 20 2b  * (0xF0 << 18) +
2080: 20 28 30 78 38 30 20 3c 3c 20 31 32 29 20 2b 20   (0x80 << 12) + 
2090: 28 30 78 38 30 20 3c 3c 20 36 29 20 2b 20 30 78  (0x80 << 6) + 0x
20a0: 38 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  80 */.};../*.** 
20b0: 49 66 20 61 20 55 54 46 2d 38 20 63 68 61 72 61  If a UTF-8 chara
20c0: 63 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 4e 20  cter contains N 
20d0: 62 79 74 65 73 20 65 78 74 72 61 20 62 79 74 65  bytes extra byte
20e0: 73 20 28 4e 20 62 79 74 65 73 20 66 6f 6c 6c 6f  s (N bytes follo
20f0: 77 0a 2a 2a 20 74 68 65 20 69 6e 69 74 69 61 6c  w.** the initial
2100: 20 62 79 74 65 20 73 6f 20 74 68 61 74 20 74 68   byte so that th
2110: 65 20 74 6f 74 61 6c 20 63 68 61 72 61 63 74 65  e total characte
2120: 72 20 6c 65 6e 67 74 68 20 69 73 20 4e 2b 31 29  r length is N+1)
2130: 20 74 68 65 6e 0a 2a 2a 20 6d 61 73 6b 69 6e 67   then.** masking
2140: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 77   the character w
2150: 69 74 68 20 75 74 66 38 5f 6d 61 73 6b 5b 4e 5d  ith utf8_mask[N]
2160: 20 6d 75 73 74 20 70 72 6f 64 75 63 65 20 61 20   must produce a 
2170: 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 72 65 73 75  non-zero.** resu
2180: 6c 74 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  lt.  Otherwise, 
2190: 77 65 20 68 61 76 65 20 61 6e 20 28 69 6c 6c 65  we have an (ille
21a0: 67 61 6c 29 20 6f 76 65 72 6c 6f 6e 67 20 65 6e  gal) overlong en
21b0: 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  coding..*/.stati
21c0: 63 20 63 6f 6e 73 74 20 69 6e 74 20 75 74 66 5f  c const int utf_
21d0: 6d 61 73 6b 5b 5d 20 3d 20 7b 0a 20 20 30 78 30  mask[] = {.  0x0
21e0: 30 30 30 30 30 30 30 2c 0a 20 20 30 78 66 66 66  0000000,.  0xfff
21f0: 66 66 66 38 30 2c 0a 20 20 30 78 66 66 66 66 66  fff80,.  0xfffff
2200: 38 30 30 2c 0a 20 20 30 78 66 66 66 66 30 30 30  800,.  0xffff000
2210: 30 2c 0a 7d 3b 0a 0a 2f 2a 20 4c 4d 48 20 73 61  0,.};../* LMH sa
2220: 6c 76 61 67 65 64 20 66 72 6f 6d 20 73 71 6c 69  lvaged from sqli
2230: 74 65 33 20 33 2e 33 2e 31 33 20 73 6f 75 72 63  te3 3.3.13 sourc
2240: 65 20 63 6f 64 65 20 73 72 63 2f 75 74 66 2e 63  e code src/utf.c
2250: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4c 44 5f   */.#define OLD_
2260: 52 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20 63  READ_UTF8(zIn, c
2270: 29 20 7b 20 5c 0a 20 20 69 6e 74 20 78 74 72 61  ) { \.  int xtra
2280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
22b0: 20 63 20 3d 20 2a 28 7a 49 6e 29 2b 2b 3b 20 20   c = *(zIn)++;  
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 20 5c 0a 20 20 78 74 72 61 20 3d        \.  xtra =
22f0: 20 78 74 72 61 5f 75 74 66 38 5f 62 79 74 65 73   xtra_utf8_bytes
2300: 5b 63 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [c];            
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2320: 0a 20 20 73 77 69 74 63 68 28 20 78 74 72 61 20  .  switch( xtra 
2330: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 61          \.    ca
2360: 73 65 20 34 3a 20 63 20 3d 20 28 69 6e 74 29 30  se 4: c = (int)0
2370: 78 46 46 46 44 3b 20 62 72 65 61 6b 3b 20 20 20  xFFFD; break;   
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 5c 0a 20 20 20 20 63 61 73 65 20 33 3a 20 63   \.    case 3: c
23a0: 20 3d 20 28 63 3c 3c 36 29 20 2b 20 2a 28 7a 49   = (c<<6) + *(zI
23b0: 6e 29 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  n)++;           
23c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
23d0: 63 61 73 65 20 32 3a 20 63 20 3d 20 28 63 3c 3c  case 2: c = (c<<
23e0: 36 29 20 2b 20 2a 28 7a 49 6e 29 2b 2b 3b 20 20  6) + *(zIn)++;  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 5c 0a 20 20 20 20 63 61 73 65 20 31 3a     \.    case 1:
2410: 20 63 20 3d 20 28 63 3c 3c 36 29 20 2b 20 2a 28   c = (c<<6) + *(
2420: 7a 49 6e 29 2b 2b 3b 20 20 20 20 20 20 20 20 20  zIn)++;         
2430: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2440: 20 20 63 20 2d 3d 20 78 74 72 61 5f 75 74 66 38    c -= xtra_utf8
2450: 5f 62 69 74 73 5b 78 74 72 61 5d 3b 20 20 20 20  _bits[xtra];    
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 20 5c 0a 20 20 20 20 69 66 28 20 28       \.    if( (
2480: 75 74 66 5f 6d 61 73 6b 5b 78 74 72 61 5d 26 63  utf_mask[xtra]&c
2490: 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )==0            
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
24b0: 20 20 20 20 20 20 20 20 7c 7c 20 28 63 26 30 78          || (c&0x
24c0: 46 46 46 46 46 38 30 30 29 3d 3d 30 78 44 38 30  FFFFF800)==0xD80
24d0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
24e0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20         \.       
24f0: 20 7c 7c 20 28 63 26 30 78 46 46 46 46 46 46 46   || (c&0xFFFFFFF
2500: 45 29 3d 3d 30 78 46 46 46 45 20 29 7b 20 20 63  E)==0xFFFE ){  c
2510: 20 3d 20 30 78 46 46 46 44 3b 20 7d 20 20 20 20   = 0xFFFD; }    
2520: 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20  \.  }           
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 73 74           \.}..st
2560: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
2570: 52 65 61 64 55 74 66 38 28 63 6f 6e 73 74 20 75  ReadUtf8(const u
2580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 29  nsigned char *z)
2590: 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 4f 4c 44  {.  int c;.  OLD
25a0: 5f 52 45 41 44 5f 55 54 46 38 28 7a 2c 20 63 29  _READ_UTF8(z, c)
25b0: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
25c0: 0a 23 64 65 66 69 6e 65 20 53 4b 49 50 5f 55 54  .#define SKIP_UT
25d0: 46 38 28 7a 49 6e 29 20 7b 20 20 20 20 20 20 20  F8(zIn) {       
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 20 20 20 5c 0a 20 20 7a 49 6e 20          \.  zIn 
2600: 2b 3d 20 28 78 74 72 61 5f 75 74 66 38 5f 62 79  += (xtra_utf8_by
2610: 74 65 73 5b 2a 28 75 38 20 2a 29 7a 49 6e 5d 20  tes[*(u8 *)zIn] 
2620: 2b 20 31 29 3b 20 20 20 20 20 20 20 20 20 20 20  + 1);           
2630: 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 58 20 69 73   \.}../*.** X is
2640: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2650: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
2660: 61 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  a UTF-8 characte
2670: 72 2e 20 20 49 6e 63 72 65 6d 65 6e 74 0a 2a 2a  r.  Increment.**
2680: 20 58 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f   X so that it po
2690: 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74  ints to the next
26a0: 20 63 68 61 72 61 63 74 65 72 2e 20 20 54 68 69   character.  Thi
26b0: 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 72 69 67  s only works rig
26c0: 68 74 0a 2a 2a 20 69 66 20 58 20 70 6f 69 6e 74  ht.** if X point
26d0: 73 20 74 6f 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  s to a well-form
26e0: 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e  ed UTF-8 string.
26f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  .*/.#define sqli
2700: 74 65 4e 65 78 74 43 68 61 72 28 58 29 20 20 77  teNextChar(X)  w
2710: 68 69 6c 65 28 20 28 30 78 63 30 26 2a 2b 2b 28  hile( (0xc0&*++(
2720: 58 29 29 3d 3d 30 78 38 30 20 29 7b 7d 0a 23 64  X))==0x80 ){}.#d
2730: 65 66 69 6e 65 20 73 71 6c 69 74 65 43 68 61 72  efine sqliteChar
2740: 56 61 6c 28 58 29 20 20 20 73 71 6c 69 74 65 33  Val(X)   sqlite3
2750: 52 65 61 64 55 74 66 38 28 58 29 0a 0a 2f 2a 0a  ReadUtf8(X)../*.
2760: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6d 61 63  ** This is a mac
2770: 72 6f 20 74 68 61 74 20 66 61 63 69 6c 69 74 61  ro that facilita
2780: 74 65 73 20 77 72 69 74 74 69 6e 67 20 77 72 61  tes writting wra
2790: 70 70 65 72 73 20 66 6f 72 20 6d 61 74 68 2e 68  ppers for math.h
27a0: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 74   functions.** it
27b0: 20 63 72 65 61 74 65 73 20 63 6f 64 65 20 66 6f   creates code fo
27c0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r a function to 
27d0: 75 73 65 20 69 6e 20 53 51 6c 69 74 65 20 74 68  use in SQlite th
27e0: 61 74 20 67 65 74 73 20 6f 6e 65 20 6e 75 6d 65  at gets one nume
27f0: 72 69 63 20 69 6e 70 75 74 0a 2a 2a 20 61 6e 64  ric input.** and
2800: 20 72 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74   returns a float
2810: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e  ing point value.
2820: 0a 2a 2a 0a 2a 2a 20 43 6f 75 6c 64 20 68 61 76  .**.** Could hav
2830: 65 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74  e been implement
2840: 65 64 20 75 73 69 6e 67 20 70 6f 69 6e 74 65 72  ed using pointer
2850: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 73 20 62  s to functions b
2860: 75 74 20 74 68 69 73 20 77 61 79 20 69 74 27 73  ut this way it's
2870: 20 69 6e 6c 69 6e 65 0a 2a 2a 20 61 6e 64 20 74   inline.** and t
2880: 68 75 73 20 6d 6f 72 65 20 65 66 66 69 63 69 65  hus more efficie
2890: 6e 74 2e 20 4c 6f 77 65 72 20 2a 20 72 61 6e 6b  nt. Lower * rank
28a0: 69 6e 67 20 74 68 6f 75 67 68 2e 2e 2e 0a 2a 2a  ing though....**
28b0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a  .** Parameters:.
28c0: 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 66 75  ** name:      fu
28d0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 74 6f 20 64  nction name to d
28e0: 65 20 64 65 66 69 6e 65 64 20 28 65 67 3a 20 73  e defined (eg: s
28f0: 69 6e 46 75 6e 63 29 0a 2a 2a 20 66 75 6e 63 74  inFunc).** funct
2900: 69 6f 6e 3a 20 20 66 75 6e 63 74 69 6f 6e 20 64  ion:  function d
2910: 65 66 69 6e 65 64 20 69 6e 20 6d 61 74 68 2e 68  efined in math.h
2920: 20 74 6f 20 77 72 61 70 20 28 65 67 3a 20 73 69   to wrap (eg: si
2930: 6e 29 0a 2a 2a 20 64 6f 6d 61 69 6e 3a 20 20 20  n).** domain:   
2940: 20 62 6f 6f 6c 65 61 6e 20 63 6f 6e 64 69 74 69   boolean conditi
2950: 6f 6e 20 74 68 61 74 20 43 41 4e 27 54 20 68 61  on that CAN'T ha
2960: 70 70 65 6e 20 69 6e 20 74 65 72 6d 73 20 6f 66  ppen in terms of
2970: 20 74 68 65 20 69 6e 70 75 74 20 70 61 72 61 6d   the input param
2980: 65 74 65 72 20 72 56 61 6c 0a 2a 2a 20 20 20 20  eter rVal.**    
2990: 20 20 20 20 20 20 20 20 28 65 67 3a 20 72 76 61          (eg: rva
29a0: 6c 3c 30 20 66 6f 72 20 73 71 72 74 29 0a 2a 2f  l<0 for sqrt).*/
29b0: 0a 2f 2a 20 4c 4d 48 20 32 30 30 37 2d 30 33 2d  ./* LMH 2007-03-
29c0: 32 35 20 43 68 61 6e 67 65 64 20 74 6f 20 75 73  25 Changed to us
29d0: 65 20 65 72 72 6e 6f 20 61 6e 64 20 72 65 6d 6f  e errno and remo
29e0: 76 65 20 64 6f 6d 61 69 6e 3b 20 6e 6f 20 70 72  ve domain; no pr
29f0: 65 2d 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 65  e-checking for e
2a00: 72 72 6f 72 73 2e 20 2a 2f 0a 23 64 65 66 69 6e  rrors. */.#defin
2a10: 65 20 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50 5f  e GEN_MATH_WRAP_
2a20: 44 4f 55 42 4c 45 5f 31 28 6e 61 6d 65 2c 20 66  DOUBLE_1(name, f
2a30: 75 6e 63 74 69 6f 6e 29 20 5c 0a 73 74 61 74 69  unction) \.stati
2a40: 63 20 76 6f 69 64 20 6e 61 6d 65 28 73 71 6c 69  c void name(sqli
2a50: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
2a60: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
2a70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2a80: 61 72 67 76 29 7b 5c 0a 20 20 64 6f 75 62 6c 65  argv){\.  double
2a90: 20 72 56 61 6c 20 3d 20 30 2e 30 2c 20 76 61 6c   rVal = 0.0, val
2aa0: 3b 5c 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;\.  assert( arg
2ab0: 63 3d 3d 31 20 29 3b 5c 0a 20 20 73 77 69 74 63  c==1 );\.  switc
2ac0: 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  h( sqlite3_value
2ad0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29  _type(argv[0]) )
2ae0: 7b 5c 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  {\.    case SQLI
2af0: 54 45 5f 4e 55 4c 4c 3a 20 7b 5c 0a 20 20 20 20  TE_NULL: {\.    
2b00: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2b10: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 5c  _null(context);\
2b20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 0a 20  .      break;\. 
2b30: 20 20 20 7d 5c 0a 20 20 20 20 64 65 66 61 75 6c     }\.    defaul
2b40: 74 3a 20 7b 5c 0a 20 20 20 20 20 20 72 56 61 6c  t: {\.      rVal
2b50: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2b60: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29  _double(argv[0])
2b70: 3b 5c 0a 20 20 20 20 20 20 65 72 72 6e 6f 20 3d  ;\.      errno =
2b80: 20 30 3b 5c 0a 20 20 20 20 20 20 76 61 6c 20 3d   0;\.      val =
2b90: 20 66 75 6e 63 74 69 6f 6e 28 72 56 61 6c 29 3b   function(rVal);
2ba0: 5c 0a 20 20 20 20 20 20 69 66 20 28 65 72 72 6e  \.      if (errn
2bb0: 6f 20 3d 3d 20 30 29 20 7b 5c 0a 20 20 20 20 20  o == 0) {\.     
2bc0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2bd0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
2be0: 2c 20 76 61 6c 29 3b 5c 0a 20 20 20 20 20 20 7d  , val);\.      }
2bf0: 20 65 6c 73 65 20 7b 5c 0a 20 20 20 20 20 20 20   else {\.       
2c00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2c10: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 73  error(context, s
2c20: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20  trerror(errno), 
2c30: 65 72 72 6e 6f 29 3b 5c 0a 20 20 20 20 20 20 7d  errno);\.      }
2c40: 5c 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 0a  \.      break;\.
2c50: 20 20 20 20 7d 5c 0a 20 20 7d 5c 0a 7d 5c 0a 0a      }\.  }\.}\..
2c60: 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 6f  ./*.** Example o
2c70: 66 20 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50 5f  f GEN_MATH_WRAP_
2c80: 44 4f 55 42 4c 45 5f 31 20 75 73 61 67 65 0a 2a  DOUBLE_1 usage.*
2c90: 2a 20 74 68 69 73 20 63 72 65 61 74 65 73 20 66  * this creates f
2ca0: 75 6e 63 74 69 6f 6e 20 73 71 72 74 46 75 6e 63  unction sqrtFunc
2cb0: 20 74 6f 20 77 72 61 70 20 74 68 65 20 6d 61 74   to wrap the mat
2cc0: 68 2e 68 20 73 74 61 6e 64 61 72 64 20 66 75 6e  h.h standard fun
2cd0: 63 74 69 6f 6e 20 73 71 72 74 28 78 29 3d 78 5e  ction sqrt(x)=x^
2ce0: 30 2e 35 0a 2a 2f 0a 47 45 4e 5f 4d 41 54 48 5f  0.5.*/.GEN_MATH_
2cf0: 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31 28 73 71  WRAP_DOUBLE_1(sq
2d00: 72 74 46 75 6e 63 2c 20 73 71 72 74 29 0a 0a 2f  rtFunc, sqrt)../
2d10: 2a 20 74 72 69 67 6e 6f 6d 65 74 72 69 63 20 66  * trignometric f
2d20: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 47 45 4e 5f  unctions */.GEN_
2d30: 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45  MATH_WRAP_DOUBLE
2d40: 5f 31 28 61 63 6f 73 46 75 6e 63 2c 20 61 63 6f  _1(acosFunc, aco
2d50: 73 29 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50  s).GEN_MATH_WRAP
2d60: 5f 44 4f 55 42 4c 45 5f 31 28 61 73 69 6e 46 75  _DOUBLE_1(asinFu
2d70: 6e 63 2c 20 61 73 69 6e 29 0a 47 45 4e 5f 4d 41  nc, asin).GEN_MA
2d80: 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31  TH_WRAP_DOUBLE_1
2d90: 28 61 74 61 6e 46 75 6e 63 2c 20 61 74 61 6e 29  (atanFunc, atan)
2da0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 66 20  ../*.** Many of 
2db0: 73 79 73 74 65 6d 73 20 64 6f 6e 27 74 20 68 61  systems don't ha
2dc0: 76 65 20 69 6e 76 65 72 73 65 20 68 79 70 65 72  ve inverse hyper
2dd0: 62 6f 6c 69 63 20 74 72 69 67 20 66 75 6e 63 74  bolic trig funct
2de0: 69 6f 6e 73 20 73 6f 20 74 68 69 73 20 77 69 6c  ions so this wil
2df0: 6c 20 65 6d 75 6c 61 74 65 0a 2a 2a 20 74 68 65  l emulate.** the
2e00: 6d 20 6f 6e 20 74 68 6f 73 65 20 73 79 73 74 65  m on those syste
2e10: 6d 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 6c  ms in terms of l
2e20: 6f 67 20 61 6e 64 20 73 71 72 74 20 28 66 6f 72  og and sqrt (for
2e30: 6d 75 6c 61 73 20 61 72 65 20 74 6f 6f 20 74 72  mulas are too tr
2e40: 69 76 69 61 6c 20 74 6f 20 64 65 6d 61 6e 64 0a  ivial to demand.
2e50: 2a 2a 20 77 72 69 74 74 65 6e 20 70 72 6f 6f 66  ** written proof
2e60: 20 68 65 72 65 29 0a 2a 2f 0a 0a 23 69 66 6e 64   here).*/..#ifnd
2e70: 65 66 20 48 41 56 45 5f 41 43 4f 53 48 0a 73 74  ef HAVE_ACOSH.st
2e80: 61 74 69 63 20 64 6f 75 62 6c 65 20 61 63 6f 73  atic double acos
2e90: 68 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20 20 72  h(double x){.  r
2ea0: 65 74 75 72 6e 20 6c 6f 67 28 78 20 2b 20 73 71  eturn log(x + sq
2eb0: 72 74 28 78 2a 78 20 2d 20 31 2e 30 29 29 3b 0a  rt(x*x - 1.0));.
2ec0: 7d 0a 23 65 6e 64 69 66 0a 0a 47 45 4e 5f 4d 41  }.#endif..GEN_MA
2ed0: 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31  TH_WRAP_DOUBLE_1
2ee0: 28 61 63 6f 73 68 46 75 6e 63 2c 20 61 63 6f 73  (acoshFunc, acos
2ef0: 68 29 0a 0a 23 69 66 6e 64 65 66 20 48 41 56 45  h)..#ifndef HAVE
2f00: 5f 41 53 49 4e 48 0a 73 74 61 74 69 63 20 64 6f  _ASINH.static do
2f10: 75 62 6c 65 20 61 73 69 6e 68 28 64 6f 75 62 6c  uble asinh(doubl
2f20: 65 20 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 6c  e x){.  return l
2f30: 6f 67 28 78 20 2b 20 73 71 72 74 28 78 2a 78 20  og(x + sqrt(x*x 
2f40: 2b 20 31 2e 30 29 29 3b 0a 7d 0a 23 65 6e 64 69  + 1.0));.}.#endi
2f50: 66 0a 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50  f..GEN_MATH_WRAP
2f60: 5f 44 4f 55 42 4c 45 5f 31 28 61 73 69 6e 68 46  _DOUBLE_1(asinhF
2f70: 75 6e 63 2c 20 61 73 69 6e 68 29 0a 0a 23 69 66  unc, asinh)..#if
2f80: 6e 64 65 66 20 48 41 56 45 5f 41 54 41 4e 48 0a  ndef HAVE_ATANH.
2f90: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 61 74  static double at
2fa0: 61 6e 68 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20  anh(double x){. 
2fb0: 20 72 65 74 75 72 6e 20 28 31 2e 30 2f 32 2e 30   return (1.0/2.0
2fc0: 29 2a 6c 6f 67 28 28 31 2b 78 29 2f 28 31 2d 78  )*log((1+x)/(1-x
2fd0: 29 29 20 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 47  )) ;.}.#endif..G
2fe0: 45 4e 5f 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55  EN_MATH_WRAP_DOU
2ff0: 42 4c 45 5f 31 28 61 74 61 6e 68 46 75 6e 63 2c  BLE_1(atanhFunc,
3000: 20 61 74 61 6e 68 29 0a 0a 2f 2a 0a 2a 2a 20 6d   atanh)../*.** m
3010: 61 74 68 2e 68 20 64 6f 65 73 6e 27 74 20 72 65  ath.h doesn't re
3020: 71 75 69 72 65 20 63 6f 74 20 28 63 6f 74 61 6e  quire cot (cotan
3030: 67 65 6e 74 29 20 73 6f 20 69 74 27 73 20 64 65  gent) so it's de
3040: 66 69 6e 65 64 20 68 65 72 65 0a 2a 2f 0a 73 74  fined here.*/.st
3050: 61 74 69 63 20 64 6f 75 62 6c 65 20 63 6f 74 28  atic double cot(
3060: 64 6f 75 62 6c 65 20 78 29 7b 0a 20 20 72 65 74  double x){.  ret
3070: 75 72 6e 20 31 2e 30 2f 74 61 6e 28 78 29 3b 0a  urn 1.0/tan(x);.
3080: 7d 0a 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50  }..GEN_MATH_WRAP
3090: 5f 44 4f 55 42 4c 45 5f 31 28 73 69 6e 46 75 6e  _DOUBLE_1(sinFun
30a0: 63 2c 20 73 69 6e 29 0a 47 45 4e 5f 4d 41 54 48  c, sin).GEN_MATH
30b0: 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31 28 63  _WRAP_DOUBLE_1(c
30c0: 6f 73 46 75 6e 63 2c 20 63 6f 73 29 0a 47 45 4e  osFunc, cos).GEN
30d0: 5f 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c  _MATH_WRAP_DOUBL
30e0: 45 5f 31 28 74 61 6e 46 75 6e 63 2c 20 74 61 6e  E_1(tanFunc, tan
30f0: 29 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50 5f  ).GEN_MATH_WRAP_
3100: 44 4f 55 42 4c 45 5f 31 28 63 6f 74 46 75 6e 63  DOUBLE_1(cotFunc
3110: 2c 20 63 6f 74 29 0a 0a 73 74 61 74 69 63 20 64  , cot)..static d
3120: 6f 75 62 6c 65 20 63 6f 74 68 28 64 6f 75 62 6c  ouble coth(doubl
3130: 65 20 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 31  e x){.  return 1
3140: 2e 30 2f 74 61 6e 68 28 78 29 3b 0a 7d 0a 0a 2f  .0/tanh(x);.}../
3150: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
3160: 73 20 64 6f 6e 27 74 20 68 61 76 65 20 68 79 70  s don't have hyp
3170: 65 72 62 6f 6c 69 63 20 74 72 69 67 6f 6e 6f 6d  erbolic trigonom
3180: 65 74 72 69 63 20 66 75 6e 63 74 69 6f 6e 73 20  etric functions 
3190: 73 6f 20 74 68 69 73 20 77 69 6c 6c 20 65 6d 75  so this will emu
31a0: 6c 61 74 65 0a 2a 2a 20 74 68 65 6d 20 6f 6e 20  late.** them on 
31b0: 74 68 6f 73 65 20 73 79 73 74 65 6d 73 20 64 69  those systems di
31c0: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
31d0: 64 65 66 69 6e 69 74 69 6f 6e 20 69 6e 20 74 65  definition in te
31e0: 72 6d 73 20 6f 66 20 65 78 70 0a 2a 2f 0a 23 69  rms of exp.*/.#i
31f0: 66 6e 64 65 66 20 48 41 56 45 5f 53 49 4e 48 0a  fndef HAVE_SINH.
3200: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 73 69  static double si
3210: 6e 68 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20 20  nh(double x){.  
3220: 72 65 74 75 72 6e 20 28 65 78 70 28 78 29 2d 65  return (exp(x)-e
3230: 78 70 28 2d 78 29 29 2f 32 2e 30 3b 0a 7d 0a 23  xp(-x))/2.0;.}.#
3240: 65 6e 64 69 66 0a 0a 47 45 4e 5f 4d 41 54 48 5f  endif..GEN_MATH_
3250: 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31 28 73 69  WRAP_DOUBLE_1(si
3260: 6e 68 46 75 6e 63 2c 20 73 69 6e 68 29 0a 0a 23  nhFunc, sinh)..#
3270: 69 66 6e 64 65 66 20 48 41 56 45 5f 43 4f 53 48  ifndef HAVE_COSH
3280: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 63  .static double c
3290: 6f 73 68 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20  osh(double x){. 
32a0: 20 72 65 74 75 72 6e 20 28 65 78 70 28 78 29 2b   return (exp(x)+
32b0: 65 78 70 28 2d 78 29 29 2f 32 2e 30 3b 0a 7d 0a  exp(-x))/2.0;.}.
32c0: 23 65 6e 64 69 66 0a 0a 47 45 4e 5f 4d 41 54 48  #endif..GEN_MATH
32d0: 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31 28 63  _WRAP_DOUBLE_1(c
32e0: 6f 73 68 46 75 6e 63 2c 20 63 6f 73 68 29 0a 0a  oshFunc, cosh)..
32f0: 23 69 66 6e 64 65 66 20 48 41 56 45 5f 54 41 4e  #ifndef HAVE_TAN
3300: 48 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  H.static double 
3310: 74 61 6e 68 28 64 6f 75 62 6c 65 20 78 29 7b 0a  tanh(double x){.
3320: 20 20 72 65 74 75 72 6e 20 73 69 6e 68 28 78 29    return sinh(x)
3330: 2f 63 6f 73 68 28 78 29 3b 0a 7d 0a 23 65 6e 64  /cosh(x);.}.#end
3340: 69 66 0a 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41  if..GEN_MATH_WRA
3350: 50 5f 44 4f 55 42 4c 45 5f 31 28 74 61 6e 68 46  P_DOUBLE_1(tanhF
3360: 75 6e 63 2c 20 74 61 6e 68 29 0a 0a 47 45 4e 5f  unc, tanh)..GEN_
3370: 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45  MATH_WRAP_DOUBLE
3380: 5f 31 28 63 6f 74 68 46 75 6e 63 2c 20 63 6f 74  _1(cothFunc, cot
3390: 68 29 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 73  h)../*.** Some s
33a0: 79 73 74 65 6d 73 20 6c 61 63 6b 20 6c 6f 67 20  ystems lack log 
33b0: 69 6e 20 62 61 73 65 20 31 30 2e 20 54 68 69 73  in base 10. This
33c0: 20 77 69 6c 6c 20 65 6d 75 6c 61 74 65 20 69 74   will emulate it
33d0: 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 48 41 56  .*/..#ifndef HAV
33e0: 45 5f 4c 4f 47 31 30 0a 73 74 61 74 69 63 20 64  E_LOG10.static d
33f0: 6f 75 62 6c 65 20 6c 6f 67 31 30 28 64 6f 75 62  ouble log10(doub
3400: 6c 65 20 78 29 7b 0a 20 20 73 74 61 74 69 63 20  le x){.  static 
3410: 64 6f 75 62 6c 65 20 6c 31 30 20 3d 20 2d 31 2e  double l10 = -1.
3420: 30 3b 0a 20 20 69 66 28 20 6c 31 30 3c 30 2e 30  0;.  if( l10<0.0
3430: 20 29 7b 0a 20 20 20 20 6c 31 30 20 3d 20 6c 6f   ){.    l10 = lo
3440: 67 28 31 30 2e 30 29 3b 0a 20 20 7d 0a 20 20 72  g(10.0);.  }.  r
3450: 65 74 75 72 6e 20 6c 6f 67 28 78 29 2f 6c 31 30  eturn log(x)/l10
3460: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 47 45 4e 5f  ;.}.#endif..GEN_
3470: 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45  MATH_WRAP_DOUBLE
3480: 5f 31 28 6c 6f 67 46 75 6e 63 2c 20 6c 6f 67 29  _1(logFunc, log)
3490: 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50 5f 44  .GEN_MATH_WRAP_D
34a0: 4f 55 42 4c 45 5f 31 28 6c 6f 67 31 30 46 75 6e  OUBLE_1(log10Fun
34b0: 63 2c 20 6c 6f 67 31 30 29 0a 47 45 4e 5f 4d 41  c, log10).GEN_MA
34c0: 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31  TH_WRAP_DOUBLE_1
34d0: 28 65 78 70 46 75 6e 63 2c 20 65 78 70 29 0a 0a  (expFunc, exp)..
34e0: 2f 2a 0a 2a 2a 20 46 61 6c 6c 62 61 63 6b 20 66  /*.** Fallback f
34f0: 6f 72 20 73 79 73 74 65 6d 73 20 77 68 65 72 65  or systems where
3500: 20 6d 61 74 68 2e 68 20 64 6f 65 73 6e 27 74 20   math.h doesn't 
3510: 64 65 66 69 6e 65 20 4d 5f 50 49 0a 2a 2f 0a 23  define M_PI.*/.#
3520: 75 6e 64 65 66 20 4d 5f 50 49 0a 23 69 66 6e 64  undef M_PI.#ifnd
3530: 65 66 20 4d 5f 50 49 0a 2f 2a 0a 2a 2a 20 73 74  ef M_PI./*.** st
3540: 61 74 69 63 20 64 6f 75 62 6c 65 20 50 49 20 3d  atic double PI =
3550: 20 61 63 6f 73 28 2d 31 2e 30 29 3b 0a 2a 2a 20   acos(-1.0);.** 
3560: 23 64 65 66 69 6e 65 20 4d 5f 50 49 20 28 50 49  #define M_PI (PI
3570: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 5f 50  ).*/.#define M_P
3580: 49 20 33 2e 31 34 31 35 39 32 36 35 33 35 38 39  I 3.141592653589
3590: 37 39 33 32 33 38 34 36 0a 23 65 6e 64 69 66 0a  79323846.#endif.
35a0: 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 44 65 67 72  ./* Convert Degr
35b0: 65 65 73 20 69 6e 74 6f 20 52 61 64 69 61 6e 73  ees into Radians
35c0: 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c   */.static doubl
35d0: 65 20 64 65 67 32 72 61 64 28 64 6f 75 62 6c 65  e deg2rad(double
35e0: 20 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 78 2a   x){.  return x*
35f0: 4d 5f 50 49 2f 31 38 30 2e 30 3b 0a 7d 0a 0a 2f  M_PI/180.0;.}../
3600: 2a 20 43 6f 6e 76 65 72 74 20 52 61 64 69 61 6e  * Convert Radian
3610: 73 20 69 6e 74 6f 20 44 65 67 72 65 65 73 20 2a  s into Degrees *
3620: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
3630: 72 61 64 32 64 65 67 28 64 6f 75 62 6c 65 20 78  rad2deg(double x
3640: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 38 30 2e  ){.  return 180.
3650: 30 2a 78 2f 4d 5f 50 49 3b 0a 7d 0a 0a 47 45 4e  0*x/M_PI;.}..GEN
3660: 5f 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c  _MATH_WRAP_DOUBL
3670: 45 5f 31 28 72 61 64 32 64 65 67 46 75 6e 63 2c  E_1(rad2degFunc,
3680: 20 72 61 64 32 64 65 67 29 0a 47 45 4e 5f 4d 41   rad2deg).GEN_MA
3690: 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31  TH_WRAP_DOUBLE_1
36a0: 28 64 65 67 32 72 61 64 46 75 6e 63 2c 20 64 65  (deg2radFunc, de
36b0: 67 32 72 61 64 29 0a 0a 2f 2a 20 63 6f 6e 73 74  g2rad)../* const
36c0: 61 6e 74 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  ant function tha
36d0: 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  t returns the va
36e0: 6c 75 65 20 6f 66 20 50 49 3d 33 2e 31 34 31 35  lue of PI=3.1415
36f0: 2e 2e 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ... */.static vo
3700: 69 64 20 70 69 46 75 6e 63 28 73 71 6c 69 74 65  id piFunc(sqlite
3710: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3720: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
3730: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
3740: 67 76 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  gv){.  sqlite3_r
3750: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
3760: 74 65 78 74 2c 20 4d 5f 50 49 29 3b 0a 7d 0a 0a  text, M_PI);.}..
3770: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 73  /*.** Implements
3780: 20 74 68 65 20 73 71 72 74 20 66 75 6e 63 74 69   the sqrt functi
3790: 6f 6e 2c 20 69 74 20 68 61 73 20 74 68 65 20 70  on, it has the p
37a0: 65 63 75 6c 69 61 72 69 74 79 20 6f 66 20 72 65  eculiarity of re
37b0: 74 75 72 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67  turning an integ
37c0: 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 74  er when the.** t
37d0: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
37e0: 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 53 69  n integer..** Si
37f0: 6e 63 65 20 53 51 4c 69 74 65 20 69 73 6e 27 74  nce SQLite isn't
3800: 20 73 74 72 6f 6e 67 6c 79 20 74 79 70 65 64 20   strongly typed 
3810: 28 61 6c 6d 6f 73 74 20 75 6e 74 79 70 65 64 20  (almost untyped 
3820: 61 63 74 75 61 6c 6c 79 29 20 74 68 69 73 20 69  actually) this i
3830: 73 20 61 20 62 69 74 20 70 65 64 61 6e 74 69 63  s a bit pedantic
3840: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3850: 73 71 75 61 72 65 46 75 6e 63 28 73 71 6c 69 74  squareFunc(sqlit
3860: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3870: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
3880: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3890: 72 67 76 29 7b 0a 20 20 69 36 34 20 69 56 61 6c  rgv){.  i64 iVal
38a0: 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 72   = 0;.  double r
38b0: 56 61 6c 20 3d 20 30 2e 30 3b 0a 20 20 61 73 73  Val = 0.0;.  ass
38c0: 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a  ert( argc==2 );.
38d0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
38e0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
38f0: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
3900: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
3910: 3a 20 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d  : {.      iVal =
3920: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
3930: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
3940: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3950: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
3960: 74 2c 20 69 56 61 6c 2a 69 56 61 6c 29 3b 0a 20  t, iVal*iVal);. 
3970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3980: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3990: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
39a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
39b0: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
39c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
39d0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
39e0: 20 20 20 20 20 20 72 56 61 6c 20 3d 20 73 71 6c        rVal = sql
39f0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
3a00: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  e(argv[0]);.    
3a10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3a20: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
3a30: 20 72 56 61 6c 2a 72 56 61 6c 29 3b 0a 20 20 20   rVal*rVal);.   
3a40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3a50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 61    }.}../*.** Wra
3a60: 70 73 20 74 68 65 20 70 6f 77 20 6d 61 74 68 2e  ps the pow math.
3a70: 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 57 68  h function.** Wh
3a80: 65 6e 20 62 6f 74 68 20 74 68 65 20 62 61 73 65  en both the base
3a90: 20 61 6e 64 20 74 68 65 20 65 78 70 6f 6e 65 6e   and the exponen
3aa0: 74 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 74  t are integers t
3ab0: 68 65 20 72 65 73 75 6c 74 20 73 68 6f 75 6c 64  he result should
3ac0: 20 62 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 28   be integer.** (
3ad0: 73 65 65 20 73 71 72 74 20 6a 75 73 74 20 62 65  see sqrt just be
3ae0: 66 6f 72 65 20 74 68 69 73 29 2e 20 48 65 72 65  fore this). Here
3af0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
3b00: 6c 77 61 79 73 20 64 6f 75 62 6c 65 0a 2a 2f 0a  lways double.*/.
3b10: 2f 2a 20 4c 4d 48 20 32 30 30 37 2d 30 33 2d 32  /* LMH 2007-03-2
3b20: 35 20 43 68 61 6e 67 65 64 20 74 6f 20 75 73 65  5 Changed to use
3b30: 20 65 72 72 6e 6f 3b 20 6e 6f 20 70 72 65 2d 63   errno; no pre-c
3b40: 68 65 63 6b 69 6e 67 20 66 6f 72 20 65 72 72 6f  hecking for erro
3b50: 72 73 2e 20 20 41 6c 73 6f 20 72 65 6d 6f 76 65  rs.  Also remove
3b60: 73 0a 20 20 62 75 74 20 74 68 61 74 20 77 61 73  s.  but that was
3b70: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
3b80: 70 72 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61  pre-checking tha
3b90: 74 20 63 61 6c 6c 65 64 20 73 71 6c 69 74 65 33  t called sqlite3
3ba0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 6f 6e  _result_error on
3bb0: 0a 20 20 61 20 6e 6f 6e 2d 70 6f 73 69 74 69 76  .  a non-positiv
3bc0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
3bd0: 2c 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  , which is not a
3be0: 6c 77 61 79 73 20 61 6e 20 65 72 72 6f 72 2e 20  lways an error. 
3bf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
3c00: 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33  owerFunc(sqlite3
3c10: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
3c20: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
3c30: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
3c40: 76 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72 31 20  v){.  double r1 
3c50: 3d 20 30 2e 30 3b 0a 20 20 64 6f 75 62 6c 65 20  = 0.0;.  double 
3c60: 72 32 20 3d 20 30 2e 30 3b 0a 20 20 64 6f 75 62  r2 = 0.0;.  doub
3c70: 6c 65 20 76 61 6c 3b 0a 0a 20 20 61 73 73 65 72  le val;..  asser
3c80: 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 0a 20  t( argc==2 );.. 
3c90: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
3ca0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
3cb0: 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20   == SQLITE_NULL 
3cc0: 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  || sqlite3_value
3cd0: 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 20 3d  _type(argv[1]) =
3ce0: 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  = SQLITE_NULL ){
3cf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
3d00: 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74  ult_null(context
3d10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3d20: 72 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  r1 = sqlite3_val
3d30: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
3d40: 5d 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  ]);.    r2 = sql
3d50: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
3d60: 65 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  e(argv[1]);.    
3d70: 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 76  errno = 0;.    v
3d80: 61 6c 20 3d 20 70 6f 77 28 72 31 2c 72 32 29 3b  al = pow(r1,r2);
3d90: 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f 20 3d  .    if (errno =
3da0: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 73 71 6c  = 0) {.      sql
3db0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
3dc0: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 76 61 6c 29  le(context, val)
3dd0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
3de0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3df0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
3e00: 74 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e  t, strerror(errn
3e10: 6f 29 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  o), errno);.    
3e20: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61  }.  }.}../*.** a
3e30: 74 61 6e 32 20 77 72 61 70 70 65 72 0a 2a 2f 0a  tan2 wrapper.*/.
3e40: 73 74 61 74 69 63 20 76 6f 69 64 20 61 74 6e 32  static void atn2
3e50: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
3e60: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
3e70: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
3e80: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
3e90: 20 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 30 2e    double r1 = 0.
3ea0: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 72 32 20 3d  0;.  double r2 =
3eb0: 20 30 2e 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   0.0;..  assert(
3ec0: 20 61 72 67 63 3d 3d 32 20 29 3b 0a 0a 20 20 69   argc==2 );..  i
3ed0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
3ee0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 3d  _type(argv[0]) =
3ef0: 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c 7c  = SQLITE_NULL ||
3f00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
3f10: 79 70 65 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  ype(argv[1]) == 
3f20: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
3f30: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3f40: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
3f50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 31  .  }else{.    r1
3f60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3f70: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29  _double(argv[0])
3f80: 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
3f90: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
3fa0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 73 71  argv[1]);.    sq
3fb0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
3fc0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 61 74 61  ble(context, ata
3fd0: 6e 32 28 72 31 2c 72 32 29 29 3b 0a 20 20 7d 0a  n2(r1,r2));.  }.
3fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
3ff0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
4000: 69 67 6e 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a  ign() function.*
4010: 2a 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20  * return one of 
4020: 33 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 20  3 possibilities 
4030: 2b 31 2c 30 20 6f 72 20 2d 31 20 77 68 65 6e 20  +1,0 or -1 when 
4040: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
4050: 72 65 73 70 65 63 74 69 76 65 6c 79 0a 2a 2a 20  respectively.** 
4060: 70 6f 73 69 74 69 76 65 2c 20 30 20 6f 72 20 6e  positive, 0 or n
4070: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 57 68 65 6e  egative..** When
4080: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
4090: 20 4e 55 4c 4c 20 74 68 65 20 72 65 73 75 6c 74   NULL the result
40a0: 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 20 28 63   is also NULL (c
40b0: 6f 6d 70 6c 65 74 6c 79 20 63 6f 6e 76 65 6e 74  ompletly convent
40c0: 69 6f 6e 61 6c 29 0a 2a 2f 0a 73 74 61 74 69 63  ional).*/.static
40d0: 20 76 6f 69 64 20 73 69 67 6e 46 75 6e 63 28 73   void signFunc(s
40e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
40f0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
4100: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
4110: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 64 6f 75 62   **argv){.  doub
4120: 6c 65 20 72 56 61 6c 3d 30 2e 30 3b 0a 20 20 69  le rVal=0.0;.  i
4130: 36 34 20 69 56 61 6c 3d 30 3b 0a 20 20 61 73 73  64 iVal=0;.  ass
4140: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a  ert( argc==1 );.
4150: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
4160: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
4170: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
4180: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
4190: 3a 20 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d  : {.      iVal =
41a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
41b0: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
41c0: 20 20 20 20 20 69 56 61 6c 20 3d 20 28 20 69 56       iVal = ( iV
41d0: 61 6c 20 3e 20 30 29 20 3f 20 31 3a 20 28 20 69  al > 0) ? 1: ( i
41e0: 56 61 6c 20 3c 20 30 20 29 20 3f 20 2d 31 3a 20  Val < 0 ) ? -1: 
41f0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
4200: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
4210: 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20  ntext, iVal);.  
4220: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4230: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4240: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
4250: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
4260: 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ll(context);.   
4270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4280: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4290: 2f 2a 20 32 6e 64 20 63 68 61 6e 67 65 20 62 65  /* 2nd change be
42a0: 6c 6f 77 2e 20 4c 69 6e 65 20 66 6f 72 20 61 62  low. Line for ab
42b0: 73 20 77 61 73 3a 20 69 66 28 20 72 56 61 6c 3c  s was: if( rVal<
42c0: 30 20 29 20 72 56 61 6c 20 3d 20 72 56 61 6c 20  0 ) rVal = rVal 
42d0: 2a 20 2d 31 2e 30 3b 20 20 2a 2f 0a 0a 20 20 20  * -1.0;  */..   
42e0: 20 20 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65     rVal = sqlite
42f0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
4300: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 72  rgv[0]);.      r
4310: 56 61 6c 20 3d 20 28 20 72 56 61 6c 20 3e 20 30  Val = ( rVal > 0
4320: 29 20 3f 20 31 3a 20 28 20 72 56 61 6c 20 3c 20  ) ? 1: ( rVal < 
4330: 30 20 29 20 3f 20 2d 31 3a 20 30 3b 0a 20 20 20  0 ) ? -1: 0;.   
4340: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4350: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
4360: 2c 20 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 62  , rVal);.      b
4370: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4380: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 6d 61 6c 6c 65  }.../*.** smalle
4390: 73 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  st integer value
43a0: 20 6e 6f 74 20 6c 65 73 73 20 74 68 61 6e 20 61   not less than a
43b0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
43c0: 63 20 76 6f 69 64 20 63 65 69 6c 46 75 6e 63 28  c void ceilFunc(
43d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
43e0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
43f0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
4400: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 64 6f 75  e **argv){.  dou
4410: 62 6c 65 20 72 56 61 6c 3d 30 2e 30 3b 0a 20 20  ble rVal=0.0;.  
4420: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
4430: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  );.  switch( sql
4440: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
4450: 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20  argv[0]) ){.    
4460: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
4470: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 36 34  GER: {.      i64
4480: 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iVal = sqlite3_
4490: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
44a0: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  [0]);.      sqli
44b0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
44c0: 28 63 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b  (context, iVal);
44d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
44e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
44f0: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
4500: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4510: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a  _null(context);.
4520: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4530: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
4540: 7b 0a 20 20 20 20 20 20 72 56 61 6c 20 3d 20 73  {.      rVal = s
4550: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
4560: 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
4570: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4580: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
4590: 2c 20 28 69 36 34 29 20 63 65 69 6c 28 72 56 61  , (i64) ceil(rVa
45a0: 6c 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  l));.      break
45b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
45c0: 2a 0a 2a 2a 20 6c 61 72 67 65 73 74 20 69 6e 74  *.** largest int
45d0: 65 67 65 72 20 76 61 6c 75 65 20 6e 6f 74 20 67  eger value not g
45e0: 72 65 61 74 65 72 20 74 68 61 6e 20 61 72 67 75  reater than argu
45f0: 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ment.*/.static v
4600: 6f 69 64 20 66 6c 6f 6f 72 46 75 6e 63 28 73 71  oid floorFunc(sq
4610: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
4620: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
4630: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
4640: 2a 2a 61 72 67 76 29 7b 0a 20 20 64 6f 75 62 6c  **argv){.  doubl
4650: 65 20 72 56 61 6c 3d 30 2e 30 3b 0a 20 20 61 73  e rVal=0.0;.  as
4660: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
4670: 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74  .  switch( sqlit
4680: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
4690: 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61  gv[0]) ){.    ca
46a0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
46b0: 52 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 69  R: {.      i64 i
46c0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
46d0: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
46e0: 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
46f0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
4700: 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20  ontext, iVal);. 
4710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4720: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
4730: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
4740: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
4750: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
4760: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4770: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4780: 20 20 20 20 20 20 72 56 61 6c 20 3d 20 73 71 6c        rVal = sql
4790: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
47a0: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  e(argv[0]);.    
47b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
47c0: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
47d0: 28 69 36 34 29 20 66 6c 6f 6f 72 28 72 56 61 6c  (i64) floor(rVal
47e0: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
47f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4800: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 73 74 72 69  .** Given a stri
4810: 6e 67 20 28 73 29 20 69 6e 20 74 68 65 20 66 69  ng (s) in the fi
4820: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  rst argument and
4830: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 6e 29 20   an integer (n) 
4840: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 72 65  in the second re
4850: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 73 74 72  turns the.** str
4860: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 74 61 69  ing that constai
4870: 6e 73 20 73 20 63 6f 6e 74 61 74 65 6e 61 74 65  ns s contatenate
4880: 64 20 6e 20 74 69 6d 65 73 0a 2a 2f 0a 73 74 61  d n times.*/.sta
4890: 74 69 63 20 76 6f 69 64 20 72 65 70 6c 69 63 61  tic void replica
48a0: 74 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  teFunc(sqlite3_c
48b0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
48c0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
48d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
48e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
48f0: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 2f 2a 20  r *z;        /* 
4900: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a  input string */.
4910: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4920: 2a 7a 6f 3b 20 20 20 20 20 20 20 2f 2a 20 72 65  *zo;       /* re
4930: 73 75 6c 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  sult string */. 
4940: 20 69 36 34 20 69 43 6f 75 6e 74 3b 20 20 20 20   i64 iCount;    
4950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 69 6d            /* tim
4960: 65 73 20 74 6f 20 72 65 70 65 61 74 20 2a 2f 0a  es to repeat */.
4970: 20 20 69 36 34 20 6e 4c 65 6e 3b 20 20 20 20 20    i64 nLen;     
4980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65             /* le
4990: 6e 67 74 68 20 6f 66 20 74 68 65 20 69 6e 70 75  ngth of the inpu
49a0: 74 20 73 74 72 69 6e 67 20 28 6e 6f 20 6d 75 6c  t string (no mul
49b0: 74 69 62 79 74 65 20 63 6f 6e 73 69 64 65 72 61  tibyte considera
49c0: 74 69 6f 6e 73 29 20 2a 2f 0a 20 20 69 36 34 20  tions) */.  i64 
49d0: 6e 54 4c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  nTLen;          
49e0: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
49f0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 74 72  f the result str
4a00: 69 6e 67 20 28 6e 6f 20 6d 75 6c 74 69 62 79 74  ing (no multibyt
4a10: 65 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 73  e considerations
4a20: 29 20 2a 2f 0a 20 20 69 36 34 20 69 3d 30 3b 0a  ) */.  i64 i=0;.
4a30: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 7c  .  if( argc!=2 |
4a40: 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  | SQLITE_NULL==s
4a50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
4a60: 65 28 61 72 67 76 5b 30 5d 29 20 29 0a 20 20 20  e(argv[0]) ).   
4a70: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 43 6f 75   return;..  iCou
4a80: 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  nt = sqlite3_val
4a90: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
4aa0: 29 3b 0a 0a 20 20 69 66 28 20 69 43 6f 75 6e 74  );..  if( iCount
4ab0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
4ac0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
4ad0: 6f 6e 74 65 78 74 2c 20 22 64 6f 6d 61 69 6e 20  ontext, "domain 
4ae0: 65 72 72 6f 72 22 2c 20 2d 31 29 3b 0a 20 20 7d  error", -1);.  }
4af0: 65 6c 73 65 7b 0a 0a 20 20 20 20 6e 4c 65 6e 20  else{..    nLen 
4b00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4b10: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
4b20: 0a 20 20 20 20 6e 54 4c 65 6e 20 3d 20 6e 4c 65  .    nTLen = nLe
4b30: 6e 2a 69 43 6f 75 6e 74 3b 0a 20 20 20 20 7a 3d  n*iCount;.    z=
4b40: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
4b50: 54 4c 65 6e 2b 31 29 3b 0a 20 20 20 20 7a 6f 3d  TLen+1);.    zo=
4b60: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
4b70: 4c 65 6e 2b 31 29 3b 0a 20 20 20 20 69 66 20 28  Len+1);.    if (
4b80: 21 7a 20 7c 7c 20 21 7a 6f 29 7b 0a 20 20 20 20  !z || !zo){.    
4b90: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4ba0: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
4bb0: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 20  text);.      if 
4bc0: 28 7a 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  (z) sqlite3_free
4bd0: 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 20 28 7a  (z);.      if (z
4be0: 6f 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  o) sqlite3_free(
4bf0: 7a 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  zo);.      retur
4c00: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72  n;.    }.    str
4c10: 63 70 79 28 28 63 68 61 72 2a 29 7a 6f 2c 20 28  cpy((char*)zo, (
4c20: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
4c30: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
4c40: 29 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ));..    for(i=0
4c50: 3b 20 69 3c 69 43 6f 75 6e 74 3b 20 2b 2b 69 29  ; i<iCount; ++i)
4c60: 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 28  {.      strcpy((
4c70: 63 68 61 72 2a 29 28 7a 2b 69 2a 6e 4c 65 6e 29  char*)(z+i*nLen)
4c80: 2c 20 28 63 68 61 72 2a 29 7a 6f 29 3b 0a 20 20  , (char*)zo);.  
4c90: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
4ca0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
4cb0: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20  text, (char*)z, 
4cc0: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
4cd0: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
4ce0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20  e3_free(z);.    
4cf0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 6f 29  sqlite3_free(zo)
4d00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
4d10: 6f 6d 65 20 73 79 73 74 65 6d 73 20 28 77 69 6e  ome systems (win
4d20: 33 32 20 61 6d 6f 6e 67 20 6f 74 68 65 72 73 29  32 among others)
4d30: 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 20 69   don't have an i
4d40: 73 62 6c 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 2c  sblank function,
4d50: 20 74 68 69 73 20 77 69 6c 6c 20 65 6d 75 6c 61   this will emula
4d60: 74 65 20 69 74 2e 0a 2a 2a 20 54 68 69 73 20 66  te it..** This f
4d70: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 55  unction is not U
4d80: 46 54 2d 38 20 73 61 66 65 20 73 69 6e 63 65 20  FT-8 safe since 
4d90: 69 74 20 6f 6e 6c 79 20 61 6e 61 6c 79 73 65 73  it only analyses
4da0: 20 61 20 62 79 74 65 20 63 68 61 72 61 63 74 65   a byte characte
4db0: 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41  r..*/.#ifndef HA
4dc0: 56 45 5f 49 53 42 4c 41 4e 4b 0a 69 6e 74 20 69  VE_ISBLANK.int i
4dd0: 73 62 6c 61 6e 6b 28 63 68 61 72 20 63 29 7b 0a  sblank(char c){.
4de0: 20 20 72 65 74 75 72 6e 28 20 27 20 27 3d 3d 63    return( ' '==c
4df0: 20 7c 7c 20 27 5c 74 27 3d 3d 63 20 29 3b 0a 7d   || '\t'==c );.}
4e00: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
4e10: 76 6f 69 64 20 70 72 6f 70 65 72 46 75 6e 63 28  void properFunc(
4e20: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4e30: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
4e40: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
4e50: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
4e60: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4e70: 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 69 6e 70 75   *z;     /* inpu
4e80: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 75 6e  t string */.  un
4e90: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 6f 3b  signed char *zo;
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
4eb0: 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  put string */.  
4ec0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
4ed0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  t;          /* i
4ee0: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61  terator */.  cha
4ef0: 72 20 72 3b 0a 20 20 69 6e 74 20 63 3d 31 3b 0a  r r;.  int c=1;.
4f00: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 21  .  assert( argc!
4f10: 3d 31 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  =1);.  if( SQLIT
4f20: 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f  E_NULL==sqlite3_
4f30: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
4f40: 30 5d 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0]) ){.    sqlit
4f50: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
4f60: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74  ontext);.    ret
4f70: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 20 3d 20  urn;.  }..  z = 
4f80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
4f90: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
4fa0: 6f 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  o = (unsigned ch
4fb0: 61 72 20 2a 29 73 71 6c 69 74 65 33 53 74 72 44  ar *)sqlite3StrD
4fc0: 75 70 28 28 63 68 61 72 20 2a 29 20 7a 29 3b 0a  up((char *) z);.
4fd0: 20 20 69 66 20 28 21 7a 6f 29 20 7b 0a 20 20 20    if (!zo) {.   
4fe0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4ff0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
5000: 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ext);.    return
5010: 3b 0a 20 20 7d 0a 20 20 7a 74 20 3d 20 7a 6f 3b  ;.  }.  zt = zo;
5020: 0a 0a 20 20 77 68 69 6c 65 28 20 28 72 20 3d 20  ..  while( (r = 
5030: 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20  *(z++))!=0 ){.  
5040: 20 20 69 66 28 20 69 73 62 6c 61 6e 6b 28 72 29    if( isblank(r)
5050: 20 29 7b 0a 20 20 20 20 20 20 63 3d 31 3b 0a 20   ){.      c=1;. 
5060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5070: 69 66 28 20 63 3d 3d 31 20 29 7b 0a 20 20 20 20  if( c==1 ){.    
5080: 20 20 20 20 72 20 3d 20 74 6f 75 70 70 65 72 28      r = toupper(
5090: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
50a0: 0a 20 20 20 20 20 20 20 20 72 20 3d 20 74 6f 6c  .        r = tol
50b0: 6f 77 65 72 28 72 29 3b 0a 20 20 20 20 20 20 7d  ower(r);.      }
50c0: 0a 20 20 20 20 20 20 63 3d 30 3b 0a 20 20 20 20  .      c=0;.    
50d0: 7d 0a 20 20 20 20 2a 28 7a 74 2b 2b 29 20 3d 20  }.    *(zt++) = 
50e0: 72 3b 0a 20 20 7d 0a 20 20 2a 7a 74 20 3d 20 27  r;.  }.  *zt = '
50f0: 5c 30 27 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  \0';..  sqlite3_
5100: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
5110: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 6f 2c 20  ext, (char*)zo, 
5120: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
5130: 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
5140: 5f 66 72 65 65 28 7a 6f 29 3b 0a 7d 0a 0a 2f 2a  _free(zo);.}../*
5150: 0a 2a 2a 20 67 69 76 65 6e 20 61 6e 20 69 6e 70  .** given an inp
5160: 75 74 20 73 74 72 69 6e 67 20 28 73 29 20 61 6e  ut string (s) an
5170: 64 20 61 6e 20 69 6e 74 65 67 65 72 20 28 6e 29  d an integer (n)
5180: 20 61 64 64 73 20 73 70 61 63 65 73 20 61 74 20   adds spaces at 
5190: 74 68 65 20 62 65 67 69 6e 69 6e 67 20 6f 66 20  the begining of 
51a0: 20 73 0a 2a 2a 20 75 6e 74 69 6c 20 69 74 20 68   s.** until it h
51b0: 61 73 20 61 20 6c 65 6e 67 74 68 20 6f 66 20 6e  as a length of n
51c0: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20   characters..** 
51d0: 57 68 65 6e 20 73 20 68 61 73 20 61 20 6c 65 6e  When s has a len
51e0: 67 74 68 20 3e 3d 6e 20 69 74 27 73 20 61 20 4e  gth >=n it's a N
51f0: 4f 50 0a 2a 2a 20 70 61 64 6c 28 4e 55 4c 4c 29  OP.** padl(NULL)
5200: 20 3d 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69   = NULL.*/.stati
5210: 63 20 76 6f 69 64 20 70 61 64 6c 46 75 6e 63 28  c void padlFunc(
5220: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5230: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
5240: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5250: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 36 34  e **argv){.  i64
5260: 20 69 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20   ilen;          
5270: 2f 2a 20 6c 65 6e 67 74 68 20 74 6f 20 70 61 64  /* length to pad
5280: 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 7a 6c 3b   to */.  i64 zl;
5290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
52a0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 69 6e 70  ength of the inp
52b0: 75 74 20 73 74 72 69 6e 67 20 28 55 54 46 2d 38  ut string (UTF-8
52c0: 20 63 68 61 72 73 29 20 2a 2f 0a 20 20 69 6e 74   chars) */.  int
52d0: 20 69 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20   i = 0;.  const 
52e0: 63 68 61 72 20 2a 7a 69 3b 20 20 20 20 2f 2a 20  char *zi;    /* 
52f0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a  input string */.
5300: 20 20 63 68 61 72 20 2a 7a 6f 3b 20 20 20 20 20    char *zo;     
5310: 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 20 73       /* output s
5320: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
5330: 2a 7a 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  *zt;..  assert( 
5340: 61 72 67 63 3d 3d 32 20 29 3b 0a 0a 20 20 69 66  argc==2 );..  if
5350: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
5360: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 3d 3d  type(argv[0]) ==
5370: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a   SQLITE_NULL ){.
5380: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5390: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
53a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
53b0: 69 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  i = (char *)sqli
53c0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
53d0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 6c 65  rgv[0]);.    ile
53e0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
53f0: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29  e_int64(argv[1])
5400: 3b 0a 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 64  ;.    /* check d
5410: 6f 6d 61 69 6e 20 2a 2f 0a 20 20 20 20 69 66 28  omain */.    if(
5420: 69 6c 65 6e 3c 30 29 7b 0a 20 20 20 20 20 20 73  ilen<0){.      s
5430: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5440: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 64 6f  ror(context, "do
5450: 6d 61 69 6e 20 65 72 72 6f 72 22 2c 20 2d 31 29  main error", -1)
5460: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
5470: 20 20 20 20 7d 0a 20 20 20 20 7a 6c 20 3d 20 73      }.    zl = s
5480: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
5490: 6e 28 7a 69 2c 20 2d 31 29 3b 0a 20 20 20 20 69  n(zi, -1);.    i
54a0: 66 28 20 7a 6c 3e 3d 69 6c 65 6e 20 29 7b 0a 20  f( zl>=ilen ){. 
54b0: 20 20 20 20 20 2f 2a 20 73 74 72 69 6e 67 20 69       /* string i
54c0: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68  s longer than th
54d0: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 64 20  e requested pad 
54e0: 6c 65 6e 67 74 68 2c 20 72 65 74 75 72 6e 20 74  length, return t
54f0: 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 28  he same string (
5500: 64 75 70 20 69 74 29 20 2a 2f 0a 20 20 20 20 20  dup it) */.     
5510: 20 7a 6f 20 3d 20 73 71 6c 69 74 65 33 53 74 72   zo = sqlite3Str
5520: 44 75 70 28 7a 69 29 3b 0a 20 20 20 20 20 20 69  Dup(zi);.      i
5530: 66 20 28 21 7a 6f 29 7b 0a 20 20 20 20 20 20 20  f (!zo){.       
5540: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5550: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
5560: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ext);.        re
5570: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
5580: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5590: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
55a0: 20 7a 6f 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f   zo, -1, SQLITE_
55b0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
55c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 6f 20  }else{.      zo 
55d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
55e0: 28 73 74 72 6c 65 6e 28 7a 69 29 2b 69 6c 65 6e  (strlen(zi)+ilen
55f0: 2d 7a 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  -zl+1);.      if
5600: 20 28 21 7a 6f 29 7b 0a 20 20 20 20 20 20 20 20   (!zo){.        
5610: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5620: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
5630: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  xt);.        ret
5640: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
5650: 20 20 20 7a 74 20 3d 20 7a 6f 3b 0a 20 20 20 20     zt = zo;.    
5660: 20 20 66 6f 72 28 69 3d 31 3b 20 69 2b 7a 6c 3c    for(i=1; i+zl<
5670: 3d 69 6c 65 6e 3b 20 2b 2b 69 29 7b 0a 20 20 20  =ilen; ++i){.   
5680: 20 20 20 20 20 2a 28 7a 74 2b 2b 29 3d 27 20 27       *(zt++)=' '
5690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
56a0: 2f 2a 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 61  /* no need to ta
56b0: 6b 65 20 55 54 46 2d 38 20 69 6e 74 6f 20 63 6f  ke UTF-8 into co
56c0: 6e 73 69 64 65 72 61 74 69 6f 6e 20 68 65 72 65  nsideration here
56d0: 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 63 70 79   */.      strcpy
56e0: 28 7a 74 2c 7a 69 29 3b 0a 20 20 20 20 7d 0a 20  (zt,zi);.    }. 
56f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5700: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
5710: 7a 6f 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  zo, -1, SQLITE_T
5720: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
5730: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 6f 29 3b  qlite3_free(zo);
5740: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67 69  .  }.}../*.** gi
5750: 76 65 6e 20 61 6e 20 69 6e 70 75 74 20 73 74 72  ven an input str
5760: 69 6e 67 20 28 73 29 20 61 6e 64 20 61 6e 20 69  ing (s) and an i
5770: 6e 74 65 67 65 72 20 28 6e 29 20 61 70 70 65 6e  nteger (n) appen
5780: 64 73 20 73 70 61 63 65 73 20 61 74 20 74 68 65  ds spaces at the
5790: 20 65 6e 64 20 6f 66 20 20 73 0a 2a 2a 20 75 6e   end of  s.** un
57a0: 74 69 6c 20 69 74 20 68 61 73 20 61 20 6c 65 6e  til it has a len
57b0: 67 74 68 20 6f 66 20 6e 20 63 68 61 72 61 63 74  gth of n charact
57c0: 65 72 73 2e 0a 2a 2a 20 57 68 65 6e 20 73 20 68  ers..** When s h
57d0: 61 73 20 61 20 6c 65 6e 67 74 68 20 3e 3d 6e 20  as a length >=n 
57e0: 69 74 27 73 20 61 20 4e 4f 50 0a 2a 2a 20 70 61  it's a NOP.** pa
57f0: 64 6c 28 4e 55 4c 4c 29 20 3d 20 4e 55 4c 4c 0a  dl(NULL) = NULL.
5800: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
5810: 61 64 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  adrFunc(sqlite3_
5820: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
5830: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
5840: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5850: 29 7b 0a 20 20 69 36 34 20 69 6c 65 6e 3b 20 20  ){.  i64 ilen;  
5860: 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74          /* lengt
5870: 68 20 74 6f 20 70 61 64 20 74 6f 20 2a 2f 0a 20  h to pad to */. 
5880: 20 69 36 34 20 7a 6c 3b 20 20 20 20 20 20 20 20   i64 zl;        
5890: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
58a0: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
58b0: 67 20 28 55 54 46 2d 38 20 63 68 61 72 73 29 20  g (UTF-8 chars) 
58c0: 2a 2f 0a 20 20 69 36 34 20 7a 6c 6c 3b 20 20 20  */.  i64 zll;   
58d0: 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74          /* lengt
58e0: 68 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73  h of the input s
58f0: 74 72 69 6e 67 20 28 62 79 74 65 73 29 20 2a 2f  tring (bytes) */
5900: 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
5910: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 69 3b 20  const char *zi; 
5920: 20 20 20 2f 2a 20 69 6e 70 75 74 20 73 74 72 69     /* input stri
5930: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 6f  ng */.  char *zo
5940: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75  ;          /* ou
5950: 74 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  tput string */. 
5960: 20 63 68 61 72 20 2a 7a 74 3b 0a 0a 20 20 61 73   char *zt;..  as
5970: 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b  sert( argc==2 );
5980: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
5990: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
59a0: 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55  0]) == SQLITE_NU
59b0: 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  LL ){.    sqlite
59c0: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f  3_result_null(co
59d0: 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  ntext);.  }else{
59e0: 0a 20 20 20 20 7a 69 20 3d 20 28 63 68 61 72 20  .    zi = (char 
59f0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5a00: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
5a10: 20 20 20 69 6c 65 6e 20 3d 20 73 71 6c 69 74 65     ilen = sqlite
5a20: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
5a30: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 2f 2a 20 63  gv[1]);.    /* c
5a40: 68 65 63 6b 20 64 6f 6d 61 69 6e 20 2a 2f 0a 20  heck domain */. 
5a50: 20 20 20 69 66 28 69 6c 65 6e 3c 30 29 7b 0a 20     if(ilen<0){. 
5a60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5a70: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5a80: 74 2c 20 22 64 6f 6d 61 69 6e 20 65 72 72 6f 72  t, "domain error
5a90: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65  ", -1);.      re
5aa0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
5ab0: 7a 6c 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  zl = sqlite3Utf8
5ac0: 43 68 61 72 4c 65 6e 28 7a 69 2c 20 2d 31 29 3b  CharLen(zi, -1);
5ad0: 0a 20 20 20 20 69 66 28 20 7a 6c 3e 3d 69 6c 65  .    if( zl>=ile
5ae0: 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 74  n ){.      /* st
5af0: 72 69 6e 67 20 69 73 20 6c 6f 6e 67 65 72 20 74  ring is longer t
5b00: 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
5b10: 64 20 70 61 64 20 6c 65 6e 67 74 68 2c 20 72 65  d pad length, re
5b20: 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 73 74  turn the same st
5b30: 72 69 6e 67 20 28 64 75 70 20 69 74 29 20 2a 2f  ring (dup it) */
5b40: 0a 20 20 20 20 20 20 7a 6f 20 3d 20 73 71 6c 69  .      zo = sqli
5b50: 74 65 33 53 74 72 44 75 70 28 7a 69 29 3b 0a 20  te3StrDup(zi);. 
5b60: 20 20 20 20 20 69 66 20 28 21 7a 6f 29 7b 0a 20       if (!zo){. 
5b70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
5b80: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
5b90: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
5ba0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
5bb0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
5bc0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
5bd0: 6e 74 65 78 74 2c 20 7a 6f 2c 20 2d 31 2c 20 53  ntext, zo, -1, S
5be0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
5bf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5c00: 20 20 20 7a 6c 6c 20 3d 20 73 74 72 6c 65 6e 28     zll = strlen(
5c10: 7a 69 29 3b 0a 20 20 20 20 20 20 7a 6f 20 3d 20  zi);.      zo = 
5c20: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 7a  sqlite3_malloc(z
5c30: 6c 6c 2b 69 6c 65 6e 2d 7a 6c 2b 31 29 3b 0a 20  ll+ilen-zl+1);. 
5c40: 20 20 20 20 20 69 66 20 28 21 7a 6f 29 7b 0a 20       if (!zo){. 
5c50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
5c60: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
5c70: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
5c80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
5c90: 20 20 7d 0a 20 20 20 20 20 20 7a 74 20 3d 20 73    }.      zt = s
5ca0: 74 72 63 70 79 28 7a 6f 2c 7a 69 29 2b 7a 6c 6c  trcpy(zo,zi)+zll
5cb0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  ;.      for(i=1;
5cc0: 20 69 2b 7a 6c 3c 3d 69 6c 65 6e 3b 20 2b 2b 69   i+zl<=ilen; ++i
5cd0: 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 7a 74 2b  ){.        *(zt+
5ce0: 2b 29 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +) = ' ';.      
5cf0: 7d 0a 20 20 20 20 20 20 2a 7a 74 20 3d 20 27 5c  }.      *zt = '\
5d00: 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0';.    }.    sq
5d10: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
5d20: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 6f 2c 20 2d  t(context, zo, -
5d30: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
5d40: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
5d50: 33 5f 66 72 65 65 28 7a 6f 29 3b 0a 20 20 7d 0a  3_free(zo);.  }.
5d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 67 69 76 65 6e 20 61  }../*.** given a
5d70: 6e 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 28  n input string (
5d80: 73 29 20 61 6e 64 20 61 6e 20 69 6e 74 65 67 65  s) and an intege
5d90: 72 20 28 6e 29 20 61 70 70 65 6e 64 73 20 73 70  r (n) appends sp
5da0: 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 20  aces at the end 
5db0: 6f 66 20 20 73 0a 2a 2a 20 61 6e 64 20 61 64 64  of  s.** and add
5dc0: 73 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20  s spaces at the 
5dd0: 62 65 67 69 6e 69 6e 67 20 6f 66 20 73 20 75 6e  begining of s un
5de0: 74 69 6c 20 69 74 20 68 61 73 20 61 20 6c 65 6e  til it has a len
5df0: 67 74 68 20 6f 66 20 6e 20 63 68 61 72 61 63 74  gth of n charact
5e00: 65 72 73 2e 0a 2a 2a 20 54 72 69 65 73 20 74 6f  ers..** Tries to
5e10: 20 61 64 64 20 68 61 73 20 6d 61 6e 79 20 63 68   add has many ch
5e20: 61 72 61 63 74 65 72 73 20 61 74 20 74 68 65 20  aracters at the 
5e30: 6c 65 66 74 20 61 73 20 61 74 20 74 68 65 20 72  left as at the r
5e40: 69 67 68 74 2e 0a 2a 2a 20 57 68 65 6e 20 73 20  ight..** When s 
5e50: 68 61 73 20 61 20 6c 65 6e 67 74 68 20 3e 3d 6e  has a length >=n
5e60: 20 69 74 27 73 20 61 20 4e 4f 50 0a 2a 2a 20 70   it's a NOP.** p
5e70: 61 64 6c 28 4e 55 4c 4c 29 20 3d 20 4e 55 4c 4c  adl(NULL) = NULL
5e80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5e90: 70 61 64 63 46 75 6e 63 28 73 71 6c 69 74 65 33  padcFunc(sqlite3
5ea0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5eb0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
5ec0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5ed0: 76 29 7b 0a 20 20 69 36 34 20 69 6c 65 6e 3b 20  v){.  i64 ilen; 
5ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e            /* len
5ef0: 67 74 68 20 74 6f 20 70 61 64 20 74 6f 20 2a 2f  gth to pad to */
5f00: 0a 20 20 69 36 34 20 7a 6c 3b 20 20 20 20 20 20  .  i64 zl;      
5f10: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
5f20: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74   of the input st
5f30: 72 69 6e 67 20 28 55 54 46 2d 38 20 63 68 61 72  ring (UTF-8 char
5f40: 73 29 20 2a 2f 0a 20 20 69 36 34 20 7a 6c 6c 3b  s) */.  i64 zll;
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
5f60: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 69 6e 70  ength of the inp
5f70: 75 74 20 73 74 72 69 6e 67 20 28 62 79 74 65 73  ut string (bytes
5f80: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  ) */.  int i = 0
5f90: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5fa0: 7a 69 3b 20 20 20 20 20 2f 2a 20 69 6e 70 75 74  zi;     /* input
5fb0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
5fc0: 72 20 2a 7a 6f 3b 20 20 20 20 20 20 20 20 20 20  r *zo;          
5fd0: 20 2f 2a 20 6f 75 74 70 75 74 20 73 74 72 69 6e   /* output strin
5fe0: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 74 3b  g */.  char *zt;
5ff0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ..  assert( argc
6000: 3d 3d 32 20 29 3b 0a 0a 20 20 69 66 28 20 73 71  ==2 );..  if( sq
6010: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6020: 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
6030: 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
6040: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
6050: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
6060: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 69 20 3d 20  }else{.    zi = 
6070: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
6080: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6090: 30 5d 29 3b 0a 20 20 20 20 69 6c 65 6e 20 3d 20  0]);.    ilen = 
60a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
60b0: 74 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  t64(argv[1]);.  
60c0: 20 20 2f 2a 20 63 68 65 63 6b 20 64 6f 6d 61 69    /* check domai
60d0: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 69 6c 65 6e  n */.    if(ilen
60e0: 3c 30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  <0){.      sqlit
60f0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
6100: 63 6f 6e 74 65 78 74 2c 20 22 64 6f 6d 61 69 6e  context, "domain
6110: 20 65 72 72 6f 72 22 2c 20 2d 31 29 3b 0a 20 20   error", -1);.  
6120: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6130: 7d 0a 20 20 20 20 7a 6c 20 3d 20 73 71 6c 69 74  }.    zl = sqlit
6140: 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 69  e3Utf8CharLen(zi
6150: 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 7a  , -1);.    if( z
6160: 6c 3e 3d 69 6c 65 6e 20 29 7b 0a 20 20 20 20 20  l>=ilen ){.     
6170: 20 2f 2a 20 73 74 72 69 6e 67 20 69 73 20 6c 6f   /* string is lo
6180: 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  nger than the re
6190: 71 75 65 73 74 65 64 20 70 61 64 20 6c 65 6e 67  quested pad leng
61a0: 74 68 2c 20 72 65 74 75 72 6e 20 74 68 65 20 73  th, return the s
61b0: 61 6d 65 20 73 74 72 69 6e 67 20 28 64 75 70 20  ame string (dup 
61c0: 69 74 29 20 2a 2f 0a 20 20 20 20 20 20 7a 6f 20  it) */.      zo 
61d0: 3d 20 73 71 6c 69 74 65 33 53 74 72 44 75 70 28  = sqlite3StrDup(
61e0: 7a 69 29 3b 0a 20 20 20 20 20 20 69 66 20 28 21  zi);.      if (!
61f0: 7a 6f 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  zo){.        sql
6200: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
6210: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
6220: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6240: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
6250: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 6f 2c  ext(context, zo,
6260: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
6270: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
6280: 65 7b 0a 20 20 20 20 20 20 7a 6c 6c 20 3d 20 73  e{.      zll = s
6290: 74 72 6c 65 6e 28 7a 69 29 3b 0a 20 20 20 20 20  trlen(zi);.     
62a0: 20 7a 6f 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61   zo = sqlite3_ma
62b0: 6c 6c 6f 63 28 7a 6c 6c 2b 69 6c 65 6e 2d 7a 6c  lloc(zll+ilen-zl
62c0: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 20 28 21  +1);.      if (!
62d0: 7a 6f 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  zo){.        sql
62e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
62f0: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
6300: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6320: 7a 74 20 3d 20 7a 6f 3b 0a 20 20 20 20 20 20 66  zt = zo;.      f
6330: 6f 72 28 69 3d 31 3b 20 32 2a 69 2b 7a 6c 3c 3d  or(i=1; 2*i+zl<=
6340: 69 6c 65 6e 3b 20 2b 2b 69 29 7b 0a 20 20 20 20  ilen; ++i){.    
6350: 20 20 20 20 2a 28 7a 74 2b 2b 29 20 3d 20 27 20      *(zt++) = ' 
6360: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ';.      }.     
6370: 20 73 74 72 63 70 79 28 7a 74 2c 20 7a 69 29 3b   strcpy(zt, zi);
6380: 0a 20 20 20 20 20 20 7a 74 2b 3d 7a 6c 6c 3b 0a  .      zt+=zll;.
6390: 20 20 20 20 20 20 66 6f 72 28 3b 20 69 2b 7a 6c        for(; i+zl
63a0: 3c 3d 69 6c 65 6e 3b 20 2b 2b 69 29 7b 0a 20 20  <=ilen; ++i){.  
63b0: 20 20 20 20 20 20 2a 28 7a 74 2b 2b 29 20 3d 20        *(zt++) = 
63c0: 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
63d0: 20 20 20 2a 7a 74 20 3d 20 27 5c 30 27 3b 0a 20     *zt = '\0';. 
63e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
63f0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
6400: 74 65 78 74 2c 20 7a 6f 2c 20 2d 31 2c 20 53 51  text, zo, -1, SQ
6410: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
6420: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6430: 65 28 7a 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e(zo);.  }.}../*
6440: 0a 2a 2a 20 67 69 76 65 6e 20 32 20 73 74 72 69  .** given 2 stri
6450: 6e 67 20 28 73 31 2c 73 32 29 20 72 65 74 75 72  ng (s1,s2) retur
6460: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 73 31  ns the string s1
6470: 20 77 69 74 68 20 74 68 65 20 63 68 61 72 61 63   with the charac
6480: 74 65 72 73 20 4e 4f 54 20 69 6e 20 73 32 20 72  ters NOT in s2 r
6490: 65 6d 6f 76 65 64 0a 2a 2a 20 61 73 73 75 6d 65  emoved.** assume
64a0: 73 20 73 74 72 69 6e 67 73 20 61 72 65 20 55 54  s strings are UT
64b0: 46 2d 38 20 65 6e 63 6f 64 65 64 0a 2a 2f 0a 73  F-8 encoded.*/.s
64c0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 72 66 69  tatic void strfi
64d0: 6c 74 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33  lterFunc(sqlite3
64e0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
64f0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
6500: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6510: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v){.  const char
6520: 20 2a 7a 69 31 3b 20 20 20 20 20 20 20 20 2f 2a   *zi1;        /*
6530: 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
6540: 20 73 74 72 69 6e 67 20 28 73 65 61 72 63 68 65   string (searche
6550: 64 20 73 74 72 69 6e 67 29 20 2a 2f 0a 20 20 63  d string) */.  c
6560: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 69 32 3b 20  onst char *zi2; 
6570: 20 20 20 20 20 20 20 2f 2a 20 73 65 63 6f 6e 64         /* second
6580: 20 70 61 72 61 6d 65 74 65 72 20 73 74 72 69 6e   parameter strin
6590: 67 20 28 76 63 6f 6e 74 61 69 6e 73 20 76 61 6c  g (vcontains val
65a0: 69 64 20 63 68 61 72 61 63 74 65 72 73 29 20 2a  id characters) *
65b0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
65c0: 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  z1;.  const char
65d0: 20 2a 7a 32 31 3b 0a 20 20 63 6f 6e 73 74 20 63   *z21;.  const c
65e0: 68 61 72 20 2a 7a 32 32 3b 0a 20 20 63 68 61 72  har *z22;.  char
65f0: 20 2a 7a 6f 3b 20 20 20 20 20 20 20 20 20 20 20   *zo;           
6600: 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 20 73 74      /* output st
6610: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ring */.  char *
6620: 7a 6f 74 3b 0a 20 20 69 6e 74 20 63 31 20 3d 20  zot;.  int c1 = 
6630: 30 3b 0a 20 20 69 6e 74 20 63 32 20 3d 20 30 3b  0;.  int c2 = 0;
6640: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ..  assert( argc
6650: 3d 3d 32 20 29 3b 0a 0a 20 20 69 66 28 20 73 71  ==2 );..  if( sq
6660: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6670: 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
6680: 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 73 71 6c 69  ITE_NULL || sqli
6690: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
66a0: 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
66b0: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71  E_NULL ){.    sq
66c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
66d0: 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  l(context);.  }e
66e0: 6c 73 65 7b 0a 20 20 20 20 7a 69 31 20 3d 20 28  lse{.    zi1 = (
66f0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
6700: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6710: 5d 29 3b 0a 20 20 20 20 7a 69 32 20 3d 20 28 63  ]);.    zi2 = (c
6720: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
6730: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
6740: 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  );.    /*.    **
6750: 20 6d 61 79 62 65 20 49 20 63 6f 75 6c 64 20 61   maybe I could a
6760: 6c 6c 6f 63 61 74 65 20 6c 65 73 73 2c 20 62 75  llocate less, bu
6770: 74 20 74 68 61 74 20 77 6f 75 6c 64 20 69 6d 70  t that would imp
6780: 6c 79 20 32 20 70 61 73 73 65 73 2c 20 72 61 74  ly 2 passes, rat
6790: 68 65 72 20 77 61 73 74 65 0a 20 20 20 20 2a 2a  her waste.    **
67a0: 20 28 70 6f 73 73 69 62 6c 79 29 20 73 6f 6d 65   (possibly) some
67b0: 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2f 0a 20   memory.    */. 
67c0: 20 20 20 7a 6f 20 3d 20 73 71 6c 69 74 65 33 5f     zo = sqlite3_
67d0: 6d 61 6c 6c 6f 63 28 73 74 72 6c 65 6e 28 7a 69  malloc(strlen(zi
67e0: 31 29 2b 31 29 3b 0a 20 20 20 20 69 66 20 28 21  1)+1);.    if (!
67f0: 7a 6f 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  zo){.      sqlit
6800: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
6810: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
6820: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
6830: 20 20 7d 0a 20 20 20 20 7a 6f 74 20 3d 20 7a 6f    }.    zot = zo
6840: 3b 0a 20 20 20 20 7a 31 20 3d 20 7a 69 31 3b 0a  ;.    z1 = zi1;.
6850: 20 20 20 20 77 68 69 6c 65 28 20 28 63 31 3d 73      while( (c1=s
6860: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 28 75 6e  qliteCharVal((un
6870: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 31  signed char *)z1
6880: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ))!=0 ){.      z
6890: 32 31 3d 7a 69 32 3b 0a 20 20 20 20 20 20 77 68  21=zi2;.      wh
68a0: 69 6c 65 28 20 28 63 32 3d 73 71 6c 69 74 65 43  ile( (c2=sqliteC
68b0: 68 61 72 56 61 6c 28 28 75 6e 73 69 67 6e 65 64  harVal((unsigned
68c0: 20 63 68 61 72 20 2a 29 7a 32 31 29 29 21 3d 30   char *)z21))!=0
68d0: 20 26 26 20 63 32 21 3d 63 31 20 29 7b 0a 20 20   && c2!=c1 ){.  
68e0: 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74        sqliteNext
68f0: 43 68 61 72 28 7a 32 31 29 3b 0a 20 20 20 20 20  Char(z21);.     
6900: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 21   }.      if( c2!
6910: 3d 30 29 7b 0a 20 20 20 20 20 20 20 20 7a 32 32  =0){.        z22
6920: 3d 7a 32 31 3b 0a 20 20 20 20 20 20 20 20 73 71  =z21;.        sq
6930: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 32 32  liteNextChar(z22
6940: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63  );.        strnc
6950: 70 79 28 7a 6f 74 2c 20 7a 32 31 2c 20 7a 32 32  py(zot, z21, z22
6960: 2d 7a 32 31 29 3b 0a 20 20 20 20 20 20 20 20 7a  -z21);.        z
6970: 6f 74 2b 3d 7a 32 32 2d 7a 32 31 3b 0a 20 20 20  ot+=z22-z21;.   
6980: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
6990: 65 4e 65 78 74 43 68 61 72 28 7a 31 29 3b 0a 20  eNextChar(z1);. 
69a0: 20 20 20 7d 0a 20 20 20 20 2a 7a 6f 74 20 3d 20     }.    *zot = 
69b0: 27 5c 30 27 3b 0a 0a 20 20 20 20 73 71 6c 69 74  '\0';..    sqlit
69c0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
69d0: 6f 6e 74 65 78 74 2c 20 7a 6f 2c 20 2d 31 2c 20  ontext, zo, -1, 
69e0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
69f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
6a00: 72 65 65 28 7a 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ree(zo);.  }.}..
6a10: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 73 74  /*.** Given a st
6a20: 72 69 6e 67 20 7a 31 2c 20 72 65 74 75 74 6e 73  ring z1, retutns
6a30: 20 74 68 65 20 28 30 20 62 61 73 65 64 29 20 69   the (0 based) i
6a40: 6e 64 65 78 20 6f 66 20 69 74 27 73 20 66 69 72  ndex of it's fir
6a50: 73 74 20 6f 63 63 75 72 65 6e 63 65 0a 2a 2a 20  st occurence.** 
6a60: 69 6e 20 7a 32 20 61 66 74 65 72 20 74 68 65 20  in z2 after the 
6a70: 66 69 72 73 74 20 73 20 63 68 61 72 61 63 74 65  first s characte
6a80: 72 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 73 20 2d  rs..** Returns -
6a90: 31 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 6e  1 when there isn
6aa0: 27 74 20 61 20 6d 61 74 63 68 2e 0a 2a 2a 20 75  't a match..** u
6ab0: 70 64 61 74 65 73 20 70 20 74 6f 20 70 6f 69 6e  pdates p to poin
6ac0: 74 20 74 6f 20 74 68 65 20 63 68 61 72 61 63 74  t to the charact
6ad0: 65 72 20 77 68 65 72 65 20 74 68 65 20 6d 61 74  er where the mat
6ae0: 63 68 20 6f 63 63 75 72 65 64 2e 0a 2a 2a 20 54  ch occured..** T
6af0: 68 69 73 20 69 73 20 61 6e 20 61 75 78 69 6c 69  his is an auxili
6b00: 61 72 79 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ary function..*/
6b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 73 75 62  .static int _sub
6b20: 73 74 72 28 63 6f 6e 73 74 20 63 68 61 72 2a 20  str(const char* 
6b30: 7a 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  z1, const char* 
6b40: 7a 32 2c 20 69 6e 74 20 73 2c 20 43 6f 6c 6c 53  z2, int s, CollS
6b50: 65 71 20 2a 70 43 6f 6c 6c 2c 20 63 6f 6e 73 74  eq *pColl, const
6b60: 20 63 68 61 72 2a 2a 20 70 29 7b 0a 20 20 69 6e   char** p){.  in
6b70: 74 20 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  t c = 0;.  int r
6b80: 56 61 6c 3d 2d 31 3b 0a 20 20 63 6f 6e 73 74 20  Val=-1;.  const 
6b90: 63 68 61 72 2a 20 7a 74 31 3b 0a 20 20 63 6f 6e  char* zt1;.  con
6ba0: 73 74 20 63 68 61 72 2a 20 7a 74 32 3b 0a 20 20  st char* zt2;.  
6bb0: 69 6e 74 20 63 31 2c 63 32 3b 0a 0a 20 20 69 66  int c1,c2;..  if
6bc0: 28 20 27 5c 30 27 3d 3d 2a 7a 31 20 29 7b 0a 20  ( '\0'==*z1 ){. 
6bd0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
6be0: 7d 0a 0a 20 20 77 68 69 6c 65 28 20 28 73 71 6c  }..  while( (sql
6bf0: 69 74 65 43 68 61 72 56 61 6c 28 28 75 6e 73 69  iteCharVal((unsi
6c00: 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 32 29 20  gned char *)z2) 
6c10: 21 3d 20 30 29 20 26 26 20 28 63 2b 2b 29 3c 73  != 0) && (c++)<s
6c20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4e 65 78  ){.    sqliteNex
6c30: 74 43 68 61 72 28 7a 32 29 3b 0a 20 20 7d 0a 0a  tChar(z2);.  }..
6c40: 20 20 63 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    c = 0;.  while
6c50: 28 20 28 73 71 6c 69 74 65 43 68 61 72 56 61 6c  ( (sqliteCharVal
6c60: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
6c70: 2a 29 7a 32 29 29 20 21 3d 20 30 20 29 7b 0a 20  *)z2)) != 0 ){. 
6c80: 20 20 20 7a 74 31 20 3d 20 7a 31 3b 0a 20 20 20     zt1 = z1;.   
6c90: 20 7a 74 32 20 3d 20 7a 32 3b 0a 0a 20 20 20 20   zt2 = z2;..    
6ca0: 64 6f 7b 0a 20 20 20 20 20 20 63 31 20 3d 20 73  do{.      c1 = s
6cb0: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 28 75 6e  qliteCharVal((un
6cc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 74  signed char *)zt
6cd0: 31 29 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 73  1);.      c2 = s
6ce0: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 28 75 6e  qliteCharVal((un
6cf0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 74  signed char *)zt
6d00: 32 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70 43  2);.      if (pC
6d10: 6f 6c 6c 2d 3e 65 6e 63 20 3d 3d 20 53 51 4c 49  oll->enc == SQLI
6d20: 54 45 5f 55 54 46 38 29 7b 0a 20 20 20 20 20 20  TE_UTF8){.      
6d30: 20 20 69 66 20 28 70 43 6f 6c 6c 2d 3e 78 43 6d    if (pColl->xCm
6d40: 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
6d50: 31 2c 20 7a 74 31 2c 20 31 2c 20 7a 74 32 29 20  1, zt1, 1, zt2) 
6d60: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
6d70: 20 20 63 31 20 3d 20 63 32 3b 0a 20 20 20 20 20    c1 = c2;.     
6d80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73     }.        els
6d90: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 31  e {.          c1
6da0: 20 3d 20 28 63 31 29 20 3f 20 31 20 3a 20 30 3b   = (c1) ? 1 : 0;
6db0: 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
6dc0: 28 63 32 29 20 3f 20 32 20 3a 20 30 3b 0a 20 20  (c2) ? 2 : 0;.  
6dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6de0: 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 20        /* TODO:  
6df0: 4d 61 79 62 65 20 74 72 79 20 61 6e 64 20 63 6f  Maybe try and co
6e00: 6e 76 65 72 74 20 74 68 65 20 63 68 61 72 73 20  nvert the chars 
6e10: 74 6f 20 55 54 46 31 36 20 61 6e 64 20 72 75 6e  to UTF16 and run
6e20: 20 74 68 65 6d 20 74 68 72 75 20 74 68 65 20 63   them thru the c
6e30: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
6e40: 65 3f 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e? */.      sqli
6e50: 74 65 4e 65 78 74 43 68 61 72 28 7a 74 31 29 3b  teNextChar(zt1);
6e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78  .      sqliteNex
6e70: 74 43 68 61 72 28 7a 74 32 29 3b 0a 20 20 20 20  tChar(zt2);.    
6e80: 7d 77 68 69 6c 65 28 20 63 31 20 3d 3d 20 63 32  }while( c1 == c2
6e90: 20 26 26 20 63 31 20 21 3d 20 30 20 26 26 20 63   && c1 != 0 && c
6ea0: 32 20 21 3d 20 30 20 29 3b 0a 0a 20 20 20 20 69  2 != 0 );..    i
6eb0: 66 28 20 63 31 20 3d 3d 20 30 20 29 7b 0a 20 20  f( c1 == 0 ){.  
6ec0: 20 20 20 20 72 56 61 6c 20 3d 20 63 3b 0a 20 20      rVal = c;.  
6ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6ee0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74  ..    sqliteNext
6ef0: 43 68 61 72 28 7a 32 29 3b 0a 20 20 20 20 2b 2b  Char(z2);.    ++
6f00: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 70 29 7b 0a  c;.  }.  if(p){.
6f10: 20 20 20 20 2a 70 3d 7a 32 3b 0a 20 20 7d 0a 20      *p=z2;.  }. 
6f20: 20 72 65 74 75 72 6e 20 72 56 61 6c 20 3e 3d 30   return rVal >=0
6f30: 20 3f 20 72 56 61 6c 2b 73 20 3a 20 72 56 61 6c   ? rVal+s : rVal
6f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67 69 76 65 6e  ;.}../*.** given
6f50: 20 32 20 69 6e 70 75 74 20 73 74 72 69 6e 67 73   2 input strings
6f60: 20 28 73 31 2c 73 32 29 20 61 6e 64 20 61 6e 20   (s1,s2) and an 
6f70: 69 6e 74 65 67 65 72 20 28 6e 29 20 73 65 61 72  integer (n) sear
6f80: 63 68 65 73 20 66 72 6f 6d 20 74 68 65 20 6e 74  ches from the nt
6f90: 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 66  h character.** f
6fa0: 6f 72 20 74 68 65 20 73 74 72 69 6e 67 20 73 31  or the string s1
6fb0: 2e 20 52 65 74 75 72 6e 73 20 74 68 65 20 70 6f  . Returns the po
6fc0: 73 69 74 69 6f 6e 20 77 68 65 72 65 20 74 68 65  sition where the
6fd0: 20 6d 61 74 63 68 20 6f 63 63 75 72 65 64 2e 0a   match occured..
6fe0: 2a 2a 20 43 68 61 72 61 63 74 65 72 73 20 61 72  ** Characters ar
6ff0: 65 20 63 6f 75 6e 74 65 64 20 66 72 6f 6d 20 31  e counted from 1
7000: 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e  ..** 0 is return
7010: 65 64 20 77 68 65 6e 20 6e 6f 20 6d 61 74 63 68  ed when no match
7020: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 0a 73 74 61   occurs..*/..sta
7030: 74 69 63 20 76 6f 69 64 20 63 68 61 72 69 6e 64  tic void charind
7040: 65 78 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  exFunc(sqlite3_c
7050: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
7060: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
7070: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
7080: 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 31  {.  const u8 *z1
7090: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 31  ;          /* s1
70a0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 75 38 20   string */.  u8 
70b0: 2a 7a 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  *z2;            
70c0: 20 20 20 20 2f 2a 20 73 32 20 73 74 72 69 6e 67      /* s2 string
70d0: 20 2a 2f 0a 20 20 69 6e 74 20 73 3d 30 3b 0a 20   */.  int s=0;. 
70e0: 20 69 6e 74 20 72 56 61 6c 3d 30 3b 0a 23 69 66   int rVal=0;.#if
70f0: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
7100: 4e 55 4d 42 45 52 20 3e 3d 20 33 30 30 38 30 30  NUMBER >= 300800
7110: 37 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  7.  CollSeq *pCo
7120: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46  ll = sqlite3GetF
7130: 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65  uncCollSeq(conte
7140: 78 74 29 3b 0a 23 65 6c 73 65 0a 20 20 43 6f 6c  xt);.#else.  Col
7150: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 63 6f  lSeq *pColl = co
7160: 6e 74 65 78 74 2d 3e 70 43 6f 6c 6c 3b 0a 23 65  ntext->pColl;.#e
7170: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
7180: 61 72 67 63 3d 3d 33 20 7c 7c 61 72 67 63 3d 3d  argc==3 ||argc==
7190: 32 29 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  2);..  if( SQLIT
71a0: 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f  E_NULL==sqlite3_
71b0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
71c0: 30 5d 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55  0]) || SQLITE_NU
71d0: 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL==sqlite3_valu
71e0: 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 29  e_type(argv[1]))
71f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
7200: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
7210: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
7220: 20 20 7d 0a 0a 20 20 7a 31 20 3d 20 73 71 6c 69    }..  z1 = sqli
7230: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
7240: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
7250: 31 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  1==0 ) return;. 
7260: 20 7a 32 20 3d 20 28 75 38 2a 29 20 73 71 6c 69   z2 = (u8*) sqli
7270: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
7280: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 61 72  rgv[1]);.  if(ar
7290: 67 63 3d 3d 33 29 7b 0a 20 20 20 20 73 20 3d 20  gc==3){.    s = 
72a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
72b0: 74 28 61 72 67 76 5b 32 5d 29 2d 31 3b 0a 20 20  t(argv[2])-1;.  
72c0: 20 20 69 66 28 73 3c 30 29 7b 0a 20 20 20 20 20    if(s<0){.     
72d0: 20 73 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   s=0;.    }.  }e
72e0: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 30 3b 0a  lse{.    s = 0;.
72f0: 20 20 7d 0a 0a 20 20 72 56 61 6c 20 3d 20 5f 73    }..  rVal = _s
7300: 75 62 73 74 72 28 28 63 68 61 72 20 2a 29 7a 31  ubstr((char *)z1
7310: 2c 28 63 68 61 72 20 2a 29 7a 32 2c 73 2c 70 43  ,(char *)z2,s,pC
7320: 6f 6c 6c 2c 4e 55 4c 4c 29 3b 0a 20 20 73 71 6c  oll,NULL);.  sql
7330: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
7340: 63 6f 6e 74 65 78 74 2c 20 72 56 61 6c 2b 31 29  context, rVal+1)
7350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67 69 76 65 6e  ;.}../*.** given
7360: 20 61 20 73 74 72 69 6e 67 20 28 73 29 20 61 6e   a string (s) an
7370: 64 20 61 6e 20 69 6e 74 65 67 65 72 20 28 6e 29  d an integer (n)
7380: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 20 6c   returns the n l
7390: 65 66 74 6d 6f 73 74 20 28 55 54 46 2d 38 29 20  eftmost (UTF-8) 
73a0: 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 66  characters.** if
73b0: 20 74 68 65 20 73 74 72 69 6e 67 20 68 61 73 20   the string has 
73c0: 61 20 6c 65 6e 67 74 68 3c 3d 6e 20 6f 72 20 69  a length<=n or i
73d0: 73 20 4e 55 4c 4c 20 74 68 69 73 20 66 75 6e 63  s NULL this func
73e0: 74 69 6f 6e 20 69 73 20 4e 4f 50 0a 2a 2f 0a 73  tion is NOP.*/.s
73f0: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 66 74 46  tatic void leftF
7400: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
7410: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
7420: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
7430: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
7440: 20 69 6e 74 20 63 3d 30 3b 0a 20 20 69 6e 74 20   int c=0;.  int 
7450: 63 63 3d 30 3b 0a 20 20 69 6e 74 20 6c 3d 30 3b  cc=0;.  int l=0;
7460: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
7470: 64 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20  d char *z;      
7480: 20 2f 2a 20 69 6e 70 75 74 20 73 74 72 69 6e 67   /* input string
7490: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
74a0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 74 3b 0a 20  gned char *zt;. 
74b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
74c0: 72 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rz;            /
74d0: 2a 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20  * output string 
74e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  */..  assert( ar
74f0: 67 63 3d 3d 32 29 3b 0a 0a 20 20 69 66 28 20 53  gc==2);..  if( S
7500: 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69  QLITE_NULL==sqli
7510: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
7520: 72 67 76 5b 30 5d 29 20 7c 7c 20 53 51 4c 49 54  rgv[0]) || SQLIT
7530: 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f  E_NULL==sqlite3_
7540: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
7550: 31 5d 29 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  1])){.    sqlite
7560: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f  3_result_null(co
7570: 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75  ntext);.    retu
7580: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 20 20 3d 20  rn;.  }..  z  = 
7590: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
75a0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6c  xt(argv[0]);.  l
75b0: 20 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75    = sqlite3_valu
75c0: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a  e_int(argv[1]);.
75d0: 20 20 7a 74 20 3d 20 7a 3b 0a 0a 20 20 77 68 69    zt = z;..  whi
75e0: 6c 65 28 20 73 71 6c 69 74 65 43 68 61 72 56 61  le( sqliteCharVa
75f0: 6c 28 7a 74 29 20 26 26 20 63 2b 2b 3c 6c 29 0a  l(zt) && c++<l).
7600: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
7610: 61 72 28 7a 74 29 3b 0a 0a 20 20 63 63 3d 7a 74  ar(zt);..  cc=zt
7620: 2d 7a 3b 0a 0a 20 20 72 7a 20 3d 20 73 71 6c 69  -z;..  rz = sqli
7630: 74 65 33 5f 6d 61 6c 6c 6f 63 28 7a 74 2d 7a 2b  te3_malloc(zt-z+
7640: 31 29 3b 0a 20 20 69 66 20 28 21 72 7a 29 7b 0a  1);.  if (!rz){.
7650: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7660: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
7670: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74  ontext);.    ret
7680: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 74 72 6e 63  urn;.  }.  strnc
7690: 70 79 28 28 63 68 61 72 2a 29 20 72 7a 2c 20 28  py((char*) rz, (
76a0: 63 68 61 72 2a 29 20 7a 2c 20 7a 74 2d 7a 29 3b  char*) z, zt-z);
76b0: 0a 20 20 2a 28 72 7a 2b 63 63 29 20 3d 20 27 5c  .  *(rz+cc) = '\
76c0: 30 27 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  0';.  sqlite3_re
76d0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
76e0: 74 2c 20 28 63 68 61 72 2a 29 72 7a 2c 20 2d 31  t, (char*)rz, -1
76f0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
7700: 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  NT);.  sqlite3_f
7710: 72 65 65 28 72 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree(rz);.}../*.*
7720: 2a 20 67 69 76 65 6e 20 61 20 73 74 72 69 6e 67  * given a string
7730: 20 28 73 29 20 61 6e 64 20 61 6e 20 69 6e 74 65   (s) and an inte
7740: 67 65 72 20 28 6e 29 20 72 65 74 75 72 6e 73 20  ger (n) returns 
7750: 74 68 65 20 6e 20 72 69 67 68 74 6d 6f 73 74 20  the n rightmost 
7760: 28 55 54 46 2d 38 29 20 63 68 61 72 61 63 74 65  (UTF-8) characte
7770: 72 73 0a 2a 2a 20 69 66 20 74 68 65 20 73 74 72  rs.** if the str
7780: 69 6e 67 20 68 61 73 20 61 20 6c 65 6e 67 74 68  ing has a length
7790: 3c 3d 6e 20 6f 72 20 69 73 20 4e 55 4c 4c 20 74  <=n or is NULL t
77a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
77b0: 4e 4f 50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  NOP.*/.static vo
77c0: 69 64 20 72 69 67 68 74 46 75 6e 63 28 73 71 6c  id rightFunc(sql
77d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
77e0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
77f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7800: 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 6c 3d  *argv){.  int l=
7810: 30 3b 0a 20 20 69 6e 74 20 63 3d 30 3b 0a 20 20  0;.  int c=0;.  
7820: 69 6e 74 20 63 63 3d 30 3b 0a 20 20 63 6f 6e 73  int cc=0;.  cons
7830: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e  t char *z;.  con
7840: 73 74 20 63 68 61 72 20 2a 7a 74 3b 0a 20 20 63  st char *zt;.  c
7850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 65 3b 0a 20  onst char *ze;. 
7860: 20 63 68 61 72 20 2a 72 7a 3b 0a 0a 20 20 61 73   char *rz;..  as
7870: 73 65 72 74 28 20 61 72 67 63 3d 3d 32 29 3b 0a  sert( argc==2);.
7880: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55  .  if( SQLITE_NU
7890: 4c 4c 20 3d 3d 20 73 71 6c 69 74 65 33 5f 76 61  LL == sqlite3_va
78a0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
78b0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ) || SQLITE_NULL
78c0: 20 3d 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   == sqlite3_valu
78d0: 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 29  e_type(argv[1]))
78e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
78f0: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
7900: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
7910: 20 20 7d 0a 0a 20 20 7a 20 20 3d 20 28 63 68 61    }..  z  = (cha
7920: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
7930: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
7940: 0a 20 20 6c 20 20 3d 20 73 71 6c 69 74 65 33 5f  .  l  = sqlite3_
7950: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
7960: 5d 29 3b 0a 20 20 7a 74 20 3d 20 7a 3b 0a 0a 20  ]);.  zt = z;.. 
7970: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 43 68   while( sqliteCh
7980: 61 72 56 61 6c 28 28 75 6e 73 69 67 6e 65 64 20  arVal((unsigned 
7990: 63 68 61 72 20 2a 29 7a 74 29 21 3d 30 29 7b 0a  char *)zt)!=0){.
79a0: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
79b0: 61 72 28 7a 74 29 3b 0a 20 20 20 20 2b 2b 63 3b  ar(zt);.    ++c;
79c0: 0a 20 20 7d 0a 0a 20 20 7a 65 20 3d 20 7a 74 3b  .  }..  ze = zt;
79d0: 0a 20 20 7a 74 20 3d 20 7a 3b 0a 0a 20 20 63 63  .  zt = z;..  cc
79e0: 3d 63 2d 6c 3b 0a 20 20 69 66 28 63 63 3c 30 29  =c-l;.  if(cc<0)
79f0: 0a 20 20 20 20 63 63 3d 30 3b 0a 0a 20 20 77 68  .    cc=0;..  wh
7a00: 69 6c 65 28 20 63 63 2d 2d 20 3e 20 30 20 29 7b  ile( cc-- > 0 ){
7a10: 0a 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43  .    sqliteNextC
7a20: 68 61 72 28 7a 74 29 3b 0a 20 20 7d 0a 0a 20 20  har(zt);.  }..  
7a30: 72 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  rz = sqlite3_mal
7a40: 6c 6f 63 28 7a 65 2d 7a 74 2b 31 29 3b 0a 20 20  loc(ze-zt+1);.  
7a50: 69 66 20 28 21 72 7a 29 7b 0a 20 20 20 20 73 71  if (!rz){.    sq
7a60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
7a70: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
7a80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7a90: 20 7d 0a 20 20 73 74 72 63 70 79 28 28 63 68 61   }.  strcpy((cha
7aa0: 72 2a 29 20 72 7a 2c 20 28 63 68 61 72 2a 29 20  r*) rz, (char*) 
7ab0: 28 7a 74 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  (zt));.  sqlite3
7ac0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
7ad0: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 72 7a 2c  text, (char*)rz,
7ae0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
7af0: 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
7b00: 33 5f 66 72 65 65 28 72 7a 29 3b 0a 7d 0a 0a 23  3_free(rz);.}..#
7b10: 69 66 6e 64 65 66 20 48 41 56 45 5f 54 52 49 4d  ifndef HAVE_TRIM
7b20: 0a 2f 2a 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ./*.** removes t
7b30: 68 65 20 77 68 69 74 65 73 70 61 63 65 73 20 61  he whitespaces a
7b40: 74 20 74 68 65 20 62 65 67 69 6e 69 6e 67 20 6f  t the begining o
7b50: 66 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 63  f a string..*/.c
7b60: 6f 6e 73 74 20 63 68 61 72 2a 20 6c 74 72 69 6d  onst char* ltrim
7b70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 20 73 29 7b  (const char* s){
7b80: 0a 20 20 77 68 69 6c 65 28 20 2a 73 3d 3d 27 20  .  while( *s==' 
7b90: 27 20 29 0a 20 20 20 20 2b 2b 73 3b 0a 20 20 72  ' ).    ++s;.  r
7ba0: 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn s;.}../*.*
7bb0: 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 77 68  * removes the wh
7bc0: 69 74 65 73 70 61 63 65 73 20 61 74 20 74 68 65  itespaces at the
7bd0: 20 65 6e 64 20 6f 66 20 61 20 73 74 72 69 6e 67   end of a string
7be0: 2e 0a 2a 2a 20 21 6d 75 74 61 74 65 73 20 74 68  ..** !mutates th
7bf0: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 21 0a  e input string!.
7c00: 2a 2f 0a 76 6f 69 64 20 72 74 72 69 6d 28 63 68  */.void rtrim(ch
7c10: 61 72 2a 20 73 29 7b 0a 20 20 63 68 61 72 2a 20  ar* s){.  char* 
7c20: 73 73 20 3d 20 73 2b 73 74 72 6c 65 6e 28 73 29  ss = s+strlen(s)
7c30: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 73 73 3e  -1;.  while( ss>
7c40: 3d 73 20 26 26 20 2a 73 73 3d 3d 27 20 27 20 29  =s && *ss==' ' )
7c50: 0a 20 20 20 20 2d 2d 73 73 3b 0a 20 20 2a 28 73  .    --ss;.  *(s
7c60: 73 2b 31 29 3d 27 5c 30 27 3b 0a 7d 0a 0a 2f 2a  s+1)='\0';.}../*
7c70: 0a 2a 2a 20 20 52 65 6d 6f 76 65 73 20 74 68 65  .**  Removes the
7c80: 20 77 68 69 74 65 73 70 61 63 65 20 61 74 20 74   whitespace at t
7c90: 68 65 20 62 65 67 69 6e 69 6e 67 20 6f 66 20 61  he begining of a
7ca0: 20 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 61 74 69   string.*/.stati
7cb0: 63 20 76 6f 69 64 20 6c 74 72 69 6d 46 75 6e 63  c void ltrimFunc
7cc0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7cd0: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
7ce0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
7cf0: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f  ue **argv){.  co
7d00: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  nst char *z;..  
7d10: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 29  assert( argc==1)
7d20: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
7d30: 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61  NULL==sqlite3_va
7d40: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
7d50: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7d60: 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e  _result_null(con
7d70: 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72  text);.    retur
7d80: 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  n;.  }.  z = sql
7d90: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7da0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69  argv[0]);.  sqli
7db0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
7dc0: 63 6f 6e 74 65 78 74 2c 20 6c 74 72 69 6d 28 7a  context, ltrim(z
7dd0: 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ), -1, SQLITE_TR
7de0: 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a  ANSIENT);.}../*.
7df0: 2a 2a 20 20 52 65 6d 6f 76 65 73 20 74 68 65 20  **  Removes the 
7e00: 77 68 69 74 65 73 70 61 63 65 20 61 74 20 74 68  whitespace at th
7e10: 65 20 65 6e 64 20 6f 66 20 61 20 73 74 72 69 6e  e end of a strin
7e20: 67 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  g.*/.static void
7e30: 20 72 74 72 69 6d 46 75 6e 63 28 73 71 6c 69 74   rtrimFunc(sqlit
7e40: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7e50: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
7e60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7e70: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  rgv){.  const ch
7e80: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 72  ar *z;.  char *r
7e90: 7a 3b 0a 20 20 2f 2a 20 74 72 79 20 6e 6f 74 20  z;.  /* try not 
7ea0: 74 6f 20 63 68 61 6e 67 65 20 64 61 74 61 20 69  to change data i
7eb0: 6e 20 61 72 67 76 20 2a 2f 0a 0a 20 20 61 73 73  n argv */..  ass
7ec0: 65 72 74 28 20 61 72 67 63 3d 3d 31 29 3b 0a 0a  ert( argc==1);..
7ed0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
7ee0: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
7ef0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29  _type(argv[0]) )
7f00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
7f10: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
7f20: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
7f30: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
7f40: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7f50: 76 5b 30 5d 29 3b 0a 20 20 72 7a 20 3d 20 73 71  v[0]);.  rz = sq
7f60: 6c 69 74 65 33 53 74 72 44 75 70 28 7a 29 3b 0a  lite3StrDup(z);.
7f70: 20 20 72 74 72 69 6d 28 72 7a 29 3b 0a 20 20 73    rtrim(rz);.  s
7f80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7f90: 78 74 28 63 6f 6e 74 65 78 74 2c 20 72 7a 2c 20  xt(context, rz, 
7fa0: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
7fb0: 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
7fc0: 5f 66 72 65 65 28 72 7a 29 3b 0a 7d 0a 0a 2f 2a  _free(rz);.}../*
7fd0: 0a 2a 2a 20 20 52 65 6d 6f 76 65 73 20 74 68 65  .**  Removes the
7fe0: 20 77 68 69 74 65 73 70 61 63 65 20 61 74 20 74   whitespace at t
7ff0: 68 65 20 62 65 67 69 6e 69 6e 67 20 61 6e 64 20  he begining and 
8000: 65 6e 64 20 6f 66 20 61 20 73 74 72 69 6e 67 0a  end of a string.
8010: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
8020: 72 69 6d 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  rimFunc(sqlite3_
8030: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
8040: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
8050: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8060: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
8070: 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 72 7a 3b 0a  *z;.  char *rz;.
8080: 20 20 2f 2a 20 74 72 79 20 6e 6f 74 20 74 6f 20    /* try not to 
8090: 63 68 61 6e 67 65 20 64 61 74 61 20 69 6e 20 61  change data in a
80a0: 72 67 76 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rgv */..  assert
80b0: 28 20 61 72 67 63 3d 3d 31 29 3b 0a 0a 20 20 69  ( argc==1);..  i
80c0: 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d  f( SQLITE_NULL==
80d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
80e0: 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20  pe(argv[0]) ){. 
80f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8100: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
8110: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8120: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  z = sqlite3_v
8130: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
8140: 5d 29 3b 0a 20 20 72 7a 20 3d 20 73 71 6c 69 74  ]);.  rz = sqlit
8150: 65 33 53 74 72 44 75 70 28 7a 29 3b 0a 20 20 72  e3StrDup(z);.  r
8160: 74 72 69 6d 28 72 7a 29 3b 0a 20 20 73 71 6c 69  trim(rz);.  sqli
8170: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
8180: 63 6f 6e 74 65 78 74 2c 20 6c 74 72 69 6d 28 72  context, ltrim(r
8190: 7a 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  z), -1, SQLITE_T
81a0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
81b0: 69 74 65 33 5f 66 72 65 65 28 72 7a 29 3b 0a 7d  ite3_free(rz);.}
81c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 67  .#endif../*.** g
81d0: 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  iven a pointer t
81e0: 6f 20 61 20 73 74 72 69 6e 67 20 73 31 2c 20 74  o a string s1, t
81f0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 61  he length of tha
8200: 74 20 73 74 72 69 6e 67 20 28 6c 31 29 2c 20 61  t string (l1), a
8210: 20 6e 65 77 20 73 74 72 69 6e 67 20 28 73 32 29   new string (s2)
8220: 0a 2a 2a 20 61 6e 64 20 69 74 27 73 20 6c 65 6e  .** and it's len
8230: 67 74 68 20 28 6c 32 29 20 61 70 70 65 6e 64 73  gth (l2) appends
8240: 20 73 32 20 74 6f 20 73 31 2e 0a 2a 2a 20 41 6c   s2 to s1..** Al
8250: 6c 20 6c 65 6e 67 74 68 73 20 69 6e 20 62 79 74  l lengths in byt
8260: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6a  es..** This is j
8270: 75 73 74 20 61 6e 20 61 75 78 69 6c 69 61 72 79  ust an auxiliary
8280: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 2f 2a 0a   function.*/./*.
8290: 20 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 5f     static void _
82a0: 61 70 70 65 6e 64 28 63 68 61 72 20 2a 2a 73 31  append(char **s1
82b0: 2c 20 69 6e 74 20 6c 31 2c 20 63 6f 6e 73 74 20  , int l1, const 
82c0: 63 68 61 72 20 2a 73 32 2c 20 69 6e 74 20 6c 32  char *s2, int l2
82d0: 29 7b 0a 20 20 20 20 20 2a 73 31 20 3d 20 72 65  ){.     *s1 = re
82e0: 61 6c 6c 6f 63 28 2a 73 31 2c 20 28 6c 31 2b 6c  alloc(*s1, (l1+l
82f0: 32 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72  2+1)*sizeof(char
8300: 29 29 3b 0a 20 20 20 20 20 73 74 72 6e 63 70 79  ));.     strncpy
8310: 28 28 2a 73 31 29 2b 6c 31 2c 20 73 32 2c 20 6c  ((*s1)+l1, s2, l
8320: 32 29 3b 0a 20 20 20 20 20 2a 28 2a 28 73 31 29  2);.     *(*(s1)
8330: 2b 6c 31 2b 6c 32 29 20 3d 20 27 5c 30 27 3b 0a  +l1+l2) = '\0';.
8340: 20 20 20 7d 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66     }.*/..#ifndef
8350: 20 48 41 56 45 5f 54 52 49 4d 0a 0a 2f 2a 0a 2a   HAVE_TRIM../*.*
8360: 2a 20 67 69 76 65 6e 20 73 74 72 69 6e 67 73 20  * given strings 
8370: 73 2c 20 73 31 20 61 6e 64 20 73 32 20 72 65 70  s, s1 and s2 rep
8380: 6c 61 63 65 73 20 6f 63 63 75 72 72 65 6e 63 65  laces occurrence
8390: 73 20 6f 66 20 73 31 20 69 6e 20 73 20 62 79 20  s of s1 in s by 
83a0: 73 32 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s2.*/.static voi
83b0: 64 20 72 65 70 6c 61 63 65 46 75 6e 63 28 73 71  d replaceFunc(sq
83c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
83d0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
83e0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
83f0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
8400: 20 63 68 61 72 20 2a 7a 31 3b 20 20 20 20 20 2f   char *z1;     /
8410: 2a 20 73 74 72 69 6e 67 20 73 20 28 66 69 72 73  * string s (firs
8420: 74 20 70 61 72 61 6d 65 74 65 72 29 20 2a 2f 0a  t parameter) */.
8430: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
8440: 3b 20 20 20 20 20 2f 2a 20 73 74 72 69 6e 67 20  ;     /* string 
8450: 73 31 20 28 73 65 63 6f 6e 64 20 70 61 72 61 6d  s1 (second param
8460: 65 74 65 72 29 20 73 74 72 69 6e 67 20 74 6f 20  eter) string to 
8470: 6c 6f 6f 6b 20 66 6f 72 20 2a 2f 0a 20 20 63 6f  look for */.  co
8480: 6e 73 74 20 63 68 61 72 20 2a 7a 33 3b 20 20 20  nst char *z3;   
8490: 20 20 2f 2a 20 73 74 72 69 6e 67 20 73 32 20 28    /* string s2 (
84a0: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 29  third parameter)
84b0: 20 73 74 72 69 6e 67 20 74 6f 20 72 65 70 6c 61   string to repla
84c0: 63 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  ce occurrences o
84d0: 66 20 73 31 20 77 69 74 68 20 2a 2f 0a 20 20 69  f s1 with */.  i
84e0: 6e 74 20 6c 7a 31 3b 0a 20 20 69 6e 74 20 6c 7a  nt lz1;.  int lz
84f0: 32 3b 0a 20 20 69 6e 74 20 6c 7a 33 3b 0a 20 20  2;.  int lz3;.  
8500: 69 6e 74 20 6c 7a 6f 3d 30 3b 0a 20 20 63 68 61  int lzo=0;.  cha
8510: 72 20 2a 7a 6f 3d 30 3b 0a 20 20 69 6e 74 20 72  r *zo=0;.  int r
8520: 65 74 3d 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68  et=0;.  const ch
8530: 61 72 20 2a 7a 74 31 3b 0a 20 20 63 6f 6e 73 74  ar *zt1;.  const
8540: 20 63 68 61 72 20 2a 7a 74 32 3b 0a 0a 20 20 61   char *zt2;..  a
8550: 73 73 65 72 74 28 20 33 3d 3d 61 72 67 63 20 29  ssert( 3==argc )
8560: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
8570: 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61  NULL==sqlite3_va
8580: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8590: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
85a0: 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e  _result_null(con
85b0: 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72  text);.    retur
85c0: 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 31 20 3d 20 73  n;.  }..  z1 = s
85d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
85e0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 32  t(argv[0]);.  z2
85f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8600: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
8610: 20 20 7a 33 20 3d 20 73 71 6c 69 74 65 33 5f 76    z3 = sqlite3_v
8620: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32  alue_text(argv[2
8630: 5d 29 3b 0a 20 20 2f 2a 20 68 61 6e 64 6c 65 20  ]);.  /* handle 
8640: 70 6f 73 73 69 62 6c 65 20 6e 75 6c 6c 20 76 61  possible null va
8650: 6c 75 65 73 20 2a 2f 0a 20 20 69 66 28 20 30 3d  lues */.  if( 0=
8660: 3d 7a 32 20 29 7b 0a 20 20 20 20 7a 32 3d 22 22  =z2 ){.    z2=""
8670: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 30 3d 3d 7a  ;.  }.  if( 0==z
8680: 33 20 29 7b 0a 20 20 20 20 7a 33 3d 22 22 3b 0a  3 ){.    z3="";.
8690: 20 20 7d 0a 0a 20 20 6c 7a 31 20 3d 20 73 74 72    }..  lz1 = str
86a0: 6c 65 6e 28 7a 31 29 3b 0a 20 20 6c 7a 32 20 3d  len(z1);.  lz2 =
86b0: 20 73 74 72 6c 65 6e 28 7a 32 29 3b 0a 20 20 6c   strlen(z2);.  l
86c0: 7a 33 20 3d 20 73 74 72 6c 65 6e 28 7a 33 29 3b  z3 = strlen(z3);
86d0: 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 73 70 65  ..#if 0.  /* spe
86e0: 63 69 61 6c 20 63 61 73 65 20 77 68 65 6e 20 7a  cial case when z
86f0: 32 20 69 73 20 65 6d 70 74 79 20 28 6f 72 20 6e  2 is empty (or n
8700: 75 6c 6c 29 20 6e 6f 74 68 69 6e 67 20 77 69 6c  ull) nothing wil
8710: 6c 20 62 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  l be changed */.
8720: 20 20 69 66 28 20 30 3d 3d 6c 7a 32 20 29 7b 0a    if( 0==lz2 ){.
8730: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8740: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
8750: 20 7a 31 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f   z1, -1, SQLITE_
8760: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
8770: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
8780: 69 66 0a 0a 20 20 7a 74 31 3d 7a 31 3b 0a 20 20  if..  zt1=z1;.  
8790: 7a 74 32 3d 7a 31 3b 0a 0a 20 20 77 68 69 6c 65  zt2=z1;..  while
87a0: 28 31 29 7b 0a 20 20 20 20 72 65 74 3d 5f 73 75  (1){.    ret=_su
87b0: 62 73 74 72 28 7a 32 2c 7a 74 31 20 2c 20 30 2c  bstr(z2,zt1 , 0,
87c0: 20 26 7a 74 32 29 3b 0a 0a 20 20 20 20 69 66 28   &zt2);..    if(
87d0: 20 72 65 74 3c 30 20 29 0a 20 20 20 20 20 20 62   ret<0 ).      b
87e0: 72 65 61 6b 3b 0a 0a 20 20 20 20 5f 61 70 70 65  reak;..    _appe
87f0: 6e 64 28 26 7a 6f 2c 20 6c 7a 6f 2c 20 7a 74 31  nd(&zo, lzo, zt1
8800: 2c 20 7a 74 32 2d 7a 74 31 29 3b 0a 20 20 20 20  , zt2-zt1);.    
8810: 6c 7a 6f 2b 3d 7a 74 32 2d 7a 74 31 3b 0a 20 20  lzo+=zt2-zt1;.  
8820: 20 20 5f 61 70 70 65 6e 64 28 26 7a 6f 2c 20 6c    _append(&zo, l
8830: 7a 6f 2c 20 7a 33 2c 20 6c 7a 33 29 3b 0a 20 20  zo, z3, lz3);.  
8840: 20 20 6c 7a 6f 2b 3d 6c 7a 33 3b 0a 0a 20 20 20    lzo+=lz3;..   
8850: 20 7a 74 31 3d 7a 74 32 2b 6c 7a 32 3b 0a 20 20   zt1=zt2+lz2;.  
8860: 7d 0a 20 20 5f 61 70 70 65 6e 64 28 26 7a 6f 2c  }.  _append(&zo,
8870: 20 6c 7a 6f 2c 20 7a 74 31 2c 20 6c 7a 31 2d 28   lzo, zt1, lz1-(
8880: 7a 74 31 2d 7a 31 29 29 3b 0a 20 20 73 71 6c 69  zt1-z1));.  sqli
8890: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
88a0: 63 6f 6e 74 65 78 74 2c 20 7a 6f 2c 20 2d 31 2c  context, zo, -1,
88b0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
88c0: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  T);.  sqlite3_fr
88d0: 65 65 28 7a 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  ee(zo);.}.#endif
88e0: 0a 0a 2f 2a 0a 2a 2a 20 67 69 76 65 6e 20 61 20  ../*.** given a 
88f0: 73 74 72 69 6e 67 20 72 65 74 75 72 6e 73 20 74  string returns t
8900: 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 62  he same string b
8910: 75 74 20 77 69 74 68 20 74 68 65 20 63 68 61 72  ut with the char
8920: 61 63 74 65 72 73 20 69 6e 20 72 65 76 65 72 73  acters in revers
8930: 65 20 6f 72 64 65 72 0a 2a 2f 0a 73 74 61 74 69  e order.*/.stati
8940: 63 20 76 6f 69 64 20 72 65 76 65 72 73 65 46 75  c void reverseFu
8950: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
8960: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
8970: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
8980: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
8990: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
89a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 74 3b   const char *zt;
89b0: 0a 20 20 63 68 61 72 20 2a 72 7a 3b 0a 20 20 63  .  char *rz;.  c
89c0: 68 61 72 20 2a 72 7a 74 3b 0a 20 20 69 6e 74 20  har *rzt;.  int 
89d0: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 20 3d  l = 0;.  int i =
89e0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 31   0;..  assert( 1
89f0: 3d 3d 61 72 67 63 20 29 3b 0a 0a 20 20 69 66 28  ==argc );..  if(
8a00: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71   SQLITE_NULL==sq
8a10: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8a20: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
8a30: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8a40: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
8a50: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8a60: 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c   z = (char *)sql
8a70: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8a80: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6c 20 3d 20  argv[0]);.  l = 
8a90: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 72 7a 20  strlen(z);.  rz 
8aa0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8ab0: 28 6c 2b 31 29 3b 0a 20 20 69 66 20 28 21 72 7a  (l+1);.  if (!rz
8ac0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
8ad0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
8ae0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
8af0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 7a  return;.  }.  rz
8b00: 74 20 3d 20 72 7a 2b 6c 3b 0a 20 20 2a 28 72 7a  t = rz+l;.  *(rz
8b10: 74 2d 2d 29 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  t--) = '\0';..  
8b20: 7a 74 3d 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73  zt=z;.  while( s
8b30: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 28 75 6e  qliteCharVal((un
8b40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 74  signed char *)zt
8b50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 7a 3d 7a 74  )!=0 ){.    z=zt
8b60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74  ;.    sqliteNext
8b70: 43 68 61 72 28 7a 74 29 3b 0a 20 20 20 20 66 6f  Char(zt);.    fo
8b80: 72 28 69 3d 31 3b 20 7a 74 2d 69 3e 3d 7a 3b 20  r(i=1; zt-i>=z; 
8b90: 2b 2b 69 29 7b 0a 20 20 20 20 20 20 2a 28 72 7a  ++i){.      *(rz
8ba0: 74 2d 2d 29 3d 2a 28 7a 74 2d 69 29 3b 0a 20 20  t--)=*(zt-i);.  
8bb0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
8bc0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
8bd0: 6f 6e 74 65 78 74 2c 20 72 7a 2c 20 2d 31 2c 20  ontext, rz, -1, 
8be0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
8c00: 65 28 72 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(rz);.}../*.** 
8c10: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
8c20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
8c30: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65  ucture holds the
8c40: 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a   context of a.**
8c50: 20 73 74 64 65 76 28 29 20 6f 72 20 76 61 72 69   stdev() or vari
8c60: 61 6e 63 65 28 29 20 61 67 67 72 65 67 61 74 65  ance() aggregate
8c70: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2a   computation..**
8c80: 20 69 6d 70 6c 65 6d 65 6e 74 61 69 6f 6e 20 6f   implementaion o
8c90: 66 20 68 74 74 70 73 3a 2f 2f 65 6e 2e 77 69 6b  f https://en.wik
8ca0: 69 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f  ipedia.org/wiki/
8cb0: 41 6c 67 6f 72 69 74 68 6d 73 5f 66 6f 72 5f 63  Algorithms_for_c
8cc0: 61 6c 63 75 6c 61 74 69 6e 67 5f 76 61 72 69 61  alculating_varia
8cd0: 6e 63 65 23 41 6c 67 6f 72 69 74 68 6d 5f 49 49  nce#Algorithm_II
8ce0: 0a 2a 2a 20 6c 65 73 73 20 70 72 6f 6e 65 20 74  .** less prone t
8cf0: 6f 20 72 6f 75 6e 64 69 6e 67 20 65 72 72 6f 72  o rounding error
8d00: 73 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s.*/.typedef str
8d10: 75 63 74 20 53 74 64 65 76 43 74 78 20 53 74 64  uct StdevCtx Std
8d20: 65 76 43 74 78 3b 0a 73 74 72 75 63 74 20 53 74  evCtx;.struct St
8d30: 64 65 76 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c  devCtx {.  doubl
8d40: 65 20 72 4d 3b 0a 20 20 64 6f 75 62 6c 65 20 72  e rM;.  double r
8d50: 53 3b 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20  S;.  i64 cnt;   
8d60: 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72         /* number
8d70: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
8d80: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
8d90: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
8da0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
8db0: 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74 65   holds the conte
8dc0: 78 74 20 6f 66 20 61 0a 2a 2a 20 6d 6f 64 65 28  xt of a.** mode(
8dd0: 29 20 6f 72 20 6d 65 64 69 61 6e 28 29 20 61 67  ) or median() ag
8de0: 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61 74  gregate computat
8df0: 69 6f 6e 2e 0a 2a 2a 20 44 65 70 65 6e 64 73 20  ion..** Depends 
8e00: 6f 6e 20 73 74 72 75 63 74 75 72 65 73 20 64 65  on structures de
8e10: 66 69 6e 65 64 20 69 6e 20 6d 61 70 2e 63 20 28  fined in map.c (
8e20: 73 65 65 20 6d 61 70 20 26 20 6d 61 70 29 0a 2a  see map & map).*
8e30: 2a 20 54 68 65 73 65 20 61 67 67 72 65 67 61 74  * These aggregat
8e40: 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 6e 6c 79  e functions only
8e50: 20 77 6f 72 6b 20 66 6f 72 20 69 6e 74 65 67 65   work for intege
8e60: 72 73 20 61 6e 64 20 66 6c 6f 61 74 73 20 61 6c  rs and floats al
8e70: 74 68 6f 75 67 68 0a 2a 2a 20 74 68 65 79 20 63  though.** they c
8e80: 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74 6f 20  ould be made to 
8e90: 77 6f 72 6b 20 66 6f 72 20 73 74 72 69 6e 67 73  work for strings
8ea0: 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
8eb0: 79 20 63 6f 6e 73 69 64 65 72 65 64 20 6d 65 61  y considered mea
8ec0: 6e 69 6e 67 6c 65 73 73 2e 0a 2a 2a 20 4f 6e 6c  ningless..** Onl
8ed0: 79 20 75 73 75 61 6c 6c 20 6f 72 64 65 72 20 28  y usuall order (
8ee0: 66 6f 72 20 6d 65 64 69 61 6e 29 2c 20 6e 6f 20  for median), no 
8ef0: 75 73 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e  use of collation
8f00: 20 66 75 6e 63 74 69 6f 6e 73 20 28 77 6f 75 6c   functions (woul
8f10: 64 20 74 68 69 73 20 65 76 65 6e 20 6d 61 6b 65  d this even make
8f20: 20 73 65 6e 73 65 3f 29 0a 2a 2f 0a 74 79 70 65   sense?).*/.type
8f30: 64 65 66 20 73 74 72 75 63 74 20 4d 6f 64 65 43  def struct ModeC
8f40: 74 78 20 4d 6f 64 65 43 74 78 3b 0a 73 74 72 75  tx ModeCtx;.stru
8f50: 63 74 20 4d 6f 64 65 43 74 78 20 7b 0a 20 20 69  ct ModeCtx {.  i
8f60: 36 34 20 72 69 4d 3b 20 20 20 20 20 20 20 20 20  64 riM;         
8f70: 20 20 20 2f 2a 20 69 6e 74 65 67 65 72 20 76 61     /* integer va
8f80: 6c 75 65 20 66 6f 75 6e 64 20 73 6f 20 66 61 72  lue found so far
8f90: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 64 4d   */.  double rdM
8fa0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 75  ;         /* dou
8fb0: 62 6c 65 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ble value found 
8fc0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 36 34 20  so far */.  i64 
8fd0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
8fe0: 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* number of ele
8ff0: 6d 65 6e 74 73 20 73 6f 20 66 61 72 20 2a 2f 0a  ments so far */.
9000: 20 20 64 6f 75 62 6c 65 20 70 63 6e 74 3b 20 20    double pcnt;  
9010: 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20        /* number 
9020: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 73 6d 61 6c  of elements smal
9030: 6c 65 72 20 74 68 61 6e 20 61 20 70 65 72 63 65  ler than a perce
9040: 6e 74 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6d  ntile */.  i64 m
9050: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  cnt;           /
9060: 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * maximum number
9070: 20 6f 66 20 6f 63 63 75 72 72 65 6e 63 65 73 20   of occurrences 
9080: 28 66 6f 72 20 6d 6f 64 65 29 20 2a 2f 0a 20 20  (for mode) */.  
9090: 69 36 34 20 6d 6e 3b 20 20 20 20 20 20 20 20 20  i64 mn;         
90a0: 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
90b0: 20 6f 63 63 75 72 72 65 6e 63 65 73 20 28 66 6f   occurrences (fo
90c0: 72 20 6d 6f 64 65 20 61 6e 64 20 70 65 72 63 65  r mode and perce
90d0: 6e 74 69 6c 65 73 29 20 2a 2f 0a 20 20 69 36 34  ntiles) */.  i64
90e0: 20 69 73 5f 64 6f 75 62 6c 65 3b 20 20 20 20 20   is_double;     
90f0: 20 2f 2a 20 77 68 65 74 68 65 72 20 74 68 65 20   /* whether the 
9100: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 62  computation is b
9110: 65 69 6e 67 20 64 6f 6e 65 20 66 6f 72 20 64 6f  eing done for do
9120: 75 62 6c 65 73 20 28 3e 30 29 20 6f 72 20 69 6e  ubles (>0) or in
9130: 74 65 67 65 72 73 20 28 3d 30 29 20 2a 2f 0a 20  tegers (=0) */. 
9140: 20 6d 61 70 2a 20 6d 3b 20 20 20 20 20 20 20 20   map* m;        
9150: 20 20 20 20 20 2f 2a 20 6d 61 70 20 73 74 72 75       /* map stru
9160: 63 74 75 72 65 20 75 73 65 64 20 66 6f 72 20 74  cture used for t
9170: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 2a  he computation *
9180: 2f 0a 20 20 69 6e 74 20 64 6f 6e 65 3b 20 20 20  /.  int done;   
9190: 20 20 20 20 20 20 20 20 2f 2a 20 77 68 65 74 68          /* wheth
91a0: 65 72 20 74 68 65 20 61 6e 73 77 65 72 20 68 61  er the answer ha
91b0: 73 20 62 65 65 6e 20 66 6f 75 6e 64 20 2a 2f 0a  s been found */.
91c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 63 61 6c 6c 65 64  };../*.** called
91d0: 20 66 6f 72 20 65 61 63 68 20 76 61 6c 75 65 20   for each value 
91e0: 72 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20  received during 
91f0: 61 20 63 61 6c 63 75 6c 61 74 69 6f 6e 20 6f 66  a calculation of
9200: 20 73 74 64 65 76 20 6f 72 20 76 61 72 69 61 6e   stdev or varian
9210: 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce.*/.static voi
9220: 64 20 76 61 72 69 61 6e 63 65 53 74 65 70 28 73  d varianceStep(s
9230: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9240: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
9250: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
9260: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 74 64 65   **argv){.  Stde
9270: 76 43 74 78 20 2a 70 3b 0a 0a 20 20 64 6f 75 62  vCtx *p;..  doub
9280: 6c 65 20 64 65 6c 74 61 3b 0a 20 20 64 6f 75 62  le delta;.  doub
9290: 6c 65 20 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  le x;..  assert(
92a0: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 70 20   argc==1 );.  p 
92b0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
92c0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
92d0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
92e0: 3b 0a 20 20 2f 2a 20 6f 6e 6c 79 20 63 6f 6e 73  ;.  /* only cons
92f0: 69 64 65 72 20 6e 6f 6e 2d 6e 75 6c 6c 20 76 61  ider non-null va
9300: 6c 75 65 73 20 2a 2f 0a 20 20 69 66 28 20 53 51  lues */.  if( SQ
9310: 4c 49 54 45 5f 4e 55 4c 4c 20 21 3d 20 73 71 6c  LITE_NULL != sql
9320: 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72  ite3_value_numer
9330: 69 63 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ic_type(argv[0])
9340: 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e 74 2b 2b   ){.    p->cnt++
9350: 3b 0a 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65  ;.    x = sqlite
9360: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
9370: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 64 65 6c  rgv[0]);.    del
9380: 74 61 20 3d 20 28 78 2d 70 2d 3e 72 4d 29 3b 0a  ta = (x-p->rM);.
9390: 20 20 20 20 70 2d 3e 72 4d 20 2b 3d 20 64 65 6c      p->rM += del
93a0: 74 61 2f 70 2d 3e 63 6e 74 3b 0a 20 20 20 20 70  ta/p->cnt;.    p
93b0: 2d 3e 72 53 20 2b 3d 20 64 65 6c 74 61 2a 28 78  ->rS += delta*(x
93c0: 2d 70 2d 3e 72 4d 29 3b 0a 20 20 7d 0a 7d 0a 0a  -p->rM);.  }.}..
93d0: 2f 2a 0a 2a 2a 20 63 61 6c 6c 65 64 20 66 6f 72  /*.** called for
93e0: 20 65 61 63 68 20 76 61 6c 75 65 20 72 65 63 65   each value rece
93f0: 69 76 65 64 20 64 75 72 69 6e 67 20 61 20 63 61  ived during a ca
9400: 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 6d 6f 64  lculation of mod
9410: 65 20 6f 66 20 6d 65 64 69 61 6e 0a 2a 2f 0a 73  e of median.*/.s
9420: 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 64 65 53  tatic void modeS
9430: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
9440: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
9450: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
9460: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
9470: 20 4d 6f 64 65 43 74 78 20 2a 70 3b 0a 20 20 69   ModeCtx *p;.  i
9480: 36 34 20 78 69 3d 30 3b 0a 20 20 64 6f 75 62 6c  64 xi=0;.  doubl
9490: 65 20 78 64 3d 30 2e 30 3b 0a 20 20 69 36 34 20  e xd=0.0;.  i64 
94a0: 2a 69 70 74 72 3b 0a 20 20 64 6f 75 62 6c 65 20  *iptr;.  double 
94b0: 2a 64 70 74 72 3b 0a 20 20 69 6e 74 20 74 79 70  *dptr;.  int typ
94c0: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  e;..  assert( ar
94d0: 67 63 3d 3d 31 20 29 3b 0a 20 20 74 79 70 65 20  gc==1 );.  type 
94e0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
94f0: 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67  numeric_type(arg
9500: 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20 74 79  v[0]);..  if( ty
9510: 70 65 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  pe == SQLITE_NUL
9520: 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  L).    return;..
9530: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
9540: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
9550: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
9560: 2a 70 29 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d  *p));..  if( 0==
9570: 28 70 2d 3e 6d 29 20 29 7b 0a 20 20 20 20 70 2d  (p->m) ){.    p-
9580: 3e 6d 20 3d 20 63 61 6c 6c 6f 63 28 31 2c 20 73  >m = calloc(1, s
9590: 69 7a 65 6f 66 28 6d 61 70 29 29 3b 0a 20 20 20  izeof(map));.   
95a0: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
95b0: 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
95c0: 20 20 20 2f 2a 20 6d 61 70 20 77 69 6c 6c 20 62     /* map will b
95d0: 65 20 75 73 65 64 20 66 6f 72 20 69 6e 74 65 67  e used for integ
95e0: 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 2a 28 70  ers */.      *(p
95f0: 2d 3e 6d 29 20 3d 20 6d 61 70 5f 6d 61 6b 65 28  ->m) = map_make(
9600: 69 6e 74 5f 63 6d 70 29 3b 0a 20 20 20 20 20 20  int_cmp);.      
9610: 70 2d 3e 69 73 5f 64 6f 75 62 6c 65 20 3d 20 30  p->is_double = 0
9620: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9630: 20 20 20 70 2d 3e 69 73 5f 64 6f 75 62 6c 65 20     p->is_double 
9640: 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 6d 61  = 1;.      /* ma
9650: 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  p will be used f
9660: 6f 72 20 64 6f 75 62 6c 65 73 20 2a 2f 0a 20 20  or doubles */.  
9670: 20 20 20 20 2a 28 70 2d 3e 6d 29 20 3d 20 6d 61      *(p->m) = ma
9680: 70 5f 6d 61 6b 65 28 64 6f 75 62 6c 65 5f 63 6d  p_make(double_cm
9690: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
96a0: 20 2b 2b 28 70 2d 3e 63 6e 74 29 3b 0a 0a 20 20   ++(p->cnt);..  
96b0: 69 66 28 20 30 3d 3d 70 2d 3e 69 73 5f 64 6f 75  if( 0==p->is_dou
96c0: 62 6c 65 20 29 7b 0a 20 20 20 20 78 69 20 3d 20  ble ){.    xi = 
96d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
96e0: 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t64(argv[0]);.  
96f0: 20 20 69 70 74 72 20 3d 20 28 69 36 34 2a 29 63    iptr = (i64*)c
9700: 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 69  alloc(1,sizeof(i
9710: 36 34 29 29 3b 0a 20 20 20 20 2a 69 70 74 72 20  64));.    *iptr 
9720: 3d 20 78 69 3b 0a 20 20 20 20 6d 61 70 5f 69 6e  = xi;.    map_in
9730: 73 65 72 74 28 70 2d 3e 6d 2c 20 69 70 74 72 29  sert(p->m, iptr)
9740: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
9750: 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
9760: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d  e_double(argv[0]
9770: 29 3b 0a 20 20 20 20 64 70 74 72 20 3d 20 28 64  );.    dptr = (d
9780: 6f 75 62 6c 65 2a 29 63 61 6c 6c 6f 63 28 31 2c  ouble*)calloc(1,
9790: 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29 29 3b  sizeof(double));
97a0: 0a 20 20 20 20 2a 64 70 74 72 20 3d 20 78 64 3b  .    *dptr = xd;
97b0: 0a 20 20 20 20 6d 61 70 5f 69 6e 73 65 72 74 28  .    map_insert(
97c0: 70 2d 3e 6d 2c 20 64 70 74 72 29 3b 0a 20 20 7d  p->m, dptr);.  }
97d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 41 75 78 69 6c  .}../*.**  Auxil
97e0: 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 20 74 68  iary function th
97f0: 61 74 20 69 74 65 72 61 74 65 73 20 61 6c 6c 20  at iterates all 
9800: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 20 6d 61  elements in a ma
9810: 70 20 61 6e 64 20 66 69 6e 64 73 20 74 68 65 20  p and finds the 
9820: 6d 6f 64 65 0a 2a 2a 20 20 28 6d 6f 73 74 20 66  mode.**  (most f
9830: 72 65 71 75 65 6e 74 20 76 61 6c 75 65 29 0a 2a  requent value).*
9840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
9850: 64 65 49 74 65 72 61 74 65 28 76 6f 69 64 2a 20  deIterate(void* 
9860: 65 2c 20 69 6e 74 36 34 5f 74 20 63 2c 20 76 6f  e, int64_t c, vo
9870: 69 64 2a 20 70 70 29 7b 0a 20 20 69 6e 74 36 34  id* pp){.  int64
9880: 5f 74 20 65 69 3b 0a 20 20 64 6f 75 62 6c 65 20  _t ei;.  double 
9890: 65 64 3b 0a 20 20 4d 6f 64 65 43 74 78 20 2a 70  ed;.  ModeCtx *p
98a0: 20 3d 20 28 4d 6f 64 65 43 74 78 2a 29 70 70 3b   = (ModeCtx*)pp;
98b0: 0a 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e 69 73  ..  if( 0==p->is
98c0: 5f 64 6f 75 62 6c 65 20 29 7b 0a 20 20 20 20 65  _double ){.    e
98d0: 69 20 3d 20 2a 28 69 6e 74 2a 29 28 65 29 3b 0a  i = *(int*)(e);.
98e0: 0a 09 69 66 28 20 70 2d 3e 6d 63 6e 74 3d 3d 63  ..if( p->mcnt==c
98f0: 20 29 7b 0a 20 20 20 20 20 20 2b 2b 70 2d 3e 6d   ){.      ++p->m
9900: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
9910: 20 70 2d 3e 6d 63 6e 74 3c 63 20 29 7b 0a 20 20   p->mcnt<c ){.  
9920: 20 20 20 20 70 2d 3e 72 69 4d 20 3d 20 65 69 3b      p->riM = ei;
9930: 0a 20 20 20 20 20 20 70 2d 3e 6d 63 6e 74 20 3d  .      p->mcnt =
9940: 20 63 3b 0a 09 20 20 70 2d 3e 6d 6e 3d 31 3b 0a   c;..  p->mn=1;.
9950: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9960: 20 20 20 65 64 20 3d 20 2a 28 64 6f 75 62 6c 65     ed = *(double
9970: 2a 29 28 65 29 3b 0a 0a 09 69 66 28 20 70 2d 3e  *)(e);...if( p->
9980: 6d 63 6e 74 3d 3d 63 20 29 7b 0a 20 20 20 20 20  mcnt==c ){.     
9990: 20 2b 2b 70 2d 3e 6d 6e 3b 0a 20 20 20 20 7d 65   ++p->mn;.    }e
99a0: 6c 73 65 20 69 66 28 70 2d 3e 6d 63 6e 74 3c 63  lse if(p->mcnt<c
99b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 64 4d 20  ){.      p->rdM 
99c0: 3d 20 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d  = ed;.      p->m
99d0: 63 6e 74 20 3d 20 63 3b 0a 09 20 20 70 2d 3e 6d  cnt = c;..  p->m
99e0: 6e 3d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  n=1;.    }.  }.}
99f0: 0a 0a 2f 2a 0a 2a 2a 20 20 41 75 78 69 6c 69 61  ../*.**  Auxilia
9a00: 72 79 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ry function that
9a10: 20 69 74 65 72 61 74 65 73 20 61 6c 6c 20 65 6c   iterates all el
9a20: 65 6d 65 6e 74 73 20 69 6e 20 61 20 6d 61 70 20  ements in a map 
9a30: 61 6e 64 20 66 69 6e 64 73 20 74 68 65 20 6d 65  and finds the me
9a40: 64 69 61 6e 0a 2a 2a 20 20 28 74 68 65 20 76 61  dian.**  (the va
9a50: 6c 75 65 20 73 75 63 68 20 74 68 61 74 20 74 68  lue such that th
9a60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
9a70: 65 6e 74 73 20 73 6d 61 6c 6c 65 72 20 69 73 20  ents smaller is 
9a80: 65 71 75 61 6c 20 74 68 65 20 74 68 65 20 6e 75  equal the the nu
9a90: 6d 62 65 72 20 6f 66 0a 2a 2a 20 20 65 6c 65 6d  mber of.**  elem
9aa0: 65 6e 74 73 20 6c 61 72 67 65 72 29 0a 2a 2f 0a  ents larger).*/.
9ab0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 64 69  static void medi
9ac0: 61 6e 49 74 65 72 61 74 65 28 76 6f 69 64 2a 20  anIterate(void* 
9ad0: 65 2c 20 69 6e 74 36 34 5f 74 20 63 2c 20 76 6f  e, int64_t c, vo
9ae0: 69 64 2a 20 70 70 29 7b 0a 20 20 69 6e 74 36 34  id* pp){.  int64
9af0: 5f 74 20 65 69 3b 0a 20 20 64 6f 75 62 6c 65 20  _t ei;.  double 
9b00: 65 64 3b 0a 20 20 64 6f 75 62 6c 65 20 69 4c 3b  ed;.  double iL;
9b10: 0a 20 20 64 6f 75 62 6c 65 20 69 52 3b 0a 20 20  .  double iR;.  
9b20: 69 6e 74 20 69 6c 3b 0a 20 20 69 6e 74 20 69 72  int il;.  int ir
9b30: 3b 0a 20 20 4d 6f 64 65 43 74 78 20 2a 70 20 3d  ;.  ModeCtx *p =
9b40: 20 28 4d 6f 64 65 43 74 78 2a 29 70 70 3b 0a 0a   (ModeCtx*)pp;..
9b50: 20 20 69 66 28 70 2d 3e 64 6f 6e 65 3e 30 29 0a    if(p->done>0).
9b60: 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69      return;..  i
9b70: 4c 20 3d 20 70 2d 3e 70 63 6e 74 3b 0a 20 20 69  L = p->pcnt;.  i
9b80: 52 20 3d 20 70 2d 3e 63 6e 74 20 2d 20 70 2d 3e  R = p->cnt - p->
9b90: 70 63 6e 74 3b 0a 20 20 69 6c 20 3d 20 70 2d 3e  pcnt;.  il = p->
9ba0: 6d 63 6e 74 20 2b 20 63 3b 0a 20 20 69 72 20 3d  mcnt + c;.  ir =
9bb0: 20 70 2d 3e 63 6e 74 20 2d 20 70 2d 3e 6d 63 6e   p->cnt - p->mcn
9bc0: 74 3b 0a 0a 20 20 69 66 28 20 69 6c 20 3e 3d 20  t;..  if( il >= 
9bd0: 69 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 69 72  iL ){.    if( ir
9be0: 20 3e 3d 20 69 52 20 29 7b 0a 20 20 20 20 2b 2b   >= iR ){.    ++
9bf0: 70 2d 3e 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  p->mn;.      if(
9c00: 20 30 3d 3d 70 2d 3e 69 73 5f 64 6f 75 62 6c 65   0==p->is_double
9c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 69 20 3d   ){.        ei =
9c20: 20 2a 28 69 6e 74 2a 29 28 65 29 3b 0a 20 20 20   *(int*)(e);.   
9c30: 20 20 20 20 20 70 2d 3e 72 69 4d 20 2b 3d 20 65       p->riM += e
9c40: 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  i;.      }else{.
9c50: 20 20 20 20 20 20 20 20 65 64 20 3d 20 2a 28 64          ed = *(d
9c60: 6f 75 62 6c 65 2a 29 28 65 29 3b 0a 20 20 20 20  ouble*)(e);.    
9c70: 20 20 20 20 70 2d 3e 72 64 4d 20 2b 3d 20 65 64      p->rdM += ed
9c80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
9c90: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 6f  lse{.      p->do
9ca0: 6e 65 3d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ne=1;.    }.  }.
9cb0: 20 20 70 2d 3e 6d 63 6e 74 2b 3d 63 3b 0a 7d 0a    p->mcnt+=c;.}.
9cc0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  ./*.** Returns t
9cd0: 68 65 20 6d 6f 64 65 20 76 61 6c 75 65 0a 2a 2f  he mode value.*/
9ce0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 64  .static void mod
9cf0: 65 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  eFinalize(sqlite
9d00: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
9d10: 78 74 29 7b 0a 20 20 4d 6f 64 65 43 74 78 20 2a  xt){.  ModeCtx *
9d20: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  p;.  p = sqlite3
9d30: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
9d40: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
9d50: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6d 20    if( p && p->m 
9d60: 29 7b 0a 20 20 20 20 6d 61 70 5f 69 74 65 72 61  ){.    map_itera
9d70: 74 65 28 70 2d 3e 6d 2c 20 6d 6f 64 65 49 74 65  te(p->m, modeIte
9d80: 72 61 74 65 2c 20 70 29 3b 0a 20 20 20 20 6d 61  rate, p);.    ma
9d90: 70 5f 64 65 73 74 72 6f 79 28 70 2d 3e 6d 29 3b  p_destroy(p->m);
9da0: 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 6d 29 3b  .    free(p->m);
9db0: 0a 0a 20 20 20 20 69 66 28 20 31 3d 3d 70 2d 3e  ..    if( 1==p->
9dc0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  mn ){.      if( 
9dd0: 30 3d 3d 70 2d 3e 69 73 5f 64 6f 75 62 6c 65 20  0==p->is_double 
9de0: 29 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ).        sqlite
9df0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
9e00: 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 69 4d 29 3b  ontext, p->riM);
9e10: 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20  .      else.    
9e20: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9e30: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
9e40: 74 2c 20 70 2d 3e 72 64 4d 29 3b 0a 20 20 20 20  t, p->rdM);.    
9e50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61  }.  }.}../*.** a
9e60: 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f  uxiliary functio
9e70: 6e 20 66 6f 72 20 70 65 72 63 65 6e 74 69 6c 65  n for percentile
9e80: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
9e90: 20 5f 6d 65 64 69 61 6e 46 69 6e 61 6c 69 7a 65   _medianFinalize
9ea0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
9eb0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 6f   *context){.  Mo
9ec0: 64 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  deCtx *p;.  p = 
9ed0: 28 4d 6f 64 65 43 74 78 2a 29 20 73 71 6c 69 74  (ModeCtx*) sqlit
9ee0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
9ef0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
9f00: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
9f10: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 64 6f 6e 65  m ){.    p->done
9f20: 3d 30 3b 0a 20 20 20 20 6d 61 70 5f 69 74 65 72  =0;.    map_iter
9f30: 61 74 65 28 70 2d 3e 6d 2c 20 6d 65 64 69 61 6e  ate(p->m, median
9f40: 49 74 65 72 61 74 65 2c 20 70 29 3b 0a 20 20 20  Iterate, p);.   
9f50: 20 6d 61 70 5f 64 65 73 74 72 6f 79 28 70 2d 3e   map_destroy(p->
9f60: 6d 29 3b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e  m);.    free(p->
9f70: 6d 29 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d  m);..    if( 0==
9f80: 70 2d 3e 69 73 5f 64 6f 75 62 6c 65 20 29 0a 20  p->is_double ). 
9f90: 20 20 20 20 20 69 66 28 20 31 3d 3d 70 2d 3e 6d       if( 1==p->m
9fa0: 6e 20 29 0a 20 20 20 20 20 20 09 73 71 6c 69 74  n ).      .sqlit
9fb0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
9fc0: 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 69 4d 29  context, p->riM)
9fd0: 3b 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20  ;.      else.   
9fe0: 20 20 20 09 73 71 6c 69 74 65 33 5f 72 65 73 75     .sqlite3_resu
9ff0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
a000: 74 2c 20 70 2d 3e 72 69 4d 2a 31 2e 30 2f 70 2d  t, p->riM*1.0/p-
a010: 3e 6d 6e 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  >mn);.    else. 
a020: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
a030: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
a040: 78 74 2c 20 70 2d 3e 72 64 4d 2f 70 2d 3e 6d 6e  xt, p->rdM/p->mn
a050: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a060: 52 65 74 75 72 6e 73 20 74 68 65 20 6d 65 64 69  Returns the medi
a070: 61 6e 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  an value.*/.stat
a080: 69 63 20 76 6f 69 64 20 6d 65 64 69 61 6e 46 69  ic void medianFi
a090: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
a0a0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
a0b0: 7b 0a 20 20 4d 6f 64 65 43 74 78 20 2a 70 3b 0a  {.  ModeCtx *p;.
a0c0: 20 20 70 20 3d 20 28 4d 6f 64 65 43 74 78 2a 29    p = (ModeCtx*)
a0d0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
a0e0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
a0f0: 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 21  xt, 0);.  if( p!
a100: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 63 6e  =0 ){.    p->pcn
a110: 74 20 3d 20 28 70 2d 3e 63 6e 74 29 2f 32 2e 30  t = (p->cnt)/2.0
a120: 3b 0a 20 20 20 20 5f 6d 65 64 69 61 6e 46 69 6e  ;.    _medianFin
a130: 61 6c 69 7a 65 28 63 6f 6e 74 65 78 74 29 3b 0a  alize(context);.
a140: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
a150: 75 72 6e 73 20 74 68 65 20 6c 6f 77 65 72 5f 71  urns the lower_q
a160: 75 61 72 74 69 6c 65 20 76 61 6c 75 65 0a 2a 2f  uartile value.*/
a170: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 77  .static void low
a180: 65 72 5f 71 75 61 72 74 69 6c 65 46 69 6e 61 6c  er_quartileFinal
a190: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
a1a0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
a1b0: 20 4d 6f 64 65 43 74 78 20 2a 70 3b 0a 20 20 70   ModeCtx *p;.  p
a1c0: 20 3d 20 28 4d 6f 64 65 43 74 78 2a 29 20 73 71   = (ModeCtx*) sq
a1d0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
a1e0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
a1f0: 20 30 29 3b 0a 20 20 69 66 28 20 70 21 3d 30 20   0);.  if( p!=0 
a200: 29 7b 0a 20 20 20 20 70 2d 3e 70 63 6e 74 20 3d  ){.    p->pcnt =
a210: 20 28 70 2d 3e 63 6e 74 29 2f 34 2e 30 3b 0a 20   (p->cnt)/4.0;. 
a220: 20 20 20 5f 6d 65 64 69 61 6e 46 69 6e 61 6c 69     _medianFinali
a230: 7a 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ze(context);.  }
a240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a250: 73 20 74 68 65 20 75 70 70 65 72 5f 71 75 61 72  s the upper_quar
a260: 74 69 6c 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74  tile value.*/.st
a270: 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72 5f  atic void upper_
a280: 71 75 61 72 74 69 6c 65 46 69 6e 61 6c 69 7a 65  quartileFinalize
a290: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
a2a0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 6f   *context){.  Mo
a2b0: 64 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  deCtx *p;.  p = 
a2c0: 28 4d 6f 64 65 43 74 78 2a 29 20 73 71 6c 69 74  (ModeCtx*) sqlit
a2d0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
a2e0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
a2f0: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
a300: 20 20 20 20 70 2d 3e 70 63 6e 74 20 3d 20 28 70      p->pcnt = (p
a310: 2d 3e 63 6e 74 29 2a 33 2f 34 2e 30 3b 0a 20 20  ->cnt)*3/4.0;.  
a320: 20 20 5f 6d 65 64 69 61 6e 46 69 6e 61 6c 69 7a    _medianFinaliz
a330: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a  e(context);.  }.
a340: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  }../*.** Returns
a350: 20 74 68 65 20 73 74 64 65 76 20 76 61 6c 75 65   the stdev value
a360: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a370: 73 74 64 65 76 46 69 6e 61 6c 69 7a 65 28 73 71  stdevFinalize(sq
a380: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
a390: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74 64 65 76  ontext){.  Stdev
a3a0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
a3b0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
a3c0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
a3d0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
a3e0: 70 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20  p->cnt>1 ){.    
a3f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
a400: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73  ouble(context, s
a410: 71 72 74 28 70 2d 3e 72 53 2f 28 70 2d 3e 63 6e  qrt(p->rS/(p->cn
a420: 74 2d 31 29 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  t-1)));.  }else{
a430: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
a440: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
a450: 78 74 2c 20 30 2e 30 29 3b 0a 20 20 7d 0a 7d 0a  xt, 0.0);.  }.}.
a460: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  ./*.** Returns t
a470: 68 65 20 76 61 72 69 61 6e 63 65 20 76 61 6c 75  he variance valu
a480: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
a490: 20 76 61 72 69 61 6e 63 65 46 69 6e 61 6c 69 7a   varianceFinaliz
a4a0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
a4b0: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
a4c0: 74 64 65 76 43 74 78 20 2a 70 3b 0a 20 20 70 20  tdevCtx *p;.  p 
a4d0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
a4e0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
a4f0: 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ext, 0);.  if( p
a500: 20 26 26 20 70 2d 3e 63 6e 74 3e 31 20 29 7b 0a   && p->cnt>1 ){.
a510: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
a520: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
a530: 74 2c 20 70 2d 3e 72 53 2f 28 70 2d 3e 63 6e 74  t, p->rS/(p->cnt
a540: 2d 31 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -1));.  }else{. 
a550: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
a560: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
a570: 2c 20 30 2e 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  , 0.0);.  }.}..#
a580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55  ifdef SQLITE_SOU
a590: 4e 44 45 58 0a 0a 2f 2a 20 72 65 6c 69 63 6f 64  NDEX../* relicod
a5a0: 65 72 20 66 61 63 74 6f 72 65 64 20 63 6f 64 65  er factored code
a5b0: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c   */./*.** Calcul
a5c0: 61 74 65 73 20 74 68 65 20 73 6f 75 6e 64 65 78  ates the soundex
a5d0: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74 72 69   value of a stri
a5e0: 6e 67 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  ng.*/..static vo
a5f0: 69 64 20 73 6f 75 6e 64 65 78 28 63 6f 6e 73 74  id soundex(const
a600: 20 75 38 20 2a 7a 49 6e 2c 20 63 68 61 72 20 2a   u8 *zIn, char *
a610: 7a 52 65 73 75 6c 74 29 7b 0a 20 20 69 6e 74 20  zResult){.  int 
a620: 69 2c 20 6a 3b 0a 20 20 73 74 61 74 69 63 20 63  i, j;.  static c
a630: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
a640: 61 72 20 69 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20  ar iCode[] = {. 
a650: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a660: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a670: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a680: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,.    0, 0, 0, 
a690: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a6a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a6b0: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
a6c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a6d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a6e0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
a6f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a700: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a710: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
a720: 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33     0, 0, 1, 2, 3
a730: 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c  , 0, 1, 2, 0, 0,
a740: 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20   2, 2, 4, 5, 5, 
a750: 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20  0,.    1, 2, 6, 
a760: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32  2, 3, 0, 1, 0, 2
a770: 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 2, 0, 0, 0,
a780: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
a790: 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   1, 2, 3, 0, 1, 
a7a0: 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34  2, 0, 0, 2, 2, 4
a7b0: 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31  , 5, 5, 0,.    1
a7c0: 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c  , 2, 6, 2, 3, 0,
a7d0: 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20   1, 0, 2, 0, 2, 
a7e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
a7f0: 20 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   };..  for(i=0; 
a800: 7a 49 6e 5b 69 5d 20 26 26 20 21 69 73 61 6c 70  zIn[i] && !isalp
a810: 68 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29  ha(zIn[i]); i++)
a820: 7b 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20  {}.  if( zIn[i] 
a830: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 30  ){.    zResult[0
a840: 5d 20 3d 20 74 6f 75 70 70 65 72 28 7a 49 6e 5b  ] = toupper(zIn[
a850: 69 5d 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  i]);.    for(j=1
a860: 3b 20 6a 3c 34 20 26 26 20 7a 49 6e 5b 69 5d 3b  ; j<4 && zIn[i];
a870: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
a880: 20 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49   code = iCode[zI
a890: 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20  n[i]&0x7f];.    
a8a0: 20 20 69 66 28 20 63 6f 64 65 3e 30 20 29 7b 0a    if( code>0 ){.
a8b0: 20 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b          zResult[
a8c0: 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30  j++] = code + '0
a8d0: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
a8e0: 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 34 20  .    while( j<4 
a8f0: 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74  ){.      zResult
a900: 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20  [j++] = '0';.   
a910: 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a   }.    zResult[j
a920: 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ] = 0;.  }else{.
a930: 20 20 20 20 73 74 72 63 70 79 28 7a 52 65 73 75      strcpy(zResu
a940: 6c 74 2c 20 22 3f 30 30 30 22 29 3b 0a 20 20 7d  lt, "?000");.  }
a950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 6f 6d 70 75 74  .}../*.** comput
a960: 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
a970: 20 64 69 66 66 65 72 65 6e 74 20 63 68 61 72 61   different chara
a980: 63 74 65 72 73 20 62 65 74 77 65 65 6e 20 74 68  cters between th
a990: 65 20 73 6f 75 6e 64 65 78 20 76 61 6c 75 65 20  e soundex value 
a9a0: 66 6f 20 32 20 73 74 72 69 6e 67 73 0a 2a 2f 0a  fo 2 strings.*/.
a9b0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 66 66  static void diff
a9c0: 65 72 65 6e 63 65 46 75 6e 63 28 73 71 6c 69 74  erenceFunc(sqlit
a9d0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
a9e0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
a9f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
aa00: 72 67 76 29 7b 0a 20 20 63 68 61 72 20 7a 52 65  rgv){.  char zRe
aa10: 73 75 6c 74 31 5b 38 5d 3b 0a 20 20 63 68 61 72  sult1[8];.  char
aa20: 20 7a 52 65 73 75 6c 74 32 5b 38 5d 3b 0a 20 20   zResult2[8];.  
aa30: 63 68 61 72 20 2a 7a 52 31 20 3d 20 7a 52 65 73  char *zR1 = zRes
aa40: 75 6c 74 31 3b 0a 20 20 63 68 61 72 20 2a 7a 52  ult1;.  char *zR
aa50: 32 20 3d 20 7a 52 65 73 75 6c 74 32 3b 0a 20 20  2 = zResult2;.  
aa60: 69 6e 74 20 72 56 61 6c 20 3d 20 30 3b 0a 20 20  int rVal = 0;.  
aa70: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f 6e  int i = 0;.  con
aa80: 73 74 20 75 38 20 2a 7a 49 6e 31 3b 0a 20 20 63  st u8 *zIn1;.  c
aa90: 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 32 3b 0a 0a  onst u8 *zIn2;..
aaa0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
aab0: 32 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  2 );..  if( sqli
aac0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
aad0: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
aae0: 4e 55 4c 4c 20 7c 7c 20 73 71 6c 69 74 65 33 5f  NULL || sqlite3_
aaf0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
ab00: 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])==SQLITE_NULL
ab10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ab20: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
ab30: 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ext);.    return
ab40: 3b 0a 20 20 7d 0a 0a 20 20 7a 49 6e 31 20 3d 20  ;.  }..  zIn1 = 
ab50: 28 75 38 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  (u8*)sqlite3_val
ab60: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
ab70: 3b 0a 20 20 7a 49 6e 32 20 3d 20 28 75 38 2a 29  ;.  zIn2 = (u8*)
ab80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
ab90: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20  xt(argv[1]);..  
aba0: 73 6f 75 6e 64 65 78 28 7a 49 6e 31 2c 20 7a 52  soundex(zIn1, zR
abb0: 31 29 3b 0a 20 20 73 6f 75 6e 64 65 78 28 7a 49  1);.  soundex(zI
abc0: 6e 32 2c 20 7a 52 32 29 3b 0a 0a 20 20 66 6f 72  n2, zR2);..  for
abd0: 28 69 3d 30 3b 20 69 3c 34 3b 20 2b 2b 69 29 7b  (i=0; i<4; ++i){
abe0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 43  .    if( sqliteC
abf0: 68 61 72 56 61 6c 28 28 75 6e 73 69 67 6e 65 64  harVal((unsigned
ac00: 20 63 68 61 72 20 2a 29 7a 52 31 29 3d 3d 73 71   char *)zR1)==sq
ac10: 6c 69 74 65 43 68 61 72 56 61 6c 28 28 75 6e 73  liteCharVal((uns
ac20: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 52 32  igned char *)zR2
ac30: 29 20 29 0a 20 20 20 20 20 20 2b 2b 72 56 61 6c  ) ).      ++rVal
ac40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74  ;.    sqliteNext
ac50: 43 68 61 72 28 7a 52 31 29 3b 0a 20 20 20 20 73  Char(zR1);.    s
ac60: 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 52  qliteNextChar(zR
ac70: 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  2);.  }.  sqlite
ac80: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
ac90: 74 65 78 74 2c 20 72 56 61 6c 29 3b 0a 7d 0a 23  text, rVal);.}.#
aca0: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 76 6f  endif..static vo
acb0: 69 64 20 6c 61 73 74 52 6f 77 73 46 75 6e 63 28  id lastRowsFunc(
acc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
acd0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
ace0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
acf0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73 71 6c  e **argv){.  sql
ad00: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
ad10: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
ad20: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
ad30: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ad40: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73  int64(context, s
ad50: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
ad60: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  b));.}../*.** Th
ad70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69  is function regi
ad80: 73 74 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68  stered all of th
ad90: 65 20 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69  e above C functi
ada0: 6f 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75  ons as SQL.** fu
adb0: 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73  nctions.  This s
adc0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c  hould be the onl
add0: 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69  y routine in thi
ade0: 73 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65  s file with.** e
adf0: 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e  xternal linkage.
ae00: 0a 2a 2f 0a 69 6e 74 20 52 65 67 69 73 74 65 72  .*/.int Register
ae10: 45 78 74 65 6e 73 69 6f 6e 46 75 6e 63 74 69 6f  ExtensionFunctio
ae20: 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ns(sqlite3 *db){
ae30: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
ae40: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
ae50: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
ae60: 73 69 67 6e 65 64 20 63 68 61 72 20 6e 41 72 67  signed char nArg
ae70: 3b 0a 20 20 20 20 20 75 38 20 61 72 67 54 79 70  ;.     u8 argTyp
ae80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
ae90: 30 3a 20 6e 6f 6e 65 2e 20 20 31 3a 20 64 62 20  0: none.  1: db 
aea0: 20 32 3a 20 28 2d 31 29 20 2a 2f 0a 20 20 20 20   2: (-1) */.    
aeb0: 20 75 38 20 65 54 65 78 74 52 65 70 3b 20 20 20   u8 eTextRep;   
aec0: 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 55 54 46         /* 1: UTF
aed0: 2d 31 36 2e 20 20 30 3a 20 55 54 46 2d 38 20 2a  -16.  0: UTF-8 *
aee0: 2f 0a 20 20 20 20 20 75 38 20 6e 65 65 64 43 6f  /.     u8 needCo
aef0: 6c 6c 53 65 71 3b 0a 20 20 20 20 20 76 6f 69 64  llSeq;.     void
af00: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
af10: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
af20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
af30: 3b 0a 20 20 7d 20 61 46 75 6e 63 73 5b 5d 20 3d  ;.  } aFuncs[] =
af40: 20 7b 0a 20 20 20 20 2f 2a 20 6d 61 74 68 2e 68   {.    /* math.h
af50: 20 2a 2f 0a 20 20 20 20 7b 20 22 61 63 6f 73 22   */.    { "acos"
af60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
af70: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
af80: 38 2c 20 20 20 20 30 2c 20 61 63 6f 73 46 75 6e  8,    0, acosFun
af90: 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 69  c  },.    { "asi
afa0: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
afb0: 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    1, 0, SQLITE_U
afc0: 54 46 38 2c 20 20 20 20 30 2c 20 61 73 69 6e 46  TF8,    0, asinF
afd0: 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61  unc  },.    { "a
afe0: 74 61 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  tan",           
aff0: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
b000: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 61 74 61  _UTF8,    0, ata
b010: 6e 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20  nFunc  },.    { 
b020: 22 61 74 6e 32 22 2c 20 20 20 20 20 20 20 20 20  "atn2",         
b030: 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49        2, 0, SQLI
b040: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 61  TE_UTF8,    0, a
b050: 74 6e 32 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20  tn2Func  },.    
b060: 2f 2a 20 58 58 58 20 61 6c 69 61 73 20 2a 2f 0a  /* XXX alias */.
b070: 20 20 20 20 7b 20 22 61 74 61 6e 32 22 2c 20 20      { "atan2",  
b080: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
b090: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
b0a0: 20 20 30 2c 20 61 74 6e 32 46 75 6e 63 20 20 7d    0, atn2Func  }
b0b0: 2c 0a 20 20 20 20 7b 20 22 61 63 6f 73 68 22 2c  ,.    { "acosh",
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
b0d0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
b0e0: 20 20 20 20 30 2c 20 61 63 6f 73 68 46 75 6e 63      0, acoshFunc
b0f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 69 6e    },.    { "asin
b100: 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  h",             
b110: 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   1, 0, SQLITE_UT
b120: 46 38 2c 20 20 20 20 30 2c 20 61 73 69 6e 68 46  F8,    0, asinhF
b130: 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61  unc  },.    { "a
b140: 74 61 6e 68 22 2c 20 20 20 20 20 20 20 20 20 20  tanh",          
b150: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
b160: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 61 74 61  _UTF8,    0, ata
b170: 6e 68 46 75 6e 63 20 20 7d 2c 0a 0a 20 20 20 20  nhFunc  },..    
b180: 7b 20 22 64 69 66 66 65 72 65 6e 63 65 22 2c 20  { "difference", 
b190: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51          2, 0, SQ
b1a0: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
b1b0: 20 64 69 66 66 65 72 65 6e 63 65 46 75 6e 63 7d   differenceFunc}
b1c0: 2c 0a 20 20 20 20 7b 20 22 64 65 67 72 65 65 73  ,.    { "degrees
b1d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  ",            1,
b1e0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
b1f0: 20 20 20 20 30 2c 20 72 61 64 32 64 65 67 46 75      0, rad2degFu
b200: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61  nc  },.    { "ra
b210: 64 69 61 6e 73 22 2c 20 20 20 20 20 20 20 20 20  dians",         
b220: 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f     1, 0, SQLITE_
b230: 55 54 46 38 2c 20 20 20 20 30 2c 20 64 65 67 32  UTF8,    0, deg2
b240: 72 61 64 46 75 6e 63 20 20 7d 2c 0a 0a 20 20 20  radFunc  },..   
b250: 20 7b 20 22 63 6f 73 22 2c 20 20 20 20 20 20 20   { "cos",       
b260: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
b270: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
b280: 2c 20 63 6f 73 46 75 6e 63 20 20 7d 2c 0a 20 20  , cosFunc  },.  
b290: 20 20 7b 20 22 73 69 6e 22 2c 20 20 20 20 20 20    { "sin",      
b2a0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
b2b0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
b2c0: 30 2c 20 73 69 6e 46 75 6e 63 20 7d 2c 0a 20 20  0, sinFunc },.  
b2d0: 20 20 7b 20 22 74 61 6e 22 2c 20 20 20 20 20 20    { "tan",      
b2e0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
b2f0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
b300: 30 2c 20 74 61 6e 46 75 6e 63 20 7d 2c 0a 20 20  0, tanFunc },.  
b310: 20 20 7b 20 22 63 6f 74 22 2c 20 20 20 20 20 20    { "cot",      
b320: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
b330: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
b340: 30 2c 20 63 6f 74 46 75 6e 63 20 7d 2c 0a 20 20  0, cotFunc },.  
b350: 20 20 7b 20 22 63 6f 73 68 22 2c 20 20 20 20 20    { "cosh",     
b360: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
b370: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
b380: 30 2c 20 63 6f 73 68 46 75 6e 63 20 20 7d 2c 0a  0, coshFunc  },.
b390: 20 20 20 20 7b 20 22 73 69 6e 68 22 2c 20 20 20      { "sinh",   
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
b3b0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
b3c0: 20 20 30 2c 20 73 69 6e 68 46 75 6e 63 20 7d 2c    0, sinhFunc },
b3d0: 0a 20 20 20 20 7b 20 22 74 61 6e 68 22 2c 20 20  .    { "tanh",  
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
b3f0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
b400: 20 20 20 30 2c 20 74 61 6e 68 46 75 6e 63 20 7d     0, tanhFunc }
b410: 2c 0a 20 20 20 20 7b 20 22 63 6f 74 68 22 2c 20  ,.    { "coth", 
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
b430: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
b440: 20 20 20 20 30 2c 20 63 6f 74 68 46 75 6e 63 20      0, cothFunc 
b450: 7d 2c 0a 0a 20 20 20 20 7b 20 22 65 78 70 22 2c  },..    { "exp",
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
b480: 38 2c 20 20 20 20 30 2c 20 65 78 70 46 75 6e 63  8,    0, expFunc
b490: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 67 22    },.    { "log"
b4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b4b0: 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   1, 0, SQLITE_UT
b4c0: 46 38 2c 20 20 20 20 30 2c 20 6c 6f 67 46 75 6e  F8,    0, logFun
b4d0: 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 67  c  },.    { "log
b4e0: 31 30 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  10",            
b4f0: 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    1, 0, SQLITE_U
b500: 54 46 38 2c 20 20 20 20 30 2c 20 6c 6f 67 31 30  TF8,    0, log10
b510: 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22  Func  },.    { "
b520: 70 6f 77 65 72 22 2c 20 20 20 20 20 20 20 20 20  power",         
b530: 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54       2, 0, SQLIT
b540: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 70 6f  E_UTF8,    0, po
b550: 77 65 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20  werFunc  },.    
b560: 7b 20 22 73 69 67 6e 22 2c 20 20 20 20 20 20 20  { "sign",       
b570: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51          1, 0, SQ
b580: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
b590: 20 73 69 67 6e 46 75 6e 63 20 7d 2c 0a 20 20 20   signFunc },.   
b5a0: 20 7b 20 22 73 71 72 74 22 2c 20 20 20 20 20 20   { "sqrt",      
b5b0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
b5c0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
b5d0: 2c 20 73 71 72 74 46 75 6e 63 20 7d 2c 0a 20 20  , sqrtFunc },.  
b5e0: 20 20 7b 20 22 73 71 75 61 72 65 22 2c 20 20 20    { "square",   
b5f0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
b600: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
b610: 30 2c 20 73 71 75 61 72 65 46 75 6e 63 20 7d 2c  0, squareFunc },
b620: 0a 0a 20 20 20 20 7b 20 22 63 65 69 6c 22 2c 20  ..    { "ceil", 
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
b640: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
b650: 20 20 20 20 30 2c 20 63 65 69 6c 46 75 6e 63 20      0, ceilFunc 
b660: 7d 2c 0a 20 20 20 20 7b 20 22 63 65 69 6c 69 6e  },.    { "ceilin
b670: 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  g",            1
b680: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
b690: 2c 20 20 20 20 30 2c 20 63 65 69 6c 46 75 6e 63  ,    0, ceilFunc
b6a0: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 6f 6f 72   },.    { "floor
b6b0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b6c0: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
b6d0: 38 2c 20 20 20 20 30 2c 20 66 6c 6f 6f 72 46 75  8,    0, floorFu
b6e0: 6e 63 20 7d 2c 0a 0a 20 20 20 20 7b 20 22 70 69  nc },..    { "pi
b6f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b700: 20 20 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f     0, 0, SQLITE_
b710: 55 54 46 38 2c 20 20 20 20 30 2c 20 70 69 46 75  UTF8,    0, piFu
b720: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 73  nc },.    { "las
b730: 74 5f 72 6f 77 73 5f 61 66 66 65 63 74 65 64 22  t_rows_affected"
b740: 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55  , 0, 0, SQLITE_U
b750: 54 46 38 2c 20 20 20 20 30 2c 20 6c 61 73 74 52  TF8,    0, lastR
b760: 6f 77 73 46 75 6e 63 20 7d 2c 0a 0a 20 20 20 20  owsFunc },..    
b770: 2f 2a 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  /* string */.   
b780: 20 7b 20 22 72 65 70 6c 69 63 61 74 65 22 2c 20   { "replicate", 
b790: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53           2, 0, S
b7a0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
b7b0: 2c 20 72 65 70 6c 69 63 61 74 65 46 75 6e 63 20  , replicateFunc 
b7c0: 7d 2c 0a 20 20 20 20 7b 20 22 63 68 61 72 69 6e  },.    { "charin
b7d0: 64 65 78 22 2c 20 20 20 20 20 20 20 20 20 20 32  dex",          2
b7e0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
b7f0: 2c 20 20 20 20 31 2c 20 63 68 61 72 69 6e 64 65  ,    1, charinde
b800: 78 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  xFunc },.    { "
b810: 63 68 61 72 69 6e 64 65 78 22 2c 20 20 20 20 20  charindex",     
b820: 20 20 20 20 20 33 2c 20 30 2c 20 53 51 4c 49 54       3, 0, SQLIT
b830: 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 63 68  E_UTF8,    1, ch
b840: 61 72 69 6e 64 65 78 46 75 6e 63 20 7d 2c 0a 20  arindexFunc },. 
b850: 20 20 20 7b 20 22 6c 65 66 74 73 74 72 22 2c 20     { "leftstr", 
b860: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
b870: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
b880: 20 30 2c 20 6c 65 66 74 46 75 6e 63 20 7d 2c 0a   0, leftFunc },.
b890: 20 20 20 20 7b 20 22 72 69 67 68 74 73 74 72 22      { "rightstr"
b8a0: 2c 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30  ,           2, 0
b8b0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
b8c0: 20 20 30 2c 20 72 69 67 68 74 46 75 6e 63 20 7d    0, rightFunc }
b8d0: 2c 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 54  ,.#ifndef HAVE_T
b8e0: 52 49 4d 0a 20 20 20 20 7b 20 22 6c 74 72 69 6d  RIM.    { "ltrim
b8f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b900: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
b910: 38 2c 20 20 20 20 30 2c 20 6c 74 72 69 6d 46 75  8,    0, ltrimFu
b920: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 72  nc },.    { "rtr
b930: 69 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  im",            
b940: 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    1, 0, SQLITE_U
b950: 54 46 38 2c 20 20 20 20 30 2c 20 72 74 72 69 6d  TF8,    0, rtrim
b960: 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 74  Func },.    { "t
b970: 72 69 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20  rim",           
b980: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
b990: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 74 72 69  _UTF8,    0, tri
b9a0: 6d 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  mFunc },.    { "
b9b0: 72 65 70 6c 61 63 65 22 2c 20 20 20 20 20 20 20  replace",       
b9c0: 20 20 20 20 20 33 2c 20 30 2c 20 53 51 4c 49 54       3, 0, SQLIT
b9d0: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 72 65  E_UTF8,    0, re
b9e0: 70 6c 61 63 65 46 75 6e 63 20 7d 2c 0a 23 65 6e  placeFunc },.#en
b9f0: 64 69 66 0a 20 20 20 20 7b 20 22 72 65 76 65 72  dif.    { "rever
ba00: 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  se",            
ba10: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
ba20: 38 2c 20 20 20 20 30 2c 20 72 65 76 65 72 73 65  8,    0, reverse
ba30: 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 70  Func },.    { "p
ba40: 72 6f 70 65 72 22 2c 20 20 20 20 20 20 20 20 20  roper",         
ba50: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
ba60: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 70 72 6f  _UTF8,    0, pro
ba70: 70 65 72 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  perFunc },.    {
ba80: 20 22 70 61 64 6c 22 2c 20 20 20 20 20 20 20 20   "padl",        
ba90: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c         2, 0, SQL
baa0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
bab0: 70 61 64 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20  padlFunc },.    
bac0: 7b 20 22 70 61 64 72 22 2c 20 20 20 20 20 20 20  { "padr",       
bad0: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51          2, 0, SQ
bae0: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
baf0: 20 70 61 64 72 46 75 6e 63 20 7d 2c 0a 20 20 20   padrFunc },.   
bb00: 20 7b 20 22 70 61 64 63 22 2c 20 20 20 20 20 20   { "padc",      
bb10: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53           2, 0, S
bb20: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
bb30: 2c 20 70 61 64 63 46 75 6e 63 20 7d 2c 0a 20 20  , padcFunc },.  
bb40: 20 20 7b 20 22 73 74 72 66 69 6c 74 65 72 22 2c    { "strfilter",
bb50: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
bb60: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
bb70: 30 2c 20 73 74 72 66 69 6c 74 65 72 46 75 6e 63  0, strfilterFunc
bb80: 20 7d 2c 0a 0a 20 20 7d 3b 0a 20 20 2f 2a 20 41   },..  };.  /* A
bb90: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
bba0: 6e 73 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  ns */.  static c
bbb0: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
bbc0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
bbd0: 20 20 20 73 69 67 6e 65 64 20 63 68 61 72 20 6e     signed char n
bbe0: 41 72 67 3b 0a 20 20 20 20 75 38 20 61 72 67 54  Arg;.    u8 argT
bbf0: 79 70 65 3b 0a 20 20 20 20 75 38 20 6e 65 65 64  ype;.    u8 need
bc00: 43 6f 6c 6c 53 65 71 3b 0a 20 20 20 20 76 6f 69  CollSeq;.    voi
bc10: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
bc20: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
bc30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
bc40: 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 46 69  ;.    void (*xFi
bc50: 6e 61 6c 69 7a 65 29 28 73 71 6c 69 74 65 33 5f  nalize)(sqlite3_
bc60: 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 7d 20 61  context*);.  } a
bc70: 41 67 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  Aggs[] = {.    {
bc80: 20 22 73 74 64 65 76 22 2c 20 20 20 20 20 20 20   "stdev",       
bc90: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 76 61       1, 0, 0, va
bca0: 72 69 61 6e 63 65 53 74 65 70 2c 20 73 74 64 65  rianceStep, stde
bcb0: 76 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20  vFinalize  },.  
bcc0: 20 20 7b 20 22 76 61 72 69 61 6e 63 65 22 2c 20    { "variance", 
bcd0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
bce0: 20 76 61 72 69 61 6e 63 65 53 74 65 70 2c 20 76   varianceStep, v
bcf0: 61 72 69 61 6e 63 65 46 69 6e 61 6c 69 7a 65 20  arianceFinalize 
bd00: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 6f 64 65 22   },.    { "mode"
bd10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  ,             1,
bd20: 20 30 2c 20 30 2c 20 6d 6f 64 65 53 74 65 70 2c   0, 0, modeStep,
bd30: 20 20 20 20 20 6d 6f 64 65 46 69 6e 61 6c 69 7a       modeFinaliz
bd40: 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 64  e  },.    { "med
bd50: 69 61 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  ian",           
bd60: 31 2c 20 30 2c 20 30 2c 20 6d 6f 64 65 53 74 65  1, 0, 0, modeSte
bd70: 70 2c 20 20 20 20 20 6d 65 64 69 61 6e 46 69 6e  p,     medianFin
bd80: 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 20 20 7b 20  alize  },.    { 
bd90: 22 6c 6f 77 65 72 5f 71 75 61 72 74 69 6c 65 22  "lower_quartile"
bda0: 2c 20 20 20 31 2c 20 30 2c 20 30 2c 20 6d 6f 64  ,   1, 0, 0, mod
bdb0: 65 53 74 65 70 2c 20 20 20 20 20 6c 6f 77 65 72  eStep,     lower
bdc0: 5f 71 75 61 72 74 69 6c 65 46 69 6e 61 6c 69 7a  _quartileFinaliz
bdd0: 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 70  e  },.    { "upp
bde0: 65 72 5f 71 75 61 72 74 69 6c 65 22 2c 20 20 20  er_quartile",   
bdf0: 31 2c 20 30 2c 20 30 2c 20 6d 6f 64 65 53 74 65  1, 0, 0, modeSte
be00: 70 2c 20 20 20 20 20 75 70 70 65 72 5f 71 75 61  p,     upper_qua
be10: 72 74 69 6c 65 46 69 6e 61 6c 69 7a 65 20 20 7d  rtileFinalize  }
be20: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
be30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
be40: 7a 65 6f 66 28 61 46 75 6e 63 73 29 2f 73 69 7a  zeof(aFuncs)/siz
be50: 65 6f 66 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20  eof(aFuncs[0]); 
be60: 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  i++){.    void *
be70: 70 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 73 77  pArg = 0;.    sw
be80: 69 74 63 68 28 20 61 46 75 6e 63 73 5b 69 5d 2e  itch( aFuncs[i].
be90: 61 72 67 54 79 70 65 20 29 7b 0a 20 20 20 20 20  argType ){.     
bea0: 20 63 61 73 65 20 31 3a 20 70 41 72 67 20 3d 20   case 1: pArg = 
beb0: 64 62 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  db; break;.     
bec0: 20 63 61 73 65 20 32 3a 20 70 41 72 67 20 3d 20   case 2: pArg = 
bed0: 28 76 6f 69 64 20 2a 29 28 2d 31 29 3b 20 62 72  (void *)(-1); br
bee0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  eak;.    }.    /
bef0: 2a 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  * sqlite3CreateF
bf00: 75 6e 63 20 2a 2f 0a 20 20 20 20 2f 2a 20 4c 4d  unc */.    /* LM
bf10: 48 20 6e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  H no error check
bf20: 69 6e 67 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ing */.    sqlit
bf30: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
bf40: 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73 5b 69 5d  on(db, aFuncs[i]
bf50: 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 73 5b 69  .zName, aFuncs[i
bf60: 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20 20  ].nArg,.        
bf70: 61 46 75 6e 63 73 5b 69 5d 2e 65 54 65 78 74 52  aFuncs[i].eTextR
bf80: 65 70 2c 20 70 41 72 67 2c 20 61 46 75 6e 63 73  ep, pArg, aFuncs
bf90: 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 2c 20 30 29  [i].xFunc, 0, 0)
bfa0: 3b 0a 23 69 66 20 31 0a 20 20 20 20 69 66 28 20  ;.#if 1.    if( 
bfb0: 61 46 75 6e 63 73 5b 69 5d 2e 6e 65 65 64 43 6f  aFuncs[i].needCo
bfc0: 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 73  llSeq ){.      s
bfd0: 74 72 75 63 74 20 46 75 6e 63 44 65 66 20 2a 70  truct FuncDef *p
bfe0: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
bff0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  ndFunction(db, a
c000: 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a  Funcs[i].zName,.
c010: 23 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49  #if SQLITE_VERSI
c020: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 33 30 31 32  ON_NUMBER < 3012
c030: 30 30 30 0a 20 20 20 20 20 20 20 20 20 20 73 74  000.          st
c040: 72 6c 65 6e 28 61 46 75 6e 63 73 5b 69 5d 2e 7a  rlen(aFuncs[i].z
c050: 4e 61 6d 65 29 2c 0a 23 65 6e 64 69 66 0a 20 20  Name),.#endif.  
c060: 20 20 20 20 20 20 20 20 61 46 75 6e 63 73 5b 69          aFuncs[i
c070: 5d 2e 6e 41 72 67 2c 20 61 46 75 6e 63 73 5b 69  ].nArg, aFuncs[i
c080: 5d 2e 65 54 65 78 74 52 65 70 2c 20 30 29 3b 0a  ].eTextRep, 0);.
c090: 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 20        if( pFunc 
c0a0: 26 26 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 65 65  && aFuncs[i].nee
c0b0: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 23 69 66 20  dCollSeq ){.#if 
c0c0: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
c0d0: 55 4d 42 45 52 20 3e 3d 20 33 30 30 38 30 30 31  UMBER >= 3008001
c0e0: 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
c0f0: 66 75 6e 63 46 6c 61 67 73 20 7c 3d 20 53 51 4c  funcFlags |= SQL
c100: 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
c110: 4c 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  L;.#else.       
c120: 20 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 7c 3d   pFunc->flags |=
c130: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
c140: 44 43 4f 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  DCOLL;.#endif.  
c150: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
c160: 69 66 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  if.  }..  for(i=
c170: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 41 67 67  0; i<sizeof(aAgg
c180: 73 29 2f 73 69 7a 65 6f 66 28 61 41 67 67 73 5b  s)/sizeof(aAggs[
c190: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76  0]); i++){.    v
c1a0: 6f 69 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20  oid *pArg = 0;. 
c1b0: 20 20 20 73 77 69 74 63 68 28 20 61 41 67 67 73     switch( aAggs
c1c0: 5b 69 5d 2e 61 72 67 54 79 70 65 20 29 7b 0a 20  [i].argType ){. 
c1d0: 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 41 72       case 1: pAr
c1e0: 67 20 3d 20 64 62 3b 20 62 72 65 61 6b 3b 0a 20  g = db; break;. 
c1f0: 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 41 72       case 2: pAr
c200: 67 20 3d 20 28 76 6f 69 64 20 2a 29 28 2d 31 29  g = (void *)(-1)
c210: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ; break;.    }. 
c220: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 72 65     /* sqlite3Cre
c230: 61 74 65 46 75 6e 63 20 2a 2f 0a 20 20 20 20 2f  ateFunc */.    /
c240: 2a 20 4c 4d 48 20 6e 6f 20 65 72 72 6f 72 20 63  * LMH no error c
c250: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 73  hecking */.    s
c260: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
c270: 6e 63 74 69 6f 6e 28 64 62 2c 20 61 41 67 67 73  nction(db, aAggs
c280: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 41 67 67 73  [i].zName, aAggs
c290: 5b 69 5d 2e 6e 41 72 67 2c 20 53 51 4c 49 54 45  [i].nArg, SQLITE
c2a0: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70  _UTF8,.        p
c2b0: 41 72 67 2c 20 30 2c 20 61 41 67 67 73 5b 69 5d  Arg, 0, aAggs[i]
c2c0: 2e 78 53 74 65 70 2c 20 61 41 67 67 73 5b 69 5d  .xStep, aAggs[i]
c2d0: 2e 78 46 69 6e 61 6c 69 7a 65 29 3b 0a 23 69 66  .xFinalize);.#if
c2e0: 20 30 0a 20 20 20 20 69 66 28 20 61 41 67 67 73   0.    if( aAggs
c2f0: 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  [i].needCollSeq 
c300: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
c310: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
c320: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
c330: 74 69 6f 6e 28 20 64 62 2c 20 61 41 67 67 73 5b  tion( db, aAggs[
c340: 69 5d 2e 7a 4e 61 6d 65 2c 0a 23 69 66 20 53 51  i].zName,.#if SQ
c350: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
c360: 42 45 52 20 3c 20 33 30 31 32 30 30 30 0a 20 20  BER < 3012000.  
c370: 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 61          strlen(a
c380: 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65 29 2c 0a  Aggs[i].zName),.
c390: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
c3a0: 20 61 41 67 67 73 5b 69 5d 2e 6e 41 72 67 2c 20   aAggs[i].nArg, 
c3b0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
c3c0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63  .      if( pFunc
c3d0: 20 26 26 20 61 41 67 67 73 5b 69 5d 2e 6e 65 65   && aAggs[i].nee
c3e0: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 23 69 66 20  dCollSeq ){.#if 
c3f0: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
c400: 55 4d 42 45 52 20 3e 3d 20 33 30 30 38 30 30 31  UMBER >= 3008001
c410: 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
c420: 66 75 6e 63 46 6c 61 67 73 20 7c 3d 20 53 51 4c  funcFlags |= SQL
c430: 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
c440: 4c 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  L;.#else.       
c450: 20 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 7c 3d   pFunc->flags |=
c460: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
c470: 44 43 4f 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  DCOLL;.#endif.  
c480: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
c490: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
c4a0: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 43 4f 4d  0;.}..#ifdef COM
c4b0: 50 49 4c 45 5f 53 51 4c 49 54 45 5f 45 58 54 45  PILE_SQLITE_EXTE
c4c0: 4e 53 49 4f 4e 53 5f 41 53 5f 4c 4f 41 44 41 42  NSIONS_AS_LOADAB
c4d0: 4c 45 5f 4d 4f 44 55 4c 45 0a 69 6e 74 20 73 71  LE_MODULE.int sq
c4e0: 6c 69 74 65 33 5f 65 78 74 65 6e 73 69 6f 6e 5f  lite3_extension_
c4f0: 69 6e 69 74 28 0a 20 20 20 20 73 71 6c 69 74 65  init(.    sqlite
c500: 33 20 2a 64 62 2c 20 63 68 61 72 20 2a 2a 70 7a  3 *db, char **pz
c510: 45 72 72 4d 73 67 2c 20 63 6f 6e 73 74 20 73 71  ErrMsg, const sq
c520: 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
c530: 65 73 20 2a 70 41 70 69 29 7b 0a 20 20 53 51 4c  es *pApi){.  SQL
c540: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
c550: 49 54 32 28 70 41 70 69 29 3b 0a 20 20 52 65 67  IT2(pApi);.  Reg
c560: 69 73 74 65 72 45 78 74 65 6e 73 69 6f 6e 46 75  isterExtensionFu
c570: 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72  nctions(db);.  r
c580: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
c590: 66 20 2f 2a 20 43 4f 4d 50 49 4c 45 5f 53 51 4c  f /* COMPILE_SQL
c5a0: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 5f 41  ITE_EXTENSIONS_A
c5b0: 53 5f 4c 4f 41 44 41 42 4c 45 5f 4d 4f 44 55 4c  S_LOADABLE_MODUL
c5c0: 45 20 2a 2f 0a 0a 6d 61 70 20 6d 61 70 5f 6d 61  E */..map map_ma
c5d0: 6b 65 28 63 6d 70 5f 66 75 6e 63 20 63 6d 70 29  ke(cmp_func cmp)
c5e0: 7b 0a 20 20 6d 61 70 20 72 3b 0a 20 20 72 2e 63  {.  map r;.  r.c
c5f0: 6d 70 3d 63 6d 70 3b 0a 20 20 72 2e 62 61 73 65  mp=cmp;.  r.base
c600: 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
c610: 72 3b 0a 7d 0a 0a 76 6f 69 64 2a 20 78 63 61 6c  r;.}..void* xcal
c620: 6c 6f 63 28 73 69 7a 65 5f 74 20 6e 6d 65 6d 62  loc(size_t nmemb
c630: 2c 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63  , size_t size, c
c640: 68 61 72 2a 20 73 29 7b 0a 20 20 76 6f 69 64 2a  har* s){.  void*
c650: 20 72 65 74 20 3d 20 63 61 6c 6c 6f 63 28 6e 6d   ret = calloc(nm
c660: 65 6d 62 2c 20 73 69 7a 65 29 3b 0a 20 20 72 65  emb, size);.  re
c670: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 76 6f 69  turn ret;.}..voi
c680: 64 20 78 66 72 65 65 28 76 6f 69 64 2a 20 70 29  d xfree(void* p)
c690: 7b 0a 20 20 66 72 65 65 28 70 29 3b 0a 7d 0a 0a  {.  free(p);.}..
c6a0: 76 6f 69 64 20 6e 6f 64 65 5f 69 6e 73 65 72 74  void node_insert
c6b0: 28 6e 6f 64 65 2a 2a 20 6e 2c 20 63 6d 70 5f 66  (node** n, cmp_f
c6c0: 75 6e 63 20 63 6d 70 2c 20 76 6f 69 64 20 2a 65  unc cmp, void *e
c6d0: 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 6e 6f  ){.  int c;.  no
c6e0: 64 65 2a 20 6e 6e 3b 0a 20 20 69 66 28 2a 6e 3d  de* nn;.  if(*n=
c6f0: 3d 30 29 7b 0a 20 20 20 20 6e 6e 20 3d 20 28 6e  =0){.    nn = (n
c700: 6f 64 65 2a 29 78 63 61 6c 6c 6f 63 28 31 2c 73  ode*)xcalloc(1,s
c710: 69 7a 65 6f 66 28 6e 6f 64 65 29 2c 20 22 66 6f  izeof(node), "fo
c720: 72 20 6e 6f 64 65 22 29 3b 0a 20 20 20 20 6e 6e  r node");.    nn
c730: 2d 3e 64 61 74 61 20 3d 20 65 3b 0a 20 20 20 20  ->data = e;.    
c740: 6e 6e 2d 3e 63 6f 75 6e 74 20 3d 20 31 3b 0a 20  nn->count = 1;. 
c750: 20 20 20 2a 6e 3d 6e 6e 3b 0a 20 20 7d 65 6c 73     *n=nn;.  }els
c760: 65 7b 0a 20 20 20 20 63 3d 63 6d 70 28 28 2a 6e  e{.    c=cmp((*n
c770: 29 2d 3e 64 61 74 61 2c 65 29 3b 0a 20 20 20 20  )->data,e);.    
c780: 69 66 28 30 3d 3d 63 29 7b 0a 20 20 20 20 20 20  if(0==c){.      
c790: 2b 2b 28 28 2a 6e 29 2d 3e 63 6f 75 6e 74 29 3b  ++((*n)->count);
c7a0: 0a 20 20 20 20 20 20 78 66 72 65 65 28 65 29 3b  .      xfree(e);
c7b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 63 3e  .    }else if(c>
c7c0: 30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 75 74  0){.      /* put
c7d0: 20 69 74 20 72 69 67 68 74 20 68 65 72 65 20 2a   it right here *
c7e0: 2f 0a 20 20 20 20 20 20 6e 6f 64 65 5f 69 6e 73  /.      node_ins
c7f0: 65 72 74 28 26 28 28 2a 6e 29 2d 3e 6c 29 2c 20  ert(&((*n)->l), 
c800: 63 6d 70 2c 20 65 29 3b 0a 20 20 20 20 7d 65 6c  cmp, e);.    }el
c810: 73 65 7b 0a 20 20 20 20 20 20 6e 6f 64 65 5f 69  se{.      node_i
c820: 6e 73 65 72 74 28 26 28 28 2a 6e 29 2d 3e 72 29  nsert(&((*n)->r)
c830: 2c 20 63 6d 70 2c 20 65 29 3b 0a 20 20 20 20 7d  , cmp, e);.    }
c840: 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 6d 61 70  .  }.}..void map
c850: 5f 69 6e 73 65 72 74 28 6d 61 70 20 2a 6d 2c 20  _insert(map *m, 
c860: 76 6f 69 64 20 2a 65 29 7b 0a 20 20 6e 6f 64 65  void *e){.  node
c870: 5f 69 6e 73 65 72 74 28 26 28 6d 2d 3e 62 61 73  _insert(&(m->bas
c880: 65 29 2c 20 6d 2d 3e 63 6d 70 2c 20 65 29 3b 0a  e), m->cmp, e);.
c890: 7d 0a 0a 76 6f 69 64 20 6e 6f 64 65 5f 69 74 65  }..void node_ite
c8a0: 72 61 74 65 28 6e 6f 64 65 20 2a 6e 2c 20 6d 61  rate(node *n, ma
c8b0: 70 5f 69 74 65 72 61 74 6f 72 20 69 74 65 72 2c  p_iterator iter,
c8c0: 20 76 6f 69 64 2a 20 70 29 7b 0a 20 20 69 66 28   void* p){.  if(
c8d0: 6e 29 7b 0a 20 20 20 20 69 66 28 6e 2d 3e 6c 29  n){.    if(n->l)
c8e0: 0a 20 20 20 20 20 20 6e 6f 64 65 5f 69 74 65 72  .      node_iter
c8f0: 61 74 65 28 6e 2d 3e 6c 2c 20 69 74 65 72 2c 20  ate(n->l, iter, 
c900: 70 29 3b 0a 20 20 20 20 69 74 65 72 28 6e 2d 3e  p);.    iter(n->
c910: 64 61 74 61 2c 20 6e 2d 3e 63 6f 75 6e 74 2c 20  data, n->count, 
c920: 70 29 3b 0a 20 20 20 20 69 66 28 6e 2d 3e 72 29  p);.    if(n->r)
c930: 0a 20 20 20 20 20 20 6e 6f 64 65 5f 69 74 65 72  .      node_iter
c940: 61 74 65 28 6e 2d 3e 72 2c 20 69 74 65 72 2c 20  ate(n->r, iter, 
c950: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20  p);.  }.}..void 
c960: 6d 61 70 5f 69 74 65 72 61 74 65 28 6d 61 70 20  map_iterate(map 
c970: 2a 6d 2c 20 6d 61 70 5f 69 74 65 72 61 74 6f 72  *m, map_iterator
c980: 20 69 74 65 72 2c 20 76 6f 69 64 2a 20 70 29 7b   iter, void* p){
c990: 0a 20 20 6e 6f 64 65 5f 69 74 65 72 61 74 65 28  .  node_iterate(
c9a0: 6d 2d 3e 62 61 73 65 2c 20 69 74 65 72 2c 20 70  m->base, iter, p
c9b0: 29 3b 0a 7d 0a 0a 76 6f 69 64 20 6e 6f 64 65 5f  );.}..void node_
c9c0: 64 65 73 74 72 6f 79 28 6e 6f 64 65 20 2a 6e 29  destroy(node *n)
c9d0: 7b 0a 20 20 69 66 28 30 21 3d 6e 29 7b 0a 20 20  {.  if(0!=n){.  
c9e0: 20 20 78 66 72 65 65 28 6e 2d 3e 64 61 74 61 29    xfree(n->data)
c9f0: 3b 0a 20 20 20 20 69 66 28 6e 2d 3e 6c 29 0a 20  ;.    if(n->l). 
ca00: 20 20 20 20 20 6e 6f 64 65 5f 64 65 73 74 72 6f       node_destro
ca10: 79 28 6e 2d 3e 6c 29 3b 0a 20 20 20 20 69 66 28  y(n->l);.    if(
ca20: 6e 2d 3e 72 29 0a 20 20 20 20 20 20 6e 6f 64 65  n->r).      node
ca30: 5f 64 65 73 74 72 6f 79 28 6e 2d 3e 72 29 3b 0a  _destroy(n->r);.
ca40: 0a 20 20 20 20 78 66 72 65 65 28 6e 29 3b 0a 20  .    xfree(n);. 
ca50: 20 7d 0a 7d 0a 0a 76 6f 69 64 20 6d 61 70 5f 64   }.}..void map_d
ca60: 65 73 74 72 6f 79 28 6d 61 70 20 2a 6d 29 7b 0a  estroy(map *m){.
ca70: 20 20 6e 6f 64 65 5f 64 65 73 74 72 6f 79 28 6d    node_destroy(m
ca80: 2d 3e 62 61 73 65 29 3b 0a 7d 0a 0a 69 6e 74 20  ->base);.}..int 
ca90: 69 6e 74 5f 63 6d 70 28 63 6f 6e 73 74 20 76 6f  int_cmp(const vo
caa0: 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
cab0: 64 20 2a 62 29 7b 0a 20 20 69 6e 74 36 34 5f 74  d *b){.  int64_t
cac0: 20 61 61 20 3d 20 2a 28 69 6e 74 36 34 5f 74 20   aa = *(int64_t 
cad0: 2a 29 28 61 29 3b 0a 20 20 69 6e 74 36 34 5f 74  *)(a);.  int64_t
cae0: 20 62 62 20 3d 20 2a 28 69 6e 74 36 34 5f 74 20   bb = *(int64_t 
caf0: 2a 29 28 62 29 3b 0a 20 20 69 66 28 61 61 3d 3d  *)(b);.  if(aa==
cb00: 62 62 29 0a 20 20 20 20 72 65 74 75 72 6e 20 30  bb).    return 0
cb10: 3b 0a 20 20 65 6c 73 65 20 69 66 28 61 61 3c 62  ;.  else if(aa<b
cb20: 62 29 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  b).    return -1
cb30: 3b 0a 20 20 65 6c 73 65 0a 20 20 20 20 72 65 74  ;.  else.    ret
cb40: 75 72 6e 20 31 3b 0a 7d 0a 0a 69 6e 74 20 64 6f  urn 1;.}..int do
cb50: 75 62 6c 65 5f 63 6d 70 28 63 6f 6e 73 74 20 76  uble_cmp(const v
cb60: 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f  oid *a, const vo
cb70: 69 64 20 2a 62 29 7b 0a 20 20 64 6f 75 62 6c 65  id *b){.  double
cb80: 20 61 61 20 3d 20 2a 28 64 6f 75 62 6c 65 20 2a   aa = *(double *
cb90: 29 28 61 29 3b 0a 20 20 64 6f 75 62 6c 65 20 62  )(a);.  double b
cba0: 62 20 3d 20 2a 28 64 6f 75 62 6c 65 20 2a 29 28  b = *(double *)(
cbb0: 62 29 3b 0a 20 20 69 66 28 61 61 3d 3d 62 62 29  b);.  if(aa==bb)
cbc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
cbd0: 20 65 6c 73 65 20 69 66 28 61 61 3c 62 62 29 0a   else if(aa<bb).
cbe0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
cbf0: 20 65 6c 73 65 0a 20 20 20 20 72 65 74 75 72 6e   else.    return
cc00: 20 31 3b 0a 7d 0a                                 1;.}.