/ Hex Artifact Content
Login

Artifact a31dcba85bc2ecb9b752980289cf7e6cd0cafbce:


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 36 20 32 30 30 32 2f 30 34 2f 32 30 20  1.16 2002/04/20 
02a0: 31 34 3a 32 34 3a 34 32 20 64 72 68 20 45 78 70  14:24:42 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 49  r());.}../*.** I
1240: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1250: 20 74 68 65 20 6c 61 73 74 5f 69 6e 73 65 72 74   the last_insert
1260: 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75 6e  _rowid() SQL fun
1270: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75  ction.  The retu
1280: 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 74  rn.** value is t
1290: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
12a0: 71 6c 69 74 65 5f 6c 61 73 74 5f 69 6e 73 65 72  qlite_last_inser
12b0: 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66 75  t_rowid() API fu
12c0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
12d0: 63 20 76 6f 69 64 20 6c 61 73 74 5f 69 6e 73 65  c void last_inse
12e0: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 5f  rt_rowid(sqlite_
12f0: 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69  func *context, i
1300: 6e 74 20 61 72 67 2c 20 63 6f 6e 73 74 20 63 68  nt arg, const ch
1310: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73 71  ar **argv){.  sq
1320: 6c 69 74 65 20 2a 64 62 20 3d 20 73 71 6c 69 74  lite *db = sqlit
1330: 65 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  e_user_data(cont
1340: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f 73  ext);.  sqlite_s
1350: 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  et_result_int(co
1360: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 5f 6c 61  ntext, sqlite_la
1370: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
1380: 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  db));.}../*.** I
1390: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
13a0: 20 74 68 65 20 6c 69 6b 65 28 29 20 53 51 4c 20   the like() SQL 
13b0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
13c0: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
13d0: 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  nts.** the build
13e0: 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  -in LIKE operato
13f0: 72 2e 20 20 54 68 65 20 66 69 72 73 74 20 61 72  r.  The first ar
1400: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
1410: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a  nction is the.**
1420: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1430: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1440: 69 73 20 74 68 65 20 70 61 74 74 65 72 6e 2e 20  is the pattern. 
1450: 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73 74 61   So, the SQL sta
1460: 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  tements:.**.**  
1470: 20 20 20 20 20 41 20 4c 49 4b 45 20 42 0a 2a 2a       A LIKE B.**
1480: 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  .** is implement
1490: 65 64 20 61 73 20 6c 69 6b 65 28 41 2c 42 29 2e  ed as like(A,B).
14a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14b0: 6c 69 6b 65 46 75 6e 63 28 73 71 6c 69 74 65 5f  likeFunc(sqlite_
14c0: 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69  func *context, i
14d0: 6e 74 20 61 72 67 2c 20 63 6f 6e 73 74 20 63 68  nt arg, const ch
14e0: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73 71  ar **argv){.  sq
14f0: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f  lite_set_result_
1500: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20  int(context, .  
1510: 20 20 20 73 71 6c 69 74 65 4c 69 6b 65 43 6f 6d     sqliteLikeCom
1520: 70 61 72 65 28 61 72 67 76 5b 30 5d 20 3f 20 61  pare(argv[0] ? a
1530: 72 67 76 5b 30 5d 20 3a 20 22 22 2c 61 72 67 76  rgv[0] : "",argv
1540: 5b 31 5d 20 3f 20 61 72 67 76 5b 31 5d 20 3a 20  [1] ? argv[1] : 
1550: 22 22 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ""));.}../*.** I
1560: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1570: 20 74 68 65 20 67 6c 6f 62 28 29 20 53 51 4c 20   the glob() SQL 
1580: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
1590: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
15a0: 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  nts.** the build
15b0: 2d 69 6e 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f  -in GLOB operato
15c0: 72 2e 20 20 54 68 65 20 66 69 72 73 74 20 61 72  r.  The first ar
15d0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
15e0: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a  nction is the.**
15f0: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1600: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1610: 69 73 20 74 68 65 20 70 61 74 74 65 72 6e 2e 20  is the pattern. 
1620: 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73 74 61   So, the SQL sta
1630: 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  tements:.**.**  
1640: 20 20 20 20 20 41 20 47 4c 4f 42 20 42 0a 2a 2a       A GLOB B.**
1650: 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  .** is implement
1660: 65 64 20 61 73 20 67 6c 6f 62 28 41 2c 42 29 2e  ed as glob(A,B).
1670: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1680: 67 6c 6f 62 46 75 6e 63 28 73 71 6c 69 74 65 5f  globFunc(sqlite_
1690: 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69  func *context, i
16a0: 6e 74 20 61 72 67 2c 20 63 6f 6e 73 74 20 63 68  nt arg, const ch
16b0: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73 71  ar **argv){.  sq
16c0: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f  lite_set_result_
16d0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20  int(context,.   
16e0: 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70 61   sqliteGlobCompa
16f0: 72 65 28 61 72 67 76 5b 30 5d 20 3f 20 61 72 67  re(argv[0] ? arg
1700: 76 5b 30 5d 20 3a 20 22 22 2c 61 72 67 76 5b 31  v[0] : "",argv[1
1710: 5d 20 3f 20 61 72 67 76 5b 31 5d 20 3a 20 22 22  ] ? argv[1] : ""
1720: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ));.}../*.** An 
1730: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1740: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1750: 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20 63 6f  ure holds the co
1760: 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20 73 75  ntext of a.** su
1770: 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61 67 67  m() or avg() agg
1780: 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61 74 69  regate computati
1790: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
17a0: 74 72 75 63 74 20 53 75 6d 43 74 78 20 53 75 6d  truct SumCtx Sum
17b0: 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75 6d 43  Ctx;.struct SumC
17c0: 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20 73 75  tx {.  double su
17d0: 6d 3b 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f 66  m;     /* Sum of
17e0: 20 74 65 72 6d 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   terms */.};../*
17f0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65  .** Routines use
1800: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
1810: 20 73 75 6d 20 6f 72 20 61 76 65 72 61 67 65 2e   sum or average.
1820: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1830: 73 75 6d 53 74 65 70 28 73 71 6c 69 74 65 5f 66  sumStep(sqlite_f
1840: 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  unc *context, in
1850: 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
1860: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75  ar **argv){.  Su
1870: 6d 43 74 78 20 2a 70 3b 0a 20 20 64 6f 75 62 6c  mCtx *p;.  doubl
1880: 65 20 78 3b 0a 20 20 69 66 28 20 61 72 67 63 3c  e x;.  if( argc<
1890: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  1 ) return;.  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 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
18e0: 74 75 72 6e 3b 0a 20 20 78 20 3d 20 61 72 67 76  turn;.  x = argv
18f0: 5b 30 5d 20 3f 20 61 74 6f 66 28 61 72 67 76 5b  [0] ? atof(argv[
1900: 30 5d 29 20 3a 20 30 2e 30 3b 0a 20 20 70 2d 3e  0]) : 0.0;.  p->
1910: 73 75 6d 20 2b 3d 20 78 3b 0a 7d 0a 73 74 61 74  sum += x;.}.stat
1920: 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c  ic void sumFinal
1930: 69 7a 65 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  ize(sqlite_func 
1940: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d  *context){.  Sum
1950: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
1960: 6c 69 74 65 5f 61 67 67 72 65 67 61 74 65 5f 63  lite_aggregate_c
1970: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
1980: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 73  sizeof(*p));.  s
1990: 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74  qlite_set_result
19a0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
19b0: 20 70 20 3f 20 70 2d 3e 73 75 6d 20 3a 20 30 2e   p ? p->sum : 0.
19c0: 30 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  0);.}.static voi
19d0: 64 20 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71  d avgFinalize(sq
19e0: 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65  lite_func *conte
19f0: 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70  xt){.  SumCtx *p
1a00: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 4e 3b 0a 20  ;.  double rN;. 
1a10: 20 70 20 3d 20 73 71 6c 69 74 65 5f 61 67 67 72   p = sqlite_aggr
1a20: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
1a30: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
1a40: 29 29 3b 0a 20 20 72 4e 20 3d 20 73 71 6c 69 74  ));.  rN = sqlit
1a50: 65 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  e_aggregate_coun
1a60: 74 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69 66  t(context);.  if
1a70: 28 20 70 20 26 26 20 72 4e 3e 30 2e 30 20 29 7b  ( p && rN>0.0 ){
1a80: 0a 20 20 20 20 73 71 6c 69 74 65 5f 73 65 74 5f  .    sqlite_set_
1a90: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
1aa0: 6e 74 65 78 74 2c 20 70 2d 3e 73 75 6d 2f 72 4e  ntext, p->sum/rN
1ab0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1ac0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
1ad0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1ae0: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65  ucture holds the
1af0: 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a   context of a.**
1b00: 20 76 61 72 69 61 6e 63 65 20 6f 72 20 73 74 61   variance or sta
1b10: 6e 64 61 72 64 20 64 65 76 69 61 74 69 6f 6e 20  ndard deviation 
1b20: 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  computation..*/.
1b30: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1b40: 74 64 44 65 76 43 74 78 20 53 74 64 44 65 76 43  tdDevCtx StdDevC
1b50: 74 78 3b 0a 73 74 72 75 63 74 20 53 74 64 44 65  tx;.struct StdDe
1b60: 76 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20  vCtx {.  double 
1b70: 73 75 6d 3b 20 20 20 20 20 2f 2a 20 53 75 6d 20  sum;     /* Sum 
1b80: 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 64 6f  of terms */.  do
1b90: 75 62 6c 65 20 73 75 6d 32 3b 20 20 20 20 2f 2a  uble sum2;    /*
1ba0: 20 53 75 6d 20 6f 66 20 74 68 65 20 73 71 75 61   Sum of the squa
1bb0: 72 65 73 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a  res of terms */.
1bc0: 7d 3b 0a 0a 23 69 66 20 30 20 20 20 2f 2a 20 4f  };..#if 0   /* O
1bd0: 6d 69 74 20 62 65 63 61 75 73 65 20 6d 61 74 68  mit because math
1be0: 20 6c 69 62 72 61 72 79 20 69 73 20 72 65 71 75   library is requ
1bf0: 69 72 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ired */./*.** Ro
1c00: 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63  utines used to c
1c10: 6f 6d 70 75 74 65 20 74 68 65 20 73 74 61 6e 64  ompute the stand
1c20: 61 72 64 20 64 65 76 69 61 74 69 6f 6e 20 61 73  ard deviation as
1c30: 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   an aggregate..*
1c40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
1c50: 64 44 65 76 53 74 65 70 28 73 71 6c 69 74 65 5f  dDevStep(sqlite_
1c60: 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69  func *context, i
1c70: 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
1c80: 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53  har **argv){.  S
1c90: 74 64 44 65 76 43 74 78 20 2a 70 3b 0a 20 20 64  tdDevCtx *p;.  d
1ca0: 6f 75 62 6c 65 20 78 3b 0a 20 20 69 66 28 20 61  ouble x;.  if( a
1cb0: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
1cc0: 20 20 70 20 3d 20 73 71 6c 69 74 65 5f 61 67 67    p = sqlite_agg
1cd0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
1ce0: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1cf0: 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  p));.  if( p==0 
1d00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 20 3d 20  ) return;.  x = 
1d10: 61 72 67 76 5b 30 5d 20 3f 20 61 74 6f 66 28 61  argv[0] ? atof(a
1d20: 72 67 76 5b 30 5d 29 20 3a 20 30 2e 30 3b 0a 20  rgv[0]) : 0.0;. 
1d30: 20 70 2d 3e 73 75 6d 20 2b 3d 20 78 3b 0a 20 20   p->sum += x;.  
1d40: 70 2d 3e 73 75 6d 32 20 2b 3d 20 78 2a 78 3b 0a  p->sum2 += x*x;.
1d50: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  }.static void st
1d60: 64 44 65 76 46 69 6e 61 6c 69 7a 65 28 73 71 6c  dDevFinalize(sql
1d70: 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78  ite_func *contex
1d80: 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72 4e 20  t){.  double rN 
1d90: 3d 20 73 71 6c 69 74 65 5f 61 67 67 72 65 67 61  = sqlite_aggrega
1da0: 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74  te_count(context
1db0: 29 3b 0a 20 20 53 74 64 44 65 76 43 74 78 20 2a  );.  StdDevCtx *
1dc0: 70 20 3d 20 73 71 6c 69 74 65 5f 61 67 67 72 65  p = sqlite_aggre
1dd0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
1de0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
1df0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 72 4e  );.  if( p && rN
1e00: 3e 31 2e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  >1.0 ){.    sqli
1e10: 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f 64 6f  te_set_result_do
1e20: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 0a 20  uble(context, . 
1e30: 20 20 20 20 20 20 73 71 72 74 28 28 70 2d 3e 73        sqrt((p->s
1e40: 75 6d 32 20 2d 20 70 2d 3e 73 75 6d 2a 70 2d 3e  um2 - p->sum*p->
1e50: 73 75 6d 2f 72 4e 29 2f 28 72 4e 2d 31 2e 30 29  sum/rN)/(rN-1.0)
1e60: 29 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ));.  }.}.#endif
1e70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1e80: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1e90: 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73  keeps track of s
1ea0: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
1eb0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e   for the.** coun
1ec0: 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  t() aggregate fu
1ed0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
1ee0: 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43  ef struct CountC
1ef0: 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72  tx CountCtx;.str
1f00: 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20  uct CountCtx {. 
1f10: 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a   int n;.};../*.*
1f20: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
1f30: 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  plement the coun
1f40: 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  t() aggregate fu
1f50: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
1f60: 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70  c void countStep
1f70: 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f  (sqlite_func *co
1f80: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
1f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
1fa0: 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  gv){.  CountCtx 
1fb0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
1fc0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1fd0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
1fe0: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28  of(*p));.  if( (
1ff0: 61 72 67 63 3d 3d 30 20 7c 7c 20 61 72 67 76 5b  argc==0 || argv[
2000: 30 5d 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20  0]) && p ){.    
2010: 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20 20 20  p->n++;.  }.}   
2020: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
2030: 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  ntFinalize(sqlit
2040: 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 29  e_func *context)
2050: 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b  {.  CountCtx *p;
2060: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 5f 61 67  .  p = sqlite_ag
2070: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2080: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
2090: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 5f 73  *p));.  sqlite_s
20a0: 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  et_result_int(co
20b0: 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20  ntext, p ? p->n 
20c0: 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  : 0);.}../*.** T
20d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 72 61  his function tra
20e0: 63 6b 73 20 73 74 61 74 65 20 69 6e 66 6f 72 6d  cks state inform
20f0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6d 69  ation for the mi
2100: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 0a 2a 2a  n() and max().**
2110: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2120: 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ions..*/.typedef
2130: 20 73 74 72 75 63 74 20 4d 69 6e 4d 61 78 43 74   struct MinMaxCt
2140: 78 20 4d 69 6e 4d 61 78 43 74 78 3b 0a 73 74 72  x MinMaxCtx;.str
2150: 75 63 74 20 4d 69 6e 4d 61 78 43 74 78 20 7b 0a  uct MinMaxCtx {.
2160: 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
2170: 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74 20 73     /* The best s
2180: 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20  o far */.  char 
2190: 7a 42 75 66 5b 32 38 5d 3b 20 20 20 2f 2a 20 53  zBuf[28];   /* S
21a0: 70 61 63 65 20 74 68 61 74 20 63 61 6e 20 62 65  pace that can be
21b0: 20 75 73 65 64 20 66 6f 72 20 73 74 6f 72 61 67   used for storag
21c0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
21d0: 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65  outines to imple
21e0: 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64 20 6d  ment min() and m
21f0: 61 78 28 29 20 61 67 67 72 65 67 61 74 65 20 66  ax() aggregate f
2200: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  unctions..*/.sta
2210: 74 69 63 20 76 6f 69 64 20 6d 69 6e 53 74 65 70  tic void minStep
2220: 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f  (sqlite_func *co
2230: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
2240: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
2250: 67 76 29 7b 0a 20 20 4d 69 6e 4d 61 78 43 74 78  gv){.  MinMaxCtx
2260: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
2270: 65 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  e_aggregate_cont
2280: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
2290: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
22a0: 70 3d 3d 30 20 7c 7c 20 61 72 67 63 3c 31 20 29  p==0 || argc<1 )
22b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
22c0: 71 6c 69 74 65 5f 61 67 67 72 65 67 61 74 65 5f  qlite_aggregate_
22d0: 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 3d 3d  count(context)==
22e0: 31 20 7c 7c 20 73 71 6c 69 74 65 43 6f 6d 70 61  1 || sqliteCompa
22f0: 72 65 28 61 72 67 76 5b 30 5d 2c 70 2d 3e 7a 29  re(argv[0],p->z)
2300: 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  <0 ){.    if( p-
2310: 3e 7a 20 26 26 20 70 2d 3e 7a 21 3d 70 2d 3e 7a  >z && p->z!=p->z
2320: 42 75 66 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Buf ){.      sql
2330: 69 74 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a 20  iteFree(p->z);. 
2340: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 72 67     }.    if( arg
2350: 76 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  v[0] ){.      in
2360: 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 61  t len = strlen(a
2370: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  rgv[0]);.      i
2380: 66 28 20 6c 65 6e 20 3c 20 73 69 7a 65 6f 66 28  f( len < sizeof(
2390: 70 2d 3e 7a 42 75 66 29 20 29 7b 0a 20 20 20 20  p->zBuf) ){.    
23a0: 20 20 20 20 70 2d 3e 7a 20 3d 20 70 2d 3e 7a 42      p->z = p->zB
23b0: 75 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  uf;.      }else{
23c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 20 3d 20  .        p->z = 
23d0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6c 65  sqliteMalloc( le
23e0: 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  n+1 );.        i
23f0: 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 72 65 74  f( p->z==0 ) ret
2400: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
2410: 20 20 20 73 74 72 63 70 79 28 70 2d 3e 7a 2c 20     strcpy(p->z, 
2420: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7d 65  argv[0]);.    }e
2430: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 20  lse{.      p->z 
2440: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
2450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 78  .static void max
2460: 53 74 65 70 28 73 71 6c 69 74 65 5f 66 75 6e 63  Step(sqlite_func
2470: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
2480: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
2490: 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 69 6e 4d 61  **argv){.  MinMa
24a0: 78 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  xCtx *p;.  p = s
24b0: 71 6c 69 74 65 5f 61 67 67 72 65 67 61 74 65 5f  qlite_aggregate_
24c0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
24d0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
24e0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 61 72 67 63  if( p==0 || argc
24f0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  <1 ) return;.  i
2500: 66 28 20 73 71 6c 69 74 65 5f 61 67 67 72 65 67  f( sqlite_aggreg
2510: 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78  ate_count(contex
2520: 74 29 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65 43  t)==1 || sqliteC
2530: 6f 6d 70 61 72 65 28 61 72 67 76 5b 30 5d 2c 70  ompare(argv[0],p
2540: 2d 3e 7a 29 3e 30 20 29 7b 0a 20 20 20 20 69 66  ->z)>0 ){.    if
2550: 28 20 70 2d 3e 7a 20 26 26 20 70 2d 3e 7a 21 3d  ( p->z && p->z!=
2560: 70 2d 3e 7a 42 75 66 20 29 7b 0a 20 20 20 20 20  p->zBuf ){.     
2570: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
2580: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2590: 20 61 72 67 76 5b 30 5d 20 29 7b 0a 20 20 20 20   argv[0] ){.    
25a0: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
25b0: 65 6e 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  en(argv[0]);.   
25c0: 20 20 20 69 66 28 20 6c 65 6e 20 3c 20 73 69 7a     if( len < siz
25d0: 65 6f 66 28 70 2d 3e 7a 42 75 66 29 20 29 7b 0a  eof(p->zBuf) ){.
25e0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 20 3d 20 70          p->z = p
25f0: 2d 3e 7a 42 75 66 3b 0a 20 20 20 20 20 20 7d 65  ->zBuf;.      }e
2600: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
2610: 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  z = sqliteMalloc
2620: 28 20 6c 65 6e 2b 31 20 29 3b 0a 20 20 20 20 20  ( len+1 );.     
2630: 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29     if( p->z==0 )
2640: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
2650: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 70 2d  .      strcpy(p-
2660: 3e 7a 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  >z, argv[0]);.  
2670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2680: 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ->z = 0;.    }. 
2690: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
26a0: 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 28   minMaxFinalize(
26b0: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e  sqlite_func *con
26c0: 74 65 78 74 29 7b 0a 20 20 4d 69 6e 4d 61 78 43  text){.  MinMaxC
26d0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
26e0: 69 74 65 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  ite_aggregate_co
26f0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
2700: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2710: 28 20 70 20 26 26 20 70 2d 3e 7a 20 29 7b 0a 20  ( p && p->z ){. 
2720: 20 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65     sqlite_set_re
2730: 73 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74  sult_string(cont
2740: 65 78 74 2c 20 70 2d 3e 7a 2c 20 73 74 72 6c 65  ext, p->z, strle
2750: 6e 28 70 2d 3e 7a 29 29 3b 0a 20 20 7d 0a 20 20  n(p->z));.  }.  
2760: 69 66 28 20 70 20 26 26 20 70 2d 3e 7a 20 26 26  if( p && p->z &&
2770: 20 70 2d 3e 7a 21 3d 70 2d 3e 7a 42 75 66 20 29   p->z!=p->zBuf )
2780: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
2790: 28 70 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (p->z);.  }.}../
27a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27b0: 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 61 6c  on registered al
27c0: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 43  l of the above C
27d0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 53 51   functions as SQ
27e0: 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20  L.** functions. 
27f0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
2800: 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65  the only routine
2810: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 77 69   in this file wi
2820: 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20 6c  th.** external l
2830: 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  inkage..*/.void 
2840: 73 71 6c 69 74 65 52 65 67 69 73 74 65 72 42 75  sqliteRegisterBu
2850: 69 6c 64 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73  ildinFunctions(s
2860: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 73 74  qlite *db){.  st
2870: 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
2880: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
2890: 20 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20       int nArg;. 
28a0: 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63      void (*xFunc
28b0: 29 28 73 71 6c 69 74 65 5f 66 75 6e 63 2a 2c 69  )(sqlite_func*,i
28c0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  nt,const char**)
28d0: 3b 0a 20 20 7d 20 61 46 75 6e 63 73 5b 5d 20 3d  ;.  } aFuncs[] =
28e0: 20 7b 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20   {.    { "min", 
28f0: 20 20 20 20 20 20 2d 31 2c 20 6d 69 6e 46 75 6e        -1, minFun
2900: 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d  c    },.    { "m
2910: 69 6e 22 2c 20 20 20 20 20 20 20 20 30 2c 20 30  in",        0, 0
2920: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2930: 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 20 20 20   { "max",       
2940: 2d 31 2c 20 6d 61 78 46 75 6e 63 20 20 20 20 7d  -1, maxFunc    }
2950: 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22 2c 20 20  ,.    { "max",  
2960: 20 20 20 20 20 20 30 2c 20 30 20 20 20 20 20 20        0, 0      
2970: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65      },.    { "le
2980: 6e 67 74 68 22 2c 20 20 20 20 20 31 2c 20 6c 65  ngth",     1, le
2990: 6e 67 74 68 46 75 6e 63 20 7d 2c 0a 20 20 20 20  ngthFunc },.    
29a0: 7b 20 22 73 75 62 73 74 72 22 2c 20 20 20 20 20  { "substr",     
29b0: 33 2c 20 73 75 62 73 74 72 46 75 6e 63 20 7d 2c  3, substrFunc },
29c0: 0a 20 20 20 20 7b 20 22 61 62 73 22 2c 20 20 20  .    { "abs",   
29d0: 20 20 20 20 20 31 2c 20 61 62 73 46 75 6e 63 20       1, absFunc 
29e0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6f 75     },.    { "rou
29f0: 6e 64 22 2c 20 20 20 20 20 20 31 2c 20 72 6f 75  nd",      1, rou
2a00: 6e 64 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b  ndFunc  },.    {
2a10: 20 22 72 6f 75 6e 64 22 2c 20 20 20 20 20 20 32   "round",      2
2a20: 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c 0a  , roundFunc  },.
2a30: 20 20 20 20 7b 20 22 75 70 70 65 72 22 2c 20 20      { "upper",  
2a40: 20 20 20 20 31 2c 20 75 70 70 65 72 46 75 6e 63      1, upperFunc
2a50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 77 65    },.    { "lowe
2a60: 72 22 2c 20 20 20 20 20 20 31 2c 20 6c 6f 77 65  r",      1, lowe
2a70: 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20  rFunc  },.    { 
2a80: 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 2d 31 2c  "coalesce",  -1,
2a90: 20 69 66 6e 75 6c 6c 46 75 6e 63 20 7d 2c 0a 20   ifnullFunc },. 
2aa0: 20 20 20 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c     { "coalesce",
2ab0: 20 20 20 30 2c 20 30 20 20 20 20 20 20 20 20 20     0, 0         
2ac0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65   },.    { "coale
2ad0: 73 63 65 22 2c 20 20 20 31 2c 20 30 20 20 20 20  sce",   1, 0    
2ae0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2af0: 72 61 6e 64 6f 6d 22 2c 20 20 20 20 2d 31 2c 20  random",    -1, 
2b00: 72 61 6e 64 6f 6d 46 75 6e 63 20 7d 2c 0a 20 20  randomFunc },.  
2b10: 20 20 7b 20 22 6c 69 6b 65 22 2c 20 20 20 20 20    { "like",     
2b20: 20 20 32 2c 20 6c 69 6b 65 46 75 6e 63 20 20 20    2, likeFunc   
2b30: 7d 2c 0a 20 20 20 20 7b 20 22 67 6c 6f 62 22 2c  },.    { "glob",
2b40: 20 20 20 20 20 20 20 32 2c 20 67 6c 6f 62 46 75         2, globFu
2b50: 6e 63 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73  nc   },.  };.  s
2b60: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
2b70: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
2b80: 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
2b90: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
2ba0: 73 71 6c 69 74 65 5f 66 75 6e 63 2a 2c 69 6e 74  sqlite_func*,int
2bb0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a  ,const char**);.
2bc0: 20 20 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61      void (*xFina
2bd0: 6c 69 7a 65 29 28 73 71 6c 69 74 65 5f 66 75 6e  lize)(sqlite_fun
2be0: 63 2a 29 3b 0a 20 20 7d 20 61 41 67 67 73 5b 5d  c*);.  } aAggs[]
2bf0: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6d 69 6e 22   = {.    { "min"
2c00: 2c 20 20 20 20 31 2c 20 6d 69 6e 53 74 65 70 2c  ,    1, minStep,
2c10: 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61        minMaxFina
2c20: 6c 69 7a 65 20 7d 2c 0a 20 20 20 20 7b 20 22 6d  lize },.    { "m
2c30: 61 78 22 2c 20 20 20 20 31 2c 20 6d 61 78 53 74  ax",    1, maxSt
2c40: 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  ep,      minMaxF
2c50: 69 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20 20 20 7b  inalize },.    {
2c60: 20 22 73 75 6d 22 2c 20 20 20 20 31 2c 20 73 75   "sum",    1, su
2c70: 6d 53 74 65 70 2c 20 20 20 20 20 20 73 75 6d 46  mStep,      sumF
2c80: 69 6e 61 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20  inalize    },.  
2c90: 20 20 7b 20 22 61 76 67 22 2c 20 20 20 20 31 2c    { "avg",    1,
2ca0: 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 61   sumStep,      a
2cb0: 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20 7d 2c  vgFinalize    },
2cc0: 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74 22 2c 20  .    { "count", 
2cd0: 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20   0, countStep,  
2ce0: 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20    countFinalize 
2cf0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74   },.    { "count
2d00: 22 2c 20 20 31 2c 20 63 6f 75 6e 74 53 74 65 70  ",  1, countStep
2d10: 2c 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69  ,    countFinali
2d20: 7a 65 20 20 7d 2c 0a 23 69 66 20 30 0a 20 20 20  ze  },.#if 0.   
2d30: 20 7b 20 22 73 74 64 64 65 76 22 2c 20 31 2c 20   { "stddev", 1, 
2d40: 73 74 64 44 65 76 53 74 65 70 2c 20 20 20 73 74  stdDevStep,   st
2d50: 64 44 65 76 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a  dDevFinalize },.
2d60: 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e  #endif.  };.  in
2d70: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  t i;..  for(i=0;
2d80: 20 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 73   i<sizeof(aFuncs
2d90: 29 2f 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b  )/sizeof(aFuncs[
2da0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  0]); i++){.    s
2db0: 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 66 75 6e  qlite_create_fun
2dc0: 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73  ction(db, aFuncs
2dd0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  [i].zName,.     
2de0: 20 20 20 20 20 20 61 46 75 6e 63 73 5b 69 5d 2e        aFuncs[i].
2df0: 6e 41 72 67 2c 20 61 46 75 6e 63 73 5b 69 5d 2e  nArg, aFuncs[i].
2e00: 78 46 75 6e 63 2c 20 30 29 3b 0a 20 20 7d 0a 20  xFunc, 0);.  }. 
2e10: 20 73 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 66   sqlite_create_f
2e20: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 61 73  unction(db, "las
2e30: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
2e40: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
2e50: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
2e60: 64 2c 20 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  d, db);.  for(i=
2e70: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 41 67 67  0; i<sizeof(aAgg
2e80: 73 29 2f 73 69 7a 65 6f 66 28 61 41 67 67 73 5b  s)/sizeof(aAggs[
2e90: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  0]); i++){.    s
2ea0: 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 61 67 67  qlite_create_agg
2eb0: 72 65 67 61 74 65 28 64 62 2c 20 61 41 67 67 73  regate(db, aAggs
2ec0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  [i].zName,.     
2ed0: 20 20 20 20 20 20 61 41 67 67 73 5b 69 5d 2e 6e        aAggs[i].n
2ee0: 41 72 67 2c 20 61 41 67 67 73 5b 69 5d 2e 78 53  Arg, aAggs[i].xS
2ef0: 74 65 70 2c 20 61 41 67 67 73 5b 69 5d 2e 78 46  tep, aAggs[i].xF
2f00: 69 6e 61 6c 69 7a 65 2c 20 30 29 3b 0a 20 20 7d  inalize, 0);.  }
2f10: 0a 7d 0a                                         .}.