System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 1e68737ce612be21f703569e9a0f27a7bc347ea2:


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 3a 2f 2f 77 77 77 2e   See http://www.
0530: 73 71 6c 69 74 65 2e 6f 72 67 2f 63 76 73 74 72  sqlite.org/cvstr
0540: 61 63 2f 77 69 6b 69 3f 70 3d 4c 6f 61 64 61 62  ac/wiki?p=Loadab
0550: 6c 65 45 78 74 65 6e 73 69 6f 6e 73 2e 0a 33 29  leExtensions..3)
0560: 20 55 73 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c   Use, for exampl
0570: 65 3a 0a 20 20 20 53 45 4c 45 43 54 20 63 6f 73  e:.   SELECT cos
0580: 28 72 61 64 69 61 6e 73 28 69 6e 63 6c 69 6e 61  (radians(inclina
0590: 74 69 6f 6e 29 29 20 46 52 4f 4d 20 73 61 74 73  tion)) FROM sats
05a0: 75 6d 20 57 48 45 52 45 20 73 61 74 6e 75 6d 20  um WHERE satnum 
05b0: 3d 20 32 35 35 34 34 3b 0a 0a 4e 6f 74 65 3a 20  = 25544;..Note: 
05c0: 4c 6f 61 64 69 6e 67 20 65 78 74 65 6e 73 69 6f  Loading extensio
05d0: 6e 73 20 69 73 20 62 79 20 64 65 66 61 75 6c 74  ns is by default
05e0: 20 70 72 6f 68 69 62 69 74 65 64 20 61 73 20 61   prohibited as a
05f0: 0a 73 65 63 75 72 69 74 79 20 6d 65 61 73 75 72  .security measur
0600: 65 3b 20 73 65 65 20 22 53 65 63 75 72 69 74 79  e; see "Security
0610: 20 43 6f 6e 73 69 64 65 72 61 74 69 6f 6e 73 22   Considerations"
0620: 20 69 6e 0a 68 74 74 70 3a 2f 2f 77 77 77 2e 73   in.http://www.s
0630: 71 6c 69 74 65 2e 6f 72 67 2f 63 76 73 74 72 61  qlite.org/cvstra
0640: 63 2f 77 69 6b 69 3f 70 3d 4c 6f 61 64 61 62 6c  c/wiki?p=Loadabl
0650: 65 45 78 74 65 6e 73 69 6f 6e 73 2e 0a 49 66 20  eExtensions..If 
0660: 74 68 65 20 73 71 6c 69 74 65 33 20 70 72 6f 67  the sqlite3 prog
0670: 72 61 6d 20 61 6e 64 20 6c 69 62 72 61 72 79 20  ram and library 
0680: 61 72 65 20 62 75 69 6c 74 20 74 68 69 73 0a 77  are built this.w
0690: 61 79 2c 20 79 6f 75 20 63 61 6e 6e 6f 74 20 75  ay, you cannot u
06a0: 73 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  se these functio
06b0: 6e 73 20 66 72 6f 6d 20 74 68 65 20 70 72 6f 67  ns from the prog
06c0: 72 61 6d 2c 20 79 6f 75 20 0a 6d 75 73 74 20 77  ram, you .must w
06d0: 72 69 74 65 20 79 6f 75 72 20 6f 77 6e 20 70 72  rite your own pr
06e0: 6f 67 72 61 6d 20 75 73 69 6e 67 20 74 68 65 20  ogram using the 
06f0: 73 71 6c 69 74 65 33 20 41 50 49 2c 20 61 6e 64  sqlite3 API, and
0700: 20 63 61 6c 6c 0a 73 71 6c 69 74 65 33 5f 65 6e   call.sqlite3_en
0710: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
0720: 69 6f 6e 20 61 73 20 64 65 73 63 72 69 62 65 64  ion as described
0730: 20 61 62 6f 76 65 2e 0a 0a 49 66 20 74 68 65 20   above...If the 
0740: 70 72 6f 67 72 61 6d 20 69 73 20 62 75 69 6c 74  program is built
0750: 20 73 6f 20 74 68 61 74 20 6c 6f 61 64 69 6e 67   so that loading
0760: 20 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 70   extensions is p
0770: 65 72 6d 69 74 74 65 64 2c 0a 74 68 65 20 66 6f  ermitted,.the fo
0780: 6c 6c 6f 77 69 6e 67 20 77 69 6c 6c 20 77 6f 72  llowing will wor
0790: 6b 3a 0a 73 71 6c 69 74 65 3e 20 53 45 4c 45 43  k:.sqlite> SELEC
07a0: 54 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  T load_extension
07b0: 28 27 2e 2f 6c 69 62 73 71 6c 69 74 65 66 75 6e  ('./libsqlitefun
07c0: 63 74 69 6f 6e 73 2e 73 6f 27 29 3b 0a 73 71 6c  ctions.so');.sql
07d0: 69 74 65 3e 20 73 65 6c 65 63 74 20 63 6f 73 28  ite> select cos(
07e0: 72 61 64 69 61 6e 73 28 34 35 29 29 3b 0a 30 2e  radians(45));.0.
07f0: 37 30 37 31 30 36 37 38 31 31 38 36 35 34 38 0a  707106781186548.
0800: 0a 41 6c 74 65 72 61 74 69 6f 6e 73 3a 0a 54 68  .Alterations:.Th
0810: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  e instructions a
0820: 72 65 20 66 6f 72 20 4c 69 6e 75 78 20 6f 72 20  re for Linux or 
0830: 4d 61 63 20 4f 53 20 58 3b 20 75 73 65 72 73 20  Mac OS X; users 
0840: 6f 66 20 6f 74 68 65 72 20 4f 53 65 73 20 6d 61  of other OSes ma
0850: 79 0a 6e 65 65 64 20 74 6f 20 6d 6f 64 69 66 79  y.need to modify
0860: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e   this procedure.
0870: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
0880: 20 69 66 20 79 6f 75 72 20 6d 61 74 68 20 6c 69   if your math li
0890: 62 72 61 72 79 0a 6c 61 63 6b 73 20 6f 6e 65 20  brary.lacks one 
08a0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 6e  or more of the n
08b0: 65 65 64 65 64 20 74 72 69 67 20 6f 72 20 6c 6f  eeded trig or lo
08c0: 67 20 66 75 6e 63 74 69 6f 6e 73 2c 20 63 6f 6d  g functions, com
08d0: 6d 65 6e 74 20 6f 75 74 20 74 68 65 0a 61 70 70  ment out the.app
08e0: 72 6f 70 72 69 61 74 65 20 48 41 56 45 5f 20 23  ropriate HAVE_ #
08f0: 64 65 66 69 6e 65 20 61 74 20 74 68 65 20 74 6f  define at the to
0900: 70 20 6f 66 20 66 69 6c 65 2e 20 20 49 66 20 79  p of file.  If y
0910: 6f 75 20 64 6f 20 6e 6f 74 0a 77 69 73 68 20 74  ou do not.wish t
0920: 6f 20 6d 61 6b 65 20 61 20 6c 6f 61 64 61 62 6c  o make a loadabl
0930: 65 20 6d 6f 64 75 6c 65 2c 20 63 6f 6d 6d 65 6e  e module, commen
0940: 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 65  t out the define
0950: 20 66 6f 72 0a 43 4f 4d 50 49 4c 45 5f 53 51 4c   for.COMPILE_SQL
0960: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 5f 41  ITE_EXTENSIONS_A
0970: 53 5f 4c 4f 41 44 41 42 4c 45 5f 4d 4f 44 55 4c  S_LOADABLE_MODUL
0980: 45 2e 20 20 49 66 20 79 6f 75 20 61 72 65 20 75  E.  If you are u
0990: 73 69 6e 67 20 61 0a 76 65 72 73 69 6f 6e 20 6f  sing a.version o
09a0: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
09b0: 20 74 68 65 20 74 72 69 6d 20 66 75 6e 63 74 69   the trim functi
09c0: 6f 6e 73 20 61 6e 64 20 72 65 70 6c 61 63 65 2c  ons and replace,
09d0: 20 63 6f 6d 6d 65 6e 74 20 6f 75 74 0a 74 68 65   comment out.the
09e0: 20 48 41 56 45 5f 54 52 49 4d 20 23 64 65 66 69   HAVE_TRIM #defi
09f0: 6e 65 2e 0a 0a 4c 69 61 6d 20 48 65 61 6c 79 0a  ne...Liam Healy.
0a00: 0a 48 69 73 74 6f 72 79 3a 0a 32 30 30 38 2d 30  .History:.2008-0
0a10: 36 2d 31 33 20 43 68 61 6e 67 65 20 74 6f 20 69  6-13 Change to i
0a20: 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 69  nstructions to i
0a30: 6e 64 69 63 61 74 65 20 75 73 65 20 6f 66 20 74  ndicate use of t
0a40: 68 65 20 6d 61 74 68 20 6c 69 62 72 61 72 79 0a  he math library.
0a50: 61 6e 64 20 74 68 61 74 20 70 72 6f 67 72 61 6d  and that program
0a60: 20 6d 69 67 68 74 20 77 6f 72 6b 2e 0a 32 30 30   might work..200
0a70: 37 2d 31 30 2d 30 31 20 4d 69 6e 6f 72 20 63 6c  7-10-01 Minor cl
0a80: 61 72 69 66 69 63 61 74 69 6f 6e 20 74 6f 20 69  arification to i
0a90: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 0a 32 30 30  nstructions..200
0aa0: 37 2d 30 39 2d 32 39 20 43 6f 6d 70 69 6c 61 74  7-09-29 Compilat
0ab0: 69 6f 6e 20 61 73 20 6c 6f 61 64 61 62 6c 65 20  ion as loadable 
0ac0: 6d 6f 64 75 6c 65 20 69 73 20 6f 70 74 69 6f 6e  module is option
0ad0: 61 6c 20 77 69 74 68 0a 43 4f 4d 50 49 4c 45 5f  al with.COMPILE_
0ae0: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
0af0: 53 5f 41 53 5f 4c 4f 41 44 41 42 4c 45 5f 4d 4f  S_AS_LOADABLE_MO
0b00: 44 55 4c 45 2e 0a 32 30 30 37 2d 30 39 2d 32 38  DULE..2007-09-28
0b10: 20 55 73 65 20 73 71 6c 69 74 65 33 5f 65 78 74   Use sqlite3_ext
0b20: 65 6e 73 69 6f 6e 5f 69 6e 69 74 20 61 6e 64 20  ension_init and 
0b30: 6d 61 63 72 6f 73 0a 53 51 4c 49 54 45 5f 45 58  macros.SQLITE_EX
0b40: 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 2c 20 53  TENSION_INIT1, S
0b50: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
0b60: 49 4e 49 54 32 2c 20 73 6f 20 74 68 61 74 20 69  INIT2, so that i
0b70: 74 20 77 6f 72 6b 73 20 77 69 74 68 0a 73 71 6c  t works with.sql
0b80: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
0b90: 69 6f 6e 2e 20 20 54 68 61 6e 6b 73 20 74 6f 20  ion.  Thanks to 
0ba0: 45 72 69 63 20 48 69 67 61 73 68 69 6e 6f 20 61  Eric Higashino a
0bb0: 6e 64 20 4a 6f 65 20 57 69 6c 73 6f 6e 2e 0a 4e  nd Joe Wilson..N
0bc0: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ew instructions 
0bd0: 66 6f 72 20 4d 61 63 20 63 6f 6d 70 69 6c 61 74  for Mac compilat
0be0: 69 6f 6e 2e 0a 32 30 30 37 2d 30 39 2d 31 37 20  ion..2007-09-17 
0bf0: 57 69 74 68 20 68 65 6c 70 20 66 72 6f 6d 20 4a  With help from J
0c00: 6f 65 20 57 69 6c 73 6f 6e 20 61 6e 64 20 4e 75  oe Wilson and Nu
0c10: 6e 6f 20 4c 75 63 61 2c 20 6d 61 64 65 20 75 73  no Luca, made us
0c20: 65 20 6f 66 0a 65 78 74 65 72 6e 61 6c 20 69 6e  e of.external in
0c30: 74 65 72 66 61 63 65 73 20 73 6f 20 74 68 61 74  terfaces so that
0c40: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 69 73 20   compilation is 
0c50: 6e 6f 20 6c 6f 6e 67 65 72 20 64 65 70 65 6e 64  no longer depend
0c60: 65 6e 74 20 6f 6e 0a 53 51 4c 69 74 65 20 73 6f  ent on.SQLite so
0c70: 75 72 63 65 20 63 6f 64 65 2e 20 20 4d 65 72 67  urce code.  Merg
0c80: 65 64 20 73 6f 75 72 63 65 2c 20 68 65 61 64 65  ed source, heade
0c90: 72 2c 20 61 6e 64 20 52 45 41 44 4d 45 20 69 6e  r, and README in
0ca0: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 66 69 6c 65  to a single.file
0cb0: 2e 20 20 41 64 64 65 64 20 63 61 73 74 73 20 73  .  Added casts s
0cc0: 6f 20 74 68 61 74 20 4d 61 63 20 77 69 6c 6c 20  o that Mac will 
0cd0: 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20  compile without 
0ce0: 77 61 72 6e 69 6e 67 73 20 28 75 6e 73 69 67 6e  warnings (unsign
0cf0: 65 64 0a 61 6e 64 20 73 69 67 6e 65 64 20 63 68  ed.and signed ch
0d00: 61 72 29 2e 0a 32 30 30 37 2d 30 39 2d 30 35 20  ar)..2007-09-05 
0d10: 49 6e 63 6c 75 64 65 64 20 73 6f 6d 65 20 64 65  Included some de
0d20: 66 69 6e 69 74 69 6f 6e 73 20 66 72 6f 6d 20 73  finitions from s
0d30: 71 6c 69 74 65 20 33 2e 33 2e 31 33 20 73 6f 20  qlite 3.3.13 so 
0d40: 74 68 61 74 20 74 68 69 73 0a 77 69 6c 6c 20 63  that this.will c
0d50: 6f 6e 74 69 6e 75 65 20 74 6f 20 77 6f 72 6b 20  ontinue to work 
0d60: 69 6e 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  in newer version
0d70: 73 20 6f 66 20 73 71 6c 69 74 65 2e 20 20 43 6f  s of sqlite.  Co
0d80: 6d 70 6c 65 74 65 64 0a 64 65 73 63 72 69 70 74  mpleted.descript
0d90: 69 6f 6e 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73  ion of functions
0da0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 32 30 30 37   available..2007
0db0: 2d 30 33 2d 32 37 20 52 65 76 69 73 65 64 20 64  -03-27 Revised d
0dc0: 65 73 63 72 69 70 74 69 6f 6e 2e 0a 32 30 30 37  escription..2007
0dd0: 2d 30 33 2d 32 33 20 53 6d 61 6c 6c 20 63 6c 65  -03-23 Small cle
0de0: 61 6e 75 70 20 61 6e 64 20 61 20 62 75 67 20 66  anup and a bug f
0df0: 69 78 20 6f 6e 20 74 68 65 20 63 6f 64 65 2e 20  ix on the code. 
0e00: 20 54 68 69 73 20 77 61 73 20 6d 61 69 6e 6c 79   This was mainly
0e10: 0a 6c 65 74 74 69 6e 67 20 65 72 72 6e 6f 20 66  .letting errno f
0e20: 6c 61 67 20 65 72 72 6f 72 73 20 65 6e 63 6f 75  lag errors encou
0e30: 6e 74 65 72 65 64 20 69 6e 20 74 68 65 20 6d 61  ntered in the ma
0e40: 74 68 20 6c 69 62 72 61 72 79 20 61 6e 64 20 63  th library and c
0e50: 68 65 63 6b 69 6e 67 0a 74 68 65 20 72 65 73 75  hecking.the resu
0e60: 6c 74 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  lt, rather than 
0e70: 70 72 65 2d 63 68 65 63 6b 69 6e 67 2e 20 20 54  pre-checking.  T
0e80: 68 69 73 20 66 69 78 65 73 20 61 20 62 75 67 20  his fixes a bug 
0e90: 69 6e 20 70 6f 77 65 72 20 74 68 61 74 0a 77 6f  in power that.wo
0ea0: 75 6c 64 20 63 61 75 73 65 20 61 6e 20 65 72 72  uld cause an err
0eb0: 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 70 6f  or if any non-po
0ec0: 73 69 74 69 76 65 20 6e 75 6d 62 65 72 20 77 61  sitive number wa
0ed0: 73 20 72 61 69 73 65 64 20 74 6f 20 61 6e 79 0a  s raised to any.
0ee0: 70 6f 77 65 72 2e 0a 32 30 30 37 2d 30 32 2d 30  power..2007-02-0
0ef0: 37 20 70 6f 73 74 65 64 20 62 79 20 4d 69 6b 65  7 posted by Mike
0f00: 79 20 43 20 74 6f 20 73 71 6c 69 74 65 20 6d 61  y C to sqlite ma
0f10: 69 6c 69 6e 67 20 6c 69 73 74 2e 0a 4f 72 69 67  iling list..Orig
0f20: 69 6e 61 6c 20 63 6f 64 65 20 32 30 30 36 20 4a  inal code 2006 J
0f30: 75 6e 65 20 30 35 20 62 79 20 72 65 6c 69 63 6f  une 05 by relico
0f40: 64 65 72 2e 0a 0a 2a 2f 0a 0a 2f 2f 23 69 6e 63  der...*/..//#inc
0f50: 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a  lude "config.h".
0f60: 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77  #include <window
0f70: 73 2e 68 3e 0a 0a 2f 2f 20 23 64 65 66 69 6e 65  s.h>..// #define
0f80: 20 43 4f 4d 50 49 4c 45 5f 53 51 4c 49 54 45 5f   COMPILE_SQLITE_
0f90: 45 58 54 45 4e 53 49 4f 4e 53 5f 41 53 5f 4c 4f  EXTENSIONS_AS_LO
0fa0: 41 44 41 42 4c 45 5f 4d 4f 44 55 4c 45 0a 2f 2f  ADABLE_MODULE.//
0fb0: 23 64 65 66 69 6e 65 20 48 41 56 45 5f 41 43 4f  #define HAVE_ACO
0fc0: 53 48 20 31 0a 2f 2f 23 64 65 66 69 6e 65 20 48  SH 1.//#define H
0fd0: 41 56 45 5f 41 53 49 4e 48 20 31 0a 2f 2f 23 64  AVE_ASINH 1.//#d
0fe0: 65 66 69 6e 65 20 48 41 56 45 5f 41 54 41 4e 48  efine HAVE_ATANH
0ff0: 20 31 0a 23 64 65 66 69 6e 65 20 48 41 56 45 5f   1.#define HAVE_
1000: 53 49 4e 48 20 31 0a 23 64 65 66 69 6e 65 20 48  SINH 1.#define H
1010: 41 56 45 5f 43 4f 53 48 20 31 0a 23 64 65 66 69  AVE_COSH 1.#defi
1020: 6e 65 20 48 41 56 45 5f 54 41 4e 48 20 31 0a 23  ne HAVE_TANH 1.#
1030: 64 65 66 69 6e 65 20 48 41 56 45 5f 4c 4f 47 31  define HAVE_LOG1
1040: 30 20 31 0a 2f 2f 23 64 65 66 69 6e 65 20 48 41  0 1.//#define HA
1050: 56 45 5f 49 53 42 4c 41 4e 4b 20 31 0a 23 64 65  VE_ISBLANK 1.#de
1060: 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 4f 55 4e  fine SQLITE_SOUN
1070: 44 45 58 20 31 0a 23 64 65 66 69 6e 65 20 48 41  DEX 1.#define HA
1080: 56 45 5f 54 52 49 4d 20 31 09 09 2f 2a 20 4c 4d  VE_TRIM 1../* LM
1090: 48 20 32 30 30 37 2d 30 33 2d 32 35 20 69 66 20  H 2007-03-25 if 
10a0: 73 71 6c 69 74 65 20 68 61 73 20 74 72 69 6d 20  sqlite has trim 
10b0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 23 69  functions */..#i
10c0: 66 64 65 66 20 43 4f 4d 50 49 4c 45 5f 53 51 4c  fdef COMPILE_SQL
10d0: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 5f 41  ITE_EXTENSIONS_A
10e0: 53 5f 4c 4f 41 44 41 42 4c 45 5f 4d 4f 44 55 4c  S_LOADABLE_MODUL
10f0: 45 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  E.#include "sqli
1100: 74 65 33 65 78 74 2e 68 22 0a 53 51 4c 49 54 45  te3ext.h".SQLITE
1110: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31  _EXTENSION_INIT1
1120: 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20  .#else.#include 
1130: 22 73 72 63 2f 73 71 6c 69 74 65 33 2e 68 22 0a  "src/sqlite3.h".
1140: 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65  #endif..#include
1150: 20 3c 63 74 79 70 65 2e 68 3e 0a 2f 2a 20 72 65   <ctype.h>./* re
1160: 6c 69 63 6f 64 65 72 20 2a 2f 0a 23 69 6e 63 6c  licoder */.#incl
1170: 75 64 65 20 3c 6d 61 74 68 2e 68 3e 0a 23 69 6e  ude <math.h>.#in
1180: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
1190: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f  .#include <stdio
11a0: 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20 5f 57 49  .h>..#ifndef _WI
11b0: 4e 33 32 5f 57 43 45 0a 23 69 6e 63 6c 75 64 65  N32_WCE.#include
11c0: 20 3c 65 72 72 6e 6f 2e 68 3e 09 09 2f 2a 20 4c   <errno.h>../* L
11d0: 4d 48 20 32 30 30 37 2d 30 33 2d 32 35 20 2a 2f  MH 2007-03-25 */
11e0: 0a 23 65 6c 73 65 0a 69 6e 74 20 65 72 72 6e 6f  .#else.int errno
11f0: 3b 0a 23 64 65 66 69 6e 65 20 73 74 72 65 72 72  ;.#define strerr
1200: 6f 72 28 78 29 20 22 22 0a 23 65 6e 64 69 66 0a  or(x) "".#endif.
1210: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
1220: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  b.h>.#include <a
1230: 73 73 65 72 74 2e 68 3e 0a 0a 23 69 66 6e 64 65  ssert.h>..#ifnde
1240: 66 20 5f 4d 41 50 5f 48 5f 0a 23 64 65 66 69 6e  f _MAP_H_.#defin
1250: 65 20 5f 4d 41 50 5f 48 5f 0a 0a 2f 2f 23 69 6e  e _MAP_H_..//#in
1260: 63 6c 75 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e  clude <stdint.h>
1270: 0a 0a 74 79 70 65 64 65 66 20 73 69 67 6e 65 64  ..typedef signed
1280: 20 63 68 61 72 20 69 6e 74 38 5f 74 3b 0a 74 79   char int8_t;.ty
1290: 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63  pedef unsigned c
12a0: 68 61 72 20 75 69 6e 74 38 5f 74 3b 0a 74 79 70  har uint8_t;.typ
12b0: 65 64 65 66 20 73 69 67 6e 65 64 20 69 6e 74 20  edef signed int 
12c0: 69 6e 74 31 36 5f 74 3b 0a 74 79 70 65 64 65 66  int16_t;.typedef
12d0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 69   unsigned int ui
12e0: 6e 74 31 36 5f 74 3b 0a 74 79 70 65 64 65 66 20  nt16_t;.typedef 
12f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 6e 74 20  signed long int 
1300: 69 6e 74 33 32 5f 74 3b 0a 74 79 70 65 64 65 66  int32_t;.typedef
1310: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69   unsigned long i
1320: 6e 74 20 75 69 6e 74 33 32 5f 74 3b 0a 74 79 70  nt uint32_t;.typ
1330: 65 64 65 66 20 73 69 67 6e 65 64 20 6c 6f 6e 67  edef signed long
1340: 20 6c 6f 6e 67 20 69 6e 74 20 69 6e 74 36 34 5f   long int int64_
1350: 74 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  t;.typedef unsig
1360: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e  ned long long in
1370: 74 20 75 69 6e 74 36 34 5f 74 3b 0a 0a 2f 2a 0a  t uint64_t;../*.
1380: 2a 2a 20 53 69 6d 70 6c 65 20 62 69 6e 61 72 79  ** Simple binary
1390: 20 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61   tree implementa
13a0: 74 69 6f 6e 20 74 6f 20 75 73 65 20 69 6e 20 6d  tion to use in m
13b0: 65 64 69 61 6e 2c 20 6d 6f 64 65 20 61 6e 64 20  edian, mode and 
13c0: 71 75 61 72 74 69 6c 65 20 63 61 6c 63 75 6c 61  quartile calcula
13d0: 74 69 6f 6e 73 0a 2a 2a 20 54 72 65 65 20 69 73  tions.** Tree is
13e0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
13f0: 20 62 61 6c 61 6e 63 65 64 2e 20 54 68 61 74 20   balanced. That 
1400: 77 6f 75 6c 64 20 72 65 71 75 69 72 65 20 73 6f  would require so
1410: 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 72 65 64  mething like red
1420: 26 62 6c 61 63 6b 20 74 72 65 65 73 20 6f 66 20  &black trees of 
1430: 41 56 4c 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  AVL.*/..typedef 
1440: 69 6e 74 28 2a 63 6d 70 5f 66 75 6e 63 29 28 63  int(*cmp_func)(c
1450: 6f 6e 73 74 20 76 6f 69 64 20 2a 2c 20 63 6f 6e  onst void *, con
1460: 73 74 20 76 6f 69 64 20 2a 29 3b 0a 74 79 70 65  st void *);.type
1470: 64 65 66 20 76 6f 69 64 28 2a 6d 61 70 5f 69 74  def void(*map_it
1480: 65 72 61 74 6f 72 29 28 76 6f 69 64 2a 2c 20 69  erator)(void*, i
1490: 6e 74 36 34 5f 74 2c 20 76 6f 69 64 2a 29 3b 0a  nt64_t, void*);.
14a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
14b0: 6e 6f 64 65 7b 0a 20 20 73 74 72 75 63 74 20 6e  node{.  struct n
14c0: 6f 64 65 20 2a 6c 3b 0a 20 20 73 74 72 75 63 74  ode *l;.  struct
14d0: 20 6e 6f 64 65 20 2a 72 3b 0a 20 20 76 6f 69 64   node *r;.  void
14e0: 2a 20 64 61 74 61 3b 0a 20 20 69 6e 74 36 34 5f  * data;.  int64_
14f0: 74 20 63 6f 75 6e 74 3b 0a 7d 20 6e 6f 64 65 3b  t count;.} node;
1500: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
1510: 20 6d 61 70 7b 0a 20 20 6e 6f 64 65 20 2a 62 61   map{.  node *ba
1520: 73 65 3b 0a 20 20 63 6d 70 5f 66 75 6e 63 20 63  se;.  cmp_func c
1530: 6d 70 3b 0a 20 20 73 68 6f 72 74 20 66 72 65 65  mp;.  short free
1540: 3b 0a 7d 20 6d 61 70 3b 0a 0a 2f 2a 0a 2a 2a 20  ;.} map;../*.** 
1550: 63 72 65 61 74 65 73 20 61 20 6d 61 70 20 67 69  creates a map gi
1560: 76 65 6e 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e  ven a comparison
1570: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 6d 61 70   function.*/.map
1580: 20 6d 61 70 5f 6d 61 6b 65 28 63 6d 70 5f 66 75   map_make(cmp_fu
1590: 6e 63 20 63 6d 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20  nc cmp);../*.** 
15a0: 69 6e 73 65 72 74 73 20 74 68 65 20 65 6c 65 6d  inserts the elem
15b0: 65 6e 74 20 65 20 69 6e 74 6f 20 6d 61 70 20 6d  ent e into map m
15c0: 0a 2a 2f 0a 76 6f 69 64 20 6d 61 70 5f 69 6e 73  .*/.void map_ins
15d0: 65 72 74 28 6d 61 70 20 2a 6d 2c 20 76 6f 69 64  ert(map *m, void
15e0: 20 2a 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 65 78 65   *e);../*.** exe
15f0: 63 75 74 65 73 20 66 75 6e 63 74 69 6f 6e 20 69  cutes function i
1600: 74 65 72 20 6f 76 65 72 20 61 6c 6c 20 65 6c 65  ter over all ele
1610: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6d 61 70  ments in the map
1620: 2c 20 69 6e 20 6b 65 79 20 69 6e 63 72 65 61 73  , in key increas
1630: 69 6e 67 20 6f 72 64 65 72 0a 2a 2f 0a 76 6f 69  ing order.*/.voi
1640: 64 20 6d 61 70 5f 69 74 65 72 61 74 65 28 6d 61  d map_iterate(ma
1650: 70 20 2a 6d 2c 20 6d 61 70 5f 69 74 65 72 61 74  p *m, map_iterat
1660: 6f 72 20 69 74 65 72 2c 20 76 6f 69 64 2a 20 70  or iter, void* p
1670: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 72 65 65 73 20  );../*.** frees 
1680: 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
1690: 62 79 20 61 20 6d 61 70 0a 2a 2f 0a 76 6f 69 64  by a map.*/.void
16a0: 20 6d 61 70 5f 64 65 73 74 72 6f 79 28 6d 61 70   map_destroy(map
16b0: 20 2a 6d 29 3b 0a 0a 2f 2a 0a 2a 2a 20 63 6f 6d   *m);../*.** com
16c0: 70 61 72 65 73 20 32 20 69 6e 74 65 67 65 72 73  pares 2 integers
16d0: 0a 2a 2a 20 74 6f 20 75 73 65 20 77 69 74 68 20  .** to use with 
16e0: 6d 61 70 5f 6d 61 6b 65 0a 2a 2f 0a 69 6e 74 20  map_make.*/.int 
16f0: 69 6e 74 5f 63 6d 70 28 63 6f 6e 73 74 20 76 6f  int_cmp(const vo
1700: 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
1710: 64 20 2a 62 29 3b 0a 0a 2f 2a 0a 2a 2a 20 63 6f  d *b);../*.** co
1720: 6d 70 61 72 65 73 20 32 20 64 6f 75 62 6c 65 73  mpares 2 doubles
1730: 0a 2a 2a 20 74 6f 20 75 73 65 20 77 69 74 68 20  .** to use with 
1740: 6d 61 70 5f 6d 61 6b 65 0a 2a 2f 0a 69 6e 74 20  map_make.*/.int 
1750: 64 6f 75 62 6c 65 5f 63 6d 70 28 63 6f 6e 73 74  double_cmp(const
1760: 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20   void *a, const 
1770: 76 6f 69 64 20 2a 62 29 3b 0a 0a 23 65 6e 64 69  void *b);..#endi
1780: 66 20 2f 2a 20 5f 4d 41 50 5f 48 5f 20 2a 2f 0a  f /* _MAP_H_ */.
1790: 0a 74 79 70 65 64 65 66 20 75 69 6e 74 38 5f 74  .typedef uint8_t
17a0: 20 20 20 20 20 20 20 20 20 75 38 3b 0a 2f 2f 74           u8;.//t
17b0: 79 70 65 64 65 66 20 75 69 6e 74 31 36 5f 74 20  ypedef uint16_t 
17c0: 20 20 20 20 20 20 20 75 31 36 3b 0a 74 79 70 65         u16;.type
17d0: 64 65 66 20 69 6e 74 36 34 5f 74 20 20 20 20 20  def int64_t     
17e0: 20 20 20 20 69 36 34 3b 0a 0a 73 74 61 74 69 63      i64;..static
17f0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 53 74   char *sqlite3St
1800: 72 44 75 70 28 20 63 6f 6e 73 74 20 63 68 61 72  rDup( const char
1810: 20 2a 7a 20 29 20 7b 0a 20 20 20 20 63 68 61 72   *z ) {.    char
1820: 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f   *res = sqlite3_
1830: 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 7a  malloc( strlen(z
1840: 29 2b 31 20 29 3b 0a 20 20 20 20 72 65 74 75 72  )+1 );.    retur
1850: 6e 20 73 74 72 63 70 79 28 20 72 65 73 2c 20 7a  n strcpy( res, z
1860: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   );.}../*.** The
1870: 73 65 20 61 72 65 20 63 6f 70 69 65 64 20 76 65  se are copied ve
1880: 72 62 61 74 69 6d 20 66 72 6f 6d 20 66 75 6e 2e  rbatim from fun.
1890: 63 20 73 6f 20 61 73 20 74 6f 20 6e 6f 74 20 68  c so as to not h
18a0: 61 76 65 20 74 68 65 20 6e 61 6d 65 73 20 65 78  ave the names ex
18b0: 70 6f 72 74 65 64 0a 2a 2f 0a 0a 2f 2a 20 4c 4d  ported.*/../* LM
18c0: 48 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 20 33  H from sqlite3 3
18d0: 2e 33 2e 31 33 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  .3.13 */./*.** T
18e0: 68 69 73 20 74 61 62 6c 65 20 6d 61 70 73 20 66  his table maps f
18f0: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 62 79  rom the first by
1900: 74 65 20 6f 66 20 61 20 55 54 46 2d 38 20 63 68  te of a UTF-8 ch
1910: 61 72 61 63 74 65 72 20 74 6f 20 74 68 65 20 6e  aracter to the n
1920: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 74 72 61 69  umber.** of trai
1930: 6c 69 6e 67 20 62 79 74 65 73 20 65 78 70 65 63  ling bytes expec
1940: 74 65 64 2e 20 41 20 76 61 6c 75 65 20 27 34 27  ted. A value '4'
1950: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1960: 74 68 65 20 74 61 62 6c 65 20 6b 65 79 0a 2a 2a  the table key.**
1970: 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
1980: 66 69 72 73 74 20 62 79 74 65 20 66 6f 72 20 61  first byte for a
1990: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
19a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
19b0: 74 20 75 38 20 78 74 72 61 5f 75 74 66 38 5f 62  t u8 xtra_utf8_b
19c0: 79 74 65 73 5b 32 35 36 5d 20 20 3d 20 7b 0a 2f  ytes[256]  = {./
19d0: 2a 20 30 78 78 78 78 78 78 78 20 2a 2f 0a 30 2c  * 0xxxxxxx */.0,
19e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
19f0: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20  0, 0,     0, 0, 
1a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
1a10: 2c 0a 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ,.0, 0, 0, 0, 0,
1a20: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     0,
1a30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1a40: 30 2c 20 30 2c 0a 30 2c 20 30 2c 20 30 2c 20 30  0, 0,.0, 0, 0, 0
1a50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
1a60: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
1a70: 20 30 2c 20 30 2c 20 30 2c 0a 30 2c 20 30 2c 20   0, 0, 0,.0, 0, 
1a80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
1a90: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
1aa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 30 2c  , 0, 0, 0, 0,.0,
1ab0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1ac0: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20  0, 0,     0, 0, 
1ad0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
1ae0: 2c 0a 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ,.0, 0, 0, 0, 0,
1af0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     0,
1b00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1b10: 30 2c 20 30 2c 0a 30 2c 20 30 2c 20 30 2c 20 30  0, 0,.0, 0, 0, 0
1b20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
1b30: 20 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 30 2c 0a 30 2c 20 30 2c 20   0, 0, 0,.0, 0, 
1b50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
1b60: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
1b70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 0a 2f  , 0, 0, 0, 0,../
1b80: 2a 20 31 30 77 77 77 77 77 77 20 2a 2f 0a 34 2c  * 10wwwwww */.4,
1b90: 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20   4, 4, 4, 4, 4, 
1ba0: 34 2c 20 34 2c 20 20 20 20 20 34 2c 20 34 2c 20  4, 4,     4, 4, 
1bb0: 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34  4, 4, 4, 4, 4, 4
1bc0: 2c 0a 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c  ,.4, 4, 4, 4, 4,
1bd0: 20 34 2c 20 34 2c 20 34 2c 20 20 20 20 20 34 2c   4, 4, 4,     4,
1be0: 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20   4, 4, 4, 4, 4, 
1bf0: 34 2c 20 34 2c 0a 34 2c 20 34 2c 20 34 2c 20 34  4, 4,.4, 4, 4, 4
1c00: 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20  , 4, 4, 4, 4,   
1c10: 20 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c    4, 4, 4, 4, 4,
1c20: 20 34 2c 20 34 2c 20 34 2c 0a 34 2c 20 34 2c 20   4, 4, 4,.4, 4, 
1c30: 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34  4, 4, 4, 4, 4, 4
1c40: 2c 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20 34  ,     4, 4, 4, 4
1c50: 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 0a 0a 2f  , 4, 4, 4, 4,../
1c60: 2a 20 31 31 30 79 79 79 79 79 20 2a 2f 0a 31 2c  * 110yyyyy */.1,
1c70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
1c80: 31 2c 20 31 2c 20 20 20 20 20 31 2c 20 31 2c 20  1, 1,     1, 1, 
1c90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
1ca0: 2c 0a 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  ,.1, 1, 1, 1, 1,
1cb0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 20 20 31 2c   1, 1, 1,     1,
1cc0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
1cd0: 31 2c 20 31 2c 0a 0a 2f 2a 20 31 31 31 30 7a 7a  1, 1,../* 1110zz
1ce0: 7a 7a 20 2a 2f 0a 32 2c 20 32 2c 20 32 2c 20 32  zz */.2, 2, 2, 2
1cf0: 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20 20  , 2, 2, 2, 2,   
1d00: 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c    2, 2, 2, 2, 2,
1d10: 20 32 2c 20 32 2c 20 32 2c 0a 0a 2f 2a 20 31 31   2, 2, 2,../* 11
1d20: 31 31 30 79 79 79 20 2a 2f 0a 33 2c 20 33 2c 20  110yyy */.3, 3, 
1d30: 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33  3, 3, 3, 3, 3, 3
1d40: 2c 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20 34  ,     4, 4, 4, 4
1d50: 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 0a 7d 3b  , 4, 4, 4, 4,.};
1d60: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 74 61  .../*.** This ta
1d70: 62 6c 65 20 6d 61 70 73 20 66 72 6f 6d 20 74 68  ble maps from th
1d80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 72 61 69  e number of trai
1d90: 6c 69 6e 67 20 62 79 74 65 73 20 69 6e 20 61 20  ling bytes in a 
1da0: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 0a  UTF-8 character.
1db0: 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ** to an integer
1dc0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 69   constant that i
1dd0: 73 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 61  s effectively ca
1de0: 6c 63 75 6c 61 74 65 64 20 66 6f 72 20 65 61 63  lculated for eac
1df0: 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 72  h character.** r
1e00: 65 61 64 20 62 79 20 61 20 6e 61 69 76 65 20 69  ead by a naive i
1e10: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1e20: 20 61 20 55 54 46 2d 38 20 63 68 61 72 61 63 74   a UTF-8 charact
1e30: 65 72 20 72 65 61 64 65 72 2e 20 54 68 65 20 63  er reader. The c
1e40: 6f 64 65 0a 2a 2a 20 69 6e 20 74 68 65 20 52 45  ode.** in the RE
1e50: 41 44 5f 55 54 46 38 20 6d 61 63 72 6f 20 65 78  AD_UTF8 macro ex
1e60: 70 6c 61 69 6e 73 20 74 68 69 6e 67 73 20 62 65  plains things be
1e70: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  st..*/.static co
1e80: 6e 73 74 20 69 6e 74 20 78 74 72 61 5f 75 74 66  nst int xtra_utf
1e90: 38 5f 62 69 74 73 5b 5d 20 3d 20 20 7b 0a 20 20  8_bits[] =  {.  
1ea0: 30 2c 0a 20 20 31 32 34 31 36 2c 20 20 20 20 20  0,.  12416,     
1eb0: 20 20 20 20 20 2f 2a 20 28 30 78 43 30 20 3c 3c       /* (0xC0 <<
1ec0: 20 36 29 20 2b 20 28 30 78 38 30 29 20 2a 2f 0a   6) + (0x80) */.
1ed0: 20 20 39 32 35 38 32 34 2c 20 20 20 20 20 20 20    925824,       
1ee0: 20 20 2f 2a 20 28 30 78 45 30 20 3c 3c 20 31 32    /* (0xE0 << 12
1ef0: 29 20 2b 20 28 30 78 38 30 20 3c 3c 20 36 29 20  ) + (0x80 << 6) 
1f00: 2b 20 28 30 78 38 30 29 20 2a 2f 0a 20 20 36 33  + (0x80) */.  63
1f10: 34 34 37 31 36 38 20 20 20 20 20 20 20 20 2f 2a  447168        /*
1f20: 20 28 30 78 46 30 20 3c 3c 20 31 38 29 20 2b 20   (0xF0 << 18) + 
1f30: 28 30 78 38 30 20 3c 3c 20 31 32 29 20 2b 20 28  (0x80 << 12) + (
1f40: 30 78 38 30 20 3c 3c 20 36 29 20 2b 20 30 78 38  0x80 << 6) + 0x8
1f50: 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  0 */.};../*.** I
1f60: 66 20 61 20 55 54 46 2d 38 20 63 68 61 72 61 63  f a UTF-8 charac
1f70: 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 4e 20 62  ter contains N b
1f80: 79 74 65 73 20 65 78 74 72 61 20 62 79 74 65 73  ytes extra bytes
1f90: 20 28 4e 20 62 79 74 65 73 20 66 6f 6c 6c 6f 77   (N bytes follow
1fa0: 0a 2a 2a 20 74 68 65 20 69 6e 69 74 69 61 6c 20  .** the initial 
1fb0: 62 79 74 65 20 73 6f 20 74 68 61 74 20 74 68 65  byte so that the
1fc0: 20 74 6f 74 61 6c 20 63 68 61 72 61 63 74 65 72   total character
1fd0: 20 6c 65 6e 67 74 68 20 69 73 20 4e 2b 31 29 20   length is N+1) 
1fe0: 74 68 65 6e 0a 2a 2a 20 6d 61 73 6b 69 6e 67 20  then.** masking 
1ff0: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 77 69  the character wi
2000: 74 68 20 75 74 66 38 5f 6d 61 73 6b 5b 4e 5d 20  th utf8_mask[N] 
2010: 6d 75 73 74 20 70 72 6f 64 75 63 65 20 61 20 6e  must produce a n
2020: 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 72 65 73 75 6c  on-zero.** resul
2030: 74 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 77  t.  Otherwise, w
2040: 65 20 68 61 76 65 20 61 6e 20 28 69 6c 6c 65 67  e have an (illeg
2050: 61 6c 29 20 6f 76 65 72 6c 6f 6e 67 20 65 6e 63  al) overlong enc
2060: 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  oding..*/.static
2070: 20 63 6f 6e 73 74 20 69 6e 74 20 75 74 66 5f 6d   const int utf_m
2080: 61 73 6b 5b 5d 20 3d 20 7b 0a 20 20 30 78 30 30  ask[] = {.  0x00
2090: 30 30 30 30 30 30 2c 0a 20 20 30 78 66 66 66 66  000000,.  0xffff
20a0: 66 66 38 30 2c 0a 20 20 30 78 66 66 66 66 66 38  ff80,.  0xfffff8
20b0: 30 30 2c 0a 20 20 30 78 66 66 66 66 30 30 30 30  00,.  0xffff0000
20c0: 2c 0a 7d 3b 0a 0a 2f 2a 20 4c 4d 48 20 73 61 6c  ,.};../* LMH sal
20d0: 76 61 67 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  vaged from sqlit
20e0: 65 33 20 33 2e 33 2e 31 33 20 73 6f 75 72 63 65  e3 3.3.13 source
20f0: 20 63 6f 64 65 20 73 72 63 2f 75 74 66 2e 63 20   code src/utf.c 
2100: 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4c 44 5f 52  */.#define OLD_R
2110: 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20 63 29  EAD_UTF8(zIn, c)
2120: 20 7b 20 5c 0a 20 20 69 6e 74 20 78 74 72 61 3b   { \.  int xtra;
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2160: 63 20 3d 20 2a 28 7a 49 6e 29 2b 2b 3b 20 20 20  c = *(zIn)++;   
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 5c 0a 20 20 78 74 72 61 20 3d 20       \.  xtra = 
21a0: 78 74 72 61 5f 75 74 66 38 5f 62 79 74 65 73 5b  xtra_utf8_bytes[
21b0: 63 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  c];             
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
21d0: 20 20 73 77 69 74 63 68 28 20 78 74 72 61 20 29    switch( xtra )
21e0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 61 73         \.    cas
2210: 65 20 34 3a 20 63 20 3d 20 28 69 6e 74 29 30 78  e 4: c = (int)0x
2220: 46 46 46 44 3b 20 62 72 65 61 6b 3b 20 20 20 20  FFFD; break;    
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 5c 0a 20 20 20 20 63 61 73 65 20 33 3a 20 63 20  \.    case 3: c 
2250: 3d 20 28 63 3c 3c 36 29 20 2b 20 2a 28 7a 49 6e  = (c<<6) + *(zIn
2260: 29 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  )++;            
2270: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63           \.    c
2280: 61 73 65 20 32 3a 20 63 20 3d 20 28 63 3c 3c 36  ase 2: c = (c<<6
2290: 29 20 2b 20 2a 28 7a 49 6e 29 2b 2b 3b 20 20 20  ) + *(zIn)++;   
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 5c 0a 20 20 20 20 63 61 73 65 20 31 3a 20    \.    case 1: 
22c0: 63 20 3d 20 28 63 3c 3c 36 29 20 2b 20 2a 28 7a  c = (c<<6) + *(z
22d0: 49 6e 29 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  In)++;          
22e0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
22f0: 20 63 20 2d 3d 20 78 74 72 61 5f 75 74 66 38 5f   c -= xtra_utf8_
2300: 62 69 74 73 5b 78 74 72 61 5d 3b 20 20 20 20 20  bits[xtra];     
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 5c 0a 20 20 20 20 69 66 28 20 28 75      \.    if( (u
2330: 74 66 5f 6d 61 73 6b 5b 78 74 72 61 5d 26 63 29  tf_mask[xtra]&c)
2340: 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2360: 20 20 20 20 20 20 20 7c 7c 20 28 63 26 30 78 46         || (c&0xF
2370: 46 46 46 46 38 30 30 29 3d 3d 30 78 44 38 30 30  FFFF800)==0xD800
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20        \.        
23a0: 7c 7c 20 28 63 26 30 78 46 46 46 46 46 46 46 45  || (c&0xFFFFFFFE
23b0: 29 3d 3d 30 78 46 46 46 45 20 29 7b 20 20 63 20  )==0xFFFE ){  c 
23c0: 3d 20 30 78 46 46 46 44 3b 20 7d 20 20 20 20 5c  = 0xFFFD; }    \
23d0: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 73 74 61          \.}..sta
2410: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 52  tic int sqlite3R
2420: 65 61 64 55 74 66 38 28 63 6f 6e 73 74 20 75 6e  eadUtf8(const un
2430: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b  signed char *z){
2440: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 4f 4c 44 5f  .  int c;.  OLD_
2450: 52 45 41 44 5f 55 54 46 38 28 7a 2c 20 63 29 3b  READ_UTF8(z, c);
2460: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
2470: 23 64 65 66 69 6e 65 20 53 4b 49 50 5f 55 54 46  #define SKIP_UTF
2480: 38 28 7a 49 6e 29 20 7b 20 20 20 20 20 20 20 20  8(zIn) {        
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 5c 0a 20 20 7a 49 6e 20 2b         \.  zIn +
24b0: 3d 20 28 78 74 72 61 5f 75 74 66 38 5f 62 79 74  = (xtra_utf8_byt
24c0: 65 73 5b 2a 28 75 38 20 2a 29 7a 49 6e 5d 20 2b  es[*(u8 *)zIn] +
24d0: 20 31 29 3b 20 20 20 20 20 20 20 20 20 20 20 20   1);            
24e0: 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 58 20 69 73 20  \.}../*.** X is 
24f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2500: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
2510: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
2520: 2e 20 20 49 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20  .  Increment.** 
2530: 58 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  X so that it poi
2540: 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nts to the next 
2550: 63 68 61 72 61 63 74 65 72 2e 20 20 54 68 69 73  character.  This
2560: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 72 69 67 68   only works righ
2570: 74 0a 2a 2a 20 69 66 20 58 20 70 6f 69 6e 74 73  t.** if X points
2580: 20 74 6f 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   to a well-forme
2590: 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 0a  d UTF-8 string..
25a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
25b0: 65 4e 65 78 74 43 68 61 72 28 58 29 20 20 77 68  eNextChar(X)  wh
25c0: 69 6c 65 28 20 28 30 78 63 30 26 2a 2b 2b 28 58  ile( (0xc0&*++(X
25d0: 29 29 3d 3d 30 78 38 30 20 29 7b 7d 0a 23 64 65  ))==0x80 ){}.#de
25e0: 66 69 6e 65 20 73 71 6c 69 74 65 43 68 61 72 56  fine sqliteCharV
25f0: 61 6c 28 58 29 20 20 20 73 71 6c 69 74 65 33 52  al(X)   sqlite3R
2600: 65 61 64 55 74 66 38 28 58 29 0a 0a 2f 2a 0a 2a  eadUtf8(X)../*.*
2610: 2a 20 54 68 69 73 20 69 73 20 61 20 6d 61 63 72  * This is a macr
2620: 6f 20 74 68 61 74 20 66 61 63 69 6c 69 74 61 74  o that facilitat
2630: 65 73 20 77 72 69 74 74 69 6e 67 20 77 72 61 70  es writting wrap
2640: 70 65 72 73 20 66 6f 72 20 6d 61 74 68 2e 68 20  pers for math.h 
2650: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 74 20  functions.** it 
2660: 63 72 65 61 74 65 73 20 63 6f 64 65 20 66 6f 72  creates code for
2670: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 75   a function to u
2680: 73 65 20 69 6e 20 53 51 6c 69 74 65 20 74 68 61  se in SQlite tha
2690: 74 20 67 65 74 73 20 6f 6e 65 20 6e 75 6d 65 72  t gets one numer
26a0: 69 63 20 69 6e 70 75 74 0a 2a 2a 20 61 6e 64 20  ic input.** and 
26b0: 72 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 69  returns a floati
26c0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a  ng point value..
26d0: 2a 2a 0a 2a 2a 20 43 6f 75 6c 64 20 68 61 76 65  **.** Could have
26e0: 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65   been implemente
26f0: 64 20 75 73 69 6e 67 20 70 6f 69 6e 74 65 72 73  d using pointers
2700: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 73 20 62 75   to functions bu
2710: 74 20 74 68 69 73 20 77 61 79 20 69 74 27 73 20  t this way it's 
2720: 69 6e 6c 69 6e 65 0a 2a 2a 20 61 6e 64 20 74 68  inline.** and th
2730: 75 73 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  us more efficien
2740: 74 2e 20 4c 6f 77 65 72 20 2a 20 72 61 6e 6b 69  t. Lower * ranki
2750: 6e 67 20 74 68 6f 75 67 68 2e 2e 2e 0a 2a 2a 20  ng though....** 
2760: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a  .** Parameters:.
2770: 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 66 75  ** name:      fu
2780: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 74 6f 20 64  nction name to d
2790: 65 20 64 65 66 69 6e 65 64 20 28 65 67 3a 20 73  e defined (eg: s
27a0: 69 6e 46 75 6e 63 29 0a 2a 2a 20 66 75 6e 63 74  inFunc).** funct
27b0: 69 6f 6e 3a 20 20 66 75 6e 63 74 69 6f 6e 20 64  ion:  function d
27c0: 65 66 69 6e 65 64 20 69 6e 20 6d 61 74 68 2e 68  efined in math.h
27d0: 20 74 6f 20 77 72 61 70 20 28 65 67 3a 20 73 69   to wrap (eg: si
27e0: 6e 29 0a 2a 2a 20 64 6f 6d 61 69 6e 3a 20 20 20  n).** domain:   
27f0: 20 62 6f 6f 6c 65 61 6e 20 63 6f 6e 64 69 74 69   boolean conditi
2800: 6f 6e 20 74 68 61 74 20 43 41 4e 27 54 20 68 61  on that CAN'T ha
2810: 70 70 65 6e 20 69 6e 20 74 65 72 6d 73 20 6f 66  ppen in terms of
2820: 20 74 68 65 20 69 6e 70 75 74 20 70 61 72 61 6d   the input param
2830: 65 74 65 72 20 72 56 61 6c 0a 2a 2a 20 20 20 20  eter rVal.**    
2840: 20 20 20 20 20 20 20 20 28 65 67 3a 20 72 76 61          (eg: rva
2850: 6c 3c 30 20 66 6f 72 20 73 71 72 74 29 0a 2a 2f  l<0 for sqrt).*/
2860: 0a 2f 2a 20 4c 4d 48 20 32 30 30 37 2d 30 33 2d  ./* LMH 2007-03-
2870: 32 35 20 43 68 61 6e 67 65 64 20 74 6f 20 75 73  25 Changed to us
2880: 65 20 65 72 72 6e 6f 20 61 6e 64 20 72 65 6d 6f  e errno and remo
2890: 76 65 20 64 6f 6d 61 69 6e 3b 20 6e 6f 20 70 72  ve domain; no pr
28a0: 65 2d 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 65  e-checking for e
28b0: 72 72 6f 72 73 2e 20 2a 2f 0a 23 64 65 66 69 6e  rrors. */.#defin
28c0: 65 20 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50 5f  e GEN_MATH_WRAP_
28d0: 44 4f 55 42 4c 45 5f 31 28 6e 61 6d 65 2c 20 66  DOUBLE_1(name, f
28e0: 75 6e 63 74 69 6f 6e 29 20 5c 0a 73 74 61 74 69  unction) \.stati
28f0: 63 20 76 6f 69 64 20 6e 61 6d 65 28 73 71 6c 69  c void name(sqli
2900: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
2910: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
2920: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2930: 61 72 67 76 29 7b 5c 0a 20 20 64 6f 75 62 6c 65  argv){\.  double
2940: 20 72 56 61 6c 20 3d 20 30 2e 30 2c 20 76 61 6c   rVal = 0.0, val
2950: 3b 5c 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;\.  assert( arg
2960: 63 3d 3d 31 20 29 3b 5c 0a 20 20 73 77 69 74 63  c==1 );\.  switc
2970: 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  h( sqlite3_value
2980: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29  _type(argv[0]) )
2990: 7b 5c 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  {\.    case SQLI
29a0: 54 45 5f 4e 55 4c 4c 3a 20 7b 5c 0a 20 20 20 20  TE_NULL: {\.    
29b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
29c0: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 5c  _null(context);\
29d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 0a 20  .      break;\. 
29e0: 20 20 20 7d 5c 0a 20 20 20 20 64 65 66 61 75 6c     }\.    defaul
29f0: 74 3a 20 7b 5c 0a 20 20 20 20 20 20 72 56 61 6c  t: {\.      rVal
2a00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2a10: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29  _double(argv[0])
2a20: 3b 5c 0a 20 20 20 20 20 20 65 72 72 6e 6f 20 3d  ;\.      errno =
2a30: 20 30 3b 5c 0a 20 20 20 20 20 20 76 61 6c 20 3d   0;\.      val =
2a40: 20 66 75 6e 63 74 69 6f 6e 28 72 56 61 6c 29 3b   function(rVal);
2a50: 5c 0a 20 20 20 20 20 20 69 66 20 28 65 72 72 6e  \.      if (errn
2a60: 6f 20 3d 3d 20 30 29 20 7b 5c 0a 20 20 20 20 20  o == 0) {\.     
2a70: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2a80: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
2a90: 2c 20 76 61 6c 29 3b 5c 0a 20 20 20 20 20 20 7d  , val);\.      }
2aa0: 20 65 6c 73 65 20 7b 5c 0a 20 20 20 20 20 20 20   else {\.       
2ab0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2ac0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 73  error(context, s
2ad0: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20  trerror(errno), 
2ae0: 65 72 72 6e 6f 29 3b 5c 0a 20 20 20 20 20 20 7d  errno);\.      }
2af0: 5c 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 0a  \.      break;\.
2b00: 20 20 20 20 7d 5c 0a 20 20 7d 5c 0a 7d 5c 0a 0a      }\.  }\.}\..
2b10: 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 6f  ./*.** Example o
2b20: 66 20 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50 5f  f GEN_MATH_WRAP_
2b30: 44 4f 55 42 4c 45 5f 31 20 75 73 61 67 65 0a 2a  DOUBLE_1 usage.*
2b40: 2a 20 74 68 69 73 20 63 72 65 61 74 65 73 20 66  * this creates f
2b50: 75 6e 63 74 69 6f 6e 20 73 71 72 74 46 75 6e 63  unction sqrtFunc
2b60: 20 74 6f 20 77 72 61 70 20 74 68 65 20 6d 61 74   to wrap the mat
2b70: 68 2e 68 20 73 74 61 6e 64 61 72 64 20 66 75 6e  h.h standard fun
2b80: 63 74 69 6f 6e 20 73 71 72 74 28 78 29 3d 78 5e  ction sqrt(x)=x^
2b90: 30 2e 35 0a 2a 2f 0a 47 45 4e 5f 4d 41 54 48 5f  0.5.*/.GEN_MATH_
2ba0: 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31 28 73 71  WRAP_DOUBLE_1(sq
2bb0: 72 74 46 75 6e 63 2c 20 73 71 72 74 29 0a 0a 2f  rtFunc, sqrt)../
2bc0: 2a 20 74 72 69 67 6e 6f 6d 65 74 72 69 63 20 66  * trignometric f
2bd0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 47 45 4e 5f  unctions */.GEN_
2be0: 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45  MATH_WRAP_DOUBLE
2bf0: 5f 31 28 61 63 6f 73 46 75 6e 63 2c 20 61 63 6f  _1(acosFunc, aco
2c00: 73 29 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50  s).GEN_MATH_WRAP
2c10: 5f 44 4f 55 42 4c 45 5f 31 28 61 73 69 6e 46 75  _DOUBLE_1(asinFu
2c20: 6e 63 2c 20 61 73 69 6e 29 0a 47 45 4e 5f 4d 41  nc, asin).GEN_MA
2c30: 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31  TH_WRAP_DOUBLE_1
2c40: 28 61 74 61 6e 46 75 6e 63 2c 20 61 74 61 6e 29  (atanFunc, atan)
2c50: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 66 20  ../*.** Many of 
2c60: 73 79 73 74 65 6d 73 20 64 6f 6e 27 74 20 68 61  systems don't ha
2c70: 76 65 20 69 6e 76 65 72 73 65 20 68 79 70 65 72  ve inverse hyper
2c80: 62 6f 6c 69 63 20 74 72 69 67 20 66 75 6e 63 74  bolic trig funct
2c90: 69 6f 6e 73 20 73 6f 20 74 68 69 73 20 77 69 6c  ions so this wil
2ca0: 6c 20 65 6d 75 6c 61 74 65 0a 2a 2a 20 74 68 65  l emulate.** the
2cb0: 6d 20 6f 6e 20 74 68 6f 73 65 20 73 79 73 74 65  m on those syste
2cc0: 6d 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 6c  ms in terms of l
2cd0: 6f 67 20 61 6e 64 20 73 71 72 74 20 28 66 6f 72  og and sqrt (for
2ce0: 6d 75 6c 61 73 20 61 72 65 20 74 6f 6f 20 74 72  mulas are too tr
2cf0: 69 76 69 61 6c 20 74 6f 20 64 65 6d 61 6e 64 20  ivial to demand 
2d00: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 70 72 6f 6f  .** written proo
2d10: 66 20 68 65 72 65 29 0a 2a 2f 0a 0a 23 69 66 6e  f here).*/..#ifn
2d20: 64 65 66 20 48 41 56 45 5f 41 43 4f 53 48 0a 73  def HAVE_ACOSH.s
2d30: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 61 63 6f  tatic double aco
2d40: 73 68 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20 20  sh(double x){.  
2d50: 72 65 74 75 72 6e 20 6c 6f 67 28 78 20 2b 20 73  return log(x + s
2d60: 71 72 74 28 78 2a 78 20 2d 20 31 2e 30 29 29 3b  qrt(x*x - 1.0));
2d70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 47 45 4e 5f 4d  .}.#endif..GEN_M
2d80: 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f  ATH_WRAP_DOUBLE_
2d90: 31 28 61 63 6f 73 68 46 75 6e 63 2c 20 61 63 6f  1(acoshFunc, aco
2da0: 73 68 29 0a 0a 23 69 66 6e 64 65 66 20 48 41 56  sh)..#ifndef HAV
2db0: 45 5f 41 53 49 4e 48 0a 73 74 61 74 69 63 20 64  E_ASINH.static d
2dc0: 6f 75 62 6c 65 20 61 73 69 6e 68 28 64 6f 75 62  ouble asinh(doub
2dd0: 6c 65 20 78 29 7b 0a 20 20 72 65 74 75 72 6e 20  le x){.  return 
2de0: 6c 6f 67 28 78 20 2b 20 73 71 72 74 28 78 2a 78  log(x + sqrt(x*x
2df0: 20 2b 20 31 2e 30 29 29 3b 0a 7d 0a 23 65 6e 64   + 1.0));.}.#end
2e00: 69 66 0a 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41  if..GEN_MATH_WRA
2e10: 50 5f 44 4f 55 42 4c 45 5f 31 28 61 73 69 6e 68  P_DOUBLE_1(asinh
2e20: 46 75 6e 63 2c 20 61 73 69 6e 68 29 0a 0a 23 69  Func, asinh)..#i
2e30: 66 6e 64 65 66 20 48 41 56 45 5f 41 54 41 4e 48  fndef HAVE_ATANH
2e40: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 61  .static double a
2e50: 74 61 6e 68 28 64 6f 75 62 6c 65 20 78 29 7b 0a  tanh(double x){.
2e60: 20 20 72 65 74 75 72 6e 20 28 31 2e 30 2f 32 2e    return (1.0/2.
2e70: 30 29 2a 6c 6f 67 28 28 31 2b 78 29 2f 28 31 2d  0)*log((1+x)/(1-
2e80: 78 29 29 20 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  x)) ;.}.#endif..
2e90: 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50 5f 44 4f  GEN_MATH_WRAP_DO
2ea0: 55 42 4c 45 5f 31 28 61 74 61 6e 68 46 75 6e 63  UBLE_1(atanhFunc
2eb0: 2c 20 61 74 61 6e 68 29 0a 0a 2f 2a 0a 2a 2a 20  , atanh)../*.** 
2ec0: 6d 61 74 68 2e 68 20 64 6f 65 73 6e 27 74 20 72  math.h doesn't r
2ed0: 65 71 75 69 72 65 20 63 6f 74 20 28 63 6f 74 61  equire cot (cota
2ee0: 6e 67 65 6e 74 29 20 73 6f 20 69 74 27 73 20 64  ngent) so it's d
2ef0: 65 66 69 6e 65 64 20 68 65 72 65 0a 2a 2f 0a 73  efined here.*/.s
2f00: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 63 6f 74  tatic double cot
2f10: 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20 20 72 65  (double x){.  re
2f20: 74 75 72 6e 20 31 2e 30 2f 74 61 6e 28 78 29 3b  turn 1.0/tan(x);
2f30: 0a 7d 0a 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41  .}..GEN_MATH_WRA
2f40: 50 5f 44 4f 55 42 4c 45 5f 31 28 73 69 6e 46 75  P_DOUBLE_1(sinFu
2f50: 6e 63 2c 20 73 69 6e 29 0a 47 45 4e 5f 4d 41 54  nc, sin).GEN_MAT
2f60: 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31 28  H_WRAP_DOUBLE_1(
2f70: 63 6f 73 46 75 6e 63 2c 20 63 6f 73 29 0a 47 45  cosFunc, cos).GE
2f80: 4e 5f 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55 42  N_MATH_WRAP_DOUB
2f90: 4c 45 5f 31 28 74 61 6e 46 75 6e 63 2c 20 74 61  LE_1(tanFunc, ta
2fa0: 6e 29 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50  n).GEN_MATH_WRAP
2fb0: 5f 44 4f 55 42 4c 45 5f 31 28 63 6f 74 46 75 6e  _DOUBLE_1(cotFun
2fc0: 63 2c 20 63 6f 74 29 0a 0a 73 74 61 74 69 63 20  c, cot)..static 
2fd0: 64 6f 75 62 6c 65 20 63 6f 74 68 28 64 6f 75 62  double coth(doub
2fe0: 6c 65 20 78 29 7b 0a 20 20 72 65 74 75 72 6e 20  le x){.  return 
2ff0: 31 2e 30 2f 74 61 6e 68 28 78 29 3b 0a 7d 0a 0a  1.0/tanh(x);.}..
3000: 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65  /*.** Many syste
3010: 6d 73 20 64 6f 6e 27 74 20 68 61 76 65 20 68 79  ms don't have hy
3020: 70 65 72 62 6f 6c 69 63 20 74 72 69 67 6f 6e 6f  perbolic trigono
3030: 6d 65 74 72 69 63 20 66 75 6e 63 74 69 6f 6e 73  metric functions
3040: 20 73 6f 20 74 68 69 73 20 77 69 6c 6c 20 65 6d   so this will em
3050: 75 6c 61 74 65 0a 2a 2a 20 74 68 65 6d 20 6f 6e  ulate.** them on
3060: 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73 20 64   those systems d
3070: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
3080: 20 64 65 66 69 6e 69 74 69 6f 6e 20 69 6e 20 74   definition in t
3090: 65 72 6d 73 20 6f 66 20 65 78 70 0a 2a 2f 0a 23  erms of exp.*/.#
30a0: 69 66 6e 64 65 66 20 48 41 56 45 5f 53 49 4e 48  ifndef HAVE_SINH
30b0: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 73  .static double s
30c0: 69 6e 68 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20  inh(double x){. 
30d0: 20 72 65 74 75 72 6e 20 28 65 78 70 28 78 29 2d   return (exp(x)-
30e0: 65 78 70 28 2d 78 29 29 2f 32 2e 30 3b 0a 7d 0a  exp(-x))/2.0;.}.
30f0: 23 65 6e 64 69 66 0a 0a 47 45 4e 5f 4d 41 54 48  #endif..GEN_MATH
3100: 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31 28 73  _WRAP_DOUBLE_1(s
3110: 69 6e 68 46 75 6e 63 2c 20 73 69 6e 68 29 0a 0a  inhFunc, sinh)..
3120: 23 69 66 6e 64 65 66 20 48 41 56 45 5f 43 4f 53  #ifndef HAVE_COS
3130: 48 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  H.static double 
3140: 63 6f 73 68 28 64 6f 75 62 6c 65 20 78 29 7b 0a  cosh(double x){.
3150: 20 20 72 65 74 75 72 6e 20 28 65 78 70 28 78 29    return (exp(x)
3160: 2b 65 78 70 28 2d 78 29 29 2f 32 2e 30 3b 0a 7d  +exp(-x))/2.0;.}
3170: 0a 23 65 6e 64 69 66 0a 0a 47 45 4e 5f 4d 41 54  .#endif..GEN_MAT
3180: 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f 31 28  H_WRAP_DOUBLE_1(
3190: 63 6f 73 68 46 75 6e 63 2c 20 63 6f 73 68 29 0a  coshFunc, cosh).
31a0: 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 54 41  .#ifndef HAVE_TA
31b0: 4e 48 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  NH.static double
31c0: 20 74 61 6e 68 28 64 6f 75 62 6c 65 20 78 29 7b   tanh(double x){
31d0: 0a 20 20 72 65 74 75 72 6e 20 73 69 6e 68 28 78  .  return sinh(x
31e0: 29 2f 63 6f 73 68 28 78 29 3b 0a 7d 0a 23 65 6e  )/cosh(x);.}.#en
31f0: 64 69 66 0a 0a 47 45 4e 5f 4d 41 54 48 5f 57 52  dif..GEN_MATH_WR
3200: 41 50 5f 44 4f 55 42 4c 45 5f 31 28 74 61 6e 68  AP_DOUBLE_1(tanh
3210: 46 75 6e 63 2c 20 74 61 6e 68 29 0a 0a 47 45 4e  Func, tanh)..GEN
3220: 5f 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c  _MATH_WRAP_DOUBL
3230: 45 5f 31 28 63 6f 74 68 46 75 6e 63 2c 20 63 6f  E_1(cothFunc, co
3240: 74 68 29 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20  th)../*.** Some 
3250: 73 79 73 74 65 6d 73 20 6c 61 63 6b 20 6c 6f 67  systems lack log
3260: 20 69 6e 20 62 61 73 65 20 31 30 2e 20 54 68 69   in base 10. Thi
3270: 73 20 77 69 6c 6c 20 65 6d 75 6c 61 74 65 20 69  s will emulate i
3280: 74 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 48 41  t.*/..#ifndef HA
3290: 56 45 5f 4c 4f 47 31 30 0a 73 74 61 74 69 63 20  VE_LOG10.static 
32a0: 64 6f 75 62 6c 65 20 6c 6f 67 31 30 28 64 6f 75  double log10(dou
32b0: 62 6c 65 20 78 29 7b 0a 20 20 73 74 61 74 69 63  ble x){.  static
32c0: 20 64 6f 75 62 6c 65 20 6c 31 30 20 3d 20 2d 31   double l10 = -1
32d0: 2e 30 3b 0a 20 20 69 66 28 20 6c 31 30 3c 30 2e  .0;.  if( l10<0.
32e0: 30 20 29 7b 0a 20 20 20 20 6c 31 30 20 3d 20 6c  0 ){.    l10 = l
32f0: 6f 67 28 31 30 2e 30 29 3b 0a 20 20 7d 0a 20 20  og(10.0);.  }.  
3300: 72 65 74 75 72 6e 20 6c 6f 67 28 78 29 2f 6c 31  return log(x)/l1
3310: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 47 45 4e  0;.}.#endif..GEN
3320: 5f 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c  _MATH_WRAP_DOUBL
3330: 45 5f 31 28 6c 6f 67 46 75 6e 63 2c 20 6c 6f 67  E_1(logFunc, log
3340: 29 0a 47 45 4e 5f 4d 41 54 48 5f 57 52 41 50 5f  ).GEN_MATH_WRAP_
3350: 44 4f 55 42 4c 45 5f 31 28 6c 6f 67 31 30 46 75  DOUBLE_1(log10Fu
3360: 6e 63 2c 20 6c 6f 67 31 30 29 0a 47 45 4e 5f 4d  nc, log10).GEN_M
3370: 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f  ATH_WRAP_DOUBLE_
3380: 31 28 65 78 70 46 75 6e 63 2c 20 65 78 70 29 0a  1(expFunc, exp).
3390: 0a 2f 2a 0a 2a 2a 20 46 61 6c 6c 62 61 63 6b 20  ./*.** Fallback 
33a0: 66 6f 72 20 73 79 73 74 65 6d 73 20 77 68 65 72  for systems wher
33b0: 65 20 6d 61 74 68 2e 68 20 64 6f 65 73 6e 27 74  e math.h doesn't
33c0: 20 64 65 66 69 6e 65 20 4d 5f 50 49 0a 2a 2f 0a   define M_PI.*/.
33d0: 23 75 6e 64 65 66 20 4d 5f 50 49 0a 23 69 66 6e  #undef M_PI.#ifn
33e0: 64 65 66 20 4d 5f 50 49 0a 2f 2a 0a 2a 2a 20 73  def M_PI./*.** s
33f0: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 50 49 20  tatic double PI 
3400: 3d 20 61 63 6f 73 28 2d 31 2e 30 29 3b 0a 2a 2a  = acos(-1.0);.**
3410: 20 23 64 65 66 69 6e 65 20 4d 5f 50 49 20 28 50   #define M_PI (P
3420: 49 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 5f  I).*/.#define M_
3430: 50 49 20 33 2e 31 34 31 35 39 32 36 35 33 35 38  PI 3.14159265358
3440: 39 37 39 33 32 33 38 34 36 0a 23 65 6e 64 69 66  979323846.#endif
3450: 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 44 65 67  ../* Convert Deg
3460: 72 65 65 73 20 69 6e 74 6f 20 52 61 64 69 61 6e  rees into Radian
3470: 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  s */.static doub
3480: 6c 65 20 64 65 67 32 72 61 64 28 64 6f 75 62 6c  le deg2rad(doubl
3490: 65 20 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 78  e x){.  return x
34a0: 2a 4d 5f 50 49 2f 31 38 30 2e 30 3b 0a 7d 0a 0a  *M_PI/180.0;.}..
34b0: 2f 2a 20 43 6f 6e 76 65 72 74 20 52 61 64 69 61  /* Convert Radia
34c0: 6e 73 20 69 6e 74 6f 20 44 65 67 72 65 65 73 20  ns into Degrees 
34d0: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
34e0: 20 72 61 64 32 64 65 67 28 64 6f 75 62 6c 65 20   rad2deg(double 
34f0: 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 38 30  x){.  return 180
3500: 2e 30 2a 78 2f 4d 5f 50 49 3b 0a 7d 0a 0a 47 45  .0*x/M_PI;.}..GE
3510: 4e 5f 4d 41 54 48 5f 57 52 41 50 5f 44 4f 55 42  N_MATH_WRAP_DOUB
3520: 4c 45 5f 31 28 72 61 64 32 64 65 67 46 75 6e 63  LE_1(rad2degFunc
3530: 2c 20 72 61 64 32 64 65 67 29 0a 47 45 4e 5f 4d  , rad2deg).GEN_M
3540: 41 54 48 5f 57 52 41 50 5f 44 4f 55 42 4c 45 5f  ATH_WRAP_DOUBLE_
3550: 31 28 64 65 67 32 72 61 64 46 75 6e 63 2c 20 64  1(deg2radFunc, d
3560: 65 67 32 72 61 64 29 0a 0a 2f 2a 20 63 6f 6e 73  eg2rad)../* cons
3570: 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 20 74 68  tant function th
3580: 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  at returns the v
3590: 61 6c 75 65 20 6f 66 20 50 49 3d 33 2e 31 34 31  alue of PI=3.141
35a0: 35 2e 2e 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76  5... */.static v
35b0: 6f 69 64 20 70 69 46 75 6e 63 28 73 71 6c 69 74  oid piFunc(sqlit
35c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
35d0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
35e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
35f0: 72 67 76 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rgv){.  sqlite3_
3600: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
3610: 6e 74 65 78 74 2c 20 4d 5f 50 49 29 3b 0a 7d 0a  ntext, M_PI);.}.
3620: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
3630: 73 20 74 68 65 20 73 71 72 74 20 66 75 6e 63 74  s the sqrt funct
3640: 69 6f 6e 2c 20 69 74 20 68 61 73 20 74 68 65 20  ion, it has the 
3650: 70 65 63 75 6c 69 61 72 69 74 79 20 6f 66 20 72  peculiarity of r
3660: 65 74 75 72 6e 69 6e 67 20 61 6e 20 69 6e 74 65  eturning an inte
3670: 67 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ger when the.** 
3680: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
3690: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 53  an integer..** S
36a0: 69 6e 63 65 20 53 51 4c 69 74 65 20 69 73 6e 27  ince SQLite isn'
36b0: 74 20 73 74 72 6f 6e 67 6c 79 20 74 79 70 65 64  t strongly typed
36c0: 20 28 61 6c 6d 6f 73 74 20 75 6e 74 79 70 65 64   (almost untyped
36d0: 20 61 63 74 75 61 6c 6c 79 29 20 74 68 69 73 20   actually) this 
36e0: 69 73 20 61 20 62 69 74 20 70 65 64 61 6e 74 69  is a bit pedanti
36f0: 63 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  c.*/.static void
3700: 20 73 71 75 61 72 65 46 75 6e 63 28 73 71 6c 69   squareFunc(sqli
3710: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3720: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
3730: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3740: 61 72 67 76 29 7b 0a 20 20 69 36 34 20 69 56 61  argv){.  i64 iVa
3750: 6c 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20  l = 0;.  double 
3760: 72 56 61 6c 20 3d 20 30 2e 30 3b 0a 20 20 61 73  rVal = 0.0;.  as
3770: 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b  sert( argc==2 );
3780: 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74  .  switch( sqlit
3790: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
37a0: 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61  gv[0]) ){.    ca
37b0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
37c0: 52 3a 20 7b 0a 20 20 20 20 20 20 69 56 61 6c 20  R: {.      iVal 
37d0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
37e0: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
37f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3800: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
3810: 78 74 2c 20 69 56 61 6c 2a 69 56 61 6c 29 3b 0a  xt, iVal*iVal);.
3820: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3830: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3840: 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
3850: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3860: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
3870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3880: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
3890: 0a 20 20 20 20 20 20 72 56 61 6c 20 3d 20 73 71  .      rVal = sq
38a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
38b0: 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  le(argv[0]);.   
38c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
38d0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
38e0: 2c 20 72 56 61 6c 2a 72 56 61 6c 29 3b 0a 20 20  , rVal*rVal);.  
38f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3900: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  .  }.}../*.** Wr
3910: 61 70 73 20 74 68 65 20 70 6f 77 20 6d 61 74 68  aps the pow math
3920: 2e 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 57  .h function.** W
3930: 68 65 6e 20 62 6f 74 68 20 74 68 65 20 62 61 73  hen both the bas
3940: 65 20 61 6e 64 20 74 68 65 20 65 78 70 6f 6e 65  e and the expone
3950: 6e 74 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  nt are integers 
3960: 74 68 65 20 72 65 73 75 6c 74 20 73 68 6f 75 6c  the result shoul
3970: 64 20 62 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20  d be integer.** 
3980: 28 73 65 65 20 73 71 72 74 20 6a 75 73 74 20 62  (see sqrt just b
3990: 65 66 6f 72 65 20 74 68 69 73 29 2e 20 48 65 72  efore this). Her
39a0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  e the result is 
39b0: 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 0a 2a 2f  always double.*/
39c0: 0a 2f 2a 20 4c 4d 48 20 32 30 30 37 2d 30 33 2d  ./* LMH 2007-03-
39d0: 32 35 20 43 68 61 6e 67 65 64 20 74 6f 20 75 73  25 Changed to us
39e0: 65 20 65 72 72 6e 6f 3b 20 6e 6f 20 70 72 65 2d  e errno; no pre-
39f0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 65 72 72  checking for err
3a00: 6f 72 73 2e 20 20 41 6c 73 6f 20 72 65 6d 6f 76  ors.  Also remov
3a10: 65 73 0a 20 20 62 75 74 20 74 68 61 74 20 77 61  es.  but that wa
3a20: 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
3a30: 20 70 72 65 2d 63 68 65 63 6b 69 6e 67 20 74 68   pre-checking th
3a40: 61 74 20 63 61 6c 6c 65 64 20 73 71 6c 69 74 65  at called sqlite
3a50: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 6f  3_result_error o
3a60: 6e 20 0a 20 20 61 20 6e 6f 6e 2d 70 6f 73 69 74  n .  a non-posit
3a70: 69 76 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  ive first argume
3a80: 6e 74 2c 20 77 68 69 63 68 20 69 73 20 6e 6f 74  nt, which is not
3a90: 20 61 6c 77 61 79 73 20 61 6e 20 65 72 72 6f 72   always an error
3aa0: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
3ab0: 20 70 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74   powerFunc(sqlit
3ac0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3ad0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
3ae0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3af0: 72 67 76 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72  rgv){.  double r
3b00: 31 20 3d 20 30 2e 30 3b 0a 20 20 64 6f 75 62 6c  1 = 0.0;.  doubl
3b10: 65 20 72 32 20 3d 20 30 2e 30 3b 0a 20 20 64 6f  e r2 = 0.0;.  do
3b20: 75 62 6c 65 20 76 61 6c 3b 0a 0a 20 20 61 73 73  uble val;..  ass
3b30: 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a  ert( argc==2 );.
3b40: 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33    .  if( sqlite3
3b50: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
3b60: 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e  [0]) == SQLITE_N
3b70: 55 4c 4c 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76  ULL || sqlite3_v
3b80: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31  alue_type(argv[1
3b90: 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ]) == SQLITE_NUL
3ba0: 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
3bb0: 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e  _result_null(con
3bc0: 74 65 78 74 29 3b 20 0a 20 20 7d 65 6c 73 65 7b  text); .  }else{
3bd0: 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65  .    r1 = sqlite
3be0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
3bf0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 32 20  rgv[0]);.    r2 
3c00: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3c10: 64 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 3b  double(argv[1]);
3c20: 0a 20 20 20 20 65 72 72 6e 6f 20 3d 20 30 3b 0a  .    errno = 0;.
3c30: 20 20 20 20 76 61 6c 20 3d 20 70 6f 77 28 72 31      val = pow(r1
3c40: 2c 72 32 29 3b 0a 20 20 20 20 69 66 20 28 65 72  ,r2);.    if (er
3c50: 72 6e 6f 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  rno == 0) {.    
3c60: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3c70: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
3c80: 20 76 61 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73   val);.    } els
3c90: 65 20 7b 20 20 0a 20 20 20 20 20 20 73 71 6c 69  e {  .      sqli
3ca0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
3cb0: 28 63 6f 6e 74 65 78 74 2c 20 73 74 72 65 72 72  (context, strerr
3cc0: 6f 72 28 65 72 72 6e 6f 29 2c 20 65 72 72 6e 6f  or(errno), errno
3cd0: 29 3b 0a 20 20 20 20 7d 20 20 0a 20 20 7d 0a 7d  );.    }  .  }.}
3ce0: 0a 0a 2f 2a 0a 2a 2a 20 61 74 61 6e 32 20 77 72  ../*.** atan2 wr
3cf0: 61 70 70 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  apper.*/.static 
3d00: 76 6f 69 64 20 61 74 6e 32 46 75 6e 63 28 73 71  void atn2Func(sq
3d10: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3d20: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
3d30: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
3d40: 2a 2a 61 72 67 76 29 7b 0a 20 20 64 6f 75 62 6c  **argv){.  doubl
3d50: 65 20 72 31 20 3d 20 30 2e 30 3b 0a 20 20 64 6f  e r1 = 0.0;.  do
3d60: 75 62 6c 65 20 72 32 20 3d 20 30 2e 30 3b 0a 0a  uble r2 = 0.0;..
3d70: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
3d80: 32 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71  2 );.  .  if( sq
3d90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
3da0: 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
3db0: 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 73 71 6c 69  ITE_NULL || sqli
3dc0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
3dd0: 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
3de0: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71  E_NULL ){.    sq
3df0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
3e00: 6c 28 63 6f 6e 74 65 78 74 29 3b 20 0a 20 20 7d  l(context); .  }
3e10: 65 6c 73 65 7b 0a 20 20 20 20 72 31 20 3d 20 73  else{.    r1 = s
3e20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
3e30: 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
3e40: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 5f 76    r2 = sqlite3_v
3e50: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
3e60: 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [1]);.    sqlite
3e70: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
3e80: 63 6f 6e 74 65 78 74 2c 20 61 74 61 6e 32 28 72  context, atan2(r
3e90: 31 2c 72 32 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  1,r2));.  }.}../
3ea0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
3eb0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 69 67 6e 28  ion of the sign(
3ec0: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
3ed0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 33 20 70 6f  turn one of 3 po
3ee0: 73 73 69 62 69 6c 69 74 69 65 73 20 2b 31 2c 30  ssibilities +1,0
3ef0: 20 6f 72 20 2d 31 20 77 68 65 6e 20 74 68 65 20   or -1 when the 
3f00: 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65 73 70  argument is resp
3f10: 65 63 74 69 76 65 6c 79 0a 2a 2a 20 70 6f 73 69  ectively.** posi
3f20: 74 69 76 65 2c 20 30 20 6f 72 20 6e 65 67 61 74  tive, 0 or negat
3f30: 69 76 65 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ive..** When the
3f40: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
3f50: 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  L the result is 
3f60: 61 6c 73 6f 20 4e 55 4c 4c 20 28 63 6f 6d 70 6c  also NULL (compl
3f70: 65 74 6c 79 20 63 6f 6e 76 65 6e 74 69 6f 6e 61  etly conventiona
3f80: 6c 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l).*/.static voi
3f90: 64 20 73 69 67 6e 46 75 6e 63 28 73 71 6c 69 74  d signFunc(sqlit
3fa0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3fb0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
3fc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3fd0: 72 67 76 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72  rgv){.  double r
3fe0: 56 61 6c 3d 30 2e 30 3b 0a 20 20 69 36 34 20 69  Val=0.0;.  i64 i
3ff0: 56 61 6c 3d 30 3b 0a 20 20 61 73 73 65 72 74 28  Val=0;.  assert(
4000: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 73 77   argc==1 );.  sw
4010: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
4020: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
4030: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
4040: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
4050: 20 20 20 20 20 20 69 56 61 6c 20 3d 20 73 71 6c        iVal = sql
4060: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
4070: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
4080: 20 69 56 61 6c 20 3d 20 28 20 69 56 61 6c 20 3e   iVal = ( iVal >
4090: 20 30 29 20 3f 20 31 3a 20 28 20 69 56 61 6c 20   0) ? 1: ( iVal 
40a0: 3c 20 30 20 29 20 3f 20 2d 31 3a 20 30 3b 0a 20  < 0 ) ? -1: 0;. 
40b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
40c0: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
40d0: 74 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, iVal);.      
40e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
40f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
4100: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
4110: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
4120: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 62  ontext);.      b
4130: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4140: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 2f 2a 20 32  default: {. /* 2
4150: 6e 64 20 63 68 61 6e 67 65 20 62 65 6c 6f 77 2e  nd change below.
4160: 20 4c 69 6e 65 20 66 6f 72 20 61 62 73 20 77 61   Line for abs wa
4170: 73 3a 20 69 66 28 20 72 56 61 6c 3c 30 20 29 20  s: if( rVal<0 ) 
4180: 72 56 61 6c 20 3d 20 72 56 61 6c 20 2a 20 2d 31  rVal = rVal * -1
4190: 2e 30 3b 20 20 2a 2f 0a 0a 20 20 20 20 20 20 72  .0;  */..      r
41a0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
41b0: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
41c0: 30 5d 29 3b 0a 20 20 20 20 20 20 72 56 61 6c 20  0]);.      rVal 
41d0: 3d 20 28 20 72 56 61 6c 20 3e 20 30 29 20 3f 20  = ( rVal > 0) ? 
41e0: 31 3a 20 28 20 72 56 61 6c 20 3c 20 30 20 29 20  1: ( rVal < 0 ) 
41f0: 3f 20 2d 31 3a 20 30 3b 0a 20 20 20 20 20 20 73  ? -1: 0;.      s
4200: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
4210: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 56  uble(context, rV
4220: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
4230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
4240: 2f 2a 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 69  /*.** smallest i
4250: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6e 6f 74  nteger value not
4260: 20 6c 65 73 73 20 74 68 61 6e 20 61 72 67 75 6d   less than argum
4270: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ent.*/.static vo
4280: 69 64 20 63 65 69 6c 46 75 6e 63 28 73 71 6c 69  id ceilFunc(sqli
4290: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
42a0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
42b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
42c0: 61 72 67 76 29 7b 0a 20 20 64 6f 75 62 6c 65 20  argv){.  double 
42d0: 72 56 61 6c 3d 30 2e 30 3b 0a 20 20 69 36 34 20  rVal=0.0;.  i64 
42e0: 69 56 61 6c 3d 30 3b 0a 20 20 61 73 73 65 72 74  iVal=0;.  assert
42f0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 73  ( argc==1 );.  s
4300: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76  witch( sqlite3_v
4310: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
4320: 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ]) ){.    case S
4330: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
4340: 0a 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 20  .      i64 iVal 
4350: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4360: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
4370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4380: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
4390: 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20  xt, iVal);.     
43a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
43b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
43c0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
43d0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
43e0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
43f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4400: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
4410: 20 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    rVal = sqlite3
4420: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
4430: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71  gv[0]);.      sq
4440: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
4450: 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 69 36 34  64(context, (i64
4460: 29 20 63 65 69 6c 28 72 56 61 6c 29 29 3b 0a 20  ) ceil(rVal));. 
4470: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4480: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6c  }.  }.}../*.** l
4490: 61 72 67 65 73 74 20 69 6e 74 65 67 65 72 20 76  argest integer v
44a0: 61 6c 75 65 20 6e 6f 74 20 67 72 65 61 74 65 72  alue not greater
44b0: 20 74 68 61 6e 20 61 72 67 75 6d 65 6e 74 0a 2a   than argument.*
44c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c  /.static void fl
44d0: 6f 6f 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  oorFunc(sqlite3_
44e0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
44f0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
4500: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
4510: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72 56 61 6c  ){.  double rVal
4520: 3d 30 2e 30 3b 0a 20 20 69 36 34 20 69 56 61 6c  =0.0;.  i64 iVal
4530: 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  =0;.  assert( ar
4540: 67 63 3d 3d 31 20 29 3b 0a 20 20 73 77 69 74 63  gc==1 );.  switc
4550: 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  h( sqlite3_value
4560: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29  _type(argv[0]) )
4570: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
4580: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
4590: 20 20 20 69 36 34 20 69 56 61 6c 20 3d 20 73 71     i64 iVal = sq
45a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
45b0: 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  4(argv[0]);.    
45c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
45d0: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
45e0: 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  iVal);.      bre
45f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4600: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
4610: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4620: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
4630: 65 78 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ext);.      brea
4640: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
4650: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 56  ault: {.      rV
4660: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
4670: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
4680: 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
4690: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
46a0: 6f 6e 74 65 78 74 2c 20 28 69 36 34 29 20 66 6c  ontext, (i64) fl
46b0: 6f 6f 72 28 72 56 61 6c 29 29 3b 0a 20 20 20 20  oor(rVal));.    
46c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
46d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
46e0: 6e 20 61 20 73 74 72 69 6e 67 20 28 73 29 20 69  n a string (s) i
46f0: 6e 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  n the first argu
4700: 6d 65 6e 74 20 61 6e 64 20 61 6e 20 69 6e 74 65  ment and an inte
4710: 67 65 72 20 28 6e 29 20 69 6e 20 74 68 65 20 73  ger (n) in the s
4720: 65 63 6f 6e 64 20 72 65 74 75 72 6e 73 20 74 68  econd returns th
4730: 65 20 0a 2a 2a 20 73 74 72 69 6e 67 20 74 68 61  e .** string tha
4740: 74 20 63 6f 6e 73 74 61 69 6e 73 20 73 20 63 6f  t constains s co
4750: 6e 74 61 74 65 6e 61 74 65 64 20 6e 20 74 69 6d  ntatenated n tim
4760: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
4770: 64 20 72 65 70 6c 69 63 61 74 65 46 75 6e 63 28  d replicateFunc(
4780: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4790: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
47a0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
47b0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 75 6e 73  e **argv){.  uns
47c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 20 20  igned char *z;  
47d0: 20 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 20 73        /* input s
47e0: 74 72 69 6e 67 20 2a 2f 0a 20 20 75 6e 73 69 67  tring */.  unsig
47f0: 6e 65 64 20 63 68 61 72 20 2a 7a 6f 3b 20 20 20  ned char *zo;   
4800: 20 20 20 20 2f 2a 20 72 65 73 75 6c 74 20 73 74      /* result st
4810: 72 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 69 43  ring */.  i64 iC
4820: 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
4830: 20 20 20 2f 2a 20 74 69 6d 65 73 20 74 6f 20 72     /* times to r
4840: 65 70 65 61 74 20 2a 2f 0a 20 20 69 36 34 20 6e  epeat */.  i64 n
4850: 4c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Len;            
4860: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
4870: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
4880: 67 20 28 6e 6f 20 6d 75 6c 74 69 62 79 74 65 20  g (no multibyte 
4890: 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 73 29 20  considerations) 
48a0: 2a 2f 20 0a 20 20 69 36 34 20 6e 54 4c 65 6e 3b  */ .  i64 nTLen;
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
48c0: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * length of the 
48d0: 72 65 73 75 6c 74 20 73 74 72 69 6e 67 20 28 6e  result string (n
48e0: 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 6f 6e 73  o multibyte cons
48f0: 69 64 65 72 61 74 69 6f 6e 73 29 20 2a 2f 0a 20  iderations) */. 
4900: 20 69 36 34 20 69 3d 30 3b 0a 0a 20 20 69 66 28   i64 i=0;..  if(
4910: 20 61 72 67 63 21 3d 32 20 7c 7c 20 53 51 4c 49   argc!=2 || SQLI
4920: 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33  TE_NULL==sqlite3
4930: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
4940: 5b 30 5d 29 20 29 0a 20 20 20 20 72 65 74 75 72  [0]) ).    retur
4950: 6e 3b 0a 0a 20 20 69 43 6f 75 6e 74 20 3d 20 73  n;..  iCount = s
4960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
4970: 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20  64(argv[1]);..  
4980: 69 66 28 20 69 43 6f 75 6e 74 3c 30 20 29 7b 0a  if( iCount<0 ){.
4990: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
49a0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
49b0: 2c 20 22 64 6f 6d 61 69 6e 20 65 72 72 6f 72 22  , "domain error"
49c0: 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , -1);.  }else{.
49d0: 0a 20 20 20 20 6e 4c 65 6e 20 20 3d 20 73 71 6c  .    nLen  = sql
49e0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
49f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
4a00: 54 4c 65 6e 20 3d 20 6e 4c 65 6e 2a 69 43 6f 75  TLen = nLen*iCou
4a10: 6e 74 3b 0a 20 20 20 20 7a 3d 73 71 6c 69 74 65  nt;.    z=sqlite
4a20: 33 5f 6d 61 6c 6c 6f 63 28 6e 54 4c 65 6e 2b 31  3_malloc(nTLen+1
4a30: 29 3b 0a 20 20 20 20 7a 6f 3d 73 71 6c 69 74 65  );.    zo=sqlite
4a40: 33 5f 6d 61 6c 6c 6f 63 28 6e 4c 65 6e 2b 31 29  3_malloc(nLen+1)
4a50: 3b 0a 20 20 20 20 69 66 20 28 21 7a 20 7c 7c 20  ;.    if (!z || 
4a60: 21 7a 6f 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  !zo){.      sqli
4a70: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
4a80: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
4a90: 0a 20 20 20 20 20 20 69 66 20 28 7a 29 20 73 71  .      if (z) sq
4aa0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
4ab0: 20 20 20 20 20 69 66 20 28 7a 6f 29 20 73 71 6c       if (zo) sql
4ac0: 69 74 65 33 5f 66 72 65 65 28 7a 6f 29 3b 0a 20  ite3_free(zo);. 
4ad0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4ae0: 20 7d 0a 20 20 20 20 73 74 72 63 70 79 28 28 63   }.    strcpy((c
4af0: 68 61 72 2a 29 7a 6f 2c 20 28 63 68 61 72 2a 29  har*)zo, (char*)
4b00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
4b10: 78 74 28 61 72 67 76 5b 30 5d 29 29 3b 0a 0a 20  xt(argv[0]));.. 
4b20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 43     for(i=0; i<iC
4b30: 6f 75 6e 74 3b 20 2b 2b 69 29 7b 0a 20 20 20 20  ount; ++i){.    
4b40: 20 20 73 74 72 63 70 79 28 28 63 68 61 72 2a 29    strcpy((char*)
4b50: 28 7a 2b 69 2a 6e 4c 65 6e 29 2c 20 28 63 68 61  (z+i*nLen), (cha
4b60: 72 2a 29 7a 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  r*)zo);.    }.. 
4b70: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4b80: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
4b90: 28 63 68 61 72 2a 29 7a 2c 20 2d 31 2c 20 53 51  (char*)z, -1, SQ
4ba0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4bb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
4bc0: 65 28 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(z);.    sqlite
4bd0: 33 5f 66 72 65 65 28 7a 6f 29 3b 0a 20 20 7d 0a  3_free(zo);.  }.
4be0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 6f 6d 65 20 73  }../* .** Some s
4bf0: 79 73 74 65 6d 73 20 28 77 69 6e 33 32 20 61 6d  ystems (win32 am
4c00: 6f 6e 67 20 6f 74 68 65 72 73 29 20 64 6f 6e 27  ong others) don'
4c10: 74 20 68 61 76 65 20 61 6e 20 69 73 62 6c 61 6e  t have an isblan
4c20: 6b 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 69 73  k function, this
4c30: 20 77 69 6c 6c 20 65 6d 75 6c 61 74 65 20 69 74   will emulate it
4c40: 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
4c50: 6f 6e 20 69 73 20 6e 6f 74 20 55 46 54 2d 38 20  on is not UFT-8 
4c60: 73 61 66 65 20 73 69 6e 63 65 20 69 74 20 6f 6e  safe since it on
4c70: 6c 79 20 61 6e 61 6c 79 73 65 73 20 61 20 62 79  ly analyses a by
4c80: 74 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  te character..*/
4c90: 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 49 53  .#ifndef HAVE_IS
4ca0: 42 4c 41 4e 4b 0a 69 6e 74 20 69 73 62 6c 61 6e  BLANK.int isblan
4cb0: 6b 28 63 68 61 72 20 63 29 7b 0a 20 20 72 65 74  k(char c){.  ret
4cc0: 75 72 6e 28 20 27 20 27 3d 3d 63 20 7c 7c 20 27  urn( ' '==c || '
4cd0: 5c 74 27 3d 3d 63 20 29 3b 0a 7d 0a 23 65 6e 64  \t'==c );.}.#end
4ce0: 69 66 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  if..static void 
4cf0: 70 72 6f 70 65 72 46 75 6e 63 28 73 71 6c 69 74  properFunc(sqlit
4d00: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4d10: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
4d20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4d30: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  rgv){.  const un
4d40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 20  signed char *z; 
4d50: 20 20 20 20 2f 2a 20 69 6e 70 75 74 20 73 74 72      /* input str
4d60: 69 6e 67 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ing */.  unsigne
4d70: 64 20 63 68 61 72 20 2a 7a 6f 3b 20 20 20 20 20  d char *zo;     
4d80: 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 20 73       /* output s
4d90: 74 72 69 6e 67 20 2a 2f 0a 20 20 75 6e 73 69 67  tring */.  unsig
4da0: 6e 65 64 20 63 68 61 72 20 2a 7a 74 3b 20 20 20  ned char *zt;   
4db0: 20 20 20 20 20 20 20 2f 2a 20 69 74 65 72 61 74         /* iterat
4dc0: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72 3b 0a  or */.  char r;.
4dd0: 20 20 69 6e 74 20 63 3d 31 3b 0a 0a 20 20 61 73    int c=1;..  as
4de0: 73 65 72 74 28 20 61 72 67 63 21 3d 31 29 3b 0a  sert( argc!=1);.
4df0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
4e00: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
4e10: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29  _type(argv[0]) )
4e20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
4e30: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
4e40: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
4e50: 20 20 7d 0a 0a 20 20 7a 20 3d 20 73 71 6c 69 74    }..  z = sqlit
4e60: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
4e70: 67 76 5b 30 5d 29 3b 0a 20 20 7a 6f 20 3d 20 28  gv[0]);.  zo = (
4e80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4e90: 73 71 6c 69 74 65 33 53 74 72 44 75 70 28 28 63  sqlite3StrDup((c
4ea0: 68 61 72 20 2a 29 20 7a 29 3b 0a 20 20 69 66 20  har *) z);.  if 
4eb0: 28 21 7a 6f 29 20 7b 0a 20 20 20 20 73 71 6c 69  (!zo) {.    sqli
4ec0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
4ed0: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
4ee0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4ef0: 0a 20 20 7a 74 20 3d 20 7a 6f 3b 0a 0a 20 20 77  .  zt = zo;..  w
4f00: 68 69 6c 65 28 20 28 72 20 3d 20 2a 28 7a 2b 2b  hile( (r = *(z++
4f10: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
4f20: 20 69 73 62 6c 61 6e 6b 28 72 29 20 29 7b 0a 20   isblank(r) ){. 
4f30: 20 20 20 20 20 63 3d 31 3b 0a 20 20 20 20 7d 65       c=1;.    }e
4f40: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63  lse{.      if( c
4f50: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==1 ){.        r
4f60: 20 3d 20 74 6f 75 70 70 65 72 28 72 29 3b 0a 20   = toupper(r);. 
4f70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f80: 20 20 20 20 72 20 3d 20 74 6f 6c 6f 77 65 72 28      r = tolower(
4f90: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
4fa0: 20 20 63 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 20    c=0;.    }.   
4fb0: 20 2a 28 7a 74 2b 2b 29 20 3d 20 72 3b 0a 20 20   *(zt++) = r;.  
4fc0: 7d 0a 20 20 2a 7a 74 20 3d 20 27 5c 30 27 3b 0a  }.  *zt = '\0';.
4fd0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4fe0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
4ff0: 28 63 68 61 72 2a 29 7a 6f 2c 20 2d 31 2c 20 53  (char*)zo, -1, S
5000: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
5010: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
5020: 28 7a 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67  (zo);.}../*.** g
5030: 69 76 65 6e 20 61 6e 20 69 6e 70 75 74 20 73 74  iven an input st
5040: 72 69 6e 67 20 28 73 29 20 61 6e 64 20 61 6e 20  ring (s) and an 
5050: 69 6e 74 65 67 65 72 20 28 6e 29 20 61 64 64 73  integer (n) adds
5060: 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 62   spaces at the b
5070: 65 67 69 6e 69 6e 67 20 6f 66 20 20 73 0a 2a 2a  egining of  s.**
5080: 20 75 6e 74 69 6c 20 69 74 20 68 61 73 20 61 20   until it has a 
5090: 6c 65 6e 67 74 68 20 6f 66 20 6e 20 63 68 61 72  length of n char
50a0: 61 63 74 65 72 73 2e 0a 2a 2a 20 57 68 65 6e 20  acters..** When 
50b0: 73 20 68 61 73 20 61 20 6c 65 6e 67 74 68 20 3e  s has a length >
50c0: 3d 6e 20 69 74 27 73 20 61 20 4e 4f 50 0a 2a 2a  =n it's a NOP.**
50d0: 20 70 61 64 6c 28 4e 55 4c 4c 29 20 3d 20 4e 55   padl(NULL) = NU
50e0: 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  LL.*/.static voi
50f0: 64 20 70 61 64 6c 46 75 6e 63 28 73 71 6c 69 74  d padlFunc(sqlit
5100: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5110: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
5120: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5130: 72 67 76 29 7b 0a 20 20 69 36 34 20 69 6c 65 6e  rgv){.  i64 ilen
5140: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65  ;          /* le
5150: 6e 67 74 68 20 74 6f 20 70 61 64 20 74 6f 20 2a  ngth to pad to *
5160: 2f 0a 20 20 69 36 34 20 7a 6c 3b 20 20 20 20 20  /.  i64 zl;     
5170: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
5180: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74   of the input st
5190: 72 69 6e 67 20 28 55 54 46 2d 38 20 63 68 61 72  ring (UTF-8 char
51a0: 73 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  s) */.  int i = 
51b0: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
51c0: 2a 7a 69 3b 20 20 20 20 2f 2a 20 69 6e 70 75 74  *zi;    /* input
51d0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
51e0: 72 20 2a 7a 6f 3b 20 20 20 20 20 20 20 20 20 20  r *zo;          
51f0: 2f 2a 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67  /* output string
5200: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 74 3b 0a   */.  char *zt;.
5210: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
5220: 3d 32 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 73  =2 );.  .  if( s
5230: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
5240: 65 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51  e(argv[0]) == SQ
5250: 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
5260: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5270: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 20 0a  null(context); .
5280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 69 20    }else{.    zi 
5290: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
52a0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
52b0: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 6c 65 6e 20  v[0]);.    ilen 
52c0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
52d0: 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a  int64(argv[1]);.
52e0: 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 64 6f 6d      /* check dom
52f0: 61 69 6e 20 2a 2f 0a 20 20 20 20 69 66 28 69 6c  ain */.    if(il
5300: 65 6e 3c 30 29 7b 0a 20 20 20 20 20 20 73 71 6c  en<0){.      sql
5310: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5320: 72 28 63 6f 6e 74 65 78 74 2c 20 22 64 6f 6d 61  r(context, "doma
5330: 69 6e 20 65 72 72 6f 72 22 2c 20 2d 31 29 3b 0a  in error", -1);.
5340: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5350: 20 20 7d 0a 20 20 20 20 7a 6c 20 3d 20 73 71 6c    }.    zl = sql
5360: 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
5370: 7a 69 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28  zi, -1);.    if(
5380: 20 7a 6c 3e 3d 69 6c 65 6e 20 29 7b 0a 20 20 20   zl>=ilen ){.   
5390: 20 20 20 2f 2a 20 73 74 72 69 6e 67 20 69 73 20     /* string is 
53a0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
53b0: 72 65 71 75 65 73 74 65 64 20 70 61 64 20 6c 65  requested pad le
53c0: 6e 67 74 68 2c 20 72 65 74 75 72 6e 20 74 68 65  ngth, return the
53d0: 20 73 61 6d 65 20 73 74 72 69 6e 67 20 28 64 75   same string (du
53e0: 70 20 69 74 29 20 2a 2f 0a 20 20 20 20 20 20 7a  p it) */.      z
53f0: 6f 20 3d 20 73 71 6c 69 74 65 33 53 74 72 44 75  o = sqlite3StrDu
5400: 70 28 7a 69 29 3b 0a 20 20 20 20 20 20 69 66 20  p(zi);.      if 
5410: 28 21 7a 6f 29 7b 0a 20 20 20 20 20 20 20 20 73  (!zo){.        s
5420: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5430: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
5440: 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
5450: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
5460: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5470: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
5480: 6f 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  o, -1, SQLITE_TR
5490: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
54a0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 6f 20 3d 20  lse{.      zo = 
54b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
54c0: 74 72 6c 65 6e 28 7a 69 29 2b 69 6c 65 6e 2d 7a  trlen(zi)+ilen-z
54d0: 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 20 28  l+1);.      if (
54e0: 21 7a 6f 29 7b 0a 20 20 20 20 20 20 20 20 73 71  !zo){.        sq
54f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5500: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
5510: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
5520: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
5530: 20 7a 74 20 3d 20 7a 6f 3b 0a 20 20 20 20 20 20   zt = zo;.      
5540: 66 6f 72 28 69 3d 31 3b 20 69 2b 7a 6c 3c 3d 69  for(i=1; i+zl<=i
5550: 6c 65 6e 3b 20 2b 2b 69 29 7b 0a 20 20 20 20 20  len; ++i){.     
5560: 20 20 20 2a 28 7a 74 2b 2b 29 3d 27 20 27 3b 0a     *(zt++)=' ';.
5570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
5580: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 61 6b 65   no need to take
5590: 20 55 54 46 2d 38 20 69 6e 74 6f 20 63 6f 6e 73   UTF-8 into cons
55a0: 69 64 65 72 61 74 69 6f 6e 20 68 65 72 65 20 2a  ideration here *
55b0: 2f 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 7a  /.      strcpy(z
55c0: 74 2c 7a 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t,zi);.    }.   
55d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
55e0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 6f  text(context, zo
55f0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
5600: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
5610: 69 74 65 33 5f 66 72 65 65 28 7a 6f 29 3b 0a 20  ite3_free(zo);. 
5620: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67 69 76 65   }.}../*.** give
5630: 6e 20 61 6e 20 69 6e 70 75 74 20 73 74 72 69 6e  n an input strin
5640: 67 20 28 73 29 20 61 6e 64 20 61 6e 20 69 6e 74  g (s) and an int
5650: 65 67 65 72 20 28 6e 29 20 61 70 70 65 6e 64 73  eger (n) appends
5660: 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65   spaces at the e
5670: 6e 64 20 6f 66 20 20 73 0a 2a 2a 20 75 6e 74 69  nd of  s.** unti
5680: 6c 20 69 74 20 68 61 73 20 61 20 6c 65 6e 67 74  l it has a lengt
5690: 68 20 6f 66 20 6e 20 63 68 61 72 61 63 74 65 72  h of n character
56a0: 73 2e 0a 2a 2a 20 57 68 65 6e 20 73 20 68 61 73  s..** When s has
56b0: 20 61 20 6c 65 6e 67 74 68 20 3e 3d 6e 20 69 74   a length >=n it
56c0: 27 73 20 61 20 4e 4f 50 0a 2a 2a 20 70 61 64 6c  's a NOP.** padl
56d0: 28 4e 55 4c 4c 29 20 3d 20 4e 55 4c 4c 0a 2a 2f  (NULL) = NULL.*/
56e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 64  .static void pad
56f0: 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  rFunc(sqlite3_co
5700: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
5710: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
5720: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
5730: 0a 20 20 69 36 34 20 69 6c 65 6e 3b 20 20 20 20  .  i64 ilen;    
5740: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
5750: 74 6f 20 70 61 64 20 74 6f 20 2a 2f 0a 20 20 69  to pad to */.  i
5760: 36 34 20 7a 6c 3b 20 20 20 20 20 20 20 20 20 20  64 zl;          
5770: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 74    /* length of t
5780: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
5790: 28 55 54 46 2d 38 20 63 68 61 72 73 29 20 2a 2f  (UTF-8 chars) */
57a0: 0a 20 20 69 36 34 20 7a 6c 6c 3b 20 20 20 20 20  .  i64 zll;     
57b0: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
57c0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  of the input str
57d0: 69 6e 67 20 28 62 79 74 65 73 29 20 2a 2f 0a 20  ing (bytes) */. 
57e0: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f   int i = 0;.  co
57f0: 6e 73 74 20 63 68 61 72 20 2a 7a 69 3b 20 20 20  nst char *zi;   
5800: 20 2f 2a 20 69 6e 70 75 74 20 73 74 72 69 6e 67   /* input string
5810: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 6f 3b 20   */.  char *zo; 
5820: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70           /* outp
5830: 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63  ut string */.  c
5840: 68 61 72 20 2a 7a 74 3b 0a 0a 20 20 61 73 73 65  har *zt;..  asse
5850: 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20  rt( argc==2 );. 
5860: 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f   .  if( sqlite3_
5870: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
5880: 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55  0]) == SQLITE_NU
5890: 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  LL ){.    sqlite
58a0: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f  3_result_null(co
58b0: 6e 74 65 78 74 29 3b 20 0a 20 20 7d 65 6c 73 65  ntext); .  }else
58c0: 7b 0a 20 20 20 20 7a 69 20 3d 20 28 63 68 61 72  {.    zi = (char
58d0: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
58e0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
58f0: 20 20 20 20 69 6c 65 6e 20 3d 20 73 71 6c 69 74      ilen = sqlit
5900: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
5910: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 2f 2a 20  rgv[1]);.    /* 
5920: 63 68 65 63 6b 20 64 6f 6d 61 69 6e 20 2a 2f 0a  check domain */.
5930: 20 20 20 20 69 66 28 69 6c 65 6e 3c 30 29 7b 0a      if(ilen<0){.
5940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5950: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5960: 78 74 2c 20 22 64 6f 6d 61 69 6e 20 65 72 72 6f  xt, "domain erro
5970: 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72  r", -1);.      r
5980: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
5990: 20 7a 6c 20 3d 20 73 71 6c 69 74 65 33 55 74 66   zl = sqlite3Utf
59a0: 38 43 68 61 72 4c 65 6e 28 7a 69 2c 20 2d 31 29  8CharLen(zi, -1)
59b0: 3b 0a 20 20 20 20 69 66 28 20 7a 6c 3e 3d 69 6c  ;.    if( zl>=il
59c0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73  en ){.      /* s
59d0: 74 72 69 6e 67 20 69 73 20 6c 6f 6e 67 65 72 20  tring is longer 
59e0: 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
59f0: 65 64 20 70 61 64 20 6c 65 6e 67 74 68 2c 20 72  ed pad length, r
5a00: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 73  eturn the same s
5a10: 74 72 69 6e 67 20 28 64 75 70 20 69 74 29 20 2a  tring (dup it) *
5a20: 2f 0a 20 20 20 20 20 20 7a 6f 20 3d 20 73 71 6c  /.      zo = sql
5a30: 69 74 65 33 53 74 72 44 75 70 28 7a 69 29 3b 0a  ite3StrDup(zi);.
5a40: 20 20 20 20 20 20 69 66 20 28 21 7a 6f 29 7b 0a        if (!zo){.
5a50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5a60: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
5a70: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
5a80: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5a90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
5aa0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5ab0: 6f 6e 74 65 78 74 2c 20 7a 6f 2c 20 2d 31 2c 20  ontext, zo, -1, 
5ac0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5ad0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5ae0: 20 20 20 20 7a 6c 6c 20 3d 20 73 74 72 6c 65 6e      zll = strlen
5af0: 28 7a 69 29 3b 0a 20 20 20 20 20 20 7a 6f 20 3d  (zi);.      zo =
5b00: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
5b10: 7a 6c 6c 2b 69 6c 65 6e 2d 7a 6c 2b 31 29 3b 0a  zll+ilen-zl+1);.
5b20: 20 20 20 20 20 20 69 66 20 28 21 7a 6f 29 7b 0a        if (!zo){.
5b30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5b40: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
5b50: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
5b60: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5b70: 20 20 20 7d 0a 20 20 20 20 20 20 7a 74 20 3d 20     }.      zt = 
5b80: 73 74 72 63 70 79 28 7a 6f 2c 7a 69 29 2b 7a 6c  strcpy(zo,zi)+zl
5b90: 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  l;.      for(i=1
5ba0: 3b 20 69 2b 7a 6c 3c 3d 69 6c 65 6e 3b 20 2b 2b  ; i+zl<=ilen; ++
5bb0: 69 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 7a 74  i){.        *(zt
5bc0: 2b 2b 29 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++) = ' ';.     
5bd0: 20 7d 0a 20 20 20 20 20 20 2a 7a 74 20 3d 20 27   }.      *zt = '
5be0: 5c 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  \0';.    }.    s
5bf0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5c00: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 6f 2c 20  xt(context, zo, 
5c10: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
5c20: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
5c30: 65 33 5f 66 72 65 65 28 7a 6f 29 3b 0a 20 20 7d  e3_free(zo);.  }
5c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67 69 76 65 6e 20  .}../*.** given 
5c50: 61 6e 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  an input string 
5c60: 28 73 29 20 61 6e 64 20 61 6e 20 69 6e 74 65 67  (s) and an integ
5c70: 65 72 20 28 6e 29 20 61 70 70 65 6e 64 73 20 73  er (n) appends s
5c80: 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64  paces at the end
5c90: 20 6f 66 20 20 73 0a 2a 2a 20 61 6e 64 20 61 64   of  s.** and ad
5ca0: 64 73 20 73 70 61 63 65 73 20 61 74 20 74 68 65  ds spaces at the
5cb0: 20 62 65 67 69 6e 69 6e 67 20 6f 66 20 73 20 75   begining of s u
5cc0: 6e 74 69 6c 20 69 74 20 68 61 73 20 61 20 6c 65  ntil it has a le
5cd0: 6e 67 74 68 20 6f 66 20 6e 20 63 68 61 72 61 63  ngth of n charac
5ce0: 74 65 72 73 2e 0a 2a 2a 20 54 72 69 65 73 20 74  ters..** Tries t
5cf0: 6f 20 61 64 64 20 68 61 73 20 6d 61 6e 79 20 63  o add has many c
5d00: 68 61 72 61 63 74 65 72 73 20 61 74 20 74 68 65  haracters at the
5d10: 20 6c 65 66 74 20 61 73 20 61 74 20 74 68 65 20   left as at the 
5d20: 72 69 67 68 74 2e 0a 2a 2a 20 57 68 65 6e 20 73  right..** When s
5d30: 20 68 61 73 20 61 20 6c 65 6e 67 74 68 20 3e 3d   has a length >=
5d40: 6e 20 69 74 27 73 20 61 20 4e 4f 50 0a 2a 2a 20  n it's a NOP.** 
5d50: 70 61 64 6c 28 4e 55 4c 4c 29 20 3d 20 4e 55 4c  padl(NULL) = NUL
5d60: 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  L.*/.static void
5d70: 20 70 61 64 63 46 75 6e 63 28 73 71 6c 69 74 65   padcFunc(sqlite
5d80: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
5d90: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
5da0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
5db0: 67 76 29 7b 0a 20 20 69 36 34 20 69 6c 65 6e 3b  gv){.  i64 ilen;
5dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65             /* le
5dd0: 6e 67 74 68 20 74 6f 20 70 61 64 20 74 6f 20 2a  ngth to pad to *
5de0: 2f 0a 20 20 69 36 34 20 7a 6c 3b 20 20 20 20 20  /.  i64 zl;     
5df0: 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74          /* lengt
5e00: 68 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73  h of the input s
5e10: 74 72 69 6e 67 20 28 55 54 46 2d 38 20 63 68 61  tring (UTF-8 cha
5e20: 72 73 29 20 2a 2f 0a 20 20 69 36 34 20 7a 6c 6c  rs) */.  i64 zll
5e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5e40: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 69 6e  length of the in
5e50: 70 75 74 20 73 74 72 69 6e 67 20 28 62 79 74 65  put string (byte
5e60: 73 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  s) */.  int i = 
5e70: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
5e80: 2a 7a 69 3b 20 20 20 20 20 2f 2a 20 69 6e 70 75  *zi;     /* inpu
5e90: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68  t string */.  ch
5ea0: 61 72 20 2a 7a 6f 3b 20 20 20 20 20 20 20 20 20  ar *zo;         
5eb0: 20 20 2f 2a 20 6f 75 74 70 75 74 20 73 74 72 69    /* output stri
5ec0: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 74  ng */.  char *zt
5ed0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;..  assert( arg
5ee0: 63 3d 3d 32 20 29 3b 0a 20 20 0a 20 20 69 66 28  c==2 );.  .  if(
5ef0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5f00: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  ype(argv[0]) == 
5f10: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
5f20: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5f30: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
5f40: 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a   .  }else{.    z
5f50: 69 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  i = (char *)sqli
5f60: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f70: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 6c 65  rgv[0]);.    ile
5f80: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
5f90: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29  e_int64(argv[1])
5fa0: 3b 0a 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 64  ;.    /* check d
5fb0: 6f 6d 61 69 6e 20 2a 2f 0a 20 20 20 20 69 66 28  omain */.    if(
5fc0: 69 6c 65 6e 3c 30 29 7b 0a 20 20 20 20 20 20 73  ilen<0){.      s
5fd0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5fe0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 64 6f  ror(context, "do
5ff0: 6d 61 69 6e 20 65 72 72 6f 72 22 2c 20 2d 31 29  main error", -1)
6000: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
6010: 20 20 20 20 7d 0a 20 20 20 20 7a 6c 20 3d 20 73      }.    zl = s
6020: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
6030: 6e 28 7a 69 2c 20 2d 31 29 3b 0a 20 20 20 20 69  n(zi, -1);.    i
6040: 66 28 20 7a 6c 3e 3d 69 6c 65 6e 20 29 7b 0a 20  f( zl>=ilen ){. 
6050: 20 20 20 20 20 2f 2a 20 73 74 72 69 6e 67 20 69       /* string i
6060: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68  s longer than th
6070: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 64 20  e requested pad 
6080: 6c 65 6e 67 74 68 2c 20 72 65 74 75 72 6e 20 74  length, return t
6090: 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 28  he same string (
60a0: 64 75 70 20 69 74 29 20 2a 2f 0a 20 20 20 20 20  dup it) */.     
60b0: 20 7a 6f 20 3d 20 73 71 6c 69 74 65 33 53 74 72   zo = sqlite3Str
60c0: 44 75 70 28 7a 69 29 3b 0a 20 20 20 20 20 20 69  Dup(zi);.      i
60d0: 66 20 28 21 7a 6f 29 7b 0a 20 20 20 20 20 20 20  f (!zo){.       
60e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
60f0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
6100: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ext);.        re
6110: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
6120: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6130: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6140: 20 7a 6f 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f   zo, -1, SQLITE_
6150: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
6160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 6c 6c  }else{.      zll
6170: 20 3d 20 73 74 72 6c 65 6e 28 7a 69 29 3b 0a 20   = strlen(zi);. 
6180: 20 20 20 20 20 7a 6f 20 3d 20 73 71 6c 69 74 65       zo = sqlite
6190: 33 5f 6d 61 6c 6c 6f 63 28 7a 6c 6c 2b 69 6c 65  3_malloc(zll+ile
61a0: 6e 2d 7a 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69  n-zl+1);.      i
61b0: 66 20 28 21 7a 6f 29 7b 0a 20 20 20 20 20 20 20  f (!zo){.       
61c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
61d0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
61e0: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ext);.        re
61f0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
6200: 20 20 20 20 7a 74 20 3d 20 7a 6f 3b 0a 20 20 20      zt = zo;.   
6210: 20 20 20 66 6f 72 28 69 3d 31 3b 20 32 2a 69 2b     for(i=1; 2*i+
6220: 7a 6c 3c 3d 69 6c 65 6e 3b 20 2b 2b 69 29 7b 0a  zl<=ilen; ++i){.
6230: 20 20 20 20 20 20 20 20 2a 28 7a 74 2b 2b 29 20          *(zt++) 
6240: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = ' ';.      }. 
6250: 20 20 20 20 20 73 74 72 63 70 79 28 7a 74 2c 20       strcpy(zt, 
6260: 7a 69 29 3b 0a 20 20 20 20 20 20 7a 74 2b 3d 7a  zi);.      zt+=z
6270: 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20  ll;.      for(; 
6280: 69 2b 7a 6c 3c 3d 69 6c 65 6e 3b 20 2b 2b 69 29  i+zl<=ilen; ++i)
6290: 7b 0a 20 20 20 20 20 20 20 20 2a 28 7a 74 2b 2b  {.        *(zt++
62a0: 29 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d  ) = ' ';.      }
62b0: 0a 20 20 20 20 20 20 2a 7a 74 20 3d 20 27 5c 30  .      *zt = '\0
62c0: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  ';.    }.    sql
62d0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
62e0: 28 63 6f 6e 74 65 78 74 2c 20 7a 6f 2c 20 2d 31  (context, zo, -1
62f0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
6300: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
6310: 5f 66 72 65 65 28 7a 6f 29 3b 0a 20 20 7d 0a 7d  _free(zo);.  }.}
6320: 0a 0a 2f 2a 0a 2a 2a 20 67 69 76 65 6e 20 32 20  ../*.** given 2 
6330: 73 74 72 69 6e 67 20 28 73 31 2c 73 32 29 20 72  string (s1,s2) r
6340: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
6350: 67 20 73 31 20 77 69 74 68 20 74 68 65 20 63 68  g s1 with the ch
6360: 61 72 61 63 74 65 72 73 20 4e 4f 54 20 69 6e 20  aracters NOT in 
6370: 73 32 20 72 65 6d 6f 76 65 64 0a 2a 2a 20 61 73  s2 removed.** as
6380: 73 75 6d 65 73 20 73 74 72 69 6e 67 73 20 61 72  sumes strings ar
6390: 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 0a  e UTF-8 encoded.
63a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
63b0: 74 72 66 69 6c 74 65 72 46 75 6e 63 28 73 71 6c  trfilterFunc(sql
63c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
63d0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
63e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
63f0: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
6400: 63 68 61 72 20 2a 7a 69 31 3b 20 20 20 20 20 20  char *zi1;      
6410: 20 20 2f 2a 20 66 69 72 73 74 20 70 61 72 61 6d    /* first param
6420: 65 74 65 72 20 73 74 72 69 6e 67 20 28 73 65 61  eter string (sea
6430: 72 63 68 65 64 20 73 74 72 69 6e 67 29 20 2a 2f  rched string) */
6440: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6450: 69 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 73 65  i2;        /* se
6460: 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 73  cond parameter s
6470: 74 72 69 6e 67 20 28 76 63 6f 6e 74 61 69 6e 73  tring (vcontains
6480: 20 76 61 6c 69 64 20 63 68 61 72 61 63 74 65 72   valid character
6490: 73 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  s) */.  const ch
64a0: 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74 20  ar *z1;.  const 
64b0: 63 68 61 72 20 2a 7a 32 31 3b 0a 20 20 63 6f 6e  char *z21;.  con
64c0: 73 74 20 63 68 61 72 20 2a 7a 32 32 3b 0a 20 20  st char *z22;.  
64d0: 63 68 61 72 20 2a 7a 6f 3b 20 20 20 20 20 20 20  char *zo;       
64e0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70 75          /* outpu
64f0: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68  t string */.  ch
6500: 61 72 20 2a 7a 6f 74 3b 0a 20 20 69 6e 74 20 63  ar *zot;.  int c
6510: 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 32 20  1 = 0;.  int c2 
6520: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
6530: 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 0a 20 20  argc==2 );.  .  
6540: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
6550: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
6560: 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c  == SQLITE_NULL |
6570: 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  | sqlite3_value_
6580: 74 79 70 65 28 61 72 67 76 5b 31 5d 29 20 3d 3d  type(argv[1]) ==
6590: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a   SQLITE_NULL ){.
65a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
65b0: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
65c0: 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ; .  }else{.    
65d0: 7a 69 31 20 3d 20 28 63 68 61 72 20 2a 29 73 71  zi1 = (char *)sq
65e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
65f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7a  (argv[0]);.    z
6600: 69 32 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  i2 = (char *)sql
6610: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6620: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 2f 2a  argv[1]);.    /*
6630: 20 0a 20 20 20 20 2a 2a 20 6d 61 79 62 65 20 49   .    ** maybe I
6640: 20 63 6f 75 6c 64 20 61 6c 6c 6f 63 61 74 65 20   could allocate 
6650: 6c 65 73 73 2c 20 62 75 74 20 74 68 61 74 20 77  less, but that w
6660: 6f 75 6c 64 20 69 6d 70 6c 79 20 32 20 70 61 73  ould imply 2 pas
6670: 73 65 73 2c 20 72 61 74 68 65 72 20 77 61 73 74  ses, rather wast
6680: 65 20 0a 20 20 20 20 2a 2a 20 28 70 6f 73 73 69  e .    ** (possi
6690: 62 6c 79 29 20 73 6f 6d 65 20 6d 65 6d 6f 72 79  bly) some memory
66a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 6f 20 3d  .    */.    zo =
66b0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
66c0: 73 74 72 6c 65 6e 28 7a 69 31 29 2b 31 29 3b 20  strlen(zi1)+1); 
66d0: 0a 20 20 20 20 69 66 20 28 21 7a 6f 29 7b 0a 20  .    if (!zo){. 
66e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
66f0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
6700: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
6710: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
6720: 20 20 7a 6f 74 20 3d 20 7a 6f 3b 0a 20 20 20 20    zot = zo;.    
6730: 7a 31 20 3d 20 7a 69 31 3b 0a 20 20 20 20 77 68  z1 = zi1;.    wh
6740: 69 6c 65 28 20 28 63 31 3d 73 71 6c 69 74 65 43  ile( (c1=sqliteC
6750: 68 61 72 56 61 6c 28 28 75 6e 73 69 67 6e 65 64  harVal((unsigned
6760: 20 63 68 61 72 20 2a 29 7a 31 29 29 21 3d 30 20   char *)z1))!=0 
6770: 29 7b 0a 20 20 20 20 20 20 7a 32 31 3d 7a 69 32  ){.      z21=zi2
6780: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
6790: 63 32 3d 73 71 6c 69 74 65 43 68 61 72 56 61 6c  c2=sqliteCharVal
67a0: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
67b0: 2a 29 7a 32 31 29 29 21 3d 30 20 26 26 20 63 32  *)z21))!=0 && c2
67c0: 21 3d 63 31 20 29 7b 0a 20 20 20 20 20 20 20 20  !=c1 ){.        
67d0: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
67e0: 32 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  21);.      }.   
67f0: 20 20 20 69 66 28 20 63 32 21 3d 30 29 7b 0a 20     if( c2!=0){. 
6800: 20 20 20 20 20 20 20 7a 32 32 3d 7a 32 31 3b 0a         z22=z21;.
6810: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65          sqliteNe
6820: 78 74 43 68 61 72 28 7a 32 32 29 3b 0a 20 20 20  xtChar(z22);.   
6830: 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a 6f 74       strncpy(zot
6840: 2c 20 7a 32 31 2c 20 7a 32 32 2d 7a 32 31 29 3b  , z21, z22-z21);
6850: 0a 20 20 20 20 20 20 20 20 7a 6f 74 2b 3d 7a 32  .        zot+=z2
6860: 32 2d 7a 32 31 3b 0a 20 20 20 20 20 20 7d 0a 20  2-z21;.      }. 
6870: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
6880: 68 61 72 28 7a 31 29 3b 0a 20 20 20 20 7d 0a 20  har(z1);.    }. 
6890: 20 20 20 2a 7a 6f 74 20 3d 20 27 5c 30 27 3b 0a     *zot = '\0';.
68a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
68b0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
68c0: 2c 20 7a 6f 2c 20 2d 31 2c 20 53 51 4c 49 54 45  , zo, -1, SQLITE
68d0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
68e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 6f   sqlite3_free(zo
68f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6900: 47 69 76 65 6e 20 61 20 73 74 72 69 6e 67 20 7a  Given a string z
6910: 31 2c 20 72 65 74 75 74 6e 73 20 74 68 65 20 28  1, retutns the (
6920: 30 20 62 61 73 65 64 29 20 69 6e 64 65 78 20 6f  0 based) index o
6930: 66 20 69 74 27 73 20 66 69 72 73 74 20 6f 63 63  f it's first occ
6940: 75 72 65 6e 63 65 0a 2a 2a 20 69 6e 20 7a 32 20  urence.** in z2 
6950: 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
6960: 73 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a  s characters..**
6970: 20 52 65 74 75 72 6e 73 20 2d 31 20 77 68 65 6e   Returns -1 when
6980: 20 74 68 65 72 65 20 69 73 6e 27 74 20 61 20 6d   there isn't a m
6990: 61 74 63 68 2e 0a 2a 2a 20 75 70 64 61 74 65 73  atch..** updates
69a0: 20 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74   p to point to t
69b0: 68 65 20 63 68 61 72 61 63 74 65 72 20 77 68 65  he character whe
69c0: 72 65 20 74 68 65 20 6d 61 74 63 68 20 6f 63 63  re the match occ
69d0: 75 72 65 64 2e 0a 2a 2a 20 54 68 69 73 20 69 73  ured..** This is
69e0: 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 66 75   an auxiliary fu
69f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
6a00: 63 20 69 6e 74 20 5f 73 75 62 73 74 72 28 63 6f  c int _substr(co
6a10: 6e 73 74 20 63 68 61 72 2a 20 7a 31 2c 20 63 6f  nst char* z1, co
6a20: 6e 73 74 20 63 68 61 72 2a 20 7a 32 2c 20 69 6e  nst char* z2, in
6a30: 74 20 73 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43  t s, CollSeq *pC
6a40: 6f 6c 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  oll, const char*
6a50: 2a 20 70 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20  * p){.  int c = 
6a60: 30 3b 0a 20 20 69 6e 74 20 72 56 61 6c 3d 2d 31  0;.  int rVal=-1
6a70: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  ;.  const char* 
6a80: 7a 74 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  zt1;.  const cha
6a90: 72 2a 20 7a 74 32 3b 0a 20 20 69 6e 74 20 63 31  r* zt2;.  int c1
6aa0: 2c 63 32 3b 0a 0a 20 20 69 66 28 20 27 5c 30 27  ,c2;..  if( '\0'
6ab0: 3d 3d 2a 7a 31 20 29 7b 0a 20 20 20 20 72 65 74  ==*z1 ){.    ret
6ac0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a 20  urn -1;.  }.  . 
6ad0: 20 77 68 69 6c 65 28 20 28 73 71 6c 69 74 65 43   while( (sqliteC
6ae0: 68 61 72 56 61 6c 28 28 75 6e 73 69 67 6e 65 64  harVal((unsigned
6af0: 20 63 68 61 72 20 2a 29 7a 32 29 20 21 3d 20 30   char *)z2) != 0
6b00: 29 20 26 26 20 28 63 2b 2b 29 3c 73 29 7b 0a 20  ) && (c++)<s){. 
6b10: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
6b20: 72 28 7a 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  r(z2);.  }.  .  
6b30: 63 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  c = 0;.  while( 
6b40: 28 73 71 6c 69 74 65 43 68 61 72 56 61 6c 28 28  (sqliteCharVal((
6b50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
6b60: 7a 32 29 29 20 21 3d 20 30 20 29 7b 0a 20 20 20  z2)) != 0 ){.   
6b70: 20 7a 74 31 20 3d 20 7a 31 3b 0a 20 20 20 20 7a   zt1 = z1;.    z
6b80: 74 32 20 3d 20 7a 32 3b 0a 0a 20 20 20 20 64 6f  t2 = z2;..    do
6b90: 7b 0a 20 20 20 20 20 20 63 31 20 3d 20 73 71 6c  {.      c1 = sql
6ba0: 69 74 65 43 68 61 72 56 61 6c 28 28 75 6e 73 69  iteCharVal((unsi
6bb0: 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 74 31 29  gned char *)zt1)
6bc0: 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c  ;.      c2 = sql
6bd0: 69 74 65 43 68 61 72 56 61 6c 28 28 75 6e 73 69  iteCharVal((unsi
6be0: 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 74 32 29  gned char *)zt2)
6bf0: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 43 6f 6c  ;.      if (pCol
6c00: 6c 2d 3e 65 6e 63 20 3d 3d 20 53 51 4c 49 54 45  l->enc == SQLITE
6c10: 5f 55 54 46 38 29 7b 0a 20 20 20 20 20 20 20 20  _UTF8){.        
6c20: 69 66 20 28 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  if (pColl->xCmp(
6c30: 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 31 2c  pColl->pUser, 1,
6c40: 20 7a 74 31 2c 20 31 2c 20 7a 74 32 29 20 3d 3d   zt1, 1, zt2) ==
6c50: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
6c60: 63 31 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20  c1 = c2;.       
6c70: 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20   }.        else 
6c80: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 31 20 3d  {.          c1 =
6c90: 20 28 63 31 29 20 3f 20 31 20 3a 20 30 3b 0a 20   (c1) ? 1 : 0;. 
6ca0: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 28 63           c2 = (c
6cb0: 32 29 20 3f 20 32 20 3a 20 30 3b 0a 20 20 20 20  2) ? 2 : 0;.    
6cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6cd0: 20 20 20 20 2f 2f 20 54 4f 44 4f 3a 20 20 4d 61      // TODO:  Ma
6ce0: 79 62 65 20 74 72 79 20 61 6e 64 20 63 6f 6e 76  ybe try and conv
6cf0: 65 72 74 20 74 68 65 20 63 68 61 72 73 20 74 6f  ert the chars to
6d00: 20 55 54 46 31 36 20 61 6e 64 20 72 75 6e 20 74   UTF16 and run t
6d10: 68 65 6d 20 74 68 72 75 20 74 68 65 20 63 6f 6c  hem thru the col
6d20: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3f  lating sequence?
6d30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78  .      sqliteNex
6d40: 74 43 68 61 72 28 7a 74 31 29 3b 0a 20 20 20 20  tChar(zt1);.    
6d50: 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72    sqliteNextChar
6d60: 28 7a 74 32 29 3b 0a 20 20 20 20 7d 77 68 69 6c  (zt2);.    }whil
6d70: 65 28 20 63 31 20 3d 3d 20 63 32 20 26 26 20 63  e( c1 == c2 && c
6d80: 31 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20  1 != 0 && c2 != 
6d90: 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 63 31  0 );..    if( c1
6da0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 72   == 0 ){.      r
6db0: 56 61 6c 20 3d 20 63 3b 0a 20 20 20 20 20 20 62  Val = c;.      b
6dc0: 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20 20  reak; .    }.   
6dd0: 20 0a 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74   .    sqliteNext
6de0: 43 68 61 72 28 7a 32 29 3b 0a 20 20 20 20 2b 2b  Char(z2);.    ++
6df0: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 70 29 7b 0a  c;.  }.  if(p){.
6e00: 20 20 20 20 2a 70 3d 7a 32 3b 0a 20 20 7d 0a 20      *p=z2;.  }. 
6e10: 20 72 65 74 75 72 6e 20 72 56 61 6c 20 3e 3d 30   return rVal >=0
6e20: 20 3f 20 72 56 61 6c 2b 73 20 3a 20 72 56 61 6c   ? rVal+s : rVal
6e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67 69 76 65 6e  ;.}../*.** given
6e40: 20 32 20 69 6e 70 75 74 20 73 74 72 69 6e 67 73   2 input strings
6e50: 20 28 73 31 2c 73 32 29 20 61 6e 64 20 61 6e 20   (s1,s2) and an 
6e60: 69 6e 74 65 67 65 72 20 28 6e 29 20 73 65 61 72  integer (n) sear
6e70: 63 68 65 73 20 66 72 6f 6d 20 74 68 65 20 6e 74  ches from the nt
6e80: 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 66  h character.** f
6e90: 6f 72 20 74 68 65 20 73 74 72 69 6e 67 20 73 31  or the string s1
6ea0: 2e 20 52 65 74 75 72 6e 73 20 74 68 65 20 70 6f  . Returns the po
6eb0: 73 69 74 69 6f 6e 20 77 68 65 72 65 20 74 68 65  sition where the
6ec0: 20 6d 61 74 63 68 20 6f 63 63 75 72 65 64 2e 0a   match occured..
6ed0: 2a 2a 20 43 68 61 72 61 63 74 65 72 73 20 61 72  ** Characters ar
6ee0: 65 20 63 6f 75 6e 74 65 64 20 66 72 6f 6d 20 31  e counted from 1
6ef0: 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e  ..** 0 is return
6f00: 65 64 20 77 68 65 6e 20 6e 6f 20 6d 61 74 63 68  ed when no match
6f10: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 0a 73 74 61   occurs..*/..sta
6f20: 74 69 63 20 76 6f 69 64 20 63 68 61 72 69 6e 64  tic void charind
6f30: 65 78 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  exFunc(sqlite3_c
6f40: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6f50: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
6f60: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
6f70: 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 31  {.  const u8 *z1
6f80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 31  ;          /* s1
6f90: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 75 38 20   string */.  u8 
6fa0: 2a 7a 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  *z2;            
6fb0: 20 20 20 20 2f 2a 20 73 32 20 73 74 72 69 6e 67      /* s2 string
6fc0: 20 2a 2f 0a 20 20 69 6e 74 20 73 3d 30 3b 0a 20   */.  int s=0;. 
6fd0: 20 69 6e 74 20 72 56 61 6c 3d 30 3b 0a 20 20 43   int rVal=0;.  C
6fe0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
6ff0: 63 6f 6e 74 65 78 74 2d 3e 70 43 6f 6c 6c 3b 0a  context->pColl;.
7000: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7010: 3d 33 20 7c 7c 61 72 67 63 3d 3d 32 29 3b 0a 0a  =3 ||argc==2);..
7020: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
7030: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
7040: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 7c  _type(argv[0]) |
7050: 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  | SQLITE_NULL==s
7060: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
7070: 65 28 61 72 67 76 5b 31 5d 29 29 7b 0a 20 20 20  e(argv[1])){.   
7080: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7090: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
70a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
70b0: 20 20 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76    z1 = sqlite3_v
70c0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
70d0: 5d 29 3b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20  ]);.  if( z1==0 
70e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 32 20 3d  ) return;.  z2 =
70f0: 20 28 75 38 2a 29 20 73 71 6c 69 74 65 33 5f 76   (u8*) sqlite3_v
7100: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
7110: 5d 29 3b 0a 20 20 69 66 28 61 72 67 63 3d 3d 33  ]);.  if(argc==3
7120: 29 7b 0a 20 20 20 20 73 20 3d 20 73 71 6c 69 74  ){.    s = sqlit
7130: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
7140: 76 5b 32 5d 29 2d 31 3b 0a 20 20 20 20 69 66 28  v[2])-1;.    if(
7150: 73 3c 30 29 7b 0a 20 20 20 20 20 20 73 3d 30 3b  s<0){.      s=0;
7160: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7170: 20 20 20 20 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a      s = 0;.  }..
7180: 20 20 72 56 61 6c 20 3d 20 5f 73 75 62 73 74 72    rVal = _substr
7190: 28 28 63 68 61 72 20 2a 29 7a 31 2c 28 63 68 61  ((char *)z1,(cha
71a0: 72 20 2a 29 7a 32 2c 73 2c 70 43 6f 6c 6c 2c 4e  r *)z2,s,pColl,N
71b0: 55 4c 4c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ULL);.  sqlite3_
71c0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
71d0: 78 74 2c 20 72 56 61 6c 2b 31 29 3b 0a 7d 0a 0a  xt, rVal+1);.}..
71e0: 2f 2a 0a 2a 2a 20 67 69 76 65 6e 20 61 20 73 74  /*.** given a st
71f0: 72 69 6e 67 20 28 73 29 20 61 6e 64 20 61 6e 20  ring (s) and an 
7200: 69 6e 74 65 67 65 72 20 28 6e 29 20 72 65 74 75  integer (n) retu
7210: 72 6e 73 20 74 68 65 20 6e 20 6c 65 66 74 6d 6f  rns the n leftmo
7220: 73 74 20 28 55 54 46 2d 38 29 20 63 68 61 72 61  st (UTF-8) chara
7230: 63 74 65 72 73 0a 2a 2a 20 69 66 20 74 68 65 20  cters.** if the 
7240: 73 74 72 69 6e 67 20 68 61 73 20 61 20 6c 65 6e  string has a len
7250: 67 74 68 3c 3d 6e 20 6f 72 20 69 73 20 4e 55 4c  gth<=n or is NUL
7260: 4c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  L this function 
7270: 69 73 20 4e 4f 50 0a 2a 2f 0a 73 74 61 74 69 63  is NOP.*/.static
7280: 20 76 6f 69 64 20 6c 65 66 74 46 75 6e 63 28 73   void leftFunc(s
7290: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
72a0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
72b0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
72c0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20   **argv){.  int 
72d0: 63 3d 30 3b 0a 20 20 69 6e 74 20 63 63 3d 30 3b  c=0;.  int cc=0;
72e0: 0a 20 20 69 6e 74 20 6c 3d 30 3b 0a 20 20 63 6f  .  int l=0;.  co
72f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
7300: 72 20 2a 7a 3b 20 20 20 20 20 20 20 2f 2a 20 69  r *z;       /* i
7310: 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  nput string */. 
7320: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7330: 63 68 61 72 20 2a 7a 74 3b 0a 20 20 75 6e 73 69  char *zt;.  unsi
7340: 67 6e 65 64 20 63 68 61 72 20 2a 72 7a 3b 20 20  gned char *rz;  
7350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
7360: 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20  put string */.. 
7370: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32   assert( argc==2
7380: 29 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  );..  if( SQLITE
7390: 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76  _NULL==sqlite3_v
73a0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
73b0: 5d 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c  ]) || SQLITE_NUL
73c0: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
73d0: 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 29 7b  _type(argv[1])){
73e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
73f0: 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74  ult_null(context
7400: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7410: 20 7d 0a 0a 20 20 7a 20 20 3d 20 73 71 6c 69 74   }..  z  = sqlit
7420: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7430: 67 76 5b 30 5d 29 3b 0a 20 20 6c 20 20 3d 20 73  gv[0]);.  l  = s
7440: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
7450: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7a 74 20  (argv[1]);.  zt 
7460: 3d 20 7a 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73  = z;..  while( s
7470: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 74 29  qliteCharVal(zt)
7480: 20 26 26 20 63 2b 2b 3c 6c 29 0a 20 20 20 20 73   && c++<l).    s
7490: 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 74  qliteNextChar(zt
74a0: 29 3b 0a 0a 20 20 63 63 3d 7a 74 2d 7a 3b 0a 0a  );..  cc=zt-z;..
74b0: 20 20 72 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d    rz = sqlite3_m
74c0: 61 6c 6c 6f 63 28 7a 74 2d 7a 2b 31 29 3b 0a 20  alloc(zt-z+1);. 
74d0: 20 69 66 20 28 21 72 7a 29 7b 0a 20 20 20 20 73   if (!rz){.    s
74e0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
74f0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
7500: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
7510: 20 20 7d 0a 20 20 73 74 72 6e 63 70 79 28 28 63    }.  strncpy((c
7520: 68 61 72 2a 29 20 72 7a 2c 20 28 63 68 61 72 2a  har*) rz, (char*
7530: 29 20 7a 2c 20 7a 74 2d 7a 29 3b 0a 20 20 2a 28  ) z, zt-z);.  *(
7540: 72 7a 2b 63 63 29 20 3d 20 27 5c 30 27 3b 0a 20  rz+cc) = '\0';. 
7550: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7560: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
7570: 68 61 72 2a 29 72 7a 2c 20 2d 31 2c 20 53 51 4c  har*)rz, -1, SQL
7580: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 20  ITE_TRANSIENT); 
7590: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
75a0: 72 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67 69  rz);.}../*.** gi
75b0: 76 65 6e 20 61 20 73 74 72 69 6e 67 20 28 73 29  ven a string (s)
75c0: 20 61 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20   and an integer 
75d0: 28 6e 29 20 72 65 74 75 72 6e 73 20 74 68 65 20  (n) returns the 
75e0: 6e 20 72 69 67 68 74 6d 6f 73 74 20 28 55 54 46  n rightmost (UTF
75f0: 2d 38 29 20 63 68 61 72 61 63 74 65 72 73 0a 2a  -8) characters.*
7600: 2a 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20  * if the string 
7610: 68 61 73 20 61 20 6c 65 6e 67 74 68 3c 3d 6e 20  has a length<=n 
7620: 6f 72 20 69 73 20 4e 55 4c 4c 20 74 68 69 73 20  or is NULL this 
7630: 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 4f 50 0a  function is NOP.
7640: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
7650: 69 67 68 74 46 75 6e 63 28 73 71 6c 69 74 65 33  ightFunc(sqlite3
7660: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7670: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
7680: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
7690: 76 29 7b 0a 20 20 69 6e 74 20 6c 3d 30 3b 0a 20  v){.  int l=0;. 
76a0: 20 69 6e 74 20 63 3d 30 3b 0a 20 20 69 6e 74 20   int c=0;.  int 
76b0: 63 63 3d 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68  cc=0;.  const ch
76c0: 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 63  ar *z;.  const c
76d0: 68 61 72 20 2a 7a 74 3b 0a 20 20 63 6f 6e 73 74  har *zt;.  const
76e0: 20 63 68 61 72 20 2a 7a 65 3b 0a 20 20 63 68 61   char *ze;.  cha
76f0: 72 20 2a 72 7a 3b 0a 0a 20 20 61 73 73 65 72 74  r *rz;..  assert
7700: 28 20 61 72 67 63 3d 3d 32 29 3b 0a 0a 20 20 69  ( argc==2);..  i
7710: 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 3d  f( SQLITE_NULL =
7720: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
7730: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 7c 7c  type(argv[0]) ||
7740: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 3d 3d 20   SQLITE_NULL == 
7750: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
7760: 70 65 28 61 72 67 76 5b 31 5d 29 29 7b 0a 20 20  pe(argv[1])){.  
7770: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7780: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a  _null(context);.
7790: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
77a0: 0a 20 20 7a 20 20 3d 20 28 63 68 61 72 20 2a 29  .  z  = (char *)
77b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
77c0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6c  xt(argv[0]);.  l
77d0: 20 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75    = sqlite3_valu
77e0: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a  e_int(argv[1]);.
77f0: 20 20 7a 74 20 3d 20 7a 3b 0a 0a 20 20 77 68 69    zt = z;..  whi
7800: 6c 65 28 20 73 71 6c 69 74 65 43 68 61 72 56 61  le( sqliteCharVa
7810: 6c 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  l((unsigned char
7820: 20 2a 29 7a 74 29 21 3d 30 29 7b 0a 20 20 20 20   *)zt)!=0){.    
7830: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
7840: 74 29 3b 0a 20 20 20 20 2b 2b 63 3b 0a 20 20 7d  t);.    ++c;.  }
7850: 0a 0a 20 20 7a 65 20 3d 20 7a 74 3b 0a 20 20 7a  ..  ze = zt;.  z
7860: 74 20 3d 20 7a 3b 0a 0a 20 20 63 63 3d 63 2d 6c  t = z;..  cc=c-l
7870: 3b 0a 20 20 69 66 28 63 63 3c 30 29 0a 20 20 20  ;.  if(cc<0).   
7880: 20 63 63 3d 30 3b 0a 20 20 0a 20 20 77 68 69 6c   cc=0;.  .  whil
7890: 65 28 20 63 63 2d 2d 20 3e 20 30 20 29 7b 0a 20  e( cc-- > 0 ){. 
78a0: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
78b0: 72 28 7a 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 7a  r(zt);.  }..  rz
78c0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
78d0: 63 28 7a 65 2d 7a 74 2b 31 29 3b 0a 20 20 69 66  c(ze-zt+1);.  if
78e0: 20 28 21 72 7a 29 7b 0a 20 20 20 20 73 71 6c 69   (!rz){.    sqli
78f0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7900: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
7910: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7920: 0a 20 20 73 74 72 63 70 79 28 28 63 68 61 72 2a  .  strcpy((char*
7930: 29 20 72 7a 2c 20 28 63 68 61 72 2a 29 20 28 7a  ) rz, (char*) (z
7940: 74 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  t));.  sqlite3_r
7950: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
7960: 78 74 2c 20 28 63 68 61 72 2a 29 72 7a 2c 20 2d  xt, (char*)rz, -
7970: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
7980: 45 4e 54 29 3b 20 0a 20 20 73 71 6c 69 74 65 33  ENT); .  sqlite3
7990: 5f 66 72 65 65 28 72 7a 29 3b 0a 7d 0a 0a 23 69  _free(rz);.}..#i
79a0: 66 6e 64 65 66 20 48 41 56 45 5f 54 52 49 4d 0a  fndef HAVE_TRIM.
79b0: 2f 2a 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  /*.** removes th
79c0: 65 20 77 68 69 74 65 73 70 61 63 65 73 20 61 74  e whitespaces at
79d0: 20 74 68 65 20 62 65 67 69 6e 69 6e 67 20 6f 66   the begining of
79e0: 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 63 6f   a string..*/.co
79f0: 6e 73 74 20 63 68 61 72 2a 20 6c 74 72 69 6d 28  nst char* ltrim(
7a00: 63 6f 6e 73 74 20 63 68 61 72 2a 20 73 29 7b 0a  const char* s){.
7a10: 20 20 77 68 69 6c 65 28 20 2a 73 3d 3d 27 20 27    while( *s==' '
7a20: 20 29 0a 20 20 20 20 2b 2b 73 3b 0a 20 20 72 65   ).    ++s;.  re
7a30: 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn s;.}../*.**
7a40: 20 72 65 6d 6f 76 65 73 20 74 68 65 20 77 68 69   removes the whi
7a50: 74 65 73 70 61 63 65 73 20 61 74 20 74 68 65 20  tespaces at the 
7a60: 65 6e 64 20 6f 66 20 61 20 73 74 72 69 6e 67 2e  end of a string.
7a70: 0a 2a 2a 20 21 6d 75 74 61 74 65 73 20 74 68 65  .** !mutates the
7a80: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 21 0a 2a   input string!.*
7a90: 2f 0a 76 6f 69 64 20 72 74 72 69 6d 28 63 68 61  /.void rtrim(cha
7aa0: 72 2a 20 73 29 7b 0a 20 20 63 68 61 72 2a 20 73  r* s){.  char* s
7ab0: 73 20 3d 20 73 2b 73 74 72 6c 65 6e 28 73 29 2d  s = s+strlen(s)-
7ac0: 31 3b 0a 20 20 77 68 69 6c 65 28 20 73 73 3e 3d  1;.  while( ss>=
7ad0: 73 20 26 26 20 2a 73 73 3d 3d 27 20 27 20 29 0a  s && *ss==' ' ).
7ae0: 20 20 20 20 2d 2d 73 73 3b 0a 20 20 2a 28 73 73      --ss;.  *(ss
7af0: 2b 31 29 3d 27 5c 30 27 3b 0a 7d 0a 0a 2f 2a 0a  +1)='\0';.}../*.
7b00: 2a 2a 20 20 52 65 6d 6f 76 65 73 20 74 68 65 20  **  Removes the 
7b10: 77 68 69 74 65 73 70 61 63 65 20 61 74 20 74 68  whitespace at th
7b20: 65 20 62 65 67 69 6e 69 6e 67 20 6f 66 20 61 20  e begining of a 
7b30: 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 61 74 69 63  string.*/.static
7b40: 20 76 6f 69 64 20 6c 74 72 69 6d 46 75 6e 63 28   void ltrimFunc(
7b50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7b60: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
7b70: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
7b80: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
7b90: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  st char *z;..  a
7ba0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 29 3b  ssert( argc==1);
7bb0: 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e  ..  if( SQLITE_N
7bc0: 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL==sqlite3_val
7bd0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
7be0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7bf0: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
7c00: 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ext);.    return
7c10: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
7c20: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
7c30: 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74  rgv[0]);.  sqlit
7c40: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
7c50: 6f 6e 74 65 78 74 2c 20 6c 74 72 69 6d 28 7a 29  ontext, ltrim(z)
7c60: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
7c70: 4e 53 49 45 4e 54 29 3b 20 0a 7d 0a 0a 2f 2a 0a  NSIENT); .}../*.
7c80: 2a 2a 20 20 52 65 6d 6f 76 65 73 20 74 68 65 20  **  Removes the 
7c90: 77 68 69 74 65 73 70 61 63 65 20 61 74 20 74 68  whitespace at th
7ca0: 65 20 65 6e 64 20 6f 66 20 61 20 73 74 72 69 6e  e end of a strin
7cb0: 67 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  g.*/.static void
7cc0: 20 72 74 72 69 6d 46 75 6e 63 28 73 71 6c 69 74   rtrimFunc(sqlit
7cd0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7ce0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
7cf0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7d00: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  rgv){.  const ch
7d10: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 72  ar *z;.  char *r
7d20: 7a 3b 0a 20 20 2f 2a 20 74 72 79 20 6e 6f 74 20  z;.  /* try not 
7d30: 74 6f 20 63 68 61 6e 67 65 20 64 61 74 61 20 69  to change data i
7d40: 6e 20 61 72 67 76 20 2a 2f 0a 0a 20 20 61 73 73  n argv */..  ass
7d50: 65 72 74 28 20 61 72 67 63 3d 3d 31 29 3b 0a 0a  ert( argc==1);..
7d60: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
7d70: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
7d80: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29  _type(argv[0]) )
7d90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
7da0: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
7db0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
7dc0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
7dd0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7de0: 76 5b 30 5d 29 3b 0a 20 20 72 7a 20 3d 20 73 71  v[0]);.  rz = sq
7df0: 6c 69 74 65 33 53 74 72 44 75 70 28 7a 29 3b 0a  lite3StrDup(z);.
7e00: 20 20 72 74 72 69 6d 28 72 7a 29 3b 0a 20 20 73    rtrim(rz);.  s
7e10: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7e20: 78 74 28 63 6f 6e 74 65 78 74 2c 20 72 7a 2c 20  xt(context, rz, 
7e30: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
7e40: 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
7e50: 5f 66 72 65 65 28 72 7a 29 3b 0a 7d 0a 0a 2f 2a  _free(rz);.}../*
7e60: 0a 2a 2a 20 20 52 65 6d 6f 76 65 73 20 74 68 65  .**  Removes the
7e70: 20 77 68 69 74 65 73 70 61 63 65 20 61 74 20 74   whitespace at t
7e80: 68 65 20 62 65 67 69 6e 69 6e 67 20 61 6e 64 20  he begining and 
7e90: 65 6e 64 20 6f 66 20 61 20 73 74 72 69 6e 67 0a  end of a string.
7ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
7eb0: 72 69 6d 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  rimFunc(sqlite3_
7ec0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
7ed0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
7ee0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
7ef0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
7f00: 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 72 7a 3b 0a  *z;.  char *rz;.
7f10: 20 20 2f 2a 20 74 72 79 20 6e 6f 74 20 74 6f 20    /* try not to 
7f20: 63 68 61 6e 67 65 20 64 61 74 61 20 69 6e 20 61  change data in a
7f30: 72 67 76 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rgv */..  assert
7f40: 28 20 61 72 67 63 3d 3d 31 29 3b 0a 0a 20 20 69  ( argc==1);..  i
7f50: 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d  f( SQLITE_NULL==
7f60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
7f70: 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20  pe(argv[0]) ){. 
7f80: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7f90: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
7fa0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7fb0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  z = sqlite3_v
7fc0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
7fd0: 5d 29 3b 0a 20 20 72 7a 20 3d 20 73 71 6c 69 74  ]);.  rz = sqlit
7fe0: 65 33 53 74 72 44 75 70 28 7a 29 3b 0a 20 20 72  e3StrDup(z);.  r
7ff0: 74 72 69 6d 28 72 7a 29 3b 0a 20 20 73 71 6c 69  trim(rz);.  sqli
8000: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
8010: 63 6f 6e 74 65 78 74 2c 20 6c 74 72 69 6d 28 72  context, ltrim(r
8020: 7a 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  z), -1, SQLITE_T
8030: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
8040: 69 74 65 33 5f 66 72 65 65 28 72 7a 29 3b 0a 7d  ite3_free(rz);.}
8050: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 67  .#endif../*.** g
8060: 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  iven a pointer t
8070: 6f 20 61 20 73 74 72 69 6e 67 20 73 31 2c 20 74  o a string s1, t
8080: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 61  he length of tha
8090: 74 20 73 74 72 69 6e 67 20 28 6c 31 29 2c 20 61  t string (l1), a
80a0: 20 6e 65 77 20 73 74 72 69 6e 67 20 28 73 32 29   new string (s2)
80b0: 0a 2a 2a 20 61 6e 64 20 69 74 27 73 20 6c 65 6e  .** and it's len
80c0: 67 74 68 20 28 6c 32 29 20 61 70 70 65 6e 64 73  gth (l2) appends
80d0: 20 73 32 20 74 6f 20 73 31 2e 0a 2a 2a 20 41 6c   s2 to s1..** Al
80e0: 6c 20 6c 65 6e 67 74 68 73 20 69 6e 20 62 79 74  l lengths in byt
80f0: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6a  es..** This is j
8100: 75 73 74 20 61 6e 20 61 75 78 69 6c 69 61 72 79  ust an auxiliary
8110: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 2f 2f 20   function.*/.// 
8120: 73 74 61 74 69 63 20 76 6f 69 64 20 5f 61 70 70  static void _app
8130: 65 6e 64 28 63 68 61 72 20 2a 2a 73 31 2c 20 69  end(char **s1, i
8140: 6e 74 20 6c 31 2c 20 63 6f 6e 73 74 20 63 68 61  nt l1, const cha
8150: 72 20 2a 73 32 2c 20 69 6e 74 20 6c 32 29 7b 0a  r *s2, int l2){.
8160: 2f 2f 20 20 20 2a 73 31 20 3d 20 72 65 61 6c 6c  //   *s1 = reall
8170: 6f 63 28 2a 73 31 2c 20 28 6c 31 2b 6c 32 2b 31  oc(*s1, (l1+l2+1
8180: 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 29 29 3b  )*sizeof(char));
8190: 0a 2f 2f 20 20 20 73 74 72 6e 63 70 79 28 28 2a  .//   strncpy((*
81a0: 73 31 29 2b 6c 31 2c 20 73 32 2c 20 6c 32 29 3b  s1)+l1, s2, l2);
81b0: 0a 2f 2f 20 20 20 2a 28 2a 28 73 31 29 2b 6c 31  .//   *(*(s1)+l1
81c0: 2b 6c 32 29 20 3d 20 27 5c 30 27 3b 0a 2f 2f 20  +l2) = '\0';.// 
81d0: 7d 0a 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f  }..#ifndef HAVE_
81e0: 54 52 49 4d 0a 0a 2f 2a 0a 2a 2a 20 67 69 76 65  TRIM../*.** give
81f0: 6e 20 73 74 72 69 6e 67 73 20 73 2c 20 73 31 20  n strings s, s1 
8200: 61 6e 64 20 73 32 20 72 65 70 6c 61 63 65 73 20  and s2 replaces 
8210: 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 73  occurrences of s
8220: 31 20 69 6e 20 73 20 62 79 20 73 32 0a 2a 2f 0a  1 in s by s2.*/.
8230: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 70 6c  static void repl
8240: 61 63 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  aceFunc(sqlite3_
8250: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
8260: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
8270: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8280: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
8290: 2a 7a 31 3b 20 20 20 20 20 2f 2a 20 73 74 72 69  *z1;     /* stri
82a0: 6e 67 20 73 20 28 66 69 72 73 74 20 70 61 72 61  ng s (first para
82b0: 6d 65 74 65 72 29 20 2a 2f 0a 20 20 63 6f 6e 73  meter) */.  cons
82c0: 74 20 63 68 61 72 20 2a 7a 32 3b 20 20 20 20 20  t char *z2;     
82d0: 2f 2a 20 73 74 72 69 6e 67 20 73 31 20 28 73 65  /* string s1 (se
82e0: 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 29 20  cond parameter) 
82f0: 73 74 72 69 6e 67 20 74 6f 20 6c 6f 6f 6b 20 66  string to look f
8300: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
8310: 61 72 20 2a 7a 33 3b 20 20 20 20 20 2f 2a 20 73  ar *z3;     /* s
8320: 74 72 69 6e 67 20 73 32 20 28 74 68 69 72 64 20  tring s2 (third 
8330: 70 61 72 61 6d 65 74 65 72 29 20 73 74 72 69 6e  parameter) strin
8340: 67 20 74 6f 20 72 65 70 6c 61 63 65 20 6f 63 63  g to replace occ
8350: 75 72 72 65 6e 63 65 73 20 6f 66 20 73 31 20 77  urrences of s1 w
8360: 69 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6c 7a 31  ith */.  int lz1
8370: 3b 0a 20 20 69 6e 74 20 6c 7a 32 3b 0a 20 20 69  ;.  int lz2;.  i
8380: 6e 74 20 6c 7a 33 3b 0a 20 20 69 6e 74 20 6c 7a  nt lz3;.  int lz
8390: 6f 3d 30 3b 0a 20 20 63 68 61 72 20 2a 7a 6f 3d  o=0;.  char *zo=
83a0: 30 3b 0a 20 20 69 6e 74 20 72 65 74 3d 30 3b 0a  0;.  int ret=0;.
83b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 74    const char *zt
83c0: 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1;.  const char 
83d0: 2a 7a 74 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  *zt2;..  assert(
83e0: 20 33 3d 3d 61 72 67 63 20 29 3b 0a 0a 20 20 69   3==argc );..  i
83f0: 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d  f( SQLITE_NULL==
8400: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8410: 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20  pe(argv[0]) ){. 
8420: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8430: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
8440: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8450: 0a 0a 20 20 7a 31 20 3d 20 73 71 6c 69 74 65 33  ..  z1 = sqlite3
8460: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8470: 5b 30 5d 29 3b 0a 20 20 7a 32 20 3d 20 73 71 6c  [0]);.  z2 = sql
8480: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8490: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7a 33 20 3d  argv[1]);.  z3 =
84a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
84b0: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
84c0: 2f 2a 20 68 61 6e 64 6c 65 20 70 6f 73 73 69 62  /* handle possib
84d0: 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 73 20 2a  le null values *
84e0: 2f 0a 20 20 69 66 28 20 30 3d 3d 7a 32 20 29 7b  /.  if( 0==z2 ){
84f0: 0a 20 20 20 20 7a 32 3d 22 22 3b 0a 20 20 7d 0a  .    z2="";.  }.
8500: 20 20 69 66 28 20 30 3d 3d 7a 33 20 29 7b 0a 20    if( 0==z3 ){. 
8510: 20 20 20 7a 33 3d 22 22 3b 0a 20 20 7d 0a 0a 20     z3="";.  }.. 
8520: 20 6c 7a 31 20 3d 20 73 74 72 6c 65 6e 28 7a 31   lz1 = strlen(z1
8530: 29 3b 0a 20 20 6c 7a 32 20 3d 20 73 74 72 6c 65  );.  lz2 = strle
8540: 6e 28 7a 32 29 3b 0a 20 20 6c 7a 33 20 3d 20 73  n(z2);.  lz3 = s
8550: 74 72 6c 65 6e 28 7a 33 29 3b 0a 0a 23 69 66 20  trlen(z3);..#if 
8560: 30 0a 20 20 2f 2a 20 73 70 65 63 69 61 6c 20 63  0.  /* special c
8570: 61 73 65 20 77 68 65 6e 20 7a 32 20 69 73 20 65  ase when z2 is e
8580: 6d 70 74 79 20 28 6f 72 20 6e 75 6c 6c 29 20 6e  mpty (or null) n
8590: 6f 74 68 69 6e 67 20 77 69 6c 6c 20 62 65 20 63  othing will be c
85a0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 69 66 28 20  hanged */.  if( 
85b0: 30 3d 3d 6c 7a 32 20 29 7b 0a 20 20 20 20 73 71  0==lz2 ){.    sq
85c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
85d0: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 2d  t(context, z1, -
85e0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
85f0: 45 4e 54 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ENT);.    return
8600: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
8610: 7a 74 31 3d 7a 31 3b 0a 20 20 7a 74 32 3d 7a 31  zt1=z1;.  zt2=z1
8620: 3b 0a 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20  ;..  while(1){. 
8630: 20 20 20 72 65 74 3d 5f 73 75 62 73 74 72 28 7a     ret=_substr(z
8640: 32 2c 7a 74 31 20 2c 20 30 2c 20 26 7a 74 32 29  2,zt1 , 0, &zt2)
8650: 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 74 3c 30  ;..    if( ret<0
8660: 20 29 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   ).      break;.
8670: 0a 20 20 20 20 5f 61 70 70 65 6e 64 28 26 7a 6f  .    _append(&zo
8680: 2c 20 6c 7a 6f 2c 20 7a 74 31 2c 20 7a 74 32 2d  , lzo, zt1, zt2-
8690: 7a 74 31 29 3b 0a 20 20 20 20 6c 7a 6f 2b 3d 7a  zt1);.    lzo+=z
86a0: 74 32 2d 7a 74 31 3b 0a 20 20 20 20 5f 61 70 70  t2-zt1;.    _app
86b0: 65 6e 64 28 26 7a 6f 2c 20 6c 7a 6f 2c 20 7a 33  end(&zo, lzo, z3
86c0: 2c 20 6c 7a 33 29 3b 0a 20 20 20 20 6c 7a 6f 2b  , lz3);.    lzo+
86d0: 3d 6c 7a 33 3b 0a 0a 20 20 20 20 7a 74 31 3d 7a  =lz3;..    zt1=z
86e0: 74 32 2b 6c 7a 32 3b 0a 20 20 7d 0a 20 20 5f 61  t2+lz2;.  }.  _a
86f0: 70 70 65 6e 64 28 26 7a 6f 2c 20 6c 7a 6f 2c 20  ppend(&zo, lzo, 
8700: 7a 74 31 2c 20 6c 7a 31 2d 28 7a 74 31 2d 7a 31  zt1, lz1-(zt1-z1
8710: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ));.  sqlite3_re
8720: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
8730: 74 2c 20 7a 6f 2c 20 2d 31 2c 20 53 51 4c 49 54  t, zo, -1, SQLIT
8740: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8750: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 6f 29  sqlite3_free(zo)
8760: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
8770: 2a 20 67 69 76 65 6e 20 61 20 73 74 72 69 6e 67  * given a string
8780: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d   returns the sam
8790: 65 20 73 74 72 69 6e 67 20 62 75 74 20 77 69 74  e string but wit
87a0: 68 20 74 68 65 20 63 68 61 72 61 63 74 65 72 73  h the characters
87b0: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
87c0: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  r.*/.static void
87d0: 20 72 65 76 65 72 73 65 46 75 6e 63 28 73 71 6c   reverseFunc(sql
87e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
87f0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
8800: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8810: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
8820: 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74  char *z;.  const
8830: 20 63 68 61 72 20 2a 7a 74 3b 0a 20 20 63 68 61   char *zt;.  cha
8840: 72 20 2a 72 7a 3b 0a 20 20 63 68 61 72 20 2a 72  r *rz;.  char *r
8850: 7a 74 3b 0a 20 20 69 6e 74 20 6c 20 3d 20 30 3b  zt;.  int l = 0;
8860: 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 0a 20  .  int i = 0;.. 
8870: 20 61 73 73 65 72 74 28 20 31 3d 3d 61 72 67 63   assert( 1==argc
8880: 20 29 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54   );..  if( SQLIT
8890: 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f  E_NULL==sqlite3_
88a0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
88b0: 30 5d 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0]) ){.    sqlit
88c0: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
88d0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74  ontext);.    ret
88e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28  urn;.  }.  z = (
88f0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
8900: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
8910: 5d 29 3b 0a 20 20 6c 20 3d 20 73 74 72 6c 65 6e  ]);.  l = strlen
8920: 28 7a 29 3b 0a 20 20 72 7a 20 3d 20 73 71 6c 69  (z);.  rz = sqli
8930: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 2b 31 29 3b  te3_malloc(l+1);
8940: 0a 20 20 69 66 20 28 21 72 7a 29 7b 0a 20 20 20  .  if (!rz){.   
8950: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8960: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
8970: 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ext);.    return
8980: 3b 0a 20 20 7d 0a 20 20 72 7a 74 20 3d 20 72 7a  ;.  }.  rzt = rz
8990: 2b 6c 3b 0a 20 20 2a 28 72 7a 74 2d 2d 29 20 3d  +l;.  *(rzt--) =
89a0: 20 27 5c 30 27 3b 0a 0a 20 20 7a 74 3d 7a 3b 0a   '\0';..  zt=z;.
89b0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 43    while( sqliteC
89c0: 68 61 72 56 61 6c 28 28 75 6e 73 69 67 6e 65 64  harVal((unsigned
89d0: 20 63 68 61 72 20 2a 29 7a 74 29 21 3d 30 20 29   char *)zt)!=0 )
89e0: 7b 0a 20 20 20 20 7a 3d 7a 74 3b 0a 20 20 20 20  {.    z=zt;.    
89f0: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
8a00: 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  t);.    for(i=1;
8a10: 20 7a 74 2d 69 3e 3d 7a 3b 20 2b 2b 69 29 7b 0a   zt-i>=z; ++i){.
8a20: 20 20 20 20 20 20 2a 28 72 7a 74 2d 2d 29 3d 2a        *(rzt--)=*
8a30: 28 7a 74 2d 69 29 3b 0a 20 20 20 20 7d 0a 20 20  (zt-i);.    }.  
8a40: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  }..  sqlite3_res
8a50: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
8a60: 2c 20 72 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  , rz, -1, SQLITE
8a70: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
8a80: 71 6c 69 74 65 33 5f 66 72 65 65 28 72 7a 29 3b  qlite3_free(rz);
8a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
8aa0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
8ab0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
8ac0: 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74 65   holds the conte
8ad0: 78 74 20 6f 66 20 61 0a 2a 2a 20 73 74 64 65 76  xt of a.** stdev
8ae0: 28 29 20 6f 72 20 76 61 72 69 61 6e 63 65 28 29  () or variance()
8af0: 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75   aggregate compu
8b00: 74 61 74 69 6f 6e 2e 0a 2a 2a 20 69 6d 70 6c 65  tation..** imple
8b10: 6d 65 6e 74 61 69 6f 6e 20 6f 66 20 68 74 74 70  mentaion of http
8b20: 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69 61 2e  ://en.wikipedia.
8b30: 6f 72 67 2f 77 69 6b 69 2f 41 6c 67 6f 72 69 74  org/wiki/Algorit
8b40: 68 6d 73 5f 66 6f 72 5f 63 61 6c 63 75 6c 61 74  hms_for_calculat
8b50: 69 6e 67 5f 76 61 72 69 61 6e 63 65 23 41 6c 67  ing_variance#Alg
8b60: 6f 72 69 74 68 6d 5f 49 49 0a 2a 2a 20 6c 65 73  orithm_II.** les
8b70: 73 20 70 72 6f 6e 65 20 74 6f 20 72 6f 75 6e 64  s prone to round
8b80: 69 6e 67 20 65 72 72 6f 72 73 0a 2a 2f 0a 74 79  ing errors.*/.ty
8b90: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 64  pedef struct Std
8ba0: 65 76 43 74 78 20 53 74 64 65 76 43 74 78 3b 0a  evCtx StdevCtx;.
8bb0: 73 74 72 75 63 74 20 53 74 64 65 76 43 74 78 20  struct StdevCtx 
8bc0: 7b 0a 20 20 64 6f 75 62 6c 65 20 72 4d 3b 0a 20  {.  double rM;. 
8bd0: 20 64 6f 75 62 6c 65 20 72 53 3b 0a 20 20 69 36   double rS;.  i6
8be0: 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  4 cnt;          
8bf0: 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* number of ele
8c00: 6d 65 6e 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ments */.};../*.
8c10: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8c20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8c30: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
8c40: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61  the context of a
8c50: 0a 2a 2a 20 6d 6f 64 65 28 29 20 6f 72 20 6d 65  .** mode() or me
8c60: 64 69 61 6e 28 29 20 61 67 67 72 65 67 61 74 65  dian() aggregate
8c70: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2a   computation..**
8c80: 20 44 65 70 65 6e 64 73 20 6f 6e 20 73 74 72 75   Depends on stru
8c90: 63 74 75 72 65 73 20 64 65 66 69 6e 65 64 20 69  ctures defined i
8ca0: 6e 20 6d 61 70 2e 63 20 28 73 65 65 20 6d 61 70  n map.c (see map
8cb0: 20 26 20 6d 61 70 29 0a 2a 2a 20 54 68 65 73 65   & map).** These
8cc0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8cd0: 69 6f 6e 73 20 6f 6e 6c 79 20 77 6f 72 6b 20 66  ions only work f
8ce0: 6f 72 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  or integers and 
8cf0: 66 6c 6f 61 74 73 20 61 6c 74 68 6f 75 67 68 0a  floats although.
8d00: 2a 2a 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  ** they could be
8d10: 20 6d 61 64 65 20 74 6f 20 77 6f 72 6b 20 66 6f   made to work fo
8d20: 72 20 73 74 72 69 6e 67 73 2e 20 54 68 69 73 20  r strings. This 
8d30: 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6e 73 69  is usually consi
8d40: 64 65 72 65 64 20 6d 65 61 6e 69 6e 67 6c 65 73  dered meaningles
8d50: 73 2e 0a 2a 2a 20 4f 6e 6c 79 20 75 73 75 61 6c  s..** Only usual
8d60: 6c 20 6f 72 64 65 72 20 28 66 6f 72 20 6d 65 64  l order (for med
8d70: 69 61 6e 29 2c 20 6e 6f 20 75 73 65 20 6f 66 20  ian), no use of 
8d80: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
8d90: 6f 6e 73 20 28 77 6f 75 6c 64 20 74 68 69 73 20  ons (would this 
8da0: 65 76 65 6e 20 6d 61 6b 65 20 73 65 6e 73 65 3f  even make sense?
8db0: 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ).*/.typedef str
8dc0: 75 63 74 20 4d 6f 64 65 43 74 78 20 4d 6f 64 65  uct ModeCtx Mode
8dd0: 43 74 78 3b 0a 73 74 72 75 63 74 20 4d 6f 64 65  Ctx;.struct Mode
8de0: 43 74 78 20 7b 0a 20 20 69 36 34 20 72 69 4d 3b  Ctx {.  i64 riM;
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
8e00: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 75  nteger value fou
8e10: 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 64  nd so far */.  d
8e20: 6f 75 62 6c 65 20 72 64 4d 3b 20 20 20 20 20 20  ouble rdM;      
8e30: 20 20 20 2f 2a 20 64 6f 75 62 6c 65 20 76 61 6c     /* double val
8e40: 75 65 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ue found so far 
8e50: 2a 2f 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20  */.  i64 cnt;   
8e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
8e70: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 73  er of elements s
8e80: 6f 20 66 61 72 20 2a 2f 0a 20 20 64 6f 75 62 6c  o far */.  doubl
8e90: 65 20 70 63 6e 74 3b 20 20 20 20 20 20 20 20 2f  e pcnt;        /
8ea0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * number of elem
8eb0: 65 6e 74 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ents smaller tha
8ec0: 6e 20 61 20 70 65 72 63 65 6e 74 69 6c 65 20 2a  n a percentile *
8ed0: 2f 0a 20 20 69 36 34 20 6d 63 6e 74 3b 20 20 20  /.  i64 mcnt;   
8ee0: 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 78 69 6d          /* maxim
8ef0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63  um number of occ
8f00: 75 72 72 65 6e 63 65 73 20 28 66 6f 72 20 6d 6f  urrences (for mo
8f10: 64 65 29 20 2a 2f 0a 20 20 69 36 34 20 6d 6e 3b  de) */.  i64 mn;
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f30: 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63 75 72 72  number of occurr
8f40: 65 6e 63 65 73 20 28 66 6f 72 20 6d 6f 64 65 20  ences (for mode 
8f50: 61 6e 64 20 70 65 72 63 65 6e 74 69 6c 65 73 29  and percentiles)
8f60: 20 2a 2f 0a 20 20 69 36 34 20 69 73 5f 64 6f 75   */.  i64 is_dou
8f70: 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 77 68 65  ble;      /* whe
8f80: 74 68 65 72 20 74 68 65 20 63 6f 6d 70 75 74 61  ther the computa
8f90: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 64 6f  tion is being do
8fa0: 6e 65 20 66 6f 72 20 64 6f 75 62 6c 65 73 20 28  ne for doubles (
8fb0: 3e 30 29 20 6f 72 20 69 6e 74 65 67 65 72 73 20  >0) or integers 
8fc0: 28 3d 30 29 20 2a 2f 0a 20 20 6d 61 70 2a 20 6d  (=0) */.  map* m
8fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8fe0: 20 6d 61 70 20 73 74 72 75 63 74 75 72 65 20 75   map structure u
8ff0: 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  sed for the comp
9000: 75 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  utation */.  int
9010: 20 64 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20   done;          
9020: 20 2f 2a 20 77 68 65 74 68 65 72 20 74 68 65 20   /* whether the 
9030: 61 6e 73 77 65 72 20 68 61 73 20 62 65 65 6e 20  answer has been 
9040: 66 6f 75 6e 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  found */.};../*.
9050: 2a 2a 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  ** called for ea
9060: 63 68 20 76 61 6c 75 65 20 72 65 63 65 69 76 65  ch value receive
9070: 64 20 64 75 72 69 6e 67 20 61 20 63 61 6c 63 75  d during a calcu
9080: 6c 61 74 69 6f 6e 20 6f 66 20 73 74 64 65 76 20  lation of stdev 
9090: 6f 72 20 76 61 72 69 61 6e 63 65 0a 2a 2f 0a 73  or variance.*/.s
90a0: 74 61 74 69 63 20 76 6f 69 64 20 76 61 72 69 61  tatic void varia
90b0: 6e 63 65 53 74 65 70 28 73 71 6c 69 74 65 33 5f  nceStep(sqlite3_
90c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
90d0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
90e0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
90f0: 29 7b 0a 20 20 53 74 64 65 76 43 74 78 20 2a 70  ){.  StdevCtx *p
9100: 3b 0a 0a 20 20 64 6f 75 62 6c 65 20 64 65 6c 74  ;..  double delt
9110: 61 3b 0a 20 20 64 6f 75 62 6c 65 20 78 3b 0a 0a  a;.  double x;..
9120: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
9130: 31 20 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  1 );.  p = sqlit
9140: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
9150: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
9160: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 2f 2a 20  zeof(*p));.  /* 
9170: 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 6e 6f  only consider no
9180: 6e 2d 6e 75 6c 6c 20 76 61 6c 75 65 73 20 2a 2f  n-null values */
9190: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55  .  if( SQLITE_NU
91a0: 4c 4c 20 21 3d 20 73 71 6c 69 74 65 33 5f 76 61  LL != sqlite3_va
91b0: 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65  lue_numeric_type
91c0: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
91d0: 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 78   p->cnt++;.    x
91e0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
91f0: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29  _double(argv[0])
9200: 3b 0a 20 20 20 20 64 65 6c 74 61 20 3d 20 28 78  ;.    delta = (x
9210: 2d 70 2d 3e 72 4d 29 3b 0a 20 20 20 20 70 2d 3e  -p->rM);.    p->
9220: 72 4d 20 2b 3d 20 64 65 6c 74 61 2f 70 2d 3e 63  rM += delta/p->c
9230: 6e 74 3b 0a 20 20 20 20 70 2d 3e 72 53 20 2b 3d  nt;.    p->rS +=
9240: 20 64 65 6c 74 61 2a 28 78 2d 70 2d 3e 72 4d 29   delta*(x-p->rM)
9250: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63  ;.  }.}../*.** c
9260: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 20 76  alled for each v
9270: 61 6c 75 65 20 72 65 63 65 69 76 65 64 20 64 75  alue received du
9280: 72 69 6e 67 20 61 20 63 61 6c 63 75 6c 61 74 69  ring a calculati
9290: 6f 6e 20 6f 66 20 6d 6f 64 65 20 6f 66 20 6d 65  on of mode of me
92a0: 64 69 61 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dian.*/.static v
92b0: 6f 69 64 20 6d 6f 64 65 53 74 65 70 28 73 71 6c  oid modeStep(sql
92c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
92d0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
92e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
92f0: 2a 61 72 67 76 29 7b 0a 20 20 4d 6f 64 65 43 74  *argv){.  ModeCt
9300: 78 20 2a 70 3b 0a 20 20 69 36 34 20 78 69 3d 30  x *p;.  i64 xi=0
9310: 3b 0a 20 20 64 6f 75 62 6c 65 20 78 64 3d 30 2e  ;.  double xd=0.
9320: 30 3b 0a 20 20 69 36 34 20 2a 69 70 74 72 3b 0a  0;.  i64 *iptr;.
9330: 20 20 64 6f 75 62 6c 65 20 2a 64 70 74 72 3b 0a    double *dptr;.
9340: 20 20 69 6e 74 20 74 79 70 65 3b 0a 0a 20 20 61    int type;..  a
9350: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
9360: 3b 0a 20 20 74 79 70 65 20 3d 20 73 71 6c 69 74  ;.  type = sqlit
9370: 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63  e3_value_numeric
9380: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3b 0a  _type(argv[0]);.
9390: 0a 20 20 69 66 28 20 74 79 70 65 20 3d 3d 20 53  .  if( type == S
93a0: 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 20 20 20 20  QLITE_NULL).    
93b0: 72 65 74 75 72 6e 3b 0a 20 20 0a 20 20 70 20 3d  return;.  .  p =
93c0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
93d0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
93e0: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
93f0: 0a 0a 20 20 69 66 28 20 30 3d 3d 28 70 2d 3e 6d  ..  if( 0==(p->m
9400: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 20 3d 20  ) ){.    p->m = 
9410: 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66  calloc(1, sizeof
9420: 28 6d 61 70 29 29 3b 0a 20 20 20 20 69 66 28 20  (map));.    if( 
9430: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  type==SQLITE_INT
9440: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EGER ){.      /*
9450: 20 6d 61 70 20 77 69 6c 6c 20 62 65 20 75 73 65   map will be use
9460: 64 20 66 6f 72 20 69 6e 74 65 67 65 72 73 20 2a  d for integers *
9470: 2f 0a 20 20 20 20 20 20 2a 28 70 2d 3e 6d 29 20  /.      *(p->m) 
9480: 3d 20 6d 61 70 5f 6d 61 6b 65 28 69 6e 74 5f 63  = map_make(int_c
9490: 6d 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 73  mp);.      p->is
94a0: 5f 64 6f 75 62 6c 65 20 3d 20 30 3b 0a 20 20 20  _double = 0;.   
94b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
94c0: 3e 69 73 5f 64 6f 75 62 6c 65 20 3d 20 31 3b 0a  >is_double = 1;.
94d0: 20 20 20 20 20 20 2f 2a 20 6d 61 70 20 77 69 6c        /* map wil
94e0: 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 6f  l be used for do
94f0: 75 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 2a  ubles */.      *
9500: 28 70 2d 3e 6d 29 20 3d 20 6d 61 70 5f 6d 61 6b  (p->m) = map_mak
9510: 65 28 64 6f 75 62 6c 65 5f 63 6d 70 29 3b 0a 20  e(double_cmp);. 
9520: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2b 2b 28 70     }.  }..  ++(p
9530: 2d 3e 63 6e 74 29 3b 0a 0a 20 20 69 66 28 20 30  ->cnt);..  if( 0
9540: 3d 3d 70 2d 3e 69 73 5f 64 6f 75 62 6c 65 20 29  ==p->is_double )
9550: 7b 0a 20 20 20 20 78 69 20 3d 20 73 71 6c 69 74  {.    xi = sqlit
9560: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
9570: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 70 74  rgv[0]);.    ipt
9580: 72 20 3d 20 28 69 36 34 2a 29 63 61 6c 6c 6f 63  r = (i64*)calloc
9590: 28 31 2c 73 69 7a 65 6f 66 28 69 36 34 29 29 3b  (1,sizeof(i64));
95a0: 0a 20 20 20 20 2a 69 70 74 72 20 3d 20 78 69 3b  .    *iptr = xi;
95b0: 0a 20 20 20 20 6d 61 70 5f 69 6e 73 65 72 74 28  .    map_insert(
95c0: 70 2d 3e 6d 2c 20 69 70 74 72 29 3b 0a 20 20 7d  p->m, iptr);.  }
95d0: 65 6c 73 65 7b 0a 20 20 20 20 78 64 20 3d 20 73  else{.    xd = s
95e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
95f0: 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
9600: 20 20 64 70 74 72 20 3d 20 28 64 6f 75 62 6c 65    dptr = (double
9610: 2a 29 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f  *)calloc(1,sizeo
9620: 66 28 64 6f 75 62 6c 65 29 29 3b 0a 20 20 20 20  f(double));.    
9630: 2a 64 70 74 72 20 3d 20 78 64 3b 0a 20 20 20 20  *dptr = xd;.    
9640: 6d 61 70 5f 69 6e 73 65 72 74 28 70 2d 3e 6d 2c  map_insert(p->m,
9650: 20 64 70 74 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   dptr);.  }.}../
9660: 2a 0a 2a 2a 20 20 41 75 78 69 6c 69 61 72 79 20  *.**  Auxiliary 
9670: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 74  function that it
9680: 65 72 61 74 65 73 20 61 6c 6c 20 65 6c 65 6d 65  erates all eleme
9690: 6e 74 73 20 69 6e 20 61 20 6d 61 70 20 61 6e 64  nts in a map and
96a0: 20 66 69 6e 64 73 20 74 68 65 20 6d 6f 64 65 0a   finds the mode.
96b0: 2a 2a 20 20 28 6d 6f 73 74 20 66 72 65 71 75 65  **  (most freque
96c0: 6e 74 20 76 61 6c 75 65 29 0a 2a 2f 0a 73 74 61  nt value).*/.sta
96d0: 74 69 63 20 76 6f 69 64 20 6d 6f 64 65 49 74 65  tic void modeIte
96e0: 72 61 74 65 28 76 6f 69 64 2a 20 65 2c 20 69 36  rate(void* e, i6
96f0: 34 20 63 2c 20 76 6f 69 64 2a 20 70 70 29 7b 0a  4 c, void* pp){.
9700: 20 20 69 36 34 20 65 69 3b 0a 20 20 64 6f 75 62    i64 ei;.  doub
9710: 6c 65 20 65 64 3b 0a 20 20 4d 6f 64 65 43 74 78  le ed;.  ModeCtx
9720: 20 2a 70 20 3d 20 28 4d 6f 64 65 43 74 78 2a 29   *p = (ModeCtx*)
9730: 70 70 3b 0a 20 20 0a 20 20 69 66 28 20 30 3d 3d  pp;.  .  if( 0==
9740: 70 2d 3e 69 73 5f 64 6f 75 62 6c 65 20 29 7b 0a  p->is_double ){.
9750: 20 20 20 20 65 69 20 3d 20 2a 28 69 6e 74 2a 29      ei = *(int*)
9760: 28 65 29 3b 0a 0a 09 69 66 28 20 70 2d 3e 6d 63  (e);...if( p->mc
9770: 6e 74 3d 3d 63 20 29 7b 0a 20 20 20 20 20 20 2b  nt==c ){.      +
9780: 2b 70 2d 3e 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73  +p->mn;.    }els
9790: 65 20 69 66 28 20 70 2d 3e 6d 63 6e 74 3c 63 20  e if( p->mcnt<c 
97a0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 69 4d 20  ){.      p->riM 
97b0: 3d 20 65 69 3b 0a 20 20 20 20 20 20 70 2d 3e 6d  = ei;.      p->m
97c0: 63 6e 74 20 3d 20 63 3b 0a 09 20 20 70 2d 3e 6d  cnt = c;..  p->m
97d0: 6e 3d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n=1;.    }.  }el
97e0: 73 65 7b 0a 20 20 20 20 65 64 20 3d 20 2a 28 64  se{.    ed = *(d
97f0: 6f 75 62 6c 65 2a 29 28 65 29 3b 0a 0a 09 69 66  ouble*)(e);...if
9800: 28 20 70 2d 3e 6d 63 6e 74 3d 3d 63 20 29 7b 0a  ( p->mcnt==c ){.
9810: 20 20 20 20 20 20 2b 2b 70 2d 3e 6d 6e 3b 0a 20        ++p->mn;. 
9820: 20 20 20 7d 65 6c 73 65 20 69 66 28 70 2d 3e 6d     }else if(p->m
9830: 63 6e 74 3c 63 29 7b 0a 20 20 20 20 20 20 70 2d  cnt<c){.      p-
9840: 3e 72 64 4d 20 3d 20 65 64 3b 0a 20 20 20 20 20  >rdM = ed;.     
9850: 20 70 2d 3e 6d 63 6e 74 20 3d 20 63 3b 0a 09 20   p->mcnt = c;.. 
9860: 20 70 2d 3e 6d 6e 3d 31 3b 0a 20 20 20 20 7d 0a   p->mn=1;.    }.
9870: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 41 75    }.}../*.**  Au
9880: 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e  xiliary function
9890: 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 61   that iterates a
98a0: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  ll elements in a
98b0: 20 6d 61 70 20 61 6e 64 20 66 69 6e 64 73 20 74   map and finds t
98c0: 68 65 20 6d 65 64 69 61 6e 0a 2a 2a 20 20 28 74  he median.**  (t
98d0: 68 65 20 76 61 6c 75 65 20 73 75 63 68 20 74 68  he value such th
98e0: 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
98f0: 20 65 6c 65 6d 65 6e 74 73 20 73 6d 61 6c 6c 65   elements smalle
9900: 72 20 69 73 20 65 71 75 61 6c 20 74 68 65 20 74  r is equal the t
9910: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
9920: 20 20 65 6c 65 6d 65 6e 74 73 20 6c 61 72 67 65    elements large
9930: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r).*/.static voi
9940: 64 20 6d 65 64 69 61 6e 49 74 65 72 61 74 65 28  d medianIterate(
9950: 76 6f 69 64 2a 20 65 2c 20 69 36 34 20 63 2c 20  void* e, i64 c, 
9960: 76 6f 69 64 2a 20 70 70 29 7b 0a 20 20 69 36 34  void* pp){.  i64
9970: 20 65 69 3b 0a 20 20 64 6f 75 62 6c 65 20 65 64   ei;.  double ed
9980: 3b 0a 20 20 64 6f 75 62 6c 65 20 69 4c 3b 0a 20  ;.  double iL;. 
9990: 20 64 6f 75 62 6c 65 20 69 52 3b 0a 20 20 69 6e   double iR;.  in
99a0: 74 20 69 6c 3b 0a 20 20 69 6e 74 20 69 72 3b 0a  t il;.  int ir;.
99b0: 20 20 4d 6f 64 65 43 74 78 20 2a 70 20 3d 20 28    ModeCtx *p = (
99c0: 4d 6f 64 65 43 74 78 2a 29 70 70 3b 0a 0a 20 20  ModeCtx*)pp;..  
99d0: 69 66 28 70 2d 3e 64 6f 6e 65 3e 30 29 0a 20 20  if(p->done>0).  
99e0: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 4c 20    return;..  iL 
99f0: 3d 20 70 2d 3e 70 63 6e 74 3b 0a 20 20 69 52 20  = p->pcnt;.  iR 
9a00: 3d 20 70 2d 3e 63 6e 74 20 2d 20 70 2d 3e 70 63  = p->cnt - p->pc
9a10: 6e 74 3b 0a 20 20 69 6c 20 3d 20 70 2d 3e 6d 63  nt;.  il = p->mc
9a20: 6e 74 20 2b 20 63 3b 0a 20 20 69 72 20 3d 20 70  nt + c;.  ir = p
9a30: 2d 3e 63 6e 74 20 2d 20 70 2d 3e 6d 63 6e 74 3b  ->cnt - p->mcnt;
9a40: 0a 0a 20 20 69 66 28 20 69 6c 20 3e 3d 20 69 4c  ..  if( il >= iL
9a50: 20 29 7b 0a 20 20 20 20 69 66 28 20 69 72 20 3e   ){.    if( ir >
9a60: 3d 20 69 52 20 29 7b 0a 20 20 20 20 2b 2b 70 2d  = iR ){.    ++p-
9a70: 3e 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 30  >mn;.      if( 0
9a80: 3d 3d 70 2d 3e 69 73 5f 64 6f 75 62 6c 65 20 29  ==p->is_double )
9a90: 7b 0a 20 20 20 20 20 20 20 20 65 69 20 3d 20 2a  {.        ei = *
9aa0: 28 69 6e 74 2a 29 28 65 29 3b 0a 20 20 20 20 20  (int*)(e);.     
9ab0: 20 20 20 70 2d 3e 72 69 4d 20 2b 3d 20 65 69 3b     p->riM += ei;
9ac0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9ad0: 20 20 20 20 20 20 65 64 20 3d 20 2a 28 64 6f 75        ed = *(dou
9ae0: 62 6c 65 2a 29 28 65 29 3b 0a 20 20 20 20 20 20  ble*)(e);.      
9af0: 20 20 70 2d 3e 72 64 4d 20 2b 3d 20 65 64 3b 0a    p->rdM += ed;.
9b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
9b10: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 6f 6e 65  e{.      p->done
9b20: 3d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  =1;.    }.  }.  
9b30: 70 2d 3e 6d 63 6e 74 2b 3d 63 3b 0a 7d 0a 0a 2f  p->mcnt+=c;.}../
9b40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
9b50: 20 6d 6f 64 65 20 76 61 6c 75 65 0a 2a 2f 0a 73   mode value.*/.s
9b60: 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 64 65 46  tatic void modeF
9b70: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
9b80: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
9b90: 29 7b 0a 20 20 4d 6f 64 65 43 74 78 20 2a 70 3b  ){.  ModeCtx *p;
9ba0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
9bb0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
9bc0: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
9bd0: 69 66 28 20 70 20 26 26 20 70 2d 3e 6d 20 29 7b  if( p && p->m ){
9be0: 0a 20 20 20 20 6d 61 70 5f 69 74 65 72 61 74 65  .    map_iterate
9bf0: 28 70 2d 3e 6d 2c 20 6d 6f 64 65 49 74 65 72 61  (p->m, modeItera
9c00: 74 65 2c 20 70 29 3b 0a 20 20 20 20 6d 61 70 5f  te, p);.    map_
9c10: 64 65 73 74 72 6f 79 28 70 2d 3e 6d 29 3b 0a 20  destroy(p->m);. 
9c20: 20 20 20 66 72 65 65 28 70 2d 3e 6d 29 3b 0a 0a     free(p->m);..
9c30: 20 20 20 20 69 66 28 20 31 3d 3d 70 2d 3e 6d 6e      if( 1==p->mn
9c40: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   ){.      if( 0=
9c50: 3d 70 2d 3e 69 73 5f 64 6f 75 62 6c 65 20 29 0a  =p->is_double ).
9c60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9c70: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
9c80: 74 65 78 74 2c 20 70 2d 3e 72 69 4d 29 3b 0a 20  text, p->riM);. 
9c90: 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20       else.      
9ca0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9cb0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
9cc0: 20 70 2d 3e 72 64 4d 29 3b 0a 20 20 20 20 7d 0a   p->rdM);.    }.
9cd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61 75 78    }.}../*.** aux
9ce0: 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 20  iliary function 
9cf0: 66 6f 72 20 70 65 72 63 65 6e 74 69 6c 65 73 0a  for percentiles.
9d00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
9d10: 6d 65 64 69 61 6e 46 69 6e 61 6c 69 7a 65 28 73  medianFinalize(s
9d20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9d30: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 6f 64 65  context){.  Mode
9d40: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 4d  Ctx *p;.  p = (M
9d50: 6f 64 65 43 74 78 2a 29 20 73 71 6c 69 74 65 33  odeCtx*) sqlite3
9d60: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
9d70: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
9d80: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6d 20    if( p && p->m 
9d90: 29 7b 0a 20 20 20 20 70 2d 3e 64 6f 6e 65 3d 30  ){.    p->done=0
9da0: 3b 0a 20 20 20 20 6d 61 70 5f 69 74 65 72 61 74  ;.    map_iterat
9db0: 65 28 70 2d 3e 6d 2c 20 6d 65 64 69 61 6e 49 74  e(p->m, medianIt
9dc0: 65 72 61 74 65 2c 20 70 29 3b 0a 20 20 20 20 6d  erate, p);.    m
9dd0: 61 70 5f 64 65 73 74 72 6f 79 28 70 2d 3e 6d 29  ap_destroy(p->m)
9de0: 3b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 6d 29  ;.    free(p->m)
9df0: 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 2d  ;..    if( 0==p-
9e00: 3e 69 73 5f 64 6f 75 62 6c 65 20 29 0a 20 20 20  >is_double ).   
9e10: 20 20 20 69 66 28 20 31 3d 3d 70 2d 3e 6d 6e 20     if( 1==p->mn 
9e20: 29 0a 20 20 20 20 20 20 09 73 71 6c 69 74 65 33  ).      .sqlite3
9e30: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
9e40: 6e 74 65 78 74 2c 20 70 2d 3e 72 69 4d 29 3b 0a  ntext, p->riM);.
9e50: 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20        else.     
9e60: 20 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74   .sqlite3_result
9e70: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
9e80: 20 70 2d 3e 72 69 4d 2a 31 2e 30 2f 70 2d 3e 6d   p->riM*1.0/p->m
9e90: 6e 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  n);.    else.   
9ea0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9eb0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
9ec0: 2c 20 70 2d 3e 72 64 4d 2f 70 2d 3e 6d 6e 29 3b  , p->rdM/p->mn);
9ed0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
9ee0: 74 75 72 6e 73 20 74 68 65 20 6d 65 64 69 61 6e  turns the median
9ef0: 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63   value.*/.static
9f00: 20 76 6f 69 64 20 6d 65 64 69 61 6e 46 69 6e 61   void medianFina
9f10: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
9f20: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
9f30: 20 20 4d 6f 64 65 43 74 78 20 2a 70 3b 0a 20 20    ModeCtx *p;.  
9f40: 70 20 3d 20 28 4d 6f 64 65 43 74 78 2a 29 20 73  p = (ModeCtx*) s
9f50: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
9f60: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
9f70: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 21 3d 30  , 0);.  if( p!=0
9f80: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 63 6e 74 20   ){.    p->pcnt 
9f90: 3d 20 28 70 2d 3e 63 6e 74 29 2f 32 2e 30 3b 0a  = (p->cnt)/2.0;.
9fa0: 20 20 20 20 5f 6d 65 64 69 61 6e 46 69 6e 61 6c      _medianFinal
9fb0: 69 7a 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ize(context);.  
9fc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
9fd0: 6e 73 20 74 68 65 20 6c 6f 77 65 72 5f 71 75 61  ns the lower_qua
9fe0: 72 74 69 6c 65 20 76 61 6c 75 65 0a 2a 2f 0a 73  rtile value.*/.s
9ff0: 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 77 65 72  tatic void lower
a000: 5f 71 75 61 72 74 69 6c 65 46 69 6e 61 6c 69 7a  _quartileFinaliz
a010: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
a020: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d  t *context){.  M
a030: 6f 64 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  odeCtx *p;.  p =
a040: 20 28 4d 6f 64 65 43 74 78 2a 29 20 73 71 6c 69   (ModeCtx*) sqli
a050: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
a060: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
a070: 29 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b  );.  if( p!=0 ){
a080: 0a 20 20 20 20 70 2d 3e 70 63 6e 74 20 3d 20 28  .    p->pcnt = (
a090: 70 2d 3e 63 6e 74 29 2f 34 2e 30 3b 0a 20 20 20  p->cnt)/4.0;.   
a0a0: 20 5f 6d 65 64 69 61 6e 46 69 6e 61 6c 69 7a 65   _medianFinalize
a0b0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 7d  (context);.  }.}
a0c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
a0d0: 74 68 65 20 75 70 70 65 72 5f 71 75 61 72 74 69  the upper_quarti
a0e0: 6c 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  le value.*/.stat
a0f0: 69 63 20 76 6f 69 64 20 75 70 70 65 72 5f 71 75  ic void upper_qu
a100: 61 72 74 69 6c 65 46 69 6e 61 6c 69 7a 65 28 73  artileFinalize(s
a110: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
a120: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 6f 64 65  context){.  Mode
a130: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 4d  Ctx *p;.  p = (M
a140: 6f 64 65 43 74 78 2a 29 20 73 71 6c 69 74 65 33  odeCtx*) sqlite3
a150: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
a160: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
a170: 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
a180: 20 20 70 2d 3e 70 63 6e 74 20 3d 20 28 70 2d 3e    p->pcnt = (p->
a190: 63 6e 74 29 2a 33 2f 34 2e 30 3b 0a 20 20 20 20  cnt)*3/4.0;.    
a1a0: 5f 6d 65 64 69 61 6e 46 69 6e 61 6c 69 7a 65 28  _medianFinalize(
a1b0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 7d 0a  context);.  }.}.
a1c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  ./*.** Returns t
a1d0: 68 65 20 73 74 64 65 76 20 76 61 6c 75 65 0a 2a  he stdev value.*
a1e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
a1f0: 64 65 76 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  devFinalize(sqli
a200: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
a210: 74 65 78 74 29 7b 0a 20 20 53 74 64 65 76 43 74  text){.  StdevCt
a220: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
a230: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
a240: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
a250: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
a260: 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 73 71  >cnt>1 ){.    sq
a270: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
a280: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73 71 72  ble(context, sqr
a290: 74 28 70 2d 3e 72 53 2f 28 70 2d 3e 63 6e 74 2d  t(p->rS/(p->cnt-
a2a0: 31 29 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  1)));.  }else{. 
a2b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
a2c0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
a2d0: 2c 20 30 2e 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , 0.0);.  }.}../
a2e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
a2f0: 20 76 61 72 69 61 6e 63 65 20 76 61 6c 75 65 0a   variance value.
a300: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
a310: 61 72 69 61 6e 63 65 46 69 6e 61 6c 69 7a 65 28  arianceFinalize(
a320: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
a330: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74 64  *context){.  Std
a340: 65 76 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  evCtx *p;.  p = 
a350: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
a360: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
a370: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26  t, 0);.  if( p &
a380: 26 20 70 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20  & p->cnt>1 ){.  
a390: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a3a0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
a3b0: 20 70 2d 3e 72 53 2f 28 70 2d 3e 63 6e 74 2d 31   p->rS/(p->cnt-1
a3c0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
a3d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a3e0: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
a3f0: 30 2e 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  0.0);.  }.}..#if
a400: 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44  def SQLITE_SOUND
a410: 45 58 0a 0a 2f 2a 20 72 65 6c 69 63 6f 64 65 72  EX../* relicoder
a420: 20 66 61 63 74 6f 72 65 64 20 63 6f 64 65 20 2a   factored code *
a430: 2f 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74  /./*.** Calculat
a440: 65 73 20 74 68 65 20 73 6f 75 6e 64 65 78 20 76  es the soundex v
a450: 61 6c 75 65 20 6f 66 20 61 20 73 74 72 69 6e 67  alue of a string
a460: 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
a470: 20 73 6f 75 6e 64 65 78 28 63 6f 6e 73 74 20 75   soundex(const u
a480: 38 20 2a 7a 49 6e 2c 20 63 68 61 72 20 2a 7a 52  8 *zIn, char *zR
a490: 65 73 75 6c 74 29 7b 0a 20 20 69 6e 74 20 69 2c  esult){.  int i,
a4a0: 20 6a 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   j;.  static con
a4b0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
a4c0: 20 69 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20   iCode[] = {.   
a4d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a4e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a4f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a500: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
a510: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a520: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a530: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30  , 0,.    0, 0, 0
a540: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a550: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a560: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
a570: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a580: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a590: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
a5a0: 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20   0, 0, 1, 2, 3, 
a5b0: 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32  0, 1, 2, 0, 0, 2
a5c0: 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c  , 2, 4, 5, 5, 0,
a5d0: 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c  .    1, 2, 6, 2,
a5e0: 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20   3, 0, 1, 0, 2, 
a5f0: 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 2, 0, 0, 0, 0
a600: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31  , 0,.    0, 0, 1
a610: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c  , 2, 3, 0, 1, 2,
a620: 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20   0, 0, 2, 2, 4, 
a630: 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20  5, 5, 0,.    1, 
a640: 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31  2, 6, 2, 3, 0, 1
a650: 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 2, 0, 2, 0,
a660: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 7d   0, 0, 0, 0,.  }
a670: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49  ;..  for(i=0; zI
a680: 6e 5b 69 5d 20 26 26 20 21 69 73 61 6c 70 68 61  n[i] && !isalpha
a690: 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  (zIn[i]); i++){}
a6a0: 0a 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20 29 7b  .  if( zIn[i] ){
a6b0: 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20  .    zResult[0] 
a6c0: 3d 20 74 6f 75 70 70 65 72 28 7a 49 6e 5b 69 5d  = toupper(zIn[i]
a6d0: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  );.    for(j=1; 
a6e0: 6a 3c 34 20 26 26 20 7a 49 6e 5b 69 5d 3b 20 69  j<4 && zIn[i]; i
a6f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ++){.      int c
a700: 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b  ode = iCode[zIn[
a710: 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 20 20  i]&0x7f];.      
a720: 69 66 28 20 63 6f 64 65 3e 30 20 29 7b 0a 20 20  if( code>0 ){.  
a730: 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b        zResult[j+
a740: 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30 27 3b  +] = code + '0';
a750: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a760: 20 20 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b     while( j<4 ){
a770: 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a  .      zResult[j
a780: 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d  ++] = '0';.    }
a790: 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20  .    zResult[j] 
a7a0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
a7b0: 20 20 73 74 72 63 70 79 28 7a 52 65 73 75 6c 74    strcpy(zResult
a7c0: 2c 20 22 3f 30 30 30 22 29 3b 0a 20 20 7d 0a 7d  , "?000");.  }.}
a7d0: 0a 0a 2f 2a 0a 2a 2a 20 63 6f 6d 70 75 74 65 73  ../*.** computes
a7e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
a7f0: 69 66 66 65 72 65 6e 74 20 63 68 61 72 61 63 74  ifferent charact
a800: 65 72 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ers between the 
a810: 73 6f 75 6e 64 65 78 20 76 61 6c 75 65 20 66 6f  soundex value fo
a820: 20 32 20 73 74 72 69 6e 67 73 0a 2a 2f 0a 73 74   2 strings.*/.st
a830: 61 74 69 63 20 76 6f 69 64 20 64 69 66 66 65 72  atic void differ
a840: 65 6e 63 65 46 75 6e 63 28 73 71 6c 69 74 65 33  enceFunc(sqlite3
a850: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
a860: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
a870: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
a880: 76 29 7b 0a 20 20 63 68 61 72 20 7a 52 65 73 75  v){.  char zResu
a890: 6c 74 31 5b 38 5d 3b 0a 20 20 63 68 61 72 20 7a  lt1[8];.  char z
a8a0: 52 65 73 75 6c 74 32 5b 38 5d 3b 0a 20 20 63 68  Result2[8];.  ch
a8b0: 61 72 20 2a 7a 52 31 20 3d 20 7a 52 65 73 75 6c  ar *zR1 = zResul
a8c0: 74 31 3b 0a 20 20 63 68 61 72 20 2a 7a 52 32 20  t1;.  char *zR2 
a8d0: 3d 20 7a 52 65 73 75 6c 74 32 3b 0a 20 20 69 6e  = zResult2;.  in
a8e0: 74 20 72 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e  t rVal = 0;.  in
a8f0: 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  t i = 0;.  const
a900: 20 75 38 20 2a 7a 49 6e 31 3b 0a 20 20 63 6f 6e   u8 *zIn1;.  con
a910: 73 74 20 75 38 20 2a 7a 49 6e 32 3b 0a 0a 20 20  st u8 *zIn2;..  
a920: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20  assert( argc==2 
a930: 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69  );.  .  if( sqli
a940: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
a950: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
a960: 4e 55 4c 4c 20 7c 7c 20 73 71 6c 69 74 65 33 5f  NULL || sqlite3_
a970: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
a980: 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])==SQLITE_NULL
a990: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a9a0: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
a9b0: 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ext);.    return
a9c0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 7a 49 6e 31 20  ;.  }.  .  zIn1 
a9d0: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 5f 76  = (u8*)sqlite3_v
a9e0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
a9f0: 5d 29 3b 0a 20 20 7a 49 6e 32 20 3d 20 28 75 38  ]);.  zIn2 = (u8
aa00: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
aa10: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a  text(argv[1]);..
aa20: 20 20 73 6f 75 6e 64 65 78 28 7a 49 6e 31 2c 20    soundex(zIn1, 
aa30: 7a 52 31 29 3b 0a 20 20 73 6f 75 6e 64 65 78 28  zR1);.  soundex(
aa40: 7a 49 6e 32 2c 20 7a 52 32 29 3b 0a 0a 20 20 66  zIn2, zR2);..  f
aa50: 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 2b 2b 69  or(i=0; i<4; ++i
aa60: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
aa70: 65 43 68 61 72 56 61 6c 28 28 75 6e 73 69 67 6e  eCharVal((unsign
aa80: 65 64 20 63 68 61 72 20 2a 29 7a 52 31 29 3d 3d  ed char *)zR1)==
aa90: 73 71 6c 69 74 65 43 68 61 72 56 61 6c 28 28 75  sqliteCharVal((u
aaa0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a  nsigned char *)z
aab0: 52 32 29 20 29 0a 20 20 20 20 20 20 2b 2b 72 56  R2) ).      ++rV
aac0: 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 4e 65  al;.    sqliteNe
aad0: 78 74 43 68 61 72 28 7a 52 31 29 3b 0a 20 20 20  xtChar(zR1);.   
aae0: 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28   sqliteNextChar(
aaf0: 7a 52 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  zR2);.  }.  sqli
ab00: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
ab10: 6f 6e 74 65 78 74 2c 20 72 56 61 6c 29 3b 0a 7d  ontext, rVal);.}
ab20: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
ab30: 76 6f 69 64 20 6c 61 73 74 52 6f 77 73 46 75 6e  void lastRowsFun
ab40: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
ab50: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
ab60: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
ab70: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73  lue **argv){.  s
ab80: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
ab90: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
aba0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
abb0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
abc0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
abd0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
abe0: 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (db));.}../*.** 
abf0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
ac00: 67 69 73 74 65 72 65 64 20 61 6c 6c 20 6f 66 20  gistered all of 
ac10: 74 68 65 20 61 62 6f 76 65 20 43 20 66 75 6e 63  the above C func
ac20: 74 69 6f 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20  tions as SQL.** 
ac30: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
ac40: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f   should be the o
ac50: 6e 6c 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 74  nly routine in t
ac60: 68 69 73 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a  his file with.**
ac70: 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67   external linkag
ac80: 65 2e 0a 2a 2f 0a 69 6e 74 20 52 65 67 69 73 74  e..*/.int Regist
ac90: 65 72 45 78 74 65 6e 73 69 6f 6e 46 75 6e 63 74  erExtensionFunct
aca0: 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ions(sqlite3 *db
acb0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
acc0: 74 20 73 74 72 75 63 74 20 46 75 6e 63 44 65 66  t struct FuncDef
acd0: 73 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  s {.     char *z
ace0: 4e 61 6d 65 3b 0a 20 20 20 20 20 73 69 67 6e 65  Name;.     signe
acf0: 64 20 63 68 61 72 20 6e 41 72 67 3b 0a 20 20 20  d char nArg;.   
ad00: 20 20 75 38 20 61 72 67 54 79 70 65 3b 20 20 20    u8 argType;   
ad10: 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 6e 6f          /* 0: no
ad20: 6e 65 2e 20 20 31 3a 20 64 62 20 20 32 3a 20 28  ne.  1: db  2: (
ad30: 2d 31 29 20 2a 2f 0a 20 20 20 20 20 75 38 20 65  -1) */.     u8 e
ad40: 54 65 78 74 52 65 70 3b 20 20 20 20 20 20 20 20  TextRep;        
ad50: 20 20 2f 2a 20 31 3a 20 55 54 46 2d 31 36 2e 20    /* 1: UTF-16. 
ad60: 20 30 3a 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20   0: UTF-8 */.   
ad70: 20 20 75 38 20 6e 65 65 64 43 6f 6c 6c 53 65 71    u8 needCollSeq
ad80: 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 46  ;.     void (*xF
ad90: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
ada0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
adb0: 33 5f 76 61 6c 75 65 20 2a 2a 29 3b 0a 20 20 7d  3_value **);.  }
adc0: 20 61 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20   aFuncs[] = {.  
add0: 20 20 2f 2a 20 6d 61 74 68 2e 68 20 2a 2f 0a 20    /* math.h */. 
ade0: 20 20 20 7b 20 22 61 63 6f 73 22 2c 20 20 20 20     { "acos",    
adf0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
ae00: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
ae10: 20 30 2c 20 61 63 6f 73 46 75 6e 63 20 20 7d 2c   0, acosFunc  },
ae20: 0a 20 20 20 20 7b 20 22 61 73 69 6e 22 2c 20 20  .    { "asin",  
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
ae40: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
ae50: 20 20 20 30 2c 20 61 73 69 6e 46 75 6e 63 20 20     0, asinFunc  
ae60: 7d 2c 0a 20 20 20 20 7b 20 22 61 74 61 6e 22 2c  },.    { "atan",
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
ae80: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
ae90: 2c 20 20 20 20 30 2c 20 61 74 61 6e 46 75 6e 63  ,    0, atanFunc
aea0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 74 6e 32    },.    { "atn2
aeb0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
aec0: 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   2, 0, SQLITE_UT
aed0: 46 38 2c 20 20 20 20 30 2c 20 61 74 6e 32 46 75  F8,    0, atn2Fu
aee0: 6e 63 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 58 58  nc  },.    /* XX
aef0: 58 20 61 6c 69 61 73 20 2a 2f 0a 20 20 20 20 7b  X alias */.    {
af00: 20 22 61 74 61 6e 32 22 2c 20 20 20 20 20 20 20   "atan2",       
af10: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c         2, 0, SQL
af20: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
af30: 61 74 6e 32 46 75 6e 63 20 20 7d 2c 0a 20 20 20  atn2Func  },.   
af40: 20 7b 20 22 61 63 6f 73 68 22 2c 20 20 20 20 20   { "acosh",     
af50: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
af60: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
af70: 2c 20 61 63 6f 73 68 46 75 6e 63 20 20 7d 2c 0a  , acoshFunc  },.
af80: 20 20 20 20 7b 20 22 61 73 69 6e 68 22 2c 20 20      { "asinh",  
af90: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
afa0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
afb0: 20 20 30 2c 20 61 73 69 6e 68 46 75 6e 63 20 20    0, asinhFunc  
afc0: 7d 2c 0a 20 20 20 20 7b 20 22 61 74 61 6e 68 22  },.    { "atanh"
afd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
afe0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
aff0: 2c 20 20 20 20 30 2c 20 61 74 61 6e 68 46 75 6e  ,    0, atanhFun
b000: 63 20 20 7d 2c 0a 0a 20 20 20 20 7b 20 22 64 69  c  },..    { "di
b010: 66 66 65 72 65 6e 63 65 22 2c 20 20 20 20 20 20  fference",      
b020: 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f     2, 0, SQLITE_
b030: 55 54 46 38 2c 20 20 20 20 30 2c 20 64 69 66 66  UTF8,    0, diff
b040: 65 72 65 6e 63 65 46 75 6e 63 7d 2c 0a 20 20 20  erenceFunc},.   
b050: 20 7b 20 22 64 65 67 72 65 65 73 22 2c 20 20 20   { "degrees",   
b060: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
b070: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
b080: 2c 20 72 61 64 32 64 65 67 46 75 6e 63 20 20 7d  , rad2degFunc  }
b090: 2c 0a 20 20 20 20 7b 20 22 72 61 64 69 61 6e 73  ,.    { "radians
b0a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  ",            1,
b0b0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
b0c0: 20 20 20 20 30 2c 20 64 65 67 32 72 61 64 46 75      0, deg2radFu
b0d0: 6e 63 20 20 7d 2c 0a 0a 20 20 20 20 7b 20 22 63  nc  },..    { "c
b0e0: 6f 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  os",            
b0f0: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
b100: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 63 6f 73  _UTF8,    0, cos
b110: 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22  Func  },.    { "
b120: 73 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  sin",           
b130: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
b140: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73 69  E_UTF8,    0, si
b150: 6e 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  nFunc },.    { "
b160: 74 61 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  tan",           
b170: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
b180: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 74 61  E_UTF8,    0, ta
b190: 6e 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  nFunc },.    { "
b1a0: 63 6f 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  cot",           
b1b0: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
b1c0: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 63 6f  E_UTF8,    0, co
b1d0: 74 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  tFunc },.    { "
b1e0: 63 6f 73 68 22 2c 20 20 20 20 20 20 20 20 20 20  cosh",          
b1f0: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
b200: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 63 6f  E_UTF8,    0, co
b210: 73 68 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b  shFunc  },.    {
b220: 20 22 73 69 6e 68 22 2c 20 20 20 20 20 20 20 20   "sinh",        
b230: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c         1, 0, SQL
b240: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
b250: 73 69 6e 68 46 75 6e 63 20 7d 2c 0a 20 20 20 20  sinhFunc },.    
b260: 7b 20 22 74 61 6e 68 22 2c 20 20 20 20 20 20 20  { "tanh",       
b270: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51          1, 0, SQ
b280: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
b290: 20 74 61 6e 68 46 75 6e 63 20 7d 2c 0a 20 20 20   tanhFunc },.   
b2a0: 20 7b 20 22 63 6f 74 68 22 2c 20 20 20 20 20 20   { "coth",      
b2b0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
b2c0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
b2d0: 2c 20 63 6f 74 68 46 75 6e 63 20 7d 2c 0a 0a 20  , cothFunc },.. 
b2e0: 20 20 20 7b 20 22 65 78 70 22 2c 20 20 20 20 20     { "exp",     
b2f0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
b300: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
b310: 20 30 2c 20 65 78 70 46 75 6e 63 20 20 7d 2c 0a   0, expFunc  },.
b320: 20 20 20 20 7b 20 22 6c 6f 67 22 2c 20 20 20 20      { "log",    
b330: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
b340: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
b350: 20 20 30 2c 20 6c 6f 67 46 75 6e 63 20 20 7d 2c    0, logFunc  },
b360: 0a 20 20 20 20 7b 20 22 6c 6f 67 31 30 22 2c 20  .    { "log10", 
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
b380: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
b390: 20 20 20 30 2c 20 6c 6f 67 31 30 46 75 6e 63 20     0, log10Func 
b3a0: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6f 77 65 72   },.    { "power
b3b0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b3c0: 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  2, 0, SQLITE_UTF
b3d0: 38 2c 20 20 20 20 30 2c 20 70 6f 77 65 72 46 75  8,    0, powerFu
b3e0: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69  nc  },.    { "si
b3f0: 67 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  gn",            
b400: 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f     1, 0, SQLITE_
b410: 55 54 46 38 2c 20 20 20 20 30 2c 20 73 69 67 6e  UTF8,    0, sign
b420: 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 73  Func },.    { "s
b430: 71 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  qrt",           
b440: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
b450: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73 71 72  _UTF8,    0, sqr
b460: 74 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  tFunc },.    { "
b470: 73 71 75 61 72 65 22 2c 20 20 20 20 20 20 20 20  square",        
b480: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
b490: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73 71  E_UTF8,    0, sq
b4a0: 75 61 72 65 46 75 6e 63 20 7d 2c 0a 0a 20 20 20  uareFunc },..   
b4b0: 20 7b 20 22 63 65 69 6c 22 2c 20 20 20 20 20 20   { "ceil",      
b4c0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
b4d0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
b4e0: 2c 20 63 65 69 6c 46 75 6e 63 20 7d 2c 0a 20 20  , ceilFunc },.  
b4f0: 20 20 7b 20 22 63 65 69 6c 69 6e 67 22 2c 20 20    { "ceiling",  
b500: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
b510: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
b520: 30 2c 20 63 65 69 6c 46 75 6e 63 20 7d 2c 0a 20  0, ceilFunc },. 
b530: 20 20 20 7b 20 22 66 6c 6f 6f 72 22 2c 20 20 20     { "floor",   
b540: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
b550: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
b560: 20 30 2c 20 66 6c 6f 6f 72 46 75 6e 63 20 7d 2c   0, floorFunc },
b570: 0a 0a 20 20 20 20 7b 20 22 70 69 22 2c 20 20 20  ..    { "pi",   
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
b590: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
b5a0: 20 20 20 20 30 2c 20 70 69 46 75 6e 63 20 7d 2c      0, piFunc },
b5b0: 0a 20 20 20 20 7b 20 22 6c 61 73 74 5f 72 6f 77  .    { "last_row
b5c0: 73 5f 61 66 66 65 63 74 65 64 22 2c 20 30 2c 20  s_affected", 0, 
b5d0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
b5e0: 20 20 20 30 2c 20 6c 61 73 74 52 6f 77 73 46 75     0, lastRowsFu
b5f0: 6e 63 20 7d 2c 0a 0a 20 20 20 20 2f 2a 20 73 74  nc },..    /* st
b600: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7b 20 22 72  ring */.    { "r
b610: 65 70 6c 69 63 61 74 65 22 2c 20 20 20 20 20 20  eplicate",      
b620: 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45      2, 0, SQLITE
b630: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 72 65 70  _UTF8,    0, rep
b640: 6c 69 63 61 74 65 46 75 6e 63 20 7d 2c 0a 20 20  licateFunc },.  
b650: 20 20 7b 20 22 63 68 61 72 69 6e 64 65 78 22 2c    { "charindex",
b660: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
b670: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
b680: 31 2c 20 63 68 61 72 69 6e 64 65 78 46 75 6e 63  1, charindexFunc
b690: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 68 61 72 69   },.    { "chari
b6a0: 6e 64 65 78 22 2c 20 20 20 20 20 20 20 20 20 20  ndex",          
b6b0: 33 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  3, 0, SQLITE_UTF
b6c0: 38 2c 20 20 20 20 31 2c 20 63 68 61 72 69 6e 64  8,    1, charind
b6d0: 65 78 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  exFunc },.    { 
b6e0: 22 6c 65 66 74 73 74 72 22 2c 20 20 20 20 20 20  "leftstr",      
b6f0: 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49        2, 0, SQLI
b700: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 6c  TE_UTF8,    0, l
b710: 65 66 74 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  eftFunc },.    {
b720: 20 22 72 69 67 68 74 73 74 72 22 2c 20 20 20 20   "rightstr",    
b730: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c         2, 0, SQL
b740: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
b750: 72 69 67 68 74 46 75 6e 63 20 7d 2c 0a 23 69 66  rightFunc },.#if
b760: 6e 64 65 66 20 48 41 56 45 5f 54 52 49 4d 0a 20  ndef HAVE_TRIM. 
b770: 20 20 20 7b 20 22 6c 74 72 69 6d 22 2c 20 20 20     { "ltrim",   
b780: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
b790: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
b7a0: 20 30 2c 20 6c 74 72 69 6d 46 75 6e 63 20 7d 2c   0, ltrimFunc },
b7b0: 0a 20 20 20 20 7b 20 22 72 74 72 69 6d 22 2c 20  .    { "rtrim", 
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
b7d0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
b7e0: 20 20 20 30 2c 20 72 74 72 69 6d 46 75 6e 63 20     0, rtrimFunc 
b7f0: 7d 2c 0a 20 20 20 20 7b 20 22 74 72 69 6d 22 2c  },.    { "trim",
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
b810: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
b820: 2c 20 20 20 20 30 2c 20 74 72 69 6d 46 75 6e 63  ,    0, trimFunc
b830: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 70 6c 61   },.    { "repla
b840: 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ce",            
b850: 33 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  3, 0, SQLITE_UTF
b860: 38 2c 20 20 20 20 30 2c 20 72 65 70 6c 61 63 65  8,    0, replace
b870: 46 75 6e 63 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  Func },.#endif. 
b880: 20 20 20 7b 20 22 72 65 76 65 72 73 65 22 2c 20     { "reverse", 
b890: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
b8a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
b8b0: 20 30 2c 20 72 65 76 65 72 73 65 46 75 6e 63 20   0, reverseFunc 
b8c0: 7d 2c 0a 20 20 20 20 7b 20 22 70 72 6f 70 65 72  },.    { "proper
b8d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ",             1
b8e0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
b8f0: 2c 20 20 20 20 30 2c 20 70 72 6f 70 65 72 46 75  ,    0, properFu
b900: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 70 61 64  nc },.    { "pad
b910: 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
b920: 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    2, 0, SQLITE_U
b930: 54 46 38 2c 20 20 20 20 30 2c 20 70 61 64 6c 46  TF8,    0, padlF
b940: 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 70 61  unc },.    { "pa
b950: 64 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  dr",            
b960: 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f     2, 0, SQLITE_
b970: 55 54 46 38 2c 20 20 20 20 30 2c 20 70 61 64 72  UTF8,    0, padr
b980: 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 70  Func },.    { "p
b990: 61 64 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  adc",           
b9a0: 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45      2, 0, SQLITE
b9b0: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 70 61 64  _UTF8,    0, pad
b9c0: 63 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  cFunc },.    { "
b9d0: 73 74 72 66 69 6c 74 65 72 22 2c 20 20 20 20 20  strfilter",     
b9e0: 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54       2, 0, SQLIT
b9f0: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73 74  E_UTF8,    0, st
ba00: 72 66 69 6c 74 65 72 46 75 6e 63 20 7d 2c 0a 0a  rfilterFunc },..
ba10: 20 20 7d 3b 0a 20 20 2f 2a 20 41 67 67 72 65 67    };.  /* Aggreg
ba20: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
ba30: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
ba40: 73 74 72 75 63 74 20 46 75 6e 63 44 65 66 41 67  struct FuncDefAg
ba50: 67 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  g {.    char *zN
ba60: 61 6d 65 3b 0a 20 20 20 20 73 69 67 6e 65 64 20  ame;.    signed 
ba70: 63 68 61 72 20 6e 41 72 67 3b 0a 20 20 20 20 75  char nArg;.    u
ba80: 38 20 61 72 67 54 79 70 65 3b 0a 20 20 20 20 75  8 argType;.    u
ba90: 38 20 6e 65 65 64 43 6f 6c 6c 53 65 71 3b 0a 20  8 needCollSeq;. 
baa0: 20 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29     void (*xStep)
bab0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
bac0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
bad0: 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 76 6f 69 64  lue**);.    void
bae0: 20 28 2a 78 46 69 6e 61 6c 69 7a 65 29 28 73 71   (*xFinalize)(sq
baf0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b  lite3_context*);
bb00: 0a 20 20 7d 20 61 41 67 67 73 5b 5d 20 3d 20 7b  .  } aAggs[] = {
bb10: 0a 20 20 20 20 7b 20 22 73 74 64 65 76 22 2c 20  .    { "stdev", 
bb20: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
bb30: 20 30 2c 20 76 61 72 69 61 6e 63 65 53 74 65 70   0, varianceStep
bb40: 2c 20 73 74 64 65 76 46 69 6e 61 6c 69 7a 65 20  , stdevFinalize 
bb50: 20 7d 2c 0a 20 20 20 20 7b 20 22 76 61 72 69 61   },.    { "varia
bb60: 6e 63 65 22 2c 20 20 20 20 20 20 20 20 20 31 2c  nce",         1,
bb70: 20 30 2c 20 30 2c 20 76 61 72 69 61 6e 63 65 53   0, 0, varianceS
bb80: 74 65 70 2c 20 76 61 72 69 61 6e 63 65 46 69 6e  tep, varianceFin
bb90: 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 20 20 7b 20  alize  },.    { 
bba0: 22 6d 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20  "mode",         
bbb0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6d 6f 64      1, 0, 0, mod
bbc0: 65 53 74 65 70 2c 20 20 20 20 20 6d 6f 64 65 46  eStep,     modeF
bbd0: 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 20 20  inalize  },.    
bbe0: 7b 20 22 6d 65 64 69 61 6e 22 2c 20 20 20 20 20  { "median",     
bbf0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6d        1, 0, 0, m
bc00: 6f 64 65 53 74 65 70 2c 20 20 20 20 20 6d 65 64  odeStep,     med
bc10: 69 61 6e 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a  ianFinalize  },.
bc20: 20 20 20 20 7b 20 22 6c 6f 77 65 72 5f 71 75 61      { "lower_qua
bc30: 72 74 69 6c 65 22 2c 20 20 20 31 2c 20 30 2c 20  rtile",   1, 0, 
bc40: 30 2c 20 6d 6f 64 65 53 74 65 70 2c 20 20 20 20  0, modeStep,    
bc50: 20 6c 6f 77 65 72 5f 71 75 61 72 74 69 6c 65 46   lower_quartileF
bc60: 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 20 20  inalize  },.    
bc70: 7b 20 22 75 70 70 65 72 5f 71 75 61 72 74 69 6c  { "upper_quartil
bc80: 65 22 2c 20 20 20 31 2c 20 30 2c 20 30 2c 20 6d  e",   1, 0, 0, m
bc90: 6f 64 65 53 74 65 70 2c 20 20 20 20 20 75 70 70  odeStep,     upp
bca0: 65 72 5f 71 75 61 72 74 69 6c 65 46 69 6e 61 6c  er_quartileFinal
bcb0: 69 7a 65 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  ize  },.  };.  i
bcc0: 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  nt i;..  for(i=0
bcd0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63  ; i<sizeof(aFunc
bce0: 73 29 2f 73 69 7a 65 6f 66 28 61 46 75 6e 63 73  s)/sizeof(aFuncs
bcf0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
bd00: 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a  void *pArg = 0;.
bd10: 20 20 20 20 73 77 69 74 63 68 28 20 61 46 75 6e      switch( aFun
bd20: 63 73 5b 69 5d 2e 61 72 67 54 79 70 65 20 29 7b  cs[i].argType ){
bd30: 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 70  .      case 1: p
bd40: 41 72 67 20 3d 20 64 62 3b 20 62 72 65 61 6b 3b  Arg = db; break;
bd50: 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 70  .      case 2: p
bd60: 41 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 28 2d  Arg = (void *)(-
bd70: 31 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  1); break;.    }
bd80: 0a 20 20 20 20 2f 2f 73 71 6c 69 74 65 33 43 72  .    //sqlite3Cr
bd90: 65 61 74 65 46 75 6e 63 0a 20 20 20 20 2f 2a 20  eateFunc.    /* 
bda0: 4c 4d 48 20 6e 6f 20 65 72 72 6f 72 20 63 68 65  LMH no error che
bdb0: 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 73 71 6c  cking */.    sql
bdc0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
bdd0: 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73 5b  tion(db, aFuncs[
bde0: 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 73  i].zName, aFuncs
bdf0: 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20  [i].nArg,.      
be00: 20 20 61 46 75 6e 63 73 5b 69 5d 2e 65 54 65 78    aFuncs[i].eTex
be10: 74 52 65 70 2c 20 70 41 72 67 2c 20 61 46 75 6e  tRep, pArg, aFun
be20: 63 73 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 2c 20  cs[i].xFunc, 0, 
be30: 30 29 3b 0a 23 69 66 20 31 0a 20 20 20 20 69 66  0);.#if 1.    if
be40: 28 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 65 65 64  ( aFuncs[i].need
be50: 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
be60: 20 73 74 72 75 63 74 20 46 75 6e 63 44 65 66 20   struct FuncDef 
be70: 2a 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  *pFunc = sqlite3
be80: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
be90: 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65   aFuncs[i].zName
bea0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  , .          str
beb0: 6c 65 6e 28 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e  len(aFuncs[i].zN
bec0: 61 6d 65 29 2c 20 61 46 75 6e 63 73 5b 69 5d 2e  ame), aFuncs[i].
bed0: 6e 41 72 67 2c 20 61 46 75 6e 63 73 5b 69 5d 2e  nArg, aFuncs[i].
bee0: 65 54 65 78 74 52 65 70 2c 20 30 29 3b 0a 20 20  eTextRep, 0);.  
bef0: 20 20 20 20 69 66 28 20 70 46 75 6e 63 20 26 26      if( pFunc &&
bf00: 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 65 65 64 43   aFuncs[i].needC
bf10: 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
bf20: 20 20 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c    pFunc->needCol
bf30: 6c 53 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  lSeq = 1;.      
bf40: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
bf50: 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   }..  for(i=0; i
bf60: 3c 73 69 7a 65 6f 66 28 61 41 67 67 73 29 2f 73  <sizeof(aAggs)/s
bf70: 69 7a 65 6f 66 28 61 41 67 67 73 5b 30 5d 29 3b  izeof(aAggs[0]);
bf80: 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20   i++){.    void 
bf90: 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 73  *pArg = 0;.    s
bfa0: 77 69 74 63 68 28 20 61 41 67 67 73 5b 69 5d 2e  witch( aAggs[i].
bfb0: 61 72 67 54 79 70 65 20 29 7b 0a 20 20 20 20 20  argType ){.     
bfc0: 20 63 61 73 65 20 31 3a 20 70 41 72 67 20 3d 20   case 1: pArg = 
bfd0: 64 62 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  db; break;.     
bfe0: 20 63 61 73 65 20 32 3a 20 70 41 72 67 20 3d 20   case 2: pArg = 
bff0: 28 76 6f 69 64 20 2a 29 28 2d 31 29 3b 20 62 72  (void *)(-1); br
c000: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  eak;.    }.    /
c010: 2f 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75  /sqlite3CreateFu
c020: 6e 63 0a 20 20 20 20 2f 2a 20 4c 4d 48 20 6e 6f  nc.    /* LMH no
c030: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
c040: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  */.    sqlite3_c
c050: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
c060: 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d  b, aAggs[i].zNam
c070: 65 2c 20 61 41 67 67 73 5b 69 5d 2e 6e 41 72 67  e, aAggs[i].nArg
c080: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
c090: 20 20 20 20 20 20 20 20 70 41 72 67 2c 20 30 2c          pArg, 0,
c0a0: 20 61 41 67 67 73 5b 69 5d 2e 78 53 74 65 70 2c   aAggs[i].xStep,
c0b0: 20 61 41 67 67 73 5b 69 5d 2e 78 46 69 6e 61 6c   aAggs[i].xFinal
c0c0: 69 7a 65 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  ize);.#if 0.    
c0d0: 69 66 28 20 61 41 67 67 73 5b 69 5d 2e 6e 65 65  if( aAggs[i].nee
c0e0: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
c0f0: 20 20 73 74 72 75 63 74 20 46 75 6e 63 44 65 66    struct FuncDef
c100: 41 67 67 20 2a 70 46 75 6e 63 20 3d 20 73 71 6c  Agg *pFunc = sql
c110: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
c120: 28 20 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a  ( db, aAggs[i].z
c130: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
c140: 73 74 72 6c 65 6e 28 61 41 67 67 73 5b 69 5d 2e  strlen(aAggs[i].
c150: 7a 4e 61 6d 65 29 2c 20 61 41 67 67 73 5b 69 5d  zName), aAggs[i]
c160: 2e 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54  .nArg, SQLITE_UT
c170: 46 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  F8, 0);.      if
c180: 28 20 70 46 75 6e 63 20 26 26 20 61 41 67 67 73  ( pFunc && aAggs
c190: 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  [i].needCollSeq 
c1a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  ){.        pFunc
c1b0: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d 20  ->needCollSeq = 
c1c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
c1d0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
c1e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
c1f0: 66 20 43 4f 4d 50 49 4c 45 5f 53 51 4c 49 54 45  f COMPILE_SQLITE
c200: 5f 45 58 54 45 4e 53 49 4f 4e 53 5f 41 53 5f 4c  _EXTENSIONS_AS_L
c210: 4f 41 44 41 42 4c 45 5f 4d 4f 44 55 4c 45 0a 69  OADABLE_MODULE.i
c220: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
c230: 73 69 6f 6e 5f 69 6e 69 74 28 0a 20 20 20 20 73  sion_init(.    s
c240: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72  qlite3 *db, char
c250: 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 63 6f 6e   **pzErrMsg, con
c260: 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
c270: 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 29 7b 0a  outines *pApi){.
c280: 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
c290: 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
c2a0: 20 20 52 65 67 69 73 74 65 72 45 78 74 65 6e 73    RegisterExtens
c2b0: 69 6f 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  ionFunctions(db)
c2c0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
c2d0: 23 65 6e 64 69 66 20 2f 2a 20 43 4f 4d 50 49 4c  #endif /* COMPIL
c2e0: 45 5f 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49  E_SQLITE_EXTENSI
c2f0: 4f 4e 53 5f 41 53 5f 4c 4f 41 44 41 42 4c 45 5f  ONS_AS_LOADABLE_
c300: 4d 4f 44 55 4c 45 20 2a 2f 0a 0a 6d 61 70 20 6d  MODULE */..map m
c310: 61 70 5f 6d 61 6b 65 28 63 6d 70 5f 66 75 6e 63  ap_make(cmp_func
c320: 20 63 6d 70 29 7b 0a 20 20 6d 61 70 20 72 3b 0a   cmp){.  map r;.
c330: 20 20 72 2e 63 6d 70 3d 63 6d 70 3b 0a 20 20 72    r.cmp=cmp;.  r
c340: 2e 62 61 73 65 20 3d 20 30 3b 0a 0a 20 20 72 65  .base = 0;..  re
c350: 74 75 72 6e 20 72 3b 0a 7d 0a 0a 76 6f 69 64 2a  turn r;.}..void*
c360: 20 78 63 61 6c 6c 6f 63 28 73 69 7a 65 5f 74 20   xcalloc(size_t 
c370: 6e 6d 65 6d 62 2c 20 73 69 7a 65 5f 74 20 73 69  nmemb, size_t si
c380: 7a 65 2c 20 63 68 61 72 2a 20 73 29 7b 0a 20 20  ze, char* s){.  
c390: 76 6f 69 64 2a 20 72 65 74 20 3d 20 63 61 6c 6c  void* ret = call
c3a0: 6f 63 28 6e 6d 65 6d 62 2c 20 73 69 7a 65 29 3b  oc(nmemb, size);
c3b0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
c3c0: 0a 0a 76 6f 69 64 20 78 66 72 65 65 28 76 6f 69  ..void xfree(voi
c3d0: 64 2a 20 70 29 7b 0a 20 20 66 72 65 65 28 70 29  d* p){.  free(p)
c3e0: 3b 0a 7d 0a 0a 76 6f 69 64 20 6e 6f 64 65 5f 69  ;.}..void node_i
c3f0: 6e 73 65 72 74 28 6e 6f 64 65 2a 2a 20 6e 2c 20  nsert(node** n, 
c400: 63 6d 70 5f 66 75 6e 63 20 63 6d 70 2c 20 76 6f  cmp_func cmp, vo
c410: 69 64 20 2a 65 29 7b 0a 20 20 69 6e 74 20 63 3b  id *e){.  int c;
c420: 0a 20 20 6e 6f 64 65 2a 20 6e 6e 3b 0a 20 20 69  .  node* nn;.  i
c430: 66 28 2a 6e 3d 3d 30 29 7b 0a 20 20 20 20 6e 6e  f(*n==0){.    nn
c440: 20 3d 20 28 6e 6f 64 65 2a 29 78 63 61 6c 6c 6f   = (node*)xcallo
c450: 63 28 31 2c 73 69 7a 65 6f 66 28 6e 6f 64 65 29  c(1,sizeof(node)
c460: 2c 20 22 66 6f 72 20 6e 6f 64 65 22 29 3b 0a 20  , "for node");. 
c470: 20 20 20 6e 6e 2d 3e 64 61 74 61 20 3d 20 65 3b     nn->data = e;
c480: 0a 20 20 20 20 6e 6e 2d 3e 63 6f 75 6e 74 20 3d  .    nn->count =
c490: 20 31 3b 0a 20 20 20 20 2a 6e 3d 6e 6e 3b 0a 20   1;.    *n=nn;. 
c4a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 3d 63 6d   }else{.    c=cm
c4b0: 70 28 28 2a 6e 29 2d 3e 64 61 74 61 2c 65 29 3b  p((*n)->data,e);
c4c0: 0a 20 20 20 20 69 66 28 30 3d 3d 63 29 7b 0a 20  .    if(0==c){. 
c4d0: 20 20 20 20 20 2b 2b 28 28 2a 6e 29 2d 3e 63 6f       ++((*n)->co
c4e0: 75 6e 74 29 3b 0a 20 20 20 20 20 20 78 66 72 65  unt);.      xfre
c4f0: 65 28 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  e(e);.    }else 
c500: 69 66 28 63 3e 30 29 7b 0a 20 20 20 20 20 20 2f  if(c>0){.      /
c510: 2a 20 70 75 74 20 69 74 20 72 69 67 68 74 20 68  * put it right h
c520: 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 6e 6f 64  ere */.      nod
c530: 65 5f 69 6e 73 65 72 74 28 26 28 28 2a 6e 29 2d  e_insert(&((*n)-
c540: 3e 6c 29 2c 20 63 6d 70 2c 20 65 29 3b 0a 20 20  >l), cmp, e);.  
c550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
c560: 6f 64 65 5f 69 6e 73 65 72 74 28 26 28 28 2a 6e  ode_insert(&((*n
c570: 29 2d 3e 72 29 2c 20 63 6d 70 2c 20 65 29 3b 0a  )->r), cmp, e);.
c580: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 76 6f 69      }.  }.}..voi
c590: 64 20 6d 61 70 5f 69 6e 73 65 72 74 28 6d 61 70  d map_insert(map
c5a0: 20 2a 6d 2c 20 76 6f 69 64 20 2a 65 29 7b 0a 20   *m, void *e){. 
c5b0: 20 6e 6f 64 65 5f 69 6e 73 65 72 74 28 26 28 6d   node_insert(&(m
c5c0: 2d 3e 62 61 73 65 29 2c 20 6d 2d 3e 63 6d 70 2c  ->base), m->cmp,
c5d0: 20 65 29 3b 0a 7d 0a 0a 76 6f 69 64 20 6e 6f 64   e);.}..void nod
c5e0: 65 5f 69 74 65 72 61 74 65 28 6e 6f 64 65 20 2a  e_iterate(node *
c5f0: 6e 2c 20 6d 61 70 5f 69 74 65 72 61 74 6f 72 20  n, map_iterator 
c600: 69 74 65 72 2c 20 76 6f 69 64 2a 20 70 29 7b 0a  iter, void* p){.
c610: 20 20 69 66 28 6e 29 7b 0a 20 20 20 20 69 66 28    if(n){.    if(
c620: 6e 2d 3e 6c 29 0a 20 20 20 20 20 20 6e 6f 64 65  n->l).      node
c630: 5f 69 74 65 72 61 74 65 28 6e 2d 3e 6c 2c 20 69  _iterate(n->l, i
c640: 74 65 72 2c 20 70 29 3b 0a 20 20 20 20 69 74 65  ter, p);.    ite
c650: 72 28 6e 2d 3e 64 61 74 61 2c 20 6e 2d 3e 63 6f  r(n->data, n->co
c660: 75 6e 74 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  unt, p);.    if(
c670: 6e 2d 3e 72 29 0a 20 20 20 20 20 20 6e 6f 64 65  n->r).      node
c680: 5f 69 74 65 72 61 74 65 28 6e 2d 3e 72 2c 20 69  _iterate(n->r, i
c690: 74 65 72 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ter, p);.  }.}..
c6a0: 76 6f 69 64 20 6d 61 70 5f 69 74 65 72 61 74 65  void map_iterate
c6b0: 28 6d 61 70 20 2a 6d 2c 20 6d 61 70 5f 69 74 65  (map *m, map_ite
c6c0: 72 61 74 6f 72 20 69 74 65 72 2c 20 76 6f 69 64  rator iter, void
c6d0: 2a 20 70 29 7b 0a 20 20 6e 6f 64 65 5f 69 74 65  * p){.  node_ite
c6e0: 72 61 74 65 28 6d 2d 3e 62 61 73 65 2c 20 69 74  rate(m->base, it
c6f0: 65 72 2c 20 70 29 3b 0a 7d 0a 0a 76 6f 69 64 20  er, p);.}..void 
c700: 6e 6f 64 65 5f 64 65 73 74 72 6f 79 28 6e 6f 64  node_destroy(nod
c710: 65 20 2a 6e 29 7b 0a 20 20 69 66 28 30 21 3d 6e  e *n){.  if(0!=n
c720: 29 7b 0a 20 20 20 20 78 66 72 65 65 28 6e 2d 3e  ){.    xfree(n->
c730: 64 61 74 61 29 3b 0a 20 20 20 20 69 66 28 6e 2d  data);.    if(n-
c740: 3e 6c 29 0a 20 20 20 20 20 20 6e 6f 64 65 5f 64  >l).      node_d
c750: 65 73 74 72 6f 79 28 6e 2d 3e 6c 29 3b 0a 20 20  estroy(n->l);.  
c760: 20 20 69 66 28 6e 2d 3e 72 29 0a 20 20 20 20 20    if(n->r).     
c770: 20 6e 6f 64 65 5f 64 65 73 74 72 6f 79 28 6e 2d   node_destroy(n-
c780: 3e 72 29 3b 0a 0a 20 20 20 20 78 66 72 65 65 28  >r);..    xfree(
c790: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20  n);.  }.}..void 
c7a0: 6d 61 70 5f 64 65 73 74 72 6f 79 28 6d 61 70 20  map_destroy(map 
c7b0: 2a 6d 29 7b 0a 20 20 6e 6f 64 65 5f 64 65 73 74  *m){.  node_dest
c7c0: 72 6f 79 28 6d 2d 3e 62 61 73 65 29 3b 0a 7d 0a  roy(m->base);.}.
c7d0: 0a 69 6e 74 20 69 6e 74 5f 63 6d 70 28 63 6f 6e  .int int_cmp(con
c7e0: 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73  st void *a, cons
c7f0: 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 69 6e  t void *b){.  in
c800: 74 36 34 5f 74 20 61 61 20 3d 20 2a 28 69 6e 74  t64_t aa = *(int
c810: 36 34 5f 74 20 2a 29 28 61 29 3b 0a 20 20 69 6e  64_t *)(a);.  in
c820: 74 36 34 5f 74 20 62 62 20 3d 20 2a 28 69 6e 74  t64_t bb = *(int
c830: 36 34 5f 74 20 2a 29 28 62 29 3b 0a 20 20 2f 2a  64_t *)(b);.  /*
c840: 20 70 72 69 6e 74 66 28 22 63 6d 70 20 25 64 20   printf("cmp %d 
c850: 3c 3d 3e 20 25 64 5c 6e 22 2c 61 61 2c 62 62 29  <=> %d\n",aa,bb)
c860: 3b 20 2a 2f 0a 20 20 69 66 28 61 61 3d 3d 62 62  ; */.  if(aa==bb
c870: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ).    return 0;.
c880: 20 20 65 6c 73 65 20 69 66 28 61 61 3c 62 62 29    else if(aa<bb)
c890: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
c8a0: 20 20 65 6c 73 65 0a 20 20 20 20 72 65 74 75 72    else.    retur
c8b0: 6e 20 31 3b 0a 7d 0a 0a 69 6e 74 20 64 6f 75 62  n 1;.}..int doub
c8c0: 6c 65 5f 63 6d 70 28 63 6f 6e 73 74 20 76 6f 69  le_cmp(const voi
c8d0: 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *a, const void
c8e0: 20 2a 62 29 7b 0a 20 20 64 6f 75 62 6c 65 20 61   *b){.  double a
c8f0: 61 20 3d 20 2a 28 64 6f 75 62 6c 65 20 2a 29 28  a = *(double *)(
c900: 61 29 3b 0a 20 20 64 6f 75 62 6c 65 20 62 62 20  a);.  double bb 
c910: 3d 20 2a 28 64 6f 75 62 6c 65 20 2a 29 28 62 29  = *(double *)(b)
c920: 3b 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 63  ;.  /* printf("c
c930: 6d 70 20 25 64 20 3c 3d 3e 20 25 64 5c 6e 22 2c  mp %d <=> %d\n",
c940: 61 61 2c 62 62 29 3b 20 2a 2f 0a 20 20 69 66 28  aa,bb); */.  if(
c950: 61 61 3d 3d 62 62 29 0a 20 20 20 20 72 65 74 75  aa==bb).    retu
c960: 72 6e 20 30 3b 0a 20 20 65 6c 73 65 20 69 66 28  rn 0;.  else if(
c970: 61 61 3c 62 62 29 0a 20 20 20 20 72 65 74 75 72  aa<bb).    retur
c980: 6e 20 2d 31 3b 0a 20 20 65 6c 73 65 0a 20 20 20  n -1;.  else.   
c990: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 76 6f   return 1;.}..vo
c9a0: 69 64 20 70 72 69 6e 74 5f 65 6c 65 6d 28 76 6f  id print_elem(vo
c9b0: 69 64 20 2a 65 2c 20 69 6e 74 36 34 5f 74 20 63  id *e, int64_t c
c9c0: 2c 20 76 6f 69 64 2a 20 70 29 7b 0a 20 20 69 6e  , void* p){.  in
c9d0: 74 20 65 65 20 3d 20 2a 28 69 6e 74 2a 29 28 65  t ee = *(int*)(e
c9e0: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 64 20  );.  printf("%d 
c9f0: 3d 3e 20 25 6c 6c 64 5c 6e 22 2c 20 65 65 2c 63  => %lld\n", ee,c
ca00: 29 3b 0a 7d 0a 0a                                );.}..