/ Hex Artifact Content
Login

Artifact 5b4d9707b0c8f463824c1f04547b524cba24bf7b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 32 20 46 65 62 72 75  /*.** 2002 Febru
0010: 61 72 79 20 32 33 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 23.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
0190: 43 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  C functions that
01a0: 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
01b0: 75 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69  us SQL.** functi
01c0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 20 20  ons of SQLite.  
01d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
01e0: 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72 74 65  only one exporte
01f0: 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  d symbol in this
0200: 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75 6e 63   file - the func
0210: 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65 52 65  tion.** sqliteRe
0220: 67 69 73 74 65 72 42 75 69 6c 64 69 6e 46 75 6e  gisterBuildinFun
0230: 63 74 69 6f 6e 73 28 29 20 66 6f 75 6e 64 20 61  ctions() found a
0240: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
0250: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 41 6c 6c  the file..** All
0260: 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
0270: 66 69 6c 65 20 73 63 6f 70 65 2e 0a 2a 2a 0a 2a  file scope..**.*
0280: 2a 20 24 49 64 3a 20 66 75 6e 63 2e 63 2c 76 20  * $Id: func.c,v 
0290: 31 2e 31 33 20 32 30 30 32 2f 30 33 2f 30 32 20  1.13 2002/03/02 
02a0: 31 39 3a 30 30 3a 33 31 20 64 72 68 20 45 78 70  19:00:31 drh Exp
02b0: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c   $.*/.#include <
02c0: 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  ctype.h>.#includ
02d0: 65 20 3c 6d 61 74 68 2e 68 3e 0a 23 69 6e 63 6c  e <math.h>.#incl
02e0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
02f0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
0300: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  h>.#include "sql
0310: 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  iteInt.h"../*.**
0320: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
0330: 6f 66 20 74 68 65 20 6e 6f 6e 2d 61 67 67 72 65  of the non-aggre
0340: 67 61 74 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d  gate min() and m
0350: 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  ax() functions.*
0360: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69  /.static void mi
0370: 6e 46 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e  nFunc(sqlite_fun
0380: 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  c *context, int 
0390: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
03a0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73   **argv){.  cons
03b0: 74 20 63 68 61 72 20 2a 7a 42 65 73 74 3b 20 0a  t char *zBest; .
03c0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
03d0: 61 72 67 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  argc==0 ) return
03e0: 3b 0a 20 20 7a 42 65 73 74 20 3d 20 61 72 67 76  ;.  zBest = argv
03f0: 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  [0];.  for(i=1; 
0400: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
0410: 20 20 69 66 28 20 73 71 6c 69 74 65 43 6f 6d 70    if( sqliteComp
0420: 61 72 65 28 61 72 67 76 5b 69 5d 2c 20 7a 42 65  are(argv[i], zBe
0430: 73 74 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 7a  st)<0 ){.      z
0440: 42 65 73 74 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  Best = argv[i];.
0450: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
0460: 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74  te_set_result_st
0470: 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a 42  ring(context, zB
0480: 65 73 74 2c 20 2d 31 29 3b 0a 7d 0a 73 74 61 74  est, -1);.}.stat
0490: 69 63 20 76 6f 69 64 20 6d 61 78 46 75 6e 63 28  ic void maxFunc(
04a0: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e  sqlite_func *con
04b0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
04c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
04d0: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v){.  const char
04e0: 20 2a 7a 42 65 73 74 3b 20 0a 20 20 69 6e 74 20   *zBest; .  int 
04f0: 69 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  i;..  if( argc==
0500: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 42  0 ) return;.  zB
0510: 65 73 74 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20  est = argv[0];. 
0520: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
0530: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
0540: 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 61 72  sqliteCompare(ar
0550: 67 76 5b 69 5d 2c 20 7a 42 65 73 74 29 3e 30 20  gv[i], zBest)>0 
0560: 29 7b 0a 20 20 20 20 20 20 7a 42 65 73 74 20 3d  ){.      zBest =
0570: 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 7d 0a   argv[i];.    }.
0580: 20 20 7d 0a 20 20 73 71 6c 69 74 65 5f 73 65 74    }.  sqlite_set
0590: 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28 63  _result_string(c
05a0: 6f 6e 74 65 78 74 2c 20 7a 42 65 73 74 2c 20 2d  ontext, zBest, -
05b0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  1);.}../*.** Imp
05c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
05d0: 68 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e 63  he length() func
05e0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
05f0: 6f 69 64 20 6c 65 6e 67 74 68 46 75 6e 63 28 73  oid lengthFunc(s
0600: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74  qlite_func *cont
0610: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  ext, int argc, c
0620: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
0630: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
0640: 2a 7a 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a  *z;.  int len;..
0650: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
0660: 31 20 29 3b 0a 20 20 7a 20 3d 20 61 72 67 76 5b  1 );.  z = argv[
0670: 30 5d 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  0];.  if( z==0 )
0680: 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  {.    len = 0;. 
0690: 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
06a0: 51 4c 49 54 45 5f 55 54 46 38 0a 20 20 20 20 66  QLITE_UTF8.    f
06b0: 6f 72 28 6c 65 6e 3d 30 3b 20 2a 7a 3b 20 7a 2b  or(len=0; *z; z+
06c0: 2b 29 7b 20 69 66 28 20 28 30 78 63 30 26 2a 7a  +){ if( (0xc0&*z
06d0: 29 21 3d 30 78 38 30 20 29 20 6c 65 6e 2b 2b 3b  )!=0x80 ) len++;
06e0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 6c 65 6e   }.#else.    len
06f0: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 23 65   = strlen(z);.#e
0700: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
0710: 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74  e_set_result_int
0720: 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e 29 3b 0a  (context, len);.
0730: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
0740: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61  ntation of the a
0750: 62 73 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f  bs() function.*/
0760: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 62 73  .static void abs
0770: 46 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e 63  Func(sqlite_func
0780: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
0790: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
07a0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
07b0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 61 73 73 65   char *z;.  asse
07c0: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
07d0: 20 7a 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20   z = argv[0];.  
07e0: 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d 3d 3d 27  if( z && z[0]=='
07f0: 2d 27 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b  -' && isdigit(z[
0800: 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 73 71 6c  1]) ) z++;.  sql
0810: 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73  ite_set_result_s
0820: 74 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a  tring(context, z
0830: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
0840: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
0850: 66 20 74 68 65 20 73 75 62 73 74 72 28 29 20 66  f the substr() f
0860: 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  unction.*/.stati
0870: 63 20 76 6f 69 64 20 73 75 62 73 74 72 46 75 6e  c void substrFun
0880: 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63  c(sqlite_func *c
0890: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
08a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  , const char **a
08b0: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  rgv){.  const ch
08c0: 61 72 20 2a 7a 3b 0a 23 69 66 64 65 66 20 53 51  ar *z;.#ifdef SQ
08d0: 4c 49 54 45 5f 55 54 46 38 0a 20 20 63 6f 6e 73  LITE_UTF8.  cons
08e0: 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e  t char *z2;.  in
08f0: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e  t i;.#endif.  in
0900: 74 20 70 31 2c 20 70 32 2c 20 6c 65 6e 3b 0a 20  t p1, p2, len;. 
0910: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33   assert( argc==3
0920: 20 29 3b 0a 20 20 7a 20 3d 20 61 72 67 76 5b 30   );.  z = argv[0
0930: 5d 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  ];.  if( z==0 ) 
0940: 72 65 74 75 72 6e 3b 0a 20 20 70 31 20 3d 20 61  return;.  p1 = a
0950: 74 6f 69 28 61 72 67 76 5b 31 5d 3f 61 72 67 76  toi(argv[1]?argv
0960: 5b 31 5d 3a 30 29 3b 0a 20 20 70 32 20 3d 20 61  [1]:0);.  p2 = a
0970: 74 6f 69 28 61 72 67 76 5b 32 5d 3f 61 72 67 76  toi(argv[2]?argv
0980: 5b 32 5d 3a 30 29 3b 0a 23 69 66 64 65 66 20 53  [2]:0);.#ifdef S
0990: 51 4c 49 54 45 5f 55 54 46 38 0a 20 20 66 6f 72  QLITE_UTF8.  for
09a0: 28 6c 65 6e 3d 30 2c 20 7a 32 3d 7a 3b 20 2a 7a  (len=0, z2=z; *z
09b0: 32 3b 20 7a 32 2b 2b 29 7b 20 69 66 28 20 28 30  2; z2++){ if( (0
09c0: 78 63 30 26 2a 7a 32 29 21 3d 30 78 38 30 20 29  xc0&*z2)!=0x80 )
09d0: 20 6c 65 6e 2b 2b 3b 20 7d 0a 23 65 6c 73 65 0a   len++; }.#else.
09e0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
09f0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
0a00: 70 31 3c 30 20 29 7b 0a 20 20 20 20 70 31 20 2b  p1<0 ){.    p1 +
0a10: 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28 20 70  = len;.    if( p
0a20: 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20  1<0 ){.      p2 
0a30: 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 70 31 20  += p1;.      p1 
0a40: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
0a50: 73 65 20 69 66 28 20 70 31 3e 30 20 29 7b 0a 20  se if( p1>0 ){. 
0a60: 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 0a 20 20 69     p1--;.  }.  i
0a70: 66 28 20 70 31 2b 70 32 3e 6c 65 6e 20 29 7b 0a  f( p1+p2>len ){.
0a80: 20 20 20 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b      p2 = len-p1;
0a90: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
0aa0: 54 45 5f 55 54 46 38 0a 20 20 66 6f 72 28 69 3d  TE_UTF8.  for(i=
0ab0: 30 3b 20 69 3c 70 31 3b 20 69 2b 2b 29 7b 0a 20  0; i<p1; i++){. 
0ac0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 69 5d 20     assert( z[i] 
0ad0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 5b 69 5d  );.    if( (z[i]
0ae0: 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 70  &0xc0)==0x80 ) p
0af0: 31 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  1++;.  }.  while
0b00: 28 20 7a 5b 69 5d 20 26 26 20 28 7a 5b 69 5d 26  ( z[i] && (z[i]&
0b10: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 20 69  0xc0)==0x80 ){ i
0b20: 2b 2b 3b 20 70 31 2b 2b 3b 20 7d 0a 20 20 66 6f  ++; p1++; }.  fo
0b30: 72 28 3b 20 69 3c 70 31 2b 70 32 3b 20 69 2b 2b  r(; i<p1+p2; i++
0b40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ){.    assert( z
0b50: 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 28  [i] );.    if( (
0b60: 7a 5b 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30  z[i]&0xc0)==0x80
0b70: 20 29 20 70 32 2b 2b 3b 0a 20 20 7d 0a 20 20 77   ) p2++;.  }.  w
0b80: 68 69 6c 65 28 20 7a 5b 69 5d 20 26 26 20 28 7a  hile( z[i] && (z
0b90: 5b 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20  [i]&0xc0)==0x80 
0ba0: 29 7b 20 69 2b 2b 3b 20 70 32 2b 2b 3b 20 7d 0a  ){ i++; p2++; }.
0bb0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 32 3c  #endif.  if( p2<
0bc0: 30 20 29 20 70 32 20 3d 20 30 3b 0a 20 20 73 71  0 ) p2 = 0;.  sq
0bd0: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f  lite_set_result_
0be0: 73 74 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20  string(context, 
0bf0: 26 7a 5b 70 31 5d 2c 20 70 32 29 3b 0a 7d 0a 0a  &z[p1], p2);.}..
0c00: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
0c10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 75 6e  tion of the roun
0c20: 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a  d() function.*/.
0c30: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 75 6e  static void roun
0c40: 64 46 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e  dFunc(sqlite_fun
0c50: 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  c *context, int 
0c60: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
0c70: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20   **argv){.  int 
0c80: 6e 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  n;.  double r;. 
0c90: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
0ca0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
0cb0: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
0cc0: 0a 20 20 6e 20 3d 20 61 72 67 63 3d 3d 32 20 26  .  n = argc==2 &
0cd0: 26 20 61 72 67 76 5b 31 5d 20 3f 20 61 74 6f 69  & argv[1] ? atoi
0ce0: 28 61 72 67 76 5b 31 5d 29 20 3a 20 30 3b 0a 20  (argv[1]) : 0;. 
0cf0: 20 69 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d 20   if( n>30 ) n = 
0d00: 33 30 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20  30;.  if( n<0 ) 
0d10: 6e 20 3d 20 30 3b 0a 20 20 72 20 3d 20 61 72 67  n = 0;.  r = arg
0d20: 76 5b 30 5d 20 3f 20 61 74 6f 66 28 61 72 67 76  v[0] ? atof(argv
0d30: 5b 30 5d 29 20 3a 20 30 2e 30 3b 0a 20 20 73 70  [0]) : 0.0;.  sp
0d40: 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 2e 2a 66  rintf(zBuf,"%.*f
0d50: 22 2c 6e 2c 72 29 3b 0a 20 20 73 71 6c 69 74 65  ",n,r);.  sqlite
0d60: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
0d70: 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  ng(context, zBuf
0d80: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
0d90: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
0da0: 66 20 74 68 65 20 75 70 70 65 72 28 29 20 61 6e  f the upper() an
0db0: 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20 66 75  d lower() SQL fu
0dc0: 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  nctions..*/.stat
0dd0: 69 63 20 76 6f 69 64 20 75 70 70 65 72 46 75 6e  ic void upperFun
0de0: 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63  c(sqlite_func *c
0df0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
0e00: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  , const char **a
0e10: 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  rgv){.  char *z;
0e20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
0e30: 61 72 67 63 3c 31 20 7c 7c 20 61 72 67 76 5b 30  argc<1 || argv[0
0e40: 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  ]==0 ) return;. 
0e50: 20 7a 20 3d 20 73 71 6c 69 74 65 5f 73 65 74 5f   z = sqlite_set_
0e60: 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f  result_string(co
0e70: 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20  ntext, argv[0], 
0e80: 2d 31 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  -1);.  if( z==0 
0e90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
0ea0: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
0eb0: 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 77 65 72  .    if( islower
0ec0: 28 7a 5b 69 5d 29 20 29 20 7a 5b 69 5d 20 3d 20  (z[i]) ) z[i] = 
0ed0: 74 6f 75 70 70 65 72 28 7a 5b 69 5d 29 3b 0a 20  toupper(z[i]);. 
0ee0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
0ef0: 20 6c 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74   lowerFunc(sqlit
0f00: 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c  e_func *context,
0f10: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
0f20: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
0f30: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
0f40: 69 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20  i;.  if( argc<1 
0f50: 7c 7c 20 61 72 67 76 5b 30 5d 3d 3d 30 20 29 20  || argv[0]==0 ) 
0f60: 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
0f70: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f  lite_set_result_
0f80: 73 74 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20  string(context, 
0f90: 61 72 67 76 5b 30 5d 2c 20 2d 31 29 3b 0a 20 20  argv[0], -1);.  
0fa0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
0fb0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  n;.  for(i=0; z[
0fc0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
0fd0: 28 20 69 73 75 70 70 65 72 28 7a 5b 69 5d 29 20  ( isupper(z[i]) 
0fe0: 29 20 7a 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72  ) z[i] = tolower
0ff0: 28 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (z[i]);.  }.}../
1000: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1010: 69 6f 6e 20 6f 66 20 74 68 65 20 49 46 4e 55 4c  ion of the IFNUL
1020: 4c 28 29 2c 20 4e 56 4c 28 29 2c 20 61 6e 64 20  L(), NVL(), and 
1030: 43 4f 41 4c 45 53 43 45 28 29 20 66 75 6e 63 74  COALESCE() funct
1040: 69 6f 6e 73 2e 20 20 0a 2a 2a 20 41 6c 6c 20 74  ions.  .** All t
1050: 68 72 65 65 20 64 6f 20 74 68 65 20 73 61 6d 65  hree do the same
1060: 20 74 68 69 6e 67 2e 20 20 54 68 65 79 20 72 65   thing.  They re
1070: 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 61  turn the first a
1080: 72 67 75 6d 65 6e 74 0a 2a 2a 20 6e 6f 6e 2d 4e  rgument.** non-N
1090: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
10a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 66 6e  .static void ifn
10b0: 75 6c 6c 46 75 6e 63 28 73 71 6c 69 74 65 5f 66  ullFunc(sqlite_f
10c0: 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  unc *context, in
10d0: 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
10e0: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e  ar **argv){.  in
10f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1100: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1110: 20 20 69 66 28 20 61 72 67 76 5b 69 5d 20 29 7b    if( argv[i] ){
1120: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f 73 65  .      sqlite_se
1130: 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28  t_result_string(
1140: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 69 5d  context, argv[i]
1150: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , -1);.      bre
1160: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
1170: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1180: 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 28  ation of random(
1190: 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61 6e  ).  Return a ran
11a0: 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20 20 0a 2a  dom integer.  .*
11b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61  /.static void ra
11c0: 6e 64 6f 6d 46 75 6e 63 28 73 71 6c 69 74 65 5f  ndomFunc(sqlite_
11d0: 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69  func *context, i
11e0: 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
11f0: 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73  har **argv){.  s
1200: 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74  qlite_set_result
1210: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
1220: 6c 69 74 65 52 61 6e 64 6f 6d 49 6e 74 65 67 65  liteRandomIntege
1230: 72 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  r());.}../*.** A
1240: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1250: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1260: 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20  cture holds the 
1270: 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20  context of a.** 
1280: 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61  sum() or avg() a
1290: 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61  ggregate computa
12a0: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
12b0: 20 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53   struct SumCtx S
12c0: 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75  umCtx;.struct Su
12d0: 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20  mCtx {.  double 
12e0: 73 75 6d 3b 20 20 20 20 20 2f 2a 20 53 75 6d 20  sum;     /* Sum 
12f0: 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 7d 3b 0a 0a  of terms */.};..
1300: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 75  /*.** Routines u
1310: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
1320: 68 65 20 73 75 6d 20 6f 72 20 61 76 65 72 61 67  he sum or averag
1330: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1340: 64 20 73 75 6d 53 74 65 70 28 73 71 6c 69 74 65  d sumStep(sqlite
1350: 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20  _func *context, 
1360: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
1370: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
1380: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 64 6f 75  SumCtx *p;.  dou
1390: 62 6c 65 20 78 3b 0a 20 20 69 66 28 20 61 72 67  ble x;.  if( arg
13a0: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
13b0: 70 20 3d 20 73 71 6c 69 74 65 5f 61 67 67 72 65  p = sqlite_aggre
13c0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
13d0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
13e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
13f0: 72 65 74 75 72 6e 3b 0a 20 20 78 20 3d 20 61 72  return;.  x = ar
1400: 67 76 5b 30 5d 20 3f 20 61 74 6f 66 28 61 72 67  gv[0] ? atof(arg
1410: 76 5b 30 5d 29 20 3a 20 30 2e 30 3b 0a 20 20 70  v[0]) : 0.0;.  p
1420: 2d 3e 73 75 6d 20 2b 3d 20 78 3b 0a 7d 0a 73 74  ->sum += x;.}.st
1430: 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e  atic void sumFin
1440: 61 6c 69 7a 65 28 73 71 6c 69 74 65 5f 66 75 6e  alize(sqlite_fun
1450: 63 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  c *context){.  S
1460: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  umCtx *p;.  p = 
1470: 73 71 6c 69 74 65 5f 61 67 67 72 65 67 61 74 65  sqlite_aggregate
1480: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
1490: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
14a0: 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75   sqlite_set_resu
14b0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
14c0: 74 2c 20 70 20 3f 20 70 2d 3e 73 75 6d 20 3a 20  t, p ? p->sum : 
14d0: 30 2e 30 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  0.0);.}.static v
14e0: 6f 69 64 20 61 76 67 46 69 6e 61 6c 69 7a 65 28  oid avgFinalize(
14f0: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e  sqlite_func *con
1500: 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20  text){.  SumCtx 
1510: 2a 70 3b 0a 20 20 64 6f 75 62 6c 65 20 72 4e 3b  *p;.  double rN;
1520: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 5f 61 67  .  p = sqlite_ag
1530: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1540: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
1550: 2a 70 29 29 3b 0a 20 20 72 4e 20 3d 20 73 71 6c  *p));.  rN = sql
1560: 69 74 65 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  ite_aggregate_co
1570: 75 6e 74 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  unt(context);.  
1580: 69 66 28 20 70 20 26 26 20 72 4e 3e 30 2e 30 20  if( p && rN>0.0 
1590: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 73 65  ){.    sqlite_se
15a0: 74 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  t_result_double(
15b0: 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 73 75 6d 2f  context, p->sum/
15c0: 72 4e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rN);.  }.}../*.*
15d0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
15e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
15f0: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74  tructure holds t
1600: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a  he context of a.
1610: 2a 2a 20 76 61 72 69 61 6e 63 65 20 6f 72 20 73  ** variance or s
1620: 74 61 6e 64 61 72 64 20 64 65 76 69 61 74 69 6f  tandard deviatio
1630: 6e 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a  n computation..*
1640: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1650: 20 53 74 64 44 65 76 43 74 78 20 53 74 64 44 65   StdDevCtx StdDe
1660: 76 43 74 78 3b 0a 73 74 72 75 63 74 20 53 74 64  vCtx;.struct Std
1670: 44 65 76 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c  DevCtx {.  doubl
1680: 65 20 73 75 6d 3b 20 20 20 20 20 2f 2a 20 53 75  e sum;     /* Su
1690: 6d 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  m of terms */.  
16a0: 64 6f 75 62 6c 65 20 73 75 6d 32 3b 20 20 20 20  double sum2;    
16b0: 2f 2a 20 53 75 6d 20 6f 66 20 74 68 65 20 73 71  /* Sum of the sq
16c0: 75 61 72 65 73 20 6f 66 20 74 65 72 6d 73 20 2a  uares of terms *
16d0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  /.};../*.** Rout
16e0: 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ines used to com
16f0: 70 75 74 65 20 74 68 65 20 73 74 61 6e 64 61 72  pute the standar
1700: 64 20 64 65 76 69 61 74 69 6f 6e 20 61 73 20 61  d deviation as a
1710: 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2f 0a  n aggregate..*/.
1720: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 64 44  static void stdD
1730: 65 76 53 74 65 70 28 73 71 6c 69 74 65 5f 66 75  evStep(sqlite_fu
1740: 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  nc *context, int
1750: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
1760: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 74 64  r **argv){.  Std
1770: 44 65 76 43 74 78 20 2a 70 3b 0a 20 20 64 6f 75  DevCtx *p;.  dou
1780: 62 6c 65 20 78 3b 0a 20 20 69 66 28 20 61 72 67  ble x;.  if( arg
1790: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
17a0: 70 20 3d 20 73 71 6c 69 74 65 5f 61 67 67 72 65  p = sqlite_aggre
17b0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
17c0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
17d0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
17e0: 72 65 74 75 72 6e 3b 0a 20 20 78 20 3d 20 61 72  return;.  x = ar
17f0: 67 76 5b 30 5d 20 3f 20 61 74 6f 66 28 61 72 67  gv[0] ? atof(arg
1800: 76 5b 30 5d 29 20 3a 20 30 2e 30 3b 0a 20 20 70  v[0]) : 0.0;.  p
1810: 2d 3e 73 75 6d 20 2b 3d 20 78 3b 0a 20 20 70 2d  ->sum += x;.  p-
1820: 3e 73 75 6d 32 20 2b 3d 20 78 2a 78 3b 0a 7d 0a  >sum2 += x*x;.}.
1830: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 64 44  static void stdD
1840: 65 76 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  evFinalize(sqlit
1850: 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 29  e_func *context)
1860: 7b 0a 20 20 64 6f 75 62 6c 65 20 72 4e 20 3d 20  {.  double rN = 
1870: 73 71 6c 69 74 65 5f 61 67 67 72 65 67 61 74 65  sqlite_aggregate
1880: 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 3b  _count(context);
1890: 0a 20 20 53 74 64 44 65 76 43 74 78 20 2a 70 20  .  StdDevCtx *p 
18a0: 3d 20 73 71 6c 69 74 65 5f 61 67 67 72 65 67 61  = sqlite_aggrega
18b0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
18c0: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
18d0: 0a 20 20 69 66 28 20 70 20 26 26 20 72 4e 3e 31  .  if( p && rN>1
18e0: 2e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .0 ){.    sqlite
18f0: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 64 6f 75 62  _set_result_doub
1900: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20  le(context, .   
1910: 20 20 20 20 73 71 72 74 28 28 70 2d 3e 73 75 6d      sqrt((p->sum
1920: 32 20 2d 20 70 2d 3e 73 75 6d 2a 70 2d 3e 73 75  2 - p->sum*p->su
1930: 6d 2f 72 4e 29 2f 28 72 4e 2d 31 2e 30 29 29 29  m/rN)/(rN-1.0)))
1940: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1950: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1960: 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61  ucture keeps tra
1970: 63 6b 20 6f 66 20 73 74 61 74 65 20 69 6e 66 6f  ck of state info
1980: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  rmation for the.
1990: 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65  ** count() aggre
19a0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  gate function..*
19b0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19c0: 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e 74 43   CountCtx CountC
19d0: 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75 6e 74  tx;.struct Count
19e0: 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d  Ctx {.  int n;.}
19f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  ;../*.** Routine
1a00: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
1a10: 68 65 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65  he count() aggre
1a20: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  gate function..*
1a30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
1a40: 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65 5f 66  untStep(sqlite_f
1a50: 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  unc *context, in
1a60: 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
1a70: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f  ar **argv){.  Co
1a80: 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  untCtx *p;.  p =
1a90: 20 73 71 6c 69 74 65 5f 61 67 67 72 65 67 61 74   sqlite_aggregat
1aa0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
1ab0: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
1ac0: 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c    if( (argc==0 |
1ad0: 7c 20 61 72 67 76 5b 30 5d 29 20 26 26 20 70 20  | argv[0]) && p 
1ae0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
1af0: 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76   }.}   .static v
1b00: 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a  oid countFinaliz
1b10: 65 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63  e(sqlite_func *c
1b20: 6f 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74  ontext){.  Count
1b30: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
1b40: 6c 69 74 65 5f 61 67 67 72 65 67 61 74 65 5f 63  lite_aggregate_c
1b50: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
1b60: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 73  sizeof(*p));.  s
1b70: 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74  qlite_set_result
1b80: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20  _int(context, p 
1b90: 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a  ? p->n : 0);.}..
1ba0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1bb0: 69 6f 6e 20 74 72 61 63 6b 73 20 73 74 61 74 65  ion tracks state
1bc0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
1bd0: 20 74 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d   the min() and m
1be0: 61 78 28 29 0a 2a 2a 20 61 67 67 72 65 67 61 74  ax().** aggregat
1bf0: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  e functions..*/.
1c00: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d  typedef struct M
1c10: 69 6e 4d 61 78 43 74 78 20 4d 69 6e 4d 61 78 43  inMaxCtx MinMaxC
1c20: 74 78 3b 0a 73 74 72 75 63 74 20 4d 69 6e 4d 61  tx;.struct MinMa
1c30: 78 43 74 78 20 7b 0a 20 20 63 68 61 72 20 2a 7a  xCtx {.  char *z
1c40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1c50: 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a   best so far */.
1c60: 20 20 63 68 61 72 20 7a 42 75 66 5b 32 38 5d 3b    char zBuf[28];
1c70: 20 20 20 2f 2a 20 53 70 61 63 65 20 74 68 61 74     /* Space that
1c80: 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
1c90: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 7d 3b 0a 0a   storage */.};..
1ca0: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
1cb0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28  o implement min(
1cc0: 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72  ) and max() aggr
1cd0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
1ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cf0: 6d 69 6e 53 74 65 70 28 73 71 6c 69 74 65 5f 66  minStep(sqlite_f
1d00: 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  unc *context, in
1d10: 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
1d20: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 69  ar **argv){.  Mi
1d30: 6e 4d 61 78 43 74 78 20 2a 70 3b 0a 20 20 70 20  nMaxCtx *p;.  p 
1d40: 3d 20 73 71 6c 69 74 65 5f 61 67 67 72 65 67 61  = sqlite_aggrega
1d50: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
1d60: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
1d70: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 61  .  if( p==0 || a
1d80: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
1d90: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 61 67 67    if( sqlite_agg
1da0: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e  regate_count(con
1db0: 74 65 78 74 29 3d 3d 31 20 7c 7c 20 73 71 6c 69  text)==1 || sqli
1dc0: 74 65 43 6f 6d 70 61 72 65 28 61 72 67 76 5b 30  teCompare(argv[0
1dd0: 5d 2c 70 2d 3e 7a 29 3c 30 20 29 7b 0a 20 20 20  ],p->z)<0 ){.   
1de0: 20 69 66 28 20 70 2d 3e 7a 20 26 26 20 70 2d 3e   if( p->z && p->
1df0: 7a 21 3d 70 2d 3e 7a 42 75 66 20 29 7b 0a 20 20  z!=p->zBuf ){.  
1e00: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1e10: 2d 3e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->z);.    }.    
1e20: 69 66 28 20 61 72 67 76 5b 30 5d 20 29 7b 0a 20  if( argv[0] ){. 
1e30: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73       int len = s
1e40: 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 3b 0a  trlen(argv[0]);.
1e50: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3c 20        if( len < 
1e60: 73 69 7a 65 6f 66 28 70 2d 3e 7a 42 75 66 29 20  sizeof(p->zBuf) 
1e70: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 20  ){.        p->z 
1e80: 3d 20 70 2d 3e 7a 42 75 66 3b 0a 20 20 20 20 20  = p->zBuf;.     
1e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ea0: 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c  p->z = sqliteMal
1eb0: 6c 6f 63 28 20 6c 65 6e 2b 31 20 29 3b 0a 20 20  loc( len+1 );.  
1ec0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d        if( p->z==
1ed0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
1ee0: 20 20 7d 0a 20 20 20 20 20 20 73 74 72 63 70 79    }.      strcpy
1ef0: 28 70 2d 3e 7a 2c 20 61 72 67 76 5b 30 5d 29 3b  (p->z, argv[0]);
1f00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f10: 20 20 70 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20    p->z = 0;.    
1f20: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
1f30: 6f 69 64 20 6d 61 78 53 74 65 70 28 73 71 6c 69  oid maxStep(sqli
1f40: 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74  te_func *context
1f50: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73  , int argc, cons
1f60: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  t char **argv){.
1f70: 20 20 4d 69 6e 4d 61 78 43 74 78 20 2a 70 3b 0a    MinMaxCtx *p;.
1f80: 20 20 70 20 3d 20 73 71 6c 69 74 65 5f 61 67 67    p = sqlite_agg
1f90: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
1fa0: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1fb0: 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  p));.  if( p==0 
1fc0: 7c 7c 20 61 72 67 63 3c 31 20 29 20 72 65 74 75  || argc<1 ) retu
1fd0: 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
1fe0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74  _aggregate_count
1ff0: 28 63 6f 6e 74 65 78 74 29 3d 3d 31 20 7c 7c 20  (context)==1 || 
2000: 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 61 72  sqliteCompare(ar
2010: 67 76 5b 30 5d 2c 70 2d 3e 7a 29 3e 30 20 29 7b  gv[0],p->z)>0 ){
2020: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 20 26 26  .    if( p->z &&
2030: 20 70 2d 3e 7a 21 3d 70 2d 3e 7a 42 75 66 20 29   p->z!=p->zBuf )
2040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
2050: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 7d 0a  ee(p->z);.    }.
2060: 20 20 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20      if( argv[0] 
2070: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  ){.      int len
2080: 20 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 30   = strlen(argv[0
2090: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  ]);.      if( le
20a0: 6e 20 3c 20 73 69 7a 65 6f 66 28 70 2d 3e 7a 42  n < sizeof(p->zB
20b0: 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  uf) ){.        p
20c0: 2d 3e 7a 20 3d 20 70 2d 3e 7a 42 75 66 3b 0a 20  ->z = p->zBuf;. 
20d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20e0: 20 20 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74      p->z = sqlit
20f0: 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 20 29  eMalloc( len+1 )
2100: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
2110: 3e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  >z==0 ) return;.
2120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
2130: 72 63 70 79 28 70 2d 3e 7a 2c 20 61 72 67 76 5b  rcpy(p->z, argv[
2140: 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0]);.    }else{.
2150: 20 20 20 20 20 20 70 2d 3e 7a 20 3d 20 30 3b 0a        p->z = 0;.
2160: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
2170: 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69  ic void minMaxFi
2180: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 5f 66 75  nalize(sqlite_fu
2190: 6e 63 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  nc *context){.  
21a0: 4d 69 6e 4d 61 78 43 74 78 20 2a 70 3b 0a 20 20  MinMaxCtx *p;.  
21b0: 70 20 3d 20 73 71 6c 69 74 65 5f 61 67 67 72 65  p = sqlite_aggre
21c0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
21d0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
21e0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
21f0: 3e 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >z ){.    sqlite
2200: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
2210: 6e 67 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 7a  ng(context, p->z
2220: 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 29 29 3b  , strlen(p->z));
2230: 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 26 26 20  .  }.  if( p && 
2240: 70 2d 3e 7a 20 26 26 20 70 2d 3e 7a 21 3d 70 2d  p->z && p->z!=p-
2250: 3e 7a 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c  >zBuf ){.    sql
2260: 69 74 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a 20  iteFree(p->z);. 
2270: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2280: 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74   function regist
2290: 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  ered all of the 
22a0: 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f 6e  above C function
22b0: 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63  s as SQL.** func
22c0: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68 6f  tions.  This sho
22d0: 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  uld be the only 
22e0: 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20  routine in this 
22f0: 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78 74  file with.** ext
2300: 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a  ernal linkage..*
2310: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 65 67  /.void sqliteReg
2320: 69 73 74 65 72 42 75 69 6c 64 69 6e 46 75 6e 63  isterBuildinFunc
2330: 74 69 6f 6e 73 28 73 71 6c 69 74 65 20 2a 64 62  tions(sqlite *db
2340: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  ){.  static stru
2350: 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
2360: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20  zName;.     int 
2370: 6e 41 72 67 3b 0a 20 20 20 20 20 76 6f 69 64 20  nArg;.     void 
2380: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 5f  (*xFunc)(sqlite_
2390: 66 75 6e 63 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  func*,int,const 
23a0: 63 68 61 72 2a 2a 29 3b 0a 20 20 7d 20 61 46 75  char**);.  } aFu
23b0: 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ncs[] = {.    { 
23c0: 22 6d 69 6e 22 2c 20 20 20 20 20 20 20 2d 31 2c  "min",       -1,
23d0: 20 6d 69 6e 46 75 6e 63 20 20 20 20 7d 2c 0a 20   minFunc    },. 
23e0: 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 20     { "min",     
23f0: 20 20 20 30 2c 20 30 20 20 20 20 20 20 20 20 20     0, 0         
2400: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22 2c   },.    { "max",
2410: 20 20 20 20 20 20 20 2d 31 2c 20 6d 61 78 46 75         -1, maxFu
2420: 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  nc    },.    { "
2430: 6d 61 78 22 2c 20 20 20 20 20 20 20 20 30 2c 20  max",        0, 
2440: 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  0          },.  
2450: 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20 20    { "length",   
2460: 20 20 31 2c 20 6c 65 6e 67 74 68 46 75 6e 63 20    1, lengthFunc 
2470: 7d 2c 0a 20 20 20 20 7b 20 22 73 75 62 73 74 72  },.    { "substr
2480: 22 2c 20 20 20 20 20 33 2c 20 73 75 62 73 74 72  ",     3, substr
2490: 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 61  Func },.    { "a
24a0: 62 73 22 2c 20 20 20 20 20 20 20 20 31 2c 20 61  bs",        1, a
24b0: 62 73 46 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20  bsFunc    },.   
24c0: 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 20 20 20   { "round",     
24d0: 20 31 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d   1, roundFunc  }
24e0: 2c 0a 20 20 20 20 7b 20 22 72 6f 75 6e 64 22 2c  ,.    { "round",
24f0: 20 20 20 20 20 20 32 2c 20 72 6f 75 6e 64 46 75        2, roundFu
2500: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70  nc  },.    { "up
2510: 70 65 72 22 2c 20 20 20 20 20 20 31 2c 20 75 70  per",      1, up
2520: 70 65 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20  perFunc  },.    
2530: 7b 20 22 6c 6f 77 65 72 22 2c 20 20 20 20 20 20  { "lower",      
2540: 31 2c 20 6c 6f 77 65 72 46 75 6e 63 20 20 7d 2c  1, lowerFunc  },
2550: 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65 73 63 65  .    { "coalesce
2560: 22 2c 20 20 2d 31 2c 20 69 66 6e 75 6c 6c 46 75  ",  -1, ifnullFu
2570: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 61  nc },.    { "coa
2580: 6c 65 73 63 65 22 2c 20 20 20 30 2c 20 30 20 20  lesce",   0, 0  
2590: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
25a0: 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20 31   "coalesce",   1
25b0: 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  , 0          },.
25c0: 20 20 20 20 7b 20 22 72 61 6e 64 6f 6d 22 2c 20      { "random", 
25d0: 20 20 20 2d 31 2c 20 72 61 6e 64 6f 6d 46 75 6e     -1, randomFun
25e0: 63 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74  c },.  };.  stat
25f0: 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
2600: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
2610: 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 76   int nArg;.    v
2620: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
2630: 69 74 65 5f 66 75 6e 63 2a 2c 69 6e 74 2c 63 6f  ite_func*,int,co
2640: 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20  nst char**);.   
2650: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 69 7a   void (*xFinaliz
2660: 65 29 28 73 71 6c 69 74 65 5f 66 75 6e 63 2a 29  e)(sqlite_func*)
2670: 3b 0a 20 20 7d 20 61 41 67 67 73 5b 5d 20 3d 20  ;.  } aAggs[] = 
2680: 7b 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20  {.    { "min",  
2690: 20 20 31 2c 20 6d 69 6e 53 74 65 70 2c 20 20 20    1, minStep,   
26a0: 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a     minMaxFinaliz
26b0: 65 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22  e },.    { "max"
26c0: 2c 20 20 20 20 31 2c 20 6d 61 78 53 74 65 70 2c  ,    1, maxStep,
26d0: 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61        minMaxFina
26e0: 6c 69 7a 65 20 7d 2c 0a 20 20 20 20 7b 20 22 73  lize },.    { "s
26f0: 75 6d 22 2c 20 20 20 20 31 2c 20 73 75 6d 53 74  um",    1, sumSt
2700: 65 70 2c 20 20 20 20 20 20 73 75 6d 46 69 6e 61  ep,      sumFina
2710: 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b  lize    },.    {
2720: 20 22 61 76 67 22 2c 20 20 20 20 31 2c 20 73 75   "avg",    1, su
2730: 6d 53 74 65 70 2c 20 20 20 20 20 20 61 76 67 46  mStep,      avgF
2740: 69 6e 61 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20  inalize    },.  
2750: 20 20 7b 20 22 63 6f 75 6e 74 22 2c 20 20 30 2c    { "count",  0,
2760: 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20 20 63   countStep,    c
2770: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20 7d 2c  ountFinalize  },
2780: 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74 22 2c 20  .    { "count", 
2790: 20 31 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20   1, countStep,  
27a0: 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20    countFinalize 
27b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 64 64 65   },.    { "stdde
27c0: 76 22 2c 20 31 2c 20 73 74 64 44 65 76 53 74 65  v", 1, stdDevSte
27d0: 70 2c 20 20 20 73 74 64 44 65 76 46 69 6e 61 6c  p,   stdDevFinal
27e0: 69 7a 65 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  ize },.  };.  in
27f0: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  t i;..  for(i=0;
2800: 20 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 73   i<sizeof(aFuncs
2810: 29 2f 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b  )/sizeof(aFuncs[
2820: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  0]); i++){.    s
2830: 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 66 75 6e  qlite_create_fun
2840: 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73  ction(db, aFuncs
2850: 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  [i].zName,.     
2860: 20 20 20 20 20 20 61 46 75 6e 63 73 5b 69 5d 2e        aFuncs[i].
2870: 6e 41 72 67 2c 20 61 46 75 6e 63 73 5b 69 5d 2e  nArg, aFuncs[i].
2880: 78 46 75 6e 63 2c 20 30 29 3b 0a 20 20 7d 0a 20  xFunc, 0);.  }. 
2890: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
28a0: 6f 66 28 61 41 67 67 73 29 2f 73 69 7a 65 6f 66  of(aAggs)/sizeof
28b0: 28 61 41 67 67 73 5b 30 5d 29 3b 20 69 2b 2b 29  (aAggs[0]); i++)
28c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 63 72 65  {.    sqlite_cre
28d0: 61 74 65 5f 61 67 67 72 65 67 61 74 65 28 64 62  ate_aggregate(db
28e0: 2c 20 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65  , aAggs[i].zName
28f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 41 67  ,.           aAg
2900: 67 73 5b 69 5d 2e 6e 41 72 67 2c 20 61 41 67 67  gs[i].nArg, aAgg
2910: 73 5b 69 5d 2e 78 53 74 65 70 2c 20 61 41 67 67  s[i].xStep, aAgg
2920: 73 5b 69 5d 2e 78 46 69 6e 61 6c 69 7a 65 2c 20  s[i].xFinalize, 
2930: 30 29 3b 0a 20 20 7d 0a 7d 0a                    0);.  }.}.