/ Hex Artifact Content
Login

Artifact 14bf20710a10fe66266e16da4364ca2dd8c4c36d:


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 38 33 20 32 30 30 34 2f 30 39 2f 30 36 20  1.83 2004/09/06 
02a0: 31 37 3a 32 34 3a 31 33 20 64 72 68 20 45 78 70  17:24:13 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: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
0350: 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f  sqlite3GetFuncCo
0360: 6c 6c 53 65 71 28 73 71 6c 69 74 65 33 5f 63 6f  llSeq(sqlite3_co
0370: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
0380: 0a 20 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 78  .  return contex
0390: 74 2d 3e 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  t->pColl;.}../*.
03a0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
03b0: 6e 20 6f 66 20 74 68 65 20 6e 6f 6e 2d 61 67 67  n of the non-agg
03c0: 72 65 67 61 74 65 20 6d 69 6e 28 29 20 61 6e 64  regate min() and
03d0: 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73   max() functions
03e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
03f0: 6d 69 6e 6d 61 78 46 75 6e 63 28 0a 20 20 73 71  minmaxFunc(.  sq
0400: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
0410: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
0420: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
0430: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
0440: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 73  int i;.  int mas
0450: 6b 3b 20 20 20 20 2f 2a 20 30 20 66 6f 72 20 6d  k;    /* 0 for m
0460: 69 6e 28 29 20 6f 72 20 30 78 66 66 66 66 66 66  in() or 0xffffff
0470: 66 66 20 66 6f 72 20 6d 61 78 28 29 20 2a 2f 0a  ff for max() */.
0480: 20 20 69 6e 74 20 69 42 65 73 74 3b 0a 20 20 43    int iBest;.  C
0490: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
04a0: 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 20    if( argc==0 ) 
04b0: 72 65 74 75 72 6e 3b 0a 20 20 6d 61 73 6b 20 3d  return;.  mask =
04c0: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
04d0: 74 61 28 63 6f 6e 74 65 78 74 29 3d 3d 30 20 3f  ta(context)==0 ?
04e0: 20 30 20 3a 20 2d 31 3b 0a 20 20 70 43 6f 6c 6c   0 : -1;.  pColl
04f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e   = sqlite3GetFun
0500: 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74  cCollSeq(context
0510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  );.  assert( pCo
0520: 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
0530: 6d 61 73 6b 3d 3d 2d 31 20 7c 7c 20 6d 61 73 6b  mask==-1 || mask
0540: 3d 3d 30 20 29 3b 0a 20 20 69 42 65 73 74 20 3d  ==0 );.  iBest =
0550: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
0560: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
0570: 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[0])==SQLITE_NU
0580: 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  LL ) return;.  f
0590: 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20  or(i=1; i<argc; 
05a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
05b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
05c0: 28 61 72 67 76 5b 69 5d 29 3d 3d 53 51 4c 49 54  (argv[i])==SQLIT
05d0: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
05e0: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
05f0: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72 67 76  3MemCompare(argv
0600: 5b 69 42 65 73 74 5d 2c 20 61 72 67 76 5b 69 5d  [iBest], argv[i]
0610: 2c 20 70 43 6f 6c 6c 29 5e 6d 61 73 6b 29 3e 3d  , pColl)^mask)>=
0620: 30 20 29 7b 0a 20 20 20 20 20 20 69 42 65 73 74  0 ){.      iBest
0630: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
0640: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0650: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
0660: 61 72 67 76 5b 69 42 65 73 74 5d 29 3b 0a 7d 0a  argv[iBest]);.}.
0670: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0680: 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  e type of the ar
0690: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
06a0: 63 20 76 6f 69 64 20 74 79 70 65 6f 66 46 75 6e  c void typeofFun
06b0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
06c0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
06d0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
06e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
06f0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
0700: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 77 69 74  r *z = 0;.  swit
0710: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
0720: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
0730: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
0740: 54 45 5f 4e 55 4c 4c 3a 20 20 20 20 7a 20 3d 20  TE_NULL:    z = 
0750: 22 6e 75 6c 6c 22 3b 20 20 20 20 62 72 65 61 6b  "null";    break
0760: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0770: 45 5f 49 4e 54 45 47 45 52 3a 20 7a 20 3d 20 22  E_INTEGER: z = "
0780: 69 6e 74 65 67 65 72 22 3b 20 62 72 65 61 6b 3b  integer"; break;
0790: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
07a0: 5f 54 45 58 54 3a 20 20 20 20 7a 20 3d 20 22 74  _TEXT:    z = "t
07b0: 65 78 74 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ext";    break;.
07c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
07d0: 46 4c 4f 41 54 3a 20 20 20 7a 20 3d 20 22 72 65  FLOAT:   z = "re
07e0: 61 6c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  al";    break;. 
07f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
0800: 4c 4f 42 3a 20 20 20 20 7a 20 3d 20 22 62 6c 6f  LOB:    z = "blo
0810: 62 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  b";    break;.  
0820: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
0830: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
0840: 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53   z, -1, SQLITE_S
0850: 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TATIC);.}../*.**
0860: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
0870: 6f 66 20 74 68 65 20 6c 65 6e 67 74 68 28 29 20  of the length() 
0880: 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  function.*/.stat
0890: 69 63 20 76 6f 69 64 20 6c 65 6e 67 74 68 46 75  ic void lengthFu
08a0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
08b0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
08c0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
08d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
08e0: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b  gv.){.  int len;
08f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ..  assert( argc
0900: 3d 3d 31 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ==1 );.  switch(
0910: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
0920: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a  ype(argv[0]) ){.
0930: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0940: 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 53  BLOB:.    case S
0950: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20  QLITE_INTEGER:. 
0960: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
0970: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  LOAT: {.      sq
0980: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
0990: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
09a0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
09b0: 67 76 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 62  gv[0]));.      b
09c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
09d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
09e0: 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
09f0: 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
0a00: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
0a10: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  v[0]);.      for
0a20: 28 6c 65 6e 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29  (len=0; *z; z++)
0a30: 7b 20 69 66 28 20 28 30 78 63 30 26 2a 7a 29 21  { if( (0xc0&*z)!
0a40: 3d 30 78 38 30 20 29 20 6c 65 6e 2b 2b 3b 20 7d  =0x80 ) len++; }
0a50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
0a60: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
0a70: 74 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62  t, len);.      b
0a80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
0a90: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
0aa0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0ab0: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
0ac0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0ad0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
0ae0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
0af0: 20 74 68 65 20 61 62 73 28 29 20 66 75 6e 63 74   the abs() funct
0b00: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
0b10: 69 64 20 61 62 73 46 75 6e 63 28 73 71 6c 69 74  id absFunc(sqlit
0b20: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
0b30: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
0b40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
0b50: 72 67 76 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rgv){.  assert( 
0b60: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 73 77 69  argc==1 );.  swi
0b70: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  tch( sqlite3_val
0b80: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
0b90: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
0ba0: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
0bb0: 20 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d 20       i64 iVal = 
0bc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
0bd0: 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t64(argv[0]);.  
0be0: 20 20 20 20 69 66 28 20 69 56 61 6c 3c 30 20 29      if( iVal<0 )
0bf0: 20 69 56 61 6c 20 3d 20 69 56 61 6c 20 2a 20 2d   iVal = iVal * -
0c00: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
0c10: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
0c20: 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20  ntext, iVal);.  
0c30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0c40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0c50: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
0c60: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
0c70: 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ll(context);.   
0c80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0c90: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
0ca0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c       double rVal
0cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
0cc0: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29  _double(argv[0])
0cd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 56 61 6c  ;.      if( rVal
0ce0: 3c 30 20 29 20 72 56 61 6c 20 3d 20 72 56 61 6c  <0 ) rVal = rVal
0cf0: 20 2a 20 2d 31 2e 30 3b 0a 20 20 20 20 20 20 73   * -1.0;.      s
0d00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
0d10: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 56  uble(context, rV
0d20: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
0d30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
0d40: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
0d50: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
0d60: 72 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a  r() function.*/.
0d70: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
0d80: 74 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  trFunc(.  sqlite
0d90: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
0da0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
0db0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
0dc0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
0dd0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e  t char *z;.  con
0de0: 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69  st char *z2;.  i
0df0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 70 31 2c 20  nt i;.  int p1, 
0e00: 70 32 2c 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65  p2, len;..  asse
0e10: 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20  rt( argc==3 );. 
0e20: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
0e30: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
0e40: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
0e50: 65 74 75 72 6e 3b 0a 20 20 70 31 20 3d 20 73 71  eturn;.  p1 = sq
0e60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
0e70: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 70 32 20 3d  argv[1]);.  p2 =
0e80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
0e90: 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 66  nt(argv[2]);.  f
0ea0: 6f 72 28 6c 65 6e 3d 30 2c 20 7a 32 3d 7a 3b 20  or(len=0, z2=z; 
0eb0: 2a 7a 32 3b 20 7a 32 2b 2b 29 7b 20 69 66 28 20  *z2; z2++){ if( 
0ec0: 28 30 78 63 30 26 2a 7a 32 29 21 3d 30 78 38 30  (0xc0&*z2)!=0x80
0ed0: 20 29 20 6c 65 6e 2b 2b 3b 20 7d 0a 20 20 69 66   ) len++; }.  if
0ee0: 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 70 31  ( p1<0 ){.    p1
0ef0: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28   += len;.    if(
0f00: 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70   p1<0 ){.      p
0f10: 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 70  2 += p1;.      p
0f20: 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 = 0;.    }.  }
0f30: 65 6c 73 65 20 69 66 28 20 70 31 3e 30 20 29 7b  else if( p1>0 ){
0f40: 0a 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 0a 20  .    p1--;.  }. 
0f50: 20 69 66 28 20 70 31 2b 70 32 3e 6c 65 6e 20 29   if( p1+p2>len )
0f60: 7b 0a 20 20 20 20 70 32 20 3d 20 6c 65 6e 2d 70  {.    p2 = len-p
0f70: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
0f80: 3b 20 69 3c 70 31 20 26 26 20 7a 5b 69 5d 3b 20  ; i<p1 && z[i]; 
0f90: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 7a  i++){.    if( (z
0fa0: 5b 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20  [i]&0xc0)==0x80 
0fb0: 29 20 70 31 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  ) p1++;.  }.  wh
0fc0: 69 6c 65 28 20 7a 5b 69 5d 20 26 26 20 28 7a 5b  ile( z[i] && (z[
0fd0: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
0fe0: 7b 20 69 2b 2b 3b 20 70 31 2b 2b 3b 20 7d 0a 20  { i++; p1++; }. 
0ff0: 20 66 6f 72 28 3b 20 69 3c 70 31 2b 70 32 20 26   for(; i<p1+p2 &
1000: 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  & z[i]; i++){.  
1010: 20 20 69 66 28 20 28 7a 5b 69 5d 26 30 78 63 30    if( (z[i]&0xc0
1020: 29 3d 3d 30 78 38 30 20 29 20 70 32 2b 2b 3b 0a  )==0x80 ) p2++;.
1030: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69    }.  while( z[i
1040: 5d 20 26 26 20 28 7a 5b 69 5d 26 30 78 63 30 29  ] && (z[i]&0xc0)
1050: 3d 3d 30 78 38 30 20 29 7b 20 69 2b 2b 3b 20 70  ==0x80 ){ i++; p
1060: 32 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 70 32 3c  2++; }.  if( p2<
1070: 30 20 29 20 70 32 20 3d 20 30 3b 0a 20 20 73 71  0 ) p2 = 0;.  sq
1080: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1090: 74 28 63 6f 6e 74 65 78 74 2c 20 26 7a 5b 70 31  t(context, &z[p1
10a0: 5d 2c 20 70 32 2c 20 53 51 4c 49 54 45 5f 54 52  ], p2, SQLITE_TR
10b0: 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a  ANSIENT);.}../*.
10c0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
10d0: 6e 20 6f 66 20 74 68 65 20 72 6f 75 6e 64 28 29  n of the round()
10e0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61   function.*/.sta
10f0: 74 69 63 20 76 6f 69 64 20 72 6f 75 6e 64 46 75  tic void roundFu
1100: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
1110: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
1120: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
1130: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
1140: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 75  int n = 0;.  dou
1150: 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 7a 42  ble r;.  char zB
1160: 75 66 5b 31 30 30 5d 3b 0a 20 20 61 73 73 65 72  uf[100];.  asser
1170: 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72  t( argc==1 || ar
1180: 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 61  gc==2 );.  if( a
1190: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  rgc==2 ){.    if
11a0: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  ( SQLITE_NULL==s
11b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
11c0: 65 28 61 72 67 76 5b 31 5d 29 20 29 20 72 65 74  e(argv[1]) ) ret
11d0: 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  urn;.    n = sql
11e0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
11f0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[1]);.    if(
1200: 20 6e 3e 33 30 20 29 20 6e 20 3d 20 33 30 3b 0a   n>30 ) n = 30;.
1210: 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20      if( n<0 ) n 
1220: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53  = 0;.  }.  if( S
1230: 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69  QLITE_NULL==sqli
1240: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1250: 72 67 76 5b 30 5d 29 20 29 20 72 65 74 75 72 6e  rgv[0]) ) return
1260: 3b 0a 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  r = sqlite3_
1270: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
1280: 76 5b 30 5d 29 3b 0a 20 20 73 70 72 69 6e 74 66  v[0]);.  sprintf
1290: 28 7a 42 75 66 2c 22 25 2e 2a 66 22 2c 6e 2c 72  (zBuf,"%.*f",n,r
12a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
12b0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
12c0: 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49  , zBuf, -1, SQLI
12d0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d  TE_TRANSIENT);.}
12e0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
12f0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 70  tation of the up
1300: 70 65 72 28 29 20 61 6e 64 20 6c 6f 77 65 72 28  per() and lower(
1310: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e  ) SQL functions.
1320: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1330: 75 70 70 65 72 46 75 6e 63 28 73 71 6c 69 74 65  upperFunc(sqlite
1340: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1350: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
1360: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1370: 67 76 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gv){.  unsigned 
1380: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69  char *z;.  int i
1390: 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 7c  ;.  if( argc<1 |
13a0: 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  | SQLITE_NULL==s
13b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
13c0: 65 28 61 72 67 76 5b 30 5d 29 20 29 20 72 65 74  e(argv[0]) ) ret
13d0: 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
13e0: 65 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f  eMalloc(sqlite3_
13f0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
1400: 5b 30 5d 29 2b 31 29 3b 0a 20 20 69 66 28 20 7a  [0])+1);.  if( z
1410: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1420: 73 74 72 63 70 79 28 7a 2c 20 73 71 6c 69 74 65  strcpy(z, sqlite
1430: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1440: 76 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28 69 3d  v[0]));.  for(i=
1450: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
1460: 20 20 20 7a 5b 69 5d 20 3d 20 74 6f 75 70 70 65     z[i] = touppe
1470: 72 28 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  r(z[i]);.  }.  s
1480: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
1490: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d  xt(context, z, -
14a0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
14b0: 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ENT);.  sqliteFr
14c0: 65 65 28 7a 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ee(z);.}.static 
14d0: 76 6f 69 64 20 6c 6f 77 65 72 46 75 6e 63 28 73  void lowerFunc(s
14e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
14f0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
1500: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
1510: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 75 6e 73 69   **argv){.  unsi
1520: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
1530: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
1540: 63 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55  c<1 || SQLITE_NU
1550: 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL==sqlite3_valu
1560: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
1570: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
1580: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 71 6c  sqliteMalloc(sql
1590: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
15a0: 28 61 72 67 76 5b 30 5d 29 2b 31 29 3b 0a 20 20  (argv[0])+1);.  
15b0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
15c0: 6e 3b 0a 20 20 73 74 72 63 70 79 28 7a 2c 20 73  n;.  strcpy(z, s
15d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
15e0: 74 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 66  t(argv[0]));.  f
15f0: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
1600: 2b 29 7b 0a 20 20 20 20 7a 5b 69 5d 20 3d 20 74  +){.    z[i] = t
1610: 6f 6c 6f 77 65 72 28 7a 5b 69 5d 29 3b 0a 20 20  olower(z[i]);.  
1620: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
1630: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1640: 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54   z, -1, SQLITE_T
1650: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
1660: 69 74 65 46 72 65 65 28 7a 29 3b 0a 7d 0a 0a 2f  iteFree(z);.}../
1670: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1680: 69 6f 6e 20 6f 66 20 74 68 65 20 49 46 4e 55 4c  ion of the IFNUL
1690: 4c 28 29 2c 20 4e 56 4c 28 29 2c 20 61 6e 64 20  L(), NVL(), and 
16a0: 43 4f 41 4c 45 53 43 45 28 29 20 66 75 6e 63 74  COALESCE() funct
16b0: 69 6f 6e 73 2e 20 20 0a 2a 2a 20 41 6c 6c 20 74  ions.  .** All t
16c0: 68 72 65 65 20 64 6f 20 74 68 65 20 73 61 6d 65  hree do the same
16d0: 20 74 68 69 6e 67 2e 20 20 54 68 65 79 20 72 65   thing.  They re
16e0: 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 6e  turn the first n
16f0: 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61 72 67 75 6d  on-NULL.** argum
1700: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
1710: 6f 69 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28 0a  oid ifnullFunc(.
1720: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1730: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
1740: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
1750: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
1760: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1770: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
1780: 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  +){.    if( SQLI
1790: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
17a0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
17b0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71  [i]) ){.      sq
17c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
17d0: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
17e0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  [i]);.      brea
17f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
1800: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1810: 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 28 29  tion of random()
1820: 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61 6e 64  .  Return a rand
1830: 6f 6d 20 69 6e 74 65 67 65 72 2e 20 20 0a 2a 2f  om integer.  .*/
1840: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e  .static void ran
1850: 64 6f 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  domFunc(.  sqlit
1860: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1870: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
1880: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1890: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
18a0: 20 72 3b 0a 20 20 73 71 6c 69 74 65 33 52 61 6e   r;.  sqlite3Ran
18b0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
18c0: 29 2c 20 26 72 29 3b 0a 20 20 73 71 6c 69 74 65  ), &r);.  sqlite
18d0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
18e0: 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a  text, r);.}../*.
18f0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1900: 6e 20 6f 66 20 74 68 65 20 6c 61 73 74 5f 69 6e  n of the last_in
1910: 73 65 72 74 5f 72 6f 77 69 64 28 29 20 53 51 4c  sert_rowid() SQL
1920: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
1930: 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
1940: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1950: 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  he sqlite3_last_
1960: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 41  insert_rowid() A
1970: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
1980: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
1990: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 0a 20  _insert_rowid(. 
19a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
19b0: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
19c0: 74 20 61 72 67 2c 20 0a 20 20 73 71 6c 69 74 65  t arg, .  sqlite
19d0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
19e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
19f0: 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
1a00: 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ata(context);.  
1a10: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1a20: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71  nt64(context, sq
1a30: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
1a40: 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a  t_rowid(db));.}.
1a50: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1a60: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61  ation of the cha
1a70: 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74  nges() SQL funct
1a80: 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ion.  The return
1a90: 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a   value is the.**
1aa0: 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c   same as the sql
1ab0: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 41  ite3_changes() A
1ac0: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
1ad0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
1ae0: 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ges(.  sqlite3_c
1af0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1b00: 0a 20 20 69 6e 74 20 61 72 67 2c 0a 20 20 73 71  .  int arg,.  sq
1b10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1b20: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
1b30: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  *db = sqlite3_us
1b40: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
1b50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1b60: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
1b70: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
1b80: 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  db));.}../*.** I
1b90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1ba0: 20 74 68 65 20 74 6f 74 61 6c 5f 63 68 61 6e 67   the total_chang
1bb0: 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  es() SQL functio
1bc0: 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  n.  The return v
1bd0: 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 73  alue is.** the s
1be0: 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74  ame as the sqlit
1bf0: 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
1c00: 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  () API function.
1c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c20: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 0a 20  total_changes(. 
1c30: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1c40: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
1c50: 20 61 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f   arg,.  sqlite3_
1c60: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
1c70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c80: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
1c90: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71  a(context);.  sq
1ca0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1cb0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
1cc0: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
1cd0: 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  db));.}../*.** A
1ce0: 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
1cf0: 69 6e 67 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c  ing how to do GL
1d00: 4f 42 2d 73 74 79 6c 65 20 63 6f 6d 70 61 72 69  OB-style compari
1d10: 73 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  sons..*/.struct 
1d20: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20  compareInfo {.  
1d30: 75 38 20 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75  u8 matchAll;.  u
1d40: 38 20 6d 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38  8 matchOne;.  u8
1d50: 20 6d 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20   matchSet;.  u8 
1d60: 6e 6f 43 61 73 65 3b 0a 7d 3b 0a 73 74 61 74 69  noCase;.};.stati
1d70: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63  c const struct c
1d80: 6f 6d 70 61 72 65 49 6e 66 6f 20 67 6c 6f 62 49  ompareInfo globI
1d90: 6e 66 6f 20 3d 20 7b 20 27 2a 27 2c 20 27 3f 27  nfo = { '*', '?'
1da0: 2c 20 27 5b 27 2c 20 30 20 7d 3b 0a 73 74 61 74  , '[', 0 };.stat
1db0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
1dc0: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65  compareInfo like
1dd0: 49 6e 66 6f 20 3d 20 7b 20 27 25 27 2c 20 27 5f  Info = { '%', '_
1de0: 27 2c 20 20 20 30 2c 20 31 20 7d 3b 0a 0a 2f 2a  ',   0, 1 };../*
1df0: 0a 2a 2a 20 58 20 69 73 20 61 20 70 6f 69 6e 74  .** X is a point
1e00: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
1e10: 62 79 74 65 20 6f 66 20 61 20 55 54 46 2d 38 20  byte of a UTF-8 
1e20: 63 68 61 72 61 63 74 65 72 2e 20 20 49 6e 63 72  character.  Incr
1e30: 65 6d 65 6e 74 0a 2a 2a 20 58 20 73 6f 20 74 68  ement.** X so th
1e40: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1e50: 74 68 65 20 6e 65 78 74 20 63 68 61 72 61 63 74  the next charact
1e60: 65 72 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77  er.  This only w
1e70: 6f 72 6b 73 20 72 69 67 68 74 0a 2a 2a 20 69 66  orks right.** if
1e80: 20 58 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 77   X points to a w
1e90: 65 6c 6c 2d 66 6f 72 6d 65 64 20 55 54 46 2d 38  ell-formed UTF-8
1ea0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66   string..*/.#def
1eb0: 69 6e 65 20 73 71 6c 69 74 65 4e 65 78 74 43 68  ine sqliteNextCh
1ec0: 61 72 28 58 29 20 20 77 68 69 6c 65 28 20 28 30  ar(X)  while( (0
1ed0: 78 63 30 26 2a 2b 2b 28 58 29 29 3d 3d 30 78 38  xc0&*++(X))==0x8
1ee0: 30 20 29 7b 7d 0a 23 64 65 66 69 6e 65 20 73 71  0 ){}.#define sq
1ef0: 6c 69 74 65 43 68 61 72 56 61 6c 28 58 29 20 20  liteCharVal(X)  
1f00: 20 73 71 6c 69 74 65 33 52 65 61 64 55 74 66 38   sqlite3ReadUtf8
1f10: 28 58 29 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  (X).../*.** Comp
1f20: 61 72 65 20 74 77 6f 20 55 54 46 2d 38 20 73 74  are two UTF-8 st
1f30: 72 69 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69  rings for equali
1f40: 74 79 20 77 68 65 72 65 20 74 68 65 20 66 69 72  ty where the fir
1f50: 73 74 20 73 74 72 69 6e 67 20 63 61 6e 0a 2a 2a  st string can.**
1f60: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
1f70: 61 20 22 67 6c 6f 62 22 20 65 78 70 72 65 73 73  a "glob" express
1f80: 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ion.  Return tru
1f90: 65 20 28 31 29 20 69 66 20 74 68 65 79 0a 2a 2a  e (1) if they.**
1fa0: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 6e   are the same an
1fb0: 64 20 66 61 6c 73 65 20 28 30 29 20 69 66 20 74  d false (0) if t
1fc0: 68 65 79 20 61 72 65 20 64 69 66 66 65 72 65 6e  hey are differen
1fd0: 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e  t..**.** Globbin
1fe0: 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
1ff0: 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61      '*'       Ma
2000: 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
2010: 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ce of zero or mo
2020: 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  re characters..*
2030: 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20  *.**      '?'   
2040: 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63      Matches exac
2050: 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65  tly one characte
2060: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e  r..**.**     [..
2070: 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  .]      Matches 
2080: 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72  one character fr
2090: 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  om the enclosed 
20a0: 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  list of.**      
20b0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63            charac
20c0: 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
20d0: 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68  [^...]     Match
20e0: 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
20f0: 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c   not in the encl
2100: 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  osed list..**.**
2110: 20 57 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20   With the [...] 
2120: 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68  and [^...] match
2130: 69 6e 67 2c 20 61 20 27 5d 27 20 63 68 61 72 61  ing, a ']' chara
2140: 63 74 65 72 20 63 61 6e 20 62 65 20 69 6e 63 6c  cter can be incl
2150: 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c  uded.** in the l
2160: 69 73 74 20 62 79 20 6d 61 6b 69 6e 67 20 69 74  ist by making it
2170: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
2180: 63 74 65 72 20 61 66 74 65 72 20 27 5b 27 20 6f  cter after '[' o
2190: 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e  r '^'.  A.** ran
21a0: 67 65 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  ge of characters
21b0: 20 63 61 6e 20 62 65 20 73 70 65 63 69 66 69 65   can be specifie
21c0: 64 20 75 73 69 6e 67 20 27 2d 27 2e 20 20 45 78  d using '-'.  Ex
21d0: 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d  ample:.** "[a-z]
21e0: 22 20 6d 61 74 63 68 65 73 20 61 6e 79 20 73 69  " matches any si
21f0: 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65 20  ngle lower-case 
2200: 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d 61 74 63  letter.  To matc
2210: 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a  h a '-', make.**
2220: 20 69 74 20 74 68 65 20 6c 61 73 74 20 63 68 61   it the last cha
2230: 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 6c 69  racter in the li
2240: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  st..**.** This r
2250: 6f 75 74 69 6e 65 20 69 73 20 75 73 75 61 6c 6c  outine is usuall
2260: 79 20 71 75 69 63 6b 2c 20 62 75 74 20 63 61 6e  y quick, but can
2270: 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20   be N**2 in the 
2280: 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a  worst case..**.*
2290: 2a 20 48 69 6e 74 73 3a 20 74 6f 20 6d 61 74 63  * Hints: to matc
22a0: 68 20 27 2a 27 20 6f 72 20 27 3f 27 2c 20 70 75  h '*' or '?', pu
22b0: 74 20 74 68 65 6d 20 69 6e 20 22 5b 5d 22 2e 20  t them in "[]". 
22c0: 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
22d0: 2a 20 20 20 20 20 20 20 20 20 61 62 63 5b 2a 5d  *         abc[*]
22e0: 78 79 7a 20 20 20 20 20 20 20 20 4d 61 74 63 68  xyz        Match
22f0: 65 73 20 22 61 62 63 2a 78 79 7a 22 20 6f 6e 6c  es "abc*xyz" onl
2300: 79 0a 2a 2f 0a 69 6e 74 20 70 61 74 74 65 72 6e  y.*/.int pattern
2310: 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74  Compare(.  const
2320: 20 75 38 20 2a 7a 50 61 74 74 65 72 6e 2c 20 20   u8 *zPattern,  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2340: 68 65 20 67 6c 6f 62 20 70 61 74 74 65 72 6e 20  he glob pattern 
2350: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  */.  const u8 *z
2360: 53 74 72 69 6e 67 2c 20 20 20 20 20 20 20 20 20  String,         
2370: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72        /* The str
2380: 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  ing to compare a
2390: 67 61 69 6e 73 74 20 74 68 65 20 67 6c 6f 62 20  gainst the glob 
23a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  */.  const struc
23b0: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70  t compareInfo *p
23c0: 49 6e 66 6f 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  Info  /* Informa
23d0: 74 69 6f 6e 20 61 62 6f 75 74 20 68 6f 77 20 74  tion about how t
23e0: 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 65  o do the compare
23f0: 20 2a 2f 0a 29 7b 0a 20 20 72 65 67 69 73 74 65   */.){.  registe
2400: 72 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69  r int c;.  int i
2410: 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65  nvert;.  int see
2420: 6e 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 20 20 75  n;.  int c2;.  u
2430: 38 20 6d 61 74 63 68 4f 6e 65 20 3d 20 70 49 6e  8 matchOne = pIn
2440: 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65 3b 0a 20 20  fo->matchOne;.  
2450: 75 38 20 6d 61 74 63 68 41 6c 6c 20 3d 20 70 49  u8 matchAll = pI
2460: 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c 6c 3b 0a 20  nfo->matchAll;. 
2470: 20 75 38 20 6d 61 74 63 68 53 65 74 20 3d 20 70   u8 matchSet = p
2480: 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3b 0a  Info->matchSet;.
2490: 20 20 75 38 20 6e 6f 43 61 73 65 20 3d 20 70 49    u8 noCase = pI
24a0: 6e 66 6f 2d 3e 6e 6f 43 61 73 65 3b 20 0a 0a 20  nfo->noCase; .. 
24b0: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 7a 50   while( (c = *zP
24c0: 61 74 74 65 72 6e 29 21 3d 30 20 29 7b 0a 20 20  attern)!=0 ){.  
24d0: 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 41 6c    if( c==matchAl
24e0: 6c 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  l ){.      while
24f0: 28 20 28 63 3d 7a 50 61 74 74 65 72 6e 5b 31 5d  ( (c=zPattern[1]
2500: 29 20 3d 3d 20 6d 61 74 63 68 41 6c 6c 20 7c 7c  ) == matchAll ||
2510: 20 63 20 3d 3d 20 6d 61 74 63 68 4f 6e 65 20 29   c == matchOne )
2520: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
2530: 3d 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20  =matchOne ){.   
2540: 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72         if( *zStr
2550: 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ing==0 ) return 
2560: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  0;.          sql
2570: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
2580: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ing);.        }.
2590: 20 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e          zPattern
25a0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
25b0: 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
25c0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28  urn 1;.      if(
25d0: 20 63 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a   c==matchSet ){.
25e0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
25f0: 7a 53 74 72 69 6e 67 20 26 26 20 70 61 74 74 65  zString && patte
2600: 72 6e 43 6f 6d 70 61 72 65 28 26 7a 50 61 74 74  rnCompare(&zPatt
2610: 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67 2c 70  ern[1],zString,p
2620: 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
2630: 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74        sqliteNext
2640: 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20  Char(zString);. 
2650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2660: 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67   return *zString
2670: 21 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  !=0;.      }else
2680: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
2690: 20 28 63 32 20 3d 20 2a 7a 53 74 72 69 6e 67 29   (c2 = *zString)
26a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
26b0: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
26c0: 20 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20             c2 = 
26d0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
26e0: 77 65 72 5b 63 32 5d 3b 0a 20 20 20 20 20 20 20  wer[c2];.       
26f0: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
2700: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
2710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69  .            whi
2720: 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26 20 63  le( c2 != 0 && c
2730: 32 20 21 3d 20 63 20 29 7b 20 63 32 20 3d 20 73  2 != c ){ c2 = s
2740: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
2750: 65 72 5b 2a 2b 2b 7a 53 74 72 69 6e 67 5d 3b 20  er[*++zString]; 
2760: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
2770: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  e{.            w
2780: 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26  hile( c2 != 0 &&
2790: 20 63 32 20 21 3d 20 63 20 29 7b 20 63 32 20 3d   c2 != c ){ c2 =
27a0: 20 2a 2b 2b 7a 53 74 72 69 6e 67 3b 20 7d 0a 20   *++zString; }. 
27b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27c0: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29       if( c2==0 )
27d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
27e0: 20 20 20 20 20 69 66 28 20 70 61 74 74 65 72 6e       if( pattern
27f0: 43 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72  Compare(&zPatter
2800: 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67 2c 70 49 6e  n[1],zString,pIn
2810: 66 6f 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  fo) ) return 1;.
2820: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2830: 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67  NextChar(zString
2840: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2850: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2860: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2870: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65   if( c==matchOne
2880: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a   ){.      if( *z
2890: 53 74 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75  String==0 ) retu
28a0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69  rn 0;.      sqli
28b0: 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69  teNextChar(zStri
28c0: 6e 67 29 3b 0a 20 20 20 20 20 20 7a 50 61 74 74  ng);.      zPatt
28d0: 65 72 6e 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ern++;.    }else
28e0: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 53 65 74   if( c==matchSet
28f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 72   ){.      int pr
2900: 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
2910: 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20   seen = 0;.     
2920: 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20   invert = 0;.   
2930: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 43 68 61     c = sqliteCha
2940: 72 56 61 6c 28 7a 53 74 72 69 6e 67 29 3b 0a 20  rVal(zString);. 
2950: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
2960: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2970: 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e  c2 = *++zPattern
2980: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  ;.      if( c2==
2990: 27 5e 27 20 29 7b 20 69 6e 76 65 72 74 20 3d 20  '^' ){ invert = 
29a0: 31 3b 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74  1; c2 = *++zPatt
29b0: 65 72 6e 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  ern; }.      if(
29c0: 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20   c2==']' ){.    
29d0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29      if( c==']' )
29e0: 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
29f0: 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74     c2 = *++zPatt
2a00: 65 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ern;.      }.   
2a10: 20 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20     while( (c2 = 
2a20: 73 71 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50  sqliteCharVal(zP
2a30: 61 74 74 65 72 6e 29 29 21 3d 30 20 26 26 20 63  attern))!=0 && c
2a40: 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  2!=']' ){.      
2a50: 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26    if( c2=='-' &&
2a60: 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21 3d 27 5d   zPattern[1]!=']
2a70: 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d  ' && zPattern[1]
2a80: 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30  !=0 && prior_c>0
2a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 50   ){.          zP
2aa0: 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20  attern++;.      
2ab0: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 43      c2 = sqliteC
2ac0: 68 61 72 56 61 6c 28 7a 50 61 74 74 65 72 6e 29  harVal(zPattern)
2ad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ae0: 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c  c>=prior_c && c<
2af0: 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a  =c2 ) seen = 1;.
2b00: 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
2b10: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
2b20: 65 6c 73 65 20 69 66 28 20 63 3d 3d 63 32 20 29  else if( c==c2 )
2b30: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e  {.          seen
2b40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2b50: 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20  prior_c = c2;.  
2b60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b70: 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
2b80: 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   c2;.        }. 
2b90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78         sqliteNex
2ba0: 74 43 68 61 72 28 7a 50 61 74 74 65 72 6e 29 3b  tChar(zPattern);
2bb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2bc0: 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65  f( c2==0 || (see
2bd0: 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29  n ^ invert)==0 )
2be0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2bf0: 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28   sqliteNextChar(
2c00: 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20  zString);.      
2c10: 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20  zPattern++;.    
2c20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
2c30: 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20   noCase ){.     
2c40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 55 70     if( sqlite3Up
2c50: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 20 21 3d  perToLower[c] !=
2c60: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
2c70: 6f 77 65 72 5b 2a 7a 53 74 72 69 6e 67 5d 20 29  ower[*zString] )
2c80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ca0: 69 66 28 20 63 20 21 3d 20 2a 7a 53 74 72 69 6e  if( c != *zStrin
2cb0: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
2cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 61 74      }.      zPat
2cd0: 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 7a 53  tern++;.      zS
2ce0: 74 72 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20  tring++;.    }. 
2cf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74   }.  return *zSt
2d00: 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  ring==0;.}.../*.
2d10: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2d20: 6e 20 6f 66 20 74 68 65 20 6c 69 6b 65 28 29 20  n of the like() 
2d30: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  SQL function.  T
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  his function imp
2d50: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62  lements.** the b
2d60: 75 69 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65  uild-in LIKE ope
2d70: 72 61 74 6f 72 2e 20 20 54 68 65 20 66 69 72 73  rator.  The firs
2d80: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
2d90: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  e function is th
2da0: 65 0a 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e 64  e.** pattern and
2db0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2dc0: 6d 65 6e 74 20 69 73 20 74 68 65 20 73 74 72 69  ment is the stri
2dd0: 6e 67 2e 20 20 53 6f 2c 20 74 68 65 20 53 51 4c  ng.  So, the SQL
2de0: 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a   statements:.**.
2df0: 2a 2a 20 20 20 20 20 20 20 41 20 4c 49 4b 45 20  **       A LIKE 
2e00: 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65  B.**.** is imple
2e10: 6d 65 6e 74 65 64 20 61 73 20 6c 69 6b 65 28 42  mented as like(B
2e20: 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ,A)..**.** If th
2e30: 65 20 70 6f 69 6e 74 65 72 20 72 65 74 72 69 65  e pointer retrie
2e40: 76 65 64 20 62 79 20 76 69 61 20 61 20 63 61 6c  ved by via a cal
2e50: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 75 73 65  l to sqlite3_use
2e60: 72 5f 64 61 74 61 28 29 20 69 73 0a 2a 2a 20 6e  r_data() is.** n
2e70: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2e80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  is function uses
2e90: 20 55 54 46 2d 31 36 2e 20 4f 74 68 65 72 77 69   UTF-16. Otherwi
2ea0: 73 65 20 55 54 46 2d 38 2e 0a 2a 2f 0a 73 74 61  se UTF-8..*/.sta
2eb0: 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e  tic void likeFun
2ec0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2ed0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
2ee0: 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73    int argc, .  s
2ef0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2f00: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
2f10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41  nsigned char *zA
2f20: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2f30: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
2f40: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
2f50: 20 63 68 61 72 20 2a 7a 42 20 3d 20 73 71 6c 69   char *zB = sqli
2f60: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
2f70: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[1]);.  if( z
2f80: 41 20 26 26 20 7a 42 20 29 7b 0a 20 20 20 20 73  A && zB ){.    s
2f90: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
2fa0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 61 74 74 65  t(context, patte
2fb0: 72 6e 43 6f 6d 70 61 72 65 28 7a 41 2c 20 7a 42  rnCompare(zA, zB
2fc0: 2c 20 26 6c 69 6b 65 49 6e 66 6f 29 29 3b 0a 20  , &likeInfo));. 
2fd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
2fe0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2ff0: 65 20 67 6c 6f 62 28 29 20 53 51 4c 20 66 75 6e  e glob() SQL fun
3000: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
3010: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73  ction implements
3020: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2d 69 6e  .** the build-in
3030: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 2e 20   GLOB operator. 
3040: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
3050: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
3060: 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a 20 73 74  ion is the.** st
3070: 72 69 6e 67 20 61 6e 64 20 74 68 65 20 73 65 63  ring and the sec
3080: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
3090: 74 68 65 20 70 61 74 74 65 72 6e 2e 20 20 53 6f  the pattern.  So
30a0: 2c 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  , the SQL statem
30b0: 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ents:.**.**     
30c0: 20 20 41 20 47 4c 4f 42 20 42 0a 2a 2a 0a 2a 2a    A GLOB B.**.**
30d0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
30e0: 61 73 20 67 6c 6f 62 28 41 2c 42 29 2e 0a 2a 2f  as glob(A,B)..*/
30f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 6c 6f  .static void glo
3100: 62 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  bFunc(sqlite3_co
3110: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
3120: 69 6e 74 20 61 72 67 2c 20 73 71 6c 69 74 65 33  int arg, sqlite3
3130: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
3140: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
3150: 20 63 68 61 72 20 2a 7a 41 20 3d 20 73 71 6c 69   char *zA = sqli
3160: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
3170: 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74  rgv[0]);.  const
3180: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3190: 7a 42 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  zB = sqlite3_val
31a0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
31b0: 3b 0a 20 20 69 66 28 20 7a 41 20 26 26 20 7a 42  ;.  if( zA && zB
31c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
31d0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
31e0: 78 74 2c 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  xt, patternCompa
31f0: 72 65 28 7a 41 2c 20 7a 42 2c 20 26 67 6c 6f 62  re(zA, zB, &glob
3200: 49 6e 66 6f 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Info));.  }.}../
3210: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
3220: 69 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49  ion of the NULLI
3230: 46 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e  F(x,y) function.
3240: 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
3250: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
3260: 75 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72 67  ument if the arg
3270: 75 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66 65  uments are diffe
3280: 72 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rent.  The resul
3290: 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  t is NULL if the
32a0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72  .** arguments ar
32b0: 65 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20  e equal to each 
32c0: 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  other..*/.static
32d0: 20 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63   void nullifFunc
32e0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
32f0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
3300: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
3310: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
3320: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
3330: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
3340: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e  tFuncCollSeq(con
3350: 74 65 78 74 29 3b 0a 20 20 69 66 28 20 73 71 6c  text);.  if( sql
3360: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61  ite3MemCompare(a
3370: 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c  rgv[0], argv[1],
3380: 20 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20   pColl)!=0 ){.  
3390: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
33a0: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
33b0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a  argv[0]);.  }.}.
33c0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
33d0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 56 45 52  ation of the VER
33e0: 53 49 4f 4e 28 2a 29 20 66 75 6e 63 74 69 6f 6e  SION(*) function
33f0: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
3400: 20 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20   the version.** 
3410: 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  of the SQLite li
3420: 62 72 61 72 79 20 74 68 61 74 20 69 73 20 72 75  brary that is ru
3430: 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  nning..*/.static
3440: 20 76 6f 69 64 20 76 65 72 73 69 6f 6e 46 75 6e   void versionFun
3450: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
3460: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
3470: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
3480: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
3490: 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  v.){.  sqlite3_r
34a0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
34b0: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 65 72 73  xt, sqlite3_vers
34c0: 69 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ion, -1, SQLITE_
34d0: 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  STATIC);.}../*.*
34e0: 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2d  * EXPERIMENTAL -
34f0: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20   This is not an 
3500: 6f 66 66 69 63 69 61 6c 20 66 75 6e 63 74 69 6f  official functio
3510: 6e 2e 20 20 54 68 65 20 69 6e 74 65 72 66 61 63  n.  The interfac
3520: 65 20 6d 61 79 0a 2a 2a 20 63 68 61 6e 67 65 2e  e may.** change.
3530: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
3540: 6d 61 79 20 64 69 73 61 70 70 65 61 72 2e 20 20  may disappear.  
3550: 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 63 6f 64  Do not write cod
3560: 65 20 74 68 61 74 20 64 65 70 65 6e 64 73 0a 2a  e that depends.*
3570: 2a 20 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69  * on this functi
3580: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  on..**.** Implem
3590: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
35a0: 51 55 4f 54 45 28 29 20 66 75 6e 63 74 69 6f 6e  QUOTE() function
35b0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
35c0: 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a   takes a single.
35d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66  ** argument.  If
35e0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
35f0: 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 20 72 65   numeric, the re
3600: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
3610: 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68 65  e same as.** the
3620: 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74   argument.  If t
3630: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  he argument is N
3640: 55 4c 4c 2c 20 74 68 65 20 72 65 74 75 72 6e 20  ULL, the return 
3650: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 74 72  value is the str
3660: 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20  ing.** "NULL".  
3670: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
3680: 72 67 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c 6f  rgument is enclo
3690: 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 71 75  sed in single qu
36a0: 6f 74 65 73 20 77 69 74 68 0a 2a 2a 20 73 69 6e  otes with.** sin
36b0: 67 6c 65 2d 71 75 6f 74 65 20 65 73 63 61 70 65  gle-quote escape
36c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
36d0: 64 20 71 75 6f 74 65 46 75 6e 63 28 73 71 6c 69  d quoteFunc(sqli
36e0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
36f0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
3700: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3710: 61 72 67 76 29 7b 0a 20 20 69 66 28 20 61 72 67  argv){.  if( arg
3720: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
3730: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
3740: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
3750: 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  0]) ){.    case 
3760: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
3770: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3780: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
3790: 2c 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51 4c  , "NULL", 4, SQL
37a0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
37b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
37c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
37d0: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
37e0: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
37f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
3800: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
3810: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  text, argv[0]);.
3820: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3830: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3840: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
3850: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
3860: 61 72 20 68 65 78 64 69 67 69 74 73 5b 5d 20 3d  ar hexdigits[] =
3870: 20 7b 20 0a 20 20 20 20 20 20 20 20 27 30 27 2c   { .        '0',
3880: 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20   '1', '2', '3', 
3890: 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27  '4', '5', '6', '
38a0: 37 27 2c 0a 20 20 20 20 20 20 20 20 27 38 27 2c  7',.        '8',
38b0: 20 27 39 27 2c 20 27 41 27 2c 20 27 42 27 2c 20   '9', 'A', 'B', 
38c0: 27 43 27 2c 20 27 44 27 2c 20 27 45 27 2c 20 27  'C', 'D', 'E', '
38d0: 46 27 20 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  F' .      };.   
38e0: 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d     char *zText =
38f0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   0;.      int nB
3900: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
3910: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
3920: 5d 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63  ]);.      char c
3930: 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73 71  onst *zBlob = sq
3940: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
3950: 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 20 20  (argv[0]);..    
3960: 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61 72 20    zText = (char 
3970: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 28  *)sqliteMalloc((
3980: 32 2a 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20 20  2*nBlob)+4); .  
3990: 20 20 20 20 69 66 28 20 21 7a 54 65 78 74 20 29      if( !zText )
39a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
39b0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
39c0: 6f 6e 74 65 78 74 2c 20 22 6f 75 74 20 6f 66 20  ontext, "out of 
39d0: 6d 65 6d 6f 72 79 22 2c 20 2d 31 29 3b 0a 20 20  memory", -1);.  
39e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
39f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
3a00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c    for(i=0; i<nBl
3a10: 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ob; i++){.      
3a20: 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b      zText[(i*2)+
3a30: 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  2] = hexdigits[(
3a40: 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30 78 30  zBlob[i]>>4)&0x0
3a50: 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  F];.          zT
3a60: 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d 20 68  ext[(i*2)+3] = h
3a70: 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b  exdigits[(zBlob[
3a80: 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20  i])&0x0F];.     
3a90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65     }.        zTe
3aa0: 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32 5d 20  xt[(nBlob*2)+2] 
3ab0: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
3ac0: 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b  zText[(nBlob*2)+
3ad0: 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  3] = '\0';.     
3ae0: 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20 27 58     zText[0] = 'X
3af0: 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74  ';.        zText
3b00: 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  [1] = '\'';.    
3b10: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3b20: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
3b30: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51 4c 49   zText, -1, SQLI
3b40: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
3b50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
3b60: 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20  e(zText);.      
3b70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3b80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3b90: 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20  LITE_TEXT: {.   
3ba0: 20 20 20 69 6e 74 20 69 2c 6a 2c 6e 3b 0a 20 20     int i,j,n;.  
3bb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3bc0: 7a 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 76  zArg = sqlite3_v
3bd0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
3be0: 5d 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ]);.      char *
3bf0: 7a 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  z;..      for(i=
3c00: 6e 3d 30 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b  n=0; zArg[i]; i+
3c10: 2b 29 7b 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d  +){ if( zArg[i]=
3c20: 3d 27 5c 27 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20  ='\'' ) n++; }. 
3c30: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 4d       z = sqliteM
3c40: 61 6c 6c 6f 63 28 20 69 2b 6e 2b 33 20 29 3b 0a  alloc( i+n+3 );.
3c50: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
3c60: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7a   return;.      z
3c70: 5b 30 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  [0] = '\'';.    
3c80: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 31 3b 20    for(i=0, j=1; 
3c90: 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zArg[i]; i++){. 
3ca0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
3cb0: 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
3cc0: 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c   if( zArg[i]=='\
3cd0: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  '' ){.          
3ce0: 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[j++] = '\'';. 
3cf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3d00: 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20  .      z[j++] = 
3d10: 27 5c 27 27 3b 0a 20 20 20 20 20 20 7a 5b 6a 5d  '\'';.      z[j]
3d20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
3d30: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
3d40: 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 6a 2c 20 53  context, z, j, S
3d50: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
3d60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
3d70: 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ee(z);.    }.  }
3d80: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
3d90: 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  E_SOUNDEX./*.** 
3da0: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f 75 6e  Compute the soun
3db0: 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  dex encoding of 
3dc0: 61 20 77 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  a word..*/.stati
3dd0: 63 20 76 6f 69 64 20 73 6f 75 6e 64 65 78 46 75  c void soundexFu
3de0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
3df0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
3e00: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
3e10: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
3e20: 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b  char zResult[8];
3e30: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49 6e  .  const u8 *zIn
3e40: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
3e50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
3e60: 69 67 6e 65 64 20 63 68 61 72 20 69 43 6f 64 65  igned char iCode
3e70: 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c  [] = {.    0, 0,
3e80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3e90: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3ea0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
3eb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3ec0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3ed0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
3ee0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
3ef0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3f00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3f10: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,.    0, 0, 0, 
3f20: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3f30: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3f40: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
3f50: 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   1, 2, 3, 0, 1, 
3f60: 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34  2, 0, 0, 2, 2, 4
3f70: 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31  , 5, 5, 0,.    1
3f80: 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c  , 2, 6, 2, 3, 0,
3f90: 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20   1, 0, 2, 0, 2, 
3fa0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
3fb0: 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33     0, 0, 1, 2, 3
3fc0: 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c  , 0, 1, 2, 0, 0,
3fd0: 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20   2, 2, 4, 5, 5, 
3fe0: 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20  0,.    1, 2, 6, 
3ff0: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32  2, 3, 0, 1, 0, 2
4000: 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 2, 0, 0, 0,
4010: 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73   0, 0,.  };.  as
4020: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
4030: 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29 73 71  .  zIn = (u8*)sq
4040: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
4050: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72  (argv[0]);.  for
4060: 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26 20  (i=0; zIn[i] && 
4070: 21 69 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d 29  !isalpha(zIn[i])
4080: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a  ; i++){}.  if( z
4090: 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 7a 52 65  In[i] ){.    zRe
40a0: 73 75 6c 74 5b 30 5d 20 3d 20 74 6f 75 70 70 65  sult[0] = touppe
40b0: 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66  r(zIn[i]);.    f
40c0: 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a  or(j=1; j<4 && z
40d0: 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  In[i]; i++){.   
40e0: 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43     int code = iC
40f0: 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d  ode[zIn[i]&0x7f]
4100: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65  ;.      if( code
4110: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  >0 ){.        zR
4120: 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64  esult[j++] = cod
4130: 65 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 7d  e + '0';.      }
4140: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
4150: 28 20 6a 3c 34 20 29 7b 0a 20 20 20 20 20 20 7a  ( j<4 ){.      z
4160: 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30  Result[j++] = '0
4170: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65  ';.    }.    zRe
4180: 73 75 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  sult[j] = 0;.   
4190: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
41a0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52  text(context, zR
41b0: 65 73 75 6c 74 2c 20 34 2c 20 53 51 4c 49 54 45  esult, 4, SQLITE
41c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
41d0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
41e0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
41f0: 6e 74 65 78 74 2c 20 22 3f 30 30 30 22 2c 20 34  ntext, "?000", 4
4200: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
4210: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
4220: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4230: 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ST./*.** This fu
4240: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73  nction generates
4250: 20 61 20 73 74 72 69 6e 67 20 6f 66 20 72 61 6e   a string of ran
4260: 64 6f 6d 20 63 68 61 72 61 63 74 65 72 73 2e 20  dom characters. 
4270: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 67 65 6e   Used for.** gen
4280: 65 72 61 74 69 6e 67 20 74 65 73 74 20 64 61 74  erating test dat
4290: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
42a0: 64 20 72 61 6e 64 53 74 72 28 73 71 6c 69 74 65  d randStr(sqlite
42b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
42c0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
42d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
42e0: 67 76 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  gv){.  static co
42f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4300: 72 20 7a 53 72 63 5b 5d 20 3d 20 0a 20 20 20 20  r zSrc[] = .    
4310: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
4320: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
4330: 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
4340: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
4350: 20 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39       "0123456789
4360: 22 0a 20 20 20 20 20 22 2e 2d 21 2c 3a 2a 5e 2b  ".     ".-!,:*^+
4370: 3d 5f 7c 3f 2f 3c 3e 20 22 3b 0a 20 20 69 6e 74  =_|?/<> ";.  int
4380: 20 69 4d 69 6e 2c 20 69 4d 61 78 2c 20 6e 2c 20   iMin, iMax, n, 
4390: 72 2c 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  r, i;.  unsigned
43a0: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
43b0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 31 20  ;.  if( argc>=1 
43c0: 29 7b 0a 20 20 20 20 69 4d 69 6e 20 3d 20 73 71  ){.    iMin = sq
43d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
43e0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
43f0: 28 20 69 4d 69 6e 3c 30 20 29 20 69 4d 69 6e 20  ( iMin<0 ) iMin 
4400: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 4d 69  = 0;.    if( iMi
4410: 6e 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29 20  n>=sizeof(zBuf) 
4420: 29 20 69 4d 69 6e 20 3d 20 73 69 7a 65 6f 66 28  ) iMin = sizeof(
4430: 7a 42 75 66 29 2d 31 3b 0a 20 20 7d 65 6c 73 65  zBuf)-1;.  }else
4440: 7b 0a 20 20 20 20 69 4d 69 6e 20 3d 20 31 3b 0a  {.    iMin = 1;.
4450: 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 3d    }.  if( argc>=
4460: 32 20 29 7b 0a 20 20 20 20 69 4d 61 78 20 3d 20  2 ){.    iMax = 
4470: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
4480: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
4490: 69 66 28 20 69 4d 61 78 3c 69 4d 69 6e 20 29 20  if( iMax<iMin ) 
44a0: 69 4d 61 78 20 3d 20 69 4d 69 6e 3b 0a 20 20 20  iMax = iMin;.   
44b0: 20 69 66 28 20 69 4d 61 78 3e 3d 73 69 7a 65 6f   if( iMax>=sizeo
44c0: 66 28 7a 42 75 66 29 20 29 20 69 4d 61 78 20 3d  f(zBuf) ) iMax =
44d0: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 3b   sizeof(zBuf)-1;
44e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4d  .  }else{.    iM
44f0: 61 78 20 3d 20 35 30 3b 0a 20 20 7d 0a 20 20 6e  ax = 50;.  }.  n
4500: 20 3d 20 69 4d 69 6e 3b 0a 20 20 69 66 28 20 69   = iMin;.  if( i
4510: 4d 61 78 3e 69 4d 69 6e 20 29 7b 0a 20 20 20 20  Max>iMin ){.    
4520: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
4530: 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
4540: 3b 0a 20 20 20 20 72 20 26 3d 20 30 78 37 66 66  ;.    r &= 0x7ff
4550: 66 66 66 66 66 3b 0a 20 20 20 20 6e 20 2b 3d 20  fffff;.    n += 
4560: 72 25 28 69 4d 61 78 20 2b 20 31 20 2d 20 69 4d  r%(iMax + 1 - iM
4570: 69 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  in);.  }.  asser
4580: 74 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42 75 66  t( n<sizeof(zBuf
4590: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 61  ) );.  sqlite3Ra
45a0: 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20 7a 42 75 66  ndomness(n, zBuf
45b0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
45c0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 42 75  n; i++){.    zBu
45d0: 66 5b 69 5d 20 3d 20 7a 53 72 63 5b 7a 42 75 66  f[i] = zSrc[zBuf
45e0: 5b 69 5d 25 28 73 69 7a 65 6f 66 28 7a 53 72 63  [i]%(sizeof(zSrc
45f0: 29 2d 31 29 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75  )-1)];.  }.  zBu
4600: 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  f[n] = 0;.  sqli
4610: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
4620: 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 6e  context, zBuf, n
4630: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
4640: 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  NT);.}.#endif /*
4650: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
4660: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4670: 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  EST./*.** The fo
4680: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 53 51 4c 20  llowing two SQL 
4690: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73  functions are us
46a0: 65 64 20 74 6f 20 74 65 73 74 20 72 65 74 75 72  ed to test retur
46b0: 6e 69 6e 67 20 61 20 74 65 78 74 0a 2a 2a 20 72  ning a text.** r
46c0: 65 73 75 6c 74 20 77 69 74 68 20 61 20 64 65 73  esult with a des
46d0: 74 72 75 63 74 6f 72 2e 20 46 75 6e 63 74 69 6f  tructor. Functio
46e0: 6e 20 27 74 65 73 74 5f 64 65 73 74 72 75 63 74  n 'test_destruct
46f0: 6f 72 27 20 74 61 6b 65 73 20 6f 6e 65 20 61 72  or' takes one ar
4700: 67 75 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20 72 65  gument.** and re
4710: 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 61  turns the same a
4720: 72 67 75 6d 65 6e 74 20 69 6e 74 65 72 70 72 65  rgument interpre
4730: 74 65 64 20 61 73 20 54 45 58 54 2e 20 41 20 64  ted as TEXT. A d
4740: 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
4750: 70 61 73 73 65 64 20 77 69 74 68 20 74 68 65 20  passed with the 
4760: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4770: 65 78 74 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  ext() call..**.*
4780: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 27  * SQL function '
4790: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  test_destructor_
47a0: 63 6f 75 6e 74 27 20 72 65 74 75 72 6e 73 20 74  count' returns t
47b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
47c0: 73 74 61 6e 64 69 6e 67 20 0a 2a 2a 20 61 6c 6c  standing .** all
47d0: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
47e0: 20 27 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f   'test_destructo
47f0: 72 27 3b 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  r';.**.** WARNIN
4800: 47 3a 20 4e 6f 74 20 74 68 72 65 61 64 73 61 66  G: Not threadsaf
4810: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4820: 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72   test_destructor
4830: 5f 63 6f 75 6e 74 5f 76 61 72 20 3d 20 30 3b 0a  _count_var = 0;.
4840: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
4850: 72 75 63 74 6f 72 28 76 6f 69 64 20 2a 70 29 7b  ructor(void *p){
4860: 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20  .  char *zVal = 
4870: 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 61 73 73  (char *)p;.  ass
4880: 65 72 74 28 7a 56 61 6c 29 3b 0a 20 20 7a 56 61  ert(zVal);.  zVa
4890: 6c 2d 2d 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  l--;.  sqliteFre
48a0: 65 28 7a 56 61 6c 29 3b 0a 20 20 74 65 73 74 5f  e(zVal);.  test_
48b0: 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74  destructor_count
48c0: 5f 76 61 72 2d 2d 3b 0a 7d 0a 73 74 61 74 69 63  _var--;.}.static
48d0: 20 76 6f 69 64 20 74 65 73 74 5f 64 65 73 74 72   void test_destr
48e0: 75 63 74 6f 72 28 0a 20 20 73 71 6c 69 74 65 33  uctor(.  sqlite3
48f0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
4900: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
4910: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4920: 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  rgv.){.  char *z
4930: 56 61 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  Val;.  int len;.
4940: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4950: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
4960: 61 28 70 43 74 78 29 3b 0a 20 0a 20 20 74 65 73  a(pCtx);. .  tes
4970: 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75  t_destructor_cou
4980: 6e 74 5f 76 61 72 2b 2b 3b 0a 20 20 61 73 73 65  nt_var++;.  asse
4990: 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
49a0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
49b0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
49c0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
49d0: 72 65 74 75 72 6e 3b 0a 20 20 6c 65 6e 20 3d 20  return;.  len = 
49e0: 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65  sqlite3ValueByte
49f0: 73 28 61 72 67 76 5b 30 5d 2c 20 64 62 2d 3e 65  s(argv[0], db->e
4a00: 6e 63 29 3b 20 0a 20 20 7a 56 61 6c 20 3d 20 73  nc); .  zVal = s
4a10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
4a20: 33 29 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e 5d 20  3);.  zVal[len] 
4a30: 3d 20 30 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e 2d  = 0;.  zVal[len-
4a40: 31 5d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  1] = 0;.  assert
4a50: 28 20 7a 56 61 6c 20 29 3b 0a 20 20 7a 56 61 6c  ( zVal );.  zVal
4a60: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 56 61  ++;.  memcpy(zVa
4a70: 6c 2c 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54  l, sqlite3ValueT
4a80: 65 78 74 28 61 72 67 76 5b 30 5d 2c 20 64 62 2d  ext(argv[0], db-
4a90: 3e 65 6e 63 29 2c 20 6c 65 6e 29 3b 0a 20 20 69  >enc), len);.  i
4aa0: 66 28 20 64 62 2d 3e 65 6e 63 3d 3d 53 51 4c 49  f( db->enc==SQLI
4ab0: 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 73  TE_UTF8 ){.    s
4ac0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
4ad0: 78 74 28 70 43 74 78 2c 20 7a 56 61 6c 2c 20 2d  xt(pCtx, zVal, -
4ae0: 31 2c 20 64 65 73 74 72 75 63 74 6f 72 29 3b 0a  1, destructor);.
4af0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
4b00: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
4b10: 36 4c 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  6LE ){.    sqlit
4b20: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
4b30: 6c 65 28 70 43 74 78 2c 20 7a 56 61 6c 2c 20 2d  le(pCtx, zVal, -
4b40: 31 2c 20 64 65 73 74 72 75 63 74 6f 72 29 3b 0a  1, destructor);.
4b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
4b60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
4b70: 31 36 62 65 28 70 43 74 78 2c 20 7a 56 61 6c 2c  16be(pCtx, zVal,
4b80: 20 2d 31 2c 20 64 65 73 74 72 75 63 74 6f 72 29   -1, destructor)
4b90: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
4ba0: 6f 69 64 20 74 65 73 74 5f 64 65 73 74 72 75 63  oid test_destruc
4bb0: 74 6f 72 5f 63 6f 75 6e 74 28 0a 20 20 73 71 6c  tor_count(.  sql
4bc0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
4bd0: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
4be0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4bf0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
4c00: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
4c10: 70 43 74 78 2c 20 74 65 73 74 5f 64 65 73 74 72  pCtx, test_destr
4c20: 75 63 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72 29  uctor_count_var)
4c30: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
4c40: 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69  LITE_TEST */..#i
4c50: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4c60: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
4c70: 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20  for testing the 
4c80: 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 78 64  sqlite3_get_auxd
4c90: 61 74 61 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ata() and sqlite
4ca0: 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 29 0a  3_set_auxdata().
4cb0: 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
4cc0: 0a 2a 2a 20 54 68 65 20 74 65 73 74 5f 61 75 78  .** The test_aux
4cd0: 64 61 74 61 28 29 20 53 51 4c 20 66 75 6e 63 74  data() SQL funct
4ce0: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
4cf0: 72 65 67 69 73 74 65 72 20 65 61 63 68 20 6f 66  register each of
4d00: 20 69 74 73 20 61 72 67 75 6d 65 6e 74 73 0a 2a   its arguments.*
4d10: 2a 20 61 73 20 61 75 78 69 6c 69 61 72 79 20 64  * as auxiliary d
4d20: 61 74 61 2e 20 20 49 66 20 74 68 65 72 65 20 61  ata.  If there a
4d30: 72 65 20 6e 6f 20 70 72 69 6f 72 20 72 65 67 69  re no prior regi
4d40: 73 74 72 61 74 69 6f 6e 73 20 6f 66 20 61 75 78  strations of aux
4d50: 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 68 61   data for.** tha
4d60: 74 20 61 72 67 75 6d 65 6e 74 20 28 6d 65 61 6e  t argument (mean
4d70: 69 6e 67 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ing the argument
4d80: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61   is not a consta
4d90: 6e 74 20 6f 72 20 74 68 69 73 20 69 73 20 69 74  nt or this is it
4da0: 73 20 66 69 72 73 74 0a 2a 2a 20 63 61 6c 6c 29  s first.** call)
4db0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
4dc0: 20 66 6f 72 20 74 68 61 74 20 61 72 67 75 6d 65   for that argume
4dd0: 6e 74 20 69 73 20 30 2e 20 20 49 66 20 74 68 65  nt is 0.  If the
4de0: 72 65 20 69 73 20 61 20 70 72 69 6f 72 0a 2a 2a  re is a prior.**
4df0: 20 72 65 67 69 73 74 72 61 74 69 6f 6e 2c 20 74   registration, t
4e00: 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 74 68  he result for th
4e10: 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 31  at argument is 1
4e20: 2e 20 20 54 68 65 20 6f 76 65 72 61 6c 6c 20 72  .  The overall r
4e30: 65 73 75 6c 74 0a 2a 2a 20 69 73 20 74 68 65 20  esult.** is the 
4e40: 69 6e 64 69 76 69 64 75 61 6c 20 61 72 67 75 6d  individual argum
4e50: 65 6e 74 20 72 65 73 75 6c 74 73 20 73 65 70 61  ent results sepa
4e60: 72 61 74 65 64 20 62 79 20 73 70 61 63 65 73 2e  rated by spaces.
4e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4e80: 66 72 65 65 5f 74 65 73 74 5f 61 75 78 64 61 74  free_test_auxdat
4e90: 61 28 76 6f 69 64 20 2a 70 29 20 7b 73 71 6c 69  a(void *p) {sqli
4ea0: 74 65 46 72 65 65 28 70 29 3b 7d 0a 73 74 61 74  teFree(p);}.stat
4eb0: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 75 78  ic void test_aux
4ec0: 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 5f  data(.  sqlite3_
4ed0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
4ee0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
4ef0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
4f00: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  gv.){.  int i;. 
4f10: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 73 71   char *zRet = sq
4f20: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 41 72 67 2a  liteMalloc(nArg*
4f30: 32 29 3b 0a 20 20 69 66 28 20 21 7a 52 65 74 20  2);.  if( !zRet 
4f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
4f50: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
4f60: 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  ){.    char cons
4f70: 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  t *z = sqlite3_v
4f80: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
4f90: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  ]);.    if( z ){
4fa0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75  .      char *zAu
4fb0: 78 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  x = sqlite3_get_
4fc0: 61 75 78 64 61 74 61 28 70 43 74 78 2c 20 69 29  auxdata(pCtx, i)
4fd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 78  ;.      if( zAux
4fe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
4ff0: 5b 69 2a 32 5d 20 3d 20 27 31 27 3b 0a 20 20 20  [i*2] = '1';.   
5000: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
5010: 7a 41 75 78 2c 20 7a 29 20 29 7b 0a 20 20 20 20  zAux, z) ){.    
5020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5030: 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
5040: 20 22 41 75 78 69 6c 61 72 79 20 64 61 74 61 20   "Auxilary data 
5050: 63 6f 72 72 75 70 74 69 6f 6e 22 2c 20 2d 31 29  corruption", -1)
5060: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
5070: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
5080: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5090: 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27     zRet[i*2] = '
50a0: 30 27 3b 0a 20 20 20 20 20 20 20 20 7a 41 75 78  0';.        zAux
50b0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
50c0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  z);.        sqli
50d0: 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28  te3_set_auxdata(
50e0: 70 43 74 78 2c 20 69 2c 20 7a 41 75 78 2c 20 66  pCtx, i, zAux, f
50f0: 72 65 65 5f 74 65 73 74 5f 61 75 78 64 61 74 61  ree_test_auxdata
5100: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5110: 20 7a 52 65 74 5b 69 2a 32 2b 31 5d 20 3d 20 27   zRet[i*2+1] = '
5120: 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   ';.    }.  }.  
5130: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5140: 65 78 74 28 70 43 74 78 2c 20 7a 52 65 74 2c 20  ext(pCtx, zRet, 
5150: 32 2a 6e 41 72 67 2d 31 2c 20 66 72 65 65 5f 74  2*nArg-1, free_t
5160: 65 73 74 5f 61 75 78 64 61 74 61 29 3b 0a 7d 0a  est_auxdata);.}.
5170: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5180: 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _TEST */../*.** 
5190: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
51a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
51b0: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65  ucture holds the
51c0: 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a   context of a.**
51d0: 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20   sum() or avg() 
51e0: 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74  aggregate comput
51f0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ation..*/.typede
5200: 66 20 73 74 72 75 63 74 20 53 75 6d 43 74 78 20  f struct SumCtx 
5210: 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53  SumCtx;.struct S
5220: 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65  umCtx {.  double
5230: 20 73 75 6d 3b 20 20 20 20 20 2f 2a 20 53 75 6d   sum;     /* Sum
5240: 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   of terms */.  i
5250: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 2f  nt cnt;        /
5260: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
5270: 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f 0a 7d  ents summed */.}
5280: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  ;../*.** Routine
5290: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
52a0: 65 20 74 68 65 20 73 75 6d 20 6f 72 20 61 76 65  e the sum or ave
52b0: 72 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rage..*/.static 
52c0: 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73 71 6c  void sumStep(sql
52d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
52e0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
52f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5300: 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43 74 78  *argv){.  SumCtx
5310: 20 2a 70 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *p;.  if( argc<
5320: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  1 ) return;.  p 
5330: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
5340: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
5350: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
5360: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 53 51 4c  ;.  if( p && SQL
5370: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
5380: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
5390: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 70 2d 3e  v[0]) ){.    p->
53a0: 73 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76  sum += sqlite3_v
53b0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
53c0: 5b 30 5d 29 3b 0a 20 20 20 20 70 2d 3e 63 6e 74  [0]);.    p->cnt
53d0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ++;.  }.}.static
53e0: 20 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a   void sumFinaliz
53f0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
5400: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
5410: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  umCtx *p;.  p = 
5420: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
5430: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
5440: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
5450: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5460: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
5470: 20 70 20 3f 20 70 2d 3e 73 75 6d 20 3a 20 30 2e   p ? p->sum : 0.
5480: 30 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  0);.}.static voi
5490: 64 20 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71  d avgFinalize(sq
54a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
54b0: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74  ontext){.  SumCt
54c0: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
54d0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
54e0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
54f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
5500: 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20  ( p && p->cnt>0 
5510: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
5520: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
5530: 74 65 78 74 2c 20 70 2d 3e 73 75 6d 2f 28 64 6f  text, p->sum/(do
5540: 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20  uble)p->cnt);.  
5550: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  }.}../*.** An in
5560: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
5570: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
5580: 65 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74  e holds the cont
5590: 65 78 74 20 6f 66 20 61 0a 2a 2a 20 76 61 72 69  ext of a.** vari
55a0: 61 6e 63 65 20 6f 72 20 73 74 61 6e 64 61 72 64  ance or standard
55b0: 20 64 65 76 69 61 74 69 6f 6e 20 63 6f 6d 70 75   deviation compu
55c0: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  tation..*/.typed
55d0: 65 66 20 73 74 72 75 63 74 20 53 74 64 44 65 76  ef struct StdDev
55e0: 43 74 78 20 53 74 64 44 65 76 43 74 78 3b 0a 73  Ctx StdDevCtx;.s
55f0: 74 72 75 63 74 20 53 74 64 44 65 76 43 74 78 20  truct StdDevCtx 
5600: 7b 0a 20 20 64 6f 75 62 6c 65 20 73 75 6d 3b 20  {.  double sum; 
5610: 20 20 20 20 2f 2a 20 53 75 6d 20 6f 66 20 74 65      /* Sum of te
5620: 72 6d 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  rms */.  double 
5630: 73 75 6d 32 3b 20 20 20 20 2f 2a 20 53 75 6d 20  sum2;    /* Sum 
5640: 6f 66 20 74 68 65 20 73 71 75 61 72 65 73 20 6f  of the squares o
5650: 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  f terms */.  int
5660: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20   cnt;        /* 
5670: 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
5680: 63 6f 75 6e 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 23  counted */.};..#
5690: 69 66 20 30 20 20 20 2f 2a 20 4f 6d 69 74 20 62  if 0   /* Omit b
56a0: 65 63 61 75 73 65 20 6d 61 74 68 20 6c 69 62 72  ecause math libr
56b0: 61 72 79 20 69 73 20 72 65 71 75 69 72 65 64 20  ary is required 
56c0: 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  */./*.** Routine
56d0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
56e0: 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 64  e the standard d
56f0: 65 76 69 61 74 69 6f 6e 20 61 73 20 61 6e 20 61  eviation as an a
5700: 67 67 72 65 67 61 74 65 2e 0a 2a 2f 0a 73 74 61  ggregate..*/.sta
5710: 74 69 63 20 76 6f 69 64 20 73 74 64 44 65 76 53  tic void stdDevS
5720: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
5730: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
5740: 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
5750: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 74  ar **argv){.  St
5760: 64 44 65 76 43 74 78 20 2a 70 3b 0a 20 20 64 6f  dDevCtx *p;.  do
5770: 75 62 6c 65 20 78 3b 0a 20 20 69 66 28 20 61 72  uble x;.  if( ar
5780: 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
5790: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
57a0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
57b0: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
57c0: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  p));.  if( p && 
57d0: 61 72 67 76 5b 30 5d 20 29 7b 0a 20 20 20 20 78  argv[0] ){.    x
57e0: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 46 28 61   = sqlite3AtoF(a
57f0: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  rgv[0], 0);.    
5800: 70 2d 3e 73 75 6d 20 2b 3d 20 78 3b 0a 20 20 20  p->sum += x;.   
5810: 20 70 2d 3e 73 75 6d 32 20 2b 3d 20 78 2a 78 3b   p->sum2 += x*x;
5820: 0a 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20  .    p->cnt++;. 
5830: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
5840: 20 73 74 64 44 65 76 46 69 6e 61 6c 69 7a 65 28   stdDevFinalize(
5850: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5860: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 64 6f 75  *context){.  dou
5870: 62 6c 65 20 72 4e 20 3d 20 73 71 6c 69 74 65 33  ble rN = sqlite3
5880: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74  _aggregate_count
5890: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 53 74 64  (context);.  Std
58a0: 44 65 76 43 74 78 20 2a 70 20 3d 20 73 71 6c 69  DevCtx *p = sqli
58b0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
58c0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
58d0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
58e0: 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 31 20  ( p && p->cnt>1 
58f0: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 43  ){.    double rC
5900: 6e 74 20 3d 20 63 6e 74 3b 0a 20 20 20 20 73 71  nt = cnt;.    sq
5910: 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74  lite3_set_result
5920: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
5930: 20 0a 20 20 20 20 20 20 20 73 71 72 74 28 28 70   .       sqrt((p
5940: 2d 3e 73 75 6d 32 20 2d 20 70 2d 3e 73 75 6d 2a  ->sum2 - p->sum*
5950: 70 2d 3e 73 75 6d 2f 72 43 6e 74 29 2f 28 72 43  p->sum/rCnt)/(rC
5960: 6e 74 2d 31 2e 30 29 29 29 3b 0a 20 20 7d 0a 7d  nt-1.0)));.  }.}
5970: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
5980: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5990: 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61  ucture keeps tra
59a0: 63 6b 20 6f 66 20 73 74 61 74 65 20 69 6e 66 6f  ck of state info
59b0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  rmation for the.
59c0: 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65  ** count() aggre
59d0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  gate function..*
59e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
59f0: 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e 74 43   CountCtx CountC
5a00: 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75 6e 74  tx;.struct Count
5a10: 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d  Ctx {.  int n;.}
5a20: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  ;../*.** Routine
5a30: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
5a40: 68 65 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65  he count() aggre
5a50: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  gate function..*
5a60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
5a70: 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65 33 5f  untStep(sqlite3_
5a80: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
5a90: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
5aa0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5ab0: 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70  ){.  CountCtx *p
5ac0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
5ad0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
5ae0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
5af0: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61  f(*p));.  if( (a
5b00: 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  rgc==0 || SQLITE
5b10: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
5b20: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
5b30: 5d 29 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20  ])) && p ){.    
5b40: 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20 20 20  p->n++;.  }.}   
5b50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
5b60: 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  ntFinalize(sqlit
5b70: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5b80: 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78  ext){.  CountCtx
5b90: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
5ba0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
5bb0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
5bc0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 73 71 6c  zeof(*p));.  sql
5bd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
5be0: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
5bf0: 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n : 0);.}../*.**
5c00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   This function t
5c10: 72 61 63 6b 73 20 73 74 61 74 65 20 69 6e 66 6f  racks state info
5c20: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
5c30: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 0a  min() and max().
5c40: 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
5c50: 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ctions..*/.typed
5c60: 65 66 20 73 74 72 75 63 74 20 4d 69 6e 4d 61 78  ef struct MinMax
5c70: 43 74 78 20 4d 69 6e 4d 61 78 43 74 78 3b 0a 73  Ctx MinMaxCtx;.s
5c80: 74 72 75 63 74 20 4d 69 6e 4d 61 78 43 74 78 20  truct MinMaxCtx 
5c90: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  {.  char *z;    
5ca0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74       /* The best
5cb0: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61   so far */.  cha
5cc0: 72 20 7a 42 75 66 5b 32 38 5d 3b 20 20 20 2f 2a  r zBuf[28];   /*
5cd0: 20 53 70 61 63 65 20 74 68 61 74 20 63 61 6e 20   Space that can 
5ce0: 62 65 20 75 73 65 64 20 66 6f 72 20 73 74 6f 72  be used for stor
5cf0: 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  age */.};../*.**
5d00: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70   Routines to imp
5d10: 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64  lement min() and
5d20: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
5d30: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
5d40: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61  tatic void minma
5d50: 78 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f  xStep(sqlite3_co
5d60: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
5d70: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
5d80: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
5d90: 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20  .  Mem *pArg  = 
5da0: 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a  (Mem *)argv[0];.
5db0: 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 0a 20    Mem *pBest;.. 
5dc0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
5dd0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
5de0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
5df0: 72 65 74 75 72 6e 3b 0a 20 20 70 42 65 73 74 20  return;.  pBest 
5e00: 3d 20 28 4d 65 6d 20 2a 29 73 71 6c 69 74 65 33  = (Mem *)sqlite3
5e10: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
5e20: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
5e30: 6f 66 28 2a 70 42 65 73 74 29 29 3b 0a 20 20 69  of(*pBest));.  i
5e40: 66 28 20 21 70 42 65 73 74 20 29 20 72 65 74 75  f( !pBest ) retu
5e50: 72 6e 3b 0a 0a 20 20 69 66 28 20 70 42 65 73 74  rn;..  if( pBest
5e60: 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  ->flags ){.    i
5e70: 6e 74 20 6d 61 78 3b 0a 20 20 20 20 69 6e 74 20  nt max;.    int 
5e80: 63 6d 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  cmp;.    CollSeq
5e90: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
5ea0: 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28  3GetFuncCollSeq(
5eb0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 2f 2a  context);.    /*
5ec0: 20 54 68 69 73 20 73 74 65 70 20 66 75 6e 63 74   This step funct
5ed0: 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20  ion is used for 
5ee0: 62 6f 74 68 20 74 68 65 20 6d 69 6e 28 29 20 61  both the min() a
5ef0: 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65 67 61  nd max() aggrega
5f00: 74 65 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  tes,.    ** the 
5f10: 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20  only difference 
5f20: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20  between the two 
5f30: 62 65 69 6e 67 20 74 68 61 74 20 74 68 65 20 73  being that the s
5f40: 65 6e 73 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ense of the.    
5f50: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ** comparison is
5f60: 20 69 6e 76 65 72 74 65 64 2e 20 46 6f 72 20 74   inverted. For t
5f70: 68 65 20 6d 61 78 28 29 20 61 67 67 72 65 67 61  he max() aggrega
5f80: 74 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  te, the.    ** s
5f90: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
5fa0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
5fb0: 72 6e 73 20 28 76 6f 69 64 20 2a 29 2d 31 2e 20  rns (void *)-1. 
5fc0: 46 6f 72 20 6d 69 6e 28 29 20 69 74 0a 20 20 20  For min() it.   
5fd0: 20 2a 2a 20 72 65 74 75 72 6e 73 20 28 76 6f 69   ** returns (voi
5fe0: 64 20 2a 29 64 62 2c 20 77 68 65 72 65 20 64 62  d *)db, where db
5ff0: 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 33 2a   is the sqlite3*
6000: 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
6010: 72 2e 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 66  r..    ** Theref
6020: 6f 72 65 20 74 68 65 20 6e 65 78 74 20 73 74 61  ore the next sta
6030: 74 65 6d 65 6e 74 20 73 65 74 73 20 76 61 72 69  tement sets vari
6040: 61 62 6c 65 20 27 6d 61 78 27 20 74 6f 20 31 20  able 'max' to 1 
6050: 66 6f 72 20 74 68 65 20 6d 61 78 28 29 0a 20 20  for the max().  
6060: 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 2c 20    ** aggregate, 
6070: 6f 72 20 30 20 66 6f 72 20 6d 69 6e 28 29 2e 0a  or 0 for min()..
6080: 20 20 20 20 2a 2f 0a 20 20 20 20 6d 61 78 20 3d      */.    max =
6090: 20 28 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   ((sqlite3_user_
60a0: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3d 3d 28  data(context)==(
60b0: 76 6f 69 64 20 2a 29 2d 31 29 3f 31 3a 30 29 3b  void *)-1)?1:0);
60c0: 0a 20 20 20 20 63 6d 70 20 3d 20 73 71 6c 69 74  .    cmp = sqlit
60d0: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 42 65  e3MemCompare(pBe
60e0: 73 74 2c 20 70 41 72 67 2c 20 70 43 6f 6c 6c 29  st, pArg, pColl)
60f0: 3b 0a 20 20 20 20 69 66 28 20 28 6d 61 78 20 26  ;.    if( (max &
6100: 26 20 63 6d 70 3c 30 29 20 7c 7c 20 28 21 6d 61  & cmp<0) || (!ma
6110: 78 20 26 26 20 63 6d 70 3e 30 29 20 29 7b 0a 20  x && cmp>0) ){. 
6120: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6130: 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20 70  MemCopy(pBest, p
6140: 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Arg);.    }.  }e
6150: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
6160: 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73  VdbeMemCopy(pBes
6170: 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  t, pArg);.  }.}.
6180: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d  static void minM
6190: 61 78 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  axFinalize(sqlit
61a0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
61b0: 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ext){.  sqlite3_
61c0: 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20 70  value *pRes;.  p
61d0: 52 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Res = (sqlite3_v
61e0: 61 6c 75 65 20 2a 29 73 71 6c 69 74 65 33 5f 61  alue *)sqlite3_a
61f0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
6200: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
6210: 28 4d 65 6d 29 29 3b 0a 20 20 69 66 28 20 70 52  (Mem));.  if( pR
6220: 65 73 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  es->flags ){.   
6230: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6240: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 70  value(context, p
6250: 52 65 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Res);.  }.  sqli
6260: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
6270: 65 28 70 52 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  e(pRes);.}.../*.
6280: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6290: 20 72 65 67 69 73 74 65 72 65 64 20 61 6c 6c 20   registered all 
62a0: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 43 20 66  of the above C f
62b0: 75 6e 63 74 69 6f 6e 73 20 61 73 20 53 51 4c 0a  unctions as SQL.
62c0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  ** functions.  T
62d0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  his should be th
62e0: 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 20 69  e only routine i
62f0: 6e 20 74 68 69 73 20 66 69 6c 65 20 77 69 74 68  n this file with
6300: 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e  .** external lin
6310: 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  kage..*/.void sq
6320: 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69  lite3RegisterBui
6330: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73 71  ltinFunctions(sq
6340: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74  lite3 *db){.  st
6350: 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
6360: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
6370: 20 20 20 20 20 73 69 67 6e 65 64 20 63 68 61 72       signed char
6380: 20 6e 41 72 67 3b 0a 20 20 20 20 20 75 38 20 61   nArg;.     u8 a
6390: 72 67 54 79 70 65 3b 20 20 20 20 20 20 20 20 20  rgType;         
63a0: 20 20 2f 2a 20 30 3a 20 6e 6f 6e 65 2e 20 20 31    /* 0: none.  1
63b0: 3a 20 64 62 20 20 32 3a 20 28 2d 31 29 20 2a 2f  : db  2: (-1) */
63c0: 0a 20 20 20 20 20 75 38 20 65 54 65 78 74 52 65  .     u8 eTextRe
63d0: 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31  p;          /* 1
63e0: 3a 20 55 54 46 2d 31 36 2e 20 20 30 3a 20 55 54  : UTF-16.  0: UT
63f0: 46 2d 38 20 2a 2f 0a 20 20 20 20 20 75 38 20 6e  F-8 */.     u8 n
6400: 65 65 64 43 6f 6c 6c 53 65 71 3b 0a 20 20 20 20  eedCollSeq;.    
6410: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
6420: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
6430: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
6440: 65 20 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63  e **);.  } aFunc
6450: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6d  s[] = {.    { "m
6460: 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  in",            
6470: 20 20 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45     -1, 0, SQLITE
6480: 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 6d 69 6e  _UTF8,    1, min
6490: 6d 61 78 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  maxFunc },.    {
64a0: 20 22 6d 69 6e 22 2c 20 20 20 20 20 20 20 20 20   "min",         
64b0: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c         0, 0, SQL
64c0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20  ITE_UTF8,    1, 
64d0: 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  0          },.  
64e0: 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 20 20    { "max",      
64f0: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 32 2c 20           -1, 2, 
6500: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
6510: 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 7d 2c  1, minmaxFunc },
6520: 0a 20 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20  .    { "max",   
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
6540: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
6550: 20 20 20 31 2c 20 30 20 20 20 20 20 20 20 20 20     1, 0         
6560: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 79 70 65 6f   },.    { "typeo
6570: 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  f",             
6580: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
6590: 38 2c 20 20 20 20 30 2c 20 74 79 70 65 6f 66 46  8,    0, typeofF
65a0: 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65  unc },.    { "le
65b0: 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20  ngth",          
65c0: 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f     1, 0, SQLITE_
65d0: 55 54 46 38 2c 20 20 20 20 30 2c 20 6c 65 6e 67  UTF8,    0, leng
65e0: 74 68 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  thFunc },.    { 
65f0: 22 73 75 62 73 74 72 22 2c 20 20 20 20 20 20 20  "substr",       
6600: 20 20 20 20 20 20 33 2c 20 30 2c 20 53 51 4c 49        3, 0, SQLI
6610: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73  TE_UTF8,    0, s
6620: 75 62 73 74 72 46 75 6e 63 20 7d 2c 0a 20 20 20  ubstrFunc },.   
6630: 20 7b 20 22 73 75 62 73 74 72 22 2c 20 20 20 20   { "substr",    
6640: 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20 53           3, 0, S
6650: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30  QLITE_UTF16LE, 0
6660: 2c 20 73 71 6c 69 74 65 33 75 74 66 31 36 53 75  , sqlite3utf16Su
6670: 62 73 74 72 20 7d 2c 0a 20 20 20 20 7b 20 22 61  bstr },.    { "a
6680: 62 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  bs",            
6690: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
66a0: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 61 62 73  _UTF8,    0, abs
66b0: 46 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b  Func    },.    {
66c0: 20 22 72 6f 75 6e 64 22 2c 20 20 20 20 20 20 20   "round",       
66d0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c         1, 0, SQL
66e0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
66f0: 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c 0a 20 20  roundFunc  },.  
6700: 20 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 20 20    { "round",    
6710: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
6720: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
6730: 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c  0, roundFunc  },
6740: 0a 20 20 20 20 7b 20 22 75 70 70 65 72 22 2c 20  .    { "upper", 
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
6760: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
6770: 20 20 20 30 2c 20 75 70 70 65 72 46 75 6e 63 20     0, upperFunc 
6780: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 77 65 72   },.    { "lower
6790: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
67a0: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
67b0: 38 2c 20 20 20 20 30 2c 20 6c 6f 77 65 72 46 75  8,    0, lowerFu
67c0: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f  nc  },.    { "co
67d0: 61 6c 65 73 63 65 22 2c 20 20 20 20 20 20 20 20  alesce",        
67e0: 20 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f    -1, 0, SQLITE_
67f0: 55 54 46 38 2c 20 20 20 20 30 2c 20 69 66 6e 75  UTF8,    0, ifnu
6800: 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  llFunc },.    { 
6810: 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20 20 20  "coalesce",     
6820: 20 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c 49        0, 0, SQLI
6830: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 30  TE_UTF8,    0, 0
6840: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6850: 20 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20   { "coalesce",  
6860: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
6870: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
6880: 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  , 0          },.
6890: 20 20 20 20 7b 20 22 69 66 6e 75 6c 6c 22 2c 20      { "ifnull", 
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
68b0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
68c0: 20 20 31 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20    1, ifnullFunc 
68d0: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6e 64 6f 6d  },.    { "random
68e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 31  ",            -1
68f0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
6900: 2c 20 20 20 20 30 2c 20 72 61 6e 64 6f 6d 46 75  ,    0, randomFu
6910: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 69 6b  nc },.    { "lik
6920: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6930: 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    2, 0, SQLITE_U
6940: 54 46 38 2c 20 20 20 20 30 2c 20 6c 69 6b 65 46  TF8,    0, likeF
6950: 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  unc   },.    { "
6960: 67 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  glob",          
6970: 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54       2, 0, SQLIT
6980: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 67 6c  E_UTF8,    0, gl
6990: 6f 62 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20  obFunc   },.    
69a0: 7b 20 22 6e 75 6c 6c 69 66 22 2c 20 20 20 20 20  { "nullif",     
69b0: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51          2, 0, SQ
69c0: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
69d0: 20 6e 75 6c 6c 69 66 46 75 6e 63 20 7d 2c 0a 20   nullifFunc },. 
69e0: 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 76 65 72     { "sqlite_ver
69f0: 73 69 6f 6e 22 2c 20 20 20 20 20 30 2c 20 30 2c  sion",     0, 0,
6a00: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
6a10: 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 7d   0, versionFunc}
6a20: 2c 0a 20 20 20 20 7b 20 22 71 75 6f 74 65 22 2c  ,.    { "quote",
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
6a40: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
6a50: 20 20 20 20 30 2c 20 71 75 6f 74 65 46 75 6e 63      0, quoteFunc
6a60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 73 74    },.    { "last
6a70: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20  _insert_rowid", 
6a80: 20 30 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54   0, 1, SQLITE_UT
6a90: 46 38 2c 20 20 20 20 30 2c 20 6c 61 73 74 5f 69  F8,    0, last_i
6aa0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 7d 2c 0a 20  nsert_rowid },. 
6ab0: 20 20 20 7b 20 22 63 68 61 6e 67 65 73 22 2c 20     { "changes", 
6ac0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c             0, 1,
6ad0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
6ae0: 20 30 2c 20 63 68 61 6e 67 65 73 20 20 20 20 7d   0, changes    }
6af0: 2c 0a 20 20 20 20 7b 20 22 74 6f 74 61 6c 5f 63  ,.    { "total_c
6b00: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 30 2c  hanges",      0,
6b10: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
6b20: 20 20 20 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61      0, total_cha
6b30: 6e 67 65 73 20 7d 2c 0a 23 69 66 64 65 66 20 53  nges },.#ifdef S
6b40: 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20 20  QLITE_SOUNDEX.  
6b50: 20 20 7b 20 22 73 6f 75 6e 64 65 78 22 2c 20 20    { "soundex",  
6b60: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
6b70: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
6b80: 73 6f 75 6e 64 65 78 46 75 6e 63 7d 2c 0a 23 65  soundexFunc},.#e
6b90: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
6ba0: 54 45 5f 54 45 53 54 0a 20 20 20 20 7b 20 22 72  TE_TEST.    { "r
6bb0: 61 6e 64 73 74 72 22 2c 20 20 20 20 20 20 20 20  andstr",        
6bc0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c         2, 0, SQL
6bd0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 72 61 6e  ITE_UTF8, 0, ran
6be0: 64 53 74 72 20 20 20 20 7d 2c 0a 20 20 20 20 7b  dStr    },.    {
6bf0: 20 22 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f   "test_destructo
6c00: 72 22 2c 20 20 20 20 20 20 20 31 2c 20 31 2c 20  r",       1, 1, 
6c10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
6c20: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 7d  test_destructor}
6c30: 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 64 65  ,.    { "test_de
6c40: 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 22 2c  structor_count",
6c50: 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   0, 0, SQLITE_UT
6c60: 46 38 2c 20 30 2c 20 74 65 73 74 5f 64 65 73 74  F8, 0, test_dest
6c70: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 7d 2c 0a 20  ructor_count},. 
6c80: 20 20 20 7b 20 22 74 65 73 74 5f 61 75 78 64 61     { "test_auxda
6c90: 74 61 22 2c 20 20 20 20 20 20 20 20 20 2d 31 2c  ta",         -1,
6ca0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
6cb0: 20 30 2c 20 74 65 73 74 5f 61 75 78 64 61 74 61   0, test_auxdata
6cc0: 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  },.#endif.  };. 
6cd0: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
6ce0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
6cf0: 3b 0a 20 20 20 20 73 69 67 6e 65 64 20 63 68 61  ;.    signed cha
6d00: 72 20 6e 41 72 67 3b 0a 20 20 20 20 75 38 20 61  r nArg;.    u8 a
6d10: 72 67 54 79 70 65 3b 0a 20 20 20 20 75 38 20 6e  rgType;.    u8 n
6d20: 65 65 64 43 6f 6c 6c 53 65 71 3b 0a 20 20 20 20  eedCollSeq;.    
6d30: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
6d40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
6d50: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
6d60: 2a 2a 29 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a  **);.    void (*
6d70: 78 46 69 6e 61 6c 69 7a 65 29 28 73 71 6c 69 74  xFinalize)(sqlit
6d80: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20  e3_context*);.  
6d90: 7d 20 61 41 67 67 73 5b 5d 20 3d 20 7b 0a 20 20  } aAggs[] = {.  
6da0: 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 31 2c    { "min",    1,
6db0: 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65   0, 1, minmaxSte
6dc0: 70 2c 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c  p,   minMaxFinal
6dd0: 69 7a 65 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61  ize },.    { "ma
6de0: 78 22 2c 20 20 20 20 31 2c 20 32 2c 20 31 2c 20  x",    1, 2, 1, 
6df0: 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 6d 69  minmaxStep,   mi
6e00: 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a  nMaxFinalize },.
6e10: 20 20 20 20 7b 20 22 73 75 6d 22 2c 20 20 20 20      { "sum",    
6e20: 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70  1, 0, 0, sumStep
6e30: 2c 20 20 20 20 20 20 73 75 6d 46 69 6e 61 6c 69  ,      sumFinali
6e40: 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  ze    },.    { "
6e50: 61 76 67 22 2c 20 20 20 20 31 2c 20 30 2c 20 30  avg",    1, 0, 0
6e60: 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20  , sumStep,      
6e70: 61 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20 7d  avgFinalize    }
6e80: 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74 22 2c  ,.    { "count",
6e90: 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74    0, 0, 0, count
6ea0: 53 74 65 70 2c 20 20 20 20 63 6f 75 6e 74 46 69  Step,    countFi
6eb0: 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 20 20 7b  nalize  },.    {
6ec0: 20 22 63 6f 75 6e 74 22 2c 20 20 31 2c 20 30 2c   "count",  1, 0,
6ed0: 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20   0, countStep,  
6ee0: 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20    countFinalize 
6ef0: 20 7d 2c 0a 23 69 66 20 30 0a 20 20 20 20 7b 20   },.#if 0.    { 
6f00: 22 73 74 64 64 65 76 22 2c 20 31 2c 20 30 2c 20  "stddev", 1, 0, 
6f10: 73 74 64 44 65 76 53 74 65 70 2c 20 20 20 73 74  stdDevStep,   st
6f20: 64 44 65 76 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a  dDevFinalize },.
6f30: 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e  #endif.  };.  in
6f40: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  t i;..  for(i=0;
6f50: 20 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 73   i<sizeof(aFuncs
6f60: 29 2f 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b  )/sizeof(aFuncs[
6f70: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76  0]); i++){.    v
6f80: 6f 69 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20  oid *pArg = 0;. 
6f90: 20 20 20 73 77 69 74 63 68 28 20 61 46 75 6e 63     switch( aFunc
6fa0: 73 5b 69 5d 2e 61 72 67 54 79 70 65 20 29 7b 0a  s[i].argType ){.
6fb0: 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 41        case 1: pA
6fc0: 72 67 20 3d 20 64 62 3b 20 62 72 65 61 6b 3b 0a  rg = db; break;.
6fd0: 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 41        case 2: pA
6fe0: 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 28 2d 31  rg = (void *)(-1
6ff0: 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  ); break;.    }.
7000: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
7010: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7020: 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c  aFuncs[i].zName,
7030: 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c   aFuncs[i].nArg,
7040: 0a 20 20 20 20 20 20 20 20 61 46 75 6e 63 73 5b  .        aFuncs[
7050: 69 5d 2e 65 54 65 78 74 52 65 70 2c 20 70 41 72  i].eTextRep, pAr
7060: 67 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 78 46 75  g, aFuncs[i].xFu
7070: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nc, 0, 0);.    i
7080: 66 28 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 65 65  f( aFuncs[i].nee
7090: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
70a0: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
70b0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
70c0: 6e 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63  nction(db, aFunc
70d0: 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20  s[i].zName, .   
70e0: 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 61 46         strlen(aF
70f0: 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 29 2c 20  uncs[i].zName), 
7100: 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 20  aFuncs[i].nArg, 
7110: 61 46 75 6e 63 73 5b 69 5d 2e 65 54 65 78 74 52  aFuncs[i].eTextR
7120: 65 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ep, 0);.      if
7130: 28 20 70 46 75 6e 63 20 26 26 20 61 46 75 6e 63  ( pFunc && aFunc
7140: 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71  s[i].needCollSeq
7150: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 75 6e   ){.        pFun
7160: 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d  c->needCollSeq =
7170: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7180: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
7190: 20 69 3c 73 69 7a 65 6f 66 28 61 41 67 67 73 29   i<sizeof(aAggs)
71a0: 2f 73 69 7a 65 6f 66 28 61 41 67 67 73 5b 30 5d  /sizeof(aAggs[0]
71b0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69  ); i++){.    voi
71c0: 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 20  d *pArg = 0;.   
71d0: 20 73 77 69 74 63 68 28 20 61 41 67 67 73 5b 69   switch( aAggs[i
71e0: 5d 2e 61 72 67 54 79 70 65 20 29 7b 0a 20 20 20  ].argType ){.   
71f0: 20 20 20 63 61 73 65 20 31 3a 20 70 41 72 67 20     case 1: pArg 
7200: 3d 20 64 62 3b 20 62 72 65 61 6b 3b 0a 20 20 20  = db; break;.   
7210: 20 20 20 63 61 73 65 20 32 3a 20 70 41 72 67 20     case 2: pArg 
7220: 3d 20 28 76 6f 69 64 20 2a 29 28 2d 31 29 3b 20  = (void *)(-1); 
7230: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7240: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7250: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 41 67  function(db, aAg
7260: 67 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 41 67  gs[i].zName, aAg
7270: 67 73 5b 69 5d 2e 6e 41 72 67 2c 20 53 51 4c 49  gs[i].nArg, SQLI
7280: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
7290: 20 20 70 41 72 67 2c 20 30 2c 20 61 41 67 67 73    pArg, 0, aAggs
72a0: 5b 69 5d 2e 78 53 74 65 70 2c 20 61 41 67 67 73  [i].xStep, aAggs
72b0: 5b 69 5d 2e 78 46 69 6e 61 6c 69 7a 65 29 3b 0a  [i].xFinalize);.
72c0: 20 20 20 20 69 66 28 20 61 41 67 67 73 5b 69 5d      if( aAggs[i]
72d0: 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a  .needCollSeq ){.
72e0: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
72f0: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
7300: 6e 64 46 75 6e 63 74 69 6f 6e 28 20 64 62 2c 20  ndFunction( db, 
7310: 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a  aAggs[i].zName,.
7320: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
7330: 28 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65 29  (aAggs[i].zName)
7340: 2c 20 61 41 67 67 73 5b 69 5d 2e 6e 41 72 67 2c  , aAggs[i].nArg,
7350: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
7360: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e  ;.      if( pFun
7370: 63 20 26 26 20 61 41 67 67 73 5b 69 5d 2e 6e 65  c && aAggs[i].ne
7380: 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
7390: 20 20 20 20 20 70 46 75 6e 63 2d 3e 6e 65 65 64       pFunc->need
73a0: 43 6f 6c 6c 53 65 71 20 3d 20 31 3b 0a 20 20 20  CollSeq = 1;.   
73b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
73c0: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
73d0: 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69 6f 6e  DateTimeFunction
73e0: 73 28 64 62 29 3b 0a 7d 0a                       s(db);.}.