/ Hex Artifact Content
Login

Artifact dd9cea8ed3246d7a4c49fd01034d470d5702b8b0:


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 33 33 20 32 30 30 36 2f 30 38 2f 31 39  1.133 2006/08/19
02a0: 20 31 31 3a 33 34 3a 30 31 20 64 72 68 20 45 78   11:34:01 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 7b 0a 20 20 20 20 20 20 20 20 69 66  <0 ){.        if
0c50: 28 20 28 69 56 61 6c 3c 3c 31 29 3d 3d 30 20 29  ( (iVal<<1)==0 )
0c60: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
0c70: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
0c80: 28 63 6f 6e 74 65 78 74 2c 20 22 69 6e 74 65 67  (context, "integ
0c90: 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c 20 2d 31  er overflow", -1
0ca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
0cb0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
0cc0: 20 20 20 20 20 20 20 69 56 61 6c 20 3d 20 2d 69         iVal = -i
0cd0: 56 61 6c 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20  Val;.      } .  
0ce0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0cf0: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
0d00: 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 62  , iVal);.      b
0d10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
0d20: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
0d30: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
0d40: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f  3_result_null(co
0d50: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 62 72  ntext);.      br
0d60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
0d70: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
0d80: 64 6f 75 62 6c 65 20 72 56 61 6c 20 3d 20 73 71  double rVal = sq
0d90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
0da0: 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  le(argv[0]);.   
0db0: 20 20 20 69 66 28 20 72 56 61 6c 3c 30 20 29 20     if( rVal<0 ) 
0dc0: 72 56 61 6c 20 3d 20 2d 72 56 61 6c 3b 0a 20 20  rVal = -rVal;.  
0dd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0de0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
0df0: 74 2c 20 72 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, rVal);.      
0e00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
0e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
0e20: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0e30: 73 75 62 73 74 72 28 29 20 66 75 6e 63 74 69 6f  substr() functio
0e40: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
0e50: 20 73 75 62 73 74 72 46 75 6e 63 28 0a 20 20 73   substrFunc(.  s
0e60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
0e70: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
0e80: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
0e90: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
0ea0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
0eb0: 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74  char *z;.  const
0ec0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0ed0: 7a 32 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  z2;.  int i;.  i
0ee0: 6e 74 20 70 31 2c 20 70 32 2c 20 6c 65 6e 3b 0a  nt p1, p2, len;.
0ef0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
0f00: 3d 33 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  =3 );.  z = sqli
0f10: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
0f20: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
0f30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
0f40: 70 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  p1 = sqlite3_val
0f50: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b  ue_int(argv[1]);
0f60: 0a 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f  .  p2 = sqlite3_
0f70: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32  value_int(argv[2
0f80: 5d 29 3b 0a 20 20 66 6f 72 28 6c 65 6e 3d 30 2c  ]);.  for(len=0,
0f90: 20 7a 32 3d 7a 3b 20 2a 7a 32 3b 20 7a 32 2b 2b   z2=z; *z2; z2++
0fa0: 29 7b 20 69 66 28 20 28 30 78 63 30 26 2a 7a 32  ){ if( (0xc0&*z2
0fb0: 29 21 3d 30 78 38 30 20 29 20 6c 65 6e 2b 2b 3b  )!=0x80 ) len++;
0fc0: 20 7d 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b   }.  if( p1<0 ){
0fd0: 0a 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a  .    p1 += len;.
0fe0: 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a      if( p1<0 ){.
0ff0: 20 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a        p2 += p1;.
1000: 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20 20        p1 = 0;.  
1010: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1020: 70 31 3e 30 20 29 7b 0a 20 20 20 20 70 31 2d 2d  p1>0 ){.    p1--
1030: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 31 2b 70  ;.  }.  if( p1+p
1040: 32 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 70 32 20  2>len ){.    p2 
1050: 3d 20 6c 65 6e 2d 70 31 3b 0a 20 20 7d 0a 20 20  = len-p1;.  }.  
1060: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 31 20 26 26  for(i=0; i<p1 &&
1070: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
1080: 20 69 66 28 20 28 7a 5b 69 5d 26 30 78 63 30 29   if( (z[i]&0xc0)
1090: 3d 3d 30 78 38 30 20 29 20 70 31 2b 2b 3b 0a 20  ==0x80 ) p1++;. 
10a0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d   }.  while( z[i]
10b0: 20 26 26 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d   && (z[i]&0xc0)=
10c0: 3d 30 78 38 30 20 29 7b 20 69 2b 2b 3b 20 70 31  =0x80 ){ i++; p1
10d0: 2b 2b 3b 20 7d 0a 20 20 66 6f 72 28 3b 20 69 3c  ++; }.  for(; i<
10e0: 70 31 2b 70 32 20 26 26 20 7a 5b 69 5d 3b 20 69  p1+p2 && z[i]; i
10f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 5b  ++){.    if( (z[
1100: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
1110: 20 70 32 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69   p2++;.  }.  whi
1120: 6c 65 28 20 7a 5b 69 5d 20 26 26 20 28 7a 5b 69  le( z[i] && (z[i
1130: 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b  ]&0xc0)==0x80 ){
1140: 20 69 2b 2b 3b 20 70 32 2b 2b 3b 20 7d 0a 20 20   i++; p2++; }.  
1150: 69 66 28 20 70 32 3c 30 20 29 20 70 32 20 3d 20  if( p2<0 ) p2 = 
1160: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  0;.  sqlite3_res
1170: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
1180: 2c 20 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c  , (char*)&z[p1],
1190: 20 70 32 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   p2, SQLITE_TRAN
11a0: 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  SIENT);.}../*.**
11b0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
11c0: 6f 66 20 74 68 65 20 72 6f 75 6e 64 28 29 20 66  of the round() f
11d0: 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  unction.*/.stati
11e0: 63 20 76 6f 69 64 20 72 6f 75 6e 64 46 75 6e 63  c void roundFunc
11f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
1200: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
1210: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
1220: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e  ue **argv){.  in
1230: 74 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c  t n = 0;.  doubl
1240: 65 20 72 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  e r;.  char zBuf
1250: 5b 35 30 30 5d 3b 20 20 2f 2a 20 6c 61 72 67 65  [500];  /* large
1260: 72 20 74 68 61 6e 20 74 68 65 20 25 66 20 72 65  r than the %f re
1270: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1280: 74 68 65 20 6c 61 72 67 65 73 74 20 64 6f 75 62  the largest doub
1290: 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
12a0: 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d  argc==1 || argc=
12b0: 3d 32 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63  =2 );.  if( argc
12c0: 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 53  ==2 ){.    if( S
12d0: 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69  QLITE_NULL==sqli
12e0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
12f0: 72 67 76 5b 31 5d 29 20 29 20 72 65 74 75 72 6e  rgv[1]) ) return
1300: 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
1310: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
1320: 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  [1]);.    if( n>
1330: 33 30 20 29 20 6e 20 3d 20 33 30 3b 0a 20 20 20  30 ) n = 30;.   
1340: 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30   if( n<0 ) n = 0
1350: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1360: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1370: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
1380: 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20  NULL ) return;. 
1390: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   r = sqlite3_val
13a0: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
13b0: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ]);.  sqlite3_sn
13c0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
13d0: 75 66 29 2c 7a 42 75 66 2c 22 25 2e 2a 66 22 2c  uf),zBuf,"%.*f",
13e0: 6e 2c 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 41  n,r);.  sqlite3A
13f0: 74 6f 46 28 7a 42 75 66 2c 20 26 72 29 3b 0a 20  toF(zBuf, &r);. 
1400: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1410: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
1420: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  r);.}../*.** Imp
1430: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1440: 68 65 20 75 70 70 65 72 28 29 20 61 6e 64 20 6c  he upper() and l
1450: 6f 77 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74  ower() SQL funct
1460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
1470: 76 6f 69 64 20 75 70 70 65 72 46 75 6e 63 28 73  void upperFunc(s
1480: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1490: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
14a0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
14b0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 75 6e 73 69   **argv){.  unsi
14c0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
14d0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
14e0: 63 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55  c<1 || SQLITE_NU
14f0: 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL==sqlite3_valu
1500: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
1510: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
1520: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 71 6c  sqliteMalloc(sql
1530: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
1540: 28 61 72 67 76 5b 30 5d 29 2b 31 29 3b 0a 20 20  (argv[0])+1);.  
1550: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1560: 6e 3b 0a 20 20 73 74 72 63 70 79 28 28 63 68 61  n;.  strcpy((cha
1570: 72 2a 29 7a 2c 20 28 63 68 61 72 2a 29 73 71 6c  r*)z, (char*)sql
1580: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1590: 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 66 6f 72  argv[0]));.  for
15a0: 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
15b0: 7b 0a 20 20 20 20 7a 5b 69 5d 20 3d 20 74 6f 75  {.    z[i] = tou
15c0: 70 70 65 72 28 7a 5b 69 5d 29 3b 0a 20 20 7d 0a  pper(z[i]);.  }.
15d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
15e0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
15f0: 63 68 61 72 2a 29 7a 2c 20 2d 31 2c 20 53 51 4c  char*)z, -1, SQL
1600: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1610: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
1620: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1630: 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33  owerFunc(sqlite3
1640: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1650: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
1660: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
1670: 76 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  v){.  unsigned c
1680: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b  har *z;.  int i;
1690: 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 7c 7c  .  if( argc<1 ||
16a0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71   SQLITE_NULL==sq
16b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
16c0: 28 61 72 67 76 5b 30 5d 29 20 29 20 72 65 74 75  (argv[0]) ) retu
16d0: 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
16e0: 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 76  Malloc(sqlite3_v
16f0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
1700: 30 5d 29 2b 31 29 3b 0a 20 20 69 66 28 20 7a 3d  0])+1);.  if( z=
1710: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1720: 74 72 63 70 79 28 28 63 68 61 72 2a 29 7a 2c 20  trcpy((char*)z, 
1730: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
1740: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
1750: 5d 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ]));.  for(i=0; 
1760: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
1770: 7a 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a  z[i] = tolower(z
1780: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
1790: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
17a0: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
17b0: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  z, -1, SQLITE_TR
17c0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
17d0: 74 65 46 72 65 65 28 7a 29 3b 0a 7d 0a 0a 2f 2a  teFree(z);.}../*
17e0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
17f0: 6f 6e 20 6f 66 20 74 68 65 20 49 46 4e 55 4c 4c  on of the IFNULL
1800: 28 29 2c 20 4e 56 4c 28 29 2c 20 61 6e 64 20 43  (), NVL(), and C
1810: 4f 41 4c 45 53 43 45 28 29 20 66 75 6e 63 74 69  OALESCE() functi
1820: 6f 6e 73 2e 20 20 0a 2a 2a 20 41 6c 6c 20 74 68  ons.  .** All th
1830: 72 65 65 20 64 6f 20 74 68 65 20 73 61 6d 65 20  ree do the same 
1840: 74 68 69 6e 67 2e 20 20 54 68 65 79 20 72 65 74  thing.  They ret
1850: 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 6e 6f  urn the first no
1860: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61 72 67 75 6d 65  n-NULL.** argume
1870: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
1880: 69 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20  id ifnullFunc(. 
1890: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
18a0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
18b0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
18c0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
18d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
18e0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
18f0: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
1900: 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f  E_NULL!=sqlite3_
1910: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
1920: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  i]) ){.      sql
1930: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
1940: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
1950: 69 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  i]);.      break
1960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1970: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1980: 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e  ion of random().
1990: 20 20 52 65 74 75 72 6e 20 61 20 72 61 6e 64 6f    Return a rando
19a0: 6d 20 69 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a  m integer.  .*/.
19b0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64  static void rand
19c0: 6f 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  omFunc(.  sqlite
19d0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
19e0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
19f0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1a00: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1a10: 74 65 5f 69 6e 74 36 34 20 72 3b 0a 20 20 73 71  te_int64 r;.  sq
1a20: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
1a30: 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a  sizeof(r), &r);.
1a40: 20 20 69 66 28 20 28 72 3c 3c 31 29 3d 3d 30 20    if( (r<<1)==0 
1a50: 29 20 72 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  ) r = 0;  /* Pre
1a60: 76 65 6e 74 20 30 78 38 30 30 30 2e 2e 2e 2e 20  vent 0x8000.... 
1a70: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 6f  as the result so
1a80: 20 74 68 61 74 20 77 65 20 2a 2f 0a 20 20 20 20   that we */.    
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 20 20 2f 2a 20 63 61 6e 20 61 6c 77        /* can alw
1ab0: 61 79 73 20 64 6f 20 61 62 73 28 29 20 6f 66 20  ays do abs() of 
1ac0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
1ad0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1ae0: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 29  nt64(context, r)
1af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1b00: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1b10: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
1b20: 69 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  id() SQL functio
1b30: 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e 0a 2a  n.  The return.*
1b40: 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  * value is the s
1b50: 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74  ame as the sqlit
1b60: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
1b70: 6f 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74  owid() API funct
1b80: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1b90: 6f 69 64 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  oid last_insert_
1ba0: 72 6f 77 69 64 28 0a 20 20 73 71 6c 69 74 65 33  rowid(.  sqlite3
1bb0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1bc0: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 2c 20 0a  t, .  int arg, .
1bd0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1be0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1bf0: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
1c00: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
1c10: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ext);.  sqlite3_
1c20: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
1c30: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 61  text, sqlite3_la
1c40: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
1c50: 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  db));.}../*.** I
1c60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1c70: 20 74 68 65 20 63 68 61 6e 67 65 73 28 29 20 53   the changes() S
1c80: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
1c90: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1ca0: 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  s the.** same as
1cb0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 68 61   the sqlite3_cha
1cc0: 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e 63 74  nges() API funct
1cd0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1ce0: 6f 69 64 20 63 68 61 6e 67 65 73 28 0a 20 20 73  oid changes(.  s
1cf0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1d00: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
1d10: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
1d20: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
1d30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
1d40: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
1d50: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69  context);.  sqli
1d60: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
1d70: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
1d80: 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a  changes(db));.}.
1d90: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1da0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74  ation of the tot
1db0: 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 53 51 4c  al_changes() SQL
1dc0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
1dd0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 0a  return value is.
1de0: 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  ** the same as t
1df0: 68 65 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  he sqlite3_total
1e00: 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49 20 66  _changes() API f
1e10: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1e20: 69 63 20 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68  ic void total_ch
1e30: 61 6e 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33  anges(.  sqlite3
1e40: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1e50: 74 2c 0a 20 20 69 6e 74 20 61 72 67 2c 0a 20 20  t,.  int arg,.  
1e60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1e70: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1e80: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
1e90: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
1ea0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  t);.  sqlite3_re
1eb0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
1ec0: 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  , sqlite3_total_
1ed0: 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a  changes(db));.}.
1ee0: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
1ef0: 72 65 20 64 65 66 69 6e 69 6e 67 20 68 6f 77 20  re defining how 
1f00: 74 6f 20 64 6f 20 47 4c 4f 42 2d 73 74 79 6c 65  to do GLOB-style
1f10: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f   comparisons..*/
1f20: 0a 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  .struct compareI
1f30: 6e 66 6f 20 7b 0a 20 20 75 38 20 6d 61 74 63 68  nfo {.  u8 match
1f40: 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68 4f  All;.  u8 matchO
1f50: 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63 68 53 65  ne;.  u8 matchSe
1f60: 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65 3b 0a  t;.  u8 noCase;.
1f70: 7d 3b 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  };..static const
1f80: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
1f90: 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b  nfo globInfo = {
1fa0: 20 27 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c 20   '*', '?', '[', 
1fb0: 30 20 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72 72  0 };./* The corr
1fc0: 65 63 74 20 53 51 4c 2d 39 32 20 62 65 68 61 76  ect SQL-92 behav
1fd0: 69 6f 72 20 69 73 20 66 6f 72 20 74 68 65 20 4c  ior is for the L
1fe0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  IKE operator to 
1ff0: 69 67 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e 20  ignore.** case. 
2000: 20 54 68 75 73 20 20 27 61 27 20 4c 49 4b 45 20   Thus  'a' LIKE 
2010: 27 41 27 20 77 6f 75 6c 64 20 62 65 20 74 72 75  'A' would be tru
2020: 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e. */.static con
2030: 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  st struct compar
2040: 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f  eInfo likeInfoNo
2050: 72 6d 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c  rm = { '%', '_',
2060: 20 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66     0, 1 };./* If
2070: 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e   SQLITE_CASE_SEN
2080: 53 49 54 49 56 45 5f 4c 49 4b 45 20 69 73 20 64  SITIVE_LIKE is d
2090: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
20a0: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a 2a   LIKE operator.*
20b0: 2a 20 69 73 20 63 61 73 65 20 73 65 6e 73 69 74  * is case sensit
20c0: 69 76 65 20 63 61 75 73 69 6e 67 20 27 61 27 20  ive causing 'a' 
20d0: 4c 49 4b 45 20 27 41 27 20 74 6f 20 62 65 20 66  LIKE 'A' to be f
20e0: 61 6c 73 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  alse */.static c
20f0: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
2100: 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f  areInfo likeInfo
2110: 41 6c 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27  Alt = { '%', '_'
2120: 2c 20 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a  ,   0, 0 };../*.
2130: 2a 2a 20 58 20 69 73 20 61 20 70 6f 69 6e 74 65  ** X is a pointe
2140: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  r to the first b
2150: 79 74 65 20 6f 66 20 61 20 55 54 46 2d 38 20 63  yte of a UTF-8 c
2160: 68 61 72 61 63 74 65 72 2e 20 20 49 6e 63 72 65  haracter.  Incre
2170: 6d 65 6e 74 0a 2a 2a 20 58 20 73 6f 20 74 68 61  ment.** X so tha
2180: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
2190: 68 65 20 6e 65 78 74 20 63 68 61 72 61 63 74 65  he next characte
21a0: 72 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  r.  This only wo
21b0: 72 6b 73 20 72 69 67 68 74 0a 2a 2a 20 69 66 20  rks right.** if 
21c0: 58 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 77 65  X points to a we
21d0: 6c 6c 2d 66 6f 72 6d 65 64 20 55 54 46 2d 38 20  ll-formed UTF-8 
21e0: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69  string..*/.#defi
21f0: 6e 65 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61  ne sqliteNextCha
2200: 72 28 58 29 20 20 77 68 69 6c 65 28 20 28 30 78  r(X)  while( (0x
2210: 63 30 26 2a 2b 2b 28 58 29 29 3d 3d 30 78 38 30  c0&*++(X))==0x80
2220: 20 29 7b 7d 0a 23 64 65 66 69 6e 65 20 73 71 6c   ){}.#define sql
2230: 69 74 65 43 68 61 72 56 61 6c 28 58 29 20 20 20  iteCharVal(X)   
2240: 73 71 6c 69 74 65 33 52 65 61 64 55 74 66 38 28  sqlite3ReadUtf8(
2250: 58 29 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  X).../*.** Compa
2260: 72 65 20 74 77 6f 20 55 54 46 2d 38 20 73 74 72  re two UTF-8 str
2270: 69 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69 74  ings for equalit
2280: 79 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  y where the firs
2290: 74 20 73 74 72 69 6e 67 20 63 61 6e 0a 2a 2a 20  t string can.** 
22a0: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 61  potentially be a
22b0: 20 22 67 6c 6f 62 22 20 65 78 70 72 65 73 73 69   "glob" expressi
22c0: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  on.  Return true
22d0: 20 28 31 29 20 69 66 20 74 68 65 79 0a 2a 2a 20   (1) if they.** 
22e0: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64  are the same and
22f0: 20 66 61 6c 73 65 20 28 30 29 20 69 66 20 74 68   false (0) if th
2300: 65 79 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ey are different
2310: 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67  ..**.** Globbing
2320: 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
2330: 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74     '*'       Mat
2340: 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63  ches any sequenc
2350: 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  e of zero or mor
2360: 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a  e characters..**
2370: 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20  .**      '?'    
2380: 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74     Matches exact
2390: 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  ly one character
23a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e  ..**.**     [...
23b0: 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  ]      Matches o
23c0: 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f  ne character fro
23d0: 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c  m the enclosed l
23e0: 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  ist of.**       
23f0: 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74           charact
2400: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b  ers..**.**     [
2410: 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65  ^...]     Matche
2420: 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20  s one character 
2430: 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f  not in the enclo
2440: 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  sed list..**.** 
2450: 57 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61  With the [...] a
2460: 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69  nd [^...] matchi
2470: 6e 67 2c 20 61 20 27 5d 27 20 63 68 61 72 61 63  ng, a ']' charac
2480: 74 65 72 20 63 61 6e 20 62 65 20 69 6e 63 6c 75  ter can be inclu
2490: 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ded.** in the li
24a0: 73 74 20 62 79 20 6d 61 6b 69 6e 67 20 69 74 20  st by making it 
24b0: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
24c0: 74 65 72 20 61 66 74 65 72 20 27 5b 27 20 6f 72  ter after '[' or
24d0: 20 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67   '^'.  A.** rang
24e0: 65 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  e of characters 
24f0: 63 61 6e 20 62 65 20 73 70 65 63 69 66 69 65 64  can be specified
2500: 20 75 73 69 6e 67 20 27 2d 27 2e 20 20 45 78 61   using '-'.  Exa
2510: 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22  mple:.** "[a-z]"
2520: 20 6d 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e   matches any sin
2530: 67 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c  gle lower-case l
2540: 65 74 74 65 72 2e 20 20 54 6f 20 6d 61 74 63 68  etter.  To match
2550: 20 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20   a '-', make.** 
2560: 69 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  it the last char
2570: 61 63 74 65 72 20 69 6e 20 74 68 65 20 6c 69 73  acter in the lis
2580: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
2590: 75 74 69 6e 65 20 69 73 20 75 73 75 61 6c 6c 79  utine is usually
25a0: 20 71 75 69 63 6b 2c 20 62 75 74 20 63 61 6e 20   quick, but can 
25b0: 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77  be N**2 in the w
25c0: 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  orst case..**.**
25d0: 20 48 69 6e 74 73 3a 20 74 6f 20 6d 61 74 63 68   Hints: to match
25e0: 20 27 2a 27 20 6f 72 20 27 3f 27 2c 20 70 75 74   '*' or '?', put
25f0: 20 74 68 65 6d 20 69 6e 20 22 5b 5d 22 2e 20 20   them in "[]".  
2600: 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
2610: 20 20 20 20 20 20 20 20 20 61 62 63 5b 2a 5d 78           abc[*]x
2620: 79 7a 20 20 20 20 20 20 20 20 4d 61 74 63 68 65  yz        Matche
2630: 73 20 22 61 62 63 2a 78 79 7a 22 20 6f 6e 6c 79  s "abc*xyz" only
2640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2650: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 0a 20  atternCompare(. 
2660: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 61 74 74   const u8 *zPatt
2670: 65 72 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ern,            
2680: 20 20 2f 2a 20 54 68 65 20 67 6c 6f 62 20 70 61    /* The glob pa
2690: 74 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ttern */.  const
26a0: 20 75 38 20 2a 7a 53 74 72 69 6e 67 2c 20 20 20   u8 *zString,   
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26c0: 68 65 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d  he string to com
26d0: 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 65  pare against the
26e0: 20 67 6c 6f 62 20 2a 2f 0a 20 20 63 6f 6e 73 74   glob */.  const
26f0: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
2700: 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49  nfo *pInfo, /* I
2710: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
2720: 20 68 6f 77 20 74 6f 20 64 6f 20 74 68 65 20 63   how to do the c
2730: 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  ompare */.  cons
2740: 74 20 69 6e 74 20 65 73 63 20 20 20 20 20 20 20  t int esc       
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 54 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61  The escape chara
2770: 63 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 72 65 67  cter */.){.  reg
2780: 69 73 74 65 72 20 69 6e 74 20 63 3b 0a 20 20 69  ister int c;.  i
2790: 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74  nt invert;.  int
27a0: 20 73 65 65 6e 3b 0a 20 20 69 6e 74 20 63 32 3b   seen;.  int c2;
27b0: 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e 65 20 3d  .  u8 matchOne =
27c0: 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65   pInfo->matchOne
27d0: 3b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c 20  ;.  u8 matchAll 
27e0: 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c  = pInfo->matchAl
27f0: 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68 53 65 74  l;.  u8 matchSet
2800: 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53   = pInfo->matchS
2810: 65 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65 20  et;.  u8 noCase 
2820: 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43 61 73 65 3b  = pInfo->noCase;
2830: 20 0a 20 20 69 6e 74 20 70 72 65 76 45 73 63 61   .  int prevEsca
2840: 70 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  pe = 0;     /* T
2850: 72 75 65 20 69 66 20 74 68 65 20 70 72 65 76 69  rue if the previ
2860: 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 77 61  ous character wa
2870: 73 20 27 65 73 63 61 70 65 27 20 2a 2f 0a 0a 20  s 'escape' */.. 
2880: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 7a 50   while( (c = *zP
2890: 61 74 74 65 72 6e 29 21 3d 30 20 29 7b 0a 20 20  attern)!=0 ){.  
28a0: 20 20 69 66 28 20 21 70 72 65 76 45 73 63 61 70    if( !prevEscap
28b0: 65 20 26 26 20 63 3d 3d 6d 61 74 63 68 41 6c 6c  e && c==matchAll
28c0: 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
28d0: 20 28 63 3d 7a 50 61 74 74 65 72 6e 5b 31 5d 29   (c=zPattern[1])
28e0: 20 3d 3d 20 6d 61 74 63 68 41 6c 6c 20 7c 7c 20   == matchAll || 
28f0: 63 20 3d 3d 20 6d 61 74 63 68 4f 6e 65 20 29 7b  c == matchOne ){
2900: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
2910: 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20  matchOne ){.    
2920: 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69        if( *zStri
2930: 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ng==0 ) return 0
2940: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2950: 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69  teNextChar(zStri
2960: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ng);.        }. 
2970: 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b         zPattern+
2980: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
2990: 20 69 66 28 20 63 20 26 26 20 65 73 63 20 26 26   if( c && esc &&
29a0: 20 73 71 6c 69 74 65 33 52 65 61 64 55 74 66 38   sqlite3ReadUtf8
29b0: 28 26 7a 50 61 74 74 65 72 6e 5b 31 5d 29 3d 3d  (&zPattern[1])==
29c0: 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75  esc ){.        u
29d0: 38 20 63 6f 6e 73 74 20 2a 7a 54 65 6d 70 20 3d  8 const *zTemp =
29e0: 20 26 7a 50 61 74 74 65 72 6e 5b 31 5d 3b 0a 20   &zPattern[1];. 
29f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78         sqliteNex
2a00: 74 43 68 61 72 28 7a 54 65 6d 70 29 3b 0a 20 20  tChar(zTemp);.  
2a10: 20 20 20 20 20 20 63 20 3d 20 2a 7a 54 65 6d 70        c = *zTemp
2a20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a30: 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72  if( c==0 ) retur
2a40: 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 63  n 1;.      if( c
2a50: 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a 20 20  ==matchSet ){.  
2a60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 73        assert( es
2a70: 63 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69  c==0 );   /* Thi
2a80: 73 20 69 73 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c  s is GLOB, not L
2a90: 49 4b 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 77  IKE */.        w
2aa0: 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 26  hile( *zString &
2ab0: 26 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  & patternCompare
2ac0: 28 26 7a 50 61 74 74 65 72 6e 5b 31 5d 2c 7a 53  (&zPattern[1],zS
2ad0: 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29  tring,pInfo,esc)
2ae0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2af0: 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28   sqliteNextChar(
2b00: 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20  zString);.      
2b10: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
2b20: 72 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a  rn *zString!=0;.
2b30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b40: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 20       while( (c2 
2b50: 3d 20 2a 7a 53 74 72 69 6e 67 29 21 3d 30 20 29  = *zString)!=0 )
2b60: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2b70: 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20  noCase ){.      
2b80: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
2b90: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
2ba0: 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2];.            
2bb0: 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72  c = sqlite3Upper
2bc0: 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20  ToLower[c];.    
2bd0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
2be0: 32 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20  2 != 0 && c2 != 
2bf0: 63 20 29 7b 20 63 32 20 3d 20 73 71 6c 69 74 65  c ){ c2 = sqlite
2c00: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 2b  3UpperToLower[*+
2c10: 2b 7a 53 74 72 69 6e 67 5d 3b 20 7d 0a 20 20 20  +zString]; }.   
2c20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c30: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2c40: 20 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21   c2 != 0 && c2 !
2c50: 3d 20 63 20 29 7b 20 63 32 20 3d 20 2a 2b 2b 7a  = c ){ c2 = *++z
2c60: 53 74 72 69 6e 67 3b 20 7d 0a 20 20 20 20 20 20  String; }.      
2c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c80: 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75  if( c2==0 ) retu
2c90: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
2ca0: 69 66 28 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  if( patternCompa
2cb0: 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31 5d 2c  re(&zPattern[1],
2cc0: 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73  zString,pInfo,es
2cd0: 63 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  c) ) return 1;. 
2ce0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e           sqliteN
2cf0: 65 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67 29  extChar(zString)
2d00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2d20: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2d30: 69 66 28 20 21 70 72 65 76 45 73 63 61 70 65 20  if( !prevEscape 
2d40: 26 26 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 29  && c==matchOne )
2d50: 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74  {.      if( *zSt
2d60: 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  ring==0 ) return
2d70: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
2d80: 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67  NextChar(zString
2d90: 29 3b 0a 20 20 20 20 20 20 7a 50 61 74 74 65 72  );.      zPatter
2da0: 6e 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n++;.    }else i
2db0: 66 28 20 63 3d 3d 6d 61 74 63 68 53 65 74 20 29  f( c==matchSet )
2dc0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  {.      int prio
2dd0: 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  r_c = 0;.      a
2de0: 73 73 65 72 74 28 20 65 73 63 3d 3d 30 20 29 3b  ssert( esc==0 );
2df0: 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79      /* This only
2e00: 20 6f 63 63 75 72 73 20 66 6f 72 20 47 4c 4f 42   occurs for GLOB
2e10: 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20  , not LIKE */.  
2e20: 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20      seen = 0;.  
2e30: 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a      invert = 0;.
2e40: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
2e50: 43 68 61 72 56 61 6c 28 7a 53 74 72 69 6e 67 29  CharVal(zString)
2e60: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  ;.      if( c==0
2e70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2e80: 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74     c2 = *++zPatt
2e90: 65 72 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ern;.      if( c
2ea0: 32 3d 3d 27 5e 27 20 29 7b 20 69 6e 76 65 72 74  2=='^' ){ invert
2eb0: 20 3d 20 31 3b 20 63 32 20 3d 20 2a 2b 2b 7a 50   = 1; c2 = *++zP
2ec0: 61 74 74 65 72 6e 3b 20 7d 0a 20 20 20 20 20 20  attern; }.      
2ed0: 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20  if( c2==']' ){. 
2ee0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d         if( c==']
2ef0: 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20  ' ) seen = 1;.  
2f00: 20 20 20 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50        c2 = *++zP
2f10: 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  attern;.      }.
2f20: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 32        while( (c2
2f30: 20 3d 20 73 71 6c 69 74 65 43 68 61 72 56 61 6c   = sqliteCharVal
2f40: 28 7a 50 61 74 74 65 72 6e 29 29 21 3d 30 20 26  (zPattern))!=0 &
2f50: 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20  & c2!=']' ){.   
2f60: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27       if( c2=='-'
2f70: 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21   && zPattern[1]!
2f80: 3d 27 5d 27 20 26 26 20 7a 50 61 74 74 65 72 6e  =']' && zPattern
2f90: 5b 31 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f  [1]!=0 && prior_
2fa0: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
2fb0: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
2fc0: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
2fd0: 74 65 43 68 61 72 56 61 6c 28 7a 50 61 74 74 65  teCharVal(zPatte
2fe0: 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rn);.          i
2ff0: 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26  f( c>=prior_c &&
3000: 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20   c<=c2 ) seen = 
3010: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  1;.          pri
3020: 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
3030: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 63    }else if( c==c
3040: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  2 ){.          s
3050: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
3060: 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b     prior_c = c2;
3070: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3080: 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
3090: 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
30a0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
30b0: 4e 65 78 74 43 68 61 72 28 7a 50 61 74 74 65 72  NextChar(zPatter
30c0: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
30d0: 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28    if( c2==0 || (
30e0: 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d  seen ^ invert)==
30f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3100: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
3110: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
3120: 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20     zPattern++;. 
3130: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 73 63     }else if( esc
3140: 20 26 26 20 21 70 72 65 76 45 73 63 61 70 65 20   && !prevEscape 
3150: 26 26 20 73 71 6c 69 74 65 33 52 65 61 64 55 74  && sqlite3ReadUt
3160: 66 38 28 7a 50 61 74 74 65 72 6e 29 3d 3d 65 73  f8(zPattern)==es
3170: 63 29 7b 0a 20 20 20 20 20 20 70 72 65 76 45 73  c){.      prevEs
3180: 63 61 70 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  cape = 1;.      
3190: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
31a0: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 7d 65  Pattern);.    }e
31b0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  lse{.      if( n
31c0: 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  oCase ){.       
31d0: 20 69 66 28 20 73 71 6c 69 74 65 33 55 70 70 65   if( sqlite3Uppe
31e0: 72 54 6f 4c 6f 77 65 72 5b 63 5d 20 21 3d 20 73  rToLower[c] != s
31f0: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
3200: 65 72 5b 2a 7a 53 74 72 69 6e 67 5d 20 29 20 72  er[*zString] ) r
3210: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
3220: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
3230: 28 20 63 20 21 3d 20 2a 7a 53 74 72 69 6e 67 20  ( c != *zString 
3240: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
3250: 20 20 7d 0a 20 20 20 20 20 20 7a 50 61 74 74 65    }.      zPatte
3260: 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 7a 53 74 72  rn++;.      zStr
3270: 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 70 72 65  ing++;.      pre
3280: 76 45 73 63 61 70 65 20 3d 20 30 3b 0a 20 20 20  vEscape = 0;.   
3290: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
32a0: 2a 7a 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a  *zString==0;.}..
32b0: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
32c0: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
32d0: 74 68 61 74 20 74 68 65 20 4c 49 4b 45 20 6f 70  that the LIKE op
32e0: 65 72 61 74 6f 72 20 28 6f 72 20 47 4c 4f 42 20  erator (or GLOB 
32f0: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6a 75 73 74  which is.** just
3300: 20 61 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20   a variation of 
3310: 4c 49 4b 45 29 20 67 65 74 73 20 63 61 6c 6c 65  LIKE) gets calle
3320: 64 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  d.  This is used
3330: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
3340: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
3350: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
3360: 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75  sqlite3_like_cou
3370: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
3380: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
3390: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6b  ation of the lik
33a0: 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  e() SQL function
33b0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
33c0: 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74   implements.** t
33d0: 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49 4b 45  he build-in LIKE
33e0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
33f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
3400: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  o the function i
3410: 73 20 74 68 65 0a 2a 2a 20 70 61 74 74 65 72 6e  s the.** pattern
3420: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
3430: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
3440: 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20 74 68 65  string.  So, the
3450: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a   SQL statements:
3460: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20 4c  .**.**       A L
3470: 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69  IKE B.**.** is i
3480: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 6c 69  mplemented as li
3490: 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54  ke(B,A)..**.** T
34a0: 68 69 73 20 73 61 6d 65 20 66 75 6e 63 74 69 6f  his same functio
34b0: 6e 20 28 77 69 74 68 20 61 20 64 69 66 66 65 72  n (with a differ
34c0: 65 6e 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  ent compareInfo 
34d0: 73 74 72 75 63 74 75 72 65 29 20 63 6f 6d 70 75  structure) compu
34e0: 74 65 73 0a 2a 2a 20 74 68 65 20 47 4c 4f 42 20  tes.** the GLOB 
34f0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
3500: 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e  tic void likeFun
3510: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
3520: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
3530: 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73    int argc, .  s
3540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3550: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
3560: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41  nsigned char *zA
3570: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3580: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
3590: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
35a0: 20 63 68 61 72 20 2a 7a 42 20 3d 20 73 71 6c 69   char *zB = sqli
35b0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
35c0: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 6e 74 20 65  rgv[1]);.  int e
35d0: 73 63 61 70 65 20 3d 20 30 3b 0a 20 20 69 66 28  scape = 0;.  if(
35e0: 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20   argc==3 ){.    
35f0: 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63 68  /* The escape ch
3600: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 6d  aracter string m
3610: 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 61  ust consist of a
3620: 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63 68   single UTF-8 ch
3630: 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20  aracter..    ** 
3640: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
3650: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
3660: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  */.    const uns
3670: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 73 63  igned char *zEsc
3680: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3690: 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a  _text(argv[2]);.
36a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 75      if( sqlite3u
36b0: 74 66 38 43 68 61 72 4c 65 6e 28 28 63 68 61 72  tf8CharLen((char
36c0: 2a 29 7a 45 73 63 2c 20 2d 31 29 21 3d 31 20 29  *)zEsc, -1)!=1 )
36d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
36e0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
36f0: 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20  text, .         
3700: 20 22 45 53 43 41 50 45 20 65 78 70 72 65 73 73   "ESCAPE express
3710: 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 20 73 69  ion must be a si
3720: 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 22 2c  ngle character",
3730: 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75   -1);.      retu
3740: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 73  rn;.    }.    es
3750: 63 61 70 65 20 3d 20 73 71 6c 69 74 65 33 52 65  cape = sqlite3Re
3760: 61 64 55 74 66 38 28 7a 45 73 63 29 3b 0a 20 20  adUtf8(zEsc);.  
3770: 7d 0a 20 20 69 66 28 20 7a 41 20 26 26 20 7a 42  }.  if( zA && zB
3780: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63   ){.    struct c
3790: 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66  ompareInfo *pInf
37a0: 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  o = sqlite3_user
37b0: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
37c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
37d0: 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ST.    sqlite3_l
37e0: 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ike_count++;.#en
37f0: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
3800: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
3810: 78 74 2c 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  xt, patternCompa
3820: 72 65 28 7a 41 2c 20 7a 42 2c 20 70 49 6e 66 6f  re(zA, zB, pInfo
3830: 2c 20 65 73 63 61 70 65 29 29 3b 0a 20 20 7d 0a  , escape));.  }.
3840: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
3850: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4e  ntation of the N
3860: 55 4c 4c 49 46 28 78 2c 79 29 20 66 75 6e 63 74  ULLIF(x,y) funct
3870: 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ion.  The result
3880: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
3890: 20 61 72 67 75 6d 65 6e 74 20 69 66 20 74 68 65   argument if the
38a0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 64   arguments are d
38b0: 69 66 66 65 72 65 6e 74 2e 20 20 54 68 65 20 72  ifferent.  The r
38c0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66  esult is NULL if
38d0: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
38e0: 73 20 61 72 65 20 65 71 75 61 6c 20 74 6f 20 65  s are equal to e
38f0: 61 63 68 20 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74  ach other..*/.st
3900: 61 74 69 63 20 76 6f 69 64 20 6e 75 6c 6c 69 66  atic void nullif
3910: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
3920: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3930: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
3940: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3950: 61 72 67 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  argv.){.  CollSe
3960: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
3970: 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71  e3GetFuncCollSeq
3980: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69 66 28  (context);.  if(
3990: 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
39a0: 72 65 28 61 72 67 76 5b 30 5d 2c 20 61 72 67 76  re(argv[0], argv
39b0: 5b 31 5d 2c 20 70 43 6f 6c 6c 29 21 3d 30 20 29  [1], pColl)!=0 )
39c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
39d0: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
39e0: 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt, argv[0]);.  
39f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
3a00: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
3a10: 20 56 45 52 53 49 4f 4e 28 2a 29 20 66 75 6e 63   VERSION(*) func
3a20: 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c  tion.  The resul
3a30: 74 20 69 73 20 74 68 65 20 76 65 72 73 69 6f 6e  t is the version
3a40: 0a 2a 2a 20 6f 66 20 74 68 65 20 53 51 4c 69 74  .** of the SQLit
3a50: 65 20 6c 69 62 72 61 72 79 20 74 68 61 74 20 69  e library that i
3a60: 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  s running..*/.st
3a70: 61 74 69 63 20 76 6f 69 64 20 76 65 72 73 69 6f  atic void versio
3a80: 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  nFunc(.  sqlite3
3a90: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
3aa0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
3ab0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3ac0: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
3ad0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
3ae0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
3af0: 76 65 72 73 69 6f 6e 2c 20 2d 31 2c 20 53 51 4c  version, -1, SQL
3b00: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a  ITE_STATIC);.}..
3b10: 2f 2a 0a 2a 2a 20 54 68 65 20 4d 41 54 43 48 28  /*.** The MATCH(
3b20: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 6e  ) function is un
3b30: 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 49 66  implemented.  If
3b40: 20 61 6e 79 62 6f 64 79 20 74 72 69 65 73 20 74   anybody tries t
3b50: 6f 20 75 73 65 20 69 74 2c 0a 2a 2a 20 72 65 74  o use it,.** ret
3b60: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  urn an error..*/
3b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 74  .static void mat
3b80: 63 68 53 74 75 62 28 0a 20 20 73 71 6c 69 74 65  chStub(.  sqlite
3b90: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3ba0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
3bb0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3bc0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74 61 74  **argv.){.  stat
3bd0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 45  ic const char zE
3be0: 72 72 5b 5d 20 3d 20 22 4d 41 54 43 48 20 69 73  rr[] = "MATCH is
3bf0: 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   not implemented
3c00: 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ";.  sqlite3_res
3c10: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
3c20: 74 2c 20 7a 45 72 72 2c 20 73 69 7a 65 6f 66 28  t, zErr, sizeof(
3c30: 7a 45 72 72 29 2d 31 29 3b 0a 7d 0a 0a 0a 2f 2a  zErr)-1);.}.../*
3c40: 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c  .** EXPERIMENTAL
3c50: 20 2d 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61   - This is not a
3c60: 6e 20 6f 66 66 69 63 69 61 6c 20 66 75 6e 63 74  n official funct
3c70: 69 6f 6e 2e 20 20 54 68 65 20 69 6e 74 65 72 66  ion.  The interf
3c80: 61 63 65 20 6d 61 79 0a 2a 2a 20 63 68 61 6e 67  ace may.** chang
3c90: 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
3ca0: 6e 20 6d 61 79 20 64 69 73 61 70 70 65 61 72 2e  n may disappear.
3cb0: 20 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 63    Do not write c
3cc0: 6f 64 65 20 74 68 61 74 20 64 65 70 65 6e 64 73  ode that depends
3cd0: 0a 2a 2a 20 6f 6e 20 74 68 69 73 20 66 75 6e 63  .** on this func
3ce0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tion..**.** Impl
3cf0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
3d00: 65 20 51 55 4f 54 45 28 29 20 66 75 6e 63 74 69  e QUOTE() functi
3d10: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
3d20: 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c  on takes a singl
3d30: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20  e.** argument.  
3d40: 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
3d50: 69 73 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 20  is numeric, the 
3d60: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
3d70: 74 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74  the same as.** t
3d80: 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66  he argument.  If
3d90: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
3da0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 74 75 72   NULL, the retur
3db0: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  n value is the s
3dc0: 74 72 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e  tring.** "NULL".
3dd0: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65    Otherwise, the
3de0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 6e 63   argument is enc
3df0: 6c 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20  losed in single 
3e00: 71 75 6f 74 65 73 20 77 69 74 68 0a 2a 2a 20 73  quotes with.** s
3e10: 69 6e 67 6c 65 2d 71 75 6f 74 65 20 65 73 63 61  ingle-quote esca
3e20: 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pes..*/.static v
3e30: 6f 69 64 20 71 75 6f 74 65 46 75 6e 63 28 73 71  oid quoteFunc(sq
3e40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3e50: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
3e60: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
3e70: 2a 2a 61 72 67 76 29 7b 0a 20 20 69 66 28 20 61  **argv){.  if( a
3e80: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
3e90: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
3ea0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
3eb0: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
3ec0: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
3ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
3ee0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
3ef0: 78 74 2c 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53  xt, "NULL", 4, S
3f00: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
3f10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3f20: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3f30: 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  E_INTEGER:.    c
3f40: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
3f50: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
3f60: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
3f70: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29  ontext, argv[0])
3f80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3f90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3fa0: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
3fb0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
3fc0: 63 68 61 72 20 68 65 78 64 69 67 69 74 73 5b 5d  char hexdigits[]
3fd0: 20 3d 20 7b 20 0a 20 20 20 20 20 20 20 20 27 30   = { .        '0
3fe0: 27 2c 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27  ', '1', '2', '3'
3ff0: 2c 20 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c  , '4', '5', '6',
4000: 20 27 37 27 2c 0a 20 20 20 20 20 20 20 20 27 38   '7',.        '8
4010: 27 2c 20 27 39 27 2c 20 27 41 27 2c 20 27 42 27  ', '9', 'A', 'B'
4020: 2c 20 27 43 27 2c 20 27 44 27 2c 20 27 45 27 2c  , 'C', 'D', 'E',
4030: 20 27 46 27 20 0a 20 20 20 20 20 20 7d 3b 0a 20   'F' .      };. 
4040: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74       char *zText
4050: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
4060: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
4070: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
4080: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 63 68 61 72  [0]);.      char
4090: 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20   const *zBlob = 
40a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
40b0: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20  ob(argv[0]);..  
40c0: 20 20 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61      zText = (cha
40d0: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
40e0: 28 28 32 2a 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a  ((2*nBlob)+4); .
40f0: 20 20 20 20 20 20 69 66 28 20 21 7a 54 65 78 74        if( !zText
4100: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4110: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
4120: 28 63 6f 6e 74 65 78 74 2c 20 22 6f 75 74 20 6f  (context, "out o
4130: 66 20 6d 65 6d 6f 72 79 22 2c 20 2d 31 29 3b 0a  f memory", -1);.
4140: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4150: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
4160: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
4170: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Blob; i++){.    
4180: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32        zText[(i*2
4190: 29 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73  )+2] = hexdigits
41a0: 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30  [(zBlob[i]>>4)&0
41b0: 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x0F];.          
41c0: 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d  zText[(i*2)+3] =
41d0: 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f   hexdigits[(zBlo
41e0: 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20  b[i])&0x0F];.   
41f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
4200: 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32  Text[(nBlob*2)+2
4210: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
4220: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
4230: 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  )+3] = '\0';.   
4240: 20 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20       zText[0] = 
4250: 27 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  'X';.        zTe
4260: 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  xt[1] = '\'';.  
4270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4280: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
4290: 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51  t, zText, -1, SQ
42a0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
42b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
42c0: 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 20  ree(zText);.    
42d0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
42e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
42f0: 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
4300: 20 20 20 20 20 69 6e 74 20 69 2c 6a 2c 6e 3b 0a       int i,j,n;.
4310: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
4320: 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67 20  gned char *zArg 
4330: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4340: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
4350: 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20       char *z;.. 
4360: 20 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20       for(i=n=0; 
4370: 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69  zArg[i]; i++){ i
4380: 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27  f( zArg[i]=='\''
4390: 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20   ) n++; }.      
43a0: 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  z = sqliteMalloc
43b0: 28 20 69 2b 6e 2b 33 20 29 3b 0a 20 20 20 20 20  ( i+n+3 );.     
43c0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
43d0: 72 6e 3b 0a 20 20 20 20 20 20 7a 5b 30 5d 20 3d  rn;.      z[0] =
43e0: 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 66 6f 72   '\'';.      for
43f0: 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b  (i=0, j=1; zArg[
4400: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
4410: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b    z[j++] = zArg[
4420: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
4430: 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  zArg[i]=='\'' ){
4440: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
4450: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
4460: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4470: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b    z[j++] = '\'';
4480: 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .      z[j] = 0;
4490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
44a0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
44b0: 78 74 2c 20 7a 2c 20 6a 2c 20 53 51 4c 49 54 45  xt, z, j, SQLITE
44c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
44d0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
44e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
44f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55  ifdef SQLITE_SOU
4500: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  NDEX./*.** Compu
4510: 74 65 20 74 68 65 20 73 6f 75 6e 64 65 78 20 65  te the soundex e
4520: 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 77 6f 72  ncoding of a wor
4530: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
4540: 64 20 73 6f 75 6e 64 65 78 46 75 6e 63 28 73 71  d soundexFunc(sq
4550: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
4560: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
4570: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
4580: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20  **argv){.  char 
4590: 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20 63 6f  zResult[8];.  co
45a0: 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20 20 69  nst u8 *zIn;.  i
45b0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74 69  nt i, j;.  stati
45c0: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
45d0: 20 63 68 61 72 20 69 43 6f 64 65 5b 5d 20 3d 20   char iCode[] = 
45e0: 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  {.    0, 0, 0, 0
45f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4600: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4610: 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20  0, 0,.    0, 0, 
4620: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
4630: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4640: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c   0, 0, 0,.    0,
4650: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4660: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
4670: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
4680: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
4690: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
46a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
46b0: 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32  ,.    0, 0, 1, 2
46c0: 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c  , 3, 0, 1, 2, 0,
46d0: 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20   0, 2, 2, 4, 5, 
46e0: 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20  5, 0,.    1, 2, 
46f0: 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30  6, 2, 3, 0, 1, 0
4700: 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c  , 2, 0, 2, 0, 0,
4710: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c   0, 0, 0,.    0,
4720: 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20   0, 1, 2, 3, 0, 
4730: 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32  1, 2, 0, 0, 2, 2
4740: 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20  , 4, 5, 5, 0,.  
4750: 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c    1, 2, 6, 2, 3,
4760: 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20   0, 1, 0, 2, 0, 
4770: 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  2, 0, 0, 0, 0, 0
4780: 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74 28  ,.  };.  assert(
4790: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a 49   argc==1 );.  zI
47a0: 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  n = (u8*)sqlite3
47b0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
47c0: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 3d  [0]);.  if( zIn=
47d0: 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75 38 2a 29  =0 ) zIn = (u8*)
47e0: 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a  "";.  for(i=0; z
47f0: 49 6e 5b 69 5d 20 26 26 20 21 69 73 61 6c 70 68  In[i] && !isalph
4800: 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b  a(zIn[i]); i++){
4810: 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20 29  }.  if( zIn[i] )
4820: 7b 0a 20 20 20 20 75 38 20 70 72 65 76 63 6f 64  {.    u8 prevcod
4830: 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d  e = iCode[zIn[i]
4840: 26 30 78 37 66 5d 3b 0a 20 20 20 20 7a 52 65 73  &0x7f];.    zRes
4850: 75 6c 74 5b 30 5d 20 3d 20 74 6f 75 70 70 65 72  ult[0] = toupper
4860: 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f  (zIn[i]);.    fo
4870: 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49  r(j=1; j<4 && zI
4880: 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  n[i]; i++){.    
4890: 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f    int code = iCo
48a0: 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b  de[zIn[i]&0x7f];
48b0: 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 3e  .      if( code>
48c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
48d0: 20 63 6f 64 65 21 3d 70 72 65 76 63 6f 64 65 20   code!=prevcode 
48e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  ){.          pre
48f0: 76 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20  vcode = code;.  
4900: 20 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b          zResult[
4910: 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30  j++] = code + '0
4920: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
4930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4940: 20 20 70 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a    prevcode = 0;.
4950: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4960: 20 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a    while( j<4 ){.
4970: 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b        zResult[j+
4980: 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a  +] = '0';.    }.
4990: 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d      zResult[j] =
49a0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
49b0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
49c0: 65 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c  ext, zResult, 4,
49d0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
49e0: 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  T);.  }else{.   
49f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4a00: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 3f  text(context, "?
4a10: 30 30 30 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  000", 4, SQLITE_
4a20: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
4a30: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
4a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
4a50: 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
4a60: 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  A function that 
4a70: 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64 2d 6c  loads a shared-l
4a80: 69 62 72 61 72 79 20 65 78 74 65 6e 73 69 6f 6e  ibrary extension
4a90: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 4e 55   then returns NU
4aa0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
4ab0: 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c 69 74  id loadExt(sqlit
4ac0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4ad0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
4ae0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4af0: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  rgv){.  const ch
4b00: 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63 6f 6e  ar *zFile = (con
4b10: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
4b20: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
4b30: 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63  v[0]);.  const c
4b40: 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a  har *zProc = 0;.
4b50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4b60: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
4b70: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68  a(context);.  ch
4b80: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
4b90: 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20  ..  if( argc==2 
4ba0: 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 28  ){.    zProc = (
4bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
4bc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
4bd0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20  argv[1]);.  }.  
4be0: 69 66 28 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  if( sqlite3_load
4bf0: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  _extension(db, z
4c00: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
4c10: 72 72 4d 73 67 29 20 29 7b 0a 20 20 20 20 73 71  rrMsg) ){.    sq
4c20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
4c30: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72  or(context, zErr
4c40: 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  Msg, -1);.    sq
4c50: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
4c60: 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  sg);.  }.}.#endi
4c70: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
4c80: 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
4c90: 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61   function genera
4ca0: 74 65 73 20 61 20 73 74 72 69 6e 67 20 6f 66 20  tes a string of 
4cb0: 72 61 6e 64 6f 6d 20 63 68 61 72 61 63 74 65 72  random character
4cc0: 73 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  s.  Used for.** 
4cd0: 67 65 6e 65 72 61 74 69 6e 67 20 74 65 73 74 20  generating test 
4ce0: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
4cf0: 76 6f 69 64 20 72 61 6e 64 53 74 72 28 73 71 6c  void randStr(sql
4d00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
4d10: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
4d20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4d30: 2a 61 72 67 76 29 7b 0a 20 20 73 74 61 74 69 63  *argv){.  static
4d40: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4d50: 63 68 61 72 20 7a 53 72 63 5b 5d 20 3d 20 0a 20  char zSrc[] = . 
4d60: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
4d70: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
4d80: 0a 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49  .     "ABCDEFGHI
4d90: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
4da0: 5a 22 0a 20 20 20 20 20 22 30 31 32 33 34 35 36  Z".     "0123456
4db0: 37 38 39 22 0a 20 20 20 20 20 22 2e 2d 21 2c 3a  789".     ".-!,:
4dc0: 2a 5e 2b 3d 5f 7c 3f 2f 3c 3e 20 22 3b 0a 20 20  *^+=_|?/<> ";.  
4dd0: 69 6e 74 20 69 4d 69 6e 2c 20 69 4d 61 78 2c 20  int iMin, iMax, 
4de0: 6e 2c 20 72 2c 20 69 3b 0a 20 20 75 6e 73 69 67  n, r, i;.  unsig
4df0: 6e 65 64 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ned char zBuf[10
4e00: 30 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 3e  00];.  if( argc>
4e10: 3d 31 20 29 7b 0a 20 20 20 20 69 4d 69 6e 20 3d  =1 ){.    iMin =
4e20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
4e30: 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  nt(argv[0]);.   
4e40: 20 69 66 28 20 69 4d 69 6e 3c 30 20 29 20 69 4d   if( iMin<0 ) iM
4e50: 69 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  in = 0;.    if( 
4e60: 69 4d 69 6e 3e 3d 73 69 7a 65 6f 66 28 7a 42 75  iMin>=sizeof(zBu
4e70: 66 29 20 29 20 69 4d 69 6e 20 3d 20 73 69 7a 65  f) ) iMin = size
4e80: 6f 66 28 7a 42 75 66 29 2d 31 3b 0a 20 20 7d 65  of(zBuf)-1;.  }e
4e90: 6c 73 65 7b 0a 20 20 20 20 69 4d 69 6e 20 3d 20  lse{.    iMin = 
4ea0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67  1;.  }.  if( arg
4eb0: 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 4d 61 78  c>=2 ){.    iMax
4ec0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4ed0: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
4ee0: 20 20 20 69 66 28 20 69 4d 61 78 3c 69 4d 69 6e     if( iMax<iMin
4ef0: 20 29 20 69 4d 61 78 20 3d 20 69 4d 69 6e 3b 0a   ) iMax = iMin;.
4f00: 20 20 20 20 69 66 28 20 69 4d 61 78 3e 3d 73 69      if( iMax>=si
4f10: 7a 65 6f 66 28 7a 42 75 66 29 20 29 20 69 4d 61  zeof(zBuf) ) iMa
4f20: 78 20 3d 20 73 69 7a 65 6f 66 28 7a 42 75 66 29  x = sizeof(zBuf)
4f30: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
4f40: 20 69 4d 61 78 20 3d 20 35 30 3b 0a 20 20 7d 0a   iMax = 50;.  }.
4f50: 20 20 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 69 66    n = iMin;.  if
4f60: 28 20 69 4d 61 78 3e 69 4d 69 6e 20 29 7b 0a 20  ( iMax>iMin ){. 
4f70: 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d     sqlite3Random
4f80: 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20  ness(sizeof(r), 
4f90: 26 72 29 3b 0a 20 20 20 20 72 20 26 3d 20 30 78  &r);.    r &= 0x
4fa0: 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 6e 20  7fffffff;.    n 
4fb0: 2b 3d 20 72 25 28 69 4d 61 78 20 2b 20 31 20 2d  += r%(iMax + 1 -
4fc0: 20 69 4d 69 6e 29 3b 0a 20 20 7d 0a 20 20 61 73   iMin);.  }.  as
4fd0: 73 65 72 74 28 20 6e 3c 73 69 7a 65 6f 66 28 7a  sert( n<sizeof(z
4fe0: 42 75 66 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Buf) );.  sqlite
4ff0: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20 7a  3Randomness(n, z
5000: 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Buf);.  for(i=0;
5010: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
5020: 7a 42 75 66 5b 69 5d 20 3d 20 7a 53 72 63 5b 7a  zBuf[i] = zSrc[z
5030: 42 75 66 5b 69 5d 25 28 73 69 7a 65 6f 66 28 7a  Buf[i]%(sizeof(z
5040: 53 72 63 29 2d 31 29 5d 3b 0a 20 20 7d 0a 20 20  Src)-1)];.  }.  
5050: 7a 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73  zBuf[n] = 0;.  s
5060: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5070: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
5080: 72 2a 29 7a 42 75 66 2c 20 6e 2c 20 53 51 4c 49  r*)zBuf, n, SQLI
5090: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d  TE_TRANSIENT);.}
50a0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
50b0: 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66 64 65  E_TEST */..#ifde
50c0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
50d0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
50e0: 67 20 74 77 6f 20 53 51 4c 20 66 75 6e 63 74 69  g two SQL functi
50f0: 6f 6e 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  ons are used to 
5100: 74 65 73 74 20 72 65 74 75 72 6e 69 6e 67 20 61  test returning a
5110: 20 74 65 78 74 0a 2a 2a 20 72 65 73 75 6c 74 20   text.** result 
5120: 77 69 74 68 20 61 20 64 65 73 74 72 75 63 74 6f  with a destructo
5130: 72 2e 20 46 75 6e 63 74 69 6f 6e 20 27 74 65 73  r. Function 'tes
5140: 74 5f 64 65 73 74 72 75 63 74 6f 72 27 20 74 61  t_destructor' ta
5150: 6b 65 73 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74  kes one argument
5160: 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20  .** and returns 
5170: 74 68 65 20 73 61 6d 65 20 61 72 67 75 6d 65 6e  the same argumen
5180: 74 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  t interpreted as
5190: 20 54 45 58 54 2e 20 41 20 64 65 73 74 72 75 63   TEXT. A destruc
51a0: 74 6f 72 20 69 73 0a 2a 2a 20 70 61 73 73 65 64  tor is.** passed
51b0: 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
51c0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 29 20  3_result_text() 
51d0: 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 20  call..**.** SQL 
51e0: 66 75 6e 63 74 69 6f 6e 20 27 74 65 73 74 5f 64  function 'test_d
51f0: 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 27  estructor_count'
5200: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
5210: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
5220: 6e 67 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  ng .** allocatio
5230: 6e 73 20 6d 61 64 65 20 62 79 20 27 74 65 73 74  ns made by 'test
5240: 5f 64 65 73 74 72 75 63 74 6f 72 27 3b 0a 2a 2a  _destructor';.**
5250: 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 4e 6f 74  .** WARNING: Not
5260: 20 74 68 72 65 61 64 73 61 66 65 2e 0a 2a 2f 0a   threadsafe..*/.
5270: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
5280: 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74  destructor_count
5290: 5f 76 61 72 20 3d 20 30 3b 0a 73 74 61 74 69 63  _var = 0;.static
52a0: 20 76 6f 69 64 20 64 65 73 74 72 75 63 74 6f 72   void destructor
52b0: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 63 68 61  (void *p){.  cha
52c0: 72 20 2a 7a 56 61 6c 20 3d 20 28 63 68 61 72 20  r *zVal = (char 
52d0: 2a 29 70 3b 0a 20 20 61 73 73 65 72 74 28 7a 56  *)p;.  assert(zV
52e0: 61 6c 29 3b 0a 20 20 7a 56 61 6c 2d 2d 3b 0a 20  al);.  zVal--;. 
52f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 56 61 6c   sqliteFree(zVal
5300: 29 3b 0a 20 20 74 65 73 74 5f 64 65 73 74 72 75  );.  test_destru
5310: 63 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72 2d 2d  ctor_count_var--
5320: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
5330: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28  test_destructor(
5340: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5350: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
5360: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
5370: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5380: 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20  .  char *zVal;. 
5390: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 73 71 6c 69   int len;.  sqli
53a0: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
53b0: 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
53c0: 29 3b 0a 20 0a 20 20 74 65 73 74 5f 64 65 73 74  );. .  test_dest
53d0: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72  ructor_count_var
53e0: 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41  ++;.  assert( nA
53f0: 72 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73  rg==1 );.  if( s
5400: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
5410: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
5420: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
5430: 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65  ;.  len = sqlite
5440: 33 56 61 6c 75 65 42 79 74 65 73 28 61 72 67 76  3ValueBytes(argv
5450: 5b 30 5d 2c 20 45 4e 43 28 64 62 29 29 3b 20 0a  [0], ENC(db)); .
5460: 20 20 7a 56 61 6c 20 3d 20 73 71 6c 69 74 65 4d    zVal = sqliteM
5470: 61 6c 6c 6f 63 28 6c 65 6e 2b 33 29 3b 0a 20 20  alloc(len+3);.  
5480: 7a 56 61 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20  zVal[len] = 0;. 
5490: 20 7a 56 61 6c 5b 6c 65 6e 2d 31 5d 20 3d 20 30   zVal[len-1] = 0
54a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 56 61 6c  ;.  assert( zVal
54b0: 20 29 3b 0a 20 20 7a 56 61 6c 2b 2b 3b 0a 20 20   );.  zVal++;.  
54c0: 6d 65 6d 63 70 79 28 7a 56 61 6c 2c 20 73 71 6c  memcpy(zVal, sql
54d0: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 61 72  ite3ValueText(ar
54e0: 67 76 5b 30 5d 2c 20 45 4e 43 28 64 62 29 29 2c  gv[0], ENC(db)),
54f0: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 45 4e 43   len);.  if( ENC
5500: 28 64 62 29 3d 3d 53 51 4c 49 54 45 5f 55 54 46  (db)==SQLITE_UTF
5510: 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  8 ){.    sqlite3
5520: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
5530: 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20 64 65 73  x, zVal, -1, des
5540: 74 72 75 63 74 6f 72 29 3b 0a 23 69 66 6e 64 65  tructor);.#ifnde
5550: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
5560: 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  F16.  }else if( 
5570: 45 4e 43 28 64 62 29 3d 3d 53 51 4c 49 54 45 5f  ENC(db)==SQLITE_
5580: 55 54 46 31 36 4c 45 20 29 7b 0a 20 20 20 20 73  UTF16LE ){.    s
5590: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
55a0: 78 74 31 36 6c 65 28 70 43 74 78 2c 20 7a 56 61  xt16le(pCtx, zVa
55b0: 6c 2c 20 2d 31 2c 20 64 65 73 74 72 75 63 74 6f  l, -1, destructo
55c0: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
55d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
55e0: 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 7a  text16be(pCtx, z
55f0: 56 61 6c 2c 20 2d 31 2c 20 64 65 73 74 72 75 63  Val, -1, destruc
5600: 74 6f 72 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  tor);.#endif /* 
5610: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
5620: 36 20 2a 2f 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  6 */.  }.}.stati
5630: 63 20 76 6f 69 64 20 74 65 73 74 5f 64 65 73 74  c void test_dest
5640: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 0a 20 20  ructor_count(.  
5650: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5660: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
5670: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
5680: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5690: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
56a0: 6e 74 28 70 43 74 78 2c 20 74 65 73 74 5f 64 65  nt(pCtx, test_de
56b0: 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 5f 76  structor_count_v
56c0: 61 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ar);.}.#endif /*
56d0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
56e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
56f0: 45 53 54 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  EST./*.** Routin
5700: 65 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74  es for testing t
5710: 68 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  he sqlite3_get_a
5720: 75 78 64 61 74 61 28 29 20 61 6e 64 20 73 71 6c  uxdata() and sql
5730: 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61  ite3_set_auxdata
5740: 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
5750: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 73 74 5f  .**.** The test_
5760: 61 75 78 64 61 74 61 28 29 20 53 51 4c 20 66 75  auxdata() SQL fu
5770: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
5780: 74 6f 20 72 65 67 69 73 74 65 72 20 65 61 63 68  to register each
5790: 20 6f 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   of its argument
57a0: 73 0a 2a 2a 20 61 73 20 61 75 78 69 6c 69 61 72  s.** as auxiliar
57b0: 79 20 64 61 74 61 2e 20 20 49 66 20 74 68 65 72  y data.  If ther
57c0: 65 20 61 72 65 20 6e 6f 20 70 72 69 6f 72 20 72  e are no prior r
57d0: 65 67 69 73 74 72 61 74 69 6f 6e 73 20 6f 66 20  egistrations of 
57e0: 61 75 78 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  aux data for.** 
57f0: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 28 6d  that argument (m
5800: 65 61 6e 69 6e 67 20 74 68 65 20 61 72 67 75 6d  eaning the argum
5810: 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e  ent is not a con
5820: 73 74 61 6e 74 20 6f 72 20 74 68 69 73 20 69 73  stant or this is
5830: 20 69 74 73 20 66 69 72 73 74 0a 2a 2a 20 63 61   its first.** ca
5840: 6c 6c 29 20 74 68 65 6e 20 74 68 65 20 72 65 73  ll) then the res
5850: 75 6c 74 20 66 6f 72 20 74 68 61 74 20 61 72 67  ult for that arg
5860: 75 6d 65 6e 74 20 69 73 20 30 2e 20 20 49 66 20  ument is 0.  If 
5870: 74 68 65 72 65 20 69 73 20 61 20 70 72 69 6f 72  there is a prior
5880: 0a 2a 2a 20 72 65 67 69 73 74 72 61 74 69 6f 6e  .** registration
5890: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72  , the result for
58a0: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69   that argument i
58b0: 73 20 31 2e 20 20 54 68 65 20 6f 76 65 72 61 6c  s 1.  The overal
58c0: 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 74  l result.** is t
58d0: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 61 72  he individual ar
58e0: 67 75 6d 65 6e 74 20 72 65 73 75 6c 74 73 20 73  gument results s
58f0: 65 70 61 72 61 74 65 64 20 62 79 20 73 70 61 63  eparated by spac
5900: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
5910: 69 64 20 66 72 65 65 5f 74 65 73 74 5f 61 75 78  id free_test_aux
5920: 64 61 74 61 28 76 6f 69 64 20 2a 70 29 20 7b 73  data(void *p) {s
5930: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 7d 0a 73  qliteFree(p);}.s
5940: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
5950: 61 75 78 64 61 74 61 28 0a 20 20 73 71 6c 69 74  auxdata(.  sqlit
5960: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
5970: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
5980: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5990: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
59a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  ;.  char *zRet =
59b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 41   sqliteMalloc(nA
59c0: 72 67 2a 32 29 3b 0a 20 20 69 66 28 20 21 7a 52  rg*2);.  if( !zR
59d0: 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  et ) return;.  f
59e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
59f0: 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63  i++){.    char c
5a00: 6f 6e 73 74 20 2a 7a 20 3d 20 28 63 68 61 72 2a  onst *z = (char*
5a10: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5a20: 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  ext(argv[i]);.  
5a30: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
5a40: 20 63 68 61 72 20 2a 7a 41 75 78 20 3d 20 73 71   char *zAux = sq
5a50: 6c 69 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74  lite3_get_auxdat
5a60: 61 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20  a(pCtx, i);.    
5a70: 20 20 69 66 28 20 7a 41 75 78 20 29 7b 0a 20 20    if( zAux ){.  
5a80: 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20        zRet[i*2] 
5a90: 3d 20 27 31 27 3b 0a 20 20 20 20 20 20 20 20 69  = '1';.        i
5aa0: 66 28 20 73 74 72 63 6d 70 28 7a 41 75 78 2c 20  f( strcmp(zAux, 
5ab0: 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  z) ){.          
5ac0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5ad0: 72 72 6f 72 28 70 43 74 78 2c 20 22 41 75 78 69  rror(pCtx, "Auxi
5ae0: 6c 61 72 79 20 64 61 74 61 20 63 6f 72 72 75 70  lary data corrup
5af0: 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20  tion", -1);.    
5b00: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5b20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  lse{.        zRe
5b30: 74 5b 69 2a 32 5d 20 3d 20 27 30 27 3b 0a 20 20  t[i*2] = '0';.  
5b40: 20 20 20 20 20 20 7a 41 75 78 20 3d 20 73 71 6c        zAux = sql
5b50: 69 74 65 53 74 72 44 75 70 28 7a 29 3b 0a 20 20  iteStrDup(z);.  
5b60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
5b70: 74 5f 61 75 78 64 61 74 61 28 70 43 74 78 2c 20  t_auxdata(pCtx, 
5b80: 69 2c 20 7a 41 75 78 2c 20 66 72 65 65 5f 74 65  i, zAux, free_te
5b90: 73 74 5f 61 75 78 64 61 74 61 29 3b 0a 20 20 20  st_auxdata);.   
5ba0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 74 5b     }.      zRet[
5bb0: 69 2a 32 2b 31 5d 20 3d 20 27 20 27 3b 0a 20 20  i*2+1] = ' ';.  
5bc0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
5bd0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
5be0: 74 78 2c 20 7a 52 65 74 2c 20 32 2a 6e 41 72 67  tx, zRet, 2*nArg
5bf0: 2d 31 2c 20 66 72 65 65 5f 74 65 73 74 5f 61 75  -1, free_test_au
5c00: 78 64 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66  xdata);.}.#endif
5c10: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
5c20: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
5c30: 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 41 20 66  E_TEST./*.** A f
5c40: 75 6e 63 74 69 6f 6e 20 74 6f 20 74 65 73 74 20  unction to test 
5c50: 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20  error reporting 
5c60: 66 72 6f 6d 20 75 73 65 72 20 66 75 6e 63 74 69  from user functi
5c70: 6f 6e 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ons. This functi
5c80: 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  on.** returns a 
5c90: 63 6f 70 79 20 6f 66 20 69 74 27 73 20 66 69 72  copy of it's fir
5ca0: 73 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61  st argument as a
5cb0: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
5cc0: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 65 72 72  ic void test_err
5cd0: 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  or(.  sqlite3_co
5ce0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
5cf0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
5d00: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5d10: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  .){.  sqlite3_re
5d20: 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
5d30: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
5d40: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5d50: 30 5d 29 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69  0]), 0);.}.#endi
5d60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
5d70: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e   */../*.** An in
5d80: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
5d90: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
5da0: 65 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74  e holds the cont
5db0: 65 78 74 20 6f 66 20 61 0a 2a 2a 20 73 75 6d 28  ext of a.** sum(
5dc0: 29 20 6f 72 20 61 76 67 28 29 20 61 67 67 72 65  ) or avg() aggre
5dd0: 67 61 74 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e  gate computation
5de0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
5df0: 75 63 74 20 53 75 6d 43 74 78 20 53 75 6d 43 74  uct SumCtx SumCt
5e00: 78 3b 0a 73 74 72 75 63 74 20 53 75 6d 43 74 78  x;.struct SumCtx
5e10: 20 7b 0a 20 20 64 6f 75 62 6c 65 20 72 53 75 6d   {.  double rSum
5e20: 3b 20 20 20 20 20 20 2f 2a 20 46 6c 6f 61 74 69  ;      /* Floati
5e30: 6e 67 20 70 6f 69 6e 74 20 73 75 6d 20 2a 2f 0a  ng point sum */.
5e40: 20 20 69 36 34 20 69 53 75 6d 3b 20 20 20 20 20    i64 iSum;     
5e50: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 73      /* Integer s
5e60: 75 6d 20 2a 2f 20 20 20 0a 20 20 69 36 34 20 63  um */   .  i64 c
5e70: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
5e80: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
5e90: 74 73 20 73 75 6d 6d 65 64 20 2a 2f 0a 20 20 75  ts summed */.  u
5ea0: 38 20 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20 20  8 overflow;     
5eb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 74 65   /* True if inte
5ec0: 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 73 65 65  ger overflow see
5ed0: 6e 20 2a 2f 0a 20 20 75 38 20 61 70 70 72 6f 78  n */.  u8 approx
5ee0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
5ef0: 20 69 66 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20   if non-integer 
5f00: 76 61 6c 75 65 20 77 61 73 20 69 6e 70 75 74 20  value was input 
5f10: 74 6f 20 74 68 65 20 73 75 6d 20 2a 2f 0a 7d 3b  to the sum */.};
5f20: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
5f30: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
5f40: 20 74 68 65 20 73 75 6d 2c 20 61 76 65 72 61 67   the sum, averag
5f50: 65 2c 20 61 6e 64 20 74 6f 74 61 6c 2e 0a 2a 2a  e, and total..**
5f60: 0a 2a 2a 20 54 68 65 20 53 55 4d 28 29 20 66 75  .** The SUM() fu
5f70: 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 20 74  nction follows t
5f80: 68 65 20 28 62 72 6f 6b 65 6e 29 20 53 51 4c 20  he (broken) SQL 
5f90: 73 74 61 6e 64 61 72 64 20 77 68 69 63 68 20 6d  standard which m
5fa0: 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 69 74 20  eans.** that it 
5fb0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
5fc0: 69 74 20 73 75 6d 73 20 6f 76 65 72 20 6e 6f 20  it sums over no 
5fd0: 69 6e 70 75 74 73 2e 20 20 54 4f 54 41 4c 20 72  inputs.  TOTAL r
5fe0: 65 74 75 72 6e 73 0a 2a 2a 20 30 2e 30 20 69 6e  eturns.** 0.0 in
5ff0: 20 74 68 61 74 20 63 61 73 65 2e 20 20 49 6e 20   that case.  In 
6000: 61 64 64 69 74 69 6f 6e 2c 20 54 4f 54 41 4c 20  addition, TOTAL 
6010: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 61  always returns a
6020: 20 66 6c 6f 61 74 20 77 68 65 72 65 0a 2a 2a 20   float where.** 
6030: 53 55 4d 20 6d 69 67 68 74 20 72 65 74 75 72 6e  SUM might return
6040: 20 61 6e 20 69 6e 74 65 67 65 72 20 69 66 20 69   an integer if i
6050: 74 20 6e 65 76 65 72 20 65 6e 63 6f 75 6e 74 65  t never encounte
6060: 72 73 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f  rs a floating po
6070: 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 2e 20 20 54  int.** value.  T
6080: 4f 54 41 4c 20 6e 65 76 65 72 20 66 61 69 6c 73  OTAL never fails
6090: 2c 20 62 75 74 20 53 55 4d 20 6d 69 67 68 74 20  , but SUM might 
60a0: 74 68 72 6f 75 67 68 20 61 6e 20 65 78 63 65 70  through an excep
60b0: 74 69 6f 6e 20 69 66 0a 2a 2a 20 69 74 20 6f 76  tion if.** it ov
60c0: 65 72 66 6c 6f 77 73 20 61 6e 20 69 6e 74 65 67  erflows an integ
60d0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
60e0: 69 64 20 73 75 6d 53 74 65 70 28 73 71 6c 69 74  id sumStep(sqlit
60f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6100: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
6110: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6120: 72 67 76 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a  rgv){.  SumCtx *
6130: 70 3b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  p;.  int type;. 
6140: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
6150: 20 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   );.  p = sqlite
6160: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
6170: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
6180: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79 70 65  eof(*p));.  type
6190: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
61a0: 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61 72  _numeric_type(ar
61b0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 20  gv[0]);.  if( p 
61c0: 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54 45 5f  && type!=SQLITE_
61d0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63  NULL ){.    p->c
61e0: 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74 79  nt++;.    if( ty
61f0: 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
6200: 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ER ){.      i64 
6210: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
6220: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
6230: 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20  ;.      p->rSum 
6240: 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  += v;.      if( 
6250: 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76  (p->approx|p->ov
6260: 65 72 66 6c 6f 77 29 3d 3d 30 20 29 7b 0a 20 20  erflow)==0 ){.  
6270: 20 20 20 20 20 20 69 36 34 20 69 4e 65 77 53 75        i64 iNewSu
6280: 6d 20 3d 20 70 2d 3e 69 53 75 6d 20 2b 20 76 3b  m = p->iSum + v;
6290: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 31 20  .        int s1 
62a0: 3d 20 70 2d 3e 69 53 75 6d 20 3e 3e 20 28 73 69  = p->iSum >> (si
62b0: 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31 29 3b 0a  zeof(i64)*8-1);.
62c0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 32 20 3d          int s2 =
62d0: 20 76 20 20 20 20 20 20 20 3e 3e 20 28 73 69 7a   v       >> (siz
62e0: 65 6f 66 28 69 36 34 29 2a 38 2d 31 29 3b 0a 20  eof(i64)*8-1);. 
62f0: 20 20 20 20 20 20 20 69 6e 74 20 73 33 20 3d 20         int s3 = 
6300: 69 4e 65 77 53 75 6d 20 3e 3e 20 28 73 69 7a 65  iNewSum >> (size
6310: 6f 66 28 69 36 34 29 2a 38 2d 31 29 3b 0a 20 20  of(i64)*8-1);.  
6320: 20 20 20 20 20 20 70 2d 3e 6f 76 65 72 66 6c 6f        p->overflo
6330: 77 20 3d 20 28 73 31 26 73 32 26 7e 73 33 29 20  w = (s1&s2&~s3) 
6340: 7c 20 28 7e 73 31 26 7e 73 32 26 73 33 29 3b 0a  | (~s1&~s2&s3);.
6350: 20 20 20 20 20 20 20 20 70 2d 3e 69 53 75 6d 20          p->iSum 
6360: 3d 20 69 4e 65 77 53 75 6d 3b 0a 20 20 20 20 20  = iNewSum;.     
6370: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6380: 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73      p->rSum += s
6390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
63a0: 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
63b0: 20 20 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20      p->approx = 
63c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  1;.    }.  }.}.s
63d0: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69  tatic void sumFi
63e0: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
63f0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
6400: 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20  {.  SumCtx *p;. 
6410: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
6420: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
6430: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66  ontext, 0);.  if
6440: 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20  ( p && p->cnt>0 
6450: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 76  ){.    if( p->ov
6460: 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
6470: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
6480: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69 6e  rror(context,"in
6490: 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c  teger overflow",
64a0: 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  -1);.    }else i
64b0: 66 28 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b 0a  f( p->approx ){.
64c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
64d0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
64e0: 65 78 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a 20  ext, p->rSum);. 
64f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6500: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
6510: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d  nt64(context, p-
6520: 3e 69 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  >iSum);.    }.  
6530: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
6540: 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  avgFinalize(sqli
6550: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6560: 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20  text){.  SumCtx 
6570: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
6580: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
6590: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
65a0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63  .  if( p && p->c
65b0: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  nt>0 ){.    sqli
65c0: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
65d0: 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53  e(context, p->rS
65e0: 75 6d 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e  um/(double)p->cn
65f0: 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
6600: 20 76 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61 6c   void totalFinal
6610: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
6620: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
6630: 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20   SumCtx *p;.  p 
6640: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
6650: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
6660: 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ext, 0);.  sqlit
6670: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
6680: 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d  (context, p ? p-
6690: 3e 72 53 75 6d 20 3a 20 30 2e 30 29 3b 0a 7d 0a  >rSum : 0.0);.}.
66a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
66b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  wing structure k
66c0: 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73 74  eeps track of st
66d0: 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
66e0: 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74  for the.** count
66f0: 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  () aggregate fun
6700: 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ction..*/.typede
6710: 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74  f struct CountCt
6720: 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75  x CountCtx;.stru
6730: 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20  ct CountCtx {.  
6740: 69 36 34 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  i64 n;.};../*.**
6750: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70   Routines to imp
6760: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  lement the count
6770: 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  () aggregate fun
6780: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
6790: 20 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28   void countStep(
67a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
67b0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
67c0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
67d0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75  e **argv){.  Cou
67e0: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
67f0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
6800: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
6810: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
6820: 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c    if( (argc==0 |
6830: 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73  | SQLITE_NULL!=s
6840: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
6850: 65 28 61 72 67 76 5b 30 5d 29 29 20 26 26 20 70  e(argv[0])) && p
6860: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a   ){.    p->n++;.
6870: 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20    }.}   .static 
6880: 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69  void countFinali
6890: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
68a0: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
68b0: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
68c0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
68d0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
68e0: 74 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  text, 0);.  sqli
68f0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
6900: 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d  (context, p ? p-
6910: 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >n : 0);.}../*.*
6920: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
6930: 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e  plement min() an
6940: 64 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74  d max() aggregat
6950: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  e functions..*/.
6960: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d  static void minm
6970: 61 78 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63  axStep(sqlite3_c
6980: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6990: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
69a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
69b0: 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d  {.  Mem *pArg  =
69c0: 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b   (Mem *)argv[0];
69d0: 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 0a  .  Mem *pBest;..
69e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
69f0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
6a00: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
6a10: 20 72 65 74 75 72 6e 3b 0a 20 20 70 42 65 73 74   return;.  pBest
6a20: 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c 69 74 65   = (Mem *)sqlite
6a30: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
6a40: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
6a50: 65 6f 66 28 2a 70 42 65 73 74 29 29 3b 0a 20 20  eof(*pBest));.  
6a60: 69 66 28 20 21 70 42 65 73 74 20 29 20 72 65 74  if( !pBest ) ret
6a70: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 42 65 73  urn;..  if( pBes
6a80: 74 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  t->flags ){.    
6a90: 69 6e 74 20 6d 61 78 3b 0a 20 20 20 20 69 6e 74  int max;.    int
6aa0: 20 63 6d 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65   cmp;.    CollSe
6ab0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
6ac0: 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71  e3GetFuncCollSeq
6ad0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 2f  (context);.    /
6ae0: 2a 20 54 68 69 73 20 73 74 65 70 20 66 75 6e 63  * This step func
6af0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
6b00: 20 62 6f 74 68 20 74 68 65 20 6d 69 6e 28 29 20   both the min() 
6b10: 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65 67  and max() aggreg
6b20: 61 74 65 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ates,.    ** the
6b30: 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65   only difference
6b40: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
6b50: 20 62 65 69 6e 67 20 74 68 61 74 20 74 68 65 20   being that the 
6b60: 73 65 6e 73 65 20 6f 66 20 74 68 65 0a 20 20 20  sense of the.   
6b70: 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
6b80: 73 20 69 6e 76 65 72 74 65 64 2e 20 46 6f 72 20  s inverted. For 
6b90: 74 68 65 20 6d 61 78 28 29 20 61 67 67 72 65 67  the max() aggreg
6ba0: 61 74 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ate, the.    ** 
6bb0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
6bc0: 61 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  a() function ret
6bd0: 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 2d 31 2e  urns (void *)-1.
6be0: 20 46 6f 72 20 6d 69 6e 28 29 20 69 74 0a 20 20   For min() it.  
6bf0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 28 76 6f    ** returns (vo
6c00: 69 64 20 2a 29 64 62 2c 20 77 68 65 72 65 20 64  id *)db, where d
6c10: 62 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 33  b is the sqlite3
6c20: 2a 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  * database point
6c30: 65 72 2e 0a 20 20 20 20 2a 2a 20 54 68 65 72 65  er..    ** There
6c40: 66 6f 72 65 20 74 68 65 20 6e 65 78 74 20 73 74  fore the next st
6c50: 61 74 65 6d 65 6e 74 20 73 65 74 73 20 76 61 72  atement sets var
6c60: 69 61 62 6c 65 20 27 6d 61 78 27 20 74 6f 20 31  iable 'max' to 1
6c70: 20 66 6f 72 20 74 68 65 20 6d 61 78 28 29 0a 20   for the max(). 
6c80: 20 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 2c     ** aggregate,
6c90: 20 6f 72 20 30 20 66 6f 72 20 6d 69 6e 28 29 2e   or 0 for min().
6ca0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 61 78 20  .    */.    max 
6cb0: 3d 20 28 28 73 71 6c 69 74 65 33 5f 75 73 65 72  = ((sqlite3_user
6cc0: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3d 3d  _data(context)==
6cd0: 28 76 6f 69 64 20 2a 29 2d 31 29 3f 31 3a 30 29  (void *)-1)?1:0)
6ce0: 3b 0a 20 20 20 20 63 6d 70 20 3d 20 73 71 6c 69  ;.    cmp = sqli
6cf0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 42  te3MemCompare(pB
6d00: 65 73 74 2c 20 70 41 72 67 2c 20 70 43 6f 6c 6c  est, pArg, pColl
6d10: 29 3b 0a 20 20 20 20 69 66 28 20 28 6d 61 78 20  );.    if( (max 
6d20: 26 26 20 63 6d 70 3c 30 29 20 7c 7c 20 28 21 6d  && cmp<0) || (!m
6d30: 61 78 20 26 26 20 63 6d 70 3e 30 29 20 29 7b 0a  ax && cmp>0) ){.
6d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6d50: 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20  eMemCopy(pBest, 
6d60: 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pArg);.    }.  }
6d70: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6d80: 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65  3VdbeMemCopy(pBe
6d90: 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d  st, pArg);.  }.}
6da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e  .static void min
6db0: 4d 61 78 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  MaxFinalize(sqli
6dc0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6dd0: 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  text){.  sqlite3
6de0: 5f 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20  _value *pRes;.  
6df0: 70 52 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f  pRes = (sqlite3_
6e00: 76 61 6c 75 65 20 2a 29 73 71 6c 69 74 65 33 5f  value *)sqlite3_
6e10: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
6e20: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
6e30: 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20   if( pRes ){.   
6e40: 20 69 66 28 20 70 52 65 73 2d 3e 66 6c 61 67 73   if( pRes->flags
6e50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6e60: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
6e70: 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b 0a 20  ontext, pRes);. 
6e80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6e90: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
6ea0: 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  Res);.  }.}.../*
6eb0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6ec0: 6e 20 72 65 67 69 73 74 65 72 65 64 20 61 6c 6c  n registered all
6ed0: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 43 20   of the above C 
6ee0: 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 53 51 4c  functions as SQL
6ef0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  .** functions.  
6f00: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 74  This should be t
6f10: 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 20  he only routine 
6f20: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 77 69 74  in this file wit
6f30: 68 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20 6c 69  h.** external li
6f40: 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nkage..*/.void s
6f50: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75  qlite3RegisterBu
6f60: 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73  iltinFunctions(s
6f70: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
6f80: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
6f90: 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
6fa0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 73 69 67 6e  zName;.     sign
6fb0: 65 64 20 63 68 61 72 20 6e 41 72 67 3b 0a 20 20  ed char nArg;.  
6fc0: 20 20 20 75 38 20 61 72 67 54 79 70 65 3b 20 20     u8 argType;  
6fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 6e           /* 0: n
6fe0: 6f 6e 65 2e 20 20 31 3a 20 64 62 20 20 32 3a 20  one.  1: db  2: 
6ff0: 28 2d 31 29 20 2a 2f 0a 20 20 20 20 20 75 38 20  (-1) */.     u8 
7000: 65 54 65 78 74 52 65 70 3b 20 20 20 20 20 20 20  eTextRep;       
7010: 20 20 20 2f 2a 20 31 3a 20 55 54 46 2d 31 36 2e     /* 1: UTF-16.
7020: 20 20 30 3a 20 55 54 46 2d 38 20 2a 2f 0a 20 20    0: UTF-8 */.  
7030: 20 20 20 75 38 20 6e 65 65 64 43 6f 6c 6c 53 65     u8 needCollSe
7040: 71 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78  q;.     void (*x
7050: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
7060: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
7070: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 3b 0a 20 20  e3_value **);.  
7080: 7d 20 61 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20  } aFuncs[] = {. 
7090: 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 20     { "min",     
70a0: 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c            -1, 0,
70b0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
70c0: 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 7d   1, minmaxFunc }
70d0: 2c 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20  ,.    { "min",  
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
70f0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
7100: 20 20 20 20 31 2c 20 30 20 20 20 20 20 20 20 20      1, 0        
7110: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22    },.    { "max"
7120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7130: 2d 31 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  -1, 2, SQLITE_UT
7140: 46 38 2c 20 20 20 20 31 2c 20 6d 69 6e 6d 61 78  F8,    1, minmax
7150: 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6d  Func },.    { "m
7160: 61 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ax",            
7170: 20 20 20 20 30 2c 20 32 2c 20 53 51 4c 49 54 45      0, 2, SQLITE
7180: 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 30 20 20  _UTF8,    1, 0  
7190: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
71a0: 20 22 74 79 70 65 6f 66 22 2c 20 20 20 20 20 20   "typeof",      
71b0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c         1, 0, SQL
71c0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
71d0: 74 79 70 65 6f 66 46 75 6e 63 20 7d 2c 0a 20 20  typeofFunc },.  
71e0: 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20 20    { "length",   
71f0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
7200: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
7210: 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63 20 7d 2c  0, lengthFunc },
7220: 0a 20 20 20 20 7b 20 22 73 75 62 73 74 72 22 2c  .    { "substr",
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20               3, 
7240: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
7250: 20 20 20 30 2c 20 73 75 62 73 74 72 46 75 6e 63     0, substrFunc
7260: 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
7270: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
7280: 20 20 7b 20 22 73 75 62 73 74 72 22 2c 20 20 20    { "substr",   
7290: 20 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20            3, 0, 
72a0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
72b0: 30 2c 20 73 71 6c 69 74 65 33 75 74 66 31 36 53  0, sqlite3utf16S
72c0: 75 62 73 74 72 20 7d 2c 0a 23 65 6e 64 69 66 0a  ubstr },.#endif.
72d0: 20 20 20 20 7b 20 22 61 62 73 22 2c 20 20 20 20      { "abs",    
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
72f0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
7300: 20 20 30 2c 20 61 62 73 46 75 6e 63 20 20 20 20    0, absFunc    
7310: 7d 2c 0a 20 20 20 20 7b 20 22 72 6f 75 6e 64 22  },.    { "round"
7320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
7330: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
7340: 2c 20 20 20 20 30 2c 20 72 6f 75 6e 64 46 75 6e  ,    0, roundFun
7350: 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6f 75  c  },.    { "rou
7360: 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nd",            
7370: 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    2, 0, SQLITE_U
7380: 54 46 38 2c 20 20 20 20 30 2c 20 72 6f 75 6e 64  TF8,    0, round
7390: 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22  Func  },.    { "
73a0: 75 70 70 65 72 22 2c 20 20 20 20 20 20 20 20 20  upper",         
73b0: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
73c0: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 75 70  E_UTF8,    0, up
73d0: 70 65 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20  perFunc  },.    
73e0: 7b 20 22 6c 6f 77 65 72 22 2c 20 20 20 20 20 20  { "lower",      
73f0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51          1, 0, SQ
7400: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
7410: 20 6c 6f 77 65 72 46 75 6e 63 20 20 7d 2c 0a 20   lowerFunc  },. 
7420: 20 20 20 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c     { "coalesce",
7430: 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c            -1, 0,
7440: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
7450: 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20 7d   0, ifnullFunc }
7460: 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65 73 63  ,.    { "coalesc
7470: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c  e",           0,
7480: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
7490: 20 20 20 20 30 2c 20 30 20 20 20 20 20 20 20 20      0, 0        
74a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c    },.    { "coal
74b0: 65 73 63 65 22 2c 20 20 20 20 20 20 20 20 20 20  esce",          
74c0: 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   1, 0, SQLITE_UT
74d0: 46 38 2c 20 20 20 20 30 2c 20 30 20 20 20 20 20  F8,    0, 0     
74e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69       },.    { "i
74f0: 66 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20  fnull",         
7500: 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45      2, 0, SQLITE
7510: 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 69 66 6e  _UTF8,    1, ifn
7520: 75 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  ullFunc },.    {
7530: 20 22 72 61 6e 64 6f 6d 22 2c 20 20 20 20 20 20   "random",      
7540: 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 53 51 4c        -1, 0, SQL
7550: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
7560: 72 61 6e 64 6f 6d 46 75 6e 63 20 7d 2c 0a 20 20  randomFunc },.  
7570: 20 20 7b 20 22 6e 75 6c 6c 69 66 22 2c 20 20 20    { "nullif",   
7580: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
7590: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
75a0: 31 2c 20 6e 75 6c 6c 69 66 46 75 6e 63 20 7d 2c  1, nullifFunc },
75b0: 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 76  .    { "sqlite_v
75c0: 65 72 73 69 6f 6e 22 2c 20 20 20 20 20 30 2c 20  ersion",     0, 
75d0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
75e0: 20 20 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e     0, versionFun
75f0: 63 7d 2c 0a 20 20 20 20 7b 20 22 71 75 6f 74 65  c},.    { "quote
7600: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7610: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
7620: 38 2c 20 20 20 20 30 2c 20 71 75 6f 74 65 46 75  8,    0, quoteFu
7630: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61  nc  },.    { "la
7640: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22  st_insert_rowid"
7650: 2c 20 20 30 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ,  0, 1, SQLITE_
7660: 55 54 46 38 2c 20 20 20 20 30 2c 20 6c 61 73 74  UTF8,    0, last
7670: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 7d 2c  _insert_rowid },
7680: 0a 20 20 20 20 7b 20 22 63 68 61 6e 67 65 73 22  .    { "changes"
7690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  ,            0, 
76a0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
76b0: 20 20 20 30 2c 20 63 68 61 6e 67 65 73 20 20 20     0, changes   
76c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74 61 6c   },.    { "total
76d0: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  _changes",      
76e0: 30 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  0, 1, SQLITE_UTF
76f0: 38 2c 20 20 20 20 30 2c 20 74 6f 74 61 6c 5f 63  8,    0, total_c
7700: 68 61 6e 67 65 73 20 7d 2c 0a 20 20 20 20 7b 20  hanges },.    { 
7710: 22 6d 61 74 63 68 22 2c 20 20 20 20 20 20 20 20  "match",        
7720: 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49        2, 0, SQLI
7730: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 6d  TE_UTF8,    0, m
7740: 61 74 63 68 53 74 75 62 20 7d 2c 0a 23 69 66 64  atchStub },.#ifd
7750: 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45  ef SQLITE_SOUNDE
7760: 58 0a 20 20 20 20 7b 20 22 73 6f 75 6e 64 65 78  X.    { "soundex
7770: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  ",            1,
7780: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
7790: 20 30 2c 20 73 6f 75 6e 64 65 78 46 75 6e 63 7d   0, soundexFunc}
77a0: 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
77b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
77c0: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
77d0: 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  { "load_extensio
77e0: 6e 22 2c 20 20 20 20 20 31 2c 20 31 2c 20 53 51  n",     1, 1, SQ
77f0: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
7800: 20 6c 6f 61 64 45 78 74 20 7d 2c 0a 20 20 20 20   loadExt },.    
7810: 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  { "load_extensio
7820: 6e 22 2c 20 20 20 20 20 32 2c 20 31 2c 20 53 51  n",     2, 1, SQ
7830: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
7840: 20 6c 6f 61 64 45 78 74 20 7d 2c 0a 23 65 6e 64   loadExt },.#end
7850: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
7860: 5f 54 45 53 54 0a 20 20 20 20 7b 20 22 72 61 6e  _TEST.    { "ran
7870: 64 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20  dstr",          
7880: 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54       2, 0, SQLIT
7890: 45 5f 55 54 46 38 2c 20 30 2c 20 72 61 6e 64 53  E_UTF8, 0, randS
78a0: 74 72 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  tr    },.    { "
78b0: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 22  test_destructor"
78c0: 2c 20 20 20 20 20 20 20 31 2c 20 31 2c 20 53 51  ,       1, 1, SQ
78d0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 65  LITE_UTF8, 0, te
78e0: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 7d 2c 0a  st_destructor},.
78f0: 20 20 20 20 7b 20 22 74 65 73 74 5f 64 65 73 74      { "test_dest
7900: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 22 2c 20 30  ructor_count", 0
7910: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
7920: 2c 20 30 2c 20 74 65 73 74 5f 64 65 73 74 72 75  , 0, test_destru
7930: 63 74 6f 72 5f 63 6f 75 6e 74 7d 2c 0a 20 20 20  ctor_count},.   
7940: 20 7b 20 22 74 65 73 74 5f 61 75 78 64 61 74 61   { "test_auxdata
7950: 22 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30  ",         -1, 0
7960: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
7970: 2c 20 74 65 73 74 5f 61 75 78 64 61 74 61 7d 2c  , test_auxdata},
7980: 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 65 72 72  .    { "test_err
7990: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
79a0: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
79b0: 38 2c 20 30 2c 20 74 65 73 74 5f 65 72 72 6f 72  8, 0, test_error
79c0: 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  },.#endif.  };. 
79d0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
79e0: 72 75 63 74 20 7b 0a 20 20 20 20 63 68 61 72 20  ruct {.    char 
79f0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 69 67 6e  *zName;.    sign
7a00: 65 64 20 63 68 61 72 20 6e 41 72 67 3b 0a 20 20  ed char nArg;.  
7a10: 20 20 75 38 20 61 72 67 54 79 70 65 3b 0a 20 20    u8 argType;.  
7a20: 20 20 75 38 20 6e 65 65 64 43 6f 6c 6c 53 65 71    u8 needCollSeq
7a30: 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 53 74  ;.    void (*xSt
7a40: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
7a50: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
7a60: 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 76  _value**);.    v
7a70: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 69 7a 65 29  oid (*xFinalize)
7a80: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7a90: 2a 29 3b 0a 20 20 7d 20 61 41 67 67 73 5b 5d 20  *);.  } aAggs[] 
7aa0: 3d 20 7b 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c  = {.    { "min",
7ab0: 20 20 20 20 31 2c 20 30 2c 20 31 2c 20 6d 69 6e      1, 0, 1, min
7ac0: 6d 61 78 53 74 65 70 2c 20 20 20 6d 69 6e 4d 61  maxStep,   minMa
7ad0: 78 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20 20  xFinalize },.   
7ae0: 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 31 2c 20   { "max",    1, 
7af0: 32 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70  2, 1, minmaxStep
7b00: 2c 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69  ,   minMaxFinali
7b10: 7a 65 20 7d 2c 0a 20 20 20 20 7b 20 22 73 75 6d  ze },.    { "sum
7b20: 22 2c 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73  ",    1, 0, 0, s
7b30: 75 6d 53 74 65 70 2c 20 20 20 20 20 20 73 75 6d  umStep,      sum
7b40: 46 69 6e 61 6c 69 7a 65 20 20 20 20 7d 2c 0a 20  Finalize    },. 
7b50: 20 20 20 7b 20 22 74 6f 74 61 6c 22 2c 20 20 31     { "total",  1
7b60: 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c  , 0, 0, sumStep,
7b70: 20 20 20 20 20 20 74 6f 74 61 6c 46 69 6e 61 6c        totalFinal
7b80: 69 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  ize    },.    { 
7b90: 22 61 76 67 22 2c 20 20 20 20 31 2c 20 30 2c 20  "avg",    1, 0, 
7ba0: 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20  0, sumStep,     
7bb0: 20 61 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20   avgFinalize    
7bc0: 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74 22  },.    { "count"
7bd0: 2c 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f 75 6e  ,  0, 0, 0, coun
7be0: 74 53 74 65 70 2c 20 20 20 20 63 6f 75 6e 74 46  tStep,    countF
7bf0: 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 20 20  inalize  },.    
7c00: 7b 20 22 63 6f 75 6e 74 22 2c 20 20 31 2c 20 30  { "count",  1, 0
7c10: 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20  , 0, countStep, 
7c20: 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65     countFinalize
7c30: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
7c40: 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  i;..  for(i=0; i
7c50: 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 29 2f  <sizeof(aFuncs)/
7c60: 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b 30 5d  sizeof(aFuncs[0]
7c70: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69  ); i++){.    voi
7c80: 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 20  d *pArg = 0;.   
7c90: 20 73 77 69 74 63 68 28 20 61 46 75 6e 63 73 5b   switch( aFuncs[
7ca0: 69 5d 2e 61 72 67 54 79 70 65 20 29 7b 0a 20 20  i].argType ){.  
7cb0: 20 20 20 20 63 61 73 65 20 31 3a 20 70 41 72 67      case 1: pArg
7cc0: 20 3d 20 64 62 3b 20 62 72 65 61 6b 3b 0a 20 20   = db; break;.  
7cd0: 20 20 20 20 63 61 73 65 20 32 3a 20 70 41 72 67      case 2: pArg
7ce0: 20 3d 20 28 76 6f 69 64 20 2a 29 28 2d 31 29 3b   = (void *)(-1);
7cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7d00: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
7d10: 75 6e 63 28 64 62 2c 20 61 46 75 6e 63 73 5b 69  unc(db, aFuncs[i
7d20: 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 73 5b  ].zName, aFuncs[
7d30: 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20  i].nArg,.       
7d40: 20 61 46 75 6e 63 73 5b 69 5d 2e 65 54 65 78 74   aFuncs[i].eText
7d50: 52 65 70 2c 20 70 41 72 67 2c 20 61 46 75 6e 63  Rep, pArg, aFunc
7d60: 73 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 2c 20 30  s[i].xFunc, 0, 0
7d70: 29 3b 0a 20 20 20 20 69 66 28 20 61 46 75 6e 63  );.    if( aFunc
7d80: 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71  s[i].needCollSeq
7d90: 20 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   ){.      FuncDe
7da0: 66 20 2a 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  f *pFunc = sqlit
7db0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
7dc0: 62 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61  b, aFuncs[i].zNa
7dd0: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  me, .          s
7de0: 74 72 6c 65 6e 28 61 46 75 6e 63 73 5b 69 5d 2e  trlen(aFuncs[i].
7df0: 7a 4e 61 6d 65 29 2c 20 61 46 75 6e 63 73 5b 69  zName), aFuncs[i
7e00: 5d 2e 6e 41 72 67 2c 20 61 46 75 6e 63 73 5b 69  ].nArg, aFuncs[i
7e10: 5d 2e 65 54 65 78 74 52 65 70 2c 20 30 29 3b 0a  ].eTextRep, 0);.
7e20: 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 20        if( pFunc 
7e30: 26 26 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 65 65  && aFuncs[i].nee
7e40: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
7e50: 20 20 20 20 70 46 75 6e 63 2d 3e 6e 65 65 64 43      pFunc->needC
7e60: 6f 6c 6c 53 65 71 20 3d 20 31 3b 0a 20 20 20 20  ollSeq = 1;.    
7e70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
7e80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7e90: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 73  T_ALTERTABLE.  s
7ea0: 71 6c 69 74 65 33 41 6c 74 65 72 46 75 6e 63 74  qlite3AlterFunct
7eb0: 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69 66  ions(db);.#endif
7ec0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7ed0: 4f 4d 49 54 5f 50 41 52 53 45 52 0a 20 20 73 71  OMIT_PARSER.  sq
7ee0: 6c 69 74 65 33 41 74 74 61 63 68 46 75 6e 63 74  lite3AttachFunct
7ef0: 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69 66  ions(db);.#endif
7f00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
7f10: 7a 65 6f 66 28 61 41 67 67 73 29 2f 73 69 7a 65  zeof(aAggs)/size
7f20: 6f 66 28 61 41 67 67 73 5b 30 5d 29 3b 20 69 2b  of(aAggs[0]); i+
7f30: 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 41  +){.    void *pA
7f40: 72 67 20 3d 20 30 3b 0a 20 20 20 20 73 77 69 74  rg = 0;.    swit
7f50: 63 68 28 20 61 41 67 67 73 5b 69 5d 2e 61 72 67  ch( aAggs[i].arg
7f60: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
7f70: 73 65 20 31 3a 20 70 41 72 67 20 3d 20 64 62 3b  se 1: pArg = db;
7f80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
7f90: 73 65 20 32 3a 20 70 41 72 67 20 3d 20 28 76 6f  se 2: pArg = (vo
7fa0: 69 64 20 2a 29 28 2d 31 29 3b 20 62 72 65 61 6b  id *)(-1); break
7fb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7fc0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
7fd0: 2c 20 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65  , aAggs[i].zName
7fe0: 2c 20 61 41 67 67 73 5b 69 5d 2e 6e 41 72 67 2c  , aAggs[i].nArg,
7ff0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
8000: 20 20 20 20 20 20 20 70 41 72 67 2c 20 30 2c 20         pArg, 0, 
8010: 61 41 67 67 73 5b 69 5d 2e 78 53 74 65 70 2c 20  aAggs[i].xStep, 
8020: 61 41 67 67 73 5b 69 5d 2e 78 46 69 6e 61 6c 69  aAggs[i].xFinali
8030: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67  ze);.    if( aAg
8040: 67 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65  gs[i].needCollSe
8050: 71 20 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  q ){.      FuncD
8060: 65 66 20 2a 70 46 75 6e 63 20 3d 20 73 71 6c 69  ef *pFunc = sqli
8070: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
8080: 20 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a 4e   db, aAggs[i].zN
8090: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ame,.          s
80a0: 74 72 6c 65 6e 28 61 41 67 67 73 5b 69 5d 2e 7a  trlen(aAggs[i].z
80b0: 4e 61 6d 65 29 2c 20 61 41 67 67 73 5b 69 5d 2e  Name), aAggs[i].
80c0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
80d0: 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  8, 0);.      if(
80e0: 20 70 46 75 6e 63 20 26 26 20 61 41 67 67 73 5b   pFunc && aAggs[
80f0: 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  i].needCollSeq )
8100: 7b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d  {.        pFunc-
8110: 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d 20 31  >needCollSeq = 1
8120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8130: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 67    }.  sqlite3Reg
8140: 69 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e  isterDateTimeFun
8150: 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 64  ctions(db);.#ifd
8160: 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
8170: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 73 65  (void)sqlite3Sse
8180: 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23  Functions(db);.#
8190: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
81a0: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
81b0: 56 45 5f 4c 49 4b 45 0a 20 20 73 71 6c 69 74 65  VE_LIKE.  sqlite
81c0: 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e  3RegisterLikeFun
81d0: 63 74 69 6f 6e 73 28 64 62 2c 20 31 29 3b 0a 23  ctions(db, 1);.#
81e0: 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 52 65  else.  sqlite3Re
81f0: 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69  gisterLikeFuncti
8200: 6f 6e 73 28 64 62 2c 20 30 29 3b 0a 23 65 6e 64  ons(db, 0);.#end
8210: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  if.}../*.** Set 
8220: 74 68 65 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67  the LIKEOPT flag
8230: 20 6f 6e 20 74 68 65 20 32 2d 61 72 67 75 6d 65   on the 2-argume
8240: 6e 74 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  nt function with
8250: 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e   the given name.
8260: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8270: 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73  setLikeOptFlag(s
8280: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
8290: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
82a0: 6e 74 20 66 6c 61 67 56 61 6c 29 7b 0a 20 20 46  nt flagVal){.  F
82b0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
82c0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
82d0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
82e0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
82f0: 6d 65 29 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  me), 2, SQLITE_U
8300: 54 46 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  TF8, 0);.  if( p
8310: 44 65 66 20 29 7b 0a 20 20 20 20 70 44 65 66 2d  Def ){.    pDef-
8320: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 56 61 6c  >flags = flagVal
8330: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8340: 65 67 69 73 74 65 72 20 74 68 65 20 62 75 69 6c  egister the buil
8350: 74 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20 47 4c  t-in LIKE and GL
8360: 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  OB functions.  T
8370: 68 65 20 63 61 73 65 53 65 6e 73 69 74 69 76 65  he caseSensitive
8380: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 64 65  .** parameter de
8390: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
83a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49 4b 45   or not the LIKE
83b0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63 61 73   operator is cas
83c0: 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65 2e 20  e.** sensitive. 
83d0: 20 47 4c 4f 42 20 69 73 20 61 6c 77 61 79 73 20   GLOB is always 
83e0: 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2e 0a  case sensitive..
83f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
8400: 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74  egisterLikeFunct
8410: 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ions(sqlite3 *db
8420: 2c 20 69 6e 74 20 63 61 73 65 53 65 6e 73 69 74  , int caseSensit
8430: 69 76 65 29 7b 0a 20 20 73 74 72 75 63 74 20 63  ive){.  struct c
8440: 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66  ompareInfo *pInf
8450: 6f 3b 0a 20 20 69 66 28 20 63 61 73 65 53 65 6e  o;.  if( caseSen
8460: 73 69 74 69 76 65 20 29 7b 0a 20 20 20 20 70 49  sitive ){.    pI
8470: 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f  nfo = (struct co
8480: 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65  mpareInfo*)&like
8490: 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c 73 65  InfoAlt;.  }else
84a0: 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73  {.    pInfo = (s
84b0: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
84c0: 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d  o*)&likeInfoNorm
84d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
84e0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 6c  reateFunc(db, "l
84f0: 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ike", 2, SQLITE_
8500: 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b  UTF8, pInfo, lik
8510: 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  eFunc, 0, 0);.  
8520: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
8530: 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 33 2c  c(db, "like", 3,
8540: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49   SQLITE_UTF8, pI
8550: 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30  nfo, likeFunc, 0
8560: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
8570: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 67  reateFunc(db, "g
8580: 6c 6f 62 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  lob", 2, SQLITE_
8590: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 73 74  UTF8, .      (st
85a0: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
85b0: 2a 29 26 67 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b  *)&globInfo, lik
85c0: 65 46 75 6e 63 2c 20 30 2c 30 29 3b 0a 20 20 73  eFunc, 0,0);.  s
85d0: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62  etLikeOptFlag(db
85e0: 2c 20 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45  , "glob", SQLITE
85f0: 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c  _FUNC_LIKE | SQL
8600: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a  ITE_FUNC_CASE);.
8610: 20 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67    setLikeOptFlag
8620: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20  (db, "like", .  
8630: 20 20 20 20 63 61 73 65 53 65 6e 73 69 74 69 76      caseSensitiv
8640: 65 20 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  e ? (SQLITE_FUNC
8650: 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46  _LIKE | SQLITE_F
8660: 55 4e 43 5f 43 41 53 45 29 20 3a 20 53 51 4c 49  UNC_CASE) : SQLI
8670: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d  TE_FUNC_LIKE);.}
8680: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f  ../*.** pExpr po
8690: 69 6e 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65  ints to an expre
86a0: 73 73 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c  ssion which impl
86b0: 65 6d 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f  ements a functio
86c0: 6e 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20  n.  If.** it is 
86d0: 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61  appropriate to a
86e0: 70 70 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70  pply the LIKE op
86f0: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68  timization to th
8700: 61 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74  at function.** t
8710: 68 65 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74  hen set aWc[0] t
8720: 68 72 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f  hrough aWc[2] to
8730: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
8740: 61 72 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20  aracters and.** 
8750: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
8760: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
8770: 20 6e 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c   not a LIKE-styl
8780: 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a  e function then.
8790: 2a 2a 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  ** return FALSE.
87a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
87b0: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71  sLikeFunction(sq
87c0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
87d0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73  *pExpr, int *pIs
87e0: 4e 6f 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57  Nocase, char *aW
87f0: 63 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70  c){.  FuncDef *p
8800: 44 65 66 3b 0a 20 20 69 66 28 20 70 45 78 70 72  Def;.  if( pExpr
8810: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
8820: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
8830: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  0;.  }.  if( pEx
8840: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
8850: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
8860: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 44 65 66 20  n 0;.  }.  pDef 
8870: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
8880: 63 74 69 6f 6e 28 64 62 2c 20 28 63 68 61 72 2a  ction(db, (char*
8890: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
88a0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
88b0: 20 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   2,.            
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
88e0: 3b 0a 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20  ;.  if( pDef==0 
88f0: 7c 7c 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  || (pDef->flags 
8900: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  & SQLITE_FUNC_LI
8910: 4b 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  KE)==0 ){.    re
8920: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
8930: 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73  * The memcpy() s
8940: 74 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73  tatement assumes
8950: 20 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61   that the wildca
8960: 72 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72  rd characters ar
8970: 65 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  e.  ** the first
8980: 20 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74   three statement
8990: 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65  s in the compare
89a0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
89b0: 20 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   The.  ** assert
89c0: 73 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  s() that follow 
89d0: 76 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75  verify that assu
89e0: 6d 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65  mption.  */.  me
89f0: 6d 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e  mcpy(aWc, pDef->
8a00: 70 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20  pUserData, 3);. 
8a10: 20 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29   assert( (char*)
8a20: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20  &likeInfoAlt == 
8a30: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
8a40: 41 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a  Alt.matchAll );.
8a50: 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61    assert( &((cha
8a60: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29  r*)&likeInfoAlt)
8a70: 5b 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c  [1] == (char*)&l
8a80: 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68  ikeInfoAlt.match
8a90: 4f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  One );.  assert(
8aa0: 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49   &((char*)&likeI
8ab0: 6e 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63  nfoAlt)[2] == (c
8ac0: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
8ad0: 74 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20  t.matchSet );.  
8ae0: 2a 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44  *pIsNocase = (pD
8af0: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
8b00: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30  TE_FUNC_CASE)==0
8b10: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.