/ Hex Artifact Content
Login

Artifact 333bbc06cc281f4dbded5dfc4faa1457764bc1b3:


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 34 39 20 32 30 30 34 2f 30 35 2f 32 34 20  1.49 2004/05/24 
02a0: 30 37 3a 30 34 3a 32 36 20 64 61 6e 69 65 6c 6b  07:04:26 danielk
02b0: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
02c0: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
02d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 74 68 2e  .#include <math.
02e0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
02f0: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0300: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
0310: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0320: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
0330: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  "../*.** Impleme
0340: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  ntation of the n
0350: 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 6d 69 6e  on-aggregate min
0360: 28 29 20 61 6e 64 20 6d 61 78 28 29 20 66 75 6e  () and max() fun
0370: 63 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63  ctions.*/.static
0380: 20 76 6f 69 64 20 6d 69 6e 6d 61 78 46 75 6e 63   void minmaxFunc
0390: 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f  (sqlite_func *co
03a0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
03b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
03c0: 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  gv){.  const cha
03d0: 72 20 2a 7a 42 65 73 74 3b 20 0a 20 20 69 6e 74  r *zBest; .  int
03e0: 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6d   i;.  int (*xCom
03f0: 70 61 72 65 29 28 63 6f 6e 73 74 20 63 68 61 72  pare)(const char
0400: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
0410: 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 20 20 20 20  .  int mask;    
0420: 2f 2a 20 30 20 66 6f 72 20 6d 69 6e 28 29 20 6f  /* 0 for min() o
0430: 72 20 30 78 66 66 66 66 66 66 66 66 20 66 6f 72  r 0xffffffff for
0440: 20 6d 61 78 28 29 20 2a 2f 0a 0a 20 20 69 66 28   max() */..  if(
0450: 20 61 72 67 63 3d 3d 30 20 29 20 72 65 74 75 72   argc==0 ) retur
0460: 6e 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 69 6e 74  n;.  mask = (int
0470: 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
0480: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a  ta(context);.  z
0490: 42 65 73 74 20 3d 20 61 72 67 76 5b 30 5d 3b 0a  Best = argv[0];.
04a0: 20 20 69 66 28 20 7a 42 65 73 74 3d 3d 30 20 29    if( zBest==0 )
04b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 61   return;.  if( a
04c0: 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 6e 27 20 29  rgv[1][0]=='n' )
04d0: 7b 0a 20 20 20 20 78 43 6f 6d 70 61 72 65 20 3d  {.    xCompare =
04e0: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 3b   sqlite3Compare;
04f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 43  .  }else{.    xC
0500: 6f 6d 70 61 72 65 20 3d 20 73 74 72 63 6d 70 3b  ompare = strcmp;
0510: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
0520: 69 3c 61 72 67 63 3b 20 69 2b 3d 32 29 7b 0a 20  i<argc; i+=2){. 
0530: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d     if( argv[i]==
0540: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
0550: 69 66 28 20 28 78 43 6f 6d 70 61 72 65 28 61 72  if( (xCompare(ar
0560: 67 76 5b 69 5d 2c 20 7a 42 65 73 74 29 5e 6d 61  gv[i], zBest)^ma
0570: 73 6b 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 7a  sk)<0 ){.      z
0580: 42 65 73 74 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  Best = argv[i];.
0590: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
05a0: 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73  te3_set_result_s
05b0: 74 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a  tring(context, z
05c0: 42 65 73 74 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a  Best, -1);.}../*
05d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
05e0: 79 70 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d  ype of the argum
05f0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
0600: 6f 69 64 20 74 79 70 65 6f 66 46 75 6e 63 28 73  oid typeofFunc(s
0610: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74  qlite_func *cont
0620: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  ext, int argc, c
0630: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
0640: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ){.  assert( arg
0650: 63 3d 3d 32 20 29 3b 0a 20 20 73 71 6c 69 74 65  c==2 );.  sqlite
0660: 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72  3_set_result_str
0670: 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  ing(context, arg
0680: 76 5b 31 5d 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a  v[1], -1);.}../*
0690: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
06a0: 6f 6e 20 6f 66 20 74 68 65 20 6c 65 6e 67 74 68  on of the length
06b0: 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73  () function.*/.s
06c0: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 6e 67 74  tatic void lengt
06d0: 68 46 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e  hFunc(sqlite_fun
06e0: 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  c *context, int 
06f0: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
0700: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73   **argv){.  cons
0710: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
0720: 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28   len;..  assert(
0730: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a 20   argc==1 );.  z 
0740: 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 69 66 28  = argv[0];.  if(
0750: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
0760: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 54  #ifdef SQLITE_UT
0770: 46 38 0a 20 20 66 6f 72 28 6c 65 6e 3d 30 3b 20  F8.  for(len=0; 
0780: 2a 7a 3b 20 7a 2b 2b 29 7b 20 69 66 28 20 28 30  *z; z++){ if( (0
0790: 78 63 30 26 2a 7a 29 21 3d 30 78 38 30 20 29 20  xc0&*z)!=0x80 ) 
07a0: 6c 65 6e 2b 2b 3b 20 7d 0a 23 65 6c 73 65 0a 20  len++; }.#else. 
07b0: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29   len = strlen(z)
07c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
07d0: 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 69 6e  e3_set_result_in
07e0: 74 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e 29 3b  t(context, len);
07f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
0800: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0810: 61 62 73 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a  abs() function.*
0820: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 62  /.static void ab
0830: 73 46 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e  sFunc(sqlite_fun
0840: 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  c *context, int 
0850: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
0860: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73   **argv){.  cons
0870: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 61 73 73  t char *z;.  ass
0880: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a  ert( argc==1 );.
0890: 20 20 7a 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20    z = argv[0];. 
08a0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
08b0: 72 6e 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  rn;.  if( z[0]==
08c0: 27 2d 27 20 26 26 20 69 73 64 69 67 69 74 28 7a  '-' && isdigit(z
08d0: 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 73 71  [1]) ) z++;.  sq
08e0: 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74  lite3_set_result
08f0: 5f 73 74 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c  _string(context,
0900: 20 7a 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   z, -1);.}../*.*
0910: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
0920: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 28 29   of the substr()
0930: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61   function.*/.sta
0940: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 72 46  tic void substrF
0950: 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  unc(sqlite_func 
0960: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
0970: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
0980: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
0990: 63 68 61 72 20 2a 7a 3b 0a 23 69 66 64 65 66 20  char *z;.#ifdef 
09a0: 53 51 4c 49 54 45 5f 55 54 46 38 0a 20 20 63 6f  SQLITE_UTF8.  co
09b0: 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
09c0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
09d0: 69 6e 74 20 70 31 2c 20 70 32 2c 20 6c 65 6e 3b  int p1, p2, len;
09e0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
09f0: 3d 33 20 29 3b 0a 20 20 7a 20 3d 20 61 72 67 76  =3 );.  z = argv
0a00: 5b 30 5d 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  [0];.  if( z==0 
0a10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 31 20 3d  ) return;.  p1 =
0a20: 20 61 74 6f 69 28 61 72 67 76 5b 31 5d 3f 61 72   atoi(argv[1]?ar
0a30: 67 76 5b 31 5d 3a 30 29 3b 0a 20 20 70 32 20 3d  gv[1]:0);.  p2 =
0a40: 20 61 74 6f 69 28 61 72 67 76 5b 32 5d 3f 61 72   atoi(argv[2]?ar
0a50: 67 76 5b 32 5d 3a 30 29 3b 0a 23 69 66 64 65 66  gv[2]:0);.#ifdef
0a60: 20 53 51 4c 49 54 45 5f 55 54 46 38 0a 20 20 66   SQLITE_UTF8.  f
0a70: 6f 72 28 6c 65 6e 3d 30 2c 20 7a 32 3d 7a 3b 20  or(len=0, z2=z; 
0a80: 2a 7a 32 3b 20 7a 32 2b 2b 29 7b 20 69 66 28 20  *z2; z2++){ if( 
0a90: 28 30 78 63 30 26 2a 7a 32 29 21 3d 30 78 38 30  (0xc0&*z2)!=0x80
0aa0: 20 29 20 6c 65 6e 2b 2b 3b 20 7d 0a 23 65 6c 73   ) len++; }.#els
0ab0: 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  e.  len = strlen
0ac0: 28 7a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  (z);.#endif.  if
0ad0: 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 70 31  ( p1<0 ){.    p1
0ae0: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28   += len;.    if(
0af0: 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70   p1<0 ){.      p
0b00: 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 70  2 += p1;.      p
0b10: 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 = 0;.    }.  }
0b20: 65 6c 73 65 20 69 66 28 20 70 31 3e 30 20 29 7b  else if( p1>0 ){
0b30: 0a 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 0a 20  .    p1--;.  }. 
0b40: 20 69 66 28 20 70 31 2b 70 32 3e 6c 65 6e 20 29   if( p1+p2>len )
0b50: 7b 0a 20 20 20 20 70 32 20 3d 20 6c 65 6e 2d 70  {.    p2 = len-p
0b60: 31 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  1;.  }.#ifdef SQ
0b70: 4c 49 54 45 5f 55 54 46 38 0a 20 20 66 6f 72 28  LITE_UTF8.  for(
0b80: 69 3d 30 3b 20 69 3c 70 31 20 26 26 20 7a 5b 69  i=0; i<p1 && z[i
0b90: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
0ba0: 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d 3d 30 78   (z[i]&0xc0)==0x
0bb0: 38 30 20 29 20 70 31 2b 2b 3b 0a 20 20 7d 0a 20  80 ) p1++;.  }. 
0bc0: 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20 26 26 20   while( z[i] && 
0bd0: 28 7a 5b 69 5d 26 30 78 63 30 29 3d 3d 30 78 38  (z[i]&0xc0)==0x8
0be0: 30 20 29 7b 20 69 2b 2b 3b 20 70 31 2b 2b 3b 20  0 ){ i++; p1++; 
0bf0: 7d 0a 20 20 66 6f 72 28 3b 20 69 3c 70 31 2b 70  }.  for(; i<p1+p
0c00: 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  2 && z[i]; i++){
0c10: 0a 20 20 20 20 69 66 28 20 28 7a 5b 69 5d 26 30  .    if( (z[i]&0
0c20: 78 63 30 29 3d 3d 30 78 38 30 20 29 20 70 32 2b  xc0)==0x80 ) p2+
0c30: 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  +;.  }.  while( 
0c40: 7a 5b 69 5d 20 26 26 20 28 7a 5b 69 5d 26 30 78  z[i] && (z[i]&0x
0c50: 63 30 29 3d 3d 30 78 38 30 20 29 7b 20 69 2b 2b  c0)==0x80 ){ i++
0c60: 3b 20 70 32 2b 2b 3b 20 7d 0a 23 65 6e 64 69 66  ; p2++; }.#endif
0c70: 0a 20 20 69 66 28 20 70 32 3c 30 20 29 20 70 32  .  if( p2<0 ) p2
0c80: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
0c90: 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e  set_result_strin
0ca0: 67 28 63 6f 6e 74 65 78 74 2c 20 26 7a 5b 70 31  g(context, &z[p1
0cb0: 5d 2c 20 70 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ], p2);.}../*.**
0cc0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
0cd0: 6f 66 20 74 68 65 20 72 6f 75 6e 64 28 29 20 66  of the round() f
0ce0: 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  unction.*/.stati
0cf0: 63 20 76 6f 69 64 20 72 6f 75 6e 64 46 75 6e 63  c void roundFunc
0d00: 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f  (sqlite_func *co
0d10: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
0d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
0d30: 67 76 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  gv){.  int n;.  
0d40: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72  double r;.  char
0d50: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 61 73   zBuf[100];.  as
0d60: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c  sert( argc==1 ||
0d70: 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66   argc==2 );.  if
0d80: 28 20 61 72 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20  ( argv[0]==0 || 
0d90: 28 61 72 67 63 3d 3d 32 20 26 26 20 61 72 67 76  (argc==2 && argv
0da0: 5b 31 5d 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  [1]==0) ) return
0db0: 3b 0a 20 20 6e 20 3d 20 61 72 67 63 3d 3d 32 20  ;.  n = argc==2 
0dc0: 3f 20 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 20  ? atoi(argv[1]) 
0dd0: 3a 20 30 3b 0a 20 20 69 66 28 20 6e 3e 33 30 20  : 0;.  if( n>30 
0de0: 29 20 6e 20 3d 20 33 30 3b 0a 20 20 69 66 28 20  ) n = 30;.  if( 
0df0: 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20 72  n<0 ) n = 0;.  r
0e00: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 46 28 61   = sqlite3AtoF(a
0e10: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 73 70  rgv[0], 0);.  sp
0e20: 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 2e 2a 66  rintf(zBuf,"%.*f
0e30: 22 2c 6e 2c 72 29 3b 0a 20 20 73 71 6c 69 74 65  ",n,r);.  sqlite
0e40: 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72  3_set_result_str
0e50: 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ing(context, zBu
0e60: 66 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f, -1);.}../*.**
0e70: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
0e80: 6f 66 20 74 68 65 20 75 70 70 65 72 28 29 20 61  of the upper() a
0e90: 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20 66  nd lower() SQL f
0ea0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  unctions..*/.sta
0eb0: 74 69 63 20 76 6f 69 64 20 75 70 70 65 72 46 75  tic void upperFu
0ec0: 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a  nc(sqlite_func *
0ed0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
0ee0: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  c, const char **
0ef0: 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a  argv){.  char *z
0f00: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
0f10: 20 61 72 67 63 3c 31 20 7c 7c 20 61 72 67 76 5b   argc<1 || argv[
0f20: 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  0]==0 ) return;.
0f30: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 73 65    z = sqlite3_se
0f40: 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28  t_result_string(
0f50: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
0f60: 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  , -1);.  if( z==
0f70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
0f80: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
0f90: 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 77  ){.    if( islow
0fa0: 65 72 28 7a 5b 69 5d 29 20 29 20 7a 5b 69 5d 20  er(z[i]) ) z[i] 
0fb0: 3d 20 74 6f 75 70 70 65 72 28 7a 5b 69 5d 29 3b  = toupper(z[i]);
0fc0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
0fd0: 69 64 20 6c 6f 77 65 72 46 75 6e 63 28 73 71 6c  id lowerFunc(sql
0fe0: 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78  ite_func *contex
0ff0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  t, int argc, con
1000: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  st char **argv){
1010: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
1020: 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63 3c  t i;.  if( argc<
1030: 31 20 7c 7c 20 61 72 67 76 5b 30 5d 3d 3d 30 20  1 || argv[0]==0 
1040: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
1050: 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75  sqlite3_set_resu
1060: 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74 65 78  lt_string(contex
1070: 74 2c 20 61 72 67 76 5b 30 5d 2c 20 2d 31 29 3b  t, argv[0], -1);
1080: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
1090: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
10a0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
10b0: 20 69 66 28 20 69 73 75 70 70 65 72 28 7a 5b 69   if( isupper(z[i
10c0: 5d 29 20 29 20 7a 5b 69 5d 20 3d 20 74 6f 6c 6f  ]) ) z[i] = tolo
10d0: 77 65 72 28 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 7d  wer(z[i]);.  }.}
10e0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
10f0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 46  tation of the IF
1100: 4e 55 4c 4c 28 29 2c 20 4e 56 4c 28 29 2c 20 61  NULL(), NVL(), a
1110: 6e 64 20 43 4f 41 4c 45 53 43 45 28 29 20 66 75  nd COALESCE() fu
1120: 6e 63 74 69 6f 6e 73 2e 20 20 0a 2a 2a 20 41 6c  nctions.  .** Al
1130: 6c 20 74 68 72 65 65 20 64 6f 20 74 68 65 20 73  l three do the s
1140: 61 6d 65 20 74 68 69 6e 67 2e 20 20 54 68 65 79  ame thing.  They
1150: 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72 73   return the firs
1160: 74 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61 72  t non-NULL.** ar
1170: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
1180: 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75 6e  c void ifnullFun
1190: 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63  c(sqlite_func *c
11a0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
11b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  , const char **a
11c0: 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rgv){.  int i;. 
11d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
11e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11f0: 61 72 67 76 5b 69 5d 20 29 7b 0a 20 20 20 20 20  argv[i] ){.     
1200: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73   sqlite3_set_res
1210: 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74 65  ult_string(conte
1220: 78 74 2c 20 61 72 67 76 5b 69 5d 2c 20 2d 31 29  xt, argv[i], -1)
1230: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1240: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1250: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1260: 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20 52   of random().  R
1270: 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 69  eturn a random i
1280: 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61  nteger.  .*/.sta
1290: 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46  tic void randomF
12a0: 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  unc(sqlite_func 
12b0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
12c0: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
12d0: 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 72 3b  *argv){.  int r;
12e0: 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d  .  sqlite3Random
12f0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20  ness(sizeof(r), 
1300: 26 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  &r);.  sqlite3_s
1310: 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  et_result_int(co
1320: 6e 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a  ntext, r);.}../*
1330: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1340: 6f 6e 20 6f 66 20 74 68 65 20 6c 61 73 74 5f 69  on of the last_i
1350: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 53 51  nsert_rowid() SQ
1360: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  L function.  The
1370: 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65   return.** value
1380: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1390: 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  the sqlite3_last
13a0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20  _insert_rowid() 
13b0: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
13c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73  .static void las
13d0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73  t_insert_rowid(s
13e0: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74  qlite_func *cont
13f0: 65 78 74 2c 20 69 6e 74 20 61 72 67 2c 20 63 6f  ext, int arg, co
1400: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29  nst char **argv)
1410: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  {.  sqlite *db =
1420: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
1430: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73  ta(context);.  s
1440: 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c  qlite3_set_resul
1450: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
1460: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
1470: 72 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 7d  rt_rowid(db));.}
1480: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1490: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  tation of the ch
14a0: 61 6e 67 65 5f 63 6f 75 6e 74 28 29 20 53 51 4c  ange_count() SQL
14b0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
14c0: 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
14d0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
14e0: 68 65 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  he sqlite3_chang
14f0: 65 73 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f  es() API functio
1500: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1510: 64 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 28 73  d change_count(s
1520: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74  qlite_func *cont
1530: 65 78 74 2c 20 69 6e 74 20 61 72 67 2c 20 63 6f  ext, int arg, co
1540: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29  nst char **argv)
1550: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  {.  sqlite *db =
1560: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
1570: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73  ta(context);.  s
1580: 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c  qlite3_set_resul
1590: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
15a0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
15b0: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  b));.}../*.** Im
15c0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
15d0: 74 68 65 20 6c 61 73 74 5f 73 74 61 74 65 6d 65  the last_stateme
15e0: 6e 74 5f 63 68 61 6e 67 65 5f 63 6f 75 6e 74 28  nt_change_count(
15f0: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
1600: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
1610: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
1620: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
1630: 6c 61 73 74 5f 73 74 61 74 65 6d 65 6e 74 5f 63  last_statement_c
1640: 68 61 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e  hanges() API fun
1650: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1660: 20 76 6f 69 64 20 6c 61 73 74 5f 73 74 61 74 65   void last_state
1670: 6d 65 6e 74 5f 63 68 61 6e 67 65 5f 63 6f 75 6e  ment_change_coun
1680: 74 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63  t(sqlite_func *c
1690: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 2c  ontext, int arg,
16a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
16d0: 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73  har **argv){.  s
16e0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 73 71 6c 69  qlite *db = sqli
16f0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
1700: 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  ntext);.  sqlite
1710: 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74  3_set_result_int
1720: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
1730: 33 5f 6c 61 73 74 5f 73 74 61 74 65 6d 65 6e 74  3_last_statement
1740: 5f 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d  _changes(db));.}
1750: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1760: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  tation of the li
1770: 6b 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  ke() SQL functio
1780: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
1790: 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  n implements.** 
17a0: 74 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49 4b  the build-in LIK
17b0: 45 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65  E operator.  The
17c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
17d0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
17e0: 69 73 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  is the.** string
17f0: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
1800: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1810: 70 61 74 74 65 72 6e 2e 20 20 53 6f 2c 20 74 68  pattern.  So, th
1820: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  e SQL statements
1830: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20  :.**.**       A 
1840: 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20  LIKE B.**.** is 
1850: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 6c  implemented as l
1860: 69 6b 65 28 41 2c 42 29 2e 0a 2a 2f 0a 73 74 61  ike(A,B)..*/.sta
1870: 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e  tic void likeFun
1880: 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63  c(sqlite_func *c
1890: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 2c  ontext, int arg,
18a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
18b0: 67 76 29 7b 0a 20 20 69 66 28 20 61 72 67 76 5b  gv){.  if( argv[
18c0: 30 5d 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 31 5d  0]==0 || argv[1]
18d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
18e0: 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75  sqlite3_set_resu
18f0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
1900: 0a 20 20 20 20 73 71 6c 69 74 65 33 4c 69 6b 65  .    sqlite3Like
1910: 43 6f 6d 70 61 72 65 28 28 63 6f 6e 73 74 20 75  Compare((const u
1920: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72  nsigned char*)ar
1930: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[0],.         
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
1950: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1960: 72 2a 29 61 72 67 76 5b 31 5d 29 29 3b 0a 7d 0a  r*)argv[1]));.}.
1970: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1980: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 67 6c 6f  ation of the glo
1990: 62 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  b() SQL function
19a0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
19b0: 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74   implements.** t
19c0: 68 65 20 62 75 69 6c 64 2d 69 6e 20 47 4c 4f 42  he build-in GLOB
19d0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
19e0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
19f0: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  o the function i
1a00: 73 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20  s the.** string 
1a10: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 61  and the second a
1a20: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70  rgument is the p
1a30: 61 74 74 65 72 6e 2e 20 20 53 6f 2c 20 74 68 65  attern.  So, the
1a40: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a   SQL statements:
1a50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20 47  .**.**       A G
1a60: 4c 4f 42 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69  LOB B.**.** is i
1a70: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 67 6c  mplemented as gl
1a80: 6f 62 28 41 2c 42 29 2e 0a 2a 2f 0a 73 74 61 74  ob(A,B)..*/.stat
1a90: 69 63 20 76 6f 69 64 20 67 6c 6f 62 46 75 6e 63  ic void globFunc
1aa0: 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f  (sqlite_func *co
1ab0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 2c 20  ntext, int arg, 
1ac0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
1ad0: 76 29 7b 0a 20 20 69 66 28 20 61 72 67 76 5b 30  v){.  if( argv[0
1ae0: 5d 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 31 5d 3d  ]==0 || argv[1]=
1af0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1b00: 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c  qlite3_set_resul
1b10: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 0a 20  t_int(context,. 
1b20: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 43 6f     sqlite3GlobCo
1b30: 6d 70 61 72 65 28 28 63 6f 6e 73 74 20 75 6e 73  mpare((const uns
1b40: 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72 67 76  igned char*)argv
1b50: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [0],.           
1b60: 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
1b70: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
1b80: 29 61 72 67 76 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f  )argv[1]));.}../
1b90: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1ba0: 69 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49  ion of the NULLI
1bb0: 46 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e  F(x,y) function.
1bc0: 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
1bd0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
1be0: 75 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72 67  ument if the arg
1bf0: 75 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66 65  uments are diffe
1c00: 72 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rent.  The resul
1c10: 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  t is NULL if the
1c20: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72  .** arguments ar
1c30: 65 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20  e equal to each 
1c40: 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  other..*/.static
1c50: 20 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63   void nullifFunc
1c60: 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f  (sqlite_func *co
1c70: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
1c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
1c90: 67 76 29 7b 0a 20 20 69 66 28 20 61 72 67 76 5b  gv){.  if( argv[
1ca0: 30 5d 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  0]!=0 && sqlite3
1cb0: 43 6f 6d 70 61 72 65 28 61 72 67 76 5b 30 5d 2c  Compare(argv[0],
1cc0: 61 72 67 76 5b 31 5d 29 21 3d 30 20 29 7b 0a 20  argv[1])!=0 ){. 
1cd0: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72     sqlite3_set_r
1ce0: 65 73 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e  esult_string(con
1cf0: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20 2d  text, argv[0], -
1d00: 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
1d10: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1d20: 6f 66 20 74 68 65 20 56 45 52 53 49 4f 4e 28 2a  of the VERSION(*
1d30: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  ) function.  The
1d40: 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
1d50: 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  ersion.** of the
1d60: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
1d70: 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  that is running.
1d80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d90: 76 65 72 73 69 6f 6e 46 75 6e 63 28 73 71 6c 69  versionFunc(sqli
1da0: 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74  te_func *context
1db0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73  , int argc, cons
1dc0: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  t char **argv){.
1dd0: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65    sqlite3_set_re
1de0: 73 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74  sult_string(cont
1df0: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 65 72  ext, sqlite3_ver
1e00: 73 69 6f 6e 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a  sion, -1);.}../*
1e10: 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c  .** EXPERIMENTAL
1e20: 20 2d 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61   - This is not a
1e30: 6e 20 6f 66 66 69 63 69 61 6c 20 66 75 6e 63 74  n official funct
1e40: 69 6f 6e 2e 20 20 54 68 65 20 69 6e 74 65 72 66  ion.  The interf
1e50: 61 63 65 20 6d 61 79 0a 2a 2a 20 63 68 61 6e 67  ace may.** chang
1e60: 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
1e70: 6e 20 6d 61 79 20 64 69 73 61 70 70 65 61 72 2e  n may disappear.
1e80: 20 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 63    Do not write c
1e90: 6f 64 65 20 74 68 61 74 20 64 65 70 65 6e 64 73  ode that depends
1ea0: 0a 2a 2a 20 6f 6e 20 74 68 69 73 20 66 75 6e 63  .** on this func
1eb0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tion..**.** Impl
1ec0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1ed0: 65 20 51 55 4f 54 45 28 29 20 66 75 6e 63 74 69  e QUOTE() functi
1ee0: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
1ef0: 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c  on takes a singl
1f00: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20  e.** argument.  
1f10: 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
1f20: 69 73 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 20  is numeric, the 
1f30: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1f40: 74 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74  the same as.** t
1f50: 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66  he argument.  If
1f60: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
1f70: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 74 75 72   NULL, the retur
1f80: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  n value is the s
1f90: 74 72 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e  tring.** "NULL".
1fa0: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65    Otherwise, the
1fb0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 6e 63   argument is enc
1fc0: 6c 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20  losed in single 
1fd0: 71 75 6f 74 65 73 20 77 69 74 68 0a 2a 2a 20 73  quotes with.** s
1fe0: 69 6e 67 6c 65 2d 71 75 6f 74 65 20 65 73 63 61  ingle-quote esca
1ff0: 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pes..*/.static v
2000: 6f 69 64 20 71 75 6f 74 65 46 75 6e 63 28 73 71  oid quoteFunc(sq
2010: 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65  lite_func *conte
2020: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  xt, int argc, co
2030: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29  nst char **argv)
2040: 7b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29  {.  if( argc<1 )
2050: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 61   return;.  if( a
2060: 72 67 76 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  rgv[0]==0 ){.   
2070: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73   sqlite3_set_res
2080: 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74 65  ult_string(conte
2090: 78 74 2c 20 22 4e 55 4c 4c 22 2c 20 34 29 3b 0a  xt, "NULL", 4);.
20a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
20b0: 74 65 33 49 73 4e 75 6d 62 65 72 28 61 72 67 76  te3IsNumber(argv
20c0: 5b 30 5d 2c 20 30 2c 20 54 45 58 54 5f 55 74 66  [0], 0, TEXT_Utf
20d0: 38 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  8) ){.    sqlite
20e0: 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72  3_set_result_str
20f0: 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  ing(context, arg
2100: 76 5b 30 5d 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  v[0], -1);.  }el
2110: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 2c 6a 2c  se{.    int i,j,
2120: 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  n;.    char *z;.
2130: 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 61      for(i=n=0; a
2140: 72 67 76 5b 30 5d 5b 69 5d 3b 20 69 2b 2b 29 7b  rgv[0][i]; i++){
2150: 20 69 66 28 20 61 72 67 76 5b 30 5d 5b 69 5d 3d   if( argv[0][i]=
2160: 3d 27 5c 27 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20  ='\'' ) n++; }. 
2170: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c     z = sqliteMal
2180: 6c 6f 63 28 20 69 2b 6e 2b 33 20 29 3b 0a 20 20  loc( i+n+3 );.  
2190: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
21a0: 75 72 6e 3b 0a 20 20 20 20 7a 5b 30 5d 20 3d 20  urn;.    z[0] = 
21b0: 27 5c 27 27 3b 0a 20 20 20 20 66 6f 72 28 69 3d  '\'';.    for(i=
21c0: 30 2c 20 6a 3d 31 3b 20 61 72 67 76 5b 30 5d 5b  0, j=1; argv[0][
21d0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
21e0: 7a 5b 6a 2b 2b 5d 20 3d 20 61 72 67 76 5b 30 5d  z[j++] = argv[0]
21f0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 61  [i];.      if( a
2200: 72 67 76 5b 30 5d 5b 69 5d 3d 3d 27 5c 27 27 20  rgv[0][i]=='\'' 
2210: 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  ){.        z[j++
2220: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
2230: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
2240: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 7a  +] = '\'';.    z
2250: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
2260: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
2270: 73 74 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20  string(context, 
2280: 7a 2c 20 6a 29 3b 0a 20 20 20 20 73 71 6c 69 74  z, j);.    sqlit
2290: 65 46 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a  eFree(z);.  }.}.
22a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
22b0: 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d  OUNDEX./*.** Com
22c0: 70 75 74 65 20 74 68 65 20 73 6f 75 6e 64 65 78  pute the soundex
22d0: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 77   encoding of a w
22e0: 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ord..*/.static v
22f0: 6f 69 64 20 73 6f 75 6e 64 65 78 46 75 6e 63 28  oid soundexFunc(
2300: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e  sqlite_func *con
2310: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
2320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
2330: 76 29 7b 0a 20 20 63 68 61 72 20 7a 52 65 73 75  v){.  char zResu
2340: 6c 74 5b 38 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  lt[8];.  const c
2350: 68 61 72 20 2a 7a 49 6e 3b 0a 20 20 69 6e 74 20  har *zIn;.  int 
2360: 69 2c 20 6a 3b 0a 20 20 73 74 61 74 69 63 20 63  i, j;.  static c
2370: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2380: 61 72 20 69 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20  ar iCode[] = {. 
2390: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
23a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
23b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
23c0: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,.    0, 0, 0, 
23d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
23e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
23f0: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
2400: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2410: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2420: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
2430: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
2440: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2450: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
2460: 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33     0, 0, 1, 2, 3
2470: 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c  , 0, 1, 2, 0, 0,
2480: 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20   2, 2, 4, 5, 5, 
2490: 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20  0,.    1, 2, 6, 
24a0: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32  2, 3, 0, 1, 0, 2
24b0: 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 2, 0, 0, 0,
24c0: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
24d0: 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   1, 2, 3, 0, 1, 
24e0: 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34  2, 0, 0, 2, 2, 4
24f0: 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31  , 5, 5, 0,.    1
2500: 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c  , 2, 6, 2, 3, 0,
2510: 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20   1, 0, 2, 0, 2, 
2520: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
2530: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72   };.  assert( ar
2540: 67 63 3d 3d 31 20 29 3b 0a 20 20 7a 49 6e 20 3d  gc==1 );.  zIn =
2550: 20 61 72 67 76 5b 30 5d 3b 0a 20 20 66 6f 72 28   argv[0];.  for(
2560: 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26 20 21  i=0; zIn[i] && !
2570: 69 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d 29 3b  isalpha(zIn[i]);
2580: 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 49   i++){}.  if( zI
2590: 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 7a 52 65 73  n[i] ){.    zRes
25a0: 75 6c 74 5b 30 5d 20 3d 20 74 6f 75 70 70 65 72  ult[0] = toupper
25b0: 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f  (zIn[i]);.    fo
25c0: 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49  r(j=1; j<4 && zI
25d0: 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  n[i]; i++){.    
25e0: 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f    int code = iCo
25f0: 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b  de[zIn[i]&0x7f];
2600: 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 3e  .      if( code>
2610: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  0 ){.        zRe
2620: 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65  sult[j++] = code
2630: 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 7d 0a   + '0';.      }.
2640: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
2650: 20 6a 3c 34 20 29 7b 0a 20 20 20 20 20 20 7a 52   j<4 ){.      zR
2660: 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27  esult[j++] = '0'
2670: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 73  ;.    }.    zRes
2680: 75 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  ult[j] = 0;.    
2690: 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75  sqlite3_set_resu
26a0: 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74 65 78  lt_string(contex
26b0: 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34 29 3b 0a  t, zResult, 4);.
26c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
26d0: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
26e0: 73 74 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20  string(context, 
26f0: 22 3f 30 30 30 22 2c 20 34 29 3b 0a 20 20 7d 0a  "?000", 4);.  }.
2700: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
2710: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
2720: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2730: 20 67 65 6e 65 72 61 74 65 73 20 61 20 73 74 72   generates a str
2740: 69 6e 67 20 6f 66 20 72 61 6e 64 6f 6d 20 63 68  ing of random ch
2750: 61 72 61 63 74 65 72 73 2e 20 20 55 73 65 64 20  aracters.  Used 
2760: 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e  for.** generatin
2770: 67 20 74 65 73 74 20 64 61 74 61 2e 0a 2a 2f 0a  g test data..*/.
2780: 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64  static void rand
2790: 53 74 72 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  Str(sqlite_func 
27a0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
27b0: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
27c0: 2a 61 72 67 76 29 7b 0a 20 20 73 74 61 74 69 63  *argv){.  static
27d0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
27e0: 63 68 61 72 20 7a 53 72 63 5b 5d 20 3d 20 0a 20  char zSrc[] = . 
27f0: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
2800: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
2810: 0a 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49  .     "ABCDEFGHI
2820: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
2830: 5a 22 0a 20 20 20 20 20 22 30 31 32 33 34 35 36  Z".     "0123456
2840: 37 38 39 22 0a 20 20 20 20 20 22 2e 2d 21 2c 3a  789".     ".-!,:
2850: 2a 5e 2b 3d 5f 7c 3f 2f 3c 3e 20 22 3b 0a 20 20  *^+=_|?/<> ";.  
2860: 69 6e 74 20 69 4d 69 6e 2c 20 69 4d 61 78 2c 20  int iMin, iMax, 
2870: 6e 2c 20 72 2c 20 69 3b 0a 20 20 75 6e 73 69 67  n, r, i;.  unsig
2880: 6e 65 64 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ned char zBuf[10
2890: 30 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 3e  00];.  if( argc>
28a0: 3d 31 20 29 7b 0a 20 20 20 20 69 4d 69 6e 20 3d  =1 ){.    iMin =
28b0: 20 61 74 6f 69 28 61 72 67 76 5b 30 5d 29 3b 0a   atoi(argv[0]);.
28c0: 20 20 20 20 69 66 28 20 69 4d 69 6e 3c 30 20 29      if( iMin<0 )
28d0: 20 69 4d 69 6e 20 3d 20 30 3b 0a 20 20 20 20 69   iMin = 0;.    i
28e0: 66 28 20 69 4d 69 6e 3e 3d 73 69 7a 65 6f 66 28  f( iMin>=sizeof(
28f0: 7a 42 75 66 29 20 29 20 69 4d 69 6e 20 3d 20 73  zBuf) ) iMin = s
2900: 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 3b 0a 20  izeof(zBuf)-1;. 
2910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4d 69 6e   }else{.    iMin
2920: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
2930: 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69  argc>=2 ){.    i
2940: 4d 61 78 20 3d 20 61 74 6f 69 28 61 72 67 76 5b  Max = atoi(argv[
2950: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4d 61  1]);.    if( iMa
2960: 78 3c 69 4d 69 6e 20 29 20 69 4d 61 78 20 3d 20  x<iMin ) iMax = 
2970: 69 4d 69 6e 3b 0a 20 20 20 20 69 66 28 20 69 4d  iMin;.    if( iM
2980: 61 78 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29  ax>=sizeof(zBuf)
2990: 20 29 20 69 4d 61 78 20 3d 20 73 69 7a 65 6f 66   ) iMax = sizeof
29a0: 28 7a 42 75 66 29 2d 31 3b 0a 20 20 7d 65 6c 73  (zBuf)-1;.  }els
29b0: 65 7b 0a 20 20 20 20 69 4d 61 78 20 3d 20 35 30  e{.    iMax = 50
29c0: 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 69 4d 69 6e  ;.  }.  n = iMin
29d0: 3b 0a 20 20 69 66 28 20 69 4d 61 78 3e 69 4d 69  ;.  if( iMax>iMi
29e0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
29f0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
2a00: 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 72  f(r), &r);.    r
2a10: 20 26 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a   &= 0x7fffffff;.
2a20: 20 20 20 20 6e 20 2b 3d 20 72 25 28 69 4d 61 78      n += r%(iMax
2a30: 20 2b 20 31 20 2d 20 69 4d 69 6e 29 3b 0a 20 20   + 1 - iMin);.  
2a40: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 73 69  }.  assert( n<si
2a50: 7a 65 6f 66 28 7a 42 75 66 29 20 29 3b 0a 20 20  zeof(zBuf) );.  
2a60: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
2a70: 73 28 6e 2c 20 7a 42 75 66 29 3b 0a 20 20 66 6f  s(n, zBuf);.  fo
2a80: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
2a90: 7b 0a 20 20 20 20 7a 42 75 66 5b 69 5d 20 3d 20  {.    zBuf[i] = 
2aa0: 7a 53 72 63 5b 7a 42 75 66 5b 69 5d 25 28 73 69  zSrc[zBuf[i]%(si
2ab0: 7a 65 6f 66 28 7a 53 72 63 29 2d 31 29 5d 3b 0a  zeof(zSrc)-1)];.
2ac0: 20 20 7d 0a 20 20 7a 42 75 66 5b 6e 5d 20 3d 20    }.  zBuf[n] = 
2ad0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 74  0;.  sqlite3_set
2ae0: 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28 63  _result_string(c
2af0: 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 6e 29  ontext, zBuf, n)
2b00: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2b10: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2b20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2b30: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74  tructure holds t
2b40: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a  he context of a.
2b50: 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28  ** sum() or avg(
2b60: 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70  ) aggregate comp
2b70: 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  utation..*/.type
2b80: 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43 74  def struct SumCt
2b90: 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74  x SumCtx;.struct
2ba0: 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62   SumCtx {.  doub
2bb0: 6c 65 20 73 75 6d 3b 20 20 20 20 20 2f 2a 20 53  le sum;     /* S
2bc0: 75 6d 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20  um of terms */. 
2bd0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
2be0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
2bf0: 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f  ements summed */
2c00: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
2c10: 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  nes used to comp
2c20: 75 74 65 20 74 68 65 20 73 75 6d 20 6f 72 20 61  ute the sum or a
2c30: 76 65 72 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  verage..*/.stati
2c40: 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73  c void sumStep(s
2c50: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74  qlite_func *cont
2c60: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  ext, int argc, c
2c70: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
2c80: 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a  ){.  SumCtx *p;.
2c90: 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72    if( argc<1 ) r
2ca0: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 73 71 6c  eturn;.  p = sql
2cb0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2cc0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
2cd0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2ce0: 66 28 20 70 20 26 26 20 61 72 67 76 5b 30 5d 20  f( p && argv[0] 
2cf0: 29 7b 0a 20 20 20 20 70 2d 3e 73 75 6d 20 2b 3d  ){.    p->sum +=
2d00: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 61 72 67   sqlite3AtoF(arg
2d10: 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 70 2d  v[0], 0);.    p-
2d20: 3e 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  >cnt++;.  }.}.st
2d30: 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e  atic void sumFin
2d40: 61 6c 69 7a 65 28 73 71 6c 69 74 65 5f 66 75 6e  alize(sqlite_fun
2d50: 63 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  c *context){.  S
2d60: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  umCtx *p;.  p = 
2d70: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
2d80: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
2d90: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
2da0: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65    sqlite3_set_re
2db0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
2dc0: 65 78 74 2c 20 70 20 3f 20 70 2d 3e 73 75 6d 20  ext, p ? p->sum 
2dd0: 3a 20 30 2e 30 29 3b 0a 7d 0a 73 74 61 74 69 63  : 0.0);.}.static
2de0: 20 76 6f 69 64 20 61 76 67 46 69 6e 61 6c 69 7a   void avgFinaliz
2df0: 65 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63  e(sqlite_func *c
2e00: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74  ontext){.  SumCt
2e10: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
2e20: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
2e30: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
2e40: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2e50: 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20  ( p && p->cnt>0 
2e60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2e70: 65 74 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  et_result_double
2e80: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 73 75 6d  (context, p->sum
2e90: 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29  /(double)p->cnt)
2ea0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2eb0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2ec0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2ed0: 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20  cture holds the 
2ee0: 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20  context of a.** 
2ef0: 76 61 72 69 61 6e 63 65 20 6f 72 20 73 74 61 6e  variance or stan
2f00: 64 61 72 64 20 64 65 76 69 61 74 69 6f 6e 20 63  dard deviation c
2f10: 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74  omputation..*/.t
2f20: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74  ypedef struct St
2f30: 64 44 65 76 43 74 78 20 53 74 64 44 65 76 43 74  dDevCtx StdDevCt
2f40: 78 3b 0a 73 74 72 75 63 74 20 53 74 64 44 65 76  x;.struct StdDev
2f50: 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20 73  Ctx {.  double s
2f60: 75 6d 3b 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f  um;     /* Sum o
2f70: 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 64 6f 75  f terms */.  dou
2f80: 62 6c 65 20 73 75 6d 32 3b 20 20 20 20 2f 2a 20  ble sum2;    /* 
2f90: 53 75 6d 20 6f 66 20 74 68 65 20 73 71 75 61 72  Sum of the squar
2fa0: 65 73 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20  es of terms */. 
2fb0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
2fc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
2fd0: 72 6d 73 20 63 6f 75 6e 74 65 64 20 2a 2f 0a 7d  rms counted */.}
2fe0: 3b 0a 0a 23 69 66 20 30 20 20 20 2f 2a 20 4f 6d  ;..#if 0   /* Om
2ff0: 69 74 20 62 65 63 61 75 73 65 20 6d 61 74 68 20  it because math 
3000: 6c 69 62 72 61 72 79 20 69 73 20 72 65 71 75 69  library is requi
3010: 72 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75  red */./*.** Rou
3020: 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f  tines used to co
3030: 6d 70 75 74 65 20 74 68 65 20 73 74 61 6e 64 61  mpute the standa
3040: 72 64 20 64 65 76 69 61 74 69 6f 6e 20 61 73 20  rd deviation as 
3050: 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2f  an aggregate..*/
3060: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 64  .static void std
3070: 44 65 76 53 74 65 70 28 73 71 6c 69 74 65 5f 66  DevStep(sqlite_f
3080: 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  unc *context, in
3090: 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
30a0: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 74  ar **argv){.  St
30b0: 64 44 65 76 43 74 78 20 2a 70 3b 0a 20 20 64 6f  dDevCtx *p;.  do
30c0: 75 62 6c 65 20 78 3b 0a 20 20 69 66 28 20 61 72  uble x;.  if( ar
30d0: 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
30e0: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
30f0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
3100: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
3110: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  p));.  if( p && 
3120: 61 72 67 76 5b 30 5d 20 29 7b 0a 20 20 20 20 78  argv[0] ){.    x
3130: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 46 28 61   = sqlite3AtoF(a
3140: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  rgv[0], 0);.    
3150: 70 2d 3e 73 75 6d 20 2b 3d 20 78 3b 0a 20 20 20  p->sum += x;.   
3160: 20 70 2d 3e 73 75 6d 32 20 2b 3d 20 78 2a 78 3b   p->sum2 += x*x;
3170: 0a 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20  .    p->cnt++;. 
3180: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
3190: 20 73 74 64 44 65 76 46 69 6e 61 6c 69 7a 65 28   stdDevFinalize(
31a0: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e  sqlite_func *con
31b0: 74 65 78 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20  text){.  double 
31c0: 72 4e 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67  rN = sqlite3_agg
31d0: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e  regate_count(con
31e0: 74 65 78 74 29 3b 0a 20 20 53 74 64 44 65 76 43  text);.  StdDevC
31f0: 74 78 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  tx *p = sqlite3_
3200: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
3210: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
3220: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20  f(*p));.  if( p 
3230: 26 26 20 70 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20  && p->cnt>1 ){. 
3240: 20 20 20 64 6f 75 62 6c 65 20 72 43 6e 74 20 3d     double rCnt =
3250: 20 63 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65   cnt;.    sqlite
3260: 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 64 6f 75  3_set_result_dou
3270: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20  ble(context, .  
3280: 20 20 20 20 20 73 71 72 74 28 28 70 2d 3e 73 75       sqrt((p->su
3290: 6d 32 20 2d 20 70 2d 3e 73 75 6d 2a 70 2d 3e 73  m2 - p->sum*p->s
32a0: 75 6d 2f 72 43 6e 74 29 2f 28 72 43 6e 74 2d 31  um/rCnt)/(rCnt-1
32b0: 2e 30 29 29 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  .0)));.  }.}.#en
32c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
32d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
32e0: 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f  re keeps track o
32f0: 66 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  f state informat
3300: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63  ion for the.** c
3310: 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65  ount() aggregate
3320: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79   function..*/.ty
3330: 70 65 64 65 66 20 73 74 72 75 63 74 20 43 6f 75  pedef struct Cou
3340: 6e 74 43 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a  ntCtx CountCtx;.
3350: 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20  struct CountCtx 
3360: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 0a 2f  {.  int n;.};../
3370: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
3380: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
3390: 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65  ount() aggregate
33a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
33b0: 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53  atic void countS
33c0: 74 65 70 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  tep(sqlite_func 
33d0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
33e0: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
33f0: 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43  *argv){.  CountC
3400: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
3410: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3420: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
3430: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
3440: 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 61  f( (argc==0 || a
3450: 72 67 76 5b 30 5d 29 20 26 26 20 70 20 29 7b 0a  rgv[0]) && p ){.
3460: 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a      p->n++;.  }.
3470: 7d 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64  }   .static void
3480: 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73   countFinalize(s
3490: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74  qlite_func *cont
34a0: 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78  ext){.  CountCtx
34b0: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
34c0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
34d0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
34e0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 73 71 6c  zeof(*p));.  sql
34f0: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
3500: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  int(context, p ?
3510: 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f   p->n : 0);.}../
3520: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3530: 6f 6e 20 74 72 61 63 6b 73 20 73 74 61 74 65 20  on tracks state 
3540: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
3550: 74 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61  the min() and ma
3560: 78 28 29 0a 2a 2a 20 61 67 67 72 65 67 61 74 65  x().** aggregate
3570: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 74   functions..*/.t
3580: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 69  ypedef struct Mi
3590: 6e 4d 61 78 43 74 78 20 4d 69 6e 4d 61 78 43 74  nMaxCtx MinMaxCt
35a0: 78 3b 0a 73 74 72 75 63 74 20 4d 69 6e 4d 61 78  x;.struct MinMax
35b0: 43 74 78 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  Ctx {.  char *z;
35c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
35d0: 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
35e0: 20 63 68 61 72 20 7a 42 75 66 5b 32 38 5d 3b 20   char zBuf[28]; 
35f0: 20 20 2f 2a 20 53 70 61 63 65 20 74 68 61 74 20    /* Space that 
3600: 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
3610: 73 74 6f 72 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f  storage */.};../
3620: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
3630: 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29   implement min()
3640: 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65   and max() aggre
3650: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  gate functions..
3660: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
3670: 69 6e 6d 61 78 53 74 65 70 28 73 71 6c 69 74 65  inmaxStep(sqlite
3680: 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20  _func *context, 
3690: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
36a0: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
36b0: 4d 69 6e 4d 61 78 43 74 78 20 2a 70 3b 0a 20 20  MinMaxCtx *p;.  
36c0: 69 6e 74 20 28 2a 78 43 6f 6d 70 61 72 65 29 28  int (*xCompare)(
36d0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 63 6f 6e  const char*, con
36e0: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 69 6e 74  st char*);.  int
36f0: 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 30 20 66   mask;    /* 0 f
3700: 6f 72 20 6d 69 6e 28 29 20 6f 72 20 30 78 66 66  or min() or 0xff
3710: 66 66 66 66 66 66 20 66 6f 72 20 6d 61 78 28 29  ffffff for max()
3720: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61   */..  assert( a
3730: 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20  rgc==2 );.  if( 
3740: 61 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 6e 27 20  argv[1][0]=='n' 
3750: 29 7b 0a 20 20 20 20 78 43 6f 6d 70 61 72 65 20  ){.    xCompare 
3760: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
3770: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
3780: 43 6f 6d 70 61 72 65 20 3d 20 73 74 72 63 6d 70  Compare = strcmp
3790: 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 28  ;.  }.  mask = (
37a0: 69 6e 74 29 73 71 6c 69 74 65 33 5f 75 73 65 72  int)sqlite3_user
37b0: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
37c0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
37d0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
37e0: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
37f0: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  *p));.  if( p==0
3800: 20 7c 7c 20 61 72 67 63 3c 31 20 7c 7c 20 61 72   || argc<1 || ar
3810: 67 76 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72  gv[0]==0 ) retur
3820: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30  n;.  if( p->z==0
3830: 20 7c 7c 20 28 78 43 6f 6d 70 61 72 65 28 61 72   || (xCompare(ar
3840: 67 76 5b 30 5d 2c 70 2d 3e 7a 29 5e 6d 61 73 6b  gv[0],p->z)^mask
3850: 29 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  )<0 ){.    int l
3860: 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  en;.    if( !p->
3870: 7a 42 75 66 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zBuf[0] ){.     
3880: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
3890: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  );.    }.    len
38a0: 20 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 30   = strlen(argv[0
38b0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 20  ]);.    if( len 
38c0: 3c 20 73 69 7a 65 6f 66 28 70 2d 3e 7a 42 75 66  < sizeof(p->zBuf
38d0: 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  )-1 ){.      p->
38e0: 7a 20 3d 20 26 70 2d 3e 7a 42 75 66 5b 31 5d 3b  z = &p->zBuf[1];
38f0: 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b 30  .      p->zBuf[0
3900: 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 1;.    }else
3910: 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 20 3d 20 73  {.      p->z = s
3920: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e  qliteMalloc( len
3930: 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  +1 );.      p->z
3940: 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf[0] = 0;.    
3950: 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20    if( p->z==0 ) 
3960: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
3970: 20 20 73 74 72 63 70 79 28 70 2d 3e 7a 2c 20 61    strcpy(p->z, a
3980: 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 73  rgv[0]);.  }.}.s
3990: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61  tatic void minMa
39a0: 78 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  xFinalize(sqlite
39b0: 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 29 7b  _func *context){
39c0: 0a 20 20 4d 69 6e 4d 61 78 43 74 78 20 2a 70 3b  .  MinMaxCtx *p;
39d0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
39e0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
39f0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
3a00: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
3a10: 26 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20 73 71  & p->z ){.    sq
3a20: 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74  lite3_set_result
3a30: 5f 73 74 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c  _string(context,
3a40: 20 70 2d 3e 7a 2c 20 73 74 72 6c 65 6e 28 70 2d   p->z, strlen(p-
3a50: 3e 7a 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >z));.  }.  if( 
3a60: 70 20 26 26 20 21 70 2d 3e 7a 42 75 66 5b 30 5d  p && !p->zBuf[0]
3a70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
3a80: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a  ee(p->z);.  }.}.
3a90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3aa0: 74 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20  tion registered 
3ab0: 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
3ac0: 20 43 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20   C functions as 
3ad0: 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  SQL.** functions
3ae0: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
3af0: 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69  e the only routi
3b00: 6e 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ne in this file 
3b10: 77 69 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61 6c  with.** external
3b20: 20 6c 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69   linkage..*/.voi
3b30: 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  d sqlite3Registe
3b40: 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  rBuiltinFunction
3b50: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
3b60: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
3b70: 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
3b80: 65 3b 0a 20 20 20 20 20 73 69 67 6e 65 64 20 63  e;.     signed c
3b90: 68 61 72 20 6e 41 72 67 3b 0a 20 20 20 20 20 73  har nArg;.     s
3ba0: 69 67 6e 65 64 20 63 68 61 72 20 64 61 74 61 54  igned char dataT
3bb0: 79 70 65 3b 0a 20 20 20 20 20 75 38 20 61 72 67  ype;.     u8 arg
3bc0: 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
3bd0: 20 20 20 20 2f 2a 20 30 3a 20 6e 6f 6e 65 2e 20      /* 0: none. 
3be0: 20 31 3a 20 64 62 20 20 32 3a 20 28 2d 31 29 20   1: db  2: (-1) 
3bf0: 2a 2f 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78  */.     void (*x
3c00: 46 75 6e 63 29 28 73 71 6c 69 74 65 5f 66 75 6e  Func)(sqlite_fun
3c10: 63 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  c*,int,const cha
3c20: 72 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63 73  r**);.  } aFuncs
3c30: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6d 69  [] = {.    { "mi
3c40: 6e 22 2c 20 20 20 20 20 20 20 2d 31 2c 20 53 51  n",       -1, SQ
3c50: 4c 49 54 45 5f 41 52 47 53 2c 20 20 20 20 30 2c  LITE_ARGS,    0,
3c60: 20 6d 69 6e 6d 61 78 46 75 6e 63 20 7d 2c 0a 20   minmaxFunc },. 
3c70: 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 20     { "min",     
3c80: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
3c90: 20 20 20 20 20 20 30 2c 20 30 20 20 20 20 20 20        0, 0      
3ca0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61      },.    { "ma
3cb0: 78 22 2c 20 20 20 20 20 20 20 2d 31 2c 20 53 51  x",       -1, SQ
3cc0: 4c 49 54 45 5f 41 52 47 53 2c 20 20 20 20 32 2c  LITE_ARGS,    2,
3cd0: 20 6d 69 6e 6d 61 78 46 75 6e 63 20 7d 2c 0a 20   minmaxFunc },. 
3ce0: 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 20     { "max",     
3cf0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
3d00: 20 20 20 20 20 20 32 2c 20 30 20 20 20 20 20 20        2, 0      
3d10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 79      },.    { "ty
3d20: 70 65 6f 66 22 2c 20 20 20 20 20 31 2c 20 53 51  peof",     1, SQ
3d30: 4c 49 54 45 5f 54 45 58 54 2c 20 20 20 20 30 2c  LITE_TEXT,    0,
3d40: 20 74 79 70 65 6f 66 46 75 6e 63 20 7d 2c 0a 20   typeofFunc },. 
3d50: 20 20 20 7b 20 22 63 6c 61 73 73 6f 66 22 2c 20     { "classof", 
3d60: 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 54 45 58     1, SQLITE_TEX
3d70: 54 2c 20 20 20 20 30 2c 20 74 79 70 65 6f 66 46  T,    0, typeofF
3d80: 75 6e 63 20 7d 2c 20 2f 2a 20 46 49 58 20 4d 45  unc }, /* FIX ME
3d90: 3a 20 68 61 63 6b 20 2a 2f 0a 20 20 20 20 7b 20  : hack */.    { 
3da0: 22 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 31 2c  "length",     1,
3db0: 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c   SQLITE_NUMERIC,
3dc0: 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63 20 7d   0, lengthFunc }
3dd0: 2c 0a 20 20 20 20 7b 20 22 73 75 62 73 74 72 22  ,.    { "substr"
3de0: 2c 20 20 20 20 20 33 2c 20 53 51 4c 49 54 45 5f  ,     3, SQLITE_
3df0: 54 45 58 54 2c 20 20 20 20 30 2c 20 73 75 62 73  TEXT,    0, subs
3e00: 74 72 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  trFunc },.    { 
3e10: 22 61 62 73 22 2c 20 20 20 20 20 20 20 20 31 2c  "abs",        1,
3e20: 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c   SQLITE_NUMERIC,
3e30: 20 30 2c 20 61 62 73 46 75 6e 63 20 20 20 20 7d   0, absFunc    }
3e40: 2c 0a 20 20 20 20 7b 20 22 72 6f 75 6e 64 22 2c  ,.    { "round",
3e50: 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f        1, SQLITE_
3e60: 4e 55 4d 45 52 49 43 2c 20 30 2c 20 72 6f 75 6e  NUMERIC, 0, roun
3e70: 64 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20  dFunc  },.    { 
3e80: 22 72 6f 75 6e 64 22 2c 20 20 20 20 20 20 32 2c  "round",      2,
3e90: 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c   SQLITE_NUMERIC,
3ea0: 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d   0, roundFunc  }
3eb0: 2c 0a 20 20 20 20 7b 20 22 75 70 70 65 72 22 2c  ,.    { "upper",
3ec0: 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f        1, SQLITE_
3ed0: 54 45 58 54 2c 20 20 20 20 30 2c 20 75 70 70 65  TEXT,    0, uppe
3ee0: 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20  rFunc  },.    { 
3ef0: 22 6c 6f 77 65 72 22 2c 20 20 20 20 20 20 31 2c  "lower",      1,
3f00: 20 53 51 4c 49 54 45 5f 54 45 58 54 2c 20 20 20   SQLITE_TEXT,   
3f10: 20 30 2c 20 6c 6f 77 65 72 46 75 6e 63 20 20 7d   0, lowerFunc  }
3f20: 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65 73 63  ,.    { "coalesc
3f30: 65 22 2c 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f  e",  -1, SQLITE_
3f40: 41 52 47 53 2c 20 20 20 20 30 2c 20 69 66 6e 75  ARGS,    0, ifnu
3f50: 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  llFunc },.    { 
3f60: 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20 30 2c  "coalesce",   0,
3f70: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
3f80: 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d   0, 0          }
3f90: 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65 73 63  ,.    { "coalesc
3fa0: 65 22 2c 20 20 20 31 2c 20 30 2c 20 20 20 20 20  e",   1, 0,     
3fb0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 20 20 20           0, 0   
3fc0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
3fd0: 22 69 66 6e 75 6c 6c 22 2c 20 20 20 20 20 32 2c  "ifnull",     2,
3fe0: 20 53 51 4c 49 54 45 5f 41 52 47 53 2c 20 20 20   SQLITE_ARGS,   
3ff0: 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20 7d   0, ifnullFunc }
4000: 2c 0a 20 20 20 20 7b 20 22 72 61 6e 64 6f 6d 22  ,.    { "random"
4010: 2c 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ,    -1, SQLITE_
4020: 4e 55 4d 45 52 49 43 2c 20 30 2c 20 72 61 6e 64  NUMERIC, 0, rand
4030: 6f 6d 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  omFunc },.    { 
4040: 22 6c 69 6b 65 22 2c 20 20 20 20 20 20 20 32 2c  "like",       2,
4050: 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c   SQLITE_NUMERIC,
4060: 20 30 2c 20 6c 69 6b 65 46 75 6e 63 20 20 20 7d   0, likeFunc   }
4070: 2c 0a 20 20 20 20 7b 20 22 67 6c 6f 62 22 2c 20  ,.    { "glob", 
4080: 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45 5f        2, SQLITE_
4090: 4e 55 4d 45 52 49 43 2c 20 30 2c 20 67 6c 6f 62  NUMERIC, 0, glob
40a0: 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Func   },.    { 
40b0: 22 6e 75 6c 6c 69 66 22 2c 20 20 20 20 20 32 2c  "nullif",     2,
40c0: 20 53 51 4c 49 54 45 5f 41 52 47 53 2c 20 20 20   SQLITE_ARGS,   
40d0: 20 30 2c 20 6e 75 6c 6c 69 66 46 75 6e 63 20 7d   0, nullifFunc }
40e0: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  ,.    { "sqlite_
40f0: 76 65 72 73 69 6f 6e 22 2c 30 2c 53 51 4c 49 54  version",0,SQLIT
4100: 45 5f 54 45 58 54 2c 20 20 30 2c 20 76 65 72 73  E_TEXT,  0, vers
4110: 69 6f 6e 46 75 6e 63 7d 2c 0a 20 20 20 20 7b 20  ionFunc},.    { 
4120: 22 71 75 6f 74 65 22 2c 20 20 20 20 20 20 31 2c  "quote",      1,
4130: 20 53 51 4c 49 54 45 5f 41 52 47 53 2c 20 20 20   SQLITE_ARGS,   
4140: 20 30 2c 20 71 75 6f 74 65 46 75 6e 63 20 20 7d   0, quoteFunc  }
4150: 2c 0a 20 20 20 20 7b 20 22 6c 61 73 74 5f 69 6e  ,.    { "last_in
4160: 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 30 2c 20  sert_rowid", 0, 
4170: 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c 20  SQLITE_NUMERIC, 
4180: 31 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  1, last_insert_r
4190: 6f 77 69 64 20 7d 2c 0a 20 20 20 20 7b 20 22 63  owid },.    { "c
41a0: 68 61 6e 67 65 5f 63 6f 75 6e 74 22 2c 20 20 20  hange_count",   
41b0: 20 20 20 30 2c 20 53 51 4c 49 54 45 5f 4e 55 4d     0, SQLITE_NUM
41c0: 45 52 49 43 2c 20 31 2c 20 63 68 61 6e 67 65 5f  ERIC, 1, change_
41d0: 63 6f 75 6e 74 20 20 20 20 20 20 7d 2c 0a 20 20  count      },.  
41e0: 20 20 7b 20 22 6c 61 73 74 5f 73 74 61 74 65 6d    { "last_statem
41f0: 65 6e 74 5f 63 68 61 6e 67 65 5f 63 6f 75 6e 74  ent_change_count
4200: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
4220: 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c   SQLITE_NUMERIC,
4230: 20 31 2c 20 6c 61 73 74 5f 73 74 61 74 65 6d 65   1, last_stateme
4240: 6e 74 5f 63 68 61 6e 67 65 5f 63 6f 75 6e 74 20  nt_change_count 
4250: 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
4260: 5f 53 4f 55 4e 44 45 58 0a 20 20 20 20 7b 20 22  _SOUNDEX.    { "
4270: 73 6f 75 6e 64 65 78 22 2c 20 20 20 20 31 2c 20  soundex",    1, 
4280: 53 51 4c 49 54 45 5f 54 45 58 54 2c 20 20 20 20  SQLITE_TEXT,    
4290: 30 2c 20 73 6f 75 6e 64 65 78 46 75 6e 63 7d 2c  0, soundexFunc},
42a0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
42b0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 7b  QLITE_TEST.    {
42c0: 20 22 72 61 6e 64 73 74 72 22 2c 20 20 20 20 32   "randstr",    2
42d0: 2c 20 53 51 4c 49 54 45 5f 54 45 58 54 2c 20 20  , SQLITE_TEXT,  
42e0: 20 20 30 2c 20 72 61 6e 64 53 74 72 20 20 20 20    0, randStr    
42f0: 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  },.#endif.  };. 
4300: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
4310: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
4320: 3b 0a 20 20 20 20 73 69 67 6e 65 64 20 63 68 61  ;.    signed cha
4330: 72 20 6e 41 72 67 3b 0a 20 20 20 20 73 69 67 6e  r nArg;.    sign
4340: 65 64 20 63 68 61 72 20 64 61 74 61 54 79 70 65  ed char dataType
4350: 3b 0a 20 20 20 20 75 38 20 61 72 67 54 79 70 65  ;.    u8 argType
4360: 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 53 74  ;.    void (*xSt
4370: 65 70 29 28 73 71 6c 69 74 65 5f 66 75 6e 63 2a  ep)(sqlite_func*
4380: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
4390: 2a 29 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78  *);.    void (*x
43a0: 46 69 6e 61 6c 69 7a 65 29 28 73 71 6c 69 74 65  Finalize)(sqlite
43b0: 5f 66 75 6e 63 2a 29 3b 0a 20 20 7d 20 61 41 67  _func*);.  } aAg
43c0: 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  gs[] = {.    { "
43d0: 6d 69 6e 22 2c 20 20 20 20 31 2c 20 30 2c 20 20  min",    1, 0,  
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 6d              0, m
43f0: 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 6d 69 6e  inmaxStep,   min
4400: 4d 61 78 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a 20  MaxFinalize },. 
4410: 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 31     { "max",    1
4420: 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 0,            
4430: 20 20 32 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c    2, minmaxStep,
4440: 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a     minMaxFinaliz
4450: 65 20 7d 2c 0a 20 20 20 20 7b 20 22 73 75 6d 22  e },.    { "sum"
4460: 2c 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 4e  ,    1, SQLITE_N
4470: 55 4d 45 52 49 43 2c 20 30 2c 20 73 75 6d 53 74  UMERIC, 0, sumSt
4480: 65 70 2c 20 20 20 20 20 20 73 75 6d 46 69 6e 61  ep,      sumFina
4490: 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b  lize    },.    {
44a0: 20 22 61 76 67 22 2c 20 20 20 20 31 2c 20 53 51   "avg",    1, SQ
44b0: 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c 20 30 2c  LITE_NUMERIC, 0,
44c0: 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 61   sumStep,      a
44d0: 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20 7d 2c  vgFinalize    },
44e0: 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74 22 2c 20  .    { "count", 
44f0: 20 30 2c 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52   0, SQLITE_NUMER
4500: 49 43 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70  IC, 0, countStep
4510: 2c 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69  ,    countFinali
4520: 7a 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f  ze  },.    { "co
4530: 75 6e 74 22 2c 20 20 31 2c 20 53 51 4c 49 54 45  unt",  1, SQLITE
4540: 5f 4e 55 4d 45 52 49 43 2c 20 30 2c 20 63 6f 75  _NUMERIC, 0, cou
4550: 6e 74 53 74 65 70 2c 20 20 20 20 63 6f 75 6e 74  ntStep,    count
4560: 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 23 69 66  Finalize  },.#if
4570: 20 30 0a 20 20 20 20 7b 20 22 73 74 64 64 65 76   0.    { "stddev
4580: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 4e 55 4d  ", 1, SQLITE_NUM
4590: 45 52 49 43 2c 20 30 2c 20 73 74 64 44 65 76 53  ERIC, 0, stdDevS
45a0: 74 65 70 2c 20 20 20 73 74 64 44 65 76 46 69 6e  tep,   stdDevFin
45b0: 61 6c 69 7a 65 20 7d 2c 0a 23 65 6e 64 69 66 0a  alize },.#endif.
45c0: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
45d0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 54 79 70 65  nst char *azType
45e0: 46 75 6e 63 73 5b 5d 20 3d 20 7b 20 22 6d 69 6e  Funcs[] = { "min
45f0: 22 2c 20 22 6d 61 78 22 2c 20 22 74 79 70 65 6f  ", "max", "typeo
4600: 66 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  f" };.  int i;..
4610: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4620: 65 6f 66 28 61 46 75 6e 63 73 29 2f 73 69 7a 65  eof(aFuncs)/size
4630: 6f 66 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69  of(aFuncs[0]); i
4640: 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ++){.    void *p
4650: 41 72 67 20 3d 20 61 46 75 6e 63 73 5b 69 5d 2e  Arg = aFuncs[i].
4660: 61 72 67 54 79 70 65 3d 3d 32 20 3f 20 28 76 6f  argType==2 ? (vo
4670: 69 64 2a 29 28 2d 31 29 20 3a 20 64 62 3b 0a 20  id*)(-1) : db;. 
4680: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
4690: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
46a0: 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a  Funcs[i].zName,.
46b0: 20 20 20 20 20 20 20 20 20 20 20 61 46 75 6e 63             aFunc
46c0: 73 5b 69 5d 2e 6e 41 72 67 2c 20 61 46 75 6e 63  s[i].nArg, aFunc
46d0: 73 5b 69 5d 2e 78 46 75 6e 63 2c 20 70 41 72 67  s[i].xFunc, pArg
46e0: 29 3b 0a 20 20 20 20 69 66 28 20 61 46 75 6e 63  );.    if( aFunc
46f0: 73 5b 69 5d 2e 78 46 75 6e 63 20 29 7b 0a 20 20  s[i].xFunc ){.  
4700: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6e 63      sqlite3_func
4710: 74 69 6f 6e 5f 74 79 70 65 28 64 62 2c 20 61 46  tion_type(db, aF
4720: 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61  uncs[i].zName, a
4730: 46 75 6e 63 73 5b 69 5d 2e 64 61 74 61 54 79 70  Funcs[i].dataTyp
4740: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
4750: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4760: 66 28 61 41 67 67 73 29 2f 73 69 7a 65 6f 66 28  f(aAggs)/sizeof(
4770: 61 41 67 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  aAggs[0]); i++){
4780: 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20  .    void *pArg 
4790: 3d 20 61 41 67 67 73 5b 69 5d 2e 61 72 67 54 79  = aAggs[i].argTy
47a0: 70 65 3d 3d 32 20 3f 20 28 76 6f 69 64 2a 29 28  pe==2 ? (void*)(
47b0: 2d 31 29 20 3a 20 64 62 3b 0a 20 20 20 20 73 71  -1) : db;.    sq
47c0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67  lite3_create_agg
47d0: 72 65 67 61 74 65 28 64 62 2c 20 61 41 67 67 73  regate(db, aAggs
47e0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  [i].zName,.     
47f0: 20 20 20 20 20 20 61 41 67 67 73 5b 69 5d 2e 6e        aAggs[i].n
4800: 41 72 67 2c 20 61 41 67 67 73 5b 69 5d 2e 78 53  Arg, aAggs[i].xS
4810: 74 65 70 2c 20 61 41 67 67 73 5b 69 5d 2e 78 46  tep, aAggs[i].xF
4820: 69 6e 61 6c 69 7a 65 2c 20 70 41 72 67 29 3b 0a  inalize, pArg);.
4830: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6e 63      sqlite3_func
4840: 74 69 6f 6e 5f 74 79 70 65 28 64 62 2c 20 61 41  tion_type(db, aA
4850: 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 41  ggs[i].zName, aA
4860: 67 67 73 5b 69 5d 2e 64 61 74 61 54 79 70 65 29  ggs[i].dataType)
4870: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
4880: 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 79 70 65   i<sizeof(azType
4890: 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66 28 61 7a  Funcs)/sizeof(az
48a0: 54 79 70 65 46 75 6e 63 73 5b 30 5d 29 3b 20 69  TypeFuncs[0]); i
48b0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  ++){.    int n =
48c0: 20 73 74 72 6c 65 6e 28 61 7a 54 79 70 65 46 75   strlen(azTypeFu
48d0: 6e 63 73 5b 69 5d 29 3b 0a 20 20 20 20 46 75 6e  ncs[i]);.    Fun
48e0: 63 44 65 66 20 2a 70 20 3d 20 73 71 6c 69 74 65  cDef *p = sqlite
48f0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
4900: 46 75 6e 63 2c 20 61 7a 54 79 70 65 46 75 6e 63  Func, azTypeFunc
4910: 73 5b 69 5d 2c 20 6e 29 3b 0a 20 20 20 20 77 68  s[i], n);.    wh
4920: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20  ile( p ){.      
4930: 70 2d 3e 69 6e 63 6c 75 64 65 54 79 70 65 73 20  p->includeTypes 
4940: 3d 20 31 3b 0a 20 20 20 20 20 20 70 20 3d 20 70  = 1;.      p = p
4950: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
4960: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69   }.  sqlite3Regi
4970: 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e 63  sterDateTimeFunc
4980: 74 69 6f 6e 73 28 64 62 29 3b 0a 7d 0a 0a 0a 0a  tions(db);.}....