/ Hex Artifact Content
Login

Artifact 25f1e5710b71cb345b492a18088f546188599f6b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 32 20 46 65 62 72 75  /*.** 2002 Febru
0010: 61 72 79 20 32 33 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 23.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
0190: 43 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  C functions that
01a0: 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
01b0: 75 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69  us SQL.** functi
01c0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 20 20  ons of SQLite.  
01d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
01e0: 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72 74 65  only one exporte
01f0: 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  d symbol in this
0200: 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75 6e 63   file - the func
0210: 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65 52 65  tion.** sqliteRe
0220: 67 69 73 74 65 72 42 75 69 6c 64 69 6e 46 75 6e  gisterBuildinFun
0230: 63 74 69 6f 6e 73 28 29 20 66 6f 75 6e 64 20 61  ctions() found a
0240: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
0250: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 41 6c 6c  the file..** All
0260: 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
0270: 66 69 6c 65 20 73 63 6f 70 65 2e 0a 2a 2a 0a 2a  file scope..**.*
0280: 2a 20 24 49 64 3a 20 66 75 6e 63 2e 63 2c 76 20  * $Id: func.c,v 
0290: 31 2e 31 31 33 20 32 30 30 35 2f 31 32 2f 30 39  1.113 2005/12/09
02a0: 20 32 30 3a 30 32 3a 30 35 20 64 72 68 20 45 78   20:02:05 drh Ex
02b0: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
02c0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
02d0: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
02e0: 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 3c 6d 61  ./* #include <ma
02f0: 74 68 2e 68 3e 20 2a 2f 0a 23 69 6e 63 6c 75 64  th.h> */.#includ
0300: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
0310: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0320: 0a 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49  .#include "vdbeI
0330: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
0340: 6f 73 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  os.h"../*.** Ret
0350: 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  urn the collatin
0360: 67 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  g function assoc
0370: 69 61 74 65 64 20 77 69 74 68 20 61 20 66 75 6e  iated with a fun
0380: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
0390: 20 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65   CollSeq *sqlite
03a0: 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28  3GetFuncCollSeq(
03b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
03c0: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 72 65 74  *context){.  ret
03d0: 75 72 6e 20 63 6f 6e 74 65 78 74 2d 3e 70 43 6f  urn context->pCo
03e0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ll;.}../*.** Imp
03f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0400: 68 65 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  he non-aggregate
0410: 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29   min() and max()
0420: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2f 0a 73 74   functions.*/.st
0430: 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78  atic void minmax
0440: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
0450: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0460: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
0470: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0480: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  argv.){.  int i;
0490: 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 20 20 20 20  .  int mask;    
04a0: 2f 2a 20 30 20 66 6f 72 20 6d 69 6e 28 29 20 6f  /* 0 for min() o
04b0: 72 20 30 78 66 66 66 66 66 66 66 66 20 66 6f 72  r 0xffffffff for
04c0: 20 6d 61 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20   max() */.  int 
04d0: 69 42 65 73 74 3b 0a 20 20 43 6f 6c 6c 53 65 71  iBest;.  CollSeq
04e0: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66 28 20   *pColl;..  if( 
04f0: 61 72 67 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  argc==0 ) return
0500: 3b 0a 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69 74  ;.  mask = sqlit
0510: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
0520: 74 65 78 74 29 3d 3d 30 20 3f 20 30 20 3a 20 2d  text)==0 ? 0 : -
0530: 31 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  1;.  pColl = sql
0540: 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53  ite3GetFuncCollS
0550: 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61  eq(context);.  a
0560: 73 73 65 72 74 28 20 70 43 6f 6c 6c 20 29 3b 0a  ssert( pColl );.
0570: 20 20 61 73 73 65 72 74 28 20 6d 61 73 6b 3d 3d    assert( mask==
0580: 2d 31 20 7c 7c 20 6d 61 73 6b 3d 3d 30 20 29 3b  -1 || mask==0 );
0590: 0a 20 20 69 42 65 73 74 20 3d 20 30 3b 0a 20 20  .  iBest = 0;.  
05a0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
05b0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
05c0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72  =SQLITE_NULL ) r
05d0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 31  eturn;.  for(i=1
05e0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
05f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
0600: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
0610: 69 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  i])==SQLITE_NULL
0620: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
0630: 66 28 20 28 73 71 6c 69 74 65 33 4d 65 6d 43 6f  f( (sqlite3MemCo
0640: 6d 70 61 72 65 28 61 72 67 76 5b 69 42 65 73 74  mpare(argv[iBest
0650: 5d 2c 20 61 72 67 76 5b 69 5d 2c 20 70 43 6f 6c  ], argv[i], pCol
0660: 6c 29 5e 6d 61 73 6b 29 3e 3d 30 20 29 7b 0a 20  l)^mask)>=0 ){. 
0670: 20 20 20 20 20 69 42 65 73 74 20 3d 20 69 3b 0a       iBest = i;.
0680: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
0690: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
06a0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 69  (context, argv[i
06b0: 42 65 73 74 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Best]);.}../*.**
06c0: 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65   Return the type
06d0: 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
06e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
06f0: 20 74 79 70 65 6f 66 46 75 6e 63 28 0a 20 20 73   typeofFunc(.  s
0700: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
0710: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
0720: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
0730: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
0740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
0750: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71   0;.  switch( sq
0760: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
0770: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
0780: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
0790: 4c 3a 20 20 20 20 7a 20 3d 20 22 6e 75 6c 6c 22  L:    z = "null"
07a0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
07b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
07c0: 47 45 52 3a 20 7a 20 3d 20 22 69 6e 74 65 67 65  GER: z = "intege
07d0: 72 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  r"; break;.    c
07e0: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
07f0: 20 20 20 20 7a 20 3d 20 22 74 65 78 74 22 3b 20      z = "text"; 
0800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0810: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
0820: 20 20 20 7a 20 3d 20 22 72 65 61 6c 22 3b 20 20     z = "real";  
0830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0840: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 20  e SQLITE_BLOB:  
0850: 20 20 7a 20 3d 20 22 62 6c 6f 62 22 3b 20 20 20    z = "blob";   
0860: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71   break;.  }.  sq
0870: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
0880: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d 31  t(context, z, -1
0890: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
08a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
08b0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
08c0: 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e 63 74  e length() funct
08d0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
08e0: 69 64 20 6c 65 6e 67 74 68 46 75 6e 63 28 0a 20  id lengthFunc(. 
08f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
0900: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
0910: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
0920: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
0930: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61  .  int len;..  a
0940: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
0950: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
0960: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
0970: 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63  rgv[0]) ){.    c
0980: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
0990: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
09a0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
09b0: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
09c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
09d0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
09e0: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
09f0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
0a00: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
0a10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
0a20: 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
0a30: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
0a40: 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  ned char *z = sq
0a50: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
0a60: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
0a70: 20 66 6f 72 28 6c 65 6e 3d 30 3b 20 2a 7a 3b 20   for(len=0; *z; 
0a80: 7a 2b 2b 29 7b 20 69 66 28 20 28 30 78 63 30 26  z++){ if( (0xc0&
0a90: 2a 7a 29 21 3d 30 78 38 30 20 29 20 6c 65 6e 2b  *z)!=0x80 ) len+
0aa0: 2b 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  +; }.      sqlit
0ab0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
0ac0: 6e 74 65 78 74 2c 20 6c 65 6e 29 3b 0a 20 20 20  ntext, len);.   
0ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0ae0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
0af0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
0b00: 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74  ult_null(context
0b10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0b20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0b30: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
0b40: 6e 20 6f 66 20 74 68 65 20 61 62 73 28 29 20 66  n of the abs() f
0b50: 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  unction.*/.stati
0b60: 63 20 76 6f 69 64 20 61 62 73 46 75 6e 63 28 73  c void absFunc(s
0b70: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
0b80: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
0b90: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
0ba0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 61 73 73 65   **argv){.  asse
0bb0: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
0bc0: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
0bd0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
0be0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65  [0]) ){.    case
0bf0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
0c00: 20 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56 61   {.      i64 iVa
0c10: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
0c20: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
0c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 56 61 6c  ;.      if( iVal
0c40: 3c 30 20 29 20 69 56 61 6c 20 3d 20 69 56 61 6c  <0 ) iVal = iVal
0c50: 20 2a 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c   * -1;.      sql
0c60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
0c70: 34 28 63 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29  4(context, iVal)
0c80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0c90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
0ca0: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
0cb0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
0cc0: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
0cd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0ce0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
0cf0: 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20   {.      double 
0d00: 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  rVal = sqlite3_v
0d10: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
0d20: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [0]);.      if( 
0d30: 72 56 61 6c 3c 30 20 29 20 72 56 61 6c 20 3d 20  rVal<0 ) rVal = 
0d40: 72 56 61 6c 20 2a 20 2d 31 2e 30 3b 0a 20 20 20  rVal * -1.0;.   
0d50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
0d60: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
0d70: 2c 20 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 62  , rVal);.      b
0d80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
0d90: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
0da0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
0db0: 75 62 73 74 72 28 29 20 66 75 6e 63 74 69 6f 6e  ubstr() function
0dc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0dd0: 73 75 62 73 74 72 46 75 6e 63 28 0a 20 20 73 71  substrFunc(.  sq
0de0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
0df0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
0e00: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
0e10: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
0e20: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
0e30: 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20  har *z;.  const 
0e40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
0e50: 32 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  2;.  int i;.  in
0e60: 74 20 70 31 2c 20 70 32 2c 20 6c 65 6e 3b 0a 0a  t p1, p2, len;..
0e70: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
0e80: 33 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  3 );.  z = sqlit
0e90: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
0ea0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 3d  gv[0]);.  if( z=
0eb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
0ec0: 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  1 = sqlite3_valu
0ed0: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a  e_int(argv[1]);.
0ee0: 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 76    p2 = sqlite3_v
0ef0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d  alue_int(argv[2]
0f00: 29 3b 0a 20 20 66 6f 72 28 6c 65 6e 3d 30 2c 20  );.  for(len=0, 
0f10: 7a 32 3d 7a 3b 20 2a 7a 32 3b 20 7a 32 2b 2b 29  z2=z; *z2; z2++)
0f20: 7b 20 69 66 28 20 28 30 78 63 30 26 2a 7a 32 29  { if( (0xc0&*z2)
0f30: 21 3d 30 78 38 30 20 29 20 6c 65 6e 2b 2b 3b 20  !=0x80 ) len++; 
0f40: 7d 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a  }.  if( p1<0 ){.
0f50: 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20      p1 += len;. 
0f60: 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20     if( p1<0 ){. 
0f70: 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20       p2 += p1;. 
0f80: 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20 20 20       p1 = 0;.   
0f90: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
0fa0: 31 3e 30 20 29 7b 0a 20 20 20 20 70 31 2d 2d 3b  1>0 ){.    p1--;
0fb0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 31 2b 70 32  .  }.  if( p1+p2
0fc0: 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 70 32 20 3d  >len ){.    p2 =
0fd0: 20 6c 65 6e 2d 70 31 3b 0a 20 20 7d 0a 20 20 66   len-p1;.  }.  f
0fe0: 6f 72 28 69 3d 30 3b 20 69 3c 70 31 20 26 26 20  or(i=0; i<p1 && 
0ff0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
1000: 69 66 28 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d  if( (z[i]&0xc0)=
1010: 3d 30 78 38 30 20 29 20 70 31 2b 2b 3b 0a 20 20  =0x80 ) p1++;.  
1020: 7d 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20  }.  while( z[i] 
1030: 26 26 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d 3d  && (z[i]&0xc0)==
1040: 30 78 38 30 20 29 7b 20 69 2b 2b 3b 20 70 31 2b  0x80 ){ i++; p1+
1050: 2b 3b 20 7d 0a 20 20 66 6f 72 28 3b 20 69 3c 70  +; }.  for(; i<p
1060: 31 2b 70 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b  1+p2 && z[i]; i+
1070: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 5b 69  +){.    if( (z[i
1080: 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  ]&0xc0)==0x80 ) 
1090: 70 32 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  p2++;.  }.  whil
10a0: 65 28 20 7a 5b 69 5d 20 26 26 20 28 7a 5b 69 5d  e( z[i] && (z[i]
10b0: 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 20  &0xc0)==0x80 ){ 
10c0: 69 2b 2b 3b 20 70 32 2b 2b 3b 20 7d 0a 20 20 69  i++; p2++; }.  i
10d0: 66 28 20 70 32 3c 30 20 29 20 70 32 20 3d 20 30  f( p2<0 ) p2 = 0
10e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
10f0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1100: 20 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20   (char*)&z[p1], 
1110: 70 32 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  p2, SQLITE_TRANS
1120: 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  IENT);.}../*.** 
1130: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1140: 66 20 74 68 65 20 72 6f 75 6e 64 28 29 20 66 75  f the round() fu
1150: 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  nction.*/.static
1160: 20 76 6f 69 64 20 72 6f 75 6e 64 46 75 6e 63 28   void roundFunc(
1170: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1180: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
1190: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
11a0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  e **argv){.  int
11b0: 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65   n = 0;.  double
11c0: 20 72 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   r;.  char zBuf[
11d0: 35 30 30 5d 3b 20 20 2f 2a 20 6c 61 72 67 65 72  500];  /* larger
11e0: 20 74 68 61 6e 20 74 68 65 20 25 66 20 72 65 70   than the %f rep
11f0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
1200: 68 65 20 6c 61 72 67 65 73 74 20 64 6f 75 62 6c  he largest doubl
1210: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61  e */.  assert( a
1220: 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d  rgc==1 || argc==
1230: 32 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d  2 );.  if( argc=
1240: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51  =2 ){.    if( SQ
1250: 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74  LITE_NULL==sqlit
1260: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
1270: 67 76 5b 31 5d 29 20 29 20 72 65 74 75 72 6e 3b  gv[1]) ) return;
1280: 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
1290: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
12a0: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 33  1]);.    if( n>3
12b0: 30 20 29 20 6e 20 3d 20 33 30 3b 0a 20 20 20 20  0 ) n = 30;.    
12c0: 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b  if( n<0 ) n = 0;
12d0: 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
12e0: 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f  E_NULL==sqlite3_
12f0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
1300: 30 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  0]) ) return;.  
1310: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
1320: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d  e_double(argv[0]
1330: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
1340: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1350: 66 29 2c 7a 42 75 66 2c 22 25 2e 2a 66 22 2c 6e  f),zBuf,"%.*f",n
1360: 2c 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  ,r);.  sqlite3_r
1370: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
1380: 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51  xt, zBuf, -1, SQ
1390: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
13a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
13b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
13c0: 75 70 70 65 72 28 29 20 61 6e 64 20 6c 6f 77 65  upper() and lowe
13d0: 72 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  r() SQL function
13e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
13f0: 64 20 75 70 70 65 72 46 75 6e 63 28 73 71 6c 69  d upperFunc(sqli
1400: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1410: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
1420: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1430: 61 72 67 76 29 7b 0a 20 20 75 6e 73 69 67 6e 65  argv){.  unsigne
1440: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  d char *z;.  int
1450: 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31   i;.  if( argc<1
1460: 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d   || SQLITE_NULL=
1470: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
1480: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 72  ype(argv[0]) ) r
1490: 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
14a0: 69 74 65 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65  iteMalloc(sqlite
14b0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
14c0: 67 76 5b 30 5d 29 2b 31 29 3b 0a 20 20 69 66 28  gv[0])+1);.  if(
14d0: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
14e0: 20 20 73 74 72 63 70 79 28 28 63 68 61 72 2a 29    strcpy((char*)
14f0: 7a 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  z, (char*)sqlite
1500: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1510: 76 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28 69 3d  v[0]));.  for(i=
1520: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
1530: 20 20 20 7a 5b 69 5d 20 3d 20 74 6f 75 70 70 65     z[i] = touppe
1540: 72 28 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  r(z[i]);.  }.  s
1550: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
1560: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
1570: 72 2a 29 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  r*)z, -1, SQLITE
1580: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
1590: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 7d 0a  qliteFree(z);.}.
15a0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 77 65  static void lowe
15b0: 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  rFunc(sqlite3_co
15c0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
15d0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
15e0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
15f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1600: 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *z;.  int i;.  
1610: 69 66 28 20 61 72 67 63 3c 31 20 7c 7c 20 53 51  if( argc<1 || SQ
1620: 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74  LITE_NULL==sqlit
1630: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
1640: 67 76 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 3b  gv[0]) ) return;
1650: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c  .  z = sqliteMal
1660: 6c 6f 63 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  loc(sqlite3_valu
1670: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
1680: 2b 31 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  +1);.  if( z==0 
1690: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 74 72 63  ) return;.  strc
16a0: 70 79 28 28 63 68 61 72 2a 29 7a 2c 20 28 63 68  py((char*)z, (ch
16b0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
16c0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29  e_text(argv[0]))
16d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  ;.  for(i=0; z[i
16e0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; i++){.    z[i
16f0: 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 5b 69 5d  ] = tolower(z[i]
1700: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1710: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
1720: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20  text, (char*)z, 
1730: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
1740: 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 46  IENT);.  sqliteF
1750: 72 65 65 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(z);.}../*.**
1760: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1770: 6f 66 20 74 68 65 20 49 46 4e 55 4c 4c 28 29 2c  of the IFNULL(),
1780: 20 4e 56 4c 28 29 2c 20 61 6e 64 20 43 4f 41 4c   NVL(), and COAL
1790: 45 53 43 45 28 29 20 66 75 6e 63 74 69 6f 6e 73  ESCE() functions
17a0: 2e 20 20 0a 2a 2a 20 41 6c 6c 20 74 68 72 65 65  .  .** All three
17b0: 20 64 6f 20 74 68 65 20 73 61 6d 65 20 74 68 69   do the same thi
17c0: 6e 67 2e 20 20 54 68 65 79 20 72 65 74 75 72 6e  ng.  They return
17d0: 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e   the first non-N
17e0: 55 4c 4c 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ULL.** argument.
17f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1800: 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71  ifnullFunc(.  sq
1810: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1820: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
1830: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
1840: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
1850: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1860: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
1870: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
1880: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
1890: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29  ue_type(argv[i])
18a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18b0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
18c0: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 69 5d 29  ontext, argv[i])
18d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
18f0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1900: 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20 52   of random().  R
1910: 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 69  eturn a random i
1920: 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61  nteger.  .*/.sta
1930: 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46  tic void randomF
1940: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1950: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1960: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
1970: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1980: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 3b 0a  rgv.){.  int r;.
1990: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
19a0: 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26  ess(sizeof(r), &
19b0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  r);.  sqlite3_re
19c0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
19d0: 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , r);.}../*.** I
19e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
19f0: 20 74 68 65 20 6c 61 73 74 5f 69 6e 73 65 72 74   the last_insert
1a00: 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75 6e  _rowid() SQL fun
1a10: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75  ction.  The retu
1a20: 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 74  rn.** value is t
1a30: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
1a40: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
1a50: 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66  rt_rowid() API f
1a60: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1a70: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 69 6e 73  ic void last_ins
1a80: 65 72 74 5f 72 6f 77 69 64 28 0a 20 20 73 71 6c  ert_rowid(.  sql
1a90: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1aa0: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
1ab0: 67 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  g, .  sqlite3_va
1ac0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
1ad0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
1ae0: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
1af0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69  context);.  sqli
1b00: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
1b10: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
1b20: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
1b30: 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a  wid(db));.}../*.
1b40: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1b50: 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73  n of the changes
1b60: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  () SQL function.
1b70: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
1b80: 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d  ue is the.** sam
1b90: 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33  e as the sqlite3
1ba0: 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49 20 66  _changes() API f
1bb0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1bc0: 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 73 28  ic void changes(
1bd0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1be0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
1bf0: 6e 74 20 61 72 67 2c 0a 20 20 73 71 6c 69 74 65  nt arg,.  sqlite
1c00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
1c10: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1c20: 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
1c30: 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ata(context);.  
1c40: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1c50: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  nt(context, sqli
1c60: 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29  te3_changes(db))
1c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1c80: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1c90: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29   total_changes()
1ca0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
1cb0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1cc0: 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20   is.** the same 
1cd0: 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  as the sqlite3_t
1ce0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 41  otal_changes() A
1cf0: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
1d00: 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 74 61  static void tota
1d10: 6c 5f 63 68 61 6e 67 65 73 28 0a 20 20 73 71 6c  l_changes(.  sql
1d20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1d30: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
1d40: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1d50: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  e **argv.){.  sq
1d60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
1d70: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
1d80: 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  ntext);.  sqlite
1d90: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
1da0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f  text, sqlite3_to
1db0: 74 61 6c 5f 63 68 61 6e 67 65 73 28 64 62 29 29  tal_changes(db))
1dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72  ;.}../*.** A str
1dd0: 75 63 74 75 72 65 20 64 65 66 69 6e 69 6e 67 20  ucture defining 
1de0: 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f 42 2d 73  how to do GLOB-s
1df0: 74 79 6c 65 20 63 6f 6d 70 61 72 69 73 6f 6e 73  tyle comparisons
1e00: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6d 70  ..*/.struct comp
1e10: 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20 6d  areInfo {.  u8 m
1e20: 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d 61  atchAll;.  u8 ma
1e30: 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61 74  tchOne;.  u8 mat
1e40: 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43 61  chSet;.  u8 noCa
1e50: 73 65 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 63  se;.};..static c
1e60: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
1e70: 61 72 65 49 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f  areInfo globInfo
1e80: 20 3d 20 7b 20 27 2a 27 2c 20 27 3f 27 2c 20 27   = { '*', '?', '
1e90: 5b 27 2c 20 30 20 7d 3b 0a 2f 2a 20 54 68 65 20  [', 0 };./* The 
1ea0: 63 6f 72 72 65 63 74 20 53 51 4c 2d 39 32 20 62  correct SQL-92 b
1eb0: 65 68 61 76 69 6f 72 20 69 73 20 66 6f 72 20 74  ehavior is for t
1ec0: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
1ed0: 20 74 6f 20 69 67 6e 6f 72 65 0a 2a 2a 20 63 61   to ignore.** ca
1ee0: 73 65 2e 20 20 54 68 75 73 20 20 27 61 27 20 4c  se.  Thus  'a' L
1ef0: 49 4b 45 20 27 41 27 20 77 6f 75 6c 64 20 62 65  IKE 'A' would be
1f00: 20 74 72 75 65 2e 20 2a 2f 0a 73 74 61 74 69 63   true. */.static
1f10: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f   const struct co
1f20: 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e  mpareInfo likeIn
1f30: 66 6f 4e 6f 72 6d 20 3d 20 7b 20 27 25 27 2c 20  foNorm = { '%', 
1f40: 27 5f 27 2c 20 20 20 30 2c 20 31 20 7d 3b 0a 2f  '_',   0, 1 };./
1f50: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 41 53 45  * If SQLITE_CASE
1f60: 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 20  _SENSITIVE_LIKE 
1f70: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
1f80: 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   the LIKE operat
1f90: 6f 72 0a 2a 2a 20 69 73 20 63 61 73 65 20 73 65  or.** is case se
1fa0: 6e 73 69 74 69 76 65 20 63 61 75 73 69 6e 67 20  nsitive causing 
1fb0: 27 61 27 20 4c 49 4b 45 20 27 41 27 20 74 6f 20  'a' LIKE 'A' to 
1fc0: 62 65 20 66 61 6c 73 65 20 2a 2f 0a 73 74 61 74  be false */.stat
1fd0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
1fe0: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65  compareInfo like
1ff0: 49 6e 66 6f 41 6c 74 20 3d 20 7b 20 27 25 27 2c  InfoAlt = { '%',
2000: 20 27 5f 27 2c 20 20 20 30 2c 20 30 20 7d 3b 0a   '_',   0, 0 };.
2010: 0a 2f 2a 0a 2a 2a 20 58 20 69 73 20 61 20 70 6f  ./*.** X is a po
2020: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72  inter to the fir
2030: 73 74 20 62 79 74 65 20 6f 66 20 61 20 55 54 46  st byte of a UTF
2040: 2d 38 20 63 68 61 72 61 63 74 65 72 2e 20 20 49  -8 character.  I
2050: 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 58 20 73 6f  ncrement.** X so
2060: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2070: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 61 72  to the next char
2080: 61 63 74 65 72 2e 20 20 54 68 69 73 20 6f 6e 6c  acter.  This onl
2090: 79 20 77 6f 72 6b 73 20 72 69 67 68 74 0a 2a 2a  y works right.**
20a0: 20 69 66 20 58 20 70 6f 69 6e 74 73 20 74 6f 20   if X points to 
20b0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 55 54  a well-formed UT
20c0: 46 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23  F-8 string..*/.#
20d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 4e 65 78  define sqliteNex
20e0: 74 43 68 61 72 28 58 29 20 20 77 68 69 6c 65 28  tChar(X)  while(
20f0: 20 28 30 78 63 30 26 2a 2b 2b 28 58 29 29 3d 3d   (0xc0&*++(X))==
2100: 30 78 38 30 20 29 7b 7d 0a 23 64 65 66 69 6e 65  0x80 ){}.#define
2110: 20 73 71 6c 69 74 65 43 68 61 72 56 61 6c 28 58   sqliteCharVal(X
2120: 29 20 20 20 73 71 6c 69 74 65 33 52 65 61 64 55  )   sqlite3ReadU
2130: 74 66 38 28 58 29 0a 0a 0a 2f 2a 0a 2a 2a 20 43  tf8(X).../*.** C
2140: 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38  ompare two UTF-8
2150: 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75   strings for equ
2160: 61 6c 69 74 79 20 77 68 65 72 65 20 74 68 65 20  ality where the 
2170: 66 69 72 73 74 20 73 74 72 69 6e 67 20 63 61 6e  first string can
2180: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
2190: 62 65 20 61 20 22 67 6c 6f 62 22 20 65 78 70 72  be a "glob" expr
21a0: 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ession.  Return 
21b0: 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65 79  true (1) if they
21c0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
21d0: 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69   and false (0) i
21e0: 66 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65  f they are diffe
21f0: 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  rent..**.** Glob
2200: 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
2210: 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
2220: 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
2230: 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
2240: 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
2250: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
2260: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
2270: 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
2280: 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
2290: 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
22a0: 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
22b0: 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
22c0: 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
22e0: 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
22f0: 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
2300: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
2310: 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
2320: 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
2330: 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e  .** With the [..
2340: 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61  .] and [^...] ma
2350: 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68  tching, a ']' ch
2360: 61 72 61 63 74 65 72 20 63 61 6e 20 62 65 20 69  aracter can be i
2370: 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68  ncluded.** in th
2380: 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67  e list by making
2390: 20 69 74 20 74 68 65 20 66 69 72 73 74 20 63 68   it the first ch
23a0: 61 72 61 63 74 65 72 20 61 66 74 65 72 20 27 5b  aracter after '[
23b0: 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20  ' or '^'.  A.** 
23c0: 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74  range of charact
23d0: 65 72 73 20 63 61 6e 20 62 65 20 73 70 65 63 69  ers can be speci
23e0: 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20  fied using '-'. 
23f0: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61   Example:.** "[a
2400: 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79  -z]" matches any
2410: 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61   single lower-ca
2420: 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d  se letter.  To m
2430: 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65  atch a '-', make
2440: 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20  .** it the last 
2450: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
2460: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   list..**.** Thi
2470: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75  s routine is usu
2480: 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20  ally quick, but 
2490: 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74  can be N**2 in t
24a0: 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a  he worst case..*
24b0: 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f 20 6d  *.** Hints: to m
24c0: 61 74 63 68 20 27 2a 27 20 6f 72 20 27 3f 27 2c  atch '*' or '?',
24d0: 20 70 75 74 20 74 68 65 6d 20 69 6e 20 22 5b 5d   put them in "[]
24e0: 22 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  ".  Like this:.*
24f0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 62 63  *.**         abc
2500: 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20 20 4d 61  [*]xyz        Ma
2510: 74 63 68 65 73 20 22 61 62 63 2a 78 79 7a 22 20  tches "abc*xyz" 
2520: 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20 69  only.*/.static i
2530: 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  nt patternCompar
2540: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  e(.  const u8 *z
2550: 50 61 74 74 65 72 6e 2c 20 20 20 20 20 20 20 20  Pattern,        
2560: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 6c 6f        /* The glo
2570: 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63  b pattern */.  c
2580: 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72 69 6e 67  onst u8 *zString
2590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25a0: 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20 74 6f  /* The string to
25b0: 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
25c0: 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20 20 63   the glob */.  c
25d0: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
25e0: 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20  areInfo *pInfo, 
25f0: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
2600: 62 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 74  bout how to do t
2610: 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  he compare */.  
2620: 63 6f 6e 73 74 20 69 6e 74 20 65 73 63 20 20 20  const int esc   
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63   /* The escape c
2650: 68 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20  haracter */.){. 
2660: 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 63 3b   register int c;
2670: 0a 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20  .  int invert;. 
2680: 20 69 6e 74 20 73 65 65 6e 3b 0a 20 20 69 6e 74   int seen;.  int
2690: 20 63 32 3b 0a 20 20 75 38 20 6d 61 74 63 68 4f   c2;.  u8 matchO
26a0: 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63  ne = pInfo->matc
26b0: 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63 68  hOne;.  u8 match
26c0: 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74  All = pInfo->mat
26d0: 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74 63  chAll;.  u8 matc
26e0: 68 53 65 74 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61  hSet = pInfo->ma
26f0: 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43  tchSet;.  u8 noC
2700: 61 73 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43  ase = pInfo->noC
2710: 61 73 65 3b 20 0a 20 20 69 6e 74 20 70 72 65 76  ase; .  int prev
2720: 45 73 63 61 70 65 20 3d 20 30 3b 20 20 20 20 20  Escape = 0;     
2730: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 70  /* True if the p
2740: 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74 65  revious characte
2750: 72 20 77 61 73 20 27 65 73 63 61 70 65 27 20 2a  r was 'escape' *
2760: 2f 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  /..  while( (c =
2770: 20 2a 7a 50 61 74 74 65 72 6e 29 21 3d 30 20 29   *zPattern)!=0 )
2780: 7b 0a 20 20 20 20 69 66 28 20 21 70 72 65 76 45  {.    if( !prevE
2790: 73 63 61 70 65 20 26 26 20 63 3d 3d 6d 61 74 63  scape && c==matc
27a0: 68 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 77 68  hAll ){.      wh
27b0: 69 6c 65 28 20 28 63 3d 7a 50 61 74 74 65 72 6e  ile( (c=zPattern
27c0: 5b 31 5d 29 20 3d 3d 20 6d 61 74 63 68 41 6c 6c  [1]) == matchAll
27d0: 20 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68 4f 6e   || c == matchOn
27e0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
27f0: 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 29 7b 0a   c==matchOne ){.
2800: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a            if( *z
2810: 53 74 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75  String==0 ) retu
2820: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
2830: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
2840: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
2850: 20 7d 0a 20 20 20 20 20 20 20 20 7a 50 61 74 74   }.        zPatt
2860: 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ern++;.      }. 
2870: 20 20 20 20 20 69 66 28 20 63 20 26 26 20 65 73       if( c && es
2880: 63 20 26 26 20 73 71 6c 69 74 65 33 52 65 61 64  c && sqlite3Read
2890: 55 74 66 38 28 26 7a 50 61 74 74 65 72 6e 5b 31  Utf8(&zPattern[1
28a0: 5d 29 3d 3d 65 73 63 20 29 7b 0a 20 20 20 20 20  ])==esc ){.     
28b0: 20 20 20 75 38 20 63 6f 6e 73 74 20 2a 7a 54 65     u8 const *zTe
28c0: 6d 70 20 3d 20 26 7a 50 61 74 74 65 72 6e 5b 31  mp = &zPattern[1
28d0: 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
28e0: 65 4e 65 78 74 43 68 61 72 28 7a 54 65 6d 70 29  eNextChar(zTemp)
28f0: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 2a 7a  ;.        c = *z
2900: 54 65 6d 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Temp;.      }.  
2910: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
2920: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69  eturn 1;.      i
2930: 66 28 20 63 3d 3d 6d 61 74 63 68 53 65 74 20 29  f( c==matchSet )
2940: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2950: 28 20 65 73 63 3d 3d 30 20 29 3b 20 20 20 2f 2a  ( esc==0 );   /*
2960: 20 54 68 69 73 20 69 73 20 47 4c 4f 42 2c 20 6e   This is GLOB, n
2970: 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20 20  ot LIKE */.     
2980: 20 20 20 77 68 69 6c 65 28 20 2a 7a 53 74 72 69     while( *zStri
2990: 6e 67 20 26 26 20 70 61 74 74 65 72 6e 43 6f 6d  ng && patternCom
29a0: 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31  pare(&zPattern[1
29b0: 5d 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c  ],zString,pInfo,
29c0: 65 73 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  esc)==0 ){.     
29d0: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
29e0: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
29f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a00: 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 21  return *zString!
2a10: 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  =0;.      }else{
2a20: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
2a30: 28 63 32 20 3d 20 2a 7a 53 74 72 69 6e 67 29 21  (c2 = *zString)!
2a40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2a50: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
2a60: 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73            c2 = s
2a70: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
2a80: 65 72 5b 63 32 5d 3b 0a 20 20 20 20 20 20 20 20  er[c2];.        
2a90: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
2aa0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
2ac0: 65 28 20 63 32 20 21 3d 20 30 20 26 26 20 63 32  e( c2 != 0 && c2
2ad0: 20 21 3d 20 63 20 29 7b 20 63 32 20 3d 20 73 71   != c ){ c2 = sq
2ae0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
2af0: 72 5b 2a 2b 2b 7a 53 74 72 69 6e 67 5d 3b 20 7d  r[*++zString]; }
2b00: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2b10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  {.            wh
2b20: 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26 20  ile( c2 != 0 && 
2b30: 63 32 20 21 3d 20 63 20 29 7b 20 63 32 20 3d 20  c2 != c ){ c2 = 
2b40: 2a 2b 2b 7a 53 74 72 69 6e 67 3b 20 7d 0a 20 20  *++zString; }.  
2b50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b60: 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20      if( c2==0 ) 
2b70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2b80: 20 20 20 20 69 66 28 20 70 61 74 74 65 72 6e 43      if( patternC
2b90: 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e  ompare(&zPattern
2ba0: 5b 31 5d 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66  [1],zString,pInf
2bb0: 6f 2c 65 73 63 29 20 29 20 72 65 74 75 72 6e 20  o,esc) ) return 
2bc0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
2bd0: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
2be0: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ing);.        }.
2bf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
2c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2c10: 6c 73 65 20 69 66 28 20 21 70 72 65 76 45 73 63  lse if( !prevEsc
2c20: 61 70 65 20 26 26 20 63 3d 3d 6d 61 74 63 68 4f  ape && c==matchO
2c30: 6e 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ne ){.      if( 
2c40: 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29 20 72 65  *zString==0 ) re
2c50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 71  turn 0;.      sq
2c60: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74  liteNextChar(zSt
2c70: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 7a 50 61  ring);.      zPa
2c80: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 7d 65 6c  ttern++;.    }el
2c90: 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 53  se if( c==matchS
2ca0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
2cb0: 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
2cc0: 20 20 20 61 73 73 65 72 74 28 20 65 73 63 3d 3d     assert( esc==
2cd0: 30 20 29 3b 20 20 20 20 2f 2a 20 54 68 69 73 20  0 );    /* This 
2ce0: 6f 6e 6c 79 20 6f 63 63 75 72 73 20 66 6f 72 20  only occurs for 
2cf0: 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a  GLOB, not LIKE *
2d00: 2f 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30  /.      seen = 0
2d10: 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d  ;.      invert =
2d20: 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 73 71   0;.      c = sq
2d30: 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 53 74 72  liteCharVal(zStr
2d40: 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ing);.      if( 
2d50: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
2d60: 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 2b 2b 7a  .      c2 = *++z
2d70: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 69  Pattern;.      i
2d80: 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 20 69 6e  f( c2=='^' ){ in
2d90: 76 65 72 74 20 3d 20 31 3b 20 63 32 20 3d 20 2a  vert = 1; c2 = *
2da0: 2b 2b 7a 50 61 74 74 65 72 6e 3b 20 7d 0a 20 20  ++zPattern; }.  
2db0: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20      if( c2==']' 
2dc0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
2dd0: 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31  ==']' ) seen = 1
2de0: 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  ;.        c2 = *
2df0: 2b 2b 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20  ++zPattern;.    
2e00: 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
2e10: 20 28 63 32 20 3d 20 73 71 6c 69 74 65 43 68 61   (c2 = sqliteCha
2e20: 72 56 61 6c 28 7a 50 61 74 74 65 72 6e 29 29 21  rVal(zPattern))!
2e30: 3d 30 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b  =0 && c2!=']' ){
2e40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
2e50: 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e  ='-' && zPattern
2e60: 5b 31 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74  [1]!=']' && zPat
2e70: 74 65 72 6e 5b 31 5d 21 3d 30 20 26 26 20 70 72  tern[1]!=0 && pr
2e80: 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
2e90: 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b       zPattern++;
2ea0: 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
2eb0: 73 71 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50  sqliteCharVal(zP
2ec0: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20  attern);.       
2ed0: 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f     if( c>=prior_
2ee0: 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65  c && c<=c2 ) see
2ef0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
2f00: 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20   prior_c = 0;.  
2f10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2f20: 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20  c==c2 ){.       
2f30: 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20     seen = 1;.   
2f40: 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
2f50: 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   c2;.        }el
2f60: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72  se{.          pr
2f70: 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20  ior_c = c2;.    
2f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2f90: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 50 61  liteNextChar(zPa
2fa0: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ttern);.      }.
2fb0: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
2fc0: 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72  || (seen ^ inver
2fd0: 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  t)==0 ) return 0
2fe0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65  ;.      sqliteNe
2ff0: 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b  xtChar(zString);
3000: 0a 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b  .      zPattern+
3010: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
3020: 20 65 73 63 20 26 26 20 21 70 72 65 76 45 73 63   esc && !prevEsc
3030: 61 70 65 20 26 26 20 73 71 6c 69 74 65 33 52 65  ape && sqlite3Re
3040: 61 64 55 74 66 38 28 7a 50 61 74 74 65 72 6e 29  adUtf8(zPattern)
3050: 3d 3d 65 73 63 29 7b 0a 20 20 20 20 20 20 70 72  ==esc){.      pr
3060: 65 76 45 73 63 61 70 65 20 3d 20 31 3b 0a 20 20  evEscape = 1;.  
3070: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
3080: 61 72 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  ar(zPattern);.  
3090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
30a0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
30b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
30c0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 20  UpperToLower[c] 
30d0: 21 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54  != sqlite3UpperT
30e0: 6f 4c 6f 77 65 72 5b 2a 7a 53 74 72 69 6e 67 5d  oLower[*zString]
30f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
3100: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3110: 20 20 69 66 28 20 63 20 21 3d 20 2a 7a 53 74 72    if( c != *zStr
3120: 69 6e 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ing ) return 0;.
3130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50        }.      zP
3140: 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20  attern++;.      
3150: 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20 20 20 20 20  zString++;.     
3160: 20 70 72 65 76 45 73 63 61 70 65 20 3d 20 30 3b   prevEscape = 0;
3170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3180: 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 3b  urn *zString==0;
3190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  .}../*.** Count 
31a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
31b0: 6d 65 73 20 74 68 61 74 20 74 68 65 20 4c 49 4b  mes that the LIK
31c0: 45 20 6f 70 65 72 61 74 6f 72 20 28 6f 72 20 47  E operator (or G
31d0: 4c 4f 42 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  LOB which is.** 
31e0: 6a 75 73 74 20 61 20 76 61 72 69 61 74 69 6f 6e  just a variation
31f0: 20 6f 66 20 4c 49 4b 45 29 20 67 65 74 73 20 63   of LIKE) gets c
3200: 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
3210: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
3220: 0a 2a 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  .** only..*/.#if
3230: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3240: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65  int sqlite3_like
3250: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
3260: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  if.../*.** Imple
3270: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
3280: 20 6c 69 6b 65 28 29 20 53 51 4c 20 66 75 6e 63   like() SQL func
3290: 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63  tion.  This func
32a0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 0a  tion implements.
32b0: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2d 69 6e 20  ** the build-in 
32c0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 20 20  LIKE operator.  
32d0: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
32e0: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
32f0: 6f 6e 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 74  on is the.** pat
3300: 74 65 72 6e 20 61 6e 64 20 74 68 65 20 73 65 63  tern and the sec
3310: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
3320: 74 68 65 20 73 74 72 69 6e 67 2e 20 20 53 6f 2c  the string.  So,
3330: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
3340: 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  nts:.**.**      
3350: 20 41 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20   A LIKE B.**.** 
3360: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
3370: 73 20 6c 69 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a  s like(B,A)..**.
3380: 2a 2a 20 54 68 69 73 20 73 61 6d 65 20 66 75 6e  ** This same fun
3390: 63 74 69 6f 6e 20 28 77 69 74 68 20 61 20 64 69  ction (with a di
33a0: 66 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 65 49  fferent compareI
33b0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 29 20 63  nfo structure) c
33c0: 6f 6d 70 75 74 65 73 0a 2a 2a 20 74 68 65 20 47  omputes.** the G
33d0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  LOB operator..*/
33e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6b  .static void lik
33f0: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
3400: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
3410: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
3420: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3430: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
3440: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
3450: 20 2a 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76   *zA = sqlite3_v
3460: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
3470: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ]);.  const unsi
3480: 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 20 3d 20  gned char *zB = 
3490: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
34a0: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  xt(argv[1]);.  i
34b0: 6e 74 20 65 73 63 61 70 65 20 3d 20 30 3b 0a 20  nt escape = 0;. 
34c0: 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a   if( argc==3 ){.
34d0: 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70      /* The escap
34e0: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
34f0: 6e 67 20 6d 75 73 74 20 63 6f 6e 73 69 73 74 20  ng must consist 
3500: 6f 66 20 61 20 73 69 6e 67 6c 65 20 55 54 46 2d  of a single UTF-
3510: 38 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20  8 character..   
3520: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72   ** Otherwise, r
3530: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  eturn an error..
3540: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
3550: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3560: 7a 45 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 76  zEsc = sqlite3_v
3570: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32  alue_text(argv[2
3580: 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ]);.    if( sqli
3590: 74 65 33 75 74 66 38 43 68 61 72 4c 65 6e 28 28  te3utf8CharLen((
35a0: 63 68 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29 21  char*)zEsc, -1)!
35b0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
35c0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
35d0: 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  (context, .     
35e0: 20 20 20 20 20 22 45 53 43 41 50 45 20 65 78 70       "ESCAPE exp
35f0: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
3600: 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74  a single charact
3610: 65 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  er", -1);.      
3620: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
3630: 20 20 65 73 63 61 70 65 20 3d 20 73 71 6c 69 74    escape = sqlit
3640: 65 33 52 65 61 64 55 74 66 38 28 7a 45 73 63 29  e3ReadUtf8(zEsc)
3650: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20 26  ;.  }.  if( zA &
3660: 26 20 7a 42 20 29 7b 0a 20 20 20 20 73 74 72 75  & zB ){.    stru
3670: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a  ct compareInfo *
3680: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f  pInfo = sqlite3_
3690: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
36a0: 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
36b0: 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
36c0: 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b  e3_like_count++;
36d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
36e0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
36f0: 6f 6e 74 65 78 74 2c 20 70 61 74 74 65 72 6e 43  ontext, patternC
3700: 6f 6d 70 61 72 65 28 7a 41 2c 20 7a 42 2c 20 70  ompare(zA, zB, p
3710: 49 6e 66 6f 2c 20 65 73 63 61 70 65 29 29 3b 0a  Info, escape));.
3720: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70    }.}../*.** Imp
3730: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
3740: 68 65 20 4e 55 4c 4c 49 46 28 78 2c 79 29 20 66  he NULLIF(x,y) f
3750: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65  unction.  The re
3760: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
3770: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 66  t.** argument if
3780: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   the arguments a
3790: 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 20 54  re different.  T
37a0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
37b0: 4c 20 69 66 20 74 68 65 0a 2a 2a 20 61 72 67 75  L if the.** argu
37c0: 6d 65 6e 74 73 20 61 72 65 20 65 71 75 61 6c 20  ments are equal 
37d0: 74 6f 20 65 61 63 68 20 6f 74 68 65 72 2e 0a 2a  to each other..*
37e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 75  /.static void nu
37f0: 6c 6c 69 66 46 75 6e 63 28 0a 20 20 73 71 6c 69  llifFunc(.  sqli
3800: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3810: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
3820: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
3830: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 43 6f  e **argv.){.  Co
3840: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
3850: 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c  qlite3GetFuncCol
3860: 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20  lSeq(context);. 
3870: 20 69 66 28 20 73 71 6c 69 74 65 33 4d 65 6d 43   if( sqlite3MemC
3880: 6f 6d 70 61 72 65 28 61 72 67 76 5b 30 5d 2c 20  ompare(argv[0], 
3890: 61 72 67 76 5b 31 5d 2c 20 70 43 6f 6c 6c 29 21  argv[1], pColl)!
38a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
38b0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
38c0: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29  ontext, argv[0])
38d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
38e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
38f0: 20 74 68 65 20 56 45 52 53 49 4f 4e 28 2a 29 20   the VERSION(*) 
3900: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72  function.  The r
3910: 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 65 72  esult is the ver
3920: 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 53  sion.** of the S
3930: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 74 68  QLite library th
3940: 61 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a  at is running..*
3950: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65  /.static void ve
3960: 72 73 69 6f 6e 46 75 6e 63 28 0a 20 20 73 71 6c  rsionFunc(.  sql
3970: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3980: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
3990: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
39a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
39b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
39c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  xt(context, sqli
39d0: 74 65 33 5f 76 65 72 73 69 6f 6e 2c 20 2d 31 2c  te3_version, -1,
39e0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
39f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 58 50 45 52  .}.../*.** EXPER
3a00: 49 4d 45 4e 54 41 4c 20 2d 20 54 68 69 73 20 69  IMENTAL - This i
3a10: 73 20 6e 6f 74 20 61 6e 20 6f 66 66 69 63 69 61  s not an officia
3a20: 6c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  l function.  The
3a30: 20 69 6e 74 65 72 66 61 63 65 20 6d 61 79 0a 2a   interface may.*
3a40: 2a 20 63 68 61 6e 67 65 2e 20 20 54 68 69 73 20  * change.  This 
3a50: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 69 73  function may dis
3a60: 61 70 70 65 61 72 2e 20 20 44 6f 20 6e 6f 74 20  appear.  Do not 
3a70: 77 72 69 74 65 20 63 6f 64 65 20 74 68 61 74 20  write code that 
3a80: 64 65 70 65 6e 64 73 0a 2a 2a 20 6f 6e 20 74 68  depends.** on th
3a90: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
3aa0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3ab0: 6e 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28 29  n of the QUOTE()
3ac0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
3ad0: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
3ae0: 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67 75  a single.** argu
3af0: 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72  ment.  If the ar
3b00: 67 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72 69  gument is numeri
3b10: 63 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  c, the return va
3b20: 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  lue is the same 
3b30: 61 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65  as.** the argume
3b40: 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75  nt.  If the argu
3b50: 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
3b60: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
3b70: 73 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  s the string.** 
3b80: 22 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77 69  "NULL".  Otherwi
3b90: 73 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e 74  se, the argument
3ba0: 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20   is enclosed in 
3bb0: 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77 69  single quotes wi
3bc0: 74 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75 6f  th.** single-quo
3bd0: 74 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a 73  te escapes..*/.s
3be0: 74 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74 65  tatic void quote
3bf0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
3c00: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
3c10: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
3c20: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
3c30: 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72    if( argc<1 ) r
3c40: 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28  eturn;.  switch(
3c50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
3c60: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a  ype(argv[0]) ){.
3c70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3c80: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
3c90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
3ca0: 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c  t(context, "NULL
3cb0: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41  ", 4, SQLITE_STA
3cc0: 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  TIC);.      brea
3cd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3ce0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
3cf0: 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
3d00: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
3d10: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3d20: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
3d30: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62  rgv[0]);.      b
3d40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d50: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
3d60: 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  : {.      static
3d70: 20 63 6f 6e 73 74 20 63 68 61 72 20 68 65 78 64   const char hexd
3d80: 69 67 69 74 73 5b 5d 20 3d 20 7b 20 0a 20 20 20  igits[] = { .   
3d90: 20 20 20 20 20 27 30 27 2c 20 27 31 27 2c 20 27       '0', '1', '
3da0: 32 27 2c 20 27 33 27 2c 20 27 34 27 2c 20 27 35  2', '3', '4', '5
3db0: 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a 20 20 20  ', '6', '7',.   
3dc0: 20 20 20 20 20 27 38 27 2c 20 27 39 27 2c 20 27       '8', '9', '
3dd0: 41 27 2c 20 27 42 27 2c 20 27 43 27 2c 20 27 44  A', 'B', 'C', 'D
3de0: 27 2c 20 27 45 27 2c 20 27 46 27 20 0a 20 20 20  ', 'E', 'F' .   
3df0: 20 20 20 7d 3b 0a 20 20 20 20 20 20 63 68 61 72     };.      char
3e00: 20 2a 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 20   *zText = 0;.   
3e10: 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73     int nBlob = s
3e20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
3e30: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
3e40: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
3e50: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
3e60: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
3e70: 5d 29 3b 0a 0a 20 20 20 20 20 20 7a 54 65 78 74  ]);..      zText
3e80: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
3e90: 65 4d 61 6c 6c 6f 63 28 28 32 2a 6e 42 6c 6f 62  eMalloc((2*nBlob
3ea0: 29 2b 34 29 3b 20 0a 20 20 20 20 20 20 69 66 28  )+4); .      if(
3eb0: 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 20   !zText ){.     
3ec0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3ed0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
3ee0: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
3ef0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , -1);.      }el
3f00: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
3f10: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
3f20: 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b  =0; i<nBlob; i++
3f30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
3f40: 78 74 5b 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65  xt[(i*2)+2] = he
3f50: 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69  xdigits[(zBlob[i
3f60: 5d 3e 3e 34 29 26 30 78 30 46 5d 3b 0a 20 20 20  ]>>4)&0x0F];.   
3f70: 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a         zText[(i*
3f80: 32 29 2b 33 5d 20 3d 20 68 65 78 64 69 67 69 74  2)+3] = hexdigit
3f90: 73 5b 28 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30  s[(zBlob[i])&0x0
3fa0: 46 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  F];.        }.  
3fb0: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c        zText[(nBl
3fc0: 6f 62 2a 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b  ob*2)+2] = '\'';
3fd0: 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28  .        zText[(
3fe0: 6e 42 6c 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c  nBlob*2)+3] = '\
3ff0: 30 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78  0';.        zTex
4000: 74 5b 30 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20  t[0] = 'X';.    
4010: 20 20 20 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27      zText[1] = '
4020: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  \'';.        sql
4030: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
4040: 28 63 6f 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c  (context, zText,
4050: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
4060: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20  SIENT);.        
4070: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 65 78 74  sqliteFree(zText
4080: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
40a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
40b0: 58 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  XT: {.      int 
40c0: 69 2c 6a 2c 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  i,j,n;.      con
40d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
40e0: 20 2a 7a 41 72 67 20 3d 20 73 71 6c 69 74 65 33   *zArg = sqlite3
40f0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
4100: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 63 68 61 72  [0]);.      char
4110: 20 2a 7a 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28   *z;..      for(
4120: 69 3d 6e 3d 30 3b 20 7a 41 72 67 5b 69 5d 3b 20  i=n=0; zArg[i]; 
4130: 69 2b 2b 29 7b 20 69 66 28 20 7a 41 72 67 5b 69  i++){ if( zArg[i
4140: 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b 2b 3b 20 7d  ]=='\'' ) n++; }
4150: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
4160: 65 4d 61 6c 6c 6f 63 28 20 69 2b 6e 2b 33 20 29  eMalloc( i+n+3 )
4170: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30  ;.      if( z==0
4180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
4190: 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b 0a 20 20   z[0] = '\'';.  
41a0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 31      for(i=0, j=1
41b0: 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b  ; zArg[i]; i++){
41c0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
41d0: 3d 20 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20  = zArg[i];.     
41e0: 20 20 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d     if( zArg[i]==
41f0: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
4200: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b    z[j++] = '\'';
4210: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4220: 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20   }.      z[j++] 
4230: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7a 5b  = '\'';.      z[
4240: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  j] = 0;.      sq
4250: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4260: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 6a 2c  t(context, z, j,
4270: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4280: 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
4290: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20  Free(z);.    }. 
42a0: 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
42b0: 49 54 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a  ITE_SOUNDEX./*.*
42c0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f  * Compute the so
42d0: 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f  undex encoding o
42e0: 66 20 61 20 77 6f 72 64 2e 0a 2a 2f 0a 73 74 61  f a word..*/.sta
42f0: 74 69 63 20 76 6f 69 64 20 73 6f 75 6e 64 65 78  tic void soundex
4300: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
4310: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
4320: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
4330: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
4340: 20 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 38    char zResult[8
4350: 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  ];.  const u8 *z
4360: 49 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  In;.  int i, j;.
4370: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
4380: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 43 6f  nsigned char iCo
4390: 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20  de[] = {.    0, 
43a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
43b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
43c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
43d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
43e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
43f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4400: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
4410: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4420: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
4430: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30  , 0,.    0, 0, 0
4440: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4450: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4460: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
4470: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31  0, 1, 2, 3, 0, 1
4480: 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c  , 2, 0, 0, 2, 2,
4490: 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20   4, 5, 5, 0,.   
44a0: 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20   1, 2, 6, 2, 3, 
44b0: 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32  0, 1, 0, 2, 0, 2
44c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
44d0: 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c  .    0, 0, 1, 2,
44e0: 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20   3, 0, 1, 2, 0, 
44f0: 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35  0, 2, 2, 4, 5, 5
4500: 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36  , 0,.    1, 2, 6
4510: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c  , 2, 3, 0, 1, 0,
4520: 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20   2, 0, 2, 0, 0, 
4530: 30 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20  0, 0, 0,.  };.  
4540: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
4550: 29 3b 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29  );.  zIn = (u8*)
4560: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
4570: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66  xt(argv[0]);.  f
4580: 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26  or(i=0; zIn[i] &
4590: 26 20 21 69 73 61 6c 70 68 61 28 7a 49 6e 5b 69  & !isalpha(zIn[i
45a0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  ]); i++){}.  if(
45b0: 20 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 7a   zIn[i] ){.    z
45c0: 52 65 73 75 6c 74 5b 30 5d 20 3d 20 74 6f 75 70  Result[0] = toup
45d0: 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20  per(zIn[i]);.   
45e0: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26   for(j=1; j<4 &&
45f0: 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20   zIn[i]; i++){. 
4600: 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20       int code = 
4610: 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37  iCode[zIn[i]&0x7
4620: 66 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f  f];.      if( co
4630: 64 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  de>0 ){.        
4640: 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63  zResult[j++] = c
4650: 6f 64 65 20 2b 20 27 30 27 3b 0a 20 20 20 20 20  ode + '0';.     
4660: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69   }.    }.    whi
4670: 6c 65 28 20 6a 3c 34 20 29 7b 0a 20 20 20 20 20  le( j<4 ){.     
4680: 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20   zResult[j++] = 
4690: 27 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '0';.    }.    z
46a0: 52 65 73 75 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20  Result[j] = 0;. 
46b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
46c0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
46d0: 7a 52 65 73 75 6c 74 2c 20 34 2c 20 53 51 4c 49  zResult, 4, SQLI
46e0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
46f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
4700: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
4710: 63 6f 6e 74 65 78 74 2c 20 22 3f 30 30 30 22 2c  context, "?000",
4720: 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   4, SQLITE_STATI
4730: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
4740: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4750: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
4760: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
4770: 65 73 20 61 20 73 74 72 69 6e 67 20 6f 66 20 72  es a string of r
4780: 61 6e 64 6f 6d 20 63 68 61 72 61 63 74 65 72 73  andom characters
4790: 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 67  .  Used for.** g
47a0: 65 6e 65 72 61 74 69 6e 67 20 74 65 73 74 20 64  enerating test d
47b0: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
47c0: 6f 69 64 20 72 61 6e 64 53 74 72 28 73 71 6c 69  oid randStr(sqli
47d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
47e0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
47f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4800: 61 72 67 76 29 7b 0a 20 20 73 74 61 74 69 63 20  argv){.  static 
4810: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4820: 68 61 72 20 7a 53 72 63 5b 5d 20 3d 20 0a 20 20  har zSrc[] = .  
4830: 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
4840: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
4850: 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a       "ABCDEFGHIJ
4860: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
4870: 22 0a 20 20 20 20 20 22 30 31 32 33 34 35 36 37  ".     "01234567
4880: 38 39 22 0a 20 20 20 20 20 22 2e 2d 21 2c 3a 2a  89".     ".-!,:*
4890: 5e 2b 3d 5f 7c 3f 2f 3c 3e 20 22 3b 0a 20 20 69  ^+=_|?/<> ";.  i
48a0: 6e 74 20 69 4d 69 6e 2c 20 69 4d 61 78 2c 20 6e  nt iMin, iMax, n
48b0: 2c 20 72 2c 20 69 3b 0a 20 20 75 6e 73 69 67 6e  , r, i;.  unsign
48c0: 65 64 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  ed char zBuf[100
48d0: 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 3d  0];.  if( argc>=
48e0: 31 20 29 7b 0a 20 20 20 20 69 4d 69 6e 20 3d 20  1 ){.    iMin = 
48f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
4900: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
4910: 69 66 28 20 69 4d 69 6e 3c 30 20 29 20 69 4d 69  if( iMin<0 ) iMi
4920: 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  n = 0;.    if( i
4930: 4d 69 6e 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66  Min>=sizeof(zBuf
4940: 29 20 29 20 69 4d 69 6e 20 3d 20 73 69 7a 65 6f  ) ) iMin = sizeo
4950: 66 28 7a 42 75 66 29 2d 31 3b 0a 20 20 7d 65 6c  f(zBuf)-1;.  }el
4960: 73 65 7b 0a 20 20 20 20 69 4d 69 6e 20 3d 20 31  se{.    iMin = 1
4970: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63  ;.  }.  if( argc
4980: 3e 3d 32 20 29 7b 0a 20 20 20 20 69 4d 61 78 20  >=2 ){.    iMax 
4990: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
49a0: 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  int(argv[1]);.  
49b0: 20 20 69 66 28 20 69 4d 61 78 3c 69 4d 69 6e 20    if( iMax<iMin 
49c0: 29 20 69 4d 61 78 20 3d 20 69 4d 69 6e 3b 0a 20  ) iMax = iMin;. 
49d0: 20 20 20 69 66 28 20 69 4d 61 78 3e 3d 73 69 7a     if( iMax>=siz
49e0: 65 6f 66 28 7a 42 75 66 29 20 29 20 69 4d 61 78  eof(zBuf) ) iMax
49f0: 20 3d 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d   = sizeof(zBuf)-
4a00: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
4a10: 69 4d 61 78 20 3d 20 35 30 3b 0a 20 20 7d 0a 20  iMax = 50;.  }. 
4a20: 20 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 69 66 28   n = iMin;.  if(
4a30: 20 69 4d 61 78 3e 69 4d 69 6e 20 29 7b 0a 20 20   iMax>iMin ){.  
4a40: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
4a50: 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26  ess(sizeof(r), &
4a60: 72 29 3b 0a 20 20 20 20 72 20 26 3d 20 30 78 37  r);.    r &= 0x7
4a70: 66 66 66 66 66 66 66 3b 0a 20 20 20 20 6e 20 2b  fffffff;.    n +
4a80: 3d 20 72 25 28 69 4d 61 78 20 2b 20 31 20 2d 20  = r%(iMax + 1 - 
4a90: 69 4d 69 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73  iMin);.  }.  ass
4aa0: 65 72 74 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42  ert( n<sizeof(zB
4ab0: 75 66 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  uf) );.  sqlite3
4ac0: 52 61 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20 7a 42  Randomness(n, zB
4ad0: 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  uf);.  for(i=0; 
4ae0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  i<n; i++){.    z
4af0: 42 75 66 5b 69 5d 20 3d 20 7a 53 72 63 5b 7a 42  Buf[i] = zSrc[zB
4b00: 75 66 5b 69 5d 25 28 73 69 7a 65 6f 66 28 7a 53  uf[i]%(sizeof(zS
4b10: 72 63 29 2d 31 29 5d 3b 0a 20 20 7d 0a 20 20 7a  rc)-1)];.  }.  z
4b20: 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  Buf[n] = 0;.  sq
4b30: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4b40: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
4b50: 2a 29 7a 42 75 66 2c 20 6e 2c 20 53 51 4c 49 54  *)zBuf, n, SQLIT
4b60: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
4b70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4b80: 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66 64 65 66  _TEST */..#ifdef
4b90: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
4ba0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
4bb0: 20 74 77 6f 20 53 51 4c 20 66 75 6e 63 74 69 6f   two SQL functio
4bc0: 6e 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ns are used to t
4bd0: 65 73 74 20 72 65 74 75 72 6e 69 6e 67 20 61 20  est returning a 
4be0: 74 65 78 74 0a 2a 2a 20 72 65 73 75 6c 74 20 77  text.** result w
4bf0: 69 74 68 20 61 20 64 65 73 74 72 75 63 74 6f 72  ith a destructor
4c00: 2e 20 46 75 6e 63 74 69 6f 6e 20 27 74 65 73 74  . Function 'test
4c10: 5f 64 65 73 74 72 75 63 74 6f 72 27 20 74 61 6b  _destructor' tak
4c20: 65 73 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 0a  es one argument.
4c30: 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  ** and returns t
4c40: 68 65 20 73 61 6d 65 20 61 72 67 75 6d 65 6e 74  he same argument
4c50: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
4c60: 54 45 58 54 2e 20 41 20 64 65 73 74 72 75 63 74  TEXT. A destruct
4c70: 6f 72 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20  or is.** passed 
4c80: 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33  with the sqlite3
4c90: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 29 20 63  _result_text() c
4ca0: 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 66  all..**.** SQL f
4cb0: 75 6e 63 74 69 6f 6e 20 27 74 65 73 74 5f 64 65  unction 'test_de
4cc0: 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 27 20  structor_count' 
4cd0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
4ce0: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
4cf0: 67 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  g .** allocation
4d00: 73 20 6d 61 64 65 20 62 79 20 27 74 65 73 74 5f  s made by 'test_
4d10: 64 65 73 74 72 75 63 74 6f 72 27 3b 0a 2a 2a 0a  destructor';.**.
4d20: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 4e 6f 74 20  ** WARNING: Not 
4d30: 74 68 72 65 61 64 73 61 66 65 2e 0a 2a 2f 0a 73  threadsafe..*/.s
4d40: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
4d50: 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 5f  estructor_count_
4d60: 76 61 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  var = 0;.static 
4d70: 76 6f 69 64 20 64 65 73 74 72 75 63 74 6f 72 28  void destructor(
4d80: 76 6f 69 64 20 2a 70 29 7b 0a 20 20 63 68 61 72  void *p){.  char
4d90: 20 2a 7a 56 61 6c 20 3d 20 28 63 68 61 72 20 2a   *zVal = (char *
4da0: 29 70 3b 0a 20 20 61 73 73 65 72 74 28 7a 56 61  )p;.  assert(zVa
4db0: 6c 29 3b 0a 20 20 7a 56 61 6c 2d 2d 3b 0a 20 20  l);.  zVal--;.  
4dc0: 73 71 6c 69 74 65 46 72 65 65 28 7a 56 61 6c 29  sqliteFree(zVal)
4dd0: 3b 0a 20 20 74 65 73 74 5f 64 65 73 74 72 75 63  ;.  test_destruc
4de0: 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72 2d 2d 3b  tor_count_var--;
4df0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
4e00: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28 0a  est_destructor(.
4e10: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
4e20: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
4e30: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
4e40: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
4e50: 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20    char *zVal;.  
4e60: 69 6e 74 20 6c 65 6e 3b 0a 20 20 73 71 6c 69 74  int len;.  sqlit
4e70: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
4e80: 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
4e90: 3b 0a 20 0a 20 20 74 65 73 74 5f 64 65 73 74 72  ;. .  test_destr
4ea0: 75 63 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72 2b  uctor_count_var+
4eb0: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  +;.  assert( nAr
4ec0: 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71  g==1 );.  if( sq
4ed0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
4ee0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
4ef0: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
4f00: 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  .  len = sqlite3
4f10: 56 61 6c 75 65 42 79 74 65 73 28 61 72 67 76 5b  ValueBytes(argv[
4f20: 30 5d 2c 20 64 62 2d 3e 65 6e 63 29 3b 20 0a 20  0], db->enc); . 
4f30: 20 7a 56 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61   zVal = sqliteMa
4f40: 6c 6c 6f 63 28 6c 65 6e 2b 33 29 3b 0a 20 20 7a  lloc(len+3);.  z
4f50: 56 61 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20  Val[len] = 0;.  
4f60: 7a 56 61 6c 5b 6c 65 6e 2d 31 5d 20 3d 20 30 3b  zVal[len-1] = 0;
4f70: 0a 20 20 61 73 73 65 72 74 28 20 7a 56 61 6c 20  .  assert( zVal 
4f80: 29 3b 0a 20 20 7a 56 61 6c 2b 2b 3b 0a 20 20 6d  );.  zVal++;.  m
4f90: 65 6d 63 70 79 28 7a 56 61 6c 2c 20 73 71 6c 69  emcpy(zVal, sqli
4fa0: 74 65 33 56 61 6c 75 65 54 65 78 74 28 61 72 67  te3ValueText(arg
4fb0: 76 5b 30 5d 2c 20 64 62 2d 3e 65 6e 63 29 2c 20  v[0], db->enc), 
4fc0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  len);.  if( db->
4fd0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
4fe0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4ff0: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
5000: 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20 64 65 73 74  , zVal, -1, dest
5010: 72 75 63 74 6f 72 29 3b 0a 23 69 66 6e 64 65 66  ructor);.#ifndef
5020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
5030: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  16.  }else if( d
5040: 62 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  b->enc==SQLITE_U
5050: 54 46 31 36 4c 45 20 29 7b 0a 20 20 20 20 73 71  TF16LE ){.    sq
5060: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
5070: 74 31 36 6c 65 28 70 43 74 78 2c 20 7a 56 61 6c  t16le(pCtx, zVal
5080: 2c 20 2d 31 2c 20 64 65 73 74 72 75 63 74 6f 72  , -1, destructor
5090: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
50a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
50b0: 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 7a 56  ext16be(pCtx, zV
50c0: 61 6c 2c 20 2d 31 2c 20 64 65 73 74 72 75 63 74  al, -1, destruct
50d0: 6f 72 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  or);.#endif /* S
50e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
50f0: 20 2a 2f 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63   */.  }.}.static
5100: 20 76 6f 69 64 20 74 65 73 74 5f 64 65 73 74 72   void test_destr
5110: 75 63 74 6f 72 5f 63 6f 75 6e 74 28 0a 20 20 73  uctor_count(.  s
5120: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5130: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
5140: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
5150: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
5160: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
5170: 74 28 70 43 74 78 2c 20 74 65 73 74 5f 64 65 73  t(pCtx, test_des
5180: 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 5f 76 61  tructor_count_va
5190: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  r);.}.#endif /* 
51a0: 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a  SQLITE_TEST */..
51b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
51c0: 53 54 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  ST./*.** Routine
51d0: 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68  s for testing th
51e0: 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  e sqlite3_get_au
51f0: 78 64 61 74 61 28 29 20 61 6e 64 20 73 71 6c 69  xdata() and sqli
5200: 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28  te3_set_auxdata(
5210: 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
5220: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 73 74 5f 61  **.** The test_a
5230: 75 78 64 61 74 61 28 29 20 53 51 4c 20 66 75 6e  uxdata() SQL fun
5240: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
5250: 6f 20 72 65 67 69 73 74 65 72 20 65 61 63 68 20  o register each 
5260: 6f 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74 73  of its arguments
5270: 0a 2a 2a 20 61 73 20 61 75 78 69 6c 69 61 72 79  .** as auxiliary
5280: 20 64 61 74 61 2e 20 20 49 66 20 74 68 65 72 65   data.  If there
5290: 20 61 72 65 20 6e 6f 20 70 72 69 6f 72 20 72 65   are no prior re
52a0: 67 69 73 74 72 61 74 69 6f 6e 73 20 6f 66 20 61  gistrations of a
52b0: 75 78 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74  ux data for.** t
52c0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 28 6d 65  hat argument (me
52d0: 61 6e 69 6e 67 20 74 68 65 20 61 72 67 75 6d 65  aning the argume
52e0: 6e 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  nt is not a cons
52f0: 74 61 6e 74 20 6f 72 20 74 68 69 73 20 69 73 20  tant or this is 
5300: 69 74 73 20 66 69 72 73 74 0a 2a 2a 20 63 61 6c  its first.** cal
5310: 6c 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  l) then the resu
5320: 6c 74 20 66 6f 72 20 74 68 61 74 20 61 72 67 75  lt for that argu
5330: 6d 65 6e 74 20 69 73 20 30 2e 20 20 49 66 20 74  ment is 0.  If t
5340: 68 65 72 65 20 69 73 20 61 20 70 72 69 6f 72 0a  here is a prior.
5350: 2a 2a 20 72 65 67 69 73 74 72 61 74 69 6f 6e 2c  ** registration,
5360: 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20   the result for 
5370: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73  that argument is
5380: 20 31 2e 20 20 54 68 65 20 6f 76 65 72 61 6c 6c   1.  The overall
5390: 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 74 68   result.** is th
53a0: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 61 72 67  e individual arg
53b0: 75 6d 65 6e 74 20 72 65 73 75 6c 74 73 20 73 65  ument results se
53c0: 70 61 72 61 74 65 64 20 62 79 20 73 70 61 63 65  parated by space
53d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
53e0: 64 20 66 72 65 65 5f 74 65 73 74 5f 61 75 78 64  d free_test_auxd
53f0: 61 74 61 28 76 6f 69 64 20 2a 70 29 20 7b 73 71  ata(void *p) {sq
5400: 6c 69 74 65 46 72 65 65 28 70 29 3b 7d 0a 73 74  liteFree(p);}.st
5410: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
5420: 75 78 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65  uxdata(.  sqlite
5430: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
5440: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
5450: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5460: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  argv.){.  int i;
5470: 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
5480: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 41 72  sqliteMalloc(nAr
5490: 67 2a 32 29 3b 0a 20 20 69 66 28 20 21 7a 52 65  g*2);.  if( !zRe
54a0: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  t ) return;.  fo
54b0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
54c0: 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  ++){.    char co
54d0: 6e 73 74 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29  nst *z = (char*)
54e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
54f0: 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  xt(argv[i]);.   
5500: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
5510: 63 68 61 72 20 2a 7a 41 75 78 20 3d 20 73 71 6c  char *zAux = sql
5520: 69 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74 61  ite3_get_auxdata
5530: 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20 20  (pCtx, i);.     
5540: 20 69 66 28 20 7a 41 75 78 20 29 7b 0a 20 20 20   if( zAux ){.   
5550: 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20 3d       zRet[i*2] =
5560: 20 27 31 27 3b 0a 20 20 20 20 20 20 20 20 69 66   '1';.        if
5570: 28 20 73 74 72 63 6d 70 28 7a 41 75 78 2c 20 7a  ( strcmp(zAux, z
5580: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
5590: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
55a0: 72 6f 72 28 70 43 74 78 2c 20 22 41 75 78 69 6c  ror(pCtx, "Auxil
55b0: 61 72 79 20 64 61 74 61 20 63 6f 72 72 75 70 74  ary data corrupt
55c0: 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ion", -1);.     
55d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
55e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
55f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  se{.        zRet
5600: 5b 69 2a 32 5d 20 3d 20 27 30 27 3b 0a 20 20 20  [i*2] = '0';.   
5610: 20 20 20 20 20 7a 41 75 78 20 3d 20 73 71 6c 69       zAux = sqli
5620: 74 65 53 74 72 44 75 70 28 7a 29 3b 0a 20 20 20  teStrDup(z);.   
5630: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
5640: 5f 61 75 78 64 61 74 61 28 70 43 74 78 2c 20 69  _auxdata(pCtx, i
5650: 2c 20 7a 41 75 78 2c 20 66 72 65 65 5f 74 65 73  , zAux, free_tes
5660: 74 5f 61 75 78 64 61 74 61 29 3b 0a 20 20 20 20  t_auxdata);.    
5670: 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 74 5b 69    }.      zRet[i
5680: 2a 32 2b 31 5d 20 3d 20 27 20 27 3b 0a 20 20 20  *2+1] = ' ';.   
5690: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
56a0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
56b0: 78 2c 20 7a 52 65 74 2c 20 32 2a 6e 41 72 67 2d  x, zRet, 2*nArg-
56c0: 31 2c 20 66 72 65 65 5f 74 65 73 74 5f 61 75 78  1, free_test_aux
56d0: 64 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  data);.}.#endif 
56e0: 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
56f0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
5700: 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 41 20 66 75  _TEST./*.** A fu
5710: 6e 63 74 69 6f 6e 20 74 6f 20 74 65 73 74 20 65  nction to test e
5720: 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20 66  rror reporting f
5730: 72 6f 6d 20 75 73 65 72 20 66 75 6e 63 74 69 6f  rom user functio
5740: 6e 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ns. This functio
5750: 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 63  n.** returns a c
5760: 6f 70 79 20 6f 66 20 69 74 27 73 20 66 69 72 73  opy of it's firs
5770: 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61 6e  t argument as an
5780: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
5790: 63 20 76 6f 69 64 20 74 65 73 74 5f 65 72 72 6f  c void test_erro
57a0: 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  r(.  sqlite3_con
57b0: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
57c0: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
57d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
57e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ){.  sqlite3_res
57f0: 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
5800: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
5810: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
5820: 5d 29 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  ]), 0);.}.#endif
5830: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
5840: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
5850: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
5860: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
5870: 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74 65   holds the conte
5880: 78 74 20 6f 66 20 61 0a 2a 2a 20 73 75 6d 28 29  xt of a.** sum()
5890: 20 6f 72 20 61 76 67 28 29 20 61 67 67 72 65 67   or avg() aggreg
58a0: 61 74 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e  ate computation.
58b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
58c0: 63 74 20 53 75 6d 43 74 78 20 53 75 6d 43 74 78  ct SumCtx SumCtx
58d0: 3b 0a 73 74 72 75 63 74 20 53 75 6d 43 74 78 20  ;.struct SumCtx 
58e0: 7b 0a 20 20 64 6f 75 62 6c 65 20 73 75 6d 3b 20  {.  double sum; 
58f0: 20 20 20 20 2f 2a 20 53 75 6d 20 6f 66 20 74 65      /* Sum of te
5900: 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  rms */.  int cnt
5910: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
5920: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 73  er of elements s
5930: 75 6d 6d 65 64 20 2a 2f 0a 20 20 75 38 20 73 65  ummed */.  u8 se
5940: 65 6e 46 6c 6f 61 74 3b 20 20 20 2f 2a 20 54 72  enFloat;   /* Tr
5950: 75 65 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ue if there has 
5960: 62 65 65 6e 20 61 6e 79 20 66 6c 6f 61 74 69 6e  been any floatin
5970: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f  g point value */
5980: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
5990: 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  nes used to comp
59a0: 75 74 65 20 74 68 65 20 73 75 6d 20 6f 72 20 61  ute the sum or a
59b0: 76 65 72 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  verage..*/.stati
59c0: 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73  c void sumStep(s
59d0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
59e0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
59f0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
5a00: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43   **argv){.  SumC
5a10: 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70  tx *p;.  int typ
5a20: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  e;.  assert( arg
5a30: 63 3d 3d 31 20 29 3b 0a 20 20 70 20 3d 20 73 71  c==1 );.  p = sq
5a40: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
5a50: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
5a60: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
5a70: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  type = sqlite3_v
5a80: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
5a90: 5d 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 74  ]);.  if( p && t
5aa0: 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype!=SQLITE_NULL
5ab0: 20 29 7b 0a 20 20 20 20 70 2d 3e 73 75 6d 20 2b   ){.    p->sum +
5ac0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5ad0: 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b  double(argv[0]);
5ae0: 0a 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20  .    p->cnt++;. 
5af0: 20 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c     if( type==SQL
5b00: 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
5b10: 20 20 20 70 2d 3e 73 65 65 6e 46 6c 6f 61 74 20     p->seenFloat 
5b20: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 1;.    }.  }.}
5b30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d  .static void sum
5b40: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
5b50: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5b60: 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b  t){.  SumCtx *p;
5b70: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
5b80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
5b90: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
5ba0: 69 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e  if( p && p->cnt>
5bb0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
5bc0: 73 65 65 6e 46 6c 6f 61 74 20 29 7b 0a 20 20 20  seenFloat ){.   
5bd0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5be0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
5bf0: 2c 20 70 2d 3e 73 75 6d 29 3b 0a 20 20 20 20 7d  , p->sum);.    }
5c00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5c10: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
5c20: 28 63 6f 6e 74 65 78 74 2c 20 28 69 36 34 29 70  (context, (i64)p
5c30: 2d 3e 73 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  ->sum);.    }.  
5c40: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
5c50: 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  avgFinalize(sqli
5c60: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5c70: 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20  text){.  SumCtx 
5c80: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
5c90: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
5ca0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
5cb0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63  .  if( p && p->c
5cc0: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  nt>0 ){.    sqli
5cd0: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
5ce0: 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 73 75  e(context, p->su
5cf0: 6d 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74  m/(double)p->cnt
5d00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5d10: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
5d20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5d30: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65  ucture holds the
5d40: 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a   context of a.**
5d50: 20 76 61 72 69 61 6e 63 65 20 6f 72 20 73 74 61   variance or sta
5d60: 6e 64 61 72 64 20 64 65 76 69 61 74 69 6f 6e 20  ndard deviation 
5d70: 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  computation..*/.
5d80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
5d90: 74 64 44 65 76 43 74 78 20 53 74 64 44 65 76 43  tdDevCtx StdDevC
5da0: 74 78 3b 0a 73 74 72 75 63 74 20 53 74 64 44 65  tx;.struct StdDe
5db0: 76 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20  vCtx {.  double 
5dc0: 73 75 6d 3b 20 20 20 20 20 2f 2a 20 53 75 6d 20  sum;     /* Sum 
5dd0: 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 64 6f  of terms */.  do
5de0: 75 62 6c 65 20 73 75 6d 32 3b 20 20 20 20 2f 2a  uble sum2;    /*
5df0: 20 53 75 6d 20 6f 66 20 74 68 65 20 73 71 75 61   Sum of the squa
5e00: 72 65 73 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a  res of terms */.
5e10: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
5e20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
5e30: 65 72 6d 73 20 63 6f 75 6e 74 65 64 20 2a 2f 0a  erms counted */.
5e40: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  };../*.** The fo
5e50: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
5e60: 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66  e keeps track of
5e70: 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   state informati
5e80: 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f  on for the.** co
5e90: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
5ea0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  function..*/.typ
5eb0: 65 64 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e  edef struct Coun
5ec0: 74 43 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73  tCtx CountCtx;.s
5ed0: 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b  truct CountCtx {
5ee0: 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 0a 2f 2a  .  int n;.};../*
5ef0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
5f00: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
5f10: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
5f20: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
5f30: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74  tic void countSt
5f40: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
5f50: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
5f60: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
5f70: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
5f80: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
5f90: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
5fa0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
5fb0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
5fc0: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
5fd0: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
5fe0: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
5ff0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29 20 26  type(argv[0])) &
6000: 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b  & p ){.    p->n+
6010: 2b 3b 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74  +;.  }.}   .stat
6020: 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e  ic void countFin
6030: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
6040: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
6050: 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a  .  CountCtx *p;.
6060: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
6070: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
6080: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 73  context, 0);.  s
6090: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
60a0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70  t(context, p ? p
60b0: 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  ->n : 0);.}../*.
60c0: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69  ** Routines to i
60d0: 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61  mplement min() a
60e0: 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65 67 61  nd max() aggrega
60f0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  te functions..*/
6100: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e  .static void min
6110: 6d 61 78 53 74 65 70 28 73 71 6c 69 74 65 33 5f  maxStep(sqlite3_
6120: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
6130: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
6140: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
6150: 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20  ){.  Mem *pArg  
6160: 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d  = (Mem *)argv[0]
6170: 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a  ;.  Mem *pBest;.
6180: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
6190: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
61a0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
61b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 42 65 73  ) return;.  pBes
61c0: 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c 69 74  t = (Mem *)sqlit
61d0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
61e0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
61f0: 7a 65 6f 66 28 2a 70 42 65 73 74 29 29 3b 0a 20  zeof(*pBest));. 
6200: 20 69 66 28 20 21 70 42 65 73 74 20 29 20 72 65   if( !pBest ) re
6210: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 42 65  turn;..  if( pBe
6220: 73 74 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  st->flags ){.   
6230: 20 69 6e 74 20 6d 61 78 3b 0a 20 20 20 20 69 6e   int max;.    in
6240: 74 20 63 6d 70 3b 0a 20 20 20 20 43 6f 6c 6c 53  t cmp;.    CollS
6250: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
6260: 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65  te3GetFuncCollSe
6270: 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  q(context);.    
6280: 2f 2a 20 54 68 69 73 20 73 74 65 70 20 66 75 6e  /* This step fun
6290: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ction is used fo
62a0: 72 20 62 6f 74 68 20 74 68 65 20 6d 69 6e 28 29  r both the min()
62b0: 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65   and max() aggre
62c0: 67 61 74 65 73 2c 0a 20 20 20 20 2a 2a 20 74 68  gates,.    ** th
62d0: 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63  e only differenc
62e0: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  e between the tw
62f0: 6f 20 62 65 69 6e 67 20 74 68 61 74 20 74 68 65  o being that the
6300: 20 73 65 6e 73 65 20 6f 66 20 74 68 65 0a 20 20   sense of the.  
6310: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
6320: 69 73 20 69 6e 76 65 72 74 65 64 2e 20 46 6f 72  is inverted. For
6330: 20 74 68 65 20 6d 61 78 28 29 20 61 67 67 72 65   the max() aggre
6340: 67 61 74 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a  gate, the.    **
6350: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
6360: 74 61 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  ta() function re
6370: 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 2d 31  turns (void *)-1
6380: 2e 20 46 6f 72 20 6d 69 6e 28 29 20 69 74 0a 20  . For min() it. 
6390: 20 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 28 76     ** returns (v
63a0: 6f 69 64 20 2a 29 64 62 2c 20 77 68 65 72 65 20  oid *)db, where 
63b0: 64 62 20 69 73 20 74 68 65 20 73 71 6c 69 74 65  db is the sqlite
63c0: 33 2a 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  3* database poin
63d0: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 54 68 65 72  ter..    ** Ther
63e0: 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 20 73  efore the next s
63f0: 74 61 74 65 6d 65 6e 74 20 73 65 74 73 20 76 61  tatement sets va
6400: 72 69 61 62 6c 65 20 27 6d 61 78 27 20 74 6f 20  riable 'max' to 
6410: 31 20 66 6f 72 20 74 68 65 20 6d 61 78 28 29 0a  1 for the max().
6420: 20 20 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65      ** aggregate
6430: 2c 20 6f 72 20 30 20 66 6f 72 20 6d 69 6e 28 29  , or 0 for min()
6440: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 61 78  ..    */.    max
6450: 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 75 73 65   = ((sqlite3_use
6460: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3d  r_data(context)=
6470: 3d 28 76 6f 69 64 20 2a 29 2d 31 29 3f 31 3a 30  =(void *)-1)?1:0
6480: 29 3b 0a 20 20 20 20 63 6d 70 20 3d 20 73 71 6c  );.    cmp = sql
6490: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
64a0: 42 65 73 74 2c 20 70 41 72 67 2c 20 70 43 6f 6c  Best, pArg, pCol
64b0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 6d 61 78  l);.    if( (max
64c0: 20 26 26 20 63 6d 70 3c 30 29 20 7c 7c 20 28 21   && cmp<0) || (!
64d0: 6d 61 78 20 26 26 20 63 6d 70 3e 30 29 20 29 7b  max && cmp>0) ){
64e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
64f0: 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c  beMemCopy(pBest,
6500: 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pArg);.    }.  
6510: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
6520: 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42  e3VdbeMemCopy(pB
6530: 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a  est, pArg);.  }.
6540: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69  }.static void mi
6550: 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 28 73 71 6c  nMaxFinalize(sql
6560: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6570: 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65  ntext){.  sqlite
6580: 33 5f 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a 20  3_value *pRes;. 
6590: 20 70 52 65 73 20 3d 20 28 73 71 6c 69 74 65 33   pRes = (sqlite3
65a0: 5f 76 61 6c 75 65 20 2a 29 73 71 6c 69 74 65 33  _value *)sqlite3
65b0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
65c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
65d0: 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20    if( pRes ){.  
65e0: 20 20 69 66 28 20 70 52 65 73 2d 3e 66 6c 61 67    if( pRes->flag
65f0: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
6600: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
6610: 63 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b 0a  context, pRes);.
6620: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6630: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
6640: 70 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  pRes);.  }.}.../
6650: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6660: 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 61 6c  on registered al
6670: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 43  l of the above C
6680: 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 53 51   functions as SQ
6690: 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20  L.** functions. 
66a0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
66b0: 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65  the only routine
66c0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 77 69   in this file wi
66d0: 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20 6c  th.** external l
66e0: 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  inkage..*/.void 
66f0: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
6700: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
6710: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6720: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
6730: 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
6740: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 73 69 67  *zName;.     sig
6750: 6e 65 64 20 63 68 61 72 20 6e 41 72 67 3b 0a 20  ned char nArg;. 
6760: 20 20 20 20 75 38 20 61 72 67 54 79 70 65 3b 20      u8 argType; 
6770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
6780: 6e 6f 6e 65 2e 20 20 31 3a 20 64 62 20 20 32 3a  none.  1: db  2:
6790: 20 28 2d 31 29 20 2a 2f 0a 20 20 20 20 20 75 38   (-1) */.     u8
67a0: 20 65 54 65 78 74 52 65 70 3b 20 20 20 20 20 20   eTextRep;      
67b0: 20 20 20 20 2f 2a 20 31 3a 20 55 54 46 2d 31 36      /* 1: UTF-16
67c0: 2e 20 20 30 3a 20 55 54 46 2d 38 20 2a 2f 0a 20  .  0: UTF-8 */. 
67d0: 20 20 20 20 75 38 20 6e 65 65 64 43 6f 6c 6c 53      u8 needCollS
67e0: 65 71 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a  eq;.     void (*
67f0: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
6800: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
6810: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 3b 0a 20  te3_value **);. 
6820: 20 7d 20 61 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a   } aFuncs[] = {.
6830: 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20      { "min",    
6840: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30             -1, 0
6850: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
6860: 20 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20    1, minmaxFunc 
6870: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20  },.    { "min", 
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6890: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
68a0: 2c 20 20 20 20 31 2c 20 30 20 20 20 20 20 20 20  ,    1, 0       
68b0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78     },.    { "max
68c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
68d0: 20 2d 31 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55   -1, 2, SQLITE_U
68e0: 54 46 38 2c 20 20 20 20 31 2c 20 6d 69 6e 6d 61  TF8,    1, minma
68f0: 78 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  xFunc },.    { "
6900: 6d 61 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  max",           
6910: 20 20 20 20 20 30 2c 20 32 2c 20 53 51 4c 49 54       0, 2, SQLIT
6920: 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 30 20  E_UTF8,    1, 0 
6930: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6940: 7b 20 22 74 79 70 65 6f 66 22 2c 20 20 20 20 20  { "typeof",     
6950: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51          1, 0, SQ
6960: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
6970: 20 74 79 70 65 6f 66 46 75 6e 63 20 7d 2c 0a 20   typeofFunc },. 
6980: 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20     { "length",  
6990: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
69a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
69b0: 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63 20 7d   0, lengthFunc }
69c0: 2c 0a 20 20 20 20 7b 20 22 73 75 62 73 74 72 22  ,.    { "substr"
69d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 33 2c  ,             3,
69e0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
69f0: 20 20 20 20 30 2c 20 73 75 62 73 74 72 46 75 6e      0, substrFun
6a00: 63 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  c },.#ifndef SQL
6a10: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
6a20: 20 20 20 7b 20 22 73 75 62 73 74 72 22 2c 20 20     { "substr",  
6a30: 20 20 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c             3, 0,
6a40: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
6a50: 20 30 2c 20 73 71 6c 69 74 65 33 75 74 66 31 36   0, sqlite3utf16
6a60: 53 75 62 73 74 72 20 7d 2c 0a 23 65 6e 64 69 66  Substr },.#endif
6a70: 0a 20 20 20 20 7b 20 22 61 62 73 22 2c 20 20 20  .    { "abs",   
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
6a90: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
6aa0: 20 20 20 30 2c 20 61 62 73 46 75 6e 63 20 20 20     0, absFunc   
6ab0: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6f 75 6e 64   },.    { "round
6ac0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6ad0: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
6ae0: 38 2c 20 20 20 20 30 2c 20 72 6f 75 6e 64 46 75  8,    0, roundFu
6af0: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6f  nc  },.    { "ro
6b00: 75 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  und",           
6b10: 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f     2, 0, SQLITE_
6b20: 55 54 46 38 2c 20 20 20 20 30 2c 20 72 6f 75 6e  UTF8,    0, roun
6b30: 64 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20  dFunc  },.    { 
6b40: 22 75 70 70 65 72 22 2c 20 20 20 20 20 20 20 20  "upper",        
6b50: 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49        1, 0, SQLI
6b60: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 75  TE_UTF8,    0, u
6b70: 70 70 65 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20  pperFunc  },.   
6b80: 20 7b 20 22 6c 6f 77 65 72 22 2c 20 20 20 20 20   { "lower",     
6b90: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
6ba0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
6bb0: 2c 20 6c 6f 77 65 72 46 75 6e 63 20 20 7d 2c 0a  , lowerFunc  },.
6bc0: 20 20 20 20 7b 20 22 63 6f 61 6c 65 73 63 65 22      { "coalesce"
6bd0: 2c 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30  ,          -1, 0
6be0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
6bf0: 20 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20    0, ifnullFunc 
6c00: 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65 73  },.    { "coales
6c10: 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 30  ce",           0
6c20: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
6c30: 2c 20 20 20 20 30 2c 20 30 20 20 20 20 20 20 20  ,    0, 0       
6c40: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 61     },.    { "coa
6c50: 6c 65 73 63 65 22 2c 20 20 20 20 20 20 20 20 20  lesce",         
6c60: 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    1, 0, SQLITE_U
6c70: 54 46 38 2c 20 20 20 20 30 2c 20 30 20 20 20 20  TF8,    0, 0    
6c80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6c90: 69 66 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20  ifnull",        
6ca0: 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54       2, 0, SQLIT
6cb0: 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 69 66  E_UTF8,    1, if
6cc0: 6e 75 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20  nullFunc },.    
6cd0: 7b 20 22 72 61 6e 64 6f 6d 22 2c 20 20 20 20 20  { "random",     
6ce0: 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 53 51         -1, 0, SQ
6cf0: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
6d00: 20 72 61 6e 64 6f 6d 46 75 6e 63 20 7d 2c 0a 20   randomFunc },. 
6d10: 20 20 20 7b 20 22 6e 75 6c 6c 69 66 22 2c 20 20     { "nullif",  
6d20: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
6d30: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
6d40: 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e 63 20 7d   1, nullifFunc }
6d50: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  ,.    { "sqlite_
6d60: 76 65 72 73 69 6f 6e 22 2c 20 20 20 20 20 30 2c  version",     0,
6d70: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
6d80: 20 20 20 20 30 2c 20 76 65 72 73 69 6f 6e 46 75      0, versionFu
6d90: 6e 63 7d 2c 0a 20 20 20 20 7b 20 22 71 75 6f 74  nc},.    { "quot
6da0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6db0: 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   1, 0, SQLITE_UT
6dc0: 46 38 2c 20 20 20 20 30 2c 20 71 75 6f 74 65 46  F8,    0, quoteF
6dd0: 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c  unc  },.    { "l
6de0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
6df0: 22 2c 20 20 30 2c 20 31 2c 20 53 51 4c 49 54 45  ",  0, 1, SQLITE
6e00: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 6c 61 73  _UTF8,    0, las
6e10: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 7d  t_insert_rowid }
6e20: 2c 0a 20 20 20 20 7b 20 22 63 68 61 6e 67 65 73  ,.    { "changes
6e30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ",            0,
6e40: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
6e50: 20 20 20 20 30 2c 20 63 68 61 6e 67 65 73 20 20      0, changes  
6e60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74 61    },.    { "tota
6e70: 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  l_changes",     
6e80: 20 30 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54   0, 1, SQLITE_UT
6e90: 46 38 2c 20 20 20 20 30 2c 20 74 6f 74 61 6c 5f  F8,    0, total_
6ea0: 63 68 61 6e 67 65 73 20 7d 2c 0a 23 69 66 64 65  changes },.#ifde
6eb0: 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58  f SQLITE_SOUNDEX
6ec0: 0a 20 20 20 20 7b 20 22 73 6f 75 6e 64 65 78 22  .    { "soundex"
6ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ,            1, 
6ee0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
6ef0: 30 2c 20 73 6f 75 6e 64 65 78 46 75 6e 63 7d 2c  0, soundexFunc},
6f00: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
6f10: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 7b  QLITE_TEST.    {
6f20: 20 22 72 61 6e 64 73 74 72 22 2c 20 20 20 20 20   "randstr",     
6f30: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
6f40: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
6f50: 72 61 6e 64 53 74 72 20 20 20 20 7d 2c 0a 20 20  randStr    },.  
6f60: 20 20 7b 20 22 74 65 73 74 5f 64 65 73 74 72 75    { "test_destru
6f70: 63 74 6f 72 22 2c 20 20 20 20 20 20 20 31 2c 20  ctor",       1, 
6f80: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
6f90: 30 2c 20 74 65 73 74 5f 64 65 73 74 72 75 63 74  0, test_destruct
6fa0: 6f 72 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74  or},.    { "test
6fb0: 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e  _destructor_coun
6fc0: 74 22 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45  t", 0, 0, SQLITE
6fd0: 5f 55 54 46 38 2c 20 30 2c 20 74 65 73 74 5f 64  _UTF8, 0, test_d
6fe0: 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 7d  estructor_count}
6ff0: 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 61 75  ,.    { "test_au
7000: 78 64 61 74 61 22 2c 20 20 20 20 20 20 20 20 20  xdata",         
7010: 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54  -1, 0, SQLITE_UT
7020: 46 38 2c 20 30 2c 20 74 65 73 74 5f 61 75 78 64  F8, 0, test_auxd
7030: 61 74 61 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73  ata},.    { "tes
7040: 74 5f 65 72 72 6f 72 22 2c 20 20 20 20 20 20 20  t_error",       
7050: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
7060: 45 5f 55 54 46 38 2c 20 30 2c 20 74 65 73 74 5f  E_UTF8, 0, test_
7070: 65 72 72 6f 72 7d 2c 0a 23 65 6e 64 69 66 0a 20  error},.#endif. 
7080: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
7090: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
70a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
70b0: 20 73 69 67 6e 65 64 20 63 68 61 72 20 6e 41 72   signed char nAr
70c0: 67 3b 0a 20 20 20 20 75 38 20 61 72 67 54 79 70  g;.    u8 argTyp
70d0: 65 3b 0a 20 20 20 20 75 38 20 6e 65 65 64 43 6f  e;.    u8 needCo
70e0: 6c 6c 53 65 71 3b 0a 20 20 20 20 76 6f 69 64 20  llSeq;.    void 
70f0: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
7100: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
7110: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a  lite3_value**);.
7120: 20 20 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61      void (*xFina
7130: 6c 69 7a 65 29 28 73 71 6c 69 74 65 33 5f 63 6f  lize)(sqlite3_co
7140: 6e 74 65 78 74 2a 29 3b 0a 20 20 7d 20 61 41 67  ntext*);.  } aAg
7150: 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  gs[] = {.    { "
7160: 6d 69 6e 22 2c 20 20 20 20 31 2c 20 30 2c 20 31  min",    1, 0, 1
7170: 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20  , minmaxStep,   
7180: 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20 7d  minMaxFinalize }
7190: 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22 2c 20 20  ,.    { "max",  
71a0: 20 20 31 2c 20 32 2c 20 31 2c 20 6d 69 6e 6d 61    1, 2, 1, minma
71b0: 78 53 74 65 70 2c 20 20 20 6d 69 6e 4d 61 78 46  xStep,   minMaxF
71c0: 69 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20 20 20 7b  inalize },.    {
71d0: 20 22 73 75 6d 22 2c 20 20 20 20 31 2c 20 30 2c   "sum",    1, 0,
71e0: 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20   0, sumStep,    
71f0: 20 20 73 75 6d 46 69 6e 61 6c 69 7a 65 20 20 20    sumFinalize   
7200: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76 67 22 2c   },.    { "avg",
7210: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d      1, 0, 0, sum
7220: 53 74 65 70 2c 20 20 20 20 20 20 61 76 67 46 69  Step,      avgFi
7230: 6e 61 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20 20  nalize    },.   
7240: 20 7b 20 22 63 6f 75 6e 74 22 2c 20 20 30 2c 20   { "count",  0, 
7250: 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c  0, 0, countStep,
7260: 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a      countFinaliz
7270: 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 75  e  },.    { "cou
7280: 6e 74 22 2c 20 20 31 2c 20 30 2c 20 30 2c 20 63  nt",  1, 0, 0, c
7290: 6f 75 6e 74 53 74 65 70 2c 20 20 20 20 63 6f 75  ountStep,    cou
72a0: 6e 74 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20  ntFinalize  },. 
72b0: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   };.  int i;..  
72c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
72d0: 66 28 61 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66  f(aFuncs)/sizeof
72e0: 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b  (aFuncs[0]); i++
72f0: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72  ){.    void *pAr
7300: 67 20 3d 20 30 3b 0a 20 20 20 20 73 77 69 74 63  g = 0;.    switc
7310: 68 28 20 61 46 75 6e 63 73 5b 69 5d 2e 61 72 67  h( aFuncs[i].arg
7320: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
7330: 73 65 20 31 3a 20 70 41 72 67 20 3d 20 64 62 3b  se 1: pArg = db;
7340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
7350: 73 65 20 32 3a 20 70 41 72 67 20 3d 20 28 76 6f  se 2: pArg = (vo
7360: 69 64 20 2a 29 28 2d 31 29 3b 20 62 72 65 61 6b  id *)(-1); break
7370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7380: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7390: 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73 5b 69  ion(db, aFuncs[i
73a0: 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 73 5b  ].zName, aFuncs[
73b0: 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20  i].nArg,.       
73c0: 20 61 46 75 6e 63 73 5b 69 5d 2e 65 54 65 78 74   aFuncs[i].eText
73d0: 52 65 70 2c 20 70 41 72 67 2c 20 61 46 75 6e 63  Rep, pArg, aFunc
73e0: 73 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 2c 20 30  s[i].xFunc, 0, 0
73f0: 29 3b 0a 20 20 20 20 69 66 28 20 61 46 75 6e 63  );.    if( aFunc
7400: 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71  s[i].needCollSeq
7410: 20 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   ){.      FuncDe
7420: 66 20 2a 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  f *pFunc = sqlit
7430: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
7440: 62 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61  b, aFuncs[i].zNa
7450: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  me, .          s
7460: 74 72 6c 65 6e 28 61 46 75 6e 63 73 5b 69 5d 2e  trlen(aFuncs[i].
7470: 7a 4e 61 6d 65 29 2c 20 61 46 75 6e 63 73 5b 69  zName), aFuncs[i
7480: 5d 2e 6e 41 72 67 2c 20 61 46 75 6e 63 73 5b 69  ].nArg, aFuncs[i
7490: 5d 2e 65 54 65 78 74 52 65 70 2c 20 30 29 3b 0a  ].eTextRep, 0);.
74a0: 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 20        if( pFunc 
74b0: 26 26 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 65 65  && aFuncs[i].nee
74c0: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
74d0: 20 20 20 20 70 46 75 6e 63 2d 3e 6e 65 65 64 43      pFunc->needC
74e0: 6f 6c 6c 53 65 71 20 3d 20 31 3b 0a 20 20 20 20  ollSeq = 1;.    
74f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
7500: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7510: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 73  T_ALTERTABLE.  s
7520: 71 6c 69 74 65 33 41 6c 74 65 72 46 75 6e 63 74  qlite3AlterFunct
7530: 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69 66  ions(db);.#endif
7540: 0a 20 20 73 71 6c 69 74 65 33 41 74 74 61 63 68  .  sqlite3Attach
7550: 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20  Functions(db);. 
7560: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
7570: 6f 66 28 61 41 67 67 73 29 2f 73 69 7a 65 6f 66  of(aAggs)/sizeof
7580: 28 61 41 67 67 73 5b 30 5d 29 3b 20 69 2b 2b 29  (aAggs[0]); i++)
7590: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67  {.    void *pArg
75a0: 20 3d 20 30 3b 0a 20 20 20 20 73 77 69 74 63 68   = 0;.    switch
75b0: 28 20 61 41 67 67 73 5b 69 5d 2e 61 72 67 54 79  ( aAggs[i].argTy
75c0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
75d0: 20 31 3a 20 70 41 72 67 20 3d 20 64 62 3b 20 62   1: pArg = db; b
75e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
75f0: 20 32 3a 20 70 41 72 67 20 3d 20 28 76 6f 69 64   2: pArg = (void
7600: 20 2a 29 28 2d 31 29 3b 20 62 72 65 61 6b 3b 0a   *)(-1); break;.
7610: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7620: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7630: 6e 28 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a  n(db, aAggs[i].z
7640: 4e 61 6d 65 2c 20 61 41 67 67 73 5b 69 5d 2e 6e  Name, aAggs[i].n
7650: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
7660: 2c 20 0a 20 20 20 20 20 20 20 20 70 41 72 67 2c  , .        pArg,
7670: 20 30 2c 20 61 41 67 67 73 5b 69 5d 2e 78 53 74   0, aAggs[i].xSt
7680: 65 70 2c 20 61 41 67 67 73 5b 69 5d 2e 78 46 69  ep, aAggs[i].xFi
7690: 6e 61 6c 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  nalize);.    if(
76a0: 20 61 41 67 67 73 5b 69 5d 2e 6e 65 65 64 43 6f   aAggs[i].needCo
76b0: 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 46  llSeq ){.      F
76c0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
76d0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
76e0: 69 6f 6e 28 20 64 62 2c 20 61 41 67 67 73 5b 69  ion( db, aAggs[i
76f0: 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ].zName,.       
7700: 20 20 20 73 74 72 6c 65 6e 28 61 41 67 67 73 5b     strlen(aAggs[
7710: 69 5d 2e 7a 4e 61 6d 65 29 2c 20 61 41 67 67 73  i].zName), aAggs
7720: 5b 69 5d 2e 6e 41 72 67 2c 20 53 51 4c 49 54 45  [i].nArg, SQLITE
7730: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 20  _UTF8, 0);.     
7740: 20 69 66 28 20 70 46 75 6e 63 20 26 26 20 61 41   if( pFunc && aA
7750: 67 67 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53  ggs[i].needCollS
7760: 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  eq ){.        pF
7770: 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  unc->needCollSeq
7780: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
7790: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
77a0: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
77b0: 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  eFunctions(db);.
77c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53  #ifdef SQLITE_SS
77d0: 45 0a 20 20 73 71 6c 69 74 65 33 53 73 65 46 75  E.  sqlite3SseFu
77e0: 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e  nctions(db);.#en
77f0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
7800: 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45  E_CASE_SENSITIVE
7810: 5f 4c 49 4b 45 0a 20 20 73 71 6c 69 74 65 33 52  _LIKE.  sqlite3R
7820: 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74  egisterLikeFunct
7830: 69 6f 6e 73 28 64 62 2c 20 31 29 3b 0a 23 65 6c  ions(db, 1);.#el
7840: 73 65 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  se.  sqlite3Regi
7850: 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  sterLikeFunction
7860: 73 28 64 62 2c 20 30 29 3b 0a 23 65 6e 64 69 66  s(db, 0);.#endif
7870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
7880: 65 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67 20 6f  e LIKEOPT flag o
7890: 6e 20 74 68 65 20 32 2d 61 72 67 75 6d 65 6e 74  n the 2-argument
78a0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
78b0: 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a  he given name..*
78c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
78d0: 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73 71 6c  tLikeOptFlag(sql
78e0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
78f0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
7900: 20 66 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75 6e   flagVal){.  Fun
7910: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 70 44  cDef *pDef;.  pD
7920: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
7930: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
7940: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
7950: 29 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ), 2, SQLITE_UTF
7960: 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 44 65  8, 0);.  if( pDe
7970: 66 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66  f ){.    pDef->f
7980: 6c 61 67 73 20 3d 20 66 6c 61 67 56 61 6c 3b 0a  lags = flagVal;.
7990: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67    }.}../*.** Reg
79a0: 69 73 74 65 72 20 74 68 65 20 62 75 69 6c 74 2d  ister the built-
79b0: 69 6e 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  in LIKE and GLOB
79c0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
79d0: 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 0a 2a   caseSensitive.*
79e0: 2a 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  * parameter dete
79f0: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
7a00: 72 20 6e 6f 74 20 74 68 65 20 4c 49 4b 45 20 6f  r not the LIKE o
7a10: 70 65 72 61 74 6f 72 20 69 73 20 63 61 73 65 0a  perator is case.
7a20: 2a 2a 20 73 65 6e 73 69 74 69 76 65 2e 20 20 47  ** sensitive.  G
7a30: 4c 4f 42 20 69 73 20 61 6c 77 61 79 73 20 63 61  LOB is always ca
7a40: 73 65 20 73 65 6e 73 69 74 69 76 65 2e 0a 2a 2f  se sensitive..*/
7a50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67  .void sqlite3Reg
7a60: 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f  isterLikeFunctio
7a70: 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ns(sqlite3 *db, 
7a80: 69 6e 74 20 63 61 73 65 53 65 6e 73 69 74 69 76  int caseSensitiv
7a90: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6d  e){.  struct com
7aa0: 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b  pareInfo *pInfo;
7ab0: 0a 20 20 69 66 28 20 63 61 73 65 53 65 6e 73 69  .  if( caseSensi
7ac0: 74 69 76 65 20 29 7b 0a 20 20 20 20 70 49 6e 66  tive ){.    pInf
7ad0: 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d 70  o = (struct comp
7ae0: 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e  areInfo*)&likeIn
7af0: 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  foAlt;.  }else{.
7b00: 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72      pInfo = (str
7b10: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a  uct compareInfo*
7b20: 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a  )&likeInfoNorm;.
7b30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 72    }.  sqlite3_cr
7b40: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7b50: 2c 20 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c  , "like", 2, SQL
7b60: 49 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c  ITE_UTF8, pInfo,
7b70: 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 29   likeFunc, 0, 0)
7b80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
7b90: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7ba0: 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54  "like", 3, SQLIT
7bb0: 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c  E_UTF8, pInfo, l
7bc0: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ikeFunc, 0, 0);.
7bd0: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
7be0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 67  _function(db, "g
7bf0: 6c 6f 62 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  lob", 2, SQLITE_
7c00: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 73 74  UTF8, .      (st
7c10: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
7c20: 2a 29 26 67 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b  *)&globInfo, lik
7c30: 65 46 75 6e 63 2c 20 30 2c 30 29 3b 0a 20 20 73  eFunc, 0,0);.  s
7c40: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62  etLikeOptFlag(db
7c50: 2c 20 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45  , "glob", SQLITE
7c60: 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c  _FUNC_LIKE | SQL
7c70: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a  ITE_FUNC_CASE);.
7c80: 20 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67    setLikeOptFlag
7c90: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20  (db, "like", .  
7ca0: 20 20 20 20 63 61 73 65 53 65 6e 73 69 74 69 76      caseSensitiv
7cb0: 65 20 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  e ? (SQLITE_FUNC
7cc0: 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46  _LIKE | SQLITE_F
7cd0: 55 4e 43 5f 43 41 53 45 29 20 3a 20 53 51 4c 49  UNC_CASE) : SQLI
7ce0: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d  TE_FUNC_LIKE);.}
7cf0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f  ../*.** pExpr po
7d00: 69 6e 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65  ints to an expre
7d10: 73 73 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c  ssion which impl
7d20: 65 6d 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f  ements a functio
7d30: 6e 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20  n.  If.** it is 
7d40: 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61  appropriate to a
7d50: 70 70 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70  pply the LIKE op
7d60: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68  timization to th
7d70: 61 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74  at function.** t
7d80: 68 65 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74  hen set aWc[0] t
7d90: 68 72 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f  hrough aWc[2] to
7da0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
7db0: 61 72 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20  aracters and.** 
7dc0: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
7dd0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
7de0: 20 6e 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c   not a LIKE-styl
7df0: 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a  e function then.
7e00: 2a 2a 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  ** return FALSE.
7e10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
7e20: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71  sLikeFunction(sq
7e30: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
7e40: 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73  *pExpr, int *pIs
7e50: 4e 6f 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57  Nocase, char *aW
7e60: 63 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70  c){.  FuncDef *p
7e70: 44 65 66 3b 0a 20 20 69 66 28 20 70 45 78 70 72  Def;.  if( pExpr
7e80: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
7e90: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
7ea0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  0;.  }.  if( pEx
7eb0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
7ec0: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
7ed0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 44 65 66 20  n 0;.  }.  pDef 
7ee0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
7ef0: 63 74 69 6f 6e 28 64 62 2c 20 28 63 68 61 72 2a  ction(db, (char*
7f00: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
7f10: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
7f20: 20 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   2,.            
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
7f50: 3b 0a 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20  ;.  if( pDef==0 
7f60: 7c 7c 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  || (pDef->flags 
7f70: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  & SQLITE_FUNC_LI
7f80: 4b 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  KE)==0 ){.    re
7f90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
7fa0: 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73  * The memcpy() s
7fb0: 74 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73  tatement assumes
7fc0: 20 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61   that the wildca
7fd0: 72 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72  rd characters ar
7fe0: 65 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  e.  ** the first
7ff0: 20 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74   three statement
8000: 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65  s in the compare
8010: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
8020: 20 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   The.  ** assert
8030: 73 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  s() that follow 
8040: 76 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75  verify that assu
8050: 6d 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65  mption.  */.  me
8060: 6d 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e  mcpy(aWc, pDef->
8070: 70 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20  pUserData, 3);. 
8080: 20 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29   assert( (char*)
8090: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20  &likeInfoAlt == 
80a0: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
80b0: 41 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a  Alt.matchAll );.
80c0: 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61    assert( &((cha
80d0: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29  r*)&likeInfoAlt)
80e0: 5b 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c  [1] == (char*)&l
80f0: 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68  ikeInfoAlt.match
8100: 4f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  One );.  assert(
8110: 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49   &((char*)&likeI
8120: 6e 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63  nfoAlt)[2] == (c
8130: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
8140: 74 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20  t.matchSet );.  
8150: 2a 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44  *pIsNocase = (pD
8160: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
8170: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30  TE_FUNC_CASE)==0
8180: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.