/ Hex Artifact Content
Login

Artifact 87516e7dc37190c24af77593931a5d09d797520a:


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 34 20 32 30 30 32 2f 30 33 2f 30 34 20  1.14 2002/03/04 
02a0: 30 32 3a 32 36 3a 31 36 20 64 72 68 20 45 78 70  02:26:16 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 23 69 66 20 30 20 20 20 2f 2a  /.};..#if 0   /*
16e0: 20 4f 6d 69 74 20 62 65 63 61 75 73 65 20 6d 61   Omit because ma
16f0: 74 68 20 6c 69 62 72 61 72 79 20 69 73 20 72 65  th library is re
1700: 71 75 69 72 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20  quired */./*.** 
1710: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f  Routines used to
1720: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 74 61   compute the sta
1730: 6e 64 61 72 64 20 64 65 76 69 61 74 69 6f 6e 20  ndard deviation 
1740: 61 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  as an aggregate.
1750: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1760: 73 74 64 44 65 76 53 74 65 70 28 73 71 6c 69 74  stdDevStep(sqlit
1770: 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c  e_func *context,
1780: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
1790: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
17a0: 20 53 74 64 44 65 76 43 74 78 20 2a 70 3b 0a 20   StdDevCtx *p;. 
17b0: 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 69 66 28   double x;.  if(
17c0: 20 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e   argc<1 ) return
17d0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 5f 61  ;.  p = sqlite_a
17e0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
17f0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1800: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d  (*p));.  if( p==
1810: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 20  0 ) return;.  x 
1820: 3d 20 61 72 67 76 5b 30 5d 20 3f 20 61 74 6f 66  = argv[0] ? atof
1830: 28 61 72 67 76 5b 30 5d 29 20 3a 20 30 2e 30 3b  (argv[0]) : 0.0;
1840: 0a 20 20 70 2d 3e 73 75 6d 20 2b 3d 20 78 3b 0a  .  p->sum += x;.
1850: 20 20 70 2d 3e 73 75 6d 32 20 2b 3d 20 78 2a 78    p->sum2 += x*x
1860: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1870: 73 74 64 44 65 76 46 69 6e 61 6c 69 7a 65 28 73  stdDevFinalize(s
1880: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74  qlite_func *cont
1890: 65 78 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72  ext){.  double r
18a0: 4e 20 3d 20 73 71 6c 69 74 65 5f 61 67 67 72 65  N = sqlite_aggre
18b0: 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65  gate_count(conte
18c0: 78 74 29 3b 0a 20 20 53 74 64 44 65 76 43 74 78  xt);.  StdDevCtx
18d0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 5f 61 67 67   *p = sqlite_agg
18e0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
18f0: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1900: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  p));.  if( p && 
1910: 72 4e 3e 31 2e 30 20 29 7b 0a 20 20 20 20 73 71  rN>1.0 ){.    sq
1920: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f  lite_set_result_
1930: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
1940: 0a 20 20 20 20 20 20 20 73 71 72 74 28 28 70 2d  .       sqrt((p-
1950: 3e 73 75 6d 32 20 2d 20 70 2d 3e 73 75 6d 2a 70  >sum2 - p->sum*p
1960: 2d 3e 73 75 6d 2f 72 4e 29 2f 28 72 4e 2d 31 2e  ->sum/rN)/(rN-1.
1970: 30 29 29 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  0)));.  }.}.#end
1980: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1990: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
19a0: 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66  e keeps track of
19b0: 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   state informati
19c0: 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f  on for the.** co
19d0: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
19e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  function..*/.typ
19f0: 65 64 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e  edef struct Coun
1a00: 74 43 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73  tCtx CountCtx;.s
1a10: 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b  truct CountCtx {
1a20: 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 0a 2f 2a  .  int n;.};../*
1a30: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
1a40: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
1a50: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
1a60: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
1a70: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74  tic void countSt
1a80: 65 70 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a  ep(sqlite_func *
1a90: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
1aa0: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  c, const char **
1ab0: 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74  argv){.  CountCt
1ac0: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
1ad0: 74 65 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  te_aggregate_con
1ae0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
1af0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
1b00: 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 61 72 67   (argc==0 || arg
1b10: 76 5b 30 5d 29 20 26 26 20 70 20 29 7b 0a 20 20  v[0]) && p ){.  
1b20: 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20    p->n++;.  }.} 
1b30: 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63    .static void c
1b40: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c  ountFinalize(sql
1b50: 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78  ite_func *contex
1b60: 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a  t){.  CountCtx *
1b70: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 5f  p;.  p = sqlite_
1b80: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
1b90: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
1ba0: 66 28 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65  f(*p));.  sqlite
1bb0: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74 28  _set_result_int(
1bc0: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
1bd0: 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n : 0);.}../*.**
1be0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   This function t
1bf0: 72 61 63 6b 73 20 73 74 61 74 65 20 69 6e 66 6f  racks state info
1c00: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
1c10: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 0a  min() and max().
1c20: 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
1c30: 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ctions..*/.typed
1c40: 65 66 20 73 74 72 75 63 74 20 4d 69 6e 4d 61 78  ef struct MinMax
1c50: 43 74 78 20 4d 69 6e 4d 61 78 43 74 78 3b 0a 73  Ctx MinMaxCtx;.s
1c60: 74 72 75 63 74 20 4d 69 6e 4d 61 78 43 74 78 20  truct MinMaxCtx 
1c70: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  {.  char *z;    
1c80: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74       /* The best
1c90: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61   so far */.  cha
1ca0: 72 20 7a 42 75 66 5b 32 38 5d 3b 20 20 20 2f 2a  r zBuf[28];   /*
1cb0: 20 53 70 61 63 65 20 74 68 61 74 20 63 61 6e 20   Space that can 
1cc0: 62 65 20 75 73 65 64 20 66 6f 72 20 73 74 6f 72  be used for stor
1cd0: 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  age */.};../*.**
1ce0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70   Routines to imp
1cf0: 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64  lement min() and
1d00: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
1d10: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
1d20: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 53 74  tatic void minSt
1d30: 65 70 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a  ep(sqlite_func *
1d40: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
1d50: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  c, const char **
1d60: 61 72 67 76 29 7b 0a 20 20 4d 69 6e 4d 61 78 43  argv){.  MinMaxC
1d70: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
1d80: 69 74 65 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  ite_aggregate_co
1d90: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
1da0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
1db0: 28 20 70 3d 3d 30 20 7c 7c 20 61 72 67 63 3c 31  ( p==0 || argc<1
1dc0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1dd0: 20 73 71 6c 69 74 65 5f 61 67 67 72 65 67 61 74   sqlite_aggregat
1de0: 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29  e_count(context)
1df0: 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65 43 6f 6d  ==1 || sqliteCom
1e00: 70 61 72 65 28 61 72 67 76 5b 30 5d 2c 70 2d 3e  pare(argv[0],p->
1e10: 7a 29 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20  z)<0 ){.    if( 
1e20: 70 2d 3e 7a 20 26 26 20 70 2d 3e 7a 21 3d 70 2d  p->z && p->z!=p-
1e30: 3e 7a 42 75 66 20 29 7b 0a 20 20 20 20 20 20 73  >zBuf ){.      s
1e40: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 29 3b  qliteFree(p->z);
1e50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
1e60: 72 67 76 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  rgv[0] ){.      
1e70: 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
1e80: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
1e90: 20 69 66 28 20 6c 65 6e 20 3c 20 73 69 7a 65 6f   if( len < sizeo
1ea0: 66 28 70 2d 3e 7a 42 75 66 29 20 29 7b 0a 20 20  f(p->zBuf) ){.  
1eb0: 20 20 20 20 20 20 70 2d 3e 7a 20 3d 20 70 2d 3e        p->z = p->
1ec0: 7a 42 75 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73  zBuf;.      }els
1ed0: 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 20  e{.        p->z 
1ee0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1ef0: 6c 65 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  len+1 );.       
1f00: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 72   if( p->z==0 ) r
1f10: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
1f20: 20 20 20 20 20 73 74 72 63 70 79 28 70 2d 3e 7a       strcpy(p->z
1f30: 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  , argv[0]);.    
1f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
1f50: 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  z = 0;.    }.  }
1f60: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  .}.static void m
1f70: 61 78 53 74 65 70 28 73 71 6c 69 74 65 5f 66 75  axStep(sqlite_fu
1f80: 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  nc *context, int
1f90: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
1fa0: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 69 6e  r **argv){.  Min
1fb0: 4d 61 78 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  MaxCtx *p;.  p =
1fc0: 20 73 71 6c 69 74 65 5f 61 67 67 72 65 67 61 74   sqlite_aggregat
1fd0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
1fe0: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
1ff0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 61 72    if( p==0 || ar
2000: 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
2010: 20 69 66 28 20 73 71 6c 69 74 65 5f 61 67 67 72   if( sqlite_aggr
2020: 65 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74  egate_count(cont
2030: 65 78 74 29 3d 3d 31 20 7c 7c 20 73 71 6c 69 74  ext)==1 || sqlit
2040: 65 43 6f 6d 70 61 72 65 28 61 72 67 76 5b 30 5d  eCompare(argv[0]
2050: 2c 70 2d 3e 7a 29 3e 30 20 29 7b 0a 20 20 20 20  ,p->z)>0 ){.    
2060: 69 66 28 20 70 2d 3e 7a 20 26 26 20 70 2d 3e 7a  if( p->z && p->z
2070: 21 3d 70 2d 3e 7a 42 75 66 20 29 7b 0a 20 20 20  !=p->zBuf ){.   
2080: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
2090: 3e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  >z);.    }.    i
20a0: 66 28 20 61 72 67 76 5b 30 5d 20 29 7b 0a 20 20  f( argv[0] ){.  
20b0: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
20c0: 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 3b 0a 20  rlen(argv[0]);. 
20d0: 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3c 20 73       if( len < s
20e0: 69 7a 65 6f 66 28 70 2d 3e 7a 42 75 66 29 20 29  izeof(p->zBuf) )
20f0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 20 3d  {.        p->z =
2100: 20 70 2d 3e 7a 42 75 66 3b 0a 20 20 20 20 20 20   p->zBuf;.      
2110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2120: 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ->z = sqliteMall
2130: 6f 63 28 20 6c 65 6e 2b 31 20 29 3b 0a 20 20 20  oc( len+1 );.   
2140: 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30       if( p->z==0
2150: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
2160: 20 7d 0a 20 20 20 20 20 20 73 74 72 63 70 79 28   }.      strcpy(
2170: 70 2d 3e 7a 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  p->z, argv[0]);.
2180: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2190: 20 70 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d   p->z = 0;.    }
21a0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
21b0: 69 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a  id minMaxFinaliz
21c0: 65 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63  e(sqlite_func *c
21d0: 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 69 6e 4d 61  ontext){.  MinMa
21e0: 78 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  xCtx *p;.  p = s
21f0: 71 6c 69 74 65 5f 61 67 67 72 65 67 61 74 65 5f  qlite_aggregate_
2200: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
2210: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2220: 69 66 28 20 70 20 26 26 20 70 2d 3e 7a 20 29 7b  if( p && p->z ){
2230: 0a 20 20 20 20 73 71 6c 69 74 65 5f 73 65 74 5f  .    sqlite_set_
2240: 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f  result_string(co
2250: 6e 74 65 78 74 2c 20 70 2d 3e 7a 2c 20 73 74 72  ntext, p->z, str
2260: 6c 65 6e 28 70 2d 3e 7a 29 29 3b 0a 20 20 7d 0a  len(p->z));.  }.
2270: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 7a 20    if( p && p->z 
2280: 26 26 20 70 2d 3e 7a 21 3d 70 2d 3e 7a 42 75 66  && p->z!=p->zBuf
2290: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
22a0: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a  ee(p->z);.  }.}.
22b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22c0: 74 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20  tion registered 
22d0: 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
22e0: 20 43 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20   C functions as 
22f0: 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  SQL.** functions
2300: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
2310: 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69  e the only routi
2320: 6e 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ne in this file 
2330: 77 69 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61 6c  with.** external
2340: 20 6c 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69   linkage..*/.voi
2350: 64 20 73 71 6c 69 74 65 52 65 67 69 73 74 65 72  d sqliteRegister
2360: 42 75 69 6c 64 69 6e 46 75 6e 63 74 69 6f 6e 73  BuildinFunctions
2370: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
2380: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
2390: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
23a0: 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ;.     int nArg;
23b0: 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75  .     void (*xFu
23c0: 6e 63 29 28 73 71 6c 69 74 65 5f 66 75 6e 63 2a  nc)(sqlite_func*
23d0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
23e0: 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63 73 5b 5d  *);.  } aFuncs[]
23f0: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6d 69 6e 22   = {.    { "min"
2400: 2c 20 20 20 20 20 20 20 2d 31 2c 20 6d 69 6e 46  ,       -1, minF
2410: 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  unc    },.    { 
2420: 22 6d 69 6e 22 2c 20 20 20 20 20 20 20 20 30 2c  "min",        0,
2430: 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20   0          },. 
2440: 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 20     { "max",     
2450: 20 20 2d 31 2c 20 6d 61 78 46 75 6e 63 20 20 20    -1, maxFunc   
2460: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22 2c   },.    { "max",
2470: 20 20 20 20 20 20 20 20 30 2c 20 30 20 20 20 20          0, 0    
2480: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2490: 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 31 2c 20  length",     1, 
24a0: 6c 65 6e 67 74 68 46 75 6e 63 20 7d 2c 0a 20 20  lengthFunc },.  
24b0: 20 20 7b 20 22 73 75 62 73 74 72 22 2c 20 20 20    { "substr",   
24c0: 20 20 33 2c 20 73 75 62 73 74 72 46 75 6e 63 20    3, substrFunc 
24d0: 7d 2c 0a 20 20 20 20 7b 20 22 61 62 73 22 2c 20  },.    { "abs", 
24e0: 20 20 20 20 20 20 20 31 2c 20 61 62 73 46 75 6e         1, absFun
24f0: 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72  c    },.    { "r
2500: 6f 75 6e 64 22 2c 20 20 20 20 20 20 31 2c 20 72  ound",      1, r
2510: 6f 75 6e 64 46 75 6e 63 20 20 7d 2c 0a 20 20 20  oundFunc  },.   
2520: 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 20 20 20   { "round",     
2530: 20 32 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d   2, roundFunc  }
2540: 2c 0a 20 20 20 20 7b 20 22 75 70 70 65 72 22 2c  ,.    { "upper",
2550: 20 20 20 20 20 20 31 2c 20 75 70 70 65 72 46 75        1, upperFu
2560: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f  nc  },.    { "lo
2570: 77 65 72 22 2c 20 20 20 20 20 20 31 2c 20 6c 6f  wer",      1, lo
2580: 77 65 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20  werFunc  },.    
2590: 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 2d  { "coalesce",  -
25a0: 31 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20 7d 2c  1, ifnullFunc },
25b0: 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65 73 63 65  .    { "coalesce
25c0: 22 2c 20 20 20 30 2c 20 30 20 20 20 20 20 20 20  ",   0, 0       
25d0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 61     },.    { "coa
25e0: 6c 65 73 63 65 22 2c 20 20 20 31 2c 20 30 20 20  lesce",   1, 0  
25f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2600: 20 22 72 61 6e 64 6f 6d 22 2c 20 20 20 20 2d 31   "random",    -1
2610: 2c 20 72 61 6e 64 6f 6d 46 75 6e 63 20 7d 2c 0a  , randomFunc },.
2620: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74    };.  static st
2630: 72 75 63 74 20 7b 0a 20 20 20 20 63 68 61 72 20  ruct {.    char 
2640: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  *zName;.    int 
2650: 6e 41 72 67 3b 0a 20 20 20 20 76 6f 69 64 20 28  nArg;.    void (
2660: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 5f 66  *xStep)(sqlite_f
2670: 75 6e 63 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  unc*,int,const c
2680: 68 61 72 2a 2a 29 3b 0a 20 20 20 20 76 6f 69 64  har**);.    void
2690: 20 28 2a 78 46 69 6e 61 6c 69 7a 65 29 28 73 71   (*xFinalize)(sq
26a0: 6c 69 74 65 5f 66 75 6e 63 2a 29 3b 0a 20 20 7d  lite_func*);.  }
26b0: 20 61 41 67 67 73 5b 5d 20 3d 20 7b 0a 20 20 20   aAggs[] = {.   
26c0: 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 31 2c 20   { "min",    1, 
26d0: 6d 69 6e 53 74 65 70 2c 20 20 20 20 20 20 6d 69  minStep,      mi
26e0: 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a  nMaxFinalize },.
26f0: 20 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20      { "max",    
2700: 31 2c 20 6d 61 78 53 74 65 70 2c 20 20 20 20 20  1, maxStep,     
2710: 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20   minMaxFinalize 
2720: 7d 2c 0a 20 20 20 20 7b 20 22 73 75 6d 22 2c 20  },.    { "sum", 
2730: 20 20 20 31 2c 20 73 75 6d 53 74 65 70 2c 20 20     1, sumStep,  
2740: 20 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a 65 20      sumFinalize 
2750: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76 67     },.    { "avg
2760: 22 2c 20 20 20 20 31 2c 20 73 75 6d 53 74 65 70  ",    1, sumStep
2770: 2c 20 20 20 20 20 20 61 76 67 46 69 6e 61 6c 69  ,      avgFinali
2780: 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  ze    },.    { "
2790: 63 6f 75 6e 74 22 2c 20 20 30 2c 20 63 6f 75 6e  count",  0, coun
27a0: 74 53 74 65 70 2c 20 20 20 20 63 6f 75 6e 74 46  tStep,    countF
27b0: 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 20 20  inalize  },.    
27c0: 7b 20 22 63 6f 75 6e 74 22 2c 20 20 31 2c 20 63  { "count",  1, c
27d0: 6f 75 6e 74 53 74 65 70 2c 20 20 20 20 63 6f 75  ountStep,    cou
27e0: 6e 74 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 23  ntFinalize  },.#
27f0: 69 66 20 30 0a 20 20 20 20 7b 20 22 73 74 64 64  if 0.    { "stdd
2800: 65 76 22 2c 20 31 2c 20 73 74 64 44 65 76 53 74  ev", 1, stdDevSt
2810: 65 70 2c 20 20 20 73 74 64 44 65 76 46 69 6e 61  ep,   stdDevFina
2820: 6c 69 7a 65 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  lize },.#endif. 
2830: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   };.  int i;..  
2840: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2850: 66 28 61 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66  f(aFuncs)/sizeof
2860: 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b  (aFuncs[0]); i++
2870: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 63 72  ){.    sqlite_cr
2880: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
2890: 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d  , aFuncs[i].zNam
28a0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 46  e,.           aF
28b0: 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 20 61 46  uncs[i].nArg, aF
28c0: 75 6e 63 73 5b 69 5d 2e 78 46 75 6e 63 2c 20 30  uncs[i].xFunc, 0
28d0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
28e0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 41 67 67 73  ; i<sizeof(aAggs
28f0: 29 2f 73 69 7a 65 6f 66 28 61 41 67 67 73 5b 30  )/sizeof(aAggs[0
2900: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ]); i++){.    sq
2910: 6c 69 74 65 5f 63 72 65 61 74 65 5f 61 67 67 72  lite_create_aggr
2920: 65 67 61 74 65 28 64 62 2c 20 61 41 67 67 73 5b  egate(db, aAggs[
2930: 69 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  i].zName,.      
2940: 20 20 20 20 20 61 41 67 67 73 5b 69 5d 2e 6e 41       aAggs[i].nA
2950: 72 67 2c 20 61 41 67 67 73 5b 69 5d 2e 78 53 74  rg, aAggs[i].xSt
2960: 65 70 2c 20 61 41 67 67 73 5b 69 5d 2e 78 46 69  ep, aAggs[i].xFi
2970: 6e 61 6c 69 7a 65 2c 20 30 29 3b 0a 20 20 7d 0a  nalize, 0);.  }.
2980: 7d 0a                                            }.