/ Hex Artifact Content
Login

Artifact 3b511af0823ea32714e1702005b61a6efa2c0d87:


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 35 32 20 32 30 30 34 2f 30 35 2f 32 34 20  1.52 2004/05/24 
02a0: 32 33 3a 34 38 3a 32 36 20 64 61 6e 69 65 6c 6b  23:48: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 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
03c0: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
03d0: 63 68 61 72 20 2a 7a 42 65 73 74 3b 20 0a 20 20  char *zBest; .  
03e0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78  int i;.  int (*x
03f0: 43 6f 6d 70 61 72 65 29 28 63 6f 6e 73 74 20 63  Compare)(const c
0400: 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  har*, const char
0410: 2a 29 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 20  *);.  int mask; 
0420: 20 20 20 2f 2a 20 30 20 66 6f 72 20 6d 69 6e 28     /* 0 for min(
0430: 29 20 6f 72 20 30 78 66 66 66 66 66 66 66 66 20  ) or 0xffffffff 
0440: 66 6f 72 20 6d 61 78 28 29 20 2a 2f 0a 20 20 63  for max() */.  c
0450: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
0460: 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20  ..  if( argc==0 
0470: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 61 73 6b  ) return;.  mask
0480: 20 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 5f   = (int)sqlite3_
0490: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
04a0: 74 29 3b 0a 20 20 7a 42 65 73 74 20 3d 20 73 71  t);.  zBest = sq
04b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 61 74 61  lite3_value_data
04c0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
04d0: 20 7a 42 65 73 74 3d 3d 30 20 29 20 72 65 74 75   zBest==0 ) retu
04e0: 72 6e 3b 0a 20 20 7a 41 72 67 20 3d 20 73 71 6c  rn;.  zArg = sql
04f0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 61 74 61 28  ite3_value_data(
0500: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  argv[1]);.  if( 
0510: 7a 41 72 67 5b 30 5d 3d 3d 27 6e 27 20 29 7b 0a  zArg[0]=='n' ){.
0520: 20 20 20 20 78 43 6f 6d 70 61 72 65 20 3d 20 73      xCompare = s
0530: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 3b 0a 20  qlite3Compare;. 
0540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 43 6f 6d   }else{.    xCom
0550: 70 61 72 65 20 3d 20 73 74 72 63 6d 70 3b 0a 20  pare = strcmp;. 
0560: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
0570: 61 72 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  argc; i+=2){.   
0580: 20 7a 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f   zArg = sqlite3_
0590: 76 61 6c 75 65 5f 64 61 74 61 28 61 72 67 76 5b  value_data(argv[
05a0: 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72  i]);.    if( zAr
05b0: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  g==0 ) return;. 
05c0: 20 20 20 69 66 28 20 28 78 43 6f 6d 70 61 72 65     if( (xCompare
05d0: 28 7a 41 72 67 2c 20 7a 42 65 73 74 29 5e 6d 61  (zArg, zBest)^ma
05e0: 73 6b 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 7a  sk)<0 ){.      z
05f0: 42 65 73 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20  Best = zArg;.   
0600: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
0610: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
0620: 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a 42 65 73  ng(context, zBes
0630: 74 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  t, -1);.}../*.**
0640: 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65   Return the type
0650: 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
0660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0670: 20 74 79 70 65 6f 66 46 75 6e 63 28 73 71 6c 69   typeofFunc(sqli
0680: 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74  te_func *context
0690: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
06a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
06b0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
06c0: 2a 7a 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  *z = 0;.  assert
06d0: 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 73  ( argc==2 );.  s
06e0: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76  witch( sqlite3_v
06f0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
0700: 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ]) ){.    case S
0710: 51 4c 49 54 45 33 5f 4e 55 4c 4c 3a 20 7a 20 3d  QLITE3_NULL: z =
0720: 20 22 6e 75 6c 6c 22 20 3b 20 62 72 65 61 6b 3b   "null" ; break;
0730: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0740: 33 5f 49 4e 54 45 47 45 52 3a 20 7a 20 3d 20 22  3_INTEGER: z = "
0750: 69 6e 74 65 67 65 72 22 20 3b 20 62 72 65 61 6b  integer" ; break
0760: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0770: 45 33 5f 54 45 58 54 3a 20 7a 20 3d 20 22 74 65  E3_TEXT: z = "te
0780: 78 74 22 20 3b 20 62 72 65 61 6b 3b 0a 20 20 20  xt" ; break;.   
0790: 20 63 61 73 65 20 53 51 4c 49 54 45 33 5f 46 4c   case SQLITE3_FL
07a0: 4f 41 54 3a 20 7a 20 3d 20 22 72 65 61 6c 22 20  OAT: z = "real" 
07b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
07c0: 65 20 53 51 4c 49 54 45 33 5f 42 4c 4f 42 3a 20  e SQLITE3_BLOB: 
07d0: 7a 20 3d 20 22 62 6c 6f 62 22 20 3b 20 62 72 65  z = "blob" ; bre
07e0: 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ak;.  }.  sqlite
07f0: 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72  3_set_result_str
0800: 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20  ing(context, z, 
0810: 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  -1);.}../*.** Im
0820: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0830: 74 68 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e  the length() fun
0840: 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ction.*/.static 
0850: 76 6f 69 64 20 6c 65 6e 67 74 68 46 75 6e 63 28  void lengthFunc(
0860: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e  sqlite_func *con
0870: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
0880: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0890: 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63  argv){.  const c
08a0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6c 65  har *z;.  int le
08b0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  n;..  assert( ar
08c0: 67 63 3d 3d 31 20 29 3b 0a 20 20 7a 20 3d 20 73  gc==1 );.  z = s
08d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 61 74  qlite3_value_dat
08e0: 61 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  a(argv[0]);.  if
08f0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
0900: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
0910: 54 46 38 0a 20 20 66 6f 72 28 6c 65 6e 3d 30 3b  TF8.  for(len=0;
0920: 20 2a 7a 3b 20 7a 2b 2b 29 7b 20 69 66 28 20 28   *z; z++){ if( (
0930: 30 78 63 30 26 2a 7a 29 21 3d 30 78 38 30 20 29  0xc0&*z)!=0x80 )
0940: 20 6c 65 6e 2b 2b 3b 20 7d 0a 23 65 6c 73 65 0a   len++; }.#else.
0950: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
0960: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
0970: 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 69  te3_set_result_i
0980: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e 29  nt(context, len)
0990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
09a0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
09b0: 20 61 62 73 28 29 20 66 75 6e 63 74 69 6f 6e 0a   abs() function.
09c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
09d0: 62 73 46 75 6e 63 28 73 71 6c 69 74 65 5f 66 75  bsFunc(sqlite_fu
09e0: 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  nc *context, int
09f0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
0a00: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
0a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
0a20: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
0a30: 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65   );.  z = sqlite
0a40: 33 5f 76 61 6c 75 65 5f 64 61 74 61 28 61 72 67  3_value_data(arg
0a50: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  v[0]);.  if( z==
0a60: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
0a70: 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69  ( z[0]=='-' && i
0a80: 73 64 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a  sdigit(z[1]) ) z
0a90: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  ++;.  sqlite3_se
0aa0: 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28  t_result_string(
0ab0: 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d 31 29 3b  context, z, -1);
0ac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
0ad0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0ae0: 73 75 62 73 74 72 28 29 20 66 75 6e 63 74 69 6f  substr() functio
0af0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
0b00: 20 73 75 62 73 74 72 46 75 6e 63 28 73 71 6c 69   substrFunc(sqli
0b10: 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74  te_func *context
0b20: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
0b30: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
0b40: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
0b50: 2a 7a 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  *z;.#ifdef SQLIT
0b60: 45 5f 55 54 46 38 0a 20 20 63 6f 6e 73 74 20 63  E_UTF8.  const c
0b70: 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69  har *z2;.  int i
0b80: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 70  ;.#endif.  int p
0b90: 31 2c 20 70 32 2c 20 6c 65 6e 3b 0a 20 20 61 73  1, p2, len;.  as
0ba0: 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b  sert( argc==3 );
0bb0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  z = sqlite3_v
0bc0: 61 6c 75 65 5f 64 61 74 61 28 61 72 67 76 5b 30  alue_data(argv[0
0bd0: 5d 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  ]);.  if( z==0 )
0be0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 31 20 3d 20   return;.  p1 = 
0bf0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
0c00: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 70 32  t(argv[1]);.  p2
0c10: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
0c20: 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a 23  _int(argv[2]);.#
0c30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 54 46  ifdef SQLITE_UTF
0c40: 38 0a 20 20 66 6f 72 28 6c 65 6e 3d 30 2c 20 7a  8.  for(len=0, z
0c50: 32 3d 7a 3b 20 2a 7a 32 3b 20 7a 32 2b 2b 29 7b  2=z; *z2; z2++){
0c60: 20 69 66 28 20 28 30 78 63 30 26 2a 7a 32 29 21   if( (0xc0&*z2)!
0c70: 3d 30 78 38 30 20 29 20 6c 65 6e 2b 2b 3b 20 7d  =0x80 ) len++; }
0c80: 0a 23 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73  .#else.  len = s
0c90: 74 72 6c 65 6e 28 7a 29 3b 0a 23 65 6e 64 69 66  trlen(z);.#endif
0ca0: 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20  .  if( p1<0 ){. 
0cb0: 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20 20     p1 += len;.  
0cc0: 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20    if( p1<0 ){.  
0cd0: 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20      p2 += p1;.  
0ce0: 20 20 20 20 70 31 20 3d 20 30 3b 0a 20 20 20 20      p1 = 0;.    
0cf0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 31  }.  }else if( p1
0d00: 3e 30 20 29 7b 0a 20 20 20 20 70 31 2d 2d 3b 0a  >0 ){.    p1--;.
0d10: 20 20 7d 0a 20 20 69 66 28 20 70 31 2b 70 32 3e    }.  if( p1+p2>
0d20: 6c 65 6e 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  len ){.    p2 = 
0d30: 6c 65 6e 2d 70 31 3b 0a 20 20 7d 0a 23 69 66 64  len-p1;.  }.#ifd
0d40: 65 66 20 53 51 4c 49 54 45 5f 55 54 46 38 0a 20  ef SQLITE_UTF8. 
0d50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 31 20 26   for(i=0; i<p1 &
0d60: 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  & z[i]; i++){.  
0d70: 20 20 69 66 28 20 28 7a 5b 69 5d 26 30 78 63 30    if( (z[i]&0xc0
0d80: 29 3d 3d 30 78 38 30 20 29 20 70 31 2b 2b 3b 0a  )==0x80 ) p1++;.
0d90: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69    }.  while( z[i
0da0: 5d 20 26 26 20 28 7a 5b 69 5d 26 30 78 63 30 29  ] && (z[i]&0xc0)
0db0: 3d 3d 30 78 38 30 20 29 7b 20 69 2b 2b 3b 20 70  ==0x80 ){ i++; p
0dc0: 31 2b 2b 3b 20 7d 0a 20 20 66 6f 72 28 3b 20 69  1++; }.  for(; i
0dd0: 3c 70 31 2b 70 32 20 26 26 20 7a 5b 69 5d 3b 20  <p1+p2 && z[i]; 
0de0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 7a  i++){.    if( (z
0df0: 5b 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20  [i]&0xc0)==0x80 
0e00: 29 20 70 32 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  ) p2++;.  }.  wh
0e10: 69 6c 65 28 20 7a 5b 69 5d 20 26 26 20 28 7a 5b  ile( z[i] && (z[
0e20: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
0e30: 7b 20 69 2b 2b 3b 20 70 32 2b 2b 3b 20 7d 0a 23  { i++; p2++; }.#
0e40: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 32 3c 30  endif.  if( p2<0
0e50: 20 29 20 70 32 20 3d 20 30 3b 0a 20 20 73 71 6c   ) p2 = 0;.  sql
0e60: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
0e70: 73 74 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20  string(context, 
0e80: 26 7a 5b 70 31 5d 2c 20 70 32 29 3b 0a 7d 0a 0a  &z[p1], p2);.}..
0e90: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
0ea0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 75 6e  tion of the roun
0eb0: 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a  d() function.*/.
0ec0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 75 6e  static void roun
0ed0: 64 46 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e  dFunc(sqlite_fun
0ee0: 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  c *context, int 
0ef0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
0f00: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69  lue **argv){.  i
0f10: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 75 62  nt n = 0;.  doub
0f20: 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 7a 42 75  le r;.  char zBu
0f30: 66 5b 31 30 30 5d 3b 0a 20 20 61 73 73 65 72 74  f[100];.  assert
0f40: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67  ( argc==1 || arg
0f50: 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 61 72  c==2 );.  if( ar
0f60: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  gc==2 ){.    if(
0f70: 20 53 51 4c 49 54 45 33 5f 4e 55 4c 4c 3d 3d 73   SQLITE3_NULL==s
0f80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
0f90: 65 28 61 72 67 76 5b 31 5d 29 20 29 20 72 65 74  e(argv[1]) ) ret
0fa0: 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  urn;.    n = sql
0fb0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
0fc0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[1]);.    if(
0fd0: 20 6e 3e 33 30 20 29 20 6e 20 3d 20 33 30 3b 0a   n>30 ) n = 30;.
0fe0: 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20      if( n<0 ) n 
0ff0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53  = 0;.  }.  if( S
1000: 51 4c 49 54 45 33 5f 4e 55 4c 4c 3d 3d 73 71 6c  QLITE3_NULL==sql
1010: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
1020: 61 72 67 76 5b 30 5d 29 20 29 20 72 65 74 75 72  argv[0]) ) retur
1030: 6e 3b 0a 20 20 72 20 3d 20 73 71 6c 69 74 65 33  n;.  r = sqlite3
1040: 5f 76 61 6c 75 65 5f 66 6c 6f 61 74 28 61 72 67  _value_float(arg
1050: 76 5b 30 5d 29 3b 0a 20 20 73 70 72 69 6e 74 66  v[0]);.  sprintf
1060: 28 7a 42 75 66 2c 22 25 2e 2a 66 22 2c 6e 2c 72  (zBuf,"%.*f",n,r
1070: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 74  );.  sqlite3_set
1080: 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28 63  _result_string(c
1090: 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31  ontext, zBuf, -1
10a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
10b0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
10c0: 65 20 75 70 70 65 72 28 29 20 61 6e 64 20 6c 6f  e upper() and lo
10d0: 77 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74 69  wer() SQL functi
10e0: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ons..*/.static v
10f0: 6f 69 64 20 75 70 70 65 72 46 75 6e 63 28 73 71  oid upperFunc(sq
1100: 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65  lite_func *conte
1110: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
1120: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1130: 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  gv){.  char *z;.
1140: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
1150: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
1160: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 73 65    z = sqlite3_se
1170: 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28  t_result_string(
1180: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
1190: 5f 76 61 6c 75 65 5f 64 61 74 61 28 61 72 67 76  _value_data(argv
11a0: 5b 30 5d 29 2c 20 2d 31 29 3b 0a 20 20 69 66 28  [0]), -1);.  if(
11b0: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
11c0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
11d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
11e0: 73 6c 6f 77 65 72 28 7a 5b 69 5d 29 20 29 20 7a  slower(z[i]) ) z
11f0: 5b 69 5d 20 3d 20 74 6f 75 70 70 65 72 28 7a 5b  [i] = toupper(z[
1200: 69 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  i]);.  }.}.stati
1210: 63 20 76 6f 69 64 20 6c 6f 77 65 72 46 75 6e 63  c void lowerFunc
1220: 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f  (sqlite_func *co
1230: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
1240: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1250: 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a  *argv){.  char *
1260: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  z;.  int i;.  if
1270: 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75 72  ( argc<1 ) retur
1280: 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
1290: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
12a0: 6e 67 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  ng(context, sqli
12b0: 74 65 33 5f 76 61 6c 75 65 5f 64 61 74 61 28 61  te3_value_data(a
12c0: 72 67 76 5b 30 5d 29 2c 20 2d 31 29 3b 0a 20 20  rgv[0]), -1);.  
12d0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
12e0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  n;.  for(i=0; z[
12f0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
1300: 28 20 69 73 75 70 70 65 72 28 7a 5b 69 5d 29 20  ( isupper(z[i]) 
1310: 29 20 7a 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72  ) z[i] = tolower
1320: 28 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (z[i]);.  }.}../
1330: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1340: 69 6f 6e 20 6f 66 20 74 68 65 20 49 46 4e 55 4c  ion of the IFNUL
1350: 4c 28 29 2c 20 4e 56 4c 28 29 2c 20 61 6e 64 20  L(), NVL(), and 
1360: 43 4f 41 4c 45 53 43 45 28 29 20 66 75 6e 63 74  COALESCE() funct
1370: 69 6f 6e 73 2e 20 20 0a 2a 2a 20 41 6c 6c 20 74  ions.  .** All t
1380: 68 72 65 65 20 64 6f 20 74 68 65 20 73 61 6d 65  hree do the same
1390: 20 74 68 69 6e 67 2e 20 20 54 68 65 79 20 72 65   thing.  They re
13a0: 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 6e  turn the first n
13b0: 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61 72 67 75 6d  on-NULL.** argum
13c0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
13d0: 6f 69 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28 73  oid ifnullFunc(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 63 2c 20 73  ext, int argc, s
1400: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1410: 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rgv){.  int i;. 
1420: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1430: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1440: 53 51 4c 49 54 45 33 5f 4e 55 4c 4c 21 3d 73 71  SQLITE3_NULL!=sq
1450: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1460: 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20  (argv[i]) ){.   
1470: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72     sqlite3_set_r
1480: 65 73 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e  esult_string(con
1490: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
14a0: 6c 75 65 5f 64 61 74 61 28 61 72 67 76 5b 69 5d  lue_data(argv[i]
14b0: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72  ), -1);.      br
14c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
14d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
14e0: 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d  tation of random
14f0: 28 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61  ().  Return a ra
1500: 6e 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20 20 0a  ndom integer.  .
1510: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1520: 61 6e 64 6f 6d 46 75 6e 63 28 73 71 6c 69 74 65  andomFunc(sqlite
1530: 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20  _func *context, 
1540: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
1550: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
1560: 0a 20 20 69 6e 74 20 72 3b 0a 20 20 73 71 6c 69  .  int r;.  sqli
1570: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
1580: 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
1590: 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75  sqlite3_set_resu
15a0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
15b0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  r);.}../*.** Imp
15c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
15d0: 68 65 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  he last_insert_r
15e0: 6f 77 69 64 28 29 20 53 51 4c 20 66 75 6e 63 74  owid() SQL funct
15f0: 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ion.  The return
1600: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65  .** value is the
1610: 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c   same as the sql
1620: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
1630: 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66 75 6e  _rowid() API fun
1640: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1650: 20 76 6f 69 64 20 6c 61 73 74 5f 69 6e 73 65 72   void last_inser
1660: 74 5f 72 6f 77 69 64 28 0a 20 20 73 71 6c 69 74  t_rowid(.  sqlit
1670: 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c  e_func *context,
1680: 20 0a 20 20 69 6e 74 20 61 72 67 2c 20 0a 20 20   .  int arg, .  
1690: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
16a0: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
16b0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 75   *db = sqlite3_u
16c0: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
16d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 74  );.  sqlite3_set
16e0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
16f0: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73  ext, sqlite3_las
1700: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64  t_insert_rowid(d
1710: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  b));.}../*.** Im
1720: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1730: 74 68 65 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  the change_count
1740: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  () SQL function.
1750: 20 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20    The return.** 
1760: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d  value is the sam
1770: 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33  e as the sqlite3
1780: 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49 20 66  _changes() API f
1790: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
17a0: 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 5f 63  ic void change_c
17b0: 6f 75 6e 74 28 73 71 6c 69 74 65 5f 66 75 6e 63  ount(sqlite_func
17c0: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
17d0: 72 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rg, sqlite3_valu
17e0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73 71 6c  e **argv){.  sql
17f0: 69 74 65 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  ite *db = sqlite
1800: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
1810: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ext);.  sqlite3_
1820: 73 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  set_result_int(c
1830: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
1840: 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a  changes(db));.}.
1850: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1860: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 73  ation of the las
1870: 74 5f 73 74 61 74 65 6d 65 6e 74 5f 63 68 61 6e  t_statement_chan
1880: 67 65 5f 63 6f 75 6e 74 28 29 20 53 51 4c 20 66  ge_count() SQL f
1890: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 0a 2a 2a  unction.  The.**
18a0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
18b0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
18c0: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 73 74   sqlite3_last_st
18d0: 61 74 65 6d 65 6e 74 5f 63 68 61 6e 67 65 73 28  atement_changes(
18e0: 29 20 41 50 49 0a 2a 2a 20 66 75 6e 63 74 69 6f  ) API.** functio
18f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1900: 64 20 6c 61 73 74 5f 73 74 61 74 65 6d 65 6e 74  d last_statement
1910: 5f 63 68 61 6e 67 65 5f 63 6f 75 6e 74 28 0a 20  _change_count(. 
1920: 20 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f   sqlite_func *co
1930: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
1940: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1950: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
1960: 71 6c 69 74 65 20 2a 64 62 20 3d 20 73 71 6c 69  qlite *db = sqli
1970: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
1980: 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  ntext);.  sqlite
1990: 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 69 6e 74  3_set_result_int
19a0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
19b0: 33 5f 6c 61 73 74 5f 73 74 61 74 65 6d 65 6e 74  3_last_statement
19c0: 5f 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d  _changes(db));.}
19d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
19e0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  tation of the li
19f0: 6b 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  ke() SQL functio
1a00: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
1a10: 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  n implements.** 
1a20: 74 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49 4b  the build-in LIK
1a30: 45 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65  E operator.  The
1a40: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1a50: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
1a60: 69 73 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  is the.** string
1a70: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
1a80: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1a90: 70 61 74 74 65 72 6e 2e 20 20 53 6f 2c 20 74 68  pattern.  So, th
1aa0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  e SQL statements
1ab0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20  :.**.**       A 
1ac0: 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20  LIKE B.**.** is 
1ad0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 6c  implemented as l
1ae0: 69 6b 65 28 41 2c 42 29 2e 0a 2a 2f 0a 73 74 61  ike(A,B)..*/.sta
1af0: 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e  tic void likeFun
1b00: 63 28 0a 20 20 73 71 6c 69 74 65 5f 66 75 6e 63  c(.  sqlite_func
1b10: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
1b20: 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74  t argc, .  sqlit
1b30: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1b40: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
1b50: 6e 65 64 20 63 68 61 72 20 2a 7a 41 20 3d 20 73  ned char *zA = s
1b60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 61 74  qlite3_value_dat
1b70: 61 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f  a(argv[0]);.  co
1b80: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1b90: 72 20 2a 7a 42 20 3d 20 73 71 6c 69 74 65 33 5f  r *zB = sqlite3_
1ba0: 76 61 6c 75 65 5f 64 61 74 61 28 61 72 67 76 5b  value_data(argv[
1bb0: 31 5d 29 3b 0a 20 20 69 66 28 20 7a 41 20 26 26  1]);.  if( zA &&
1bc0: 20 7a 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   zB ){.    sqlit
1bd0: 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 69 6e  e3_set_result_in
1be0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
1bf0: 65 33 4c 69 6b 65 43 6f 6d 70 61 72 65 28 7a 41  e3LikeCompare(zA
1c00: 2c 20 7a 42 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , zB));.  }.}../
1c10: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1c20: 69 6f 6e 20 6f 66 20 74 68 65 20 67 6c 6f 62 28  ion of the glob(
1c30: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
1c40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1c50: 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65  mplements.** the
1c60: 20 62 75 69 6c 64 2d 69 6e 20 47 4c 4f 42 20 6f   build-in GLOB o
1c70: 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20 66 69  perator.  The fi
1c80: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
1c90: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
1ca0: 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e  the.** string an
1cb0: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  d the second arg
1cc0: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
1cd0: 74 65 72 6e 2e 20 20 53 6f 2c 20 74 68 65 20 53  tern.  So, the S
1ce0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a  QL statements:.*
1cf0: 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20 47 4c 4f  *.**       A GLO
1d00: 42 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70  B B.**.** is imp
1d10: 6c 65 6d 65 6e 74 65 64 20 61 73 20 67 6c 6f 62  lemented as glob
1d20: 28 41 2c 42 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  (A,B)..*/.static
1d30: 20 76 6f 69 64 20 67 6c 6f 62 46 75 6e 63 28 73   void globFunc(s
1d40: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74  qlite_func *cont
1d50: 65 78 74 2c 20 69 6e 74 20 61 72 67 2c 20 73 71  ext, int arg, sq
1d60: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1d70: 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  gv){.  const uns
1d80: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 20 3d  igned char *zA =
1d90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
1da0: 61 74 61 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ata(argv[0]);.  
1db0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1dc0: 68 61 72 20 2a 7a 42 20 3d 20 73 71 6c 69 74 65  har *zB = sqlite
1dd0: 33 5f 76 61 6c 75 65 5f 64 61 74 61 28 61 72 67  3_value_data(arg
1de0: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 41 20  v[1]);.  if( zA 
1df0: 26 26 20 7a 42 20 29 7b 0a 20 20 20 20 73 71 6c  && zB ){.    sql
1e00: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
1e10: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
1e20: 69 74 65 33 47 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3GlobCompare(
1e30: 7a 41 2c 20 7a 42 29 29 3b 0a 20 20 7d 0a 7d 0a  zA, zB));.  }.}.
1e40: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1e50: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c  ation of the NUL
1e60: 4c 49 46 28 78 2c 79 29 20 66 75 6e 63 74 69 6f  LIF(x,y) functio
1e70: 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69  n.  The result i
1e80: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
1e90: 72 67 75 6d 65 6e 74 20 69 66 20 74 68 65 20 61  rgument if the a
1ea0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 64 69 66  rguments are dif
1eb0: 66 65 72 65 6e 74 2e 20 20 54 68 65 20 72 65 73  ferent.  The res
1ec0: 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74  ult is NULL if t
1ed0: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
1ee0: 61 72 65 20 65 71 75 61 6c 20 74 6f 20 65 61 63  are equal to eac
1ef0: 68 20 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  h other..*/.stat
1f00: 69 63 20 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75  ic void nullifFu
1f10: 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a  nc(sqlite_func *
1f20: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
1f30: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
1f40: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73   **argv){.  cons
1f50: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1f60: 2a 7a 58 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  *zX = sqlite3_va
1f70: 6c 75 65 5f 64 61 74 61 28 61 72 67 76 5b 30 5d  lue_data(argv[0]
1f80: 29 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  );.  const unsig
1f90: 6e 65 64 20 63 68 61 72 20 2a 7a 59 20 3d 20 73  ned char *zY = s
1fa0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 61 74  qlite3_value_dat
1fb0: 61 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66  a(argv[1]);.  if
1fc0: 28 20 7a 58 21 3d 30 20 26 26 20 73 71 6c 69 74  ( zX!=0 && sqlit
1fd0: 65 33 43 6f 6d 70 61 72 65 28 7a 58 2c 20 7a 59  e3Compare(zX, zY
1fe0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
1ff0: 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73  te3_set_result_s
2000: 74 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a  tring(context, z
2010: 58 2c 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  X, -1);.  }.}../
2020: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2030: 69 6f 6e 20 6f 66 20 74 68 65 20 56 45 52 53 49  ion of the VERSI
2040: 4f 4e 28 2a 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ON(*) function. 
2050: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
2060: 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66  he version.** of
2070: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
2080: 61 72 79 20 74 68 61 74 20 69 73 20 72 75 6e 6e  ary that is runn
2090: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
20a0: 6f 69 64 20 76 65 72 73 69 6f 6e 46 75 6e 63 28  oid versionFunc(
20b0: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e  sqlite_func *con
20c0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
20d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
20e0: 61 72 67 76 29 7b 0a 20 20 73 71 6c 69 74 65 33  argv){.  sqlite3
20f0: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
2100: 6e 67 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  ng(context, sqli
2110: 74 65 33 5f 76 65 72 73 69 6f 6e 2c 20 2d 31 29  te3_version, -1)
2120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 58 50 45 52  ;.}../*.** EXPER
2130: 49 4d 45 4e 54 41 4c 20 2d 20 54 68 69 73 20 69  IMENTAL - This i
2140: 73 20 6e 6f 74 20 61 6e 20 6f 66 66 69 63 69 61  s not an officia
2150: 6c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  l function.  The
2160: 20 69 6e 74 65 72 66 61 63 65 20 6d 61 79 0a 2a   interface may.*
2170: 2a 20 63 68 61 6e 67 65 2e 20 20 54 68 69 73 20  * change.  This 
2180: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 69 73  function may dis
2190: 61 70 70 65 61 72 2e 20 20 44 6f 20 6e 6f 74 20  appear.  Do not 
21a0: 77 72 69 74 65 20 63 6f 64 65 20 74 68 61 74 20  write code that 
21b0: 64 65 70 65 6e 64 73 0a 2a 2a 20 6f 6e 20 74 68  depends.** on th
21c0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
21d0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
21e0: 6e 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28 29  n of the QUOTE()
21f0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
2200: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
2210: 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67 75  a single.** argu
2220: 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72  ment.  If the ar
2230: 67 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72 69  gument is numeri
2240: 63 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  c, the return va
2250: 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  lue is the same 
2260: 61 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65  as.** the argume
2270: 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75  nt.  If the argu
2280: 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
2290: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
22a0: 73 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  s the string.** 
22b0: 22 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77 69  "NULL".  Otherwi
22c0: 73 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e 74  se, the argument
22d0: 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20   is enclosed in 
22e0: 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77 69  single quotes wi
22f0: 74 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75 6f  th.** single-quo
2300: 74 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a 73  te escapes..*/.s
2310: 74 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74 65  tatic void quote
2320: 46 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e 63  Func(sqlite_func
2330: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
2340: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
2350: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f  ue **argv){.  co
2360: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
2370: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
2380: 61 74 61 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ata(argv[0]);.  
2390: 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74  if( argc<1 ) ret
23a0: 75 72 6e 3b 0a 20 20 69 66 28 20 7a 41 72 67 3d  urn;.  if( zArg=
23b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
23c0: 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72  3_set_result_str
23d0: 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55  ing(context, "NU
23e0: 4c 4c 22 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65  LL", 4);.  }else
23f0: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75   if( sqlite3IsNu
2400: 6d 62 65 72 28 7a 41 72 67 2c 20 30 2c 20 54 45  mber(zArg, 0, TE
2410: 58 54 5f 55 74 66 38 29 20 29 7b 0a 20 20 20 20  XT_Utf8) ){.    
2420: 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75  sqlite3_set_resu
2430: 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74 65 78  lt_string(contex
2440: 74 2c 20 7a 41 72 67 2c 20 2d 31 29 3b 0a 20 20  t, zArg, -1);.  
2450: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
2460: 2c 6a 2c 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a  ,j,n;.    char *
2470: 7a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  z;.    for(i=n=0
2480: 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b  ; zArg[i]; i++){
2490: 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c   if( zArg[i]=='\
24a0: 27 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20  '' ) n++; }.    
24b0: 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  z = sqliteMalloc
24c0: 28 20 69 2b 6e 2b 33 20 29 3b 0a 20 20 20 20 69  ( i+n+3 );.    i
24d0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
24e0: 3b 0a 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27  ;.    z[0] = '\'
24f0: 27 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ';.    for(i=0, 
2500: 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b  j=1; zArg[i]; i+
2510: 2b 29 7b 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  +){.      z[j++]
2520: 20 3d 20 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20   = zArg[i];.    
2530: 20 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27    if( zArg[i]=='
2540: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  \'' ){.        z
2550: 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [j++] = '\'';.  
2560: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2570: 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[j++] = '\'';. 
2580: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
2590: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73   sqlite3_set_res
25a0: 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74 65  ult_string(conte
25b0: 78 74 2c 20 7a 2c 20 6a 29 3b 0a 20 20 20 20 73  xt, z, j);.    s
25c0: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
25d0: 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  }.}..#ifdef SQLI
25e0: 54 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a  TE_SOUNDEX./*.**
25f0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f 75   Compute the sou
2600: 6e 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66  ndex encoding of
2610: 20 61 20 77 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74   a word..*/.stat
2620: 69 63 20 76 6f 69 64 20 73 6f 75 6e 64 65 78 46  ic void soundexF
2630: 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  unc(sqlite_func 
2640: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
2650: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
2660: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61  e **argv){.  cha
2670: 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20  r zResult[8];.  
2680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b  const char *zIn;
2690: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
26a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
26b0: 67 6e 65 64 20 63 68 61 72 20 69 43 6f 64 65 5b  gned char iCode[
26c0: 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20  ] = {.    0, 0, 
26d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
26e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
26f0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c   0, 0, 0,.    0,
2700: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2710: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2720: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
2730: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
2740: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2750: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2760: 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,.    0, 0, 0, 0
2770: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
2780: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2790: 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20  0, 0,.    0, 0, 
27a0: 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32  1, 2, 3, 0, 1, 2
27b0: 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c  , 0, 0, 2, 2, 4,
27c0: 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c   5, 5, 0,.    1,
27d0: 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20   2, 6, 2, 3, 0, 
27e0: 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30  1, 0, 2, 0, 2, 0
27f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
2800: 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c    0, 0, 1, 2, 3,
2810: 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20   0, 1, 2, 0, 0, 
2820: 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30  2, 2, 4, 5, 5, 0
2830: 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32  ,.    1, 2, 6, 2
2840: 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c  , 3, 0, 1, 0, 2,
2850: 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 2, 0, 0, 0, 
2860: 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73  0, 0,.  };.  ass
2870: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a  ert( argc==1 );.
2880: 20 20 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f    zIn = sqlite3_
2890: 76 61 6c 75 65 5f 64 61 74 61 28 61 72 67 76 5b  value_data(argv[
28a0: 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
28b0: 7a 49 6e 5b 69 5d 20 26 26 20 21 69 73 61 6c 70  zIn[i] && !isalp
28c0: 68 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29  ha(zIn[i]); i++)
28d0: 7b 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20  {}.  if( zIn[i] 
28e0: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 30  ){.    zResult[0
28f0: 5d 20 3d 20 74 6f 75 70 70 65 72 28 7a 49 6e 5b  ] = toupper(zIn[
2900: 69 5d 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  i]);.    for(j=1
2910: 3b 20 6a 3c 34 20 26 26 20 7a 49 6e 5b 69 5d 3b  ; j<4 && zIn[i];
2920: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
2930: 20 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49   code = iCode[zI
2940: 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20  n[i]&0x7f];.    
2950: 20 20 69 66 28 20 63 6f 64 65 3e 30 20 29 7b 0a    if( code>0 ){.
2960: 20 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b          zResult[
2970: 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30  j++] = code + '0
2980: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
2990: 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 34 20  .    while( j<4 
29a0: 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74  ){.      zResult
29b0: 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20  [j++] = '0';.   
29c0: 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a   }.    zResult[j
29d0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
29e0: 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74  e3_set_result_st
29f0: 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a 52  ring(context, zR
2a00: 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 7d 65 6c  esult, 4);.  }el
2a10: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
2a20: 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e  set_result_strin
2a30: 67 28 63 6f 6e 74 65 78 74 2c 20 22 3f 30 30 30  g(context, "?000
2a40: 22 2c 20 34 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", 4);.  }.}.#en
2a50: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2a60: 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
2a70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65  is function gene
2a80: 72 61 74 65 73 20 61 20 73 74 72 69 6e 67 20 6f  rates a string o
2a90: 66 20 72 61 6e 64 6f 6d 20 63 68 61 72 61 63 74  f random charact
2aa0: 65 72 73 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  ers.  Used for.*
2ab0: 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74 65 73  * generating tes
2ac0: 74 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  t data..*/.stati
2ad0: 63 20 76 6f 69 64 20 72 61 6e 64 53 74 72 28 73  c void randStr(s
2ae0: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74  qlite_func *cont
2af0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
2b00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2b10: 72 67 76 29 7b 0a 20 20 73 74 61 74 69 63 20 63  rgv){.  static c
2b20: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2b30: 61 72 20 7a 53 72 63 5b 5d 20 3d 20 0a 20 20 20  ar zSrc[] = .   
2b40: 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
2b50: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
2b60: 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
2b70: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
2b80: 0a 20 20 20 20 20 22 30 31 32 33 34 35 36 37 38  .     "012345678
2b90: 39 22 0a 20 20 20 20 20 22 2e 2d 21 2c 3a 2a 5e  9".     ".-!,:*^
2ba0: 2b 3d 5f 7c 3f 2f 3c 3e 20 22 3b 0a 20 20 69 6e  +=_|?/<> ";.  in
2bb0: 74 20 69 4d 69 6e 2c 20 69 4d 61 78 2c 20 6e 2c  t iMin, iMax, n,
2bc0: 20 72 2c 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65   r, i;.  unsigne
2bd0: 64 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30  d char zBuf[1000
2be0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 31  ];.  if( argc>=1
2bf0: 20 29 7b 0a 20 20 20 20 69 4d 69 6e 20 3d 20 61   ){.    iMin = a
2c00: 74 6f 69 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  toi(sqlite3_valu
2c10: 65 5f 64 61 74 61 28 61 72 67 76 5b 30 5d 29 29  e_data(argv[0]))
2c20: 3b 0a 20 20 20 20 69 66 28 20 69 4d 69 6e 3c 30  ;.    if( iMin<0
2c30: 20 29 20 69 4d 69 6e 20 3d 20 30 3b 0a 20 20 20   ) iMin = 0;.   
2c40: 20 69 66 28 20 69 4d 69 6e 3e 3d 73 69 7a 65 6f   if( iMin>=sizeo
2c50: 66 28 7a 42 75 66 29 20 29 20 69 4d 69 6e 20 3d  f(zBuf) ) iMin =
2c60: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 3b   sizeof(zBuf)-1;
2c70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4d  .  }else{.    iM
2c80: 69 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  in = 1;.  }.  if
2c90: 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20  ( argc>=2 ){.   
2ca0: 20 69 4d 61 78 20 3d 20 61 74 6f 69 28 73 71 6c   iMax = atoi(sql
2cb0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 61 74 61 28  ite3_value_data(
2cc0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 69  argv[1]));.    i
2cd0: 66 28 20 69 4d 61 78 3c 69 4d 69 6e 20 29 20 69  f( iMax<iMin ) i
2ce0: 4d 61 78 20 3d 20 69 4d 69 6e 3b 0a 20 20 20 20  Max = iMin;.    
2cf0: 69 66 28 20 69 4d 61 78 3e 3d 73 69 7a 65 6f 66  if( iMax>=sizeof
2d00: 28 7a 42 75 66 29 20 29 20 69 4d 61 78 20 3d 20  (zBuf) ) iMax = 
2d10: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 3b 0a  sizeof(zBuf)-1;.
2d20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4d 61    }else{.    iMa
2d30: 78 20 3d 20 35 30 3b 0a 20 20 7d 0a 20 20 6e 20  x = 50;.  }.  n 
2d40: 3d 20 69 4d 69 6e 3b 0a 20 20 69 66 28 20 69 4d  = iMin;.  if( iM
2d50: 61 78 3e 69 4d 69 6e 20 29 7b 0a 20 20 20 20 73  ax>iMin ){.    s
2d60: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
2d70: 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b  (sizeof(r), &r);
2d80: 0a 20 20 20 20 72 20 26 3d 20 30 78 37 66 66 66  .    r &= 0x7fff
2d90: 66 66 66 66 3b 0a 20 20 20 20 6e 20 2b 3d 20 72  ffff;.    n += r
2da0: 25 28 69 4d 61 78 20 2b 20 31 20 2d 20 69 4d 69  %(iMax + 1 - iMi
2db0: 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  n);.  }.  assert
2dc0: 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29  ( n<sizeof(zBuf)
2dd0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 61 6e   );.  sqlite3Ran
2de0: 64 6f 6d 6e 65 73 73 28 6e 2c 20 7a 42 75 66 29  domness(n, zBuf)
2df0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2e00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66  ; i++){.    zBuf
2e10: 5b 69 5d 20 3d 20 7a 53 72 63 5b 7a 42 75 66 5b  [i] = zSrc[zBuf[
2e20: 69 5d 25 28 73 69 7a 65 6f 66 28 7a 53 72 63 29  i]%(sizeof(zSrc)
2e30: 2d 31 29 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  -1)];.  }.  zBuf
2e40: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [n] = 0;.  sqlit
2e50: 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74  e3_set_result_st
2e60: 72 69 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a 42  ring(context, zB
2e70: 75 66 2c 20 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66  uf, n);.}.#endif
2e80: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2e90: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2ea0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 68  wing structure h
2eb0: 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74 65 78 74  olds the context
2ec0: 20 6f 66 20 61 0a 2a 2a 20 73 75 6d 28 29 20 6f   of a.** sum() o
2ed0: 72 20 61 76 67 28 29 20 61 67 67 72 65 67 61 74  r avg() aggregat
2ee0: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a  e computation..*
2ef0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2f00: 20 53 75 6d 43 74 78 20 53 75 6d 43 74 78 3b 0a   SumCtx SumCtx;.
2f10: 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 7b 0a  struct SumCtx {.
2f20: 20 20 64 6f 75 62 6c 65 20 73 75 6d 3b 20 20 20    double sum;   
2f30: 20 20 2f 2a 20 53 75 6d 20 6f 66 20 74 65 72 6d    /* Sum of term
2f40: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  s */.  int cnt; 
2f50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f60: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d   of elements sum
2f70: 6d 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  med */.};../*.**
2f80: 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74   Routines used t
2f90: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75  o compute the su
2fa0: 6d 20 6f 72 20 61 76 65 72 61 67 65 2e 0a 2a 2f  m or average..*/
2fb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d  .static void sum
2fc0: 53 74 65 70 28 73 71 6c 69 74 65 5f 66 75 6e 63  Step(sqlite_func
2fd0: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
2fe0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
2ff0: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75  ue **argv){.  Su
3000: 6d 43 74 78 20 2a 70 3b 0a 20 20 69 66 28 20 61  mCtx *p;.  if( a
3010: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
3020: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
3030: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3040: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
3050: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26  *p));.  if( p &&
3060: 20 53 51 4c 49 54 45 33 5f 4e 55 4c 4c 21 3d 73   SQLITE3_NULL!=s
3070: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
3080: 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20  e(argv[0]) ){.  
3090: 20 20 70 2d 3e 73 75 6d 20 2b 3d 20 73 71 6c 69    p->sum += sqli
30a0: 74 65 33 5f 76 61 6c 75 65 5f 66 6c 6f 61 74 28  te3_value_float(
30b0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 70 2d  argv[0]);.    p-
30c0: 3e 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  >cnt++;.  }.}.st
30d0: 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e  atic void sumFin
30e0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 5f 66 75 6e  alize(sqlite_fun
30f0: 63 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  c *context){.  S
3100: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  umCtx *p;.  p = 
3110: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3120: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
3130: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
3140: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65    sqlite3_set_re
3150: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
3160: 65 78 74 2c 20 70 20 3f 20 70 2d 3e 73 75 6d 20  ext, p ? p->sum 
3170: 3a 20 30 2e 30 29 3b 0a 7d 0a 73 74 61 74 69 63  : 0.0);.}.static
3180: 20 76 6f 69 64 20 61 76 67 46 69 6e 61 6c 69 7a   void avgFinaliz
3190: 65 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63  e(sqlite_func *c
31a0: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74  ontext){.  SumCt
31b0: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
31c0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
31d0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
31e0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
31f0: 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20  ( p && p->cnt>0 
3200: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
3210: 65 74 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  et_result_double
3220: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 73 75 6d  (context, p->sum
3230: 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29  /(double)p->cnt)
3240: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3250: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3260: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3270: 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20  cture holds the 
3280: 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20  context of a.** 
3290: 76 61 72 69 61 6e 63 65 20 6f 72 20 73 74 61 6e  variance or stan
32a0: 64 61 72 64 20 64 65 76 69 61 74 69 6f 6e 20 63  dard deviation c
32b0: 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74  omputation..*/.t
32c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74  ypedef struct St
32d0: 64 44 65 76 43 74 78 20 53 74 64 44 65 76 43 74  dDevCtx StdDevCt
32e0: 78 3b 0a 73 74 72 75 63 74 20 53 74 64 44 65 76  x;.struct StdDev
32f0: 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20 73  Ctx {.  double s
3300: 75 6d 3b 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f  um;     /* Sum o
3310: 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 64 6f 75  f terms */.  dou
3320: 62 6c 65 20 73 75 6d 32 3b 20 20 20 20 2f 2a 20  ble sum2;    /* 
3330: 53 75 6d 20 6f 66 20 74 68 65 20 73 71 75 61 72  Sum of the squar
3340: 65 73 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20  es of terms */. 
3350: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
3360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
3370: 72 6d 73 20 63 6f 75 6e 74 65 64 20 2a 2f 0a 7d  rms counted */.}
3380: 3b 0a 0a 23 69 66 20 30 20 20 20 2f 2a 20 4f 6d  ;..#if 0   /* Om
3390: 69 74 20 62 65 63 61 75 73 65 20 6d 61 74 68 20  it because math 
33a0: 6c 69 62 72 61 72 79 20 69 73 20 72 65 71 75 69  library is requi
33b0: 72 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75  red */./*.** Rou
33c0: 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f  tines used to co
33d0: 6d 70 75 74 65 20 74 68 65 20 73 74 61 6e 64 61  mpute the standa
33e0: 72 64 20 64 65 76 69 61 74 69 6f 6e 20 61 73 20  rd deviation as 
33f0: 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2f  an aggregate..*/
3400: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 64  .static void std
3410: 44 65 76 53 74 65 70 28 73 71 6c 69 74 65 5f 66  DevStep(sqlite_f
3420: 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  unc *context, in
3430: 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
3440: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 74  ar **argv){.  St
3450: 64 44 65 76 43 74 78 20 2a 70 3b 0a 20 20 64 6f  dDevCtx *p;.  do
3460: 75 62 6c 65 20 78 3b 0a 20 20 69 66 28 20 61 72  uble x;.  if( ar
3470: 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
3480: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
3490: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
34a0: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
34b0: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  p));.  if( p && 
34c0: 61 72 67 76 5b 30 5d 20 29 7b 0a 20 20 20 20 78  argv[0] ){.    x
34d0: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 46 28 61   = sqlite3AtoF(a
34e0: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  rgv[0], 0);.    
34f0: 70 2d 3e 73 75 6d 20 2b 3d 20 78 3b 0a 20 20 20  p->sum += x;.   
3500: 20 70 2d 3e 73 75 6d 32 20 2b 3d 20 78 2a 78 3b   p->sum2 += x*x;
3510: 0a 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20  .    p->cnt++;. 
3520: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
3530: 20 73 74 64 44 65 76 46 69 6e 61 6c 69 7a 65 28   stdDevFinalize(
3540: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e  sqlite_func *con
3550: 74 65 78 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20  text){.  double 
3560: 72 4e 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67  rN = sqlite3_agg
3570: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e  regate_count(con
3580: 74 65 78 74 29 3b 0a 20 20 53 74 64 44 65 76 43  text);.  StdDevC
3590: 74 78 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  tx *p = sqlite3_
35a0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
35b0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
35c0: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20  f(*p));.  if( p 
35d0: 26 26 20 70 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20  && p->cnt>1 ){. 
35e0: 20 20 20 64 6f 75 62 6c 65 20 72 43 6e 74 20 3d     double rCnt =
35f0: 20 63 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65   cnt;.    sqlite
3600: 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 64 6f 75  3_set_result_dou
3610: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20  ble(context, .  
3620: 20 20 20 20 20 73 71 72 74 28 28 70 2d 3e 73 75       sqrt((p->su
3630: 6d 32 20 2d 20 70 2d 3e 73 75 6d 2a 70 2d 3e 73  m2 - p->sum*p->s
3640: 75 6d 2f 72 43 6e 74 29 2f 28 72 43 6e 74 2d 31  um/rCnt)/(rCnt-1
3650: 2e 30 29 29 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  .0)));.  }.}.#en
3660: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
3670: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
3680: 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f  re keeps track o
3690: 66 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  f state informat
36a0: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63  ion for the.** c
36b0: 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65  ount() aggregate
36c0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79   function..*/.ty
36d0: 70 65 64 65 66 20 73 74 72 75 63 74 20 43 6f 75  pedef struct Cou
36e0: 6e 74 43 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a  ntCtx CountCtx;.
36f0: 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20  struct CountCtx 
3700: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 0a 2f  {.  int n;.};../
3710: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
3720: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
3730: 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65  ount() aggregate
3740: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
3750: 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53  atic void countS
3760: 74 65 70 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  tep(sqlite_func 
3770: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
3780: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
3790: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75  e **argv){.  Cou
37a0: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
37b0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
37c0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
37d0: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
37e0: 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c    if( (argc==0 |
37f0: 7c 20 53 51 4c 49 54 45 33 5f 4e 55 4c 4c 21 3d  | SQLITE3_NULL!=
3800: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
3810: 70 65 28 61 72 67 76 5b 30 5d 29 29 20 26 26 20  pe(argv[0])) && 
3820: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b  p ){.    p->n++;
3830: 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63  .  }.}   .static
3840: 20 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c   void countFinal
3850: 69 7a 65 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  ize(sqlite_func 
3860: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75  *context){.  Cou
3870: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
3880: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3890: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
38a0: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
38b0: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65    sqlite3_set_re
38c0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
38d0: 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b  , p ? p->n : 0);
38e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
38f0: 75 6e 63 74 69 6f 6e 20 74 72 61 63 6b 73 20 73  unction tracks s
3900: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
3910: 20 66 6f 72 20 74 68 65 20 6d 69 6e 28 29 20 61   for the min() a
3920: 6e 64 20 6d 61 78 28 29 0a 2a 2a 20 61 67 67 72  nd max().** aggr
3930: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
3940: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3950: 63 74 20 4d 69 6e 4d 61 78 43 74 78 20 4d 69 6e  ct MinMaxCtx Min
3960: 4d 61 78 43 74 78 3b 0a 73 74 72 75 63 74 20 4d  MaxCtx;.struct M
3970: 69 6e 4d 61 78 43 74 78 20 7b 0a 20 20 63 68 61  inMaxCtx {.  cha
3980: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 2f 2a  r *z;         /*
3990: 20 54 68 65 20 62 65 73 74 20 73 6f 20 66 61 72   The best so far
39a0: 20 2a 2f 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   */.  char zBuf[
39b0: 32 38 5d 3b 20 20 20 2f 2a 20 53 70 61 63 65 20  28];   /* Space 
39c0: 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
39d0: 20 66 6f 72 20 73 74 6f 72 61 67 65 20 2a 2f 0a   for storage */.
39e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  };../*.** Routin
39f0: 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  es to implement 
3a00: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20  min() and max() 
3a10: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
3a20: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ons..*/.static v
3a30: 6f 69 64 20 6d 69 6e 6d 61 78 53 74 65 70 28 73  oid minmaxStep(s
3a40: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74  qlite_func *cont
3a50: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
3a60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3a70: 72 67 76 29 7b 0a 20 20 4d 69 6e 4d 61 78 43 74  rgv){.  MinMaxCt
3a80: 78 20 2a 70 3b 0a 20 20 69 6e 74 20 28 2a 78 43  x *p;.  int (*xC
3a90: 6f 6d 70 61 72 65 29 28 63 6f 6e 73 74 20 63 68  ompare)(const ch
3aa0: 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  ar*, const char*
3ab0: 29 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 20 20  );.  int mask;  
3ac0: 20 20 2f 2a 20 30 20 66 6f 72 20 6d 69 6e 28 29    /* 0 for min()
3ad0: 20 6f 72 20 30 78 66 66 66 66 66 66 66 66 20 66   or 0xffffffff f
3ae0: 6f 72 20 6d 61 78 28 29 20 2a 2f 0a 20 20 63 6f  or max() */.  co
3af0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 30 20  nst char *zArg0 
3b00: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3b10: 64 61 74 61 28 61 72 67 76 5b 30 5d 29 3b 0a 20  data(argv[0]);. 
3b20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
3b30: 67 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  g1 = sqlite3_val
3b40: 75 65 5f 64 61 74 61 28 61 72 67 76 5b 31 5d 29  ue_data(argv[1])
3b50: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;..  assert( arg
3b60: 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 7a 41  c==2 );.  if( zA
3b70: 72 67 31 5b 30 5d 3d 3d 27 6e 27 20 29 7b 0a 20  rg1[0]=='n' ){. 
3b80: 20 20 20 78 43 6f 6d 70 61 72 65 20 3d 20 73 71     xCompare = sq
3b90: 6c 69 74 65 33 43 6f 6d 70 61 72 65 3b 0a 20 20  lite3Compare;.  
3ba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 78 43 6f 6d 70  }else{.    xComp
3bb0: 61 72 65 20 3d 20 73 74 72 63 6d 70 3b 0a 20 20  are = strcmp;.  
3bc0: 7d 0a 20 20 6d 61 73 6b 20 3d 20 28 69 6e 74 29  }.  mask = (int)
3bd0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
3be0: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 70 20  a(context);.  p 
3bf0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
3c00: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
3c10: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
3c20: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
3c30: 61 72 67 63 3c 31 20 7c 7c 20 7a 41 72 67 30 3d  argc<1 || zArg0=
3c40: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
3c50: 66 28 20 70 2d 3e 7a 3d 3d 30 20 7c 7c 20 28 78  f( p->z==0 || (x
3c60: 43 6f 6d 70 61 72 65 28 7a 41 72 67 30 2c 70 2d  Compare(zArg0,p-
3c70: 3e 7a 29 5e 6d 61 73 6b 29 3c 30 20 29 7b 0a 20  >z)^mask)<0 ){. 
3c80: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
3c90: 69 66 28 20 21 70 2d 3e 7a 42 75 66 5b 30 5d 20  if( !p->zBuf[0] 
3ca0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
3cb0: 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 7d  ree(p->z);.    }
3cc0: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  .    len = strle
3cd0: 6e 28 7a 41 72 67 30 29 3b 0a 20 20 20 20 69 66  n(zArg0);.    if
3ce0: 28 20 6c 65 6e 20 3c 20 73 69 7a 65 6f 66 28 70  ( len < sizeof(p
3cf0: 2d 3e 7a 42 75 66 29 2d 31 20 29 7b 0a 20 20 20  ->zBuf)-1 ){.   
3d00: 20 20 20 70 2d 3e 7a 20 3d 20 26 70 2d 3e 7a 42     p->z = &p->zB
3d10: 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  uf[1];.      p->
3d20: 7a 42 75 66 5b 30 5d 20 3d 20 31 3b 0a 20 20 20  zBuf[0] = 1;.   
3d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
3d40: 3e 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  >z = sqliteMallo
3d50: 63 28 20 6c 65 6e 2b 31 20 29 3b 0a 20 20 20 20  c( len+1 );.    
3d60: 20 20 70 2d 3e 7a 42 75 66 5b 30 5d 20 3d 20 30    p->zBuf[0] = 0
3d70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a  ;.      if( p->z
3d80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3d90: 20 20 7d 0a 20 20 20 20 73 74 72 63 70 79 28 70    }.    strcpy(p
3da0: 2d 3e 7a 2c 20 7a 41 72 67 30 29 3b 0a 20 20 7d  ->z, zArg0);.  }
3db0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  .}.static void m
3dc0: 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 28 73 71  inMaxFinalize(sq
3dd0: 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65  lite_func *conte
3de0: 78 74 29 7b 0a 20 20 4d 69 6e 4d 61 78 43 74 78  xt){.  MinMaxCtx
3df0: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
3e00: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3e10: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
3e20: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
3e30: 20 70 20 26 26 20 70 2d 3e 7a 20 29 7b 0a 20 20   p && p->z ){.  
3e40: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65    sqlite3_set_re
3e50: 73 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74  sult_string(cont
3e60: 65 78 74 2c 20 70 2d 3e 7a 2c 20 73 74 72 6c 65  ext, p->z, strle
3e70: 6e 28 70 2d 3e 7a 29 29 3b 0a 20 20 7d 0a 20 20  n(p->z));.  }.  
3e80: 69 66 28 20 70 20 26 26 20 21 70 2d 3e 7a 42 75  if( p && !p->zBu
3e90: 66 5b 30 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  f[0] ){.    sqli
3ea0: 74 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20  teFree(p->z);.  
3eb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
3ec0: 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 65  function registe
3ed0: 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  red all of the a
3ee0: 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f 6e 73  bove C functions
3ef0: 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74   as SQL.** funct
3f00: 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68 6f 75  ions.  This shou
3f10: 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72  ld be the only r
3f20: 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20 66  outine in this f
3f30: 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78 74 65  ile with.** exte
3f40: 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a 2f  rnal linkage..*/
3f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67  .void sqlite3Reg
3f60: 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63  isterBuiltinFunc
3f70: 74 69 6f 6e 73 28 73 71 6c 69 74 65 20 2a 64 62  tions(sqlite *db
3f80: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  ){.  static stru
3f90: 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
3fa0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 73 69 67 6e  zName;.     sign
3fb0: 65 64 20 63 68 61 72 20 6e 41 72 67 3b 0a 20 20  ed char nArg;.  
3fc0: 20 20 20 73 69 67 6e 65 64 20 63 68 61 72 20 64     signed char d
3fd0: 61 74 61 54 79 70 65 3b 0a 20 20 20 20 20 75 38  ataType;.     u8
3fe0: 20 61 72 67 54 79 70 65 3b 20 20 20 20 20 20 20   argType;       
3ff0: 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 6e 6f          /* 0: no
4000: 6e 65 2e 20 20 31 3a 20 64 62 20 20 32 3a 20 28  ne.  1: db  2: (
4010: 2d 31 29 20 2a 2f 0a 20 20 20 20 20 76 6f 69 64  -1) */.     void
4020: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
4030: 5f 66 75 6e 63 2a 2c 69 6e 74 2c 73 71 6c 69 74  _func*,int,sqlit
4040: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 3b 0a 20 20  e3_value **);.  
4050: 7d 20 61 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20  } aFuncs[] = {. 
4060: 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 20     { "min",     
4070: 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 52 47    -1, SQLITE_ARG
4080: 53 2c 20 20 20 20 30 2c 20 6d 69 6e 6d 61 78 46  S,    0, minmaxF
4090: 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69  unc },.    { "mi
40a0: 6e 22 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  n",        0, 0,
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
40c0: 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20   0          },. 
40d0: 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 20     { "max",     
40e0: 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 52 47    -1, SQLITE_ARG
40f0: 53 2c 20 20 20 20 32 2c 20 6d 69 6e 6d 61 78 46  S,    2, minmaxF
4100: 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61  unc },.    { "ma
4110: 78 22 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  x",        0, 0,
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
4130: 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20   0          },. 
4140: 20 20 20 7b 20 22 74 79 70 65 6f 66 22 2c 20 20     { "typeof",  
4150: 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 54 45 58     1, SQLITE_TEX
4160: 54 2c 20 20 20 20 30 2c 20 74 79 70 65 6f 66 46  T,    0, typeofF
4170: 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c  unc },.    { "cl
4180: 61 73 73 6f 66 22 2c 20 20 20 20 31 2c 20 53 51  assof",    1, SQ
4190: 4c 49 54 45 5f 54 45 58 54 2c 20 20 20 20 30 2c  LITE_TEXT,    0,
41a0: 20 74 79 70 65 6f 66 46 75 6e 63 20 7d 2c 20 2f   typeofFunc }, /
41b0: 2a 20 46 49 58 20 4d 45 3a 20 68 61 63 6b 20 2a  * FIX ME: hack *
41c0: 2f 0a 20 20 20 20 7b 20 22 6c 65 6e 67 74 68 22  /.    { "length"
41d0: 2c 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f  ,     1, SQLITE_
41e0: 4e 55 4d 45 52 49 43 2c 20 30 2c 20 6c 65 6e 67  NUMERIC, 0, leng
41f0: 74 68 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  thFunc },.    { 
4200: 22 73 75 62 73 74 72 22 2c 20 20 20 20 20 33 2c  "substr",     3,
4210: 20 53 51 4c 49 54 45 5f 54 45 58 54 2c 20 20 20   SQLITE_TEXT,   
4220: 20 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20 7d   0, substrFunc }
4230: 2c 0a 20 20 20 20 7b 20 22 61 62 73 22 2c 20 20  ,.    { "abs",  
4240: 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f        1, SQLITE_
4250: 4e 55 4d 45 52 49 43 2c 20 30 2c 20 61 62 73 46  NUMERIC, 0, absF
4260: 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  unc    },.    { 
4270: 22 72 6f 75 6e 64 22 2c 20 20 20 20 20 20 31 2c  "round",      1,
4280: 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c   SQLITE_NUMERIC,
4290: 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d   0, roundFunc  }
42a0: 2c 0a 20 20 20 20 7b 20 22 72 6f 75 6e 64 22 2c  ,.    { "round",
42b0: 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45 5f        2, SQLITE_
42c0: 4e 55 4d 45 52 49 43 2c 20 30 2c 20 72 6f 75 6e  NUMERIC, 0, roun
42d0: 64 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20  dFunc  },.    { 
42e0: 22 75 70 70 65 72 22 2c 20 20 20 20 20 20 31 2c  "upper",      1,
42f0: 20 53 51 4c 49 54 45 5f 54 45 58 54 2c 20 20 20   SQLITE_TEXT,   
4300: 20 30 2c 20 75 70 70 65 72 46 75 6e 63 20 20 7d   0, upperFunc  }
4310: 2c 0a 20 20 20 20 7b 20 22 6c 6f 77 65 72 22 2c  ,.    { "lower",
4320: 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f        1, SQLITE_
4330: 54 45 58 54 2c 20 20 20 20 30 2c 20 6c 6f 77 65  TEXT,    0, lowe
4340: 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20  rFunc  },.    { 
4350: 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 2d 31 2c  "coalesce",  -1,
4360: 20 53 51 4c 49 54 45 5f 41 52 47 53 2c 20 20 20   SQLITE_ARGS,   
4370: 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20 7d   0, ifnullFunc }
4380: 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65 73 63  ,.    { "coalesc
4390: 65 22 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20  e",   0, 0,     
43a0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 20 20 20           0, 0   
43b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
43c0: 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20 31 2c  "coalesce",   1,
43d0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
43e0: 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d   0, 0          }
43f0: 2c 0a 20 20 20 20 7b 20 22 69 66 6e 75 6c 6c 22  ,.    { "ifnull"
4400: 2c 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45 5f  ,     2, SQLITE_
4410: 41 52 47 53 2c 20 20 20 20 30 2c 20 69 66 6e 75  ARGS,    0, ifnu
4420: 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  llFunc },.    { 
4430: 22 72 61 6e 64 6f 6d 22 2c 20 20 20 20 2d 31 2c  "random",    -1,
4440: 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c   SQLITE_NUMERIC,
4450: 20 30 2c 20 72 61 6e 64 6f 6d 46 75 6e 63 20 7d   0, randomFunc }
4460: 2c 0a 20 20 20 20 7b 20 22 6c 69 6b 65 22 2c 20  ,.    { "like", 
4470: 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45 5f        2, SQLITE_
4480: 4e 55 4d 45 52 49 43 2c 20 30 2c 20 6c 69 6b 65  NUMERIC, 0, like
4490: 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Func   },.    { 
44a0: 22 67 6c 6f 62 22 2c 20 20 20 20 20 20 20 32 2c  "glob",       2,
44b0: 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c   SQLITE_NUMERIC,
44c0: 20 30 2c 20 67 6c 6f 62 46 75 6e 63 20 20 20 7d   0, globFunc   }
44d0: 2c 0a 20 20 20 20 7b 20 22 6e 75 6c 6c 69 66 22  ,.    { "nullif"
44e0: 2c 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45 5f  ,     2, SQLITE_
44f0: 41 52 47 53 2c 20 20 20 20 30 2c 20 6e 75 6c 6c  ARGS,    0, null
4500: 69 66 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  ifFunc },.    { 
4510: 22 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 22  "sqlite_version"
4520: 2c 30 2c 53 51 4c 49 54 45 5f 54 45 58 54 2c 20  ,0,SQLITE_TEXT, 
4530: 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 7d   0, versionFunc}
4540: 2c 0a 20 20 20 20 7b 20 22 71 75 6f 74 65 22 2c  ,.    { "quote",
4550: 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f        1, SQLITE_
4560: 41 52 47 53 2c 20 20 20 20 30 2c 20 71 75 6f 74  ARGS,    0, quot
4570: 65 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20  eFunc  },.    { 
4580: 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  "last_insert_row
4590: 69 64 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4e  id", 0, SQLITE_N
45a0: 55 4d 45 52 49 43 2c 20 31 2c 20 6c 61 73 74 5f  UMERIC, 1, last_
45b0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 7d 2c 0a  insert_rowid },.
45c0: 20 20 20 20 7b 20 22 63 68 61 6e 67 65 5f 63 6f      { "change_co
45d0: 75 6e 74 22 2c 20 20 20 20 20 20 30 2c 20 53 51  unt",      0, SQ
45e0: 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c 20 31 2c  LITE_NUMERIC, 1,
45f0: 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 20 20 20   change_count   
4600: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 73     },.    { "las
4610: 74 5f 73 74 61 74 65 6d 65 6e 74 5f 63 68 61 6e  t_statement_chan
4620: 67 65 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  ge_count",.     
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 20 20 20 20 20 30 2c 20 53 51 4c 49 54 45 5f        0, SQLITE_
4650: 4e 55 4d 45 52 49 43 2c 20 31 2c 20 6c 61 73 74  NUMERIC, 1, last
4660: 5f 73 74 61 74 65 6d 65 6e 74 5f 63 68 61 6e 67  _statement_chang
4670: 65 5f 63 6f 75 6e 74 20 7d 2c 0a 23 69 66 64 65  e_count },.#ifde
4680: 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58  f SQLITE_SOUNDEX
4690: 0a 20 20 20 20 7b 20 22 73 6f 75 6e 64 65 78 22  .    { "soundex"
46a0: 2c 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 54  ,    1, SQLITE_T
46b0: 45 58 54 2c 20 20 20 20 30 2c 20 73 6f 75 6e 64  EXT,    0, sound
46c0: 65 78 46 75 6e 63 7d 2c 0a 23 65 6e 64 69 66 0a  exFunc},.#endif.
46d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
46e0: 53 54 0a 20 20 20 20 7b 20 22 72 61 6e 64 73 74  ST.    { "randst
46f0: 72 22 2c 20 20 20 20 32 2c 20 53 51 4c 49 54 45  r",    2, SQLITE
4700: 5f 54 45 58 54 2c 20 20 20 20 30 2c 20 72 61 6e  _TEXT,    0, ran
4710: 64 53 74 72 20 20 20 20 7d 2c 0a 23 65 6e 64 69  dStr    },.#endi
4720: 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  f.  };.  static 
4730: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 68 61  struct {.    cha
4740: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 69  r *zName;.    si
4750: 67 6e 65 64 20 63 68 61 72 20 6e 41 72 67 3b 0a  gned char nArg;.
4760: 20 20 20 20 73 69 67 6e 65 64 20 63 68 61 72 20      signed char 
4770: 64 61 74 61 54 79 70 65 3b 0a 20 20 20 20 75 38  dataType;.    u8
4780: 20 61 72 67 54 79 70 65 3b 0a 20 20 20 20 76 6f   argType;.    vo
4790: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
47a0: 74 65 5f 66 75 6e 63 2a 2c 69 6e 74 2c 73 71 6c  te_func*,int,sql
47b0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20  ite3_value**);. 
47c0: 20 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c     void (*xFinal
47d0: 69 7a 65 29 28 73 71 6c 69 74 65 5f 66 75 6e 63  ize)(sqlite_func
47e0: 2a 29 3b 0a 20 20 7d 20 61 41 67 67 73 5b 5d 20  *);.  } aAggs[] 
47f0: 3d 20 7b 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c  = {.    { "min",
4800: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
4810: 20 20 20 20 20 20 20 30 2c 20 6d 69 6e 6d 61 78         0, minmax
4820: 53 74 65 70 2c 20 20 20 6d 69 6e 4d 61 78 46 69  Step,   minMaxFi
4830: 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20 20 20 7b 20  nalize },.    { 
4840: 22 6d 61 78 22 2c 20 20 20 20 31 2c 20 30 2c 20  "max",    1, 0, 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
4860: 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 6d 69  minmaxStep,   mi
4870: 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a  nMaxFinalize },.
4880: 20 20 20 20 7b 20 22 73 75 6d 22 2c 20 20 20 20      { "sum",    
4890: 31 2c 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49  1, SQLITE_NUMERI
48a0: 43 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20  C, 0, sumStep,  
48b0: 20 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a 65 20      sumFinalize 
48c0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76 67     },.    { "avg
48d0: 22 2c 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f  ",    1, SQLITE_
48e0: 4e 55 4d 45 52 49 43 2c 20 30 2c 20 73 75 6d 53  NUMERIC, 0, sumS
48f0: 74 65 70 2c 20 20 20 20 20 20 61 76 67 46 69 6e  tep,      avgFin
4900: 61 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20  alize    },.    
4910: 7b 20 22 63 6f 75 6e 74 22 2c 20 20 30 2c 20 53  { "count",  0, S
4920: 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c 20 30  QLITE_NUMERIC, 0
4930: 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20 20  , countStep,    
4940: 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20 7d  countFinalize  }
4950: 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74 22 2c  ,.    { "count",
4960: 20 20 31 2c 20 53 51 4c 49 54 45 5f 4e 55 4d 45    1, SQLITE_NUME
4970: 52 49 43 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65  RIC, 0, countSte
4980: 70 2c 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c  p,    countFinal
4990: 69 7a 65 20 20 7d 2c 0a 23 69 66 20 30 0a 20 20  ize  },.#if 0.  
49a0: 20 20 7b 20 22 73 74 64 64 65 76 22 2c 20 31 2c    { "stddev", 1,
49b0: 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 2c   SQLITE_NUMERIC,
49c0: 20 30 2c 20 73 74 64 44 65 76 53 74 65 70 2c 20   0, stdDevStep, 
49d0: 20 20 73 74 64 44 65 76 46 69 6e 61 6c 69 7a 65    stdDevFinalize
49e0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a   },.#endif.  };.
49f0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
4a00: 68 61 72 20 2a 61 7a 54 79 70 65 46 75 6e 63 73  har *azTypeFuncs
4a10: 5b 5d 20 3d 20 7b 20 22 6d 69 6e 22 2c 20 22 6d  [] = { "min", "m
4a20: 61 78 22 2c 20 22 74 79 70 65 6f 66 22 20 7d 3b  ax", "typeof" };
4a30: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72  .  int i;..  for
4a40: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
4a50: 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66 28 61 46  Funcs)/sizeof(aF
4a60: 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  uncs[0]); i++){.
4a70: 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d      void *pArg =
4a80: 20 61 46 75 6e 63 73 5b 69 5d 2e 61 72 67 54 79   aFuncs[i].argTy
4a90: 70 65 3d 3d 32 20 3f 20 28 76 6f 69 64 2a 29 28  pe==2 ? (void*)(
4aa0: 2d 31 29 20 3a 20 64 62 3b 0a 20 20 20 20 73 71  -1) : db;.    sq
4ab0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
4ac0: 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73  ction(db, aFuncs
4ad0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  [i].zName,.     
4ae0: 20 20 20 20 20 20 61 46 75 6e 63 73 5b 69 5d 2e        aFuncs[i].
4af0: 6e 41 72 67 2c 20 61 46 75 6e 63 73 5b 69 5d 2e  nArg, aFuncs[i].
4b00: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
4b10: 20 20 69 66 28 20 61 46 75 6e 63 73 5b 69 5d 2e    if( aFuncs[i].
4b20: 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  xFunc ){.      s
4b30: 71 6c 69 74 65 33 5f 66 75 6e 63 74 69 6f 6e 5f  qlite3_function_
4b40: 74 79 70 65 28 64 62 2c 20 61 46 75 6e 63 73 5b  type(db, aFuncs[
4b50: 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 73  i].zName, aFuncs
4b60: 5b 69 5d 2e 64 61 74 61 54 79 70 65 29 3b 0a 20  [i].dataType);. 
4b70: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
4b80: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 41 67  =0; i<sizeof(aAg
4b90: 67 73 29 2f 73 69 7a 65 6f 66 28 61 41 67 67 73  gs)/sizeof(aAggs
4ba0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
4bb0: 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 61 41 67  void *pArg = aAg
4bc0: 67 73 5b 69 5d 2e 61 72 67 54 79 70 65 3d 3d 32  gs[i].argType==2
4bd0: 20 3f 20 28 76 6f 69 64 2a 29 28 2d 31 29 20 3a   ? (void*)(-1) :
4be0: 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
4bf0: 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
4c00: 65 28 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a  e(db, aAggs[i].z
4c10: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
4c20: 20 61 41 67 67 73 5b 69 5d 2e 6e 41 72 67 2c 20   aAggs[i].nArg, 
4c30: 61 41 67 67 73 5b 69 5d 2e 78 53 74 65 70 2c 20  aAggs[i].xStep, 
4c40: 61 41 67 67 73 5b 69 5d 2e 78 46 69 6e 61 6c 69  aAggs[i].xFinali
4c50: 7a 65 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 73  ze, pArg);.    s
4c60: 71 6c 69 74 65 33 5f 66 75 6e 63 74 69 6f 6e 5f  qlite3_function_
4c70: 74 79 70 65 28 64 62 2c 20 61 41 67 67 73 5b 69  type(db, aAggs[i
4c80: 5d 2e 7a 4e 61 6d 65 2c 20 61 41 67 67 73 5b 69  ].zName, aAggs[i
4c90: 5d 2e 64 61 74 61 54 79 70 65 29 3b 0a 20 20 7d  ].dataType);.  }
4ca0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ..  for(i=0; i<s
4cb0: 69 7a 65 6f 66 28 61 7a 54 79 70 65 46 75 6e 63  izeof(azTypeFunc
4cc0: 73 29 2f 73 69 7a 65 6f 66 28 61 7a 54 79 70 65  s)/sizeof(azType
4cd0: 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  Funcs[0]); i++){
4ce0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  .    int n = str
4cf0: 6c 65 6e 28 61 7a 54 79 70 65 46 75 6e 63 73 5b  len(azTypeFuncs[
4d00: 69 5d 29 3b 0a 20 20 20 20 46 75 6e 63 44 65 66  i]);.    FuncDef
4d10: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73   *p = sqlite3Has
4d20: 68 46 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63  hFind(&db->aFunc
4d30: 2c 20 61 7a 54 79 70 65 46 75 6e 63 73 5b 69 5d  , azTypeFuncs[i]
4d40: 2c 20 6e 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  , n);.    while(
4d50: 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69   p ){.      p->i
4d60: 6e 63 6c 75 64 65 54 79 70 65 73 20 3d 20 31 3b  ncludeTypes = 1;
4d70: 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  .      p = p->pN
4d80: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ext;.    }.  }. 
4d90: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
4da0: 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69 6f 6e  DateTimeFunction
4db0: 73 28 64 62 29 3b 0a 7d 0a 0a 0a 0a              s(db);.}....