/ Hex Artifact Content
Login

Artifact 21a7e73009510e90f09759b5097481c68ca8dcd3:


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 35 30 20 32 30 30 37 2f 30 35 2f 30 38  1.150 2007/05/08
02a0: 20 31 35 3a 33 34 3a 34 38 20 64 72 68 20 45 78   15:34:48 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 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
0a80: 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65  rn;.      for(le
0a90: 6e 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 20 69  n=0; *z; z++){ i
0aa0: 66 28 20 28 30 78 63 30 26 2a 7a 29 21 3d 30 78  f( (0xc0&*z)!=0x
0ab0: 38 30 20 29 20 6c 65 6e 2b 2b 3b 20 7d 0a 20 20  80 ) len++; }.  
0ac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0ad0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
0ae0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  len);.      brea
0af0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
0b00: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
0b10: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
0b20: 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  l(context);.    
0b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
0b50: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
0b60: 65 20 61 62 73 28 29 20 66 75 6e 63 74 69 6f 6e  e abs() function
0b70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0b80: 61 62 73 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  absFunc(sqlite3_
0b90: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0ba0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
0bb0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
0bc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ){.  assert( arg
0bd0: 63 3d 3d 31 20 29 3b 0a 20 20 73 77 69 74 63 68  c==1 );.  switch
0be0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
0bf0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
0c00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0c10: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
0c20: 20 20 69 36 34 20 69 56 61 6c 20 3d 20 73 71 6c    i64 iVal = sql
0c30: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
0c40: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
0c50: 20 69 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20   if( iVal<0 ){. 
0c60: 20 20 20 20 20 20 20 69 66 28 20 28 69 56 61 6c         if( (iVal
0c70: 3c 3c 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  <<1)==0 ){.     
0c80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
0c90: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
0ca0: 74 2c 20 22 69 6e 74 65 67 65 72 20 6f 76 65 72  t, "integer over
0cb0: 66 6c 6f 77 22 2c 20 2d 31 29 3b 0a 20 20 20 20  flow", -1);.    
0cc0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
0cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0ce0: 69 56 61 6c 20 3d 20 2d 69 56 61 6c 3b 0a 20 20  iVal = -iVal;.  
0cf0: 20 20 20 20 7d 20 0a 20 20 20 20 20 20 73 71 6c      } .      sql
0d00: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
0d10: 34 28 63 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29  4(context, iVal)
0d20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0d30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
0d40: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
0d50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
0d60: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
0d70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0d80: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
0d90: 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20   {.      double 
0da0: 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  rVal = sqlite3_v
0db0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
0dc0: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [0]);.      if( 
0dd0: 72 56 61 6c 3c 30 20 29 20 72 56 61 6c 20 3d 20  rVal<0 ) rVal = 
0de0: 2d 72 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c  -rVal;.      sql
0df0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
0e00: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 56 61 6c  le(context, rVal
0e10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0e20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0e30: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
0e40: 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 28  n of the substr(
0e50: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74  ) function.*/.st
0e60: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 72  atic void substr
0e70: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
0e80: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0e90: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
0ea0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0eb0: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
0ec0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
0ed0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
0ee0: 65 64 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69  ed char *z2;.  i
0ef0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  nt i;.  int len;
0f00: 0a 20 20 69 36 34 20 70 31 2c 20 70 32 3b 0a 0a  .  i64 p1, p2;..
0f10: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
0f20: 33 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  3 );.  z = sqlit
0f30: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
0f40: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 3d  gv[0]);.  if( z=
0f50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
0f60: 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  1 = sqlite3_valu
0f70: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a  e_int(argv[1]);.
0f80: 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 76    p2 = sqlite3_v
0f90: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d  alue_int(argv[2]
0fa0: 29 3b 0a 20 20 66 6f 72 28 6c 65 6e 3d 30 2c 20  );.  for(len=0, 
0fb0: 7a 32 3d 7a 3b 20 2a 7a 32 3b 20 7a 32 2b 2b 29  z2=z; *z2; z2++)
0fc0: 7b 20 69 66 28 20 28 30 78 63 30 26 2a 7a 32 29  { if( (0xc0&*z2)
0fd0: 21 3d 30 78 38 30 20 29 20 6c 65 6e 2b 2b 3b 20  !=0x80 ) len++; 
0fe0: 7d 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a  }.  if( p1<0 ){.
0ff0: 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20      p1 += len;. 
1000: 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20     if( p1<0 ){. 
1010: 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20       p2 += p1;. 
1020: 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20 20 20       p1 = 0;.   
1030: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1040: 31 3e 30 20 29 7b 0a 20 20 20 20 70 31 2d 2d 3b  1>0 ){.    p1--;
1050: 0a 20 20 7d 0a 20 20 69 66 28 20 70 31 2b 70 32  .  }.  if( p1+p2
1060: 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 70 32 20 3d  >len ){.    p2 =
1070: 20 6c 65 6e 2d 70 31 3b 0a 20 20 7d 0a 20 20 66   len-p1;.  }.  f
1080: 6f 72 28 69 3d 30 3b 20 69 3c 70 31 20 26 26 20  or(i=0; i<p1 && 
1090: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
10a0: 69 66 28 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d  if( (z[i]&0xc0)=
10b0: 3d 30 78 38 30 20 29 20 70 31 2b 2b 3b 0a 20 20  =0x80 ) p1++;.  
10c0: 7d 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20  }.  while( z[i] 
10d0: 26 26 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d 3d  && (z[i]&0xc0)==
10e0: 30 78 38 30 20 29 7b 20 69 2b 2b 3b 20 70 31 2b  0x80 ){ i++; p1+
10f0: 2b 3b 20 7d 0a 20 20 66 6f 72 28 3b 20 69 3c 70  +; }.  for(; i<p
1100: 31 2b 70 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b  1+p2 && z[i]; i+
1110: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 5b 69  +){.    if( (z[i
1120: 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  ]&0xc0)==0x80 ) 
1130: 70 32 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  p2++;.  }.  whil
1140: 65 28 20 7a 5b 69 5d 20 26 26 20 28 7a 5b 69 5d  e( z[i] && (z[i]
1150: 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 20  &0xc0)==0x80 ){ 
1160: 69 2b 2b 3b 20 70 32 2b 2b 3b 20 7d 0a 20 20 69  i++; p2++; }.  i
1170: 66 28 20 70 32 3c 30 20 29 20 70 32 20 3d 20 30  f( p2<0 ) p2 = 0
1180: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1190: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
11a0: 20 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20   (char*)&z[p1], 
11b0: 70 32 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  p2, SQLITE_TRANS
11c0: 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  IENT);.}../*.** 
11d0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
11e0: 66 20 74 68 65 20 72 6f 75 6e 64 28 29 20 66 75  f the round() fu
11f0: 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  nction.*/.static
1200: 20 76 6f 69 64 20 72 6f 75 6e 64 46 75 6e 63 28   void roundFunc(
1210: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1220: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
1230: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
1240: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  e **argv){.  int
1250: 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65   n = 0;.  double
1260: 20 72 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   r;.  char zBuf[
1270: 35 30 30 5d 3b 20 20 2f 2a 20 6c 61 72 67 65 72  500];  /* larger
1280: 20 74 68 61 6e 20 74 68 65 20 25 66 20 72 65 70   than the %f rep
1290: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
12a0: 68 65 20 6c 61 72 67 65 73 74 20 64 6f 75 62 6c  he largest doubl
12b0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61  e */.  assert( a
12c0: 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d  rgc==1 || argc==
12d0: 32 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d  2 );.  if( argc=
12e0: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51  =2 ){.    if( SQ
12f0: 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74  LITE_NULL==sqlit
1300: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
1310: 67 76 5b 31 5d 29 20 29 20 72 65 74 75 72 6e 3b  gv[1]) ) return;
1320: 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
1330: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
1340: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 33  1]);.    if( n>3
1350: 30 20 29 20 6e 20 3d 20 33 30 3b 0a 20 20 20 20  0 ) n = 30;.    
1360: 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b  if( n<0 ) n = 0;
1370: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1380: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
1390: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
13a0: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
13b0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
13c0: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d  e_double(argv[0]
13d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
13e0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
13f0: 66 29 2c 7a 42 75 66 2c 22 25 2e 2a 66 22 2c 6e  f),zBuf,"%.*f",n
1400: 2c 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 41 74  ,r);.  sqlite3At
1410: 6f 46 28 7a 42 75 66 2c 20 26 72 29 3b 0a 20 20  oF(zBuf, &r);.  
1420: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
1430: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72  ouble(context, r
1440: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
1450: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1460: 65 20 75 70 70 65 72 28 29 20 61 6e 64 20 6c 6f  e upper() and lo
1470: 77 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74 69  wer() SQL functi
1480: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ons..*/.static v
1490: 6f 69 64 20 75 70 70 65 72 46 75 6e 63 28 73 71  oid upperFunc(sq
14a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
14b0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
14c0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
14d0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20  **argv){.  char 
14e0: 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *z1;.  const cha
14f0: 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20  r *z2;.  int i, 
1500: 6e 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20  n;.  if( argc<1 
1510: 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d  || SQLITE_NULL==
1520: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1530: 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 72 65  pe(argv[0]) ) re
1540: 74 75 72 6e 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  turn;.  n = sqli
1550: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
1560: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 32 20 3d  argv[0]);.  z2 =
1570: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
1580: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1590: 30 5d 29 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b  0]);.  if( z2 ){
15a0: 0a 20 20 20 20 7a 31 20 3d 20 73 71 6c 69 74 65  .    z1 = sqlite
15b0: 33 5f 6d 61 6c 6c 6f 63 28 6e 2b 31 29 3b 0a 20  3_malloc(n+1);. 
15c0: 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20 20     if( z1 ){.   
15d0: 20 20 20 6d 65 6d 63 70 79 28 7a 31 2c 20 7a 32     memcpy(z1, z2
15e0: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 66 6f  , n+1);.      fo
15f0: 72 28 69 3d 30 3b 20 7a 31 5b 69 5d 3b 20 69 2b  r(i=0; z1[i]; i+
1600: 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b 69  +){.        z1[i
1610: 5d 20 3d 20 74 6f 75 70 70 65 72 28 7a 31 5b 69  ] = toupper(z1[i
1620: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1630: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1640: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
1650: 31 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66  1, -1, sqlite3_f
1660: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ree);.    }.  }.
1670: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f  }.static void lo
1680: 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  werFunc(sqlite3_
1690: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
16a0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
16b0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
16c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20  ){.  char *z1;. 
16d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
16e0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
16f0: 66 28 20 61 72 67 63 3c 31 20 7c 7c 20 53 51 4c  f( argc<1 || SQL
1700: 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65  ITE_NULL==sqlite
1710: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
1720: 76 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a  v[0]) ) return;.
1730: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
1740: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
1750: 5d 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72  ]);.  z2 = (char
1760: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1770: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
1780: 20 69 66 28 20 7a 32 20 29 7b 0a 20 20 20 20 7a   if( z2 ){.    z
1790: 31 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  1 = sqlite3_mall
17a0: 6f 63 28 6e 2b 31 29 3b 0a 20 20 20 20 69 66 28  oc(n+1);.    if(
17b0: 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d   z1 ){.      mem
17c0: 63 70 79 28 7a 31 2c 20 7a 32 2c 20 6e 2b 31 29  cpy(z1, z2, n+1)
17d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
17e0: 20 7a 31 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20   z1[i]; i++){.  
17f0: 20 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20 74 6f        z1[i] = to
1800: 6c 6f 77 65 72 28 7a 31 5b 69 5d 29 3b 0a 20 20  lower(z1[i]);.  
1810: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1820: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1830: 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 2d 31 2c  context, z1, -1,
1840: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
1850: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1860: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1870: 6e 20 6f 66 20 74 68 65 20 49 46 4e 55 4c 4c 28  n of the IFNULL(
1880: 29 2c 20 4e 56 4c 28 29 2c 20 61 6e 64 20 43 4f  ), NVL(), and CO
1890: 41 4c 45 53 43 45 28 29 20 66 75 6e 63 74 69 6f  ALESCE() functio
18a0: 6e 73 2e 20 20 0a 2a 2a 20 41 6c 6c 20 74 68 72  ns.  .** All thr
18b0: 65 65 20 64 6f 20 74 68 65 20 73 61 6d 65 20 74  ee do the same t
18c0: 68 69 6e 67 2e 20 20 54 68 65 79 20 72 65 74 75  hing.  They retu
18d0: 72 6e 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e  rn the first non
18e0: 2d 4e 55 4c 4c 0a 2a 2a 20 61 72 67 75 6d 65 6e  -NULL.** argumen
18f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1900: 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20  d ifnullFunc(.  
1910: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1920: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
1930: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
1940: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
1950: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1960: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
1970: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
1980: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
1990: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69  alue_type(argv[i
19a0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ]) ){.      sqli
19b0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
19c0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 69  (context, argv[i
19d0: 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ]);.      break;
19e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
19f0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1a00: 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20  on of random(). 
1a10: 20 52 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d   Return a random
1a20: 20 69 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73   integer.  .*/.s
1a30: 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f  tatic void rando
1a40: 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  mFunc(.  sqlite3
1a50: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1a60: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
1a70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1a80: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
1a90: 65 5f 69 6e 74 36 34 20 72 3b 0a 20 20 73 71 6c  e_int64 r;.  sql
1aa0: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73  ite3Randomness(s
1ab0: 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20  izeof(r), &r);. 
1ac0: 20 69 66 28 20 28 72 3c 3c 31 29 3d 3d 30 20 29   if( (r<<1)==0 )
1ad0: 20 72 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76   r = 0;  /* Prev
1ae0: 65 6e 74 20 30 78 38 30 30 30 2e 2e 2e 2e 20 61  ent 0x8000.... a
1af0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 6f 20  s the result so 
1b00: 74 68 61 74 20 77 65 20 2a 2f 0a 20 20 20 20 20  that we */.     
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 20 20 20 2f 2a 20 63 61 6e 20 61 6c 77 61       /* can alwa
1b30: 79 73 20 64 6f 20 61 62 73 28 29 20 6f 66 20 74  ys do abs() of t
1b40: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 73  he result */.  s
1b50: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
1b60: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  t64(context, r);
1b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1b80: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64  entation of rand
1b90: 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52 65 74 75  omblob(N).  Retu
1ba0: 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62 6c 6f 62  rn a random blob
1bb0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e 20 62 79  .** that is N by
1bc0: 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  tes long..*/.sta
1bd0: 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 42  tic void randomB
1be0: 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  lob(.  sqlite3_c
1bf0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1c00: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
1c10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1c20: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  rgv.){.  int n;.
1c30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1c40: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  *p;.  assert( ar
1c50: 67 63 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 73  gc==1 );.  n = s
1c60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
1c70: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
1c80: 20 6e 3c 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20   n<1 ){.    n = 
1c90: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 53  1;.  }.  if( n>S
1ca0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
1cb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1cc0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f  result_error_too
1cd0: 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  big(context);.  
1ce0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1cf0: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
1d00: 28 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  (n);.  if( p ){.
1d10: 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f      sqlite3Rando
1d20: 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a 20 20 20  mness(n, p);.   
1d30: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1d40: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28 63  blob(context, (c
1d50: 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71 6c 69 74  har*)p, n, sqlit
1d60: 65 33 46 72 65 65 58 29 3b 0a 20 20 7d 0a 7d 0a  e3FreeX);.  }.}.
1d70: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1d80: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 73  ation of the las
1d90: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
1da0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
1db0: 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61  The return.** va
1dc0: 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  lue is the same 
1dd0: 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  as the sqlite3_l
1de0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
1df0: 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  () API function.
1e00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e10: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
1e20: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  d(.  sqlite3_con
1e30: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
1e40: 20 20 69 6e 74 20 61 72 67 2c 20 0a 20 20 73 71    int arg, .  sq
1e50: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1e60: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
1e70: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  *db = sqlite3_us
1e80: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
1e90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1ea0: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
1eb0: 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  , sqlite3_last_i
1ec0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29 29  nsert_rowid(db))
1ed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1ee0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1ef0: 20 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66   changes() SQL f
1f00: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65  unction.  The re
1f10: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1f20: 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 65  e.** same as the
1f30: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
1f40: 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  () API function.
1f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f60: 63 68 61 6e 67 65 73 28 0a 20 20 73 71 6c 69 74  changes(.  sqlit
1f70: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1f80: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 2c 0a  ext,.  int arg,.
1f90: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1fa0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1fb0: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
1fc0: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
1fd0: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ext);.  sqlite3_
1fe0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
1ff0: 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  xt, sqlite3_chan
2000: 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ges(db));.}../*.
2010: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2020: 6e 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 5f 63  n of the total_c
2030: 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e  hanges() SQL fun
2040: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75  ction.  The retu
2050: 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 74  rn value is.** t
2060: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
2070: 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
2080: 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e 63 74  nges() API funct
2090: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
20a0: 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  oid total_change
20b0: 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  s(.  sqlite3_con
20c0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
20d0: 20 69 6e 74 20 61 72 67 2c 0a 20 20 73 71 6c 69   int arg,.  sqli
20e0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
20f0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2100: 62 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  b = sqlite3_user
2110: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
2120: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2130: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
2140: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
2150: 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ges(db));.}../*.
2160: 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 64  ** A structure d
2170: 65 66 69 6e 69 6e 67 20 68 6f 77 20 74 6f 20 64  efining how to d
2180: 6f 20 47 4c 4f 42 2d 73 74 79 6c 65 20 63 6f 6d  o GLOB-style com
2190: 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f 0a 73 74 72  parisons..*/.str
21a0: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
21b0: 7b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c 3b  {.  u8 matchAll;
21c0: 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e 65 3b 0a  .  u8 matchOne;.
21d0: 20 20 75 38 20 6d 61 74 63 68 53 65 74 3b 0a 20    u8 matchSet;. 
21e0: 20 75 38 20 6e 6f 43 61 73 65 3b 0a 7d 3b 0a 0a   u8 noCase;.};..
21f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2200: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
2210: 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20 27 2a 27  globInfo = { '*'
2220: 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30 20 7d 3b  , '?', '[', 0 };
2230: 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20  ./* The correct 
2240: 53 51 4c 2d 39 32 20 62 65 68 61 76 69 6f 72 20  SQL-92 behavior 
2250: 69 73 20 66 6f 72 20 74 68 65 20 4c 49 4b 45 20  is for the LIKE 
2260: 6f 70 65 72 61 74 6f 72 20 74 6f 20 69 67 6e 6f  operator to igno
2270: 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20 54 68 75  re.** case.  Thu
2280: 73 20 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  s  'a' LIKE 'A' 
2290: 77 6f 75 6c 64 20 62 65 20 74 72 75 65 2e 20 2a  would be true. *
22a0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
22b0: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
22c0: 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 20 3d  o likeInfoNorm =
22d0: 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20 30   { '%', '_',   0
22e0: 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20 53 51 4c  , 1 };./* If SQL
22f0: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
2300: 56 45 5f 4c 49 4b 45 20 69 73 20 64 65 66 69 6e  VE_LIKE is defin
2310: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 4c 49 4b  ed, then the LIK
2320: 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  E operator.** is
2330: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 20   case sensitive 
2340: 63 61 75 73 69 6e 67 20 27 61 27 20 4c 49 4b 45  causing 'a' LIKE
2350: 20 27 41 27 20 74 6f 20 62 65 20 66 61 6c 73 65   'A' to be false
2360: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
2370: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
2380: 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41 6c 74 20  nfo likeInfoAlt 
2390: 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20  = { '%', '_',   
23a0: 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 58  0, 0 };../*.** X
23b0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
23c0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
23d0: 6f 66 20 61 20 55 54 46 2d 38 20 63 68 61 72 61  of a UTF-8 chara
23e0: 63 74 65 72 2e 20 20 49 6e 63 72 65 6d 65 6e 74  cter.  Increment
23f0: 0a 2a 2a 20 58 20 73 6f 20 74 68 61 74 20 69 74  .** X so that it
2400: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
2410: 65 78 74 20 63 68 61 72 61 63 74 65 72 2e 20 20  ext character.  
2420: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
2430: 72 69 67 68 74 0a 2a 2a 20 69 66 20 58 20 70 6f  right.** if X po
2440: 69 6e 74 73 20 74 6f 20 61 20 77 65 6c 6c 2d 66  ints to a well-f
2450: 6f 72 6d 65 64 20 55 54 46 2d 38 20 73 74 72 69  ormed UTF-8 stri
2460: 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73  ng..*/.#define s
2470: 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 58 29  qliteNextChar(X)
2480: 20 20 77 68 69 6c 65 28 20 28 30 78 63 30 26 2a    while( (0xc0&*
2490: 2b 2b 28 58 29 29 3d 3d 30 78 38 30 20 29 7b 7d  ++(X))==0x80 ){}
24a0: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 43  .#define sqliteC
24b0: 68 61 72 56 61 6c 28 58 29 20 20 20 73 71 6c 69  harVal(X)   sqli
24c0: 74 65 33 52 65 61 64 55 74 66 38 28 58 29 0a 0a  te3ReadUtf8(X)..
24d0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
24e0: 77 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73  wo UTF-8 strings
24f0: 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 77 68   for equality wh
2500: 65 72 65 20 74 68 65 20 66 69 72 73 74 20 73 74  ere the first st
2510: 72 69 6e 67 20 63 61 6e 0a 2a 2a 20 70 6f 74 65  ring can.** pote
2520: 6e 74 69 61 6c 6c 79 20 62 65 20 61 20 22 67 6c  ntially be a "gl
2530: 6f 62 22 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ob" expression. 
2540: 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 31 29   Return true (1)
2550: 20 69 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20   if they.** are 
2560: 74 68 65 20 73 61 6d 65 20 61 6e 64 20 66 61 6c  the same and fal
2570: 73 65 20 28 30 29 20 69 66 20 74 68 65 79 20 61  se (0) if they a
2580: 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a 2a  re different..**
2590: 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c  .** Globbing rul
25a0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  es:.**.**      '
25b0: 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  *'       Matches
25c0: 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
25d0: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
25e0: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
25f0: 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d       '?'       M
2600: 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f  atches exactly o
2610: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ne character..**
2620: 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20  .**     [...]   
2630: 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
2640: 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
2650: 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20  e enclosed list 
2660: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
2670: 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e       characters.
2680: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e  .**.**     [^...
2690: 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e  ]     Matches on
26a0: 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20  e character not 
26b0: 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  in the enclosed 
26c0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  list..**.** With
26d0: 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e 64 20 5b   the [...] and [
26e0: 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e 67 2c 20  ^...] matching, 
26f0: 61 20 27 5d 27 20 63 68 61 72 61 63 74 65 72 20  a ']' character 
2700: 63 61 6e 20 62 65 20 69 6e 63 6c 75 64 65 64 0a  can be included.
2710: 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 20 62  ** in the list b
2720: 79 20 6d 61 6b 69 6e 67 20 69 74 20 74 68 65 20  y making it the 
2730: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
2740: 61 66 74 65 72 20 27 5b 27 20 6f 72 20 27 5e 27  after '[' or '^'
2750: 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65 20 6f 66  .  A.** range of
2760: 20 63 68 61 72 61 63 74 65 72 73 20 63 61 6e 20   characters can 
2770: 62 65 20 73 70 65 63 69 66 69 65 64 20 75 73 69  be specified usi
2780: 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d 70 6c 65  ng '-'.  Example
2790: 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20 6d 61 74  :.** "[a-z]" mat
27a0: 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65 20  ches any single 
27b0: 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65 74 74 65  lower-case lette
27c0: 72 2e 20 20 54 6f 20 6d 61 74 63 68 20 61 20 27  r.  To match a '
27d0: 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74  -', make.** it t
27e0: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
27f0: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  r in the list..*
2800: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2810: 65 20 69 73 20 75 73 75 61 6c 6c 79 20 71 75 69  e is usually qui
2820: 63 6b 2c 20 62 75 74 20 63 61 6e 20 62 65 20 4e  ck, but can be N
2830: 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f 72 73 74  **2 in the worst
2840: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 69 6e   case..**.** Hin
2850: 74 73 3a 20 74 6f 20 6d 61 74 63 68 20 27 2a 27  ts: to match '*'
2860: 20 6f 72 20 27 3f 27 2c 20 70 75 74 20 74 68 65   or '?', put the
2870: 6d 20 69 6e 20 22 5b 5d 22 2e 20 20 4c 69 6b 65  m in "[]".  Like
2880: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2890: 20 20 20 20 20 61 62 63 5b 2a 5d 78 79 7a 20 20       abc[*]xyz  
28a0: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 22 61        Matches "a
28b0: 62 63 2a 78 79 7a 22 20 6f 6e 6c 79 0a 2a 2f 0a  bc*xyz" only.*/.
28c0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 74 74 65  static int patte
28d0: 72 6e 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e  rnCompare(.  con
28e0: 73 74 20 75 38 20 2a 7a 50 61 74 74 65 72 6e 2c  st u8 *zPattern,
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2900: 20 54 68 65 20 67 6c 6f 62 20 70 61 74 74 65 72   The glob patter
2910: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
2920: 2a 7a 53 74 72 69 6e 67 2c 20 20 20 20 20 20 20  *zString,       
2930: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2940: 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65  tring to compare
2950: 20 61 67 61 69 6e 73 74 20 74 68 65 20 67 6c 6f   against the glo
2960: 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 74 72  b */.  const str
2970: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
2980: 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49 6e 66 6f 72  *pInfo, /* Infor
2990: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 68 6f 77  mation about how
29a0: 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61   to do the compa
29b0: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  re */.  const in
29c0: 74 20 65 73 63 20 20 20 20 20 20 20 20 20 20 20  t esc           
29d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29e0: 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72  escape character
29f0: 20 2a 2f 0a 29 7b 0a 20 20 72 65 67 69 73 74 65   */.){.  registe
2a00: 72 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69  r int c;.  int i
2a10: 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65  nvert;.  int see
2a20: 6e 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 20 20 75  n;.  int c2;.  u
2a30: 38 20 6d 61 74 63 68 4f 6e 65 20 3d 20 70 49 6e  8 matchOne = pIn
2a40: 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65 3b 0a 20 20  fo->matchOne;.  
2a50: 75 38 20 6d 61 74 63 68 41 6c 6c 20 3d 20 70 49  u8 matchAll = pI
2a60: 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c 6c 3b 0a 20  nfo->matchAll;. 
2a70: 20 75 38 20 6d 61 74 63 68 53 65 74 20 3d 20 70   u8 matchSet = p
2a80: 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3b 0a  Info->matchSet;.
2a90: 20 20 75 38 20 6e 6f 43 61 73 65 20 3d 20 70 49    u8 noCase = pI
2aa0: 6e 66 6f 2d 3e 6e 6f 43 61 73 65 3b 20 0a 20 20  nfo->noCase; .  
2ab0: 69 6e 74 20 70 72 65 76 45 73 63 61 70 65 20 3d  int prevEscape =
2ac0: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
2ad0: 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  if the previous 
2ae0: 63 68 61 72 61 63 74 65 72 20 77 61 73 20 27 65  character was 'e
2af0: 73 63 61 70 65 27 20 2a 2f 0a 0a 20 20 77 68 69  scape' */..  whi
2b00: 6c 65 28 20 28 63 20 3d 20 2a 7a 50 61 74 74 65  le( (c = *zPatte
2b10: 72 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  rn)!=0 ){.    if
2b20: 28 20 21 70 72 65 76 45 73 63 61 70 65 20 26 26  ( !prevEscape &&
2b30: 20 63 3d 3d 6d 61 74 63 68 41 6c 6c 20 29 7b 0a   c==matchAll ){.
2b40: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
2b50: 7a 50 61 74 74 65 72 6e 5b 31 5d 29 20 3d 3d 20  zPattern[1]) == 
2b60: 6d 61 74 63 68 41 6c 6c 20 7c 7c 20 63 20 3d 3d  matchAll || c ==
2b70: 20 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20   matchOne ){.   
2b80: 20 20 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63       if( c==matc
2b90: 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hOne ){.        
2ba0: 20 20 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d    if( *zString==
2bb0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2bc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65          sqliteNe
2bd0: 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b  xtChar(zString);
2be0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bf0: 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20     zPattern++;. 
2c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2c10: 20 63 20 26 26 20 65 73 63 20 26 26 20 73 71 6c   c && esc && sql
2c20: 69 74 65 33 52 65 61 64 55 74 66 38 28 26 7a 50  ite3ReadUtf8(&zP
2c30: 61 74 74 65 72 6e 5b 31 5d 29 3d 3d 65 73 63 20  attern[1])==esc 
2c40: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 63 6f  ){.        u8 co
2c50: 6e 73 74 20 2a 7a 54 65 6d 70 20 3d 20 26 7a 50  nst *zTemp = &zP
2c60: 61 74 74 65 72 6e 5b 31 5d 3b 0a 20 20 20 20 20  attern[1];.     
2c70: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
2c80: 72 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  r(zTemp);.      
2c90: 20 20 63 20 3d 20 2a 7a 54 65 6d 70 3b 0a 20 20    c = *zTemp;.  
2ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2cb0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
2cc0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 6d 61  .      if( c==ma
2cd0: 74 63 68 53 65 74 20 29 7b 0a 20 20 20 20 20 20  tchSet ){.      
2ce0: 20 20 61 73 73 65 72 74 28 20 65 73 63 3d 3d 30    assert( esc==0
2cf0: 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73   );   /* This is
2d00: 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20   GLOB, not LIKE 
2d10: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
2d20: 28 20 2a 7a 53 74 72 69 6e 67 20 26 26 20 70 61  ( *zString && pa
2d30: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 26 7a 50  tternCompare(&zP
2d40: 61 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e  attern[1],zStrin
2d50: 67 2c 70 49 6e 66 6f 2c 65 73 63 29 3d 3d 30 20  g,pInfo,esc)==0 
2d60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2d70: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
2d80: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ing);.        }.
2d90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2a          return *
2da0: 7a 53 74 72 69 6e 67 21 3d 30 3b 0a 20 20 20 20  zString!=0;.    
2db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2dc0: 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 2a 7a   while( (c2 = *z
2dd0: 53 74 72 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20  String)!=0 ){.  
2de0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61          if( noCa
2df0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
2e00: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 70    c2 = sqlite3Up
2e10: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 32 5d 3b 0a  perToLower[c2];.
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
2e30: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
2e40: 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 20 20  wer[c];.        
2e50: 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d      while( c2 !=
2e60: 20 30 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b   0 && c2 != c ){
2e70: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 70 70   c2 = sqlite3Upp
2e80: 65 72 54 6f 4c 6f 77 65 72 5b 2a 2b 2b 7a 53 74  erToLower[*++zSt
2e90: 72 69 6e 67 5d 3b 20 7d 0a 20 20 20 20 20 20 20  ring]; }.       
2ea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eb0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20        while( c2 
2ec0: 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63 20  != 0 && c2 != c 
2ed0: 29 7b 20 63 32 20 3d 20 2a 2b 2b 7a 53 74 72 69  ){ c2 = *++zStri
2ee0: 6e 67 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  ng; }.          
2ef0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2f00: 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  c2==0 ) return 0
2f10: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f20: 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 26  patternCompare(&
2f30: 7a 50 61 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72  zPattern[1],zStr
2f40: 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29 20 29  ing,pInfo,esc) )
2f50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2f60: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
2f70: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
2f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2fa0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
2fb0: 21 70 72 65 76 45 73 63 61 70 65 20 26 26 20 63  !prevEscape && c
2fc0: 3d 3d 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20  ==matchOne ){.  
2fd0: 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69 6e 67      if( *zString
2fe0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74        sqliteNext
3000: 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20  Char(zString);. 
3010: 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b       zPattern++;
3020: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
3030: 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a 20 20  ==matchSet ){.  
3040: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20      int prior_c 
3050: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
3060: 74 28 20 65 73 63 3d 3d 30 20 29 3b 20 20 20 20  t( esc==0 );    
3070: 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63  /* This only occ
3080: 75 72 73 20 66 6f 72 20 47 4c 4f 42 2c 20 6e 6f  urs for GLOB, no
3090: 74 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20 20 20  t LIKE */.      
30a0: 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  seen = 0;.      
30b0: 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20  invert = 0;.    
30c0: 20 20 63 20 3d 20 73 71 6c 69 74 65 43 68 61 72    c = sqliteChar
30d0: 56 61 6c 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  Val(zString);.  
30e0: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
30f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63  eturn 0;.      c
3100: 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b  2 = *++zPattern;
3110: 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
3120: 5e 27 20 29 7b 20 69 6e 76 65 72 74 20 3d 20 31  ^' ){ invert = 1
3130: 3b 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65  ; c2 = *++zPatte
3140: 72 6e 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  rn; }.      if( 
3150: 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2==']' ){.     
3160: 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20     if( c==']' ) 
3170: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
3180: 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65    c2 = *++zPatte
3190: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
31a0: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73    while( (c2 = s
31b0: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61  qliteCharVal(zPa
31c0: 74 74 65 72 6e 29 29 21 3d 30 20 26 26 20 63 32  ttern))!=0 && c2
31d0: 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
31e0: 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20   if( c2=='-' && 
31f0: 7a 50 61 74 74 65 72 6e 5b 31 5d 21 3d 27 5d 27  zPattern[1]!=']'
3200: 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21   && zPattern[1]!
3210: 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20  =0 && prior_c>0 
3220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 50 61  ){.          zPa
3230: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ttern++;.       
3240: 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 43 68     c2 = sqliteCh
3250: 61 72 56 61 6c 28 7a 50 61 74 74 65 72 6e 29 3b  arVal(zPattern);
3260: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
3270: 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d  >=prior_c && c<=
3280: 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  c2 ) seen = 1;. 
3290: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
32a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
32b0: 6c 73 65 20 69 66 28 20 63 3d 3d 63 32 20 29 7b  lse if( c==c2 ){
32c0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20  .          seen 
32d0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
32e0: 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20  rior_c = c2;.   
32f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3300: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
3310: 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
3320: 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74        sqliteNext
3330: 43 68 61 72 28 7a 50 61 74 74 65 72 6e 29 3b 0a  Char(zPattern);.
3340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3350: 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e  ( c2==0 || (seen
3360: 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20   ^ invert)==0 ) 
3370: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
3380: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
3390: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 7a  String);.      z
33a0: 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 7d  Pattern++;.    }
33b0: 65 6c 73 65 20 69 66 28 20 65 73 63 20 26 26 20  else if( esc && 
33c0: 21 70 72 65 76 45 73 63 61 70 65 20 26 26 20 73  !prevEscape && s
33d0: 71 6c 69 74 65 33 52 65 61 64 55 74 66 38 28 7a  qlite3ReadUtf8(z
33e0: 50 61 74 74 65 72 6e 29 3d 3d 65 73 63 29 7b 0a  Pattern)==esc){.
33f0: 20 20 20 20 20 20 70 72 65 76 45 73 63 61 70 65        prevEscape
3400: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
3410: 74 65 4e 65 78 74 43 68 61 72 28 7a 50 61 74 74  teNextChar(zPatt
3420: 65 72 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ern);.    }else{
3430: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
3440: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
3450: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
3460: 6f 77 65 72 5b 63 5d 20 21 3d 20 73 71 6c 69 74  ower[c] != sqlit
3470: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
3480: 7a 53 74 72 69 6e 67 5d 20 29 20 72 65 74 75 72  zString] ) retur
3490: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
34a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  {.        if( c 
34b0: 21 3d 20 2a 7a 53 74 72 69 6e 67 20 29 20 72 65  != *zString ) re
34c0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
34d0: 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b        zPattern++
34e0: 3b 0a 20 20 20 20 20 20 7a 53 74 72 69 6e 67 2b  ;.      zString+
34f0: 2b 3b 0a 20 20 20 20 20 20 70 72 65 76 45 73 63  +;.      prevEsc
3500: 61 70 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ape = 0;.    }. 
3510: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74   }.  return *zSt
3520: 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ring==0;.}../*.*
3530: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
3540: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
3550: 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   the LIKE operat
3560: 6f 72 20 28 6f 72 20 47 4c 4f 42 20 77 68 69 63  or (or GLOB whic
3570: 68 20 69 73 0a 2a 2a 20 6a 75 73 74 20 61 20 76  h is.** just a v
3580: 61 72 69 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45  ariation of LIKE
3590: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 2e 20 20  ) gets called.  
35a0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
35b0: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79   testing.** only
35c0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
35d0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
35e0: 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d  te3_like_count =
35f0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
3600: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3610: 6e 20 6f 66 20 74 68 65 20 6c 69 6b 65 28 29 20  n of the like() 
3620: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  SQL function.  T
3630: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  his function imp
3640: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62  lements.** the b
3650: 75 69 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65  uild-in LIKE ope
3660: 72 61 74 6f 72 2e 20 20 54 68 65 20 66 69 72 73  rator.  The firs
3670: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
3680: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  e function is th
3690: 65 0a 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e 64  e.** pattern and
36a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
36b0: 6d 65 6e 74 20 69 73 20 74 68 65 20 73 74 72 69  ment is the stri
36c0: 6e 67 2e 20 20 53 6f 2c 20 74 68 65 20 53 51 4c  ng.  So, the SQL
36d0: 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a   statements:.**.
36e0: 2a 2a 20 20 20 20 20 20 20 41 20 4c 49 4b 45 20  **       A LIKE 
36f0: 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65  B.**.** is imple
3700: 6d 65 6e 74 65 64 20 61 73 20 6c 69 6b 65 28 42  mented as like(B
3710: 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ,A)..**.** This 
3720: 73 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20 28 77  same function (w
3730: 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
3740: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75  compareInfo stru
3750: 63 74 75 72 65 29 20 63 6f 6d 70 75 74 65 73 0a  cture) computes.
3760: 2a 2a 20 74 68 65 20 47 4c 4f 42 20 6f 70 65 72  ** the GLOB oper
3770: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
3780: 76 6f 69 64 20 6c 69 6b 65 46 75 6e 63 28 0a 20  void likeFunc(. 
3790: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
37a0: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
37b0: 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74  t argc, .  sqlit
37c0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
37d0: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
37e0: 6e 65 64 20 63 68 61 72 20 2a 7a 41 2c 20 2a 7a  ned char *zA, *z
37f0: 42 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74  B;..  /* Limit t
3800: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
3810: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61   LIKE or GLOB pa
3820: 74 74 65 72 6e 20 74 6f 20 61 76 6f 69 64 20 70  ttern to avoid p
3830: 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20  roblems.  ** of 
3840: 64 65 65 70 20 72 65 63 75 72 73 69 6f 6e 20 61  deep recursion a
3850: 6e 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20  nd N*N behavior 
3860: 69 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  in patternCompar
3870: 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e()..  */.  if( 
3880: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
3890: 74 65 73 28 61 72 67 76 5b 31 5d 29 3e 53 51 4c  tes(argv[1])>SQL
38a0: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
38b0: 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 7b 0a 20  TERN_LENGTH ){. 
38c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
38d0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
38e0: 20 22 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70   "LIKE or GLOB p
38f0: 61 74 74 65 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c  attern too compl
3900: 65 78 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ex", -1);.    re
3910: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 0a 20 20 7a 41  turn;.  }...  zA
3920: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3930: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
3940: 20 20 7a 42 20 3d 20 73 71 6c 69 74 65 33 5f 76    zB = sqlite3_v
3950: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
3960: 5d 29 3b 0a 20 20 69 6e 74 20 65 73 63 61 70 65  ]);.  int escape
3970: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63   = 0;.  if( argc
3980: 3d 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==3 ){.    /* Th
3990: 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74  e escape charact
39a0: 65 72 20 73 74 72 69 6e 67 20 6d 75 73 74 20 63  er string must c
39b0: 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69 6e 67  onsist of a sing
39c0: 6c 65 20 55 54 46 2d 38 20 63 68 61 72 61 63 74  le UTF-8 charact
39d0: 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  er..    ** Other
39e0: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
39f0: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
3a00: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
3a10: 20 63 68 61 72 20 2a 7a 45 73 63 20 3d 20 73 71   char *zEsc = sq
3a20: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
3a30: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69  (argv[2]);.    i
3a40: 66 28 20 7a 45 73 63 3d 3d 30 20 29 20 72 65 74  f( zEsc==0 ) ret
3a50: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  urn;.    if( sql
3a60: 69 74 65 33 75 74 66 38 43 68 61 72 4c 65 6e 28  ite3utf8CharLen(
3a70: 28 63 68 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29  (char*)zEsc, -1)
3a80: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
3a90: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
3aa0: 72 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20  r(context, .    
3ab0: 20 20 20 20 20 20 22 45 53 43 41 50 45 20 65 78        "ESCAPE ex
3ac0: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
3ad0: 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   a single charac
3ae0: 74 65 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ter", -1);.     
3af0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3b00: 20 20 20 65 73 63 61 70 65 20 3d 20 73 71 6c 69     escape = sqli
3b10: 74 65 33 52 65 61 64 55 74 66 38 28 7a 45 73 63  te3ReadUtf8(zEsc
3b20: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20  );.  }.  if( zA 
3b30: 26 26 20 7a 42 20 29 7b 0a 20 20 20 20 73 74 72  && zB ){.    str
3b40: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
3b50: 2a 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  *pInfo = sqlite3
3b60: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
3b70: 78 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  xt);.#ifdef SQLI
3b80: 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
3b90: 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b  te3_like_count++
3ba0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
3bb0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3bc0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 61  _int(context, pa
3bd0: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 41 2c  tternCompare(zA,
3be0: 20 7a 42 2c 20 70 49 6e 66 6f 2c 20 65 73 63 61   zB, pInfo, esca
3bf0: 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pe));.  }.}../*.
3c00: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3c10: 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46 28  n of the NULLIF(
3c20: 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  x,y) function.  
3c30: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
3c40: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
3c50: 65 6e 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ent if the argum
3c60: 65 6e 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ents are differe
3c70: 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  nt.  The result 
3c80: 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a 2a  is NULL if the.*
3c90: 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  * arguments are 
3ca0: 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20 6f 74  equal to each ot
3cb0: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  her..*/.static v
3cc0: 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28 0a  oid nullifFunc(.
3cd0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3ce0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
3cf0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
3d00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
3d10: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
3d20: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46  ll = sqlite3GetF
3d30: 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65  uncCollSeq(conte
3d40: 78 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  xt);.  if( sqlit
3d50: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72 67  e3MemCompare(arg
3d60: 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20 70  v[0], argv[1], p
3d70: 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Coll)!=0 ){.    
3d80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
3d90: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
3da0: 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  gv[0]);.  }.}../
3db0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
3dc0: 69 6f 6e 20 6f 66 20 74 68 65 20 56 45 52 53 49  ion of the VERSI
3dd0: 4f 4e 28 2a 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ON(*) function. 
3de0: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
3df0: 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66  he version.** of
3e00: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
3e10: 61 72 79 20 74 68 61 74 20 69 73 20 72 75 6e 6e  ary that is runn
3e20: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
3e30: 6f 69 64 20 76 65 72 73 69 6f 6e 46 75 6e 63 28  oid versionFunc(
3e40: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
3e50: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
3e60: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
3e70: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
3e80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ){.  sqlite3_res
3e90: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
3ea0: 2c 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  , sqlite3_versio
3eb0: 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  n, -1, SQLITE_ST
3ec0: 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 20 41 72 72  ATIC);.}../* Arr
3ed0: 61 79 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e  ay for convertin
3ee0: 67 20 66 72 6f 6d 20 68 61 6c 66 2d 62 79 74 65  g from half-byte
3ef0: 73 20 28 6e 79 62 62 6c 65 73 29 20 69 6e 74 6f  s (nybbles) into
3f00: 20 41 53 43 49 49 20 68 65 78 0a 2a 2a 20 64 69   ASCII hex.** di
3f10: 67 69 74 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20  gits. */.static 
3f20: 63 6f 6e 73 74 20 63 68 61 72 20 68 65 78 64 69  const char hexdi
3f30: 67 69 74 73 5b 5d 20 3d 20 7b 0a 20 20 27 30 27  gits[] = {.  '0'
3f40: 2c 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27 2c  , '1', '2', '3',
3f50: 20 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c 20   '4', '5', '6', 
3f60: 27 37 27 2c 0a 20 20 27 38 27 2c 20 27 39 27 2c  '7',.  '8', '9',
3f70: 20 27 41 27 2c 20 27 42 27 2c 20 27 43 27 2c 20   'A', 'B', 'C', 
3f80: 27 44 27 2c 20 27 45 27 2c 20 27 46 27 20 0a 7d  'D', 'E', 'F' .}
3f90: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 58 50 45 52 49 4d  ;../*.** EXPERIM
3fa0: 45 4e 54 41 4c 20 2d 20 54 68 69 73 20 69 73 20  ENTAL - This is 
3fb0: 6e 6f 74 20 61 6e 20 6f 66 66 69 63 69 61 6c 20  not an official 
3fc0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 69  function.  The i
3fd0: 6e 74 65 72 66 61 63 65 20 6d 61 79 0a 2a 2a 20  nterface may.** 
3fe0: 63 68 61 6e 67 65 2e 20 20 54 68 69 73 20 66 75  change.  This fu
3ff0: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 69 73 61 70  nction may disap
4000: 70 65 61 72 2e 20 20 44 6f 20 6e 6f 74 20 77 72  pear.  Do not wr
4010: 69 74 65 20 63 6f 64 65 20 74 68 61 74 20 64 65  ite code that de
4020: 70 65 6e 64 73 0a 2a 2a 20 6f 6e 20 74 68 69 73  pends.** on this
4030: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
4040: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
4050: 6f 66 20 74 68 65 20 51 55 4f 54 45 28 29 20 66  of the QUOTE() f
4060: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66  unction.  This f
4070: 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 20  unction takes a 
4080: 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  single.** argume
4090: 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75  nt.  If the argu
40a0: 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72 69 63 2c  ment is numeric,
40b0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
40c0: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
40d0: 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74  .** the argument
40e0: 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  .  If the argume
40f0: 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  nt is NULL, the 
4100: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
4110: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 4e  the string.** "N
4120: 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77 69 73 65  ULL".  Otherwise
4130: 2c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  , the argument i
4140: 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 73 69  s enclosed in si
4150: 6e 67 6c 65 20 71 75 6f 74 65 73 20 77 69 74 68  ngle quotes with
4160: 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  .** single-quote
4170: 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a 73 74 61   escapes..*/.sta
4180: 74 69 63 20 76 6f 69 64 20 71 75 6f 74 65 46 75  tic void quoteFu
4190: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
41a0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
41b0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
41c0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
41d0: 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74  if( argc<1 ) ret
41e0: 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 73  urn;.  switch( s
41f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
4200: 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20  e(argv[0]) ){.  
4210: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
4220: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
4230: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
4240: 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 22 2c  context, "NULL",
4250: 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   4, SQLITE_STATI
4260: 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  C);.      break;
4270: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4280: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a  SQLITE_INTEGER:.
4290: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
42a0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  FLOAT: {.      s
42b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
42c0: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  lue(context, arg
42d0: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  v[0]);.      bre
42e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
42f0: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
4300: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
4310: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ext = 0;.      i
4320: 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  nt nBlob = sqlit
4330: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
4340: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 63  rgv[0]);.      c
4350: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62  har const *zBlob
4360: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4370: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
4380: 0a 20 20 20 20 20 20 69 66 28 20 32 2a 6e 42 6c  .      if( 2*nBl
4390: 6f 62 2b 34 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  ob+4>SQLITE_MAX_
43a0: 4c 45 4e 47 54 48 20 29 7b 0a 20 20 20 20 20 20  LENGTH ){.      
43b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
43c0: 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f  _error_toobig(co
43d0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
43e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
43f0: 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 28 63        zText = (c
4400: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
4410: 6f 63 28 28 32 2a 6e 42 6c 6f 62 29 2b 34 29 3b  oc((2*nBlob)+4);
4420: 20 0a 20 20 20 20 20 20 69 66 28 20 21 7a 54 65   .      if( !zTe
4430: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  xt ){.        sq
4440: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
4450: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 6f 75 74  or(context, "out
4460: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 2d 31 29   of memory", -1)
4470: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4480: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
4490: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
44a0: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20  <nBlob; i++){.  
44b0: 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69          zText[(i
44c0: 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64 69 67 69  *2)+2] = hexdigi
44d0: 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29  ts[(zBlob[i]>>4)
44e0: 26 30 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20  &0x0F];.        
44f0: 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d    zText[(i*2)+3]
4500: 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42   = hexdigits[(zB
4510: 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20  lob[i])&0x0F];. 
4520: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4530: 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29   zText[(nBlob*2)
4540: 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  +2] = '\'';.    
4550: 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62      zText[(nBlob
4560: 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20  *2)+3] = '\0';. 
4570: 20 20 20 20 20 20 20 7a 54 65 78 74 5b 30 5d 20         zText[0] 
4580: 3d 20 27 58 27 3b 0a 20 20 20 20 20 20 20 20 7a  = 'X';.        z
4590: 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a  Text[1] = '\'';.
45a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
45b0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
45c0: 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  ext, zText, -1, 
45d0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
45e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
45f0: 65 46 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  eFree(zText);.  
4600: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
4610: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4620: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
4630: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a  .      int i,j;.
4640: 20 20 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20        u64 n;.   
4650: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
4660: 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73  d char *zArg = s
4670: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4680: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
4690: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20    char *z;..    
46a0: 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20    if( zArg==0 ) 
46b0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
46c0: 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67  r(i=0, n=0; zArg
46d0: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a  [i]; i++){ if( z
46e0: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  Arg[i]=='\'' ) n
46f0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
4700: 69 2b 6e 2b 33 3e 53 51 4c 49 54 45 5f 4d 41 58  i+n+3>SQLITE_MAX
4710: 5f 4c 45 4e 47 54 48 20 29 7b 0a 20 20 20 20 20  _LENGTH ){.     
4720: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4730: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
4740: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
4750: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
4760: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
4770: 65 4d 61 6c 6c 6f 63 28 20 69 2b 6e 2b 33 20 29  eMalloc( i+n+3 )
4780: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30  ;.      if( z==0
4790: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
47a0: 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b 0a 20 20   z[0] = '\'';.  
47b0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 31      for(i=0, j=1
47c0: 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b  ; zArg[i]; i++){
47d0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
47e0: 3d 20 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20  = zArg[i];.     
47f0: 20 20 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d     if( zArg[i]==
4800: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
4810: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b    z[j++] = '\'';
4820: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4830: 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20   }.      z[j++] 
4840: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7a 5b  = '\'';.      z[
4850: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  j] = 0;.      sq
4860: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4870: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 6a 2c  t(context, z, j,
4880: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4890: 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
48a0: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20  Free(z);.    }. 
48b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
48c0: 68 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  hex() function. 
48d0: 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 61   Interpret the a
48e0: 72 67 75 6d 65 6e 74 20 61 73 20 61 20 62 6c 6f  rgument as a blo
48f0: 62 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  b.  Return.** a 
4900: 68 65 78 61 64 65 63 69 6d 61 6c 20 72 65 6e 64  hexadecimal rend
4910: 65 72 69 6e 67 20 61 73 20 74 65 78 74 2e 0a 2a  ering as text..*
4920: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
4930: 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  xFunc(.  sqlite3
4940: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
4950: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
4960: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4970: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
4980: 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  , n;.  const uns
4990: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f  igned char *pBlo
49a0: 62 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 2c  b;.  char *zHex,
49b0: 20 2a 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 61   *z;.  assert( a
49c0: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20  rgc==1 );.  n = 
49d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
49e0: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
49f0: 69 66 28 20 6e 2a 32 2b 31 3e 53 51 4c 49 54 45  if( n*2+1>SQLITE
4a00: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 7b 0a 20  _MAX_LENGTH ){. 
4a10: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4a20: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
4a30: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74  ontext);.    ret
4a40: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 42 6c 6f 62  urn;.  }.  pBlob
4a50: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4a60: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
4a70: 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20 73 71 6c    z = zHex = sql
4a80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 2a 32 20  ite3_malloc(n*2 
4a90: 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a 48 65 78  + 1);.  if( zHex
4aa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4ab0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
4ac0: 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a 20 20 20  +, pBlob++){.   
4ad0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
4ae0: 20 3d 20 2a 70 42 6c 6f 62 3b 0a 20 20 20 20 2a   = *pBlob;.    *
4af0: 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67 69 74  (z++) = hexdigit
4b00: 73 5b 28 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20  s[(c>>4)&0xf];. 
4b10: 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64     *(z++) = hexd
4b20: 69 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a 20 20  igits[c&0xf];.  
4b30: 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 71  }.  *z = 0;.  sq
4b40: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4b50: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 48 65 78 2c  t(context, zHex,
4b60: 20 6e 2a 32 2c 20 73 71 6c 69 74 65 33 5f 66 72   n*2, sqlite3_fr
4b70: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ee);.}../*.** Th
4b80: 65 20 7a 65 72 6f 62 6c 6f 62 28 4e 29 20 66 75  e zeroblob(N) fu
4b90: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
4ba0: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 62 6c 6f   zero-filled blo
4bb0: 62 20 6f 66 20 73 69 7a 65 20 4e 20 62 79 74 65  b of size N byte
4bc0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
4bd0: 64 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 28 0a  d zeroblobFunc(.
4be0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
4bf0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
4c00: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
4c10: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
4c20: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
4c30: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a  ert( argc==1 );.
4c40: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
4c50: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29  lue_int(argv[0])
4c60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
4c70: 6c 74 5f 7a 65 72 6f 62 6c 6f 62 28 63 6f 6e 74  lt_zeroblob(cont
4c80: 65 78 74 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ext, n);.}../*.*
4c90: 2a 20 54 68 65 20 72 65 70 6c 61 63 65 28 29 20  * The replace() 
4ca0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 72 65 65  function.  Three
4cb0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
4cc0: 6c 6c 20 73 74 72 69 6e 67 73 3a 20 63 61 6c 6c  ll strings: call
4cd0: 0a 2a 2a 20 74 68 65 6d 20 41 2c 20 42 2c 20 61  .** them A, B, a
4ce0: 6e 64 20 43 2e 20 54 68 65 20 72 65 73 75 6c 74  nd C. The result
4cf0: 20 69 73 20 61 6c 73 6f 20 61 20 73 74 72 69 6e   is also a strin
4d00: 67 20 77 68 69 63 68 20 69 73 20 64 65 72 69 76  g which is deriv
4d10: 65 64 0a 2a 2a 20 66 72 6f 6d 20 41 20 62 79 20  ed.** from A by 
4d20: 72 65 70 6c 61 63 69 6e 67 20 65 76 65 72 79 20  replacing every 
4d30: 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 42 20 77  occurance of B w
4d40: 69 74 68 20 43 2e 20 20 54 68 65 20 6d 61 74 63  ith C.  The matc
4d50: 68 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 78 61  h.** must be exa
4d60: 63 74 2e 20 20 43 6f 6c 6c 61 74 69 6e 67 20 73  ct.  Collating s
4d70: 65 71 75 65 6e 63 65 73 20 61 72 65 20 6e 6f 74  equences are not
4d80: 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   used..*/.static
4d90: 20 76 6f 69 64 20 72 65 70 6c 61 63 65 46 75 6e   void replaceFun
4da0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
4db0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
4dc0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
4dd0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
4de0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  v.){.  const uns
4df0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72  igned char *zStr
4e00: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
4e10: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 41 20 2a  input string A *
4e20: 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  /.  const unsign
4e30: 65 64 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72  ed char *zPatter
4e40: 6e 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74  n;    /* The pat
4e50: 74 65 72 6e 20 73 74 72 69 6e 67 20 42 20 2a 2f  tern string B */
4e60: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
4e70: 64 20 63 68 61 72 20 2a 7a 52 65 70 3b 20 20 20  d char *zRep;   
4e80: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 70 6c       /* The repl
4e90: 61 63 65 6d 65 6e 74 20 73 74 72 69 6e 67 20 43  acement string C
4ea0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
4eb0: 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20  har *zOut;      
4ec0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
4ed0: 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  utput */.  int n
4ee0: 53 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Str;            
4ef0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
4f00: 53 74 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  Str */.  int nPa
4f10: 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20  ttern;          
4f20: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 50 61    /* Size of zPa
4f30: 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ttern */.  int n
4f40: 52 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rep;            
4f50: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
4f60: 52 65 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  Rep */.  int nOu
4f70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4f80: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a    /* Maximum siz
4f90: 65 20 6f 66 20 7a 4f 75 74 20 2a 2f 0a 20 20 69  e of zOut */.  i
4fa0: 6e 74 20 6c 6f 6f 70 4c 69 6d 69 74 3b 20 20 20  nt loopLimit;   
4fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
4fc0: 7a 53 74 72 5b 5d 20 74 68 61 74 20 6d 69 67 68  zStr[] that migh
4fd0: 74 20 6d 61 74 63 68 20 7a 50 61 74 74 65 72 6e  t match zPattern
4fe0: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
4ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5000: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
5010: 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
5020: 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 6e 53 74  argc==3 );.  nSt
5030: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
5040: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
5050: 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74  ;.  zStr = sqlit
5060: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5070: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53  gv[0]);.  if( zS
5080: 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  tr==0 ) return;.
5090: 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73 71 6c    nPattern = sql
50a0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
50b0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7a 50 61  (argv[1]);.  zPa
50c0: 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ttern = sqlite3_
50d0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
50e0: 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74  1]);.  if( zPatt
50f0: 65 72 6e 3d 3d 30 20 7c 7c 20 7a 50 61 74 74 65  ern==0 || zPatte
5100: 72 6e 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72  rn[0]==0 ) retur
5110: 6e 3b 0a 20 20 6e 52 65 70 20 3d 20 73 71 6c 69  n;.  nRep = sqli
5120: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5130: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7a 52 65 70  argv[2]);.  zRep
5140: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5150: 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a  _text(argv[2]);.
5160: 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20    if( zRep==0 ) 
5170: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 50  return;.  if( nP
5180: 61 74 74 65 72 6e 3e 3d 6e 52 65 70 20 29 7b 0a  attern>=nRep ){.
5190: 20 20 20 20 6e 4f 75 74 20 3d 20 6e 53 74 72 3b      nOut = nStr;
51a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36  .  }else{.    i6
51b0: 34 20 6e 4f 75 74 36 34 20 3d 20 28 69 36 34 29  4 nOut64 = (i64)
51c0: 28 6e 53 74 72 2f 6e 50 61 74 74 65 72 6e 20 2b  (nStr/nPattern +
51d0: 20 31 29 20 2a 20 28 69 36 34 29 6e 52 65 70 3b   1) * (i64)nRep;
51e0: 0a 20 20 20 20 6e 4f 75 74 20 3d 20 28 28 6e 4f  .    nOut = ((nO
51f0: 75 74 36 34 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  ut64>SQLITE_MAX_
5200: 4c 45 4e 47 54 48 29 20 3f 20 53 51 4c 49 54 45  LENGTH) ? SQLITE
5210: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 3a 20 6e 4f  _MAX_LENGTH : nO
5220: 75 74 36 34 29 3b 0a 20 20 7d 0a 20 20 7a 4f 75  ut64);.  }.  zOu
5230: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
5240: 6f 63 28 6e 4f 75 74 2b 31 29 3b 0a 20 20 69 66  oc(nOut+1);.  if
5250: 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75  ( zOut==0 ) retu
5260: 72 6e 3b 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20  rn;.  loopLimit 
5270: 3d 20 6e 53 74 72 20 2d 20 6e 50 61 74 74 65 72  = nStr - nPatter
5280: 6e 3b 20 20 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  n;  .  for(i=j=0
5290: 3b 20 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20  ; i<=loopLimit; 
52a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i++){.    if( zS
52b0: 74 72 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b  tr[i]!=zPattern[
52c0: 30 5d 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53  0] || memcmp(&zS
52d0: 74 72 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c  tr[i], zPattern,
52e0: 20 6e 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20   nPattern) ){.  
52f0: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
5300: 7a 53 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  zStr[i];.    }el
5310: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 28 6a  se{.      if( (j
5320: 2b 6e 52 65 70 2b 6c 6f 6f 70 4c 69 6d 69 74 2d  +nRep+loopLimit-
5330: 69 29 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  i)>SQLITE_MAX_LE
5340: 4e 47 54 48 20 29 7b 0a 20 20 20 20 20 20 20 20  NGTH ){.        
5350: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5360: 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74  rror_toobig(cont
5370: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ext);.        sq
5380: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
5390: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
53a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
53b0: 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c  memcpy(&zOut[j],
53c0: 20 7a 52 65 70 2c 20 6e 52 65 70 29 3b 0a 20 20   zRep, nRep);.  
53d0: 20 20 20 20 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20      j += nRep;. 
53e0: 20 20 20 20 20 69 20 2b 3d 20 6e 50 61 74 74 65       i += nPatte
53f0: 72 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn-1;.    }.  }.
5400: 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a    memcpy(&zOut[j
5410: 5d 2c 20 26 7a 53 74 72 5b 69 5d 2c 20 6e 53 74  ], &zStr[i], nSt
5420: 72 2d 69 29 3b 0a 20 20 6a 20 2b 3d 20 6e 53 74  r-i);.  j += nSt
5430: 72 20 2d 20 69 3b 0a 20 20 61 73 73 65 72 74 28  r - i;.  assert(
5440: 20 6a 3c 3d 6e 4f 75 74 20 29 3b 0a 20 20 7a 4f   j<=nOut );.  zO
5450: 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  ut[j] = 0;.  sql
5460: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5470: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
5480: 29 7a 4f 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65  )zOut, j, sqlite
5490: 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  3_free);.}../*.*
54a0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
54b0: 20 6f 66 20 74 68 65 20 54 52 49 4d 28 29 2c 20   of the TRIM(), 
54c0: 4c 54 52 49 4d 28 29 2c 20 61 6e 64 20 52 54 52  LTRIM(), and RTR
54d0: 49 4d 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  IM() functions..
54e0: 2a 2a 20 54 68 65 20 75 73 65 72 64 61 74 61 20  ** The userdata 
54f0: 69 73 20 30 78 31 20 66 6f 72 20 6c 65 66 74 20  is 0x1 for left 
5500: 74 72 69 6d 2c 20 30 78 32 20 66 6f 72 20 72 69  trim, 0x2 for ri
5510: 67 68 74 20 74 72 69 6d 2c 20 30 78 33 20 66 6f  ght trim, 0x3 fo
5520: 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
5530: 63 20 76 6f 69 64 20 74 72 69 6d 46 75 6e 63 28  c void trimFunc(
5540: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5550: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
5560: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
5570: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5580: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
5590: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20  ned char *zIn;  
55a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
55b0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  string */.  cons
55c0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
55d0: 2a 7a 43 68 61 72 53 65 74 3b 20 20 20 20 2f 2a  *zCharSet;    /*
55e0: 20 53 65 74 20 6f 66 20 63 68 61 72 61 63 74 65   Set of characte
55f0: 72 73 20 74 6f 20 74 72 69 6d 20 2a 2f 0a 20 20  rs to trim */.  
5600: 69 6e 74 20 6e 49 6e 3b 20 20 20 20 20 20 20 20  int nIn;        
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
5630: 79 74 65 73 20 69 6e 20 69 6e 70 75 74 20 2a 2f  ytes in input */
5640: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 20 2f 2a 20 31 3a 20 74 72 69 6d 6c       /* 1: triml
5670: 65 66 74 20 20 32 3a 20 74 72 69 6d 72 69 67 68  eft  2: trimrigh
5680: 74 20 20 33 3a 20 74 72 69 6d 20 2a 2f 0a 20 20  t  3: trim */.  
5690: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56b0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
56c0: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
56d0: 63 68 61 72 20 2a 61 4c 65 6e 3b 20 20 20 20 20  char *aLen;     
56e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
56f0: 74 68 20 6f 66 20 65 61 63 68 20 63 68 61 72 61  th of each chara
5700: 63 74 65 72 20 69 6e 20 7a 43 68 61 72 53 65 74  cter in zCharSet
5710: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
5720: 67 6e 65 64 20 63 68 61 72 20 2a 2a 61 7a 43 68  gned char **azCh
5730: 61 72 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 76  ar;     /* Indiv
5740: 69 64 75 61 6c 20 63 68 61 72 61 63 74 65 72 73  idual characters
5750: 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a   in zCharSet */.
5760: 20 20 69 6e 74 20 6e 43 68 61 72 3b 20 20 20 20    int nChar;    
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5790: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
57a0: 43 68 61 72 53 65 74 20 2a 2f 0a 0a 20 20 69 66  CharSet */..  if
57b0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
57c0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53  type(argv[0])==S
57d0: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
57e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
57f0: 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  nIn = sqlite3_va
5800: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
5810: 5d 29 3b 0a 20 20 7a 49 6e 20 3d 20 73 71 6c 69  ]);.  zIn = sqli
5820: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5830: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
5840: 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  In==0 ) return;.
5850: 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20 29 7b    if( argc==1 ){
5860: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
5870: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
5880: 6c 65 6e 4f 6e 65 5b 5d 20 3d 20 7b 20 31 20 7d  lenOne[] = { 1 }
5890: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
58a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
58b0: 20 2a 61 7a 4f 6e 65 5b 5d 20 3d 20 7b 20 28 75   *azOne[] = { (u
58c0: 38 2a 29 22 20 22 20 7d 3b 0a 20 20 20 20 6e 43  8*)" " };.    nC
58d0: 68 61 72 20 3d 20 31 3b 0a 20 20 20 20 61 4c 65  har = 1;.    aLe
58e0: 6e 20 3d 20 28 75 38 2a 29 6c 65 6e 4f 6e 65 3b  n = (u8*)lenOne;
58f0: 0a 20 20 20 20 61 7a 43 68 61 72 20 3d 20 61 7a  .    azChar = az
5900: 4f 6e 65 3b 0a 20 20 20 20 7a 43 68 61 72 53 65  One;.    zCharSe
5910: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
5920: 66 28 20 28 7a 43 68 61 72 53 65 74 20 3d 20 73  f( (zCharSet = s
5930: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5940: 74 28 61 72 67 76 5b 31 5d 29 29 3d 3d 30 20 29  t(argv[1]))==0 )
5950: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
5960: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
5970: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5980: 7a 3b 0a 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68  z;.    for(z=zCh
5990: 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20  arSet, nChar=0; 
59a0: 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20  *z; nChar++){.  
59b0: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
59c0: 61 72 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ar(z);.    }.   
59d0: 20 69 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a   if( nChar>0 ){.
59e0: 20 20 20 20 20 20 61 7a 43 68 61 72 20 3d 20 73        azChar = s
59f0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
5a00: 43 68 61 72 2a 28 73 69 7a 65 6f 66 28 63 68 61  Char*(sizeof(cha
5a10: 72 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 20 20  r*)+1) );.      
5a20: 69 66 28 20 61 7a 43 68 61 72 3d 3d 30 20 29 7b  if( azChar==0 ){
5a30: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
5a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
5a50: 4c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  Len = (unsigned 
5a60: 63 68 61 72 2a 29 26 61 7a 43 68 61 72 5b 6e 43  char*)&azChar[nC
5a70: 68 61 72 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28  har];.      for(
5a80: 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43 68 61  z=zCharSet, nCha
5a90: 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b  r=0; *z; nChar++
5aa0: 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 68 61  ){.        azCha
5ab0: 72 5b 6e 43 68 61 72 5d 20 3d 20 7a 3b 0a 20 20  r[nChar] = z;.  
5ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74        sqliteNext
5ad0: 43 68 61 72 28 7a 29 3b 0a 20 20 20 20 20 20 20  Char(z);.       
5ae0: 20 61 4c 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 7a   aLen[nChar] = z
5af0: 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d   - azChar[nChar]
5b00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5b10: 20 20 7d 0a 20 20 69 66 28 20 6e 43 68 61 72 3e    }.  if( nChar>
5b20: 30 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d  0 ){.    flags =
5b30: 20 28 69 6e 74 29 73 71 6c 69 74 65 33 5f 75 73   (int)sqlite3_us
5b40: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
5b50: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  ;.    if( flags 
5b60: 26 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68 69  & 1 ){.      whi
5b70: 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  le( nIn>0 ){.   
5b80: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
5b90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5ba0: 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nChar; i++){.  
5bb0: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c          len = aL
5bc0: 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  en[i];.         
5bd0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a 49 6e 2c   if( memcmp(zIn,
5be0: 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e 29   azChar[i], len)
5bf0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
5c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5c10: 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62 72  f( i>=nChar ) br
5c20: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49 6e  eak;.        zIn
5c30: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20   += len;.       
5c40: 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20   nIn -= len;.   
5c50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5c60: 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b 0a  f( flags & 2 ){.
5c70: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e        while( nIn
5c80: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
5c90: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 66  t len;.        f
5ca0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b  or(i=0; i<nChar;
5cb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5cc0: 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a   len = aLen[i];.
5cd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 65            if( le
5ce0: 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65 6d 63 6d 70  n<=nIn && memcmp
5cf0: 28 26 7a 49 6e 5b 6e 49 6e 2d 6c 65 6e 5d 2c 61  (&zIn[nIn-len],a
5d00: 7a 43 68 61 72 5b 69 5d 2c 6c 65 6e 29 3d 3d 30  zChar[i],len)==0
5d10: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5d20: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5d30: 69 3e 3d 6e 43 68 61 72 20 29 20 62 72 65 61 6b  i>=nChar ) break
5d40: 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 2d 3d  ;.        nIn -=
5d50: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20   len;.      }.  
5d60: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 43 68 61    }.    if( zCha
5d70: 72 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71  rSet ){.      sq
5d80: 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 68 61  lite3_free(azCha
5d90: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
5da0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5db0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
5dc0: 61 72 2a 29 7a 49 6e 2c 20 6e 49 6e 2c 20 53 51  ar*)zIn, nIn, SQ
5dd0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5de0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
5df0: 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  E_SOUNDEX./*.** 
5e00: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f 75 6e  Compute the soun
5e10: 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  dex encoding of 
5e20: 61 20 77 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  a word..*/.stati
5e30: 63 20 76 6f 69 64 20 73 6f 75 6e 64 65 78 46 75  c void soundexFu
5e40: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
5e50: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
5e60: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
5e70: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
5e80: 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 52 65  gv.){.  char zRe
5e90: 73 75 6c 74 5b 38 5d 3b 0a 20 20 63 6f 6e 73 74  sult[8];.  const
5ea0: 20 75 38 20 2a 7a 49 6e 3b 0a 20 20 69 6e 74 20   u8 *zIn;.  int 
5eb0: 69 2c 20 6a 3b 0a 20 20 73 74 61 74 69 63 20 63  i, j;.  static c
5ec0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5ed0: 61 72 20 69 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20  ar iCode[] = {. 
5ee0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
5ef0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
5f00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
5f10: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,.    0, 0, 0, 
5f20: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
5f30: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
5f40: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
5f50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
5f60: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
5f70: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
5f80: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
5f90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
5fa0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
5fb0: 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33     0, 0, 1, 2, 3
5fc0: 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c  , 0, 1, 2, 0, 0,
5fd0: 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20   2, 2, 4, 5, 5, 
5fe0: 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20  0,.    1, 2, 6, 
5ff0: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32  2, 3, 0, 1, 0, 2
6000: 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 2, 0, 0, 0,
6010: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
6020: 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   1, 2, 3, 0, 1, 
6030: 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34  2, 0, 0, 2, 2, 4
6040: 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31  , 5, 5, 0,.    1
6050: 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c  , 2, 6, 2, 3, 0,
6060: 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20   1, 0, 2, 0, 2, 
6070: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
6080: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72   };.  assert( ar
6090: 67 63 3d 3d 31 20 29 3b 0a 20 20 7a 49 6e 20 3d  gc==1 );.  zIn =
60a0: 20 28 75 38 2a 29 73 71 6c 69 74 65 33 5f 76 61   (u8*)sqlite3_va
60b0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
60c0: 29 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20  );.  if( zIn==0 
60d0: 29 20 7a 49 6e 20 3d 20 28 75 38 2a 29 22 22 3b  ) zIn = (u8*)"";
60e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b  .  for(i=0; zIn[
60f0: 69 5d 20 26 26 20 21 69 73 61 6c 70 68 61 28 7a  i] && !isalpha(z
6100: 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  In[i]); i++){}. 
6110: 20 69 66 28 20 7a 49 6e 5b 69 5d 20 29 7b 0a 20   if( zIn[i] ){. 
6120: 20 20 20 75 38 20 70 72 65 76 63 6f 64 65 20 3d     u8 prevcode =
6130: 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78   iCode[zIn[i]&0x
6140: 37 66 5d 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  7f];.    zResult
6150: 5b 30 5d 20 3d 20 74 6f 75 70 70 65 72 28 7a 49  [0] = toupper(zI
6160: 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f 72 28 6a  n[i]);.    for(j
6170: 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49 6e 5b 69  =1; j<4 && zIn[i
6180: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
6190: 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b  nt code = iCode[
61a0: 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20  zIn[i]&0x7f];.  
61b0: 20 20 20 20 69 66 28 20 63 6f 64 65 3e 30 20 29      if( code>0 )
61c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
61d0: 64 65 21 3d 70 72 65 76 63 6f 64 65 20 29 7b 0a  de!=prevcode ){.
61e0: 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 6f            prevco
61f0: 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20 20 20 20  de = code;.     
6200: 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b       zResult[j++
6210: 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30 27 3b 0a  ] = code + '0';.
6220: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
6240: 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20  revcode = 0;.   
6250: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
6260: 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a 20 20 20  hile( j<4 ){.   
6270: 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20     zResult[j++] 
6280: 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '0';.    }.   
6290: 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d 20 30 3b   zResult[j] = 0;
62a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
62b0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
62c0: 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c 20 53 51  , zResult, 4, SQ
62d0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
62e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
62f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
6300: 74 28 63 6f 6e 74 65 78 74 2c 20 22 3f 30 30 30  t(context, "?000
6310: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41  ", 4, SQLITE_STA
6320: 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  TIC);.  }.}.#end
6330: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
6340: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
6350: 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 20 66  ENSION./*.** A f
6360: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61  unction that loa
6370: 64 73 20 61 20 73 68 61 72 65 64 2d 6c 69 62 72  ds a shared-libr
6380: 61 72 79 20 65 78 74 65 6e 73 69 6f 6e 20 74 68  ary extension th
6390: 65 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  en returns NULL.
63a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
63b0: 6c 6f 61 64 45 78 74 28 73 71 6c 69 74 65 33 5f  loadExt(sqlite3_
63c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
63d0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
63e0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
63f0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6400: 2a 7a 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20  *zFile = (const 
6410: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
6420: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6430: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ]);.  const char
6440: 20 2a 7a 50 72 6f 63 3b 0a 20 20 73 71 6c 69 74   *zProc;.  sqlit
6450: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
6460: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
6470: 78 74 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  xt);.  char *zEr
6480: 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 69 66 28  rMsg = 0;..  if(
6490: 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20   argc==2 ){.    
64a0: 7a 50 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63  zProc = (const c
64b0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
64c0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
64d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
64e0: 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  zProc = 0;.  }. 
64f0: 20 69 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71   if( zFile && sq
6500: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
6510: 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20  sion(db, zFile, 
6520: 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29  zProc, &zErrMsg)
6530: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6540: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
6550: 74 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d  text, zErrMsg, -
6560: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
6570: 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
6580: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
6590: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
65a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
65b0: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 61 20  ion generates a 
65c0: 73 74 72 69 6e 67 20 6f 66 20 72 61 6e 64 6f 6d  string of random
65d0: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 55 73   characters.  Us
65e0: 65 64 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61  ed for.** genera
65f0: 74 69 6e 67 20 74 65 73 74 20 64 61 74 61 2e 0a  ting test data..
6600: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
6610: 61 6e 64 53 74 72 28 73 71 6c 69 74 65 33 5f 63  andStr(sqlite3_c
6620: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6630: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
6640: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
6650: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
6660: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
6670: 53 72 63 5b 5d 20 3d 20 0a 20 20 20 20 20 22 61  Src[] = .     "a
6680: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
6690: 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 20  rstuvwxyz".     
66a0: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
66b0: 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
66c0: 20 20 22 30 31 32 33 34 35 36 37 38 39 22 0a 20    "0123456789". 
66d0: 20 20 20 20 22 2e 2d 21 2c 3a 2a 5e 2b 3d 5f 7c      ".-!,:*^+=_|
66e0: 3f 2f 3c 3e 20 22 3b 0a 20 20 69 6e 74 20 69 4d  ?/<> ";.  int iM
66f0: 69 6e 2c 20 69 4d 61 78 2c 20 6e 2c 20 72 2c 20  in, iMax, n, r, 
6700: 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  i;.  unsigned ch
6710: 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20  ar zBuf[1000];. 
6720: 20 69 66 28 20 61 72 67 63 3e 3d 31 20 29 7b 0a   if( argc>=1 ){.
6730: 20 20 20 20 69 4d 69 6e 20 3d 20 73 71 6c 69 74      iMin = sqlit
6740: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
6750: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 69  v[0]);.    if( i
6760: 4d 69 6e 3c 30 20 29 20 69 4d 69 6e 20 3d 20 30  Min<0 ) iMin = 0
6770: 3b 0a 20 20 20 20 69 66 28 20 69 4d 69 6e 3e 3d  ;.    if( iMin>=
6780: 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 20 69  sizeof(zBuf) ) i
6790: 4d 69 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 42 75  Min = sizeof(zBu
67a0: 66 29 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  f)-1;.  }else{. 
67b0: 20 20 20 69 4d 69 6e 20 3d 20 31 3b 0a 20 20 7d     iMin = 1;.  }
67c0: 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29  .  if( argc>=2 )
67d0: 7b 0a 20 20 20 20 69 4d 61 78 20 3d 20 73 71 6c  {.    iMax = sql
67e0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
67f0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[1]);.    if(
6800: 20 69 4d 61 78 3c 69 4d 69 6e 20 29 20 69 4d 61   iMax<iMin ) iMa
6810: 78 20 3d 20 69 4d 69 6e 3b 0a 20 20 20 20 69 66  x = iMin;.    if
6820: 28 20 69 4d 61 78 3e 3d 73 69 7a 65 6f 66 28 7a  ( iMax>=sizeof(z
6830: 42 75 66 29 20 29 20 69 4d 61 78 20 3d 20 73 69  Buf) ) iMax = si
6840: 7a 65 6f 66 28 7a 42 75 66 29 2d 31 3b 0a 20 20  zeof(zBuf)-1;.  
6850: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4d 61 78 20  }else{.    iMax 
6860: 3d 20 35 30 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  = 50;.  }.  n = 
6870: 69 4d 69 6e 3b 0a 20 20 69 66 28 20 69 4d 61 78  iMin;.  if( iMax
6880: 3e 69 4d 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c  >iMin ){.    sql
6890: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73  ite3Randomness(s
68a0: 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20  izeof(r), &r);. 
68b0: 20 20 20 72 20 26 3d 20 30 78 37 66 66 66 66 66     r &= 0x7fffff
68c0: 66 66 3b 0a 20 20 20 20 6e 20 2b 3d 20 72 25 28  ff;.    n += r%(
68d0: 69 4d 61 78 20 2b 20 31 20 2d 20 69 4d 69 6e 29  iMax + 1 - iMin)
68e0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
68f0: 6e 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29  n<sizeof(zBuf) )
6900: 3b 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f  ;.  sqlite3Rando
6910: 6d 6e 65 73 73 28 6e 2c 20 7a 42 75 66 29 3b 0a  mness(n, zBuf);.
6920: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
6930: 69 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 69  i++){.    zBuf[i
6940: 5d 20 3d 20 7a 53 72 63 5b 7a 42 75 66 5b 69 5d  ] = zSrc[zBuf[i]
6950: 25 28 73 69 7a 65 6f 66 28 7a 53 72 63 29 2d 31  %(sizeof(zSrc)-1
6960: 29 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6e  )];.  }.  zBuf[n
6970: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
6980: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
6990: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 42 75  text, (char*)zBu
69a0: 66 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41  f, n, SQLITE_TRA
69b0: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69  NSIENT);.}.#endi
69c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
69d0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
69e0: 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
69f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
6a00: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  SQL functions ar
6a10: 65 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 72  e used to test r
6a20: 65 74 75 72 6e 69 6e 67 20 61 20 74 65 78 74 0a  eturning a text.
6a30: 2a 2a 20 72 65 73 75 6c 74 20 77 69 74 68 20 61  ** result with a
6a40: 20 64 65 73 74 72 75 63 74 6f 72 2e 20 46 75 6e   destructor. Fun
6a50: 63 74 69 6f 6e 20 27 74 65 73 74 5f 64 65 73 74  ction 'test_dest
6a60: 72 75 63 74 6f 72 27 20 74 61 6b 65 73 20 6f 6e  ructor' takes on
6a70: 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 61 6e  e argument.** an
6a80: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61  d returns the sa
6a90: 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 65  me argument inte
6aa0: 72 70 72 65 74 65 64 20 61 73 20 54 45 58 54 2e  rpreted as TEXT.
6ab0: 20 41 20 64 65 73 74 72 75 63 74 6f 72 20 69 73   A destructor is
6ac0: 0a 2a 2a 20 70 61 73 73 65 64 20 77 69 74 68 20  .** passed with 
6ad0: 74 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75  the sqlite3_resu
6ae0: 6c 74 5f 74 65 78 74 28 29 20 63 61 6c 6c 2e 0a  lt_text() call..
6af0: 2a 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  **.** SQL functi
6b00: 6f 6e 20 27 74 65 73 74 5f 64 65 73 74 72 75 63  on 'test_destruc
6b10: 74 6f 72 5f 63 6f 75 6e 74 27 20 72 65 74 75 72  tor_count' retur
6b20: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
6b30: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 2a 2a   outstanding .**
6b40: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64   allocations mad
6b50: 65 20 62 79 20 27 74 65 73 74 5f 64 65 73 74 72  e by 'test_destr
6b60: 75 63 74 6f 72 27 3b 0a 2a 2a 0a 2a 2a 20 57 41  uctor';.**.** WA
6b70: 52 4e 49 4e 47 3a 20 4e 6f 74 20 74 68 72 65 61  RNING: Not threa
6b80: 64 73 61 66 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  dsafe..*/.static
6b90: 20 69 6e 74 20 74 65 73 74 5f 64 65 73 74 72 75   int test_destru
6ba0: 63 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72 20 3d  ctor_count_var =
6bb0: 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20   0;.static void 
6bc0: 64 65 73 74 72 75 63 74 6f 72 28 76 6f 69 64 20  destructor(void 
6bd0: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 56 61  *p){.  char *zVa
6be0: 6c 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20  l = (char *)p;. 
6bf0: 20 61 73 73 65 72 74 28 7a 56 61 6c 29 3b 0a 20   assert(zVal);. 
6c00: 20 7a 56 61 6c 2d 2d 3b 0a 20 20 73 71 6c 69 74   zVal--;.  sqlit
6c10: 65 46 72 65 65 28 7a 56 61 6c 29 3b 0a 20 20 74  eFree(zVal);.  t
6c20: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  est_destructor_c
6c30: 6f 75 6e 74 5f 76 61 72 2d 2d 3b 0a 7d 0a 73 74  ount_var--;.}.st
6c40: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 64  atic void test_d
6c50: 65 73 74 72 75 63 74 6f 72 28 0a 20 20 73 71 6c  estructor(.  sql
6c60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
6c70: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
6c80: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
6c90: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61   **argv.){.  cha
6ca0: 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 6c  r *zVal;.  int l
6cb0: 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en;.  sqlite3 *d
6cc0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  b = sqlite3_user
6cd0: 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 0a 20  _data(pCtx);. . 
6ce0: 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72   test_destructor
6cf0: 5f 63 6f 75 6e 74 5f 76 61 72 2b 2b 3b 0a 20 20  _count_var++;.  
6d00: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
6d10: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
6d20: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
6d30: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
6d40: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6c 65  L ) return;.  le
6d50: 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  n = sqlite3Value
6d60: 42 79 74 65 73 28 61 72 67 76 5b 30 5d 2c 20 45  Bytes(argv[0], E
6d70: 4e 43 28 64 62 29 29 3b 20 0a 20 20 7a 56 61 6c  NC(db)); .  zVal
6d80: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
6d90: 6c 65 6e 2b 33 29 3b 0a 20 20 7a 56 61 6c 5b 6c  len+3);.  zVal[l
6da0: 65 6e 5d 20 3d 20 30 3b 0a 20 20 7a 56 61 6c 5b  en] = 0;.  zVal[
6db0: 6c 65 6e 2d 31 5d 20 3d 20 30 3b 0a 20 20 61 73  len-1] = 0;.  as
6dc0: 73 65 72 74 28 20 7a 56 61 6c 20 29 3b 0a 20 20  sert( zVal );.  
6dd0: 7a 56 61 6c 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  zVal++;.  memcpy
6de0: 28 7a 56 61 6c 2c 20 73 71 6c 69 74 65 33 56 61  (zVal, sqlite3Va
6df0: 6c 75 65 54 65 78 74 28 61 72 67 76 5b 30 5d 2c  lueText(argv[0],
6e00: 20 45 4e 43 28 64 62 29 29 2c 20 6c 65 6e 29 3b   ENC(db)), len);
6e10: 0a 20 20 69 66 28 20 45 4e 43 28 64 62 29 3d 3d  .  if( ENC(db)==
6e20: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
6e30: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6e40: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 56 61  t_text(pCtx, zVa
6e50: 6c 2c 20 2d 31 2c 20 64 65 73 74 72 75 63 74 6f  l, -1, destructo
6e60: 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r);.#ifndef SQLI
6e70: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
6e80: 7d 65 6c 73 65 20 69 66 28 20 45 4e 43 28 64 62  }else if( ENC(db
6e90: 29 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  )==SQLITE_UTF16L
6ea0: 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E ){.    sqlite3
6eb0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65  _result_text16le
6ec0: 28 70 43 74 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c  (pCtx, zVal, -1,
6ed0: 20 64 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20   destructor);.  
6ee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
6ef0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
6f00: 62 65 28 70 43 74 78 2c 20 7a 56 61 6c 2c 20 2d  be(pCtx, zVal, -
6f10: 31 2c 20 64 65 73 74 72 75 63 74 6f 72 29 3b 0a  1, destructor);.
6f20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6f30: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
6f40: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
6f50: 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72   test_destructor
6f60: 5f 63 6f 75 6e 74 28 0a 20 20 73 71 6c 69 74 65  _count(.  sqlite
6f70: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
6f80: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
6f90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6fa0: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
6fb0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 74  3_result_int(pCt
6fc0: 78 2c 20 74 65 73 74 5f 64 65 73 74 72 75 63 74  x, test_destruct
6fd0: 6f 72 5f 63 6f 75 6e 74 5f 76 61 72 29 3b 0a 7d  or_count_var);.}
6fe0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6ff0: 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66 64 65  E_TEST */..#ifde
7000: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
7010: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72  .** Routines for
7020: 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71 6c   testing the sql
7030: 69 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74 61  ite3_get_auxdata
7040: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73  () and sqlite3_s
7050: 65 74 5f 61 75 78 64 61 74 61 28 29 0a 2a 2a 20  et_auxdata().** 
7060: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
7070: 20 54 68 65 20 74 65 73 74 5f 61 75 78 64 61 74   The test_auxdat
7080: 61 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  a() SQL function
7090: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 67   attempts to reg
70a0: 69 73 74 65 72 20 65 61 63 68 20 6f 66 20 69 74  ister each of it
70b0: 73 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 61  s arguments.** a
70c0: 73 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  s auxiliary data
70d0: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
70e0: 6e 6f 20 70 72 69 6f 72 20 72 65 67 69 73 74 72  no prior registr
70f0: 61 74 69 6f 6e 73 20 6f 66 20 61 75 78 20 64 61  ations of aux da
7100: 74 61 20 66 6f 72 0a 2a 2a 20 74 68 61 74 20 61  ta for.** that a
7110: 72 67 75 6d 65 6e 74 20 28 6d 65 61 6e 69 6e 67  rgument (meaning
7120: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
7130: 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 20   not a constant 
7140: 6f 72 20 74 68 69 73 20 69 73 20 69 74 73 20 66  or this is its f
7150: 69 72 73 74 0a 2a 2a 20 63 61 6c 6c 29 20 74 68  irst.** call) th
7160: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  en the result fo
7170: 72 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20  r that argument 
7180: 69 73 20 30 2e 20 20 49 66 20 74 68 65 72 65 20  is 0.  If there 
7190: 69 73 20 61 20 70 72 69 6f 72 0a 2a 2a 20 72 65  is a prior.** re
71a0: 67 69 73 74 72 61 74 69 6f 6e 2c 20 74 68 65 20  gistration, the 
71b0: 72 65 73 75 6c 74 20 66 6f 72 20 74 68 61 74 20  result for that 
71c0: 61 72 67 75 6d 65 6e 74 20 69 73 20 31 2e 20 20  argument is 1.  
71d0: 54 68 65 20 6f 76 65 72 61 6c 6c 20 72 65 73 75  The overall resu
71e0: 6c 74 0a 2a 2a 20 69 73 20 74 68 65 20 69 6e 64  lt.** is the ind
71f0: 69 76 69 64 75 61 6c 20 61 72 67 75 6d 65 6e 74  ividual argument
7200: 20 72 65 73 75 6c 74 73 20 73 65 70 61 72 61 74   results separat
7210: 65 64 20 62 79 20 73 70 61 63 65 73 2e 0a 2a 2f  ed by spaces..*/
7220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
7230: 65 5f 74 65 73 74 5f 61 75 78 64 61 74 61 28 76  e_test_auxdata(v
7240: 6f 69 64 20 2a 70 29 20 7b 73 71 6c 69 74 65 46  oid *p) {sqliteF
7250: 72 65 65 28 70 29 3b 7d 0a 73 74 61 74 69 63 20  ree(p);}.static 
7260: 76 6f 69 64 20 74 65 73 74 5f 61 75 78 64 61 74  void test_auxdat
7270: 61 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  a(.  sqlite3_con
7280: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
7290: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
72a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
72b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
72c0: 61 72 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69 74  ar *zRet = sqlit
72d0: 65 4d 61 6c 6c 6f 63 28 6e 41 72 67 2a 32 29 3b  eMalloc(nArg*2);
72e0: 0a 20 20 69 66 28 20 21 7a 52 65 74 20 29 20 72  .  if( !zRet ) r
72f0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
7300: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
7310: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
7320: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
7330: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7340: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[i]);.    if( 
7350: 7a 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  z ){.      char 
7360: 2a 7a 41 75 78 20 3d 20 73 71 6c 69 74 65 33 5f  *zAux = sqlite3_
7370: 67 65 74 5f 61 75 78 64 61 74 61 28 70 43 74 78  get_auxdata(pCtx
7380: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
7390: 7a 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20  zAux ){.        
73a0: 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27 31 27 3b  zRet[i*2] = '1';
73b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
73c0: 63 6d 70 28 7a 41 75 78 2c 20 7a 29 20 29 7b 0a  cmp(zAux, z) ){.
73d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
73e0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
73f0: 43 74 78 2c 20 22 41 75 78 69 6c 61 72 79 20 64  Ctx, "Auxilary d
7400: 61 74 61 20 63 6f 72 72 75 70 74 69 6f 6e 22 2c  ata corruption",
7410: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -1);.          
7420: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
7430: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
7440: 20 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 5d         zRet[i*2]
7450: 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   = '0';.        
7460: 7a 41 75 78 20 3d 20 73 71 6c 69 74 65 53 74 72  zAux = sqliteStr
7470: 44 75 70 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  Dup(z);.        
7480: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64  sqlite3_set_auxd
7490: 61 74 61 28 70 43 74 78 2c 20 69 2c 20 7a 41 75  ata(pCtx, i, zAu
74a0: 78 2c 20 66 72 65 65 5f 74 65 73 74 5f 61 75 78  x, free_test_aux
74b0: 64 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  data);.      }. 
74c0: 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d       zRet[i*2+1]
74d0: 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20   = ' ';.    }.  
74e0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
74f0: 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 52  lt_text(pCtx, zR
7500: 65 74 2c 20 32 2a 6e 41 72 67 2d 31 2c 20 66 72  et, 2*nArg-1, fr
7510: 65 65 5f 74 65 73 74 5f 61 75 78 64 61 74 61 29  ee_test_auxdata)
7520: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7530: 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69  LITE_TEST */..#i
7540: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
7550: 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63 74 69 6f  ./*.** A functio
7560: 6e 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72 20  n to test error 
7570: 72 65 70 6f 72 74 69 6e 67 20 66 72 6f 6d 20 75  reporting from u
7580: 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 20 54  ser functions. T
7590: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
75a0: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
75b0: 66 20 69 74 27 73 20 66 69 72 73 74 20 61 72 67  f it's first arg
75c0: 75 6d 65 6e 74 20 61 73 20 61 6e 20 65 72 72 6f  ument as an erro
75d0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
75e0: 64 20 74 65 73 74 5f 65 72 72 6f 72 28 0a 20 20  d test_error(.  
75f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7600: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
7610: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
7620: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7630: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7640: 72 72 6f 72 28 70 43 74 78 2c 20 28 63 68 61 72  rror(pCtx, (char
7650: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
7660: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 30  text(argv[0]), 0
7670: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
7680: 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f  QLITE_TEST */../
7690: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
76a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
76b0: 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  g structure hold
76c0: 73 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  s the context of
76d0: 20 61 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61   a.** sum() or a
76e0: 76 67 28 29 20 61 67 67 72 65 67 61 74 65 20 63  vg() aggregate c
76f0: 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74  omputation..*/.t
7700: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75  ypedef struct Su
7710: 6d 43 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72  mCtx SumCtx;.str
7720: 75 63 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64  uct SumCtx {.  d
7730: 6f 75 62 6c 65 20 72 53 75 6d 3b 20 20 20 20 20  ouble rSum;     
7740: 20 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69   /* Floating poi
7750: 6e 74 20 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20  nt sum */.  i64 
7760: 69 53 75 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  iSum;         /*
7770: 20 49 6e 74 65 67 65 72 20 73 75 6d 20 2a 2f 20   Integer sum */ 
7780: 20 20 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20    .  i64 cnt;   
7790: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
77a0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d   of elements sum
77b0: 6d 65 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72  med */.  u8 over
77c0: 66 6c 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72  flow;      /* Tr
77d0: 75 65 20 69 66 20 69 6e 74 65 67 65 72 20 6f 76  ue if integer ov
77e0: 65 72 66 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20  erflow seen */. 
77f0: 20 75 38 20 61 70 70 72 6f 78 3b 20 20 20 20 20   u8 approx;     
7800: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f     /* True if no
7810: 6e 2d 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  n-integer value 
7820: 77 61 73 20 69 6e 70 75 74 20 74 6f 20 74 68 65  was input to the
7830: 20 73 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   sum */.};../*.*
7840: 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20  * Routines used 
7850: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73  to compute the s
7860: 75 6d 2c 20 61 76 65 72 61 67 65 2c 20 61 6e 64  um, average, and
7870: 20 74 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68   total..**.** Th
7880: 65 20 53 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e  e SUM() function
7890: 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 28 62 72   follows the (br
78a0: 6f 6b 65 6e 29 20 53 51 4c 20 73 74 61 6e 64 61  oken) SQL standa
78b0: 72 64 20 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a  rd which means.*
78c0: 2a 20 74 68 61 74 20 69 74 20 72 65 74 75 72 6e  * that it return
78d0: 73 20 4e 55 4c 4c 20 69 66 20 69 74 20 73 75 6d  s NULL if it sum
78e0: 73 20 6f 76 65 72 20 6e 6f 20 69 6e 70 75 74 73  s over no inputs
78f0: 2e 20 20 54 4f 54 41 4c 20 72 65 74 75 72 6e 73  .  TOTAL returns
7900: 0a 2a 2a 20 30 2e 30 20 69 6e 20 74 68 61 74 20  .** 0.0 in that 
7910: 63 61 73 65 2e 20 20 49 6e 20 61 64 64 69 74 69  case.  In additi
7920: 6f 6e 2c 20 54 4f 54 41 4c 20 61 6c 77 61 79 73  on, TOTAL always
7930: 20 72 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74   returns a float
7940: 20 77 68 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69   where.** SUM mi
7950: 67 68 74 20 72 65 74 75 72 6e 20 61 6e 20 69 6e  ght return an in
7960: 74 65 67 65 72 20 69 66 20 69 74 20 6e 65 76 65  teger if it neve
7970: 72 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66  r encounters a f
7980: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
7990: 20 76 61 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e   value.  TOTAL n
79a0: 65 76 65 72 20 66 61 69 6c 73 2c 20 62 75 74 20  ever fails, but 
79b0: 53 55 4d 20 6d 69 67 68 74 20 74 68 72 6f 75 67  SUM might throug
79c0: 68 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  h an exception i
79d0: 66 0a 2a 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77  f.** it overflow
79e0: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  s an integer..*/
79f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d  .static void sum
7a00: 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Step(sqlite3_con
7a10: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
7a20: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
7a30: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
7a40: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69    SumCtx *p;.  i
7a50: 6e 74 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72  nt type;.  asser
7a60: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
7a70: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
7a80: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
7a90: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
7aa0: 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 73 71 6c  ));.  type = sql
7ab0: 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72  ite3_value_numer
7ac0: 69 63 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ic_type(argv[0])
7ad0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 74 79 70  ;.  if( p && typ
7ae0: 65 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e!=SQLITE_NULL )
7af0: 7b 0a 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a  {.    p->cnt++;.
7b00: 20 20 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51      if( type==SQ
7b10: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
7b20: 20 20 20 20 20 20 69 36 34 20 76 20 3d 20 73 71        i64 v = sq
7b30: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
7b40: 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  4(argv[0]);.    
7b50: 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 76 3b 0a    p->rSum += v;.
7b60: 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 61 70        if( (p->ap
7b70: 70 72 6f 78 7c 70 2d 3e 6f 76 65 72 66 6c 6f 77  prox|p->overflow
7b80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7b90: 69 36 34 20 69 4e 65 77 53 75 6d 20 3d 20 70 2d  i64 iNewSum = p-
7ba0: 3e 69 53 75 6d 20 2b 20 76 3b 0a 20 20 20 20 20  >iSum + v;.     
7bb0: 20 20 20 69 6e 74 20 73 31 20 3d 20 70 2d 3e 69     int s1 = p->i
7bc0: 53 75 6d 20 3e 3e 20 28 73 69 7a 65 6f 66 28 69  Sum >> (sizeof(i
7bd0: 36 34 29 2a 38 2d 31 29 3b 0a 20 20 20 20 20 20  64)*8-1);.      
7be0: 20 20 69 6e 74 20 73 32 20 3d 20 76 20 20 20 20    int s2 = v    
7bf0: 20 20 20 3e 3e 20 28 73 69 7a 65 6f 66 28 69 36     >> (sizeof(i6
7c00: 34 29 2a 38 2d 31 29 3b 0a 20 20 20 20 20 20 20  4)*8-1);.       
7c10: 20 69 6e 74 20 73 33 20 3d 20 69 4e 65 77 53 75   int s3 = iNewSu
7c20: 6d 20 3e 3e 20 28 73 69 7a 65 6f 66 28 69 36 34  m >> (sizeof(i64
7c30: 29 2a 38 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  )*8-1);.        
7c40: 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 3d 20 28 73  p->overflow = (s
7c50: 31 26 73 32 26 7e 73 33 29 20 7c 20 28 7e 73 31  1&s2&~s3) | (~s1
7c60: 26 7e 73 32 26 73 33 29 3b 0a 20 20 20 20 20 20  &~s2&s3);.      
7c70: 20 20 70 2d 3e 69 53 75 6d 20 3d 20 69 4e 65 77    p->iSum = iNew
7c80: 53 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Sum;.      }.   
7c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
7ca0: 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33  >rSum += sqlite3
7cb0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
7cc0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d  gv[0]);.      p-
7cd0: 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20  >approx = 1;.   
7ce0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
7cf0: 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65  void sumFinalize
7d00: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7d10: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
7d20: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
7d30: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
7d40: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
7d50: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
7d60: 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20   p->cnt>0 ){.   
7d70: 20 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77   if( p->overflow
7d80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7d90: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
7da0: 6f 6e 74 65 78 74 2c 22 69 6e 74 65 67 65 72 20  ontext,"integer 
7db0: 6f 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20  overflow",-1);. 
7dc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
7dd0: 61 70 70 72 6f 78 20 29 7b 0a 20 20 20 20 20 20  approx ){.      
7de0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
7df0: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70  ouble(context, p
7e00: 2d 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c  ->rSum);.    }el
7e10: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7e20: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
7e30: 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29  ontext, p->iSum)
7e40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
7e50: 61 74 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e  atic void avgFin
7e60: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
7e70: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
7e80: 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20  .  SumCtx *p;.  
7e90: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
7ea0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
7eb0: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28  ntext, 0);.  if(
7ec0: 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29   p && p->cnt>0 )
7ed0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
7ee0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
7ef0: 65 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f  ext, p->rSum/(do
7f00: 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20  uble)p->cnt);.  
7f10: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
7f20: 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71  totalFinalize(sq
7f30: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7f40: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74  ontext){.  SumCt
7f50: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7f60: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7f70: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
7f80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
7f90: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
7fa0: 78 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20  xt, p ? p->rSum 
7fb0: 3a 20 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  : 0.0);.}../*.**
7fc0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
7fd0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
7fe0: 72 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69 6e  rack of state in
7ff0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
8000: 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67 67  e.** count() agg
8010: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
8020: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
8030: 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e  ct CountCtx Coun
8040: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75  tCtx;.struct Cou
8050: 6e 74 43 74 78 20 7b 0a 20 20 69 36 34 20 6e 3b  ntCtx {.  i64 n;
8060: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
8070: 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  nes to implement
8080: 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67 67   the count() agg
8090: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
80a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
80b0: 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65  countStep(sqlite
80c0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
80d0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
80e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
80f0: 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  gv){.  CountCtx 
8100: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
8110: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
8120: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
8130: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
8140: 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49  (argc==0 || SQLI
8150: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
8160: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8170: 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20 20  [0])) && p ){.  
8180: 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20    p->n++;.  }.} 
8190: 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63    .static void c
81a0: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c  ountFinalize(sql
81b0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
81c0: 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43  ntext){.  CountC
81d0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
81e0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
81f0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
8200: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  0);.  sqlite3_re
8210: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
8220: 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30  xt, p ? p->n : 0
8230: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  );.}../*.** Rout
8240: 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ines to implemen
8250: 74 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28  t min() and max(
8260: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
8270: 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tions..*/.static
8280: 20 76 6f 69 64 20 6d 69 6e 6d 61 78 53 74 65 70   void minmaxStep
8290: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
82a0: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
82b0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
82c0: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 65  ue **argv){.  Me
82d0: 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d 65 6d 20  m *pArg  = (Mem 
82e0: 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20 4d 65 6d  *)argv[0];.  Mem
82f0: 20 2a 70 42 65 73 74 3b 0a 0a 20 20 69 66 28 20   *pBest;..  if( 
8300: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8310: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
8320: 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72  ITE_NULL ) retur
8330: 6e 3b 0a 20 20 70 42 65 73 74 20 3d 20 28 4d 65  n;.  pBest = (Me
8340: 6d 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  m *)sqlite3_aggr
8350: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
8360: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
8370: 42 65 73 74 29 29 3b 0a 20 20 69 66 28 20 21 70  Best));.  if( !p
8380: 42 65 73 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  Best ) return;..
8390: 20 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61    if( pBest->fla
83a0: 67 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61  gs ){.    int ma
83b0: 78 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a  x;.    int cmp;.
83c0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
83d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46  ll = sqlite3GetF
83e0: 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65  uncCollSeq(conte
83f0: 78 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73  xt);.    /* This
8400: 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69   step function i
8410: 73 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  s used for both 
8420: 74 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61  the min() and ma
8430: 78 28 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a  x() aggregates,.
8440: 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20      ** the only 
8450: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
8460: 65 6e 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67  en the two being
8470: 20 74 68 61 74 20 74 68 65 20 73 65 6e 73 65 20   that the sense 
8480: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  of the.    ** co
8490: 6d 70 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65  mparison is inve
84a0: 72 74 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61  rted. For the ma
84b0: 78 28 29 20 61 67 67 72 65 67 61 74 65 2c 20 74  x() aggregate, t
84c0: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
84d0: 33 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66 75  3_user_data() fu
84e0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28  nction returns (
84f0: 76 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d  void *)-1. For m
8500: 69 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72  in() it.    ** r
8510: 65 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64  eturns (void *)d
8520: 62 2c 20 77 68 65 72 65 20 64 62 20 69 73 20 74  b, where db is t
8530: 68 65 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61  he sqlite3* data
8540: 62 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  base pointer..  
8550: 20 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74    ** Therefore t
8560: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
8570: 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
8580: 27 6d 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74  'max' to 1 for t
8590: 68 65 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20  he max().    ** 
85a0: 61 67 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20  aggregate, or 0 
85b0: 66 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a  for min()..    *
85c0: 2f 0a 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69  /.    max = sqli
85d0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
85e0: 6e 74 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63  ntext)!=0;.    c
85f0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  mp = sqlite3MemC
8600: 6f 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70 41  ompare(pBest, pA
8610: 72 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  rg, pColl);.    
8620: 69 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c  if( (max && cmp<
8630: 30 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63  0) || (!max && c
8640: 6d 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73  mp>0) ){.      s
8650: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
8660: 79 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a  y(pBest, pArg);.
8670: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
8690: 6d 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72  mCopy(pBest, pAr
86a0: 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  g);.  }.}.static
86b0: 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e 61   void minMaxFina
86c0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
86d0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
86e0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
86f0: 2a 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d 20  *pRes;.  pRes = 
8700: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  (sqlite3_value *
8710: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
8720: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
8730: 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 52  xt, 0);.  if( pR
8740: 65 73 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52  es ){.    if( pR
8750: 65 73 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  es->flags ){.   
8760: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8770: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
8780: 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20   pRes);.    }.  
8790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
87a0: 52 65 6c 65 61 73 65 28 70 52 65 73 29 3b 0a 20  Release(pRes);. 
87b0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
87c0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73  s function regis
87d0: 74 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  tered all of the
87e0: 20 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f   above C functio
87f0: 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e  ns as SQL.** fun
8800: 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68  ctions.  This sh
8810: 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79  ould be the only
8820: 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73   routine in this
8830: 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78   file with.** ex
8840: 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a  ternal linkage..
8850: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
8860: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
8870: 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20  nctions(sqlite3 
8880: 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
8890: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
88a0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
88b0: 20 20 20 20 20 73 69 67 6e 65 64 20 63 68 61 72       signed char
88c0: 20 6e 41 72 67 3b 0a 20 20 20 20 20 75 38 20 61   nArg;.     u8 a
88d0: 72 67 54 79 70 65 3b 20 20 20 20 20 20 20 20 20  rgType;         
88e0: 20 20 2f 2a 20 66 66 3a 20 64 62 20 20 20 31 3a    /* ff: db   1:
88f0: 20 30 2c 20 32 3a 20 31 2c 20 33 3a 20 32 2c 2e   0, 2: 1, 3: 2,.
8900: 2e 2e 20 20 4e 3a 20 20 4e 2d 31 2e 20 2a 2f 0a  ..  N:  N-1. */.
8910: 20 20 20 20 20 75 38 20 65 54 65 78 74 52 65 70       u8 eTextRep
8920: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a  ;          /* 1:
8930: 20 55 54 46 2d 31 36 2e 20 20 30 3a 20 55 54 46   UTF-16.  0: UTF
8940: 2d 38 20 2a 2f 0a 20 20 20 20 20 75 38 20 6e 65  -8 */.     u8 ne
8950: 65 64 43 6f 6c 6c 53 65 71 3b 0a 20 20 20 20 20  edCollSeq;.     
8960: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
8970: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
8980: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8990: 20 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63 73   **);.  } aFuncs
89a0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6d 69  [] = {.    { "mi
89b0: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
89c0: 20 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f    -1, 0, SQLITE_
89d0: 55 54 46 38 2c 20 20 20 20 31 2c 20 6d 69 6e 6d  UTF8,    1, minm
89e0: 61 78 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  axFunc },.    { 
89f0: 22 6d 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20  "min",          
8a00: 20 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c 49        0, 0, SQLI
8a10: 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 30  TE_UTF8,    1, 0
8a20: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8a30: 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 20 20 20   { "max",       
8a40: 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 53          -1, 1, S
8a50: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31  QLITE_UTF8,    1
8a60: 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 7d 2c 0a  , minmaxFunc },.
8a70: 20 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20      { "max",    
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 31              0, 1
8a90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
8aa0: 20 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20    1, 0          
8ab0: 7d 2c 0a 20 20 20 20 7b 20 22 74 79 70 65 6f 66  },.    { "typeof
8ac0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ",             1
8ad0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
8ae0: 2c 20 20 20 20 30 2c 20 74 79 70 65 6f 66 46 75  ,    0, typeofFu
8af0: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 6e  nc },.    { "len
8b00: 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  gth",           
8b10: 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    1, 0, SQLITE_U
8b20: 54 46 38 2c 20 20 20 20 30 2c 20 6c 65 6e 67 74  TF8,    0, lengt
8b30: 68 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  hFunc },.    { "
8b40: 73 75 62 73 74 72 22 2c 20 20 20 20 20 20 20 20  substr",        
8b50: 20 20 20 20 20 33 2c 20 30 2c 20 53 51 4c 49 54       3, 0, SQLIT
8b60: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73 75  E_UTF8,    0, su
8b70: 62 73 74 72 46 75 6e 63 20 7d 2c 0a 23 69 66 6e  bstrFunc },.#ifn
8b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8b90: 55 54 46 31 36 0a 20 20 20 20 7b 20 22 73 75 62  UTF16.    { "sub
8ba0: 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  str",           
8bb0: 20 20 33 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    3, 0, SQLITE_U
8bc0: 54 46 31 36 4c 45 2c 20 30 2c 20 73 71 6c 69 74  TF16LE, 0, sqlit
8bd0: 65 33 75 74 66 31 36 53 75 62 73 74 72 20 7d 2c  e3utf16Substr },
8be0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 22 61  .#endif.    { "a
8bf0: 62 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  bs",            
8c00: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
8c10: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 61 62 73  _UTF8,    0, abs
8c20: 46 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b  Func    },.    {
8c30: 20 22 72 6f 75 6e 64 22 2c 20 20 20 20 20 20 20   "round",       
8c40: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c         1, 0, SQL
8c50: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
8c60: 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c 0a 20 20  roundFunc  },.  
8c70: 20 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 20 20    { "round",    
8c80: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
8c90: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
8ca0: 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c  0, roundFunc  },
8cb0: 0a 20 20 20 20 7b 20 22 75 70 70 65 72 22 2c 20  .    { "upper", 
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
8cd0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
8ce0: 20 20 20 30 2c 20 75 70 70 65 72 46 75 6e 63 20     0, upperFunc 
8cf0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 77 65 72   },.    { "lower
8d00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
8d10: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
8d20: 38 2c 20 20 20 20 30 2c 20 6c 6f 77 65 72 46 75  8,    0, lowerFu
8d30: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f  nc  },.    { "co
8d40: 61 6c 65 73 63 65 22 2c 20 20 20 20 20 20 20 20  alesce",        
8d50: 20 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f    -1, 0, SQLITE_
8d60: 55 54 46 38 2c 20 20 20 20 30 2c 20 69 66 6e 75  UTF8,    0, ifnu
8d70: 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  llFunc },.    { 
8d80: 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20 20 20  "coalesce",     
8d90: 20 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c 49        0, 0, SQLI
8da0: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 30  TE_UTF8,    0, 0
8db0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8dc0: 20 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20   { "coalesce",  
8dd0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
8de0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
8df0: 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  , 0          },.
8e00: 20 20 20 20 7b 20 22 68 65 78 22 2c 20 20 20 20      { "hex",    
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
8e20: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
8e30: 20 20 30 2c 20 68 65 78 46 75 6e 63 20 20 20 20    0, hexFunc    
8e40: 7d 2c 0a 20 20 20 20 7b 20 22 69 66 6e 75 6c 6c  },.    { "ifnull
8e50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ",             2
8e60: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
8e70: 2c 20 20 20 20 31 2c 20 69 66 6e 75 6c 6c 46 75  ,    1, ifnullFu
8e80: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6e  nc },.    { "ran
8e90: 64 6f 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20  dom",           
8ea0: 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55   -1, 0, SQLITE_U
8eb0: 54 46 38 2c 20 20 20 20 30 2c 20 72 61 6e 64 6f  TF8,    0, rando
8ec0: 6d 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  mFunc },.    { "
8ed0: 72 61 6e 64 6f 6d 62 6c 6f 62 22 2c 20 20 20 20  randomblob",    
8ee0: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
8ef0: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 72 61  E_UTF8,    0, ra
8f00: 6e 64 6f 6d 42 6c 6f 62 20 7d 2c 0a 20 20 20 20  ndomBlob },.    
8f10: 7b 20 22 6e 75 6c 6c 69 66 22 2c 20 20 20 20 20  { "nullif",     
8f20: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51          2, 0, SQ
8f30: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c  LITE_UTF8,    1,
8f40: 20 6e 75 6c 6c 69 66 46 75 6e 63 20 7d 2c 0a 20   nullifFunc },. 
8f50: 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 76 65 72     { "sqlite_ver
8f60: 73 69 6f 6e 22 2c 20 20 20 20 20 30 2c 20 30 2c  sion",     0, 0,
8f70: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
8f80: 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 7d   0, versionFunc}
8f90: 2c 0a 20 20 20 20 7b 20 22 71 75 6f 74 65 22 2c  ,.    { "quote",
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
8fb0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
8fc0: 20 20 20 20 30 2c 20 71 75 6f 74 65 46 75 6e 63      0, quoteFunc
8fd0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 73 74    },.    { "last
8fe0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20  _insert_rowid", 
8ff0: 20 30 2c 20 30 78 66 66 2c 20 53 51 4c 49 54 45   0, 0xff, SQLITE
9000: 5f 55 54 46 38 2c 20 30 2c 20 6c 61 73 74 5f 69  _UTF8, 0, last_i
9010: 6e 73 65 72 74 5f 72 6f 77 69 64 20 7d 2c 0a 20  nsert_rowid },. 
9020: 20 20 20 7b 20 22 63 68 61 6e 67 65 73 22 2c 20     { "changes", 
9030: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 78             0, 0x
9040: 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  ff, SQLITE_UTF8,
9050: 20 30 2c 20 63 68 61 6e 67 65 73 20 20 20 20 20   0, changes     
9060: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9070: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20  total_changes", 
9080: 20 20 20 20 20 30 2c 20 30 78 66 66 2c 20 53 51       0, 0xff, SQ
9090: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 6f  LITE_UTF8, 0, to
90a0: 74 61 6c 5f 63 68 61 6e 67 65 73 20 20 20 20 20  tal_changes     
90b0: 7d 2c 0a 20 20 20 20 7b 20 22 72 65 70 6c 61 63  },.    { "replac
90c0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 33  e",            3
90d0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
90e0: 2c 20 20 20 20 30 2c 20 72 65 70 6c 61 63 65 46  ,    0, replaceF
90f0: 75 6e 63 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  unc       },.   
9100: 20 7b 20 22 6c 74 72 69 6d 22 2c 20 20 20 20 20   { "ltrim",     
9110: 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 53           1, 1, S
9120: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
9130: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
9140: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 74      },.    { "lt
9150: 72 69 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20  rim",           
9160: 20 20 20 32 2c 20 31 2c 20 53 51 4c 49 54 45 5f     2, 1, SQLITE_
9170: 55 54 46 38 2c 20 20 20 20 30 2c 20 74 72 69 6d  UTF8,    0, trim
9180: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c  Func          },
9190: 0a 20 20 20 20 7b 20 22 72 74 72 69 6d 22 2c 20  .    { "rtrim", 
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
91b0: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
91c0: 20 20 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20     0, trimFunc  
91d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
91e0: 20 22 72 74 72 69 6d 22 2c 20 20 20 20 20 20 20   "rtrim",       
91f0: 20 20 20 20 20 20 20 32 2c 20 32 2c 20 53 51 4c         2, 2, SQL
9200: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
9210: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
9220: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 69 6d    },.    { "trim
9230: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
9240: 20 31 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54   1, 3, SQLITE_UT
9250: 46 38 2c 20 20 20 20 30 2c 20 74 72 69 6d 46 75  F8,    0, trimFu
9260: 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  nc          },. 
9270: 20 20 20 7b 20 22 74 72 69 6d 22 2c 20 20 20 20     { "trim",    
9280: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 33 2c             2, 3,
9290: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
92a0: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
92b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
92c0: 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20  zeroblob",      
92d0: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
92e0: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 7a 65  E_UTF8,    0, ze
92f0: 72 6f 62 6c 6f 62 46 75 6e 63 20 20 20 20 20 20  roblobFunc      
9300: 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
9310: 5f 53 4f 55 4e 44 45 58 0a 20 20 20 20 7b 20 22  _SOUNDEX.    { "
9320: 73 6f 75 6e 64 65 78 22 2c 20 20 20 20 20 20 20  soundex",       
9330: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
9340: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73 6f  E_UTF8,    0, so
9350: 75 6e 64 65 78 46 75 6e 63 7d 2c 0a 23 65 6e 64  undexFunc},.#end
9360: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
9370: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
9380: 4e 53 49 4f 4e 0a 20 20 20 20 7b 20 22 6c 6f 61  NSION.    { "loa
9390: 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20  d_extension",   
93a0: 20 20 31 2c 20 30 78 66 66 2c 20 53 51 4c 49 54    1, 0xff, SQLIT
93b0: 45 5f 55 54 46 38 2c 20 30 2c 20 6c 6f 61 64 45  E_UTF8, 0, loadE
93c0: 78 74 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 61  xt },.    { "loa
93d0: 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20  d_extension",   
93e0: 20 20 32 2c 20 30 78 66 66 2c 20 53 51 4c 49 54    2, 0xff, SQLIT
93f0: 45 5f 55 54 46 38 2c 20 30 2c 20 6c 6f 61 64 45  E_UTF8, 0, loadE
9400: 78 74 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66  xt },.#endif.#if
9410: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
9420: 20 20 20 20 7b 20 22 72 61 6e 64 73 74 72 22 2c      { "randstr",
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
9440: 2c 20 30 2c 20 20 20 20 53 51 4c 49 54 45 5f 55  , 0,    SQLITE_U
9450: 54 46 38 2c 20 30 2c 20 72 61 6e 64 53 74 72 20  TF8, 0, randStr 
9460: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73     },.    { "tes
9470: 74 5f 64 65 73 74 72 75 63 74 6f 72 22 2c 20 20  t_destructor",  
9480: 20 20 20 20 20 31 2c 20 30 78 66 66 2c 20 53 51       1, 0xff, SQ
9490: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 65  LITE_UTF8, 0, te
94a0: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 7d 2c 0a  st_destructor},.
94b0: 20 20 20 20 7b 20 22 74 65 73 74 5f 64 65 73 74      { "test_dest
94c0: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 22 2c 20 30  ructor_count", 0
94d0: 2c 20 30 2c 20 20 20 20 53 51 4c 49 54 45 5f 55  , 0,    SQLITE_U
94e0: 54 46 38 2c 20 30 2c 20 74 65 73 74 5f 64 65 73  TF8, 0, test_des
94f0: 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 7d 2c 0a  tructor_count},.
9500: 20 20 20 20 7b 20 22 74 65 73 74 5f 61 75 78 64      { "test_auxd
9510: 61 74 61 22 2c 20 20 20 20 20 20 20 20 20 2d 31  ata",         -1
9520: 2c 20 30 2c 20 20 20 20 53 51 4c 49 54 45 5f 55  , 0,    SQLITE_U
9530: 54 46 38 2c 20 30 2c 20 74 65 73 74 5f 61 75 78  TF8, 0, test_aux
9540: 64 61 74 61 7d 2c 0a 20 20 20 20 7b 20 22 74 65  data},.    { "te
9550: 73 74 5f 65 72 72 6f 72 22 2c 20 20 20 20 20 20  st_error",      
9560: 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 53        1, 0,    S
9570: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74  QLITE_UTF8, 0, t
9580: 65 73 74 5f 65 72 72 6f 72 7d 2c 0a 23 65 6e 64  est_error},.#end
9590: 69 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  if.  };.  static
95a0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
95b0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
95c0: 0a 20 20 20 20 73 69 67 6e 65 64 20 63 68 61 72  .    signed char
95d0: 20 6e 41 72 67 3b 0a 20 20 20 20 75 38 20 61 72   nArg;.    u8 ar
95e0: 67 54 79 70 65 3b 0a 20 20 20 20 75 38 20 6e 65  gType;.    u8 ne
95f0: 65 64 43 6f 6c 6c 53 65 71 3b 0a 20 20 20 20 76  edCollSeq;.    v
9600: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
9610: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
9620: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
9630: 2a 29 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78  *);.    void (*x
9640: 46 69 6e 61 6c 69 7a 65 29 28 73 71 6c 69 74 65  Finalize)(sqlite
9650: 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 7d  3_context*);.  }
9660: 20 61 41 67 67 73 5b 5d 20 3d 20 7b 0a 20 20 20   aAggs[] = {.   
9670: 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 31 2c 20   { "min",    1, 
9680: 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70  0, 1, minmaxStep
9690: 2c 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69  ,   minMaxFinali
96a0: 7a 65 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78  ze },.    { "max
96b0: 22 2c 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 6d  ",    1, 1, 1, m
96c0: 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 6d 69 6e  inmaxStep,   min
96d0: 4d 61 78 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a 20  MaxFinalize },. 
96e0: 20 20 20 7b 20 22 73 75 6d 22 2c 20 20 20 20 31     { "sum",    1
96f0: 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c  , 0, 0, sumStep,
9700: 20 20 20 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a        sumFinaliz
9710: 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74  e    },.    { "t
9720: 6f 74 61 6c 22 2c 20 20 31 2c 20 30 2c 20 30 2c  otal",  1, 0, 0,
9730: 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 74   sumStep,      t
9740: 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 20 20 20 20  otalFinalize    
9750: 7d 2c 0a 20 20 20 20 7b 20 22 61 76 67 22 2c 20  },.    { "avg", 
9760: 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53     1, 0, 0, sumS
9770: 74 65 70 2c 20 20 20 20 20 20 61 76 67 46 69 6e  tep,      avgFin
9780: 61 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20  alize    },.    
9790: 7b 20 22 63 6f 75 6e 74 22 2c 20 20 30 2c 20 30  { "count",  0, 0
97a0: 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20  , 0, countStep, 
97b0: 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65     countFinalize
97c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e    },.    { "coun
97d0: 74 22 2c 20 20 31 2c 20 30 2c 20 30 2c 20 63 6f  t",  1, 0, 0, co
97e0: 75 6e 74 53 74 65 70 2c 20 20 20 20 63 6f 75 6e  untStep,    coun
97f0: 74 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20  tFinalize  },.  
9800: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  };.  int i;..  f
9810: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
9820: 28 61 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66 28  (aFuncs)/sizeof(
9830: 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b 29  aFuncs[0]); i++)
9840: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67  {.    void *pArg
9850: 3b 0a 20 20 20 20 75 38 20 61 72 67 54 79 70 65  ;.    u8 argType
9860: 20 3d 20 61 46 75 6e 63 73 5b 69 5d 2e 61 72 67   = aFuncs[i].arg
9870: 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 61 72  Type;.    if( ar
9880: 67 54 79 70 65 3d 3d 30 78 66 66 20 29 7b 0a 20  gType==0xff ){. 
9890: 20 20 20 20 20 70 41 72 67 20 3d 20 64 62 3b 0a       pArg = db;.
98a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
98b0: 20 70 41 72 67 20 3d 20 28 76 6f 69 64 2a 29 28   pArg = (void*)(
98c0: 69 6e 74 29 61 72 67 54 79 70 65 3b 0a 20 20 20  int)argType;.   
98d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72   }.    sqlite3Cr
98e0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 61 46 75  eateFunc(db, aFu
98f0: 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46  ncs[i].zName, aF
9900: 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20  uncs[i].nArg,.  
9910: 20 20 20 20 20 20 61 46 75 6e 63 73 5b 69 5d 2e        aFuncs[i].
9920: 65 54 65 78 74 52 65 70 2c 20 70 41 72 67 2c 20  eTextRep, pArg, 
9930: 61 46 75 6e 63 73 5b 69 5d 2e 78 46 75 6e 63 2c  aFuncs[i].xFunc,
9940: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
9950: 61 46 75 6e 63 73 5b 69 5d 2e 6e 65 65 64 43 6f  aFuncs[i].needCo
9960: 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 46  llSeq ){.      F
9970: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
9980: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
9990: 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73 5b 69  ion(db, aFuncs[i
99a0: 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
99b0: 20 20 20 20 73 74 72 6c 65 6e 28 61 46 75 6e 63      strlen(aFunc
99c0: 73 5b 69 5d 2e 7a 4e 61 6d 65 29 2c 20 61 46 75  s[i].zName), aFu
99d0: 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 20 61 46 75  ncs[i].nArg, aFu
99e0: 6e 63 73 5b 69 5d 2e 65 54 65 78 74 52 65 70 2c  ncs[i].eTextRep,
99f0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
9a00: 46 75 6e 63 20 26 26 20 61 46 75 6e 63 73 5b 69  Func && aFuncs[i
9a10: 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ].needCollSeq ){
9a20: 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
9a30: 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d 20 31 3b  needCollSeq = 1;
9a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9a50: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
9a60: 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
9a70: 45 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72  E.  sqlite3Alter
9a80: 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23  Functions(db);.#
9a90: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
9aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 52 53 45 52  LITE_OMIT_PARSER
9ab0: 0a 20 20 73 71 6c 69 74 65 33 41 74 74 61 63 68  .  sqlite3Attach
9ac0: 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23  Functions(db);.#
9ad0: 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b  endif.  for(i=0;
9ae0: 20 69 3c 73 69 7a 65 6f 66 28 61 41 67 67 73 29   i<sizeof(aAggs)
9af0: 2f 73 69 7a 65 6f 66 28 61 41 67 67 73 5b 30 5d  /sizeof(aAggs[0]
9b00: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69  ); i++){.    voi
9b10: 64 20 2a 70 41 72 67 20 3d 20 28 76 6f 69 64 2a  d *pArg = (void*
9b20: 29 28 69 6e 74 29 61 41 67 67 73 5b 69 5d 2e 61  )(int)aAggs[i].a
9b30: 72 67 54 79 70 65 3b 0a 20 20 20 20 73 71 6c 69  rgType;.    sqli
9b40: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
9b50: 2c 20 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65  , aAggs[i].zName
9b60: 2c 20 61 41 67 67 73 5b 69 5d 2e 6e 41 72 67 2c  , aAggs[i].nArg,
9b70: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
9b80: 20 20 20 20 20 20 20 70 41 72 67 2c 20 30 2c 20         pArg, 0, 
9b90: 61 41 67 67 73 5b 69 5d 2e 78 53 74 65 70 2c 20  aAggs[i].xStep, 
9ba0: 61 41 67 67 73 5b 69 5d 2e 78 46 69 6e 61 6c 69  aAggs[i].xFinali
9bb0: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67  ze);.    if( aAg
9bc0: 67 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65  gs[i].needCollSe
9bd0: 71 20 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  q ){.      FuncD
9be0: 65 66 20 2a 70 46 75 6e 63 20 3d 20 73 71 6c 69  ef *pFunc = sqli
9bf0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
9c00: 20 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a 4e   db, aAggs[i].zN
9c10: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ame,.          s
9c20: 74 72 6c 65 6e 28 61 41 67 67 73 5b 69 5d 2e 7a  trlen(aAggs[i].z
9c30: 4e 61 6d 65 29 2c 20 61 41 67 67 73 5b 69 5d 2e  Name), aAggs[i].
9c40: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
9c50: 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  8, 0);.      if(
9c60: 20 70 46 75 6e 63 20 26 26 20 61 41 67 67 73 5b   pFunc && aAggs[
9c70: 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  i].needCollSeq )
9c80: 7b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d  {.        pFunc-
9c90: 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d 20 31  >needCollSeq = 1
9ca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9cb0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 67    }.  sqlite3Reg
9cc0: 69 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e  isterDateTimeFun
9cd0: 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 73 71  ctions(db);.  sq
9ce0: 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
9cf0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 4d 41 54  unction(db, "MAT
9d00: 43 48 22 2c 20 32 29 3b 0a 23 69 66 64 65 66 20  CH", 2);.#ifdef 
9d10: 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 28 76 6f  SQLITE_SSE.  (vo
9d20: 69 64 29 73 71 6c 69 74 65 33 53 73 65 46 75 6e  id)sqlite3SseFun
9d30: 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64  ctions(db);.#end
9d40: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
9d50: 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f  _CASE_SENSITIVE_
9d60: 4c 49 4b 45 0a 20 20 73 71 6c 69 74 65 33 52 65  LIKE.  sqlite3Re
9d70: 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69  gisterLikeFuncti
9d80: 6f 6e 73 28 64 62 2c 20 31 29 3b 0a 23 65 6c 73  ons(db, 1);.#els
9d90: 65 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  e.  sqlite3Regis
9da0: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
9db0: 28 64 62 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  (db, 0);.#endif.
9dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
9dd0: 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67 20 6f 6e   LIKEOPT flag on
9de0: 20 74 68 65 20 32 2d 61 72 67 75 6d 65 6e 74 20   the 2-argument 
9df0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
9e00: 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f  e given name..*/
9e10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
9e20: 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73 71 6c 69  LikeOptFlag(sqli
9e30: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
9e40: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
9e50: 66 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75 6e 63  flagVal){.  Func
9e60: 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 70 44 65  Def *pDef;.  pDe
9e70: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
9e80: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  unction(db, zNam
9e90: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
9ea0: 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
9eb0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 44 65 66  , 0);.  if( pDef
9ec0: 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 6c   ){.    pDef->fl
9ed0: 61 67 73 20 3d 20 66 6c 61 67 56 61 6c 3b 0a 20  ags = flagVal;. 
9ee0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69   }.}../*.** Regi
9ef0: 73 74 65 72 20 74 68 65 20 62 75 69 6c 74 2d 69  ster the built-i
9f00: 6e 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20  n LIKE and GLOB 
9f10: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65 20  functions.  The 
9f20: 63 61 73 65 53 65 6e 73 69 74 69 76 65 0a 2a 2a  caseSensitive.**
9f30: 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
9f40: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
9f50: 20 6e 6f 74 20 74 68 65 20 4c 49 4b 45 20 6f 70   not the LIKE op
9f60: 65 72 61 74 6f 72 20 69 73 20 63 61 73 65 0a 2a  erator is case.*
9f70: 2a 20 73 65 6e 73 69 74 69 76 65 2e 20 20 47 4c  * sensitive.  GL
9f80: 4f 42 20 69 73 20 61 6c 77 61 79 73 20 63 61 73  OB is always cas
9f90: 65 20 73 65 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a  e sensitive..*/.
9fa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67 69  void sqlite3Regi
9fb0: 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  sterLikeFunction
9fc0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
9fd0: 6e 74 20 63 61 73 65 53 65 6e 73 69 74 69 76 65  nt caseSensitive
9fe0: 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6d 70  ){.  struct comp
9ff0: 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  areInfo *pInfo;.
a000: 20 20 69 66 28 20 63 61 73 65 53 65 6e 73 69 74    if( caseSensit
a010: 69 76 65 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  ive ){.    pInfo
a020: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61   = (struct compa
a030: 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66  reInfo*)&likeInf
a040: 6f 41 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oAlt;.  }else{. 
a050: 20 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72 75     pInfo = (stru
a060: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29  ct compareInfo*)
a070: 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20  &likeInfoNorm;. 
a080: 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61   }.  sqlite3Crea
a090: 74 65 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65  teFunc(db, "like
a0a0: 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
a0b0: 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75  8, pInfo, likeFu
a0c0: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c  nc, 0, 0);.  sql
a0d0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
a0e0: 62 2c 20 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51  b, "like", 3, SQ
a0f0: 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f  LITE_UTF8, pInfo
a100: 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30  , likeFunc, 0, 0
a110: 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61  );.  sqlite3Crea
a120: 74 65 46 75 6e 63 28 64 62 2c 20 22 67 6c 6f 62  teFunc(db, "glob
a130: 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
a140: 38 2c 20 0a 20 20 20 20 20 20 28 73 74 72 75 63  8, .      (struc
a150: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26  t compareInfo*)&
a160: 67 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75  globInfo, likeFu
a170: 6e 63 2c 20 30 2c 30 29 3b 0a 20 20 73 65 74 4c  nc, 0,0);.  setL
a180: 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22  ikeOptFlag(db, "
a190: 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f 46 55  glob", SQLITE_FU
a1a0: 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45  NC_LIKE | SQLITE
a1b0: 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73  _FUNC_CASE);.  s
a1c0: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62  etLikeOptFlag(db
a1d0: 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20  , "like", .     
a1e0: 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 3f   caseSensitive ?
a1f0: 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49   (SQLITE_FUNC_LI
a200: 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43  KE | SQLITE_FUNC
a210: 5f 43 41 53 45 29 20 3a 20 53 51 4c 49 54 45 5f  _CASE) : SQLITE_
a220: 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f  FUNC_LIKE);.}../
a230: 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e 74  *.** pExpr point
a240: 73 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  s to an expressi
a250: 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c 65 6d 65  on which impleme
a260: 6e 74 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20  nts a function. 
a270: 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 61 70 70   If.** it is app
a280: 72 6f 70 72 69 61 74 65 20 74 6f 20 61 70 70 6c  ropriate to appl
a290: 79 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  y the LIKE optim
a2a0: 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61 74 20  ization to that 
a2b0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e  function.** then
a2c0: 20 73 65 74 20 61 57 63 5b 30 5d 20 74 68 72 6f   set aWc[0] thro
a2d0: 75 67 68 20 61 57 63 5b 32 5d 20 74 6f 20 74 68  ugh aWc[2] to th
a2e0: 65 20 77 69 6c 64 63 61 72 64 20 63 68 61 72 61  e wildcard chara
a2f0: 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20 72 65 74  cters and.** ret
a300: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 74 68  urn TRUE.  If th
a310: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  e function is no
a320: 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66  t a LIKE-style f
a330: 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20  unction then.** 
a340: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
a350: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 4c 69  .int sqlite3IsLi
a360: 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  keFunction(sqlit
a370: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 45  e3 *db, Expr *pE
a380: 78 70 72 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63  xpr, int *pIsNoc
a390: 61 73 65 2c 20 63 68 61 72 20 2a 61 57 63 29 7b  ase, char *aWc){
a3a0: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  .  FuncDef *pDef
a3b0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
a3c0: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
a3d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a3e0: 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
a3f0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32  >pList->nExpr!=2
a400: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a410: 3b 0a 20 20 7d 0a 20 20 70 44 65 66 20 3d 20 73  ;.  }.  pDef = s
a420: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
a430: 6f 6e 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45  on(db, (char*)pE
a440: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
a450: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 32 2c  xpr->token.n, 2,
a460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
a480: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
a490: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20   if( pDef==0 || 
a4a0: 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53  (pDef->flags & S
a4b0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29  QLITE_FUNC_LIKE)
a4c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a4d0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
a4e0: 68 65 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74  he memcpy() stat
a4f0: 65 6d 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68  ement assumes th
a500: 61 74 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  at the wildcard 
a510: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 0a 20  characters are. 
a520: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 68   ** the first th
a530: 72 65 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ree statements i
a540: 6e 20 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66  n the compareInf
a550: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
a560: 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29  e.  ** asserts()
a570: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72   that follow ver
a580: 69 66 79 20 74 68 61 74 20 61 73 73 75 6d 70 74  ify that assumpt
a590: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  ion.  */.  memcp
a5a0: 79 28 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73  y(aWc, pDef->pUs
a5b0: 65 72 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73  erData, 3);.  as
a5c0: 73 65 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69  sert( (char*)&li
a5d0: 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68  keInfoAlt == (ch
a5e0: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
a5f0: 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61  .matchAll );.  a
a600: 73 73 65 72 74 28 20 26 28 28 63 68 61 72 2a 29  ssert( &((char*)
a610: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d  &likeInfoAlt)[1]
a620: 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65   == (char*)&like
a630: 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65  InfoAlt.matchOne
a640: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28   );.  assert( &(
a650: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
a660: 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72  Alt)[2] == (char
a670: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d  *)&likeInfoAlt.m
a680: 61 74 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49  atchSet );.  *pI
a690: 73 4e 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d  sNocase = (pDef-
a6a0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
a6b0: 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20  FUNC_CASE)==0;. 
a6c0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a            return 1;.}.