/ Hex Artifact Content
Login

Artifact 3b87e2e8b9aaa3a6d36b2c9616e7f404be38a667:


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 36 32 20 32 30 30 34 2f 30 35 2f 33 31 20  1.62 2004/05/31 
02a0: 31 38 3a 35 31 3a 35 38 20 64 72 68 20 45 78 70  18:51:58 drh Exp
02b0: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c   $.*/.#include <
02c0: 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  ctype.h>.#includ
02d0: 65 20 3c 6d 61 74 68 2e 68 3e 0a 23 69 6e 63 6c  e <math.h>.#incl
02e0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
02f0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
0300: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  h>.#include "sql
0310: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0320: 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 23  de "vdbeInt.h".#
0330: 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 0a  include "os.h"..
0340: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
0350: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 6f 6e 2d  tion of the non-
0360: 61 67 67 72 65 67 61 74 65 20 6d 69 6e 28 29 20  aggregate min() 
0370: 61 6e 64 20 6d 61 78 28 29 20 66 75 6e 63 74 69  and max() functi
0380: 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons.*/.static vo
0390: 69 64 20 6d 69 6e 6d 61 78 46 75 6e 63 28 0a 20  id minmaxFunc(. 
03a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
03b0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
03c0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
03d0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
03e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
03f0: 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 30 20 66 6f  mask;    /* 0 fo
0400: 72 20 6d 69 6e 28 29 20 6f 72 20 30 78 66 66 66  r min() or 0xfff
0410: 66 66 66 66 66 20 66 6f 72 20 6d 61 78 28 29 20  fffff for max() 
0420: 2a 2f 0a 20 20 69 6e 74 20 69 42 65 73 74 3b 0a  */.  int iBest;.
0430: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
0440: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 61 73 6b 20   return;.  mask 
0450: 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 5f 75  = (int)sqlite3_u
0460: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
0470: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 61 73  );.  assert( mas
0480: 6b 3d 3d 2d 31 20 7c 7c 20 6d 61 73 6b 3d 3d 30  k==-1 || mask==0
0490: 20 29 3b 0a 20 20 69 42 65 73 74 20 3d 20 30 3b   );.  iBest = 0;
04a0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
04b0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
04c0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
04d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
04e0: 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=1; i<argc; i++
04f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
0500: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
0510: 67 76 5b 69 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[i])==SQLITE_N
0520: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
0530: 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4d 65    if( (sqlite3Me
0540: 6d 43 6f 6d 70 61 72 65 28 61 72 67 76 5b 69 42  mCompare(argv[iB
0550: 65 73 74 5d 2c 20 61 72 67 76 5b 69 5d 2c 20 30  est], argv[i], 0
0560: 29 5e 6d 61 73 6b 29 3e 3d 30 20 29 7b 0a 20 20  )^mask)>=0 ){.  
0570: 20 20 20 20 69 42 65 73 74 20 3d 20 69 3b 0a 20      iBest = i;. 
0580: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
0590: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
05a0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 69 42  context, argv[iB
05b0: 65 73 74 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  est]);.}../*.** 
05c0: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
05d0: 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  of the argument.
05e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
05f0: 74 79 70 65 6f 66 46 75 6e 63 28 0a 20 20 73 71  typeofFunc(.  sq
0600: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
0610: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
0620: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
0630: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
0640: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
0650: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  0;.  switch( sql
0660: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
0670: 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20  argv[0]) ){.    
0680: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
0690: 3a 20 20 20 20 7a 20 3d 20 22 6e 75 6c 6c 22 3b  :    z = "null";
06a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
06b0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
06c0: 45 52 3a 20 7a 20 3d 20 22 69 6e 74 65 67 65 72  ER: z = "integer
06d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
06e0: 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20  se SQLITE_TEXT: 
06f0: 20 20 20 7a 20 3d 20 22 74 65 78 74 22 3b 20 20     z = "text";  
0700: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0710: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
0720: 20 20 7a 20 3d 20 22 72 65 61 6c 22 3b 20 20 20    z = "real";   
0730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0740: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 20 20   SQLITE_BLOB:   
0750: 20 7a 20 3d 20 22 62 6c 6f 62 22 3b 20 20 20 20   z = "blob";    
0760: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c  break;.  }.  sql
0770: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
0780: 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d 31 2c  (context, z, -1,
0790: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   0);.}../*.** Im
07a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
07b0: 74 68 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e  the length() fun
07c0: 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ction.*/.static 
07d0: 76 6f 69 64 20 6c 65 6e 67 74 68 46 75 6e 63 28  void lengthFunc(
07e0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
07f0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
0800: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
0810: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
0820: 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20  ){.  int len;.. 
0830: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
0840: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71   );.  switch( sq
0850: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
0860: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
0870: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
0880: 42 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  B:.    case SQLI
0890: 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TE_INTEGER:.    
08a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
08b0: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
08c0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
08d0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
08e0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
08f0: 30 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  0]));.      brea
0900: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
0910: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
0920: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
0930: 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  r *z = sqlite3_v
0940: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
0950: 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65  ]);.      for(le
0960: 6e 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 20 69  n=0; *z; z++){ i
0970: 66 28 20 28 30 78 63 30 26 2a 7a 29 21 3d 30 78  f( (0xc0&*z)!=0x
0980: 38 30 20 29 20 6c 65 6e 2b 2b 3b 20 7d 0a 20 20  80 ) len++; }.  
0990: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
09a0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
09b0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  len);.      brea
09c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
09d0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
09e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
09f0: 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  l(context);.    
0a00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0a10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
0a20: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
0a30: 65 20 61 62 73 28 29 20 66 75 6e 63 74 69 6f 6e  e abs() function
0a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0a50: 61 62 73 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  absFunc(sqlite3_
0a60: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0a70: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
0a80: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
0a90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ){.  assert( arg
0aa0: 63 3d 3d 31 20 29 3b 0a 20 20 73 77 69 74 63 68  c==1 );.  switch
0ab0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
0ac0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
0ad0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0ae0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
0af0: 20 20 69 36 34 20 69 56 61 6c 20 3d 20 73 71 6c    i64 iVal = sql
0b00: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
0b10: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
0b20: 20 69 66 28 20 69 56 61 6c 3c 30 20 29 20 69 56   if( iVal<0 ) iV
0b30: 61 6c 20 3d 20 69 56 61 6c 20 2a 20 2d 31 3b 0a  al = iVal * -1;.
0b40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0b50: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
0b60: 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20  xt, iVal);.     
0b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0b80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
0b90: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
0ba0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
0bb0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
0bc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0bd0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
0be0: 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 20 3d 20    double rVal = 
0bf0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
0c00: 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  uble(argv[0]);. 
0c10: 20 20 20 20 20 69 66 28 20 72 56 61 6c 3c 30 20       if( rVal<0 
0c20: 29 20 72 56 61 6c 20 3d 20 72 56 61 6c 20 2a 20  ) rVal = rVal * 
0c30: 2d 31 2e 30 3b 0a 20 20 20 20 20 20 73 71 6c 69  -1.0;.      sqli
0c40: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
0c50: 65 28 63 6f 6e 74 65 78 74 2c 20 72 56 61 6c 29  e(context, rVal)
0c60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0c70: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0c80: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
0c90: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 28 29   of the substr()
0ca0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61   function.*/.sta
0cb0: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 72 46  tic void substrF
0cc0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
0cd0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
0ce0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
0cf0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
0d00: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
0d10: 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20  har *z;.  const 
0d20: 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20  char *z2;.  int 
0d30: 69 3b 0a 20 20 69 6e 74 20 70 31 2c 20 70 32 2c  i;.  int p1, p2,
0d40: 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28   len;..  assert(
0d50: 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 7a 20   argc==3 );.  z 
0d60: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
0d70: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
0d80: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
0d90: 72 6e 3b 0a 20 20 70 31 20 3d 20 73 71 6c 69 74  rn;.  p1 = sqlit
0da0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
0db0: 76 5b 31 5d 29 3b 0a 20 20 70 32 20 3d 20 73 71  v[1]);.  p2 = sq
0dc0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
0dd0: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28  argv[2]);.  for(
0de0: 6c 65 6e 3d 30 2c 20 7a 32 3d 7a 3b 20 2a 7a 32  len=0, z2=z; *z2
0df0: 3b 20 7a 32 2b 2b 29 7b 20 69 66 28 20 28 30 78  ; z2++){ if( (0x
0e00: 63 30 26 2a 7a 32 29 21 3d 30 78 38 30 20 29 20  c0&*z2)!=0x80 ) 
0e10: 6c 65 6e 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 70  len++; }.  if( p
0e20: 31 3c 30 20 29 7b 0a 20 20 20 20 70 31 20 2b 3d  1<0 ){.    p1 +=
0e30: 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28 20 70 31   len;.    if( p1
0e40: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20 2b  <0 ){.      p2 +
0e50: 3d 20 70 31 3b 0a 20 20 20 20 20 20 70 31 20 3d  = p1;.      p1 =
0e60: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
0e70: 65 20 69 66 28 20 70 31 3e 30 20 29 7b 0a 20 20  e if( p1>0 ){.  
0e80: 20 20 70 31 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66    p1--;.  }.  if
0e90: 28 20 70 31 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20  ( p1+p2>len ){. 
0ea0: 20 20 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a     p2 = len-p1;.
0eb0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
0ec0: 3c 70 31 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b  <p1 && z[i]; i++
0ed0: 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 5b 69 5d  ){.    if( (z[i]
0ee0: 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 70  &0xc0)==0x80 ) p
0ef0: 31 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  1++;.  }.  while
0f00: 28 20 7a 5b 69 5d 20 26 26 20 28 7a 5b 69 5d 26  ( z[i] && (z[i]&
0f10: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 20 69  0xc0)==0x80 ){ i
0f20: 2b 2b 3b 20 70 31 2b 2b 3b 20 7d 0a 20 20 66 6f  ++; p1++; }.  fo
0f30: 72 28 3b 20 69 3c 70 31 2b 70 32 20 26 26 20 7a  r(; i<p1+p2 && z
0f40: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
0f50: 66 28 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d 3d  f( (z[i]&0xc0)==
0f60: 30 78 38 30 20 29 20 70 32 2b 2b 3b 0a 20 20 7d  0x80 ) p2++;.  }
0f70: 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20 26  .  while( z[i] &
0f80: 26 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d 3d 30  & (z[i]&0xc0)==0
0f90: 78 38 30 20 29 7b 20 69 2b 2b 3b 20 70 32 2b 2b  x80 ){ i++; p2++
0fa0: 3b 20 7d 0a 20 20 69 66 28 20 70 32 3c 30 20 29  ; }.  if( p2<0 )
0fb0: 20 70 32 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74   p2 = 0;.  sqlit
0fc0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
0fd0: 6f 6e 74 65 78 74 2c 20 26 7a 5b 70 31 5d 2c 20  ontext, &z[p1], 
0fe0: 70 32 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p2, 1);.}../*.**
0ff0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1000: 6f 66 20 74 68 65 20 72 6f 75 6e 64 28 29 20 66  of the round() f
1010: 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  unction.*/.stati
1020: 63 20 76 6f 69 64 20 72 6f 75 6e 64 46 75 6e 63  c void roundFunc
1030: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
1040: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
1050: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
1060: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e  ue **argv){.  in
1070: 74 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c  t n = 0;.  doubl
1080: 65 20 72 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  e r;.  char zBuf
1090: 5b 31 30 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  [100];.  assert(
10a0: 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63   argc==1 || argc
10b0: 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 61 72 67  ==2 );.  if( arg
10c0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  c==2 ){.    if( 
10d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c  SQLITE_NULL==sql
10e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
10f0: 61 72 67 76 5b 31 5d 29 20 29 20 72 65 74 75 72  argv[1]) ) retur
1100: 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  n;.    n = sqlit
1110: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
1120: 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  v[1]);.    if( n
1130: 3e 33 30 20 29 20 6e 20 3d 20 33 30 3b 0a 20 20  >30 ) n = 30;.  
1140: 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20    if( n<0 ) n = 
1150: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  0;.  }.  if( SQL
1160: 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65  ITE_NULL==sqlite
1170: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
1180: 76 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a  v[0]) ) return;.
1190: 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    r = sqlite3_va
11a0: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
11b0: 30 5d 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  0]);.  sprintf(z
11c0: 42 75 66 2c 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b  Buf,"%.*f",n,r);
11d0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
11e0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
11f0: 7a 42 75 66 2c 20 2d 31 2c 20 31 29 3b 0a 7d 0a  zBuf, -1, 1);.}.
1200: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1210: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 70 70  ation of the upp
1220: 65 72 28 29 20 61 6e 64 20 6c 6f 77 65 72 28 29  er() and lower()
1230: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e 0a   SQL functions..
1240: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1250: 70 70 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33  pperFunc(sqlite3
1260: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1270: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
1280: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
1290: 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  v){.  char *z;. 
12a0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72   int i;.  if( ar
12b0: 67 63 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 4e  gc<1 || SQLITE_N
12c0: 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL==sqlite3_val
12d0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
12e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
12f0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 71   sqliteMalloc(sq
1300: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1310: 73 28 61 72 67 76 5b 30 5d 29 2b 31 29 3b 0a 20  s(argv[0])+1);. 
1320: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
1330: 72 6e 3b 0a 20 20 73 74 72 63 70 79 28 7a 2c 20  rn;.  strcpy(z, 
1340: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1350: 78 74 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20  xt(argv[0]));.  
1360: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
1370: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  ++){.    if( isl
1380: 6f 77 65 72 28 7a 5b 69 5d 29 20 29 20 7a 5b 69  ower(z[i]) ) z[i
1390: 5d 20 3d 20 74 6f 75 70 70 65 72 28 7a 5b 69 5d  ] = toupper(z[i]
13a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13b0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
13c0: 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 31 29 3b  text, z, -1, 1);
13d0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29  .  sqliteFree(z)
13e0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13f0: 6c 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65  lowerFunc(sqlite
1400: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1410: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
1420: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1430: 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  gv){.  char *z;.
1440: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
1450: 72 67 63 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f  rgc<1 || SQLITE_
1460: 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61  NULL==sqlite3_va
1470: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
1480: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  ) ) return;.  z 
1490: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
14a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
14b0: 65 73 28 61 72 67 76 5b 30 5d 29 2b 31 29 3b 0a  es(argv[0])+1);.
14c0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
14d0: 75 72 6e 3b 0a 20 20 73 74 72 63 70 79 28 7a 2c  urn;.  strcpy(z,
14e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
14f0: 65 78 74 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20  ext(argv[0]));. 
1500: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
1510: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73  i++){.    if( is
1520: 75 70 70 65 72 28 7a 5b 69 5d 29 20 29 20 7a 5b  upper(z[i]) ) z[
1530: 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 5b 69  i] = tolower(z[i
1540: 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
1550: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
1560: 6e 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 31 29  ntext, z, -1, 1)
1570: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
1580: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
1590: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
15a0: 65 20 49 46 4e 55 4c 4c 28 29 2c 20 4e 56 4c 28  e IFNULL(), NVL(
15b0: 29 2c 20 61 6e 64 20 43 4f 41 4c 45 53 43 45 28  ), and COALESCE(
15c0: 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 0a 2a  ) functions.  .*
15d0: 2a 20 41 6c 6c 20 74 68 72 65 65 20 64 6f 20 74  * All three do t
15e0: 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 20 20  he same thing.  
15f0: 54 68 65 79 20 72 65 74 75 72 6e 20 74 68 65 20  They return the 
1600: 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  first non-NULL.*
1610: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * argument..*/.s
1620: 74 61 74 69 63 20 76 6f 69 64 20 69 66 6e 75 6c  tatic void ifnul
1630: 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  lFunc(.  sqlite3
1640: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1650: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
1660: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1670: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
1680: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  ;.  for(i=0; i<a
1690: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rgc; i++){.    i
16a0: 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d  f( SQLITE_NULL!=
16b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
16c0: 70 65 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20  pe(argv[i]) ){. 
16d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
16e0: 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78  ult_value(contex
16f0: 74 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  t, argv[i]);.   
1700: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1710: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70    }.}../*.** Imp
1720: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72  lementation of r
1730: 61 6e 64 6f 6d 28 29 2e 20 20 52 65 74 75 72 6e  andom().  Return
1740: 20 61 20 72 61 6e 64 6f 6d 20 69 6e 74 65 67 65   a random intege
1750: 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  r.  .*/.static v
1760: 6f 69 64 20 72 61 6e 64 6f 6d 46 75 6e 63 28 0a  oid randomFunc(.
1770: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1780: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
1790: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
17a0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
17b0: 7b 0a 20 20 69 6e 74 20 72 3b 0a 20 20 73 71 6c  {.  int r;.  sql
17c0: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73  ite3Randomness(s
17d0: 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20  izeof(r), &r);. 
17e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
17f0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  int(context, r);
1800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1810: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1820: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
1830: 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  d() SQL function
1840: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a  .  The return.**
1850: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
1860: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
1870: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
1880: 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69  wid() API functi
1890: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
18a0: 69 64 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  id last_insert_r
18b0: 6f 77 69 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  owid(.  sqlite3_
18c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
18d0: 2c 20 0a 20 20 69 6e 74 20 61 72 67 2c 20 0a 20  , .  int arg, . 
18e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
18f0: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
1900: 65 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  e *db = sqlite3_
1910: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
1920: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  t);.  sqlite3_re
1930: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
1940: 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  xt, sqlite3_last
1950: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62  _insert_rowid(db
1960: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ));.}../*.** Imp
1970: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1980: 68 65 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 28  he change_count(
1990: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
19a0: 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
19b0: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
19c0: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
19d0: 63 68 61 6e 67 65 73 28 29 20 41 50 49 20 66 75  changes() API fu
19e0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
19f0: 63 20 76 6f 69 64 20 63 68 61 6e 67 65 5f 63 6f  c void change_co
1a00: 75 6e 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unt(.  sqlite3_c
1a10: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1a20: 0a 20 20 69 6e 74 20 61 72 67 2c 0a 20 20 73 71  .  int arg,.  sq
1a30: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1a40: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  gv.){.  sqlite *
1a50: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  db = sqlite3_use
1a60: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
1a70: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
1a80: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
1a90: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
1aa0: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  b));.}../*.** Im
1ab0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1ac0: 74 68 65 20 6c 61 73 74 5f 73 74 61 74 65 6d 65  the last_stateme
1ad0: 6e 74 5f 63 68 61 6e 67 65 5f 63 6f 75 6e 74 28  nt_change_count(
1ae0: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
1af0: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
1b00: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
1b10: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
1b20: 6c 61 73 74 5f 73 74 61 74 65 6d 65 6e 74 5f 63  last_statement_c
1b30: 68 61 6e 67 65 73 28 29 20 41 50 49 0a 2a 2a 20  hanges() API.** 
1b40: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
1b50: 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 73 74  tic void last_st
1b60: 61 74 65 6d 65 6e 74 5f 63 68 61 6e 67 65 5f 63  atement_change_c
1b70: 6f 75 6e 74 28 0a 20 20 73 71 6c 69 74 65 33 5f  ount(.  sqlite3_
1b80: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1b90: 2c 20 0a 20 20 69 6e 74 20 61 72 67 2c 0a 20 20  , .  int arg,.  
1ba0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1bb0: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1bc0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 75   *db = sqlite3_u
1bd0: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
1be0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
1bf0: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
1c00: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 73 74   sqlite3_last_st
1c10: 61 74 65 6d 65 6e 74 5f 63 68 61 6e 67 65 73 28  atement_changes(
1c20: 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  db));.}../*.** I
1c30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1c40: 20 74 68 65 20 6c 69 6b 65 28 29 20 53 51 4c 20   the like() SQL 
1c50: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
1c60: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
1c70: 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  nts.** the build
1c80: 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  -in LIKE operato
1c90: 72 2e 20 20 54 68 65 20 66 69 72 73 74 20 61 72  r.  The first ar
1ca0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
1cb0: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a  nction is the.**
1cc0: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1cd0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1ce0: 69 73 20 74 68 65 20 70 61 74 74 65 72 6e 2e 20  is the pattern. 
1cf0: 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73 74 61   So, the SQL sta
1d00: 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  tements:.**.**  
1d10: 20 20 20 20 20 41 20 4c 49 4b 45 20 42 0a 2a 2a       A LIKE B.**
1d20: 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  .** is implement
1d30: 65 64 20 61 73 20 6c 69 6b 65 28 41 2c 42 29 2e  ed as like(A,B).
1d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d50: 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  likeFunc(.  sqli
1d60: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1d70: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67  text, .  int arg
1d80: 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  c, .  sqlite3_va
1d90: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
1da0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1db0: 68 61 72 20 2a 7a 41 20 3d 20 73 71 6c 69 74 65  har *zA = sqlite
1dc0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1dd0: 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 75  v[0]);.  const u
1de0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42  nsigned char *zB
1df0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1e00: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
1e10: 20 20 69 66 28 20 7a 41 20 26 26 20 7a 42 20 29    if( zA && zB )
1e20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1e30: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
1e40: 2c 20 73 71 6c 69 74 65 33 4c 69 6b 65 43 6f 6d  , sqlite3LikeCom
1e50: 70 61 72 65 28 7a 41 2c 20 7a 42 29 29 3b 0a 20  pare(zA, zB));. 
1e60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
1e70: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1e80: 65 20 67 6c 6f 62 28 29 20 53 51 4c 20 66 75 6e  e glob() SQL fun
1e90: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
1ea0: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73  ction implements
1eb0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2d 69 6e  .** the build-in
1ec0: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 2e 20   GLOB operator. 
1ed0: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1ee0: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
1ef0: 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a 20 73 74  ion is the.** st
1f00: 72 69 6e 67 20 61 6e 64 20 74 68 65 20 73 65 63  ring and the sec
1f10: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1f20: 74 68 65 20 70 61 74 74 65 72 6e 2e 20 20 53 6f  the pattern.  So
1f30: 2c 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  , the SQL statem
1f40: 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ents:.**.**     
1f50: 20 20 41 20 47 4c 4f 42 20 42 0a 2a 2a 0a 2a 2a    A GLOB B.**.**
1f60: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1f70: 61 73 20 67 6c 6f 62 28 41 2c 42 29 2e 0a 2a 2f  as glob(A,B)..*/
1f80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 6c 6f  .static void glo
1f90: 62 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  bFunc(sqlite3_co
1fa0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
1fb0: 69 6e 74 20 61 72 67 2c 20 73 71 6c 69 74 65 33  int arg, sqlite3
1fc0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
1fd0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1fe0: 20 63 68 61 72 20 2a 7a 41 20 3d 20 73 71 6c 69   char *zA = sqli
1ff0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
2000: 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74  rgv[0]);.  const
2010: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2020: 7a 42 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  zB = sqlite3_val
2030: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
2040: 3b 0a 20 20 69 66 28 20 7a 41 20 26 26 20 7a 42  ;.  if( zA && zB
2050: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2060: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
2070: 78 74 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 43  xt, sqlite3GlobC
2080: 6f 6d 70 61 72 65 28 7a 41 2c 20 7a 42 29 29 3b  ompare(zA, zB));
2090: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
20a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20b0: 74 68 65 20 4e 55 4c 4c 49 46 28 78 2c 79 29 20  the NULLIF(x,y) 
20c0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72  function.  The r
20d0: 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72  esult is the fir
20e0: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  st.** argument i
20f0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  f the arguments 
2100: 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 20  are different.  
2110: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  The result is NU
2120: 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20 61 72 67  LL if the.** arg
2130: 75 6d 65 6e 74 73 20 61 72 65 20 65 71 75 61 6c  uments are equal
2140: 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 2e 0a   to each other..
2150: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
2160: 75 6c 6c 69 66 46 75 6e 63 28 0a 20 20 73 71 6c  ullifFunc(.  sql
2170: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
2180: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
2190: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
21a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
21b0: 66 28 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  f( sqlite3MemCom
21c0: 70 61 72 65 28 61 72 67 76 5b 30 5d 2c 20 61 72  pare(argv[0], ar
21d0: 67 76 5b 31 5d 2c 20 30 29 21 3d 30 20 29 7b 0a  gv[1], 0)!=0 ){.
21e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
21f0: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
2200: 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a  , argv[0]);.  }.
2210: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2220: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 56  ntation of the V
2230: 45 52 53 49 4f 4e 28 2a 29 20 66 75 6e 63 74 69  ERSION(*) functi
2240: 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  on.  The result 
2250: 69 73 20 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a  is the version.*
2260: 2a 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  * of the SQLite 
2270: 6c 69 62 72 61 72 79 20 74 68 61 74 20 69 73 20  library that is 
2280: 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  running..*/.stat
2290: 69 63 20 76 6f 69 64 20 76 65 72 73 69 6f 6e 46  ic void versionF
22a0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
22b0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
22c0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
22d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
22e0: 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
22f0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
2300: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 65  text, sqlite3_ve
2310: 72 73 69 6f 6e 2c 20 2d 31 2c 20 30 29 3b 0a 7d  rsion, -1, 0);.}
2320: 0a 0a 2f 2a 0a 2a 2a 20 45 58 50 45 52 49 4d 45  ../*.** EXPERIME
2330: 4e 54 41 4c 20 2d 20 54 68 69 73 20 69 73 20 6e  NTAL - This is n
2340: 6f 74 20 61 6e 20 6f 66 66 69 63 69 61 6c 20 66  ot an official f
2350: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 69 6e  unction.  The in
2360: 74 65 72 66 61 63 65 20 6d 61 79 0a 2a 2a 20 63  terface may.** c
2370: 68 61 6e 67 65 2e 20 20 54 68 69 73 20 66 75 6e  hange.  This fun
2380: 63 74 69 6f 6e 20 6d 61 79 20 64 69 73 61 70 70  ction may disapp
2390: 65 61 72 2e 20 20 44 6f 20 6e 6f 74 20 77 72 69  ear.  Do not wri
23a0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 64 65 70  te code that dep
23b0: 65 6e 64 73 0a 2a 2a 20 6f 6e 20 74 68 69 73 20  ends.** on this 
23c0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
23d0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
23e0: 66 20 74 68 65 20 51 55 4f 54 45 28 29 20 66 75  f the QUOTE() fu
23f0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75  nction.  This fu
2400: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73  nction takes a s
2410: 69 6e 67 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  ingle.** argumen
2420: 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d  t.  If the argum
2430: 65 6e 74 20 69 73 20 6e 75 6d 65 72 69 63 2c 20  ent is numeric, 
2440: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
2450: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 0a   is the same as.
2460: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  ** the argument.
2470: 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e    If the argumen
2480: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
2490: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
24a0: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 4e 55  he string.** "NU
24b0: 4c 4c 22 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  LL".  Otherwise,
24c0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
24d0: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 73 69 6e   enclosed in sin
24e0: 67 6c 65 20 71 75 6f 74 65 73 20 77 69 74 68 0a  gle quotes with.
24f0: 2a 2a 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 20  ** single-quote 
2500: 65 73 63 61 70 65 73 2e 0a 2a 2f 0a 73 74 61 74  escapes..*/.stat
2510: 69 63 20 76 6f 69 64 20 71 75 6f 74 65 46 75 6e  ic void quoteFun
2520: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
2530: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
2540: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
2550: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69  lue **argv){.  i
2560: 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75  f( argc<1 ) retu
2570: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  rn;.  switch( sq
2580: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2590: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
25a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
25b0: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
25c0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
25d0: 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 22 2c 20  ontext, "NULL", 
25e0: 34 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  4, 0);.      bre
25f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2600: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
2610: 52 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  R:.    case SQLI
2620: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
2630: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2640: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
2650: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
2660: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2670: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
2680: 42 3a 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 2e  B:  /*** FIX ME.
2690: 20 20 55 73 65 20 61 20 42 4c 4f 42 20 65 6e 63    Use a BLOB enc
26a0: 6f 64 69 6e 67 20 2a 2a 2a 2f 0a 20 20 20 20 63  oding ***/.    c
26b0: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
26c0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 6a   {.      int i,j
26d0: 2c 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ,n;.      const 
26e0: 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73 71 6c  char *zArg = sql
26f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
2700: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
2710: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20 20 20  char *z;..      
2720: 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a 41 72 67 5b  for(i=n=0; zArg[
2730: 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a 41  i]; i++){ if( zA
2740: 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b  rg[i]=='\'' ) n+
2750: 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73  +; }.      z = s
2760: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 69 2b 6e  qliteMalloc( i+n
2770: 2b 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +3 );.      if( 
2780: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
2790: 20 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27       z[0] = '\''
27a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
27b0: 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20 69   j=1; zArg[i]; i
27c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  ++){.        z[j
27d0: 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d 3b 0a 20  ++] = zArg[i];. 
27e0: 20 20 20 20 20 20 20 69 66 28 20 7a 41 72 67 5b         if( zArg[
27f0: 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  i]=='\'' ){.    
2800: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
2810: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  \'';.        }. 
2820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 5b 6a       }.      z[j
2830: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
2840: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
2850: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2860: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
2870: 2c 20 6a 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  , j, 1);.      s
2880: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
2890: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65    }.  }.}..#ifde
28a0: 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58  f SQLITE_SOUNDEX
28b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
28c0: 68 65 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64  he soundex encod
28d0: 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a  ing of a word..*
28e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f  /.static void so
28f0: 75 6e 64 65 78 46 75 6e 63 28 73 71 6c 69 74 65  undexFunc(sqlite
2900: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
2910: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
2920: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
2930: 67 76 29 7b 0a 20 20 63 68 61 72 20 7a 52 65 73  gv){.  char zRes
2940: 75 6c 74 5b 38 5d 3b 0a 20 20 63 6f 6e 73 74 20  ult[8];.  const 
2950: 63 68 61 72 20 2a 7a 49 6e 3b 0a 20 20 69 6e 74  char *zIn;.  int
2960: 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74 69 63 20   i, j;.  static 
2970: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
2980: 68 61 72 20 69 43 6f 64 65 5b 5d 20 3d 20 7b 0a  har iCode[] = {.
2990: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
29a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
29b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
29c0: 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,.    0, 0, 0,
29d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
29e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
29f0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30  , 0, 0,.    0, 0
2a00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
2a10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
2a20: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
2a30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2a40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
2a50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
2a60: 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20      0, 0, 1, 2, 
2a70: 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30  3, 0, 1, 2, 0, 0
2a80: 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c  , 2, 2, 4, 5, 5,
2a90: 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c   0,.    1, 2, 6,
2aa0: 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20   2, 3, 0, 1, 0, 
2ab0: 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30  2, 0, 2, 0, 0, 0
2ac0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30  , 0, 0,.    0, 0
2ad0: 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c  , 1, 2, 3, 0, 1,
2ae0: 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20   2, 0, 0, 2, 2, 
2af0: 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20  4, 5, 5, 0,.    
2b00: 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30  1, 2, 6, 2, 3, 0
2b10: 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c  , 1, 0, 2, 0, 2,
2b20: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
2b30: 20 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 61    };.  assert( a
2b40: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a 49 6e 20  rgc==1 );.  zIn 
2b50: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2b60: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
2b70: 20 66 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d   for(i=0; zIn[i]
2b80: 20 26 26 20 21 69 73 61 6c 70 68 61 28 7a 49 6e   && !isalpha(zIn
2b90: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  [i]); i++){}.  i
2ba0: 66 28 20 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20  f( zIn[i] ){.   
2bb0: 20 7a 52 65 73 75 6c 74 5b 30 5d 20 3d 20 74 6f   zResult[0] = to
2bc0: 75 70 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20  upper(zIn[i]);. 
2bd0: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20     for(j=1; j<4 
2be0: 26 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b  && zIn[i]; i++){
2bf0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20  .      int code 
2c00: 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30  = iCode[zIn[i]&0
2c10: 78 37 66 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f];.      if( 
2c20: 63 6f 64 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  code>0 ){.      
2c30: 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d    zResult[j++] =
2c40: 20 63 6f 64 65 20 2b 20 27 30 27 3b 0a 20 20 20   code + '0';.   
2c50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
2c60: 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a 20 20 20  hile( j<4 ){.   
2c70: 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20     zResult[j++] 
2c80: 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '0';.    }.   
2c90: 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d 20 30 3b   zResult[j] = 0;
2ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2cb0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
2cc0: 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c 20 31 29  , zResult, 4, 1)
2cd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2ce0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
2cf0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 3f 30 30  xt(context, "?00
2d00: 30 22 2c 20 34 2c 20 30 29 3b 0a 20 20 7d 0a 7d  0", 4, 0);.  }.}
2d10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
2d20: 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
2d30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2d40: 67 65 6e 65 72 61 74 65 73 20 61 20 73 74 72 69  generates a stri
2d50: 6e 67 20 6f 66 20 72 61 6e 64 6f 6d 20 63 68 61  ng of random cha
2d60: 72 61 63 74 65 72 73 2e 20 20 55 73 65 64 20 66  racters.  Used f
2d70: 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67  or.** generating
2d80: 20 74 65 73 74 20 64 61 74 61 2e 0a 2a 2f 0a 73   test data..*/.s
2d90: 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 53  tatic void randS
2da0: 74 72 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  tr(sqlite3_conte
2db0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
2dc0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
2dd0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
2de0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
2df0: 69 67 6e 65 64 20 63 68 61 72 20 7a 53 72 63 5b  igned char zSrc[
2e00: 5d 20 3d 20 0a 20 20 20 20 20 22 61 62 63 64 65  ] = .     "abcde
2e10: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
2e20: 76 77 78 79 7a 22 0a 20 20 20 20 20 22 41 42 43  vwxyz".     "ABC
2e30: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
2e40: 54 55 56 57 58 59 5a 22 0a 20 20 20 20 20 22 30  TUVWXYZ".     "0
2e50: 31 32 33 34 35 36 37 38 39 22 0a 20 20 20 20 20  123456789".     
2e60: 22 2e 2d 21 2c 3a 2a 5e 2b 3d 5f 7c 3f 2f 3c 3e  ".-!,:*^+=_|?/<>
2e70: 20 22 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 2c 20   ";.  int iMin, 
2e80: 69 4d 61 78 2c 20 6e 2c 20 72 2c 20 69 3b 0a 20  iMax, n, r, i;. 
2e90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
2ea0: 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28  Buf[1000];.  if(
2eb0: 20 61 72 67 63 3e 3d 31 20 29 7b 0a 20 20 20 20   argc>=1 ){.    
2ec0: 69 4d 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  iMin = sqlite3_v
2ed0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d  alue_int(argv[0]
2ee0: 29 3b 0a 20 20 20 20 69 66 28 20 69 4d 69 6e 3c  );.    if( iMin<
2ef0: 30 20 29 20 69 4d 69 6e 20 3d 20 30 3b 0a 20 20  0 ) iMin = 0;.  
2f00: 20 20 69 66 28 20 69 4d 69 6e 3e 3d 73 69 7a 65    if( iMin>=size
2f10: 6f 66 28 7a 42 75 66 29 20 29 20 69 4d 69 6e 20  of(zBuf) ) iMin 
2f20: 3d 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31  = sizeof(zBuf)-1
2f30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2f40: 4d 69 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  Min = 1;.  }.  i
2f50: 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20  f( argc>=2 ){.  
2f60: 20 20 69 4d 61 78 20 3d 20 73 71 6c 69 74 65 33    iMax = sqlite3
2f70: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
2f80: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4d 61  1]);.    if( iMa
2f90: 78 3c 69 4d 69 6e 20 29 20 69 4d 61 78 20 3d 20  x<iMin ) iMax = 
2fa0: 69 4d 69 6e 3b 0a 20 20 20 20 69 66 28 20 69 4d  iMin;.    if( iM
2fb0: 61 78 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29  ax>=sizeof(zBuf)
2fc0: 20 29 20 69 4d 61 78 20 3d 20 73 69 7a 65 6f 66   ) iMax = sizeof
2fd0: 28 7a 42 75 66 29 2d 31 3b 0a 20 20 7d 65 6c 73  (zBuf)-1;.  }els
2fe0: 65 7b 0a 20 20 20 20 69 4d 61 78 20 3d 20 35 30  e{.    iMax = 50
2ff0: 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 69 4d 69 6e  ;.  }.  n = iMin
3000: 3b 0a 20 20 69 66 28 20 69 4d 61 78 3e 69 4d 69  ;.  if( iMax>iMi
3010: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
3020: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
3030: 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 72  f(r), &r);.    r
3040: 20 26 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a   &= 0x7fffffff;.
3050: 20 20 20 20 6e 20 2b 3d 20 72 25 28 69 4d 61 78      n += r%(iMax
3060: 20 2b 20 31 20 2d 20 69 4d 69 6e 29 3b 0a 20 20   + 1 - iMin);.  
3070: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 73 69  }.  assert( n<si
3080: 7a 65 6f 66 28 7a 42 75 66 29 20 29 3b 0a 20 20  zeof(zBuf) );.  
3090: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
30a0: 73 28 6e 2c 20 7a 42 75 66 29 3b 0a 20 20 66 6f  s(n, zBuf);.  fo
30b0: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
30c0: 7b 0a 20 20 20 20 7a 42 75 66 5b 69 5d 20 3d 20  {.    zBuf[i] = 
30d0: 7a 53 72 63 5b 7a 42 75 66 5b 69 5d 25 28 73 69  zSrc[zBuf[i]%(si
30e0: 7a 65 6f 66 28 7a 53 72 63 29 2d 31 29 5d 3b 0a  zeof(zSrc)-1)];.
30f0: 20 20 7d 0a 20 20 7a 42 75 66 5b 6e 5d 20 3d 20    }.  zBuf[n] = 
3100: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  0;.  sqlite3_res
3110: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
3120: 2c 20 7a 42 75 66 2c 20 6e 2c 20 31 29 3b 0a 7d  , zBuf, n, 1);.}
3130: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
3140: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3150: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3160: 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20  cture holds the 
3170: 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20  context of a.** 
3180: 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61  sum() or avg() a
3190: 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61  ggregate computa
31a0: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
31b0: 20 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53   struct SumCtx S
31c0: 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75  umCtx;.struct Su
31d0: 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20  mCtx {.  double 
31e0: 73 75 6d 3b 20 20 20 20 20 2f 2a 20 53 75 6d 20  sum;     /* Sum 
31f0: 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  of terms */.  in
3200: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  t cnt;        /*
3210: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
3220: 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f 0a 7d 3b  nts summed */.};
3230: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
3240: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
3250: 20 74 68 65 20 73 75 6d 20 6f 72 20 61 76 65 72   the sum or aver
3260: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
3270: 6f 69 64 20 73 75 6d 53 74 65 70 28 73 71 6c 69  oid sumStep(sqli
3280: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3290: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
32a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
32b0: 61 72 67 76 29 7b 0a 20 20 53 75 6d 43 74 78 20  argv){.  SumCtx 
32c0: 2a 70 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31  *p;.  if( argc<1
32d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d   ) return;.  p =
32e0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
32f0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
3300: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
3310: 0a 20 20 69 66 28 20 70 20 26 26 20 53 51 4c 49  .  if( p && SQLI
3320: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
3330: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
3340: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 70 2d 3e 73  [0]) ){.    p->s
3350: 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61  um += sqlite3_va
3360: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
3370: 30 5d 29 3b 0a 20 20 20 20 70 2d 3e 63 6e 74 2b  0]);.    p->cnt+
3380: 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  +;.  }.}.static 
3390: 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65  void sumFinalize
33a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
33b0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
33c0: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
33d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
33e0: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
33f0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
3400: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3410: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
3420: 70 20 3f 20 70 2d 3e 73 75 6d 20 3a 20 30 2e 30  p ? p->sum : 0.0
3430: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
3440: 20 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c   avgFinalize(sql
3450: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3460: 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78  ntext){.  SumCtx
3470: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
3480: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3490: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
34a0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
34b0: 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29   p && p->cnt>0 )
34c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
34d0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
34e0: 65 78 74 2c 20 70 2d 3e 73 75 6d 2f 28 64 6f 75  ext, p->sum/(dou
34f0: 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d  ble)p->cnt);.  }
3500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
3510: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
3520: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3530: 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74 65   holds the conte
3540: 78 74 20 6f 66 20 61 0a 2a 2a 20 76 61 72 69 61  xt of a.** varia
3550: 6e 63 65 20 6f 72 20 73 74 61 6e 64 61 72 64 20  nce or standard 
3560: 64 65 76 69 61 74 69 6f 6e 20 63 6f 6d 70 75 74  deviation comput
3570: 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ation..*/.typede
3580: 66 20 73 74 72 75 63 74 20 53 74 64 44 65 76 43  f struct StdDevC
3590: 74 78 20 53 74 64 44 65 76 43 74 78 3b 0a 73 74  tx StdDevCtx;.st
35a0: 72 75 63 74 20 53 74 64 44 65 76 43 74 78 20 7b  ruct StdDevCtx {
35b0: 0a 20 20 64 6f 75 62 6c 65 20 73 75 6d 3b 20 20  .  double sum;  
35c0: 20 20 20 2f 2a 20 53 75 6d 20 6f 66 20 74 65 72     /* Sum of ter
35d0: 6d 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 73  ms */.  double s
35e0: 75 6d 32 3b 20 20 20 20 2f 2a 20 53 75 6d 20 6f  um2;    /* Sum o
35f0: 66 20 74 68 65 20 73 71 75 61 72 65 73 20 6f 66  f the squares of
3600: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
3610: 63 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  cnt;        /* N
3620: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 63  umber of terms c
3630: 6f 75 6e 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 23 69  ounted */.};..#i
3640: 66 20 30 20 20 20 2f 2a 20 4f 6d 69 74 20 62 65  f 0   /* Omit be
3650: 63 61 75 73 65 20 6d 61 74 68 20 6c 69 62 72 61  cause math libra
3660: 72 79 20 69 73 20 72 65 71 75 69 72 65 64 20 2a  ry is required *
3670: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
3680: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
3690: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 64 65   the standard de
36a0: 76 69 61 74 69 6f 6e 20 61 73 20 61 6e 20 61 67  viation as an ag
36b0: 67 72 65 67 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  gregate..*/.stat
36c0: 69 63 20 76 6f 69 64 20 73 74 64 44 65 76 53 74  ic void stdDevSt
36d0: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
36e0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
36f0: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
3700: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 74 64  r **argv){.  Std
3710: 44 65 76 43 74 78 20 2a 70 3b 0a 20 20 64 6f 75  DevCtx *p;.  dou
3720: 62 6c 65 20 78 3b 0a 20 20 69 66 28 20 61 72 67  ble x;.  if( arg
3730: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
3740: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
3750: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
3760: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
3770: 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61  ));.  if( p && a
3780: 72 67 76 5b 30 5d 20 29 7b 0a 20 20 20 20 78 20  rgv[0] ){.    x 
3790: 3d 20 73 71 6c 69 74 65 33 41 74 6f 46 28 61 72  = sqlite3AtoF(ar
37a0: 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 70  gv[0], 0);.    p
37b0: 2d 3e 73 75 6d 20 2b 3d 20 78 3b 0a 20 20 20 20  ->sum += x;.    
37c0: 70 2d 3e 73 75 6d 32 20 2b 3d 20 78 2a 78 3b 0a  p->sum2 += x*x;.
37d0: 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20      p->cnt++;.  
37e0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
37f0: 73 74 64 44 65 76 46 69 6e 61 6c 69 7a 65 28 73  stdDevFinalize(s
3800: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3810: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 64 6f 75 62  context){.  doub
3820: 6c 65 20 72 4e 20 3d 20 73 71 6c 69 74 65 33 5f  le rN = sqlite3_
3830: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
3840: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 53 74 64 44  context);.  StdD
3850: 65 76 43 74 78 20 2a 70 20 3d 20 73 71 6c 69 74  evCtx *p = sqlit
3860: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3870: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
3880: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
3890: 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 31 20 29   p && p->cnt>1 )
38a0: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 43 6e  {.    double rCn
38b0: 74 20 3d 20 63 6e 74 3b 0a 20 20 20 20 73 71 6c  t = cnt;.    sql
38c0: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
38d0: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
38e0: 0a 20 20 20 20 20 20 20 73 71 72 74 28 28 70 2d  .       sqrt((p-
38f0: 3e 73 75 6d 32 20 2d 20 70 2d 3e 73 75 6d 2a 70  >sum2 - p->sum*p
3900: 2d 3e 73 75 6d 2f 72 43 6e 74 29 2f 28 72 43 6e  ->sum/rCnt)/(rCn
3910: 74 2d 31 2e 30 29 29 29 3b 0a 20 20 7d 0a 7d 0a  t-1.0)));.  }.}.
3920: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3930: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3940: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
3950: 6b 20 6f 66 20 73 74 61 74 65 20 69 6e 66 6f 72  k of state infor
3960: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a  mation for the.*
3970: 2a 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67  * count() aggreg
3980: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ate function..*/
3990: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
39a0: 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e 74 43 74  CountCtx CountCt
39b0: 78 3b 0a 73 74 72 75 63 74 20 43 6f 75 6e 74 43  x;.struct CountC
39c0: 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b  tx {.  int n;.};
39d0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
39e0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
39f0: 65 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67  e count() aggreg
3a00: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ate function..*/
3a10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
3a20: 6e 74 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63  ntStep(sqlite3_c
3a30: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3a40: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
3a50: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
3a60: 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b  {.  CountCtx *p;
3a70: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
3a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
3a90: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
3aa0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72  (*p));.  if( (ar
3ab0: 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f  gc==0 || SQLITE_
3ac0: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
3ad0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
3ae0: 29 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20 70  )) && p ){.    p
3af0: 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20 20 20 0a  ->n++;.  }.}   .
3b00: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e  static void coun
3b10: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
3b20: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3b30: 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  xt){.  CountCtx 
3b40: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
3b50: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3b60: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
3b70: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 73 71 6c 69  eof(*p));.  sqli
3b80: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
3b90: 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e  ontext, p ? p->n
3ba0: 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   : 0);.}../*.** 
3bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 72  This function tr
3bc0: 61 63 6b 73 20 73 74 61 74 65 20 69 6e 66 6f 72  acks state infor
3bd0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6d  mation for the m
3be0: 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 0a 2a  in() and max().*
3bf0: 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
3c00: 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  tions..*/.typede
3c10: 66 20 73 74 72 75 63 74 20 4d 69 6e 4d 61 78 43  f struct MinMaxC
3c20: 74 78 20 4d 69 6e 4d 61 78 43 74 78 3b 0a 73 74  tx MinMaxCtx;.st
3c30: 72 75 63 74 20 4d 69 6e 4d 61 78 43 74 78 20 7b  ruct MinMaxCtx {
3c40: 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
3c50: 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74 20      /* The best 
3c60: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72  so far */.  char
3c70: 20 7a 42 75 66 5b 32 38 5d 3b 20 20 20 2f 2a 20   zBuf[28];   /* 
3c80: 53 70 61 63 65 20 74 68 61 74 20 63 61 6e 20 62  Space that can b
3c90: 65 20 75 73 65 64 20 66 6f 72 20 73 74 6f 72 61  e used for stora
3ca0: 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ge */.};../*.** 
3cb0: 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c  Routines to impl
3cc0: 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64 20  ement min() and 
3cd0: 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65 20  max() aggregate 
3ce0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  functions..*/.st
3cf0: 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78  atic void minmax
3d00: 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Step(sqlite3_con
3d10: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
3d20: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
3d30: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
3d40: 20 20 69 6e 74 20 6d 61 78 20 3d 20 30 3b 0a 20    int max = 0;. 
3d50: 20 69 6e 74 20 63 6d 70 20 3d 20 30 3b 0a 20 20   int cmp = 0;.  
3d60: 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d 65  Mem *pArg  = (Me
3d70: 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20 4d  m *)argv[0];.  M
3d80: 65 6d 20 2a 70 42 65 73 74 20 3d 20 28 4d 65 6d  em *pBest = (Mem
3d90: 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65   *)sqlite3_aggre
3da0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
3db0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42  text, sizeof(*pB
3dc0: 65 73 74 29 29 3b 0a 0a 20 20 69 66 28 20 53 51  est));..  if( SQ
3dd0: 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74  LITE_NULL==sqlit
3de0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
3df0: 67 76 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 3b  gv[0]) ) return;
3e00: 0a 0a 20 20 69 66 28 20 70 42 65 73 74 2d 3e 66  ..  if( pBest->f
3e10: 6c 61 67 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54  lags ){.    /* T
3e20: 68 69 73 20 73 74 65 70 20 66 75 6e 63 74 69 6f  his step functio
3e30: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 62 6f  n is used for bo
3e40: 74 68 20 74 68 65 20 6d 69 6e 28 29 20 61 6e 64  th the min() and
3e50: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
3e60: 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e  s,.    ** the on
3e70: 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  ly difference be
3e80: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 65  tween the two be
3e90: 69 6e 67 20 74 68 61 74 20 74 68 65 20 73 65 6e  ing that the sen
3ea0: 73 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  se of the.    **
3eb0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 69   comparison is i
3ec0: 6e 76 65 72 74 65 64 2e 20 46 6f 72 20 74 68 65  nverted. For the
3ed0: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
3ee0: 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  , the.    ** sql
3ef0: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 29  ite3_user_data()
3f00: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
3f10: 73 20 28 76 6f 69 64 20 2a 29 2d 31 2e 20 46 6f  s (void *)-1. Fo
3f20: 72 20 6d 69 6e 28 29 20 69 74 0a 20 20 20 20 2a  r min() it.    *
3f30: 2a 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20  * returns (void 
3f40: 2a 29 64 62 2c 20 77 68 65 72 65 20 64 62 20 69  *)db, where db i
3f50: 73 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 64  s the sqlite3* d
3f60: 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 2e  atabase pointer.
3f70: 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 66 6f 72  .    ** Therefor
3f80: 65 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  e the next state
3f90: 6d 65 6e 74 20 73 65 74 73 20 76 61 72 69 61 62  ment sets variab
3fa0: 6c 65 20 27 6d 61 78 27 20 74 6f 20 31 20 66 6f  le 'max' to 1 fo
3fb0: 72 20 74 68 65 20 6d 61 78 28 29 0a 20 20 20 20  r the max().    
3fc0: 2a 2a 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72  ** aggregate, or
3fd0: 20 30 20 66 6f 72 20 6d 69 6e 28 29 2e 0a 20 20   0 for min()..  
3fe0: 20 20 2a 2f 0a 20 20 20 20 6d 61 78 20 3d 20 28    */.    max = (
3ff0: 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  (sqlite3_user_da
4000: 74 61 28 63 6f 6e 74 65 78 74 29 3d 3d 28 76 6f  ta(context)==(vo
4010: 69 64 20 2a 29 2d 31 29 3f 31 3a 30 29 3b 0a 20  id *)-1)?1:0);. 
4020: 20 20 20 63 6d 70 20 3d 20 73 71 6c 69 74 65 33     cmp = sqlite3
4030: 4d 65 6d 43 6f 6d 70 61 72 65 28 70 42 65 73 74  MemCompare(pBest
4040: 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20  , pArg, 0);.    
4050: 69 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c  if( (max && cmp<
4060: 30 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63  0) || (!max && c
4070: 6d 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73  mp>0) ){.      s
4080: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
4090: 79 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a  y(pBest, pArg);.
40a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
40b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
40c0: 6d 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72  mCopy(pBest, pAr
40d0: 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  g);.  }.}.static
40e0: 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e 61   void minMaxFina
40f0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
4100: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
4110: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4120: 2a 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d 20  *pRes;.  pRes = 
4130: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  (sqlite3_value *
4140: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
4150: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
4160: 78 74 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 29  xt, sizeof(Mem))
4170: 3b 0a 20 20 69 66 28 20 70 52 65 73 2d 3e 66 6c  ;.  if( pRes->fl
4180: 61 67 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ags ){.    sqlit
4190: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
41a0: 63 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b 0a  context, pRes);.
41b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
41c0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73  s function regis
41d0: 74 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  tered all of the
41e0: 20 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f   above C functio
41f0: 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e  ns as SQL.** fun
4200: 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68  ctions.  This sh
4210: 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79  ould be the only
4220: 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73   routine in this
4230: 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78   file with.** ex
4240: 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a  ternal linkage..
4250: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
4260: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
4270: 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 20 2a  nctions(sqlite *
4280: 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74  db){.  static st
4290: 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
42a0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 73 69   *zName;.     si
42b0: 67 6e 65 64 20 63 68 61 72 20 6e 41 72 67 3b 0a  gned char nArg;.
42c0: 20 20 20 20 20 75 38 20 61 72 67 54 79 70 65 3b       u8 argType;
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42e0: 2a 20 30 3a 20 6e 6f 6e 65 2e 20 20 31 3a 20 64  * 0: none.  1: d
42f0: 62 20 20 32 3a 20 28 2d 31 29 20 2a 2f 0a 20 20  b  2: (-1) */.  
4300: 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29     void (*xFunc)
4310: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
4320: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
4330: 6c 75 65 20 2a 2a 29 3b 0a 20 20 7d 20 61 46 75  lue **);.  } aFu
4340: 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ncs[] = {.    { 
4350: 22 6d 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20  "min",          
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
4370: 2c 20 30 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20  , 0, minmaxFunc 
4380: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20  },.    { "min", 
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43a0: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 20          0, 0, 0 
43b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
43c0: 7b 20 22 6d 61 78 22 2c 20 20 20 20 20 20 20 20  { "max",        
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 2d 31 2c 20 32 2c 20 6d 69 6e 6d 61 78 46 75 6e  -1, 2, minmaxFun
43f0: 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22  c },.    { "max"
4400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4410: 20 20 20 20 20 20 20 20 20 20 30 2c 20 32 2c 20            0, 2, 
4420: 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  0          },.  
4430: 20 20 7b 20 22 74 79 70 65 6f 66 22 2c 20 20 20    { "typeof",   
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 20 20 31 2c 20 30 2c 20 74 79 70 65 6f 66 46     1, 0, typeofF
4460: 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c  unc },.    { "cl
4470: 61 73 73 6f 66 22 2c 20 20 20 20 20 20 20 20 20  assof",         
4480: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
4490: 2c 20 74 79 70 65 6f 66 46 75 6e 63 20 7d 2c 20  , typeofFunc }, 
44a0: 2f 2a 20 46 49 58 20 4d 45 3a 20 68 61 63 6b 20  /* FIX ME: hack 
44b0: 2a 2f 0a 20 20 20 20 7b 20 22 6c 65 6e 67 74 68  */.    { "length
44c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
44d0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 6c 65          1, 0, le
44e0: 6e 67 74 68 46 75 6e 63 20 7d 2c 0a 20 20 20 20  ngthFunc },.    
44f0: 7b 20 22 73 75 62 73 74 72 22 2c 20 20 20 20 20  { "substr",     
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 33 2c 20 30 2c 20 73 75 62 73 74 72 46 75 6e   3, 0, substrFun
4520: 63 20 7d 2c 0a 20 20 20 20 7b 20 22 61 62 73 22  c },.    { "abs"
4530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4540: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
4550: 61 62 73 46 75 6e 63 20 20 20 20 7d 2c 0a 20 20  absFunc    },.  
4560: 20 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 20 20    { "round",    
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 31 2c 20 30 2c 20 72 6f 75 6e 64 46 75     1, 0, roundFu
4590: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6f  nc  },.    { "ro
45a0: 75 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  und",           
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
45c0: 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c 0a  , roundFunc  },.
45d0: 20 20 20 20 7b 20 22 75 70 70 65 72 22 2c 20 20      { "upper",  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 20 20 31 2c 20 30 2c 20 75 70 70 65 72       1, 0, upper
4600: 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22  Func  },.    { "
4610: 6c 6f 77 65 72 22 2c 20 20 20 20 20 20 20 20 20  lower",         
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
4630: 20 30 2c 20 6c 6f 77 65 72 46 75 6e 63 20 20 7d   0, lowerFunc  }
4640: 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65 73 63  ,.    { "coalesc
4650: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4660: 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 69 66 6e        -1, 0, ifn
4670: 75 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  ullFunc },.    {
4680: 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20 20   "coalesce",    
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20 20  0, 0, 0         
46b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65   },.    { "coale
46c0: 73 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  sce",           
46d0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
46e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
46f0: 20 7b 20 22 69 66 6e 75 6c 6c 22 2c 20 20 20 20   { "ifnull",    
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 32 2c 20 30 2c 20 69 66 6e 75 6c 6c 46 75    2, 0, ifnullFu
4720: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6e  nc },.    { "ran
4730: 64 6f 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20  dom",           
4740: 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c            -1, 0,
4750: 20 72 61 6e 64 6f 6d 46 75 6e 63 20 7d 2c 0a 20   randomFunc },. 
4760: 20 20 20 7b 20 22 6c 69 6b 65 22 2c 20 20 20 20     { "like",    
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 20 20 20 32 2c 20 30 2c 20 6c 69 6b 65 46 75      2, 0, likeFu
4790: 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67  nc   },.    { "g
47a0: 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
47c0: 30 2c 20 67 6c 6f 62 46 75 6e 63 20 20 20 7d 2c  0, globFunc   },
47d0: 0a 20 20 20 20 7b 20 22 6e 75 6c 6c 69 66 22 2c  .    { "nullif",
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 20 20 20 20 32 2c 20 30 2c 20 6e 75 6c 6c        2, 0, null
4800: 69 66 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  ifFunc },.    { 
4810: 22 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 22  "sqlite_version"
4820: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
4830: 2c 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63  , 0, versionFunc
4840: 7d 2c 0a 20 20 20 20 7b 20 22 71 75 6f 74 65 22  },.    { "quote"
4850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4860: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 71 75          1, 0, qu
4870: 6f 74 65 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20  oteFunc  },.    
4880: 7b 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  { "last_insert_r
4890: 6f 77 69 64 22 2c 20 20 20 20 20 20 20 20 20 20  owid",          
48a0: 20 30 2c 20 31 2c 20 6c 61 73 74 5f 69 6e 73 65   0, 1, last_inse
48b0: 72 74 5f 72 6f 77 69 64 20 7d 2c 0a 20 20 20 20  rt_rowid },.    
48c0: 7b 20 22 63 68 61 6e 67 65 5f 63 6f 75 6e 74 22  { "change_count"
48d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
48e0: 20 30 2c 20 31 2c 20 63 68 61 6e 67 65 5f 63 6f   0, 1, change_co
48f0: 75 6e 74 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  unt      },.    
4900: 7b 20 22 6c 61 73 74 5f 73 74 61 74 65 6d 65 6e  { "last_statemen
4910: 74 5f 63 68 61 6e 67 65 5f 63 6f 75 6e 74 22 2c  t_change_count",
4920: 20 30 2c 20 31 2c 20 6c 61 73 74 5f 73 74 61 74   0, 1, last_stat
4930: 65 6d 65 6e 74 5f 63 68 61 6e 67 65 5f 63 6f 75  ement_change_cou
4940: 6e 74 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  nt },.#ifdef SQL
4950: 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20 20 20 20  ITE_SOUNDEX.    
4960: 7b 20 22 73 6f 75 6e 64 65 78 22 2c 20 20 20 20  { "soundex",    
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 31 2c 20 30 2c 20 73 6f 75 6e 64 65 78 46 75   1, 0, soundexFu
4990: 6e 63 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  nc},.#endif.#ifd
49a0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
49b0: 20 20 20 7b 20 22 72 61 6e 64 73 74 72 22 2c 20     { "randstr", 
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 20 20 20 20 32 2c 20 30 2c 20 72 61 6e 64 53 74      2, 0, randSt
49e0: 72 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  r    },.#endif. 
49f0: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72   };.  static str
4a00: 75 63 74 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  uct {.    char *
4a10: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 69 67 6e 65  zName;.    signe
4a20: 64 20 63 68 61 72 20 6e 41 72 67 3b 0a 20 20 20  d char nArg;.   
4a30: 20 75 38 20 61 72 67 54 79 70 65 3b 0a 20 20 20   u8 argType;.   
4a40: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
4a50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
4a60: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
4a70: 65 2a 2a 29 3b 0a 20 20 20 20 76 6f 69 64 20 28  e**);.    void (
4a80: 2a 78 46 69 6e 61 6c 69 7a 65 29 28 73 71 6c 69  *xFinalize)(sqli
4a90: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a 20  te3_context*);. 
4aa0: 20 7d 20 61 41 67 67 73 5b 5d 20 3d 20 7b 0a 20   } aAggs[] = {. 
4ab0: 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 31     { "min",    1
4ac0: 2c 20 30 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c  , 0, minmaxStep,
4ad0: 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a     minMaxFinaliz
4ae0: 65 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22  e },.    { "max"
4af0: 2c 20 20 20 20 31 2c 20 32 2c 20 6d 69 6e 6d 61  ,    1, 2, minma
4b00: 78 53 74 65 70 2c 20 20 20 6d 69 6e 4d 61 78 46  xStep,   minMaxF
4b10: 69 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20 20 20 7b  inalize },.    {
4b20: 20 22 73 75 6d 22 2c 20 20 20 20 31 2c 20 30 2c   "sum",    1, 0,
4b30: 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 73   sumStep,      s
4b40: 75 6d 46 69 6e 61 6c 69 7a 65 20 20 20 20 7d 2c  umFinalize    },
4b50: 0a 20 20 20 20 7b 20 22 61 76 67 22 2c 20 20 20  .    { "avg",   
4b60: 20 31 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20   1, 0, sumStep, 
4b70: 20 20 20 20 20 61 76 67 46 69 6e 61 6c 69 7a 65       avgFinalize
4b80: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f      },.    { "co
4b90: 75 6e 74 22 2c 20 20 30 2c 20 30 2c 20 63 6f 75  unt",  0, 0, cou
4ba0: 6e 74 53 74 65 70 2c 20 20 20 20 63 6f 75 6e 74  ntStep,    count
4bb0: 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 20  Finalize  },.   
4bc0: 20 7b 20 22 63 6f 75 6e 74 22 2c 20 20 31 2c 20   { "count",  1, 
4bd0: 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20  0, countStep,   
4be0: 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20   countFinalize  
4bf0: 7d 2c 0a 23 69 66 20 30 0a 20 20 20 20 7b 20 22  },.#if 0.    { "
4c00: 73 74 64 64 65 76 22 2c 20 31 2c 20 30 2c 20 73  stddev", 1, 0, s
4c10: 74 64 44 65 76 53 74 65 70 2c 20 20 20 73 74 64  tdDevStep,   std
4c20: 44 65 76 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a 23  DevFinalize },.#
4c30: 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74  endif.  };.  int
4c40: 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   i;..  for(i=0; 
4c50: 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 29  i<sizeof(aFuncs)
4c60: 2f 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b 30  /sizeof(aFuncs[0
4c70: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f  ]); i++){.    vo
4c80: 69 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20  id *pArg = 0;.  
4c90: 20 20 73 77 69 74 63 68 28 20 61 46 75 6e 63 73    switch( aFuncs
4ca0: 5b 69 5d 2e 61 72 67 54 79 70 65 20 29 7b 0a 20  [i].argType ){. 
4cb0: 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 41 72       case 1: pAr
4cc0: 67 20 3d 20 64 62 3b 20 62 72 65 61 6b 3b 0a 20  g = db; break;. 
4cd0: 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 41 72       case 2: pAr
4ce0: 67 20 3d 20 28 76 6f 69 64 20 2a 29 28 2d 31 29  g = (void *)(-1)
4cf0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ; break;.    }. 
4d00: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
4d10: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
4d20: 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  Funcs[i].zName, 
4d30: 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 20  aFuncs[i].nArg, 
4d40: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 70 41  0, 0,.        pA
4d50: 72 67 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 78 46  rg, aFuncs[i].xF
4d60: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
4d70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4d80: 65 6f 66 28 61 41 67 67 73 29 2f 73 69 7a 65 6f  eof(aAggs)/sizeo
4d90: 66 28 61 41 67 67 73 5b 30 5d 29 3b 20 69 2b 2b  f(aAggs[0]); i++
4da0: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72  ){.    void *pAr
4db0: 67 20 3d 20 30 3b 0a 20 20 20 20 73 77 69 74 63  g = 0;.    switc
4dc0: 68 28 20 61 41 67 67 73 5b 69 5d 2e 61 72 67 54  h( aAggs[i].argT
4dd0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
4de0: 65 20 31 3a 20 70 41 72 67 20 3d 20 64 62 3b 20  e 1: pArg = db; 
4df0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
4e00: 65 20 32 3a 20 70 41 72 67 20 3d 20 28 76 6f 69  e 2: pArg = (voi
4e10: 64 20 2a 29 28 2d 31 29 3b 20 62 72 65 61 6b 3b  d *)(-1); break;
4e20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4e30: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
4e40: 6f 6e 28 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e  on(db, aAggs[i].
4e50: 7a 4e 61 6d 65 2c 20 61 41 67 67 73 5b 69 5d 2e  zName, aAggs[i].
4e60: 6e 41 72 67 2c 20 30 2c 20 30 2c 20 70 41 72 67  nArg, 0, 0, pArg
4e70: 2c 0a 20 20 20 20 20 20 20 20 30 2c 20 61 41 67  ,.        0, aAg
4e80: 67 73 5b 69 5d 2e 78 53 74 65 70 2c 20 61 41 67  gs[i].xStep, aAg
4e90: 67 73 5b 69 5d 2e 78 46 69 6e 61 6c 69 7a 65 29  gs[i].xFinalize)
4ea0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
4eb0: 65 67 69 73 74 65 72 44 61 74 65 54 69 6d 65 46  egisterDateTimeF
4ec0: 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 7d 0a  unctions(db);.}.