/ Hex Artifact Content
Login

Artifact 964a610bd68d79764f9e435615d723146f94f0e0:


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 32 30 30 20 32 30 30 38 2f 30 39 2f 30 31  1.200 2008/09/01
02a0: 20 31 38 3a 33 34 3a 32 30 20 64 61 6e 69 65 6c   18:34:20 daniel
02b0: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
02c0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
02d0: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
02e0: 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  ctype.h>.#includ
02f0: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
0300: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0310: 0a 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49  .#include "vdbeI
0320: 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  nt.h"../*.** Ret
0330: 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  urn the collatin
0340: 67 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  g function assoc
0350: 69 61 74 65 64 20 77 69 74 68 20 61 20 66 75 6e  iated with a fun
0360: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
0370: 20 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65   CollSeq *sqlite
0380: 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28  3GetFuncCollSeq(
0390: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
03a0: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 72 65 74  *context){.  ret
03b0: 75 72 6e 20 63 6f 6e 74 65 78 74 2d 3e 70 43 6f  urn context->pCo
03c0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ll;.}../*.** Imp
03d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
03e0: 68 65 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  he non-aggregate
03f0: 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29   min() and max()
0400: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2f 0a 73 74   functions.*/.st
0410: 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78  atic void minmax
0420: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
0430: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0440: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
0450: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0460: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  argv.){.  int i;
0470: 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 20 20 20 20  .  int mask;    
0480: 2f 2a 20 30 20 66 6f 72 20 6d 69 6e 28 29 20 6f  /* 0 for min() o
0490: 72 20 30 78 66 66 66 66 66 66 66 66 20 66 6f 72  r 0xffffffff for
04a0: 20 6d 61 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20   max() */.  int 
04b0: 69 42 65 73 74 3b 0a 20 20 43 6f 6c 6c 53 65 71  iBest;.  CollSeq
04c0: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66 28 20   *pColl;..  if( 
04d0: 61 72 67 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  argc==0 ) return
04e0: 3b 0a 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69 74  ;.  mask = sqlit
04f0: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
0500: 74 65 78 74 29 3d 3d 30 20 3f 20 30 20 3a 20 2d  text)==0 ? 0 : -
0510: 31 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  1;.  pColl = sql
0520: 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53  ite3GetFuncCollS
0530: 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61  eq(context);.  a
0540: 73 73 65 72 74 28 20 70 43 6f 6c 6c 20 29 3b 0a  ssert( pColl );.
0550: 20 20 61 73 73 65 72 74 28 20 6d 61 73 6b 3d 3d    assert( mask==
0560: 2d 31 20 7c 7c 20 6d 61 73 6b 3d 3d 30 20 29 3b  -1 || mask==0 );
0570: 0a 20 20 69 42 65 73 74 20 3d 20 30 3b 0a 20 20  .  iBest = 0;.  
0580: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
0590: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
05a0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72  =SQLITE_NULL ) r
05b0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 31  eturn;.  for(i=1
05c0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
05d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
05e0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
05f0: 69 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  i])==SQLITE_NULL
0600: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
0610: 66 28 20 28 73 71 6c 69 74 65 33 4d 65 6d 43 6f  f( (sqlite3MemCo
0620: 6d 70 61 72 65 28 61 72 67 76 5b 69 42 65 73 74  mpare(argv[iBest
0630: 5d 2c 20 61 72 67 76 5b 69 5d 2c 20 70 43 6f 6c  ], argv[i], pCol
0640: 6c 29 5e 6d 61 73 6b 29 3e 3d 30 20 29 7b 0a 20  l)^mask)>=0 ){. 
0650: 20 20 20 20 20 69 42 65 73 74 20 3d 20 69 3b 0a       iBest = i;.
0660: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
0670: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
0680: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 69  (context, argv[i
0690: 42 65 73 74 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Best]);.}../*.**
06a0: 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65   Return the type
06b0: 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
06c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
06d0: 20 74 79 70 65 6f 66 46 75 6e 63 28 0a 20 20 73   typeofFunc(.  s
06e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
06f0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
0700: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
0710: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
0720: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
0730: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71   0;.  switch( sq
0740: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
0750: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
0760: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
0770: 4c 3a 20 20 20 20 7a 20 3d 20 22 6e 75 6c 6c 22  L:    z = "null"
0780: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
0790: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
07a0: 47 45 52 3a 20 7a 20 3d 20 22 69 6e 74 65 67 65  GER: z = "intege
07b0: 72 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  r"; break;.    c
07c0: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
07d0: 20 20 20 20 7a 20 3d 20 22 74 65 78 74 22 3b 20      z = "text"; 
07e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
07f0: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
0800: 20 20 20 7a 20 3d 20 22 72 65 61 6c 22 3b 20 20     z = "real";  
0810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0820: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 20  e SQLITE_BLOB:  
0830: 20 20 7a 20 3d 20 22 62 6c 6f 62 22 3b 20 20 20    z = "blob";   
0840: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71   break;.  }.  sq
0850: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
0860: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d 31  t(context, z, -1
0870: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
0880: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
0890: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
08a0: 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e 63 74  e length() funct
08b0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
08c0: 69 64 20 6c 65 6e 67 74 68 46 75 6e 63 28 0a 20  id lengthFunc(. 
08d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
08e0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
08f0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
0900: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
0910: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61  .  int len;..  a
0920: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
0930: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
0940: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
0950: 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63  rgv[0]) ){.    c
0960: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
0970: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0980: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
0990: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
09a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
09b0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
09c0: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
09d0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
09e0: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
09f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
0a00: 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
0a10: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
0a20: 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  ned char *z = sq
0a30: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
0a40: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
0a50: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
0a60: 72 6e 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20  rn;.      len = 
0a70: 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
0a80: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  *z ){.        le
0a90: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 53 51 4c  n++;.        SQL
0aa0: 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29  ITE_SKIP_UTF8(z)
0ab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
0ac0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
0ad0: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e 29  nt(context, len)
0ae0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0af0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
0b00: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
0b10: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f  3_result_null(co
0b20: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 62 72  ntext);.      br
0b30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
0b40: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
0b50: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 62  tation of the ab
0b60: 73 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a  s() function.*/.
0b70: 73 74 61 74 69 63 20 76 6f 69 64 20 61 62 73 46  static void absF
0b80: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
0b90: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
0ba0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
0bb0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
0bc0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
0bd0: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71   );.  switch( sq
0be0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
0bf0: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
0c00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
0c10: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 36  EGER: {.      i6
0c20: 34 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  4 iVal = sqlite3
0c30: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
0c40: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[0]);.      if(
0c50: 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iVal<0 ){.     
0c60: 20 20 20 69 66 28 20 28 69 56 61 6c 3c 3c 31 29     if( (iVal<<1)
0c70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
0c80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0c90: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
0ca0: 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77  integer overflow
0cb0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ", -1);.        
0cc0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
0cd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 56 61 6c    }.        iVal
0ce0: 20 3d 20 2d 69 56 61 6c 3b 0a 20 20 20 20 20 20   = -iVal;.      
0cf0: 7d 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  } .      sqlite3
0d00: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
0d10: 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20  ntext, iVal);.  
0d20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0d30: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0d40: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
0d50: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
0d60: 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ll(context);.   
0d70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0d80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
0d90: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c       double rVal
0da0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
0db0: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29  _double(argv[0])
0dc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 56 61 6c  ;.      if( rVal
0dd0: 3c 30 20 29 20 72 56 61 6c 20 3d 20 2d 72 56 61  <0 ) rVal = -rVa
0de0: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
0df0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
0e00: 6f 6e 74 65 78 74 2c 20 72 56 61 6c 29 3b 0a 20  ontext, rVal);. 
0e10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0e20: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
0e30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
0e40: 20 74 68 65 20 73 75 62 73 74 72 28 29 20 66 75   the substr() fu
0e50: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 73 75  nction..**.** su
0e60: 62 73 74 72 28 78 2c 70 31 2c 70 32 29 20 20 72  bstr(x,p1,p2)  r
0e70: 65 74 75 72 6e 73 20 70 32 20 63 68 61 72 61 63  eturns p2 charac
0e80: 74 65 72 73 20 6f 66 20 78 5b 5d 20 62 65 67 69  ters of x[] begi
0e90: 6e 6e 69 6e 67 20 77 69 74 68 20 70 31 2e 0a 2a  nning with p1..*
0ea0: 2a 20 70 31 20 69 73 20 31 2d 69 6e 64 65 78 65  * p1 is 1-indexe
0eb0: 64 2e 20 20 53 6f 20 73 75 62 73 74 72 28 78 2c  d.  So substr(x,
0ec0: 31 2c 31 29 20 72 65 74 75 72 6e 73 20 74 68 65  1,1) returns the
0ed0: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
0ee0: 0a 2a 2a 20 6f 66 20 78 2e 20 20 49 66 20 78 20  .** of x.  If x 
0ef0: 69 73 20 74 65 78 74 2c 20 74 68 65 6e 20 77 65  is text, then we
0f00: 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 20   actually count 
0f10: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 73  UTF-8 characters
0f20: 2e 0a 2a 2a 20 49 66 20 78 20 69 73 20 61 20 62  ..** If x is a b
0f30: 6c 6f 62 2c 20 74 68 65 6e 20 77 65 20 63 6f 75  lob, then we cou
0f40: 6e 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt bytes..**.** 
0f50: 49 66 20 70 31 20 69 73 20 6e 65 67 61 74 69 76  If p1 is negativ
0f60: 65 2c 20 74 68 65 6e 20 77 65 20 62 65 67 69 6e  e, then we begin
0f70: 20 61 62 73 28 70 31 29 20 66 72 6f 6d 20 74 68   abs(p1) from th
0f80: 65 20 65 6e 64 20 6f 66 20 78 5b 5d 2e 0a 2a 2f  e end of x[]..*/
0f90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
0fa0: 73 74 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  strFunc(.  sqlit
0fb0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
0fc0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
0fd0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
0fe0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
0ff0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1000: 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73   *z;.  const uns
1010: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 32 3b 0a  igned char *z2;.
1020: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
1030: 20 70 30 74 79 70 65 3b 0a 20 20 69 36 34 20 70   p0type;.  i64 p
1040: 31 2c 20 70 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, p2;..  assert
1050: 28 20 61 72 67 63 3d 3d 33 20 7c 7c 20 61 72 67  ( argc==3 || arg
1060: 63 3d 3d 32 20 29 3b 0a 20 20 70 30 74 79 70 65  c==2 );.  p0type
1070: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1080: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3b 0a  _type(argv[0]);.
1090: 20 20 69 66 28 20 70 30 74 79 70 65 3d 3d 53 51    if( p0type==SQ
10a0: 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
10b0: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76   len = sqlite3_v
10c0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
10d0: 30 5d 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  0]);.    z = sql
10e0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
10f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
1100: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
1110: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e  .    assert( len
1120: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
1130: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 20 29  bytes(argv[0]) )
1140: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
1150: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1160: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
1170: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72      if( z==0 ) r
1180: 65 74 75 72 6e 3b 0a 20 20 20 20 6c 65 6e 20 3d  eturn;.    len =
1190: 20 30 3b 0a 20 20 20 20 66 6f 72 28 7a 32 3d 7a   0;.    for(z2=z
11a0: 3b 20 2a 7a 32 3b 20 6c 65 6e 2b 2b 29 7b 0a 20  ; *z2; len++){. 
11b0: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50       SQLITE_SKIP
11c0: 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 7d  _UTF8(z2);.    }
11d0: 0a 20 20 7d 0a 20 20 70 31 20 3d 20 73 71 6c 69  .  }.  p1 = sqli
11e0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
11f0: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 61 72  gv[1]);.  if( ar
1200: 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20 70 32 20  gc==3 ){.    p2 
1210: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1220: 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  int(argv[2]);.  
1230: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 32 20 3d 20  }else{.    p2 = 
1240: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
1250: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
1260: 74 29 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  t)->aLimit[SQLIT
1270: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b  E_LIMIT_LENGTH];
1280: 0a 20 20 7d 0a 20 20 69 66 28 20 70 31 3c 30 20  .  }.  if( p1<0 
1290: 29 7b 0a 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e  ){.    p1 += len
12a0: 3b 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20 29  ;.    if( p1<0 )
12b0: 7b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 70 31  {.      p2 += p1
12c0: 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a  ;.      p1 = 0;.
12d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
12e0: 28 20 70 31 3e 30 20 29 7b 0a 20 20 20 20 70 31  ( p1>0 ){.    p1
12f0: 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 31  --;.  }.  if( p1
1300: 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 70  +p2>len ){.    p
1310: 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a 20 20 7d 0a  2 = len-p1;.  }.
1320: 20 20 69 66 28 20 70 30 74 79 70 65 21 3d 53 51    if( p0type!=SQ
1330: 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
1340: 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 70 31   while( *z && p1
1350: 20 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45   ){.      SQLITE
1360: 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20  _SKIP_UTF8(z);. 
1370: 20 20 20 20 20 70 31 2d 2d 3b 0a 20 20 20 20 7d       p1--;.    }
1380: 0a 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a  .    for(z2=z; *
1390: 7a 32 20 26 26 20 70 32 3b 20 70 32 2d 2d 29 7b  z2 && p2; p2--){
13a0: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b  .      SQLITE_SK
13b0: 49 50 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20  IP_UTF8(z2);.   
13c0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72   }.    sqlite3_r
13d0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
13e0: 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a 32  xt, (char*)z, z2
13f0: 2d 7a 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -z, SQLITE_TRANS
1400: 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
1410: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 20 70      if( p2<0 ) p
1420: 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  2 = 0;.    sqlit
1430: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
1440: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 26  ontext, (char*)&
1450: 7a 5b 70 31 5d 2c 20 70 32 2c 20 53 51 4c 49 54  z[p1], p2, SQLIT
1460: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
1470: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
1480: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1490: 20 72 6f 75 6e 64 28 29 20 66 75 6e 63 74 69 6f   round() functio
14a0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
14b0: 20 72 6f 75 6e 64 46 75 6e 63 28 73 71 6c 69 74   roundFunc(sqlit
14c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
14d0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
14e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
14f0: 72 67 76 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  rgv){.  int n = 
1500: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  0;.  double r;. 
1510: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 30 5d 3b   char zBuf[500];
1520: 20 20 2f 2a 20 6c 61 72 67 65 72 20 74 68 61 6e    /* larger than
1530: 20 74 68 65 20 25 66 20 72 65 70 72 65 73 65 6e   the %f represen
1540: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
1550: 72 67 65 73 74 20 64 6f 75 62 6c 65 20 2a 2f 0a  rgest double */.
1560: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
1570: 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a  1 || argc==2 );.
1580: 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b    if( argc==2 ){
1590: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
15a0: 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61  NULL==sqlite3_va
15b0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d  lue_type(argv[1]
15c0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
15d0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
15e0: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a  e_int(argv[1]);.
15f0: 20 20 20 20 69 66 28 20 6e 3e 33 30 20 29 20 6e      if( n>30 ) n
1600: 20 3d 20 33 30 3b 0a 20 20 20 20 69 66 28 20 6e   = 30;.    if( n
1610: 3c 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a  <0 ) n = 0;.  }.
1620: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
1630: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
1640: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
1650: 20 72 65 74 75 72 6e 3b 0a 20 20 72 20 3d 20 73   return;.  r = s
1660: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
1670: 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
1680: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1690: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42  (sizeof(zBuf),zB
16a0: 75 66 2c 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a  uf,"%.*f",n,r);.
16b0: 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 42    sqlite3AtoF(zB
16c0: 75 66 2c 20 26 72 29 3b 0a 20 20 73 71 6c 69 74  uf, &r);.  sqlit
16d0: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
16e0: 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 7d 0a  (context, r);.}.
16f0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1700: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
1710: 70 61 63 65 20 75 73 69 6e 67 20 73 71 6c 69 74  pace using sqlit
1720: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  e3_malloc(). If 
1730: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
1740: 6e 20 66 61 69 6c 73 2c 20 63 61 6c 6c 20 73 71  n fails, call sq
1750: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1760: 6f 72 5f 6e 6f 6d 65 6d 28 29 20 74 6f 20 6e 6f  or_nomem() to no
1770: 74 69 66 79 0a 2a 2a 20 74 68 65 20 64 61 74 61  tify.** the data
1780: 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
1790: 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66 61   malloc() has fa
17a0: 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
17b0: 76 6f 69 64 20 2a 63 6f 6e 74 65 78 74 4d 61 6c  void *contextMal
17c0: 6c 6f 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  loc(sqlite3_cont
17d0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 36  ext *context, i6
17e0: 34 20 6e 42 79 74 65 29 7b 0a 20 20 63 68 61 72  4 nByte){.  char
17f0: 20 2a 7a 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   *z;.  if( nByte
1800: 3e 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  >sqlite3_context
1810: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
1820: 78 74 29 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  xt)->aLimit[SQLI
1830: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
1840: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1850: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f  result_error_too
1860: 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  big(context);.  
1870: 20 20 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65    z = 0;.  }else
1880: 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
1890: 33 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  3Malloc(nByte);.
18a0: 20 20 20 20 69 66 28 20 21 7a 20 26 26 20 6e 42      if( !z && nB
18b0: 79 74 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  yte>0 ){.      s
18c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
18d0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
18e0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
18f0: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
1900: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1910: 6e 20 6f 66 20 74 68 65 20 75 70 70 65 72 28 29  n of the upper()
1920: 20 61 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c   and lower() SQL
1930: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
1940: 74 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72  tatic void upper
1950: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
1960: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
1970: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
1980: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
1990: 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f    char *z1;.  co
19a0: 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
19b0: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
19c0: 61 72 67 63 3c 31 20 7c 7c 20 53 51 4c 49 54 45  argc<1 || SQLITE
19d0: 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76  _NULL==sqlite3_v
19e0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
19f0: 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  ]) ) return;.  z
1a00: 32 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  2 = (char*)sqlit
1a10: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1a20: 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71  gv[0]);.  n = sq
1a30: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1a40: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a  s(argv[0]);.  /*
1a50: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1a60: 20 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28   call to _bytes(
1a70: 29 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c  ) does not inval
1a80: 69 64 61 74 65 20 74 68 65 20 5f 74 65 78 74 28  idate the _text(
1a90: 29 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61  ) pointer */.  a
1aa0: 73 73 65 72 74 28 20 7a 32 3d 3d 28 63 68 61 72  ssert( z2==(char
1ab0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1ac0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b  text(argv[0]) );
1ad0: 0a 20 20 69 66 28 20 7a 32 20 29 7b 0a 20 20 20  .  if( z2 ){.   
1ae0: 20 7a 31 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c   z1 = contextMal
1af0: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69  loc(context, ((i
1b00: 36 34 29 6e 29 2b 31 29 3b 0a 20 20 20 20 69 66  64)n)+1);.    if
1b10: 28 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  ( z1 ){.      me
1b20: 6d 63 70 79 28 7a 31 2c 20 7a 32 2c 20 6e 2b 31  mcpy(z1, z2, n+1
1b30: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1b40: 3b 20 7a 31 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  ; z1[i]; i++){. 
1b50: 20 20 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20 74         z1[i] = t
1b60: 6f 75 70 70 65 72 28 7a 31 5b 69 5d 29 3b 0a 20  oupper(z1[i]);. 
1b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1b80: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
1b90: 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 2d 31  (context, z1, -1
1ba0: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
1bb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
1bc0: 74 69 63 20 76 6f 69 64 20 6c 6f 77 65 72 46 75  tic void lowerFu
1bd0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
1be0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
1bf0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
1c00: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
1c10: 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73  char *z1;.  cons
1c20: 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e  t char *z2;.  in
1c30: 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 61 72  t i, n;.  if( ar
1c40: 67 63 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 4e  gc<1 || SQLITE_N
1c50: 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL==sqlite3_val
1c60: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
1c70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 32 20   ) return;.  z2 
1c80: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
1c90: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1ca0: 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  [0]);.  n = sqli
1cb0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
1cc0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20 56  argv[0]);.  /* V
1cd0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
1ce0: 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28 29 20  all to _bytes() 
1cf0: 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c 69 64  does not invalid
1d00: 61 74 65 20 74 68 65 20 5f 74 65 78 74 28 29 20  ate the _text() 
1d10: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61 73 73  pointer */.  ass
1d20: 65 72 74 28 20 7a 32 3d 3d 28 63 68 61 72 2a 29  ert( z2==(char*)
1d30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1d40: 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20  xt(argv[0]) );. 
1d50: 20 69 66 28 20 7a 32 20 29 7b 0a 20 20 20 20 7a   if( z2 ){.    z
1d60: 31 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  1 = contextMallo
1d70: 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34  c(context, ((i64
1d80: 29 6e 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  )n)+1);.    if( 
1d90: 7a 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  z1 ){.      memc
1da0: 70 79 28 7a 31 2c 20 7a 32 2c 20 6e 2b 31 29 3b  py(z1, z2, n+1);
1db0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1dc0: 7a 31 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  z1[i]; i++){.   
1dd0: 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20 74 6f 6c       z1[i] = tol
1de0: 6f 77 65 72 28 7a 31 5b 69 5d 29 3b 0a 20 20 20  ower(z1[i]);.   
1df0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e00: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
1e10: 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 2d 31 2c 20  ontext, z1, -1, 
1e20: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
1e30: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1e40: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1e50: 20 6f 66 20 74 68 65 20 49 46 4e 55 4c 4c 28 29   of the IFNULL()
1e60: 2c 20 4e 56 4c 28 29 2c 20 61 6e 64 20 43 4f 41  , NVL(), and COA
1e70: 4c 45 53 43 45 28 29 20 66 75 6e 63 74 69 6f 6e  LESCE() function
1e80: 73 2e 20 20 0a 2a 2a 20 41 6c 6c 20 74 68 72 65  s.  .** All thre
1e90: 65 20 64 6f 20 74 68 65 20 73 61 6d 65 20 74 68  e do the same th
1ea0: 69 6e 67 2e 20 20 54 68 65 79 20 72 65 74 75 72  ing.  They retur
1eb0: 6e 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  n the first non-
1ec0: 4e 55 4c 4c 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  NULL.** argument
1ed0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ee0: 20 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73   ifnullFunc(.  s
1ef0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1f00: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
1f10: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
1f20: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
1f30: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1f40: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
1f50: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1f60: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
1f70: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d  lue_type(argv[i]
1f80: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1f90: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
1fa0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 69 5d  context, argv[i]
1fb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fc0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1fd0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1fe0: 6e 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20  n of random().  
1ff0: 52 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20  Return a random 
2000: 69 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74  integer.  .*/.st
2010: 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d  atic void random
2020: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2030: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2040: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
2050: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2060: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
2070: 5f 69 6e 74 36 34 20 72 3b 0a 20 20 73 71 6c 69  _int64 r;.  sqli
2080: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
2090: 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20  izeof(r), &r);. 
20a0: 20 69 66 28 20 28 72 3c 3c 31 29 3d 3d 30 20 29   if( (r<<1)==0 )
20b0: 20 72 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76   r = 0;  /* Prev
20c0: 65 6e 74 20 30 78 38 30 30 30 2e 2e 2e 2e 20 61  ent 0x8000.... a
20d0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 6f 20  s the result so 
20e0: 74 68 61 74 20 77 65 20 2a 2f 0a 20 20 20 20 20  that we */.     
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 2f 2a 20 63 61 6e 20 61 6c 77 61       /* can alwa
2110: 79 73 20 64 6f 20 61 62 73 28 29 20 6f 66 20 74  ys do abs() of t
2120: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 73  he result */.  s
2130: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
2140: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  t64(context, r);
2150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
2160: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64  entation of rand
2170: 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52 65 74 75  omblob(N).  Retu
2180: 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62 6c 6f 62  rn a random blob
2190: 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e 20 62 79  .** that is N by
21a0: 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  tes long..*/.sta
21b0: 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 42  tic void randomB
21c0: 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  lob(.  sqlite3_c
21d0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
21e0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
21f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2200: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  rgv.){.  int n;.
2210: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2220: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  *p;.  assert( ar
2230: 67 63 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 73  gc==1 );.  n = s
2240: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2250: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
2260: 20 6e 3c 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20   n<1 ){.    n = 
2270: 31 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 63 6f 6e  1;.  }.  p = con
2280: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
2290: 78 74 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70 20  xt, n);.  if( p 
22a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
22b0: 61 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20 70 29 3b  andomness(n, p);
22c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
22d0: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
22e0: 2c 20 28 63 68 61 72 2a 29 70 2c 20 6e 2c 20 73  , (char*)p, n, s
22f0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
2300: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
2310: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
2320: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
2330: 69 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  id() SQL functio
2340: 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e 0a 2a  n.  The return.*
2350: 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  * value is the s
2360: 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74  ame as the sqlit
2370: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
2380: 6f 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74  owid() API funct
2390: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
23a0: 6f 69 64 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  oid last_insert_
23b0: 72 6f 77 69 64 28 0a 20 20 73 71 6c 69 74 65 33  rowid(.  sqlite3
23c0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
23d0: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 2c 20 0a  t, .  int arg, .
23e0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
23f0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
2400: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
2410: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
2420: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
2430: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2440: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71  nt64(context, sq
2450: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
2460: 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a  t_rowid(db));.}.
2470: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2480: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61  ation of the cha
2490: 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74  nges() SQL funct
24a0: 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ion.  The return
24b0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a   value is the.**
24c0: 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c   same as the sql
24d0: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 41  ite3_changes() A
24e0: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
24f0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
2500: 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ges(.  sqlite3_c
2510: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2520: 0a 20 20 69 6e 74 20 61 72 67 2c 0a 20 20 73 71  .  int arg,.  sq
2530: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
2540: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
2550: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
2560: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
2570: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69  context);.  sqli
2580: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
2590: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
25a0: 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a  changes(db));.}.
25b0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
25c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74  ation of the tot
25d0: 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 53 51 4c  al_changes() SQL
25e0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
25f0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 0a  return value is.
2600: 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  ** the same as t
2610: 68 65 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  he sqlite3_total
2620: 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49 20 66  _changes() API f
2630: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2640: 69 63 20 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68  ic void total_ch
2650: 61 6e 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33  anges(.  sqlite3
2660: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
2670: 74 2c 0a 20 20 69 6e 74 20 61 72 67 2c 0a 20 20  t,.  int arg,.  
2680: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2690: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
26a0: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
26b0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
26c0: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71  e(context);.  sq
26d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
26e0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
26f0: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
2700: 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  db));.}../*.** A
2710: 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
2720: 69 6e 67 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c  ing how to do GL
2730: 4f 42 2d 73 74 79 6c 65 20 63 6f 6d 70 61 72 69  OB-style compari
2740: 73 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  sons..*/.struct 
2750: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20  compareInfo {.  
2760: 75 38 20 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75  u8 matchAll;.  u
2770: 38 20 6d 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38  8 matchOne;.  u8
2780: 20 6d 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20   matchSet;.  u8 
2790: 6e 6f 43 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  noCase;.};../*.*
27a0: 2a 20 46 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47  * For LIKE and G
27b0: 4c 4f 42 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20  LOB matching on 
27c0: 45 42 43 44 49 43 20 6d 61 63 68 69 6e 65 73 2c  EBCDIC machines,
27d0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 65 76 65   assume that eve
27e0: 72 79 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20  ry.** character 
27f0: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 62  is exactly one b
2800: 79 74 65 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c  yte in size.  Al
2810: 73 6f 2c 20 61 6c 6c 20 63 68 61 72 61 63 74 65  so, all characte
2820: 72 73 20 61 72 65 0a 2a 2a 20 61 62 6c 65 20 74  rs are.** able t
2830: 6f 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  o participate in
2840: 20 75 70 70 65 72 2d 63 61 73 65 2d 74 6f 2d 6c   upper-case-to-l
2850: 6f 77 65 72 2d 63 61 73 65 20 6d 61 70 70 69 6e  ower-case mappin
2860: 67 73 20 69 6e 20 45 42 43 44 49 43 0a 2a 2a 20  gs in EBCDIC.** 
2870: 77 68 65 72 65 61 73 20 6f 6e 6c 79 20 63 68 61  whereas only cha
2880: 72 61 63 74 65 72 73 20 6c 65 73 73 20 74 68 61  racters less tha
2890: 6e 20 30 78 38 30 20 64 6f 20 69 6e 20 41 53 43  n 0x80 do in ASC
28a0: 49 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  II..*/.#if defin
28b0: 65 64 28 53 51 4c 49 54 45 5f 45 42 43 44 49 43  ed(SQLITE_EBCDIC
28c0: 29 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  ).# define sqlit
28d0: 65 33 55 74 66 38 52 65 61 64 28 41 2c 42 2c 43  e3Utf8Read(A,B,C
28e0: 29 20 20 28 2a 28 41 2b 2b 29 29 0a 23 20 64 65  )  (*(A++)).# de
28f0: 66 69 6e 65 20 47 6c 6f 67 55 70 70 65 72 54 6f  fine GlogUpperTo
2900: 4c 6f 77 65 72 28 41 29 20 20 20 20 20 41 20 3d  Lower(A)     A =
2910: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
2920: 6f 77 65 72 5b 41 5d 0a 23 65 6c 73 65 0a 23 20  ower[A].#else.# 
2930: 64 65 66 69 6e 65 20 47 6c 6f 67 55 70 70 65 72  define GlogUpper
2940: 54 6f 4c 6f 77 65 72 28 41 29 20 20 20 20 20 69  ToLower(A)     i
2950: 66 28 20 41 3c 30 78 38 30 20 29 7b 20 41 20 3d  f( A<0x80 ){ A =
2960: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
2970: 6f 77 65 72 5b 41 5d 3b 20 7d 0a 23 65 6e 64 69  ower[A]; }.#endi
2980: 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  f..static const 
2990: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
29a0: 66 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20  fo globInfo = { 
29b0: 27 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30  '*', '?', '[', 0
29c0: 20 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65   };./* The corre
29d0: 63 74 20 53 51 4c 2d 39 32 20 62 65 68 61 76 69  ct SQL-92 behavi
29e0: 6f 72 20 69 73 20 66 6f 72 20 74 68 65 20 4c 49  or is for the LI
29f0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 69  KE operator to i
2a00: 67 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20  gnore.** case.  
2a10: 54 68 75 73 20 20 27 61 27 20 4c 49 4b 45 20 27  Thus  'a' LIKE '
2a20: 41 27 20 77 6f 75 6c 64 20 62 65 20 74 72 75 65  A' would be true
2a30: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  . */.static cons
2a40: 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65  t struct compare
2a50: 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72  Info likeInfoNor
2a60: 6d 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20  m = { '%', '_', 
2a70: 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20    0, 1 };./* If 
2a80: 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53  SQLITE_CASE_SENS
2a90: 49 54 49 56 45 5f 4c 49 4b 45 20 69 73 20 64 65  ITIVE_LIKE is de
2aa0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20  fined, then the 
2ab0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LIKE operator.**
2ac0: 20 69 73 20 63 61 73 65 20 73 65 6e 73 69 74 69   is case sensiti
2ad0: 76 65 20 63 61 75 73 69 6e 67 20 27 61 27 20 4c  ve causing 'a' L
2ae0: 49 4b 45 20 27 41 27 20 74 6f 20 62 65 20 66 61  IKE 'A' to be fa
2af0: 6c 73 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  lse */.static co
2b00: 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61  nst struct compa
2b10: 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41  reInfo likeInfoA
2b20: 6c 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c  lt = { '%', '_',
2b30: 20 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a     0, 0 };../*.*
2b40: 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55 54  * Compare two UT
2b50: 46 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72 20  F-8 strings for 
2b60: 65 71 75 61 6c 69 74 79 20 77 68 65 72 65 20 74  equality where t
2b70: 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20  he first string 
2b80: 63 61 6e 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  can.** potential
2b90: 6c 79 20 62 65 20 61 20 22 67 6c 6f 62 22 20 65  ly be a "glob" e
2ba0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 52 65 74 75  xpression.  Retu
2bb0: 72 6e 20 74 72 75 65 20 28 31 29 20 69 66 20 74  rn true (1) if t
2bc0: 68 65 79 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  hey.** are the s
2bd0: 61 6d 65 20 61 6e 64 20 66 61 6c 73 65 20 28 30  ame and false (0
2be0: 29 20 69 66 20 74 68 65 79 20 61 72 65 20 64 69  ) if they are di
2bf0: 66 66 65 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47  fferent..**.** G
2c00: 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  lobbing rules:.*
2c10: 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20  *.**      '*'   
2c20: 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
2c30: 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f  sequence of zero
2c40: 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74   or more charact
2c50: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ers..**.**      
2c60: 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '?'       Matche
2c70: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68  s exactly one ch
2c80: 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  aracter..**.**  
2c90: 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61     [...]      Ma
2ca0: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
2cb0: 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63  ter from the enc
2cc0: 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a  losed list of.**
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
2cf0: 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20  *     [^...]    
2d00: 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
2d10: 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68  racter not in th
2d20: 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e  e enclosed list.
2d30: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20  .**.** With the 
2d40: 5b 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d  [...] and [^...]
2d50: 20 6d 61 74 63 68 69 6e 67 2c 20 61 20 27 5d 27   matching, a ']'
2d60: 20 63 68 61 72 61 63 74 65 72 20 63 61 6e 20 62   character can b
2d70: 65 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e  e included.** in
2d80: 20 74 68 65 20 6c 69 73 74 20 62 79 20 6d 61 6b   the list by mak
2d90: 69 6e 67 20 69 74 20 74 68 65 20 66 69 72 73 74  ing it the first
2da0: 20 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72   character after
2db0: 20 27 5b 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a   '[' or '^'.  A.
2dc0: 2a 2a 20 72 61 6e 67 65 20 6f 66 20 63 68 61 72  ** range of char
2dd0: 61 63 74 65 72 73 20 63 61 6e 20 62 65 20 73 70  acters can be sp
2de0: 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 27 2d  ecified using '-
2df0: 27 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20  '.  Example:.** 
2e00: 22 5b 61 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20  "[a-z]" matches 
2e10: 61 6e 79 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72  any single lower
2e20: 2d 63 61 73 65 20 6c 65 74 74 65 72 2e 20 20 54  -case letter.  T
2e30: 6f 20 6d 61 74 63 68 20 61 20 27 2d 27 2c 20 6d  o match a '-', m
2e40: 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61  ake.** it the la
2e50: 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  st character in 
2e60: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  the list..**.** 
2e70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2e80: 75 73 75 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62  usually quick, b
2e90: 75 74 20 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69  ut can be N**2 i
2ea0: 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65  n the worst case
2eb0: 2e 0a 2a 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74  ..**.** Hints: t
2ec0: 6f 20 6d 61 74 63 68 20 27 2a 27 20 6f 72 20 27  o match '*' or '
2ed0: 3f 27 2c 20 70 75 74 20 74 68 65 6d 20 69 6e 20  ?', put them in 
2ee0: 22 5b 5d 22 2e 20 20 4c 69 6b 65 20 74 68 69 73  "[]".  Like this
2ef0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
2f00: 61 62 63 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20  abc[*]xyz       
2f10: 20 4d 61 74 63 68 65 73 20 22 61 62 63 2a 78 79   Matches "abc*xy
2f20: 7a 22 20 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74 69  z" only.*/.stati
2f30: 63 20 69 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d  c int patternCom
2f40: 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 75 38  pare(.  const u8
2f50: 20 2a 7a 50 61 74 74 65 72 6e 2c 20 20 20 20 20   *zPattern,     
2f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f70: 67 6c 6f 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a  glob pattern */.
2f80: 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72    const u8 *zStr
2f90: 69 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  ing,            
2fa0: 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
2fb0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
2fc0: 6e 73 74 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a  nst the glob */.
2fd0: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63    const struct c
2fe0: 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66  ompareInfo *pInf
2ff0: 6f 2c 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  o, /* Informatio
3000: 6e 20 61 62 6f 75 74 20 68 6f 77 20 74 6f 20 64  n about how to d
3010: 6f 20 74 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f  o the compare */
3020: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 65 73 63  .  const int esc
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70      /* The escap
3050: 65 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 29  e character */.)
3060: 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20  {.  int c, c2;. 
3070: 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69   int invert;.  i
3080: 6e 74 20 73 65 65 6e 3b 0a 20 20 75 38 20 6d 61  nt seen;.  u8 ma
3090: 74 63 68 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e  tchOne = pInfo->
30a0: 6d 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d  matchOne;.  u8 m
30b0: 61 74 63 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d  atchAll = pInfo-
30c0: 3e 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20  >matchAll;.  u8 
30d0: 6d 61 74 63 68 53 65 74 20 3d 20 70 49 6e 66 6f  matchSet = pInfo
30e0: 2d 3e 6d 61 74 63 68 53 65 74 3b 0a 20 20 75 38  ->matchSet;.  u8
30f0: 20 6e 6f 43 61 73 65 20 3d 20 70 49 6e 66 6f 2d   noCase = pInfo-
3100: 3e 6e 6f 43 61 73 65 3b 20 0a 20 20 69 6e 74 20  >noCase; .  int 
3110: 70 72 65 76 45 73 63 61 70 65 20 3d 20 30 3b 20  prevEscape = 0; 
3120: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3130: 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72  he previous char
3140: 61 63 74 65 72 20 77 61 73 20 27 65 73 63 61 70  acter was 'escap
3150: 65 27 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20  e' */..  while( 
3160: 28 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  (c = sqlite3Utf8
3170: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 30 2c  Read(zPattern,0,
3180: 26 7a 50 61 74 74 65 72 6e 29 29 21 3d 30 20 29  &zPattern))!=0 )
3190: 7b 0a 20 20 20 20 69 66 28 20 21 70 72 65 76 45  {.    if( !prevE
31a0: 73 63 61 70 65 20 26 26 20 63 3d 3d 6d 61 74 63  scape && c==matc
31b0: 68 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 77 68  hAll ){.      wh
31c0: 69 6c 65 28 20 28 63 3d 73 71 6c 69 74 65 33 55  ile( (c=sqlite3U
31d0: 74 66 38 52 65 61 64 28 7a 50 61 74 74 65 72 6e  tf8Read(zPattern
31e0: 2c 30 2c 26 7a 50 61 74 74 65 72 6e 29 29 20 3d  ,0,&zPattern)) =
31f0: 3d 20 6d 61 74 63 68 41 6c 6c 0a 20 20 20 20 20  = matchAll.     
3200: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 63 20 3d            || c =
3210: 3d 20 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20  = matchOne ){.  
3220: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 6d 61 74        if( c==mat
3230: 63 68 4f 6e 65 20 26 26 20 73 71 6c 69 74 65 33  chOne && sqlite3
3240: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
3250: 2c 20 30 2c 20 26 7a 53 74 72 69 6e 67 29 3d 3d  , 0, &zString)==
3260: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
3270: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
3280: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
3290: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
32a0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
32b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
32c0: 3d 3d 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20  ==esc ){.       
32d0: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38   c = sqlite3Utf8
32e0: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 30  Read(zPattern, 0
32f0: 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  , &zPattern);.  
3300: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
3310: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
3320: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
3330: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3340: 63 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a 20  c==matchSet ){. 
3350: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
3360: 73 63 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  sc==0 );        
3370: 20 2f 2a 20 54 68 69 73 20 69 73 20 47 4c 4f 42   /* This is GLOB
3380: 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20  , not LIKE */.  
3390: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61        assert( ma
33a0: 74 63 68 53 65 74 3c 30 78 38 30 20 29 3b 20 20  tchSet<0x80 );  
33b0: 2f 2a 20 27 5b 27 20 69 73 20 61 20 73 69 6e 67  /* '[' is a sing
33c0: 6c 65 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  le-byte characte
33d0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  r */.        whi
33e0: 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 26 26 20  le( *zString && 
33f0: 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 26  patternCompare(&
3400: 7a 50 61 74 74 65 72 6e 5b 2d 31 5d 2c 7a 53 74  zPattern[-1],zSt
3410: 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29 3d  ring,pInfo,esc)=
3420: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3430: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
3440: 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  (zString);.     
3450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
3460: 75 72 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b  urn *zString!=0;
3470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
3480: 68 69 6c 65 28 20 28 63 32 20 3d 20 73 71 6c 69  hile( (c2 = sqli
3490: 74 65 33 55 74 66 38 52 65 61 64 28 7a 53 74 72  te3Utf8Read(zStr
34a0: 69 6e 67 2c 30 2c 26 7a 53 74 72 69 6e 67 29 29  ing,0,&zString))
34b0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
34c0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
34d0: 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72         GlogUpper
34e0: 54 6f 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20 20  ToLower(c2);.   
34f0: 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72         GlogUpper
3500: 54 6f 4c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20  ToLower(c);.    
3510: 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20        while( c2 
3520: 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63 20  != 0 && c2 != c 
3530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
3540: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
3550: 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20  ead(zString, 0, 
3560: 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  &zString);.     
3570: 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72         GlogUpper
3580: 54 6f 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20 20  ToLower(c2);.   
3590: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35b0: 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30    while( c2 != 0
35c0: 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b 0a 20   && c2 != c ){. 
35d0: 20 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20             c2 = 
35e0: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
35f0: 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74  zString, 0, &zSt
3600: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20  ring);.         
3610: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
3620: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29       if( c2==0 )
3630: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
3640: 20 20 20 69 66 28 20 70 61 74 74 65 72 6e 43 6f     if( patternCo
3650: 6d 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a  mpare(zPattern,z
3660: 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63  String,pInfo,esc
3670: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
3680: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
3690: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
36a0: 69 66 28 20 21 70 72 65 76 45 73 63 61 70 65 20  if( !prevEscape 
36b0: 26 26 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 29  && c==matchOne )
36c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
36d0: 74 65 33 55 74 66 38 52 65 61 64 28 7a 53 74 72  te3Utf8Read(zStr
36e0: 69 6e 67 2c 20 30 2c 20 26 7a 53 74 72 69 6e 67  ing, 0, &zString
36f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
3710: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
3720: 63 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a 20  c==matchSet ){. 
3730: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63       int prior_c
3740: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
3750: 72 74 28 20 65 73 63 3d 3d 30 20 29 3b 20 20 20  rt( esc==0 );   
3760: 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63   /* This only oc
3770: 63 75 72 73 20 66 6f 72 20 47 4c 4f 42 2c 20 6e  curs for GLOB, n
3780: 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20 20  ot LIKE */.     
3790: 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20   seen = 0;.     
37a0: 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20   invert = 0;.   
37b0: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74     c = sqlite3Ut
37c0: 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20  f8Read(zString, 
37d0: 30 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20  0, &zString);.  
37e0: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
37f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63  eturn 0;.      c
3800: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
3810: 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c  ead(zPattern, 0,
3820: 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20   &zPattern);.   
3830: 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20 29     if( c2=='^' )
3840: 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65 72 74  {.        invert
3850: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32   = 1;.        c2
3860: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
3870: 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20  ad(zPattern, 0, 
3880: 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  &zPattern);.    
3890: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
38a0: 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  ==']' ){.       
38b0: 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65   if( c==']' ) se
38c0: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
38d0: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
38e0: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 30  Read(zPattern, 0
38f0: 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  , &zPattern);.  
3900: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
3910: 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27  e( c2 && c2!=']'
3920: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
3930: 63 32 3d 3d 27 2d 27 20 26 26 20 7a 50 61 74 74  c2=='-' && zPatt
3940: 65 72 6e 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a  ern[0]!=']' && z
3950: 50 61 74 74 65 72 6e 5b 30 5d 21 3d 30 20 26 26  Pattern[0]!=0 &&
3960: 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20   prior_c>0 ){.  
3970: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
3980: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61  ite3Utf8Read(zPa
3990: 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74  ttern, 0, &zPatt
39a0: 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ern);.          
39b0: 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26  if( c>=prior_c &
39c0: 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d  & c<=c2 ) seen =
39d0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72   1;.          pr
39e0: 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
39f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3a00: 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b      if( c==c2 ){
3a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
3a20: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
3a30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69   }.          pri
3a40: 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20  or_c = c2;.     
3a50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20     }.        c2 
3a60: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
3a70: 64 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20 26  d(zPattern, 0, &
3a80: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
3a90: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
3aa0: 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e  =0 || (seen ^ in
3ab0: 76 65 72 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  vert)==0 ){.    
3ac0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3ad0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
3ae0: 69 66 28 20 65 73 63 3d 3d 63 20 26 26 20 21 70  if( esc==c && !p
3af0: 72 65 76 45 73 63 61 70 65 20 29 7b 0a 20 20 20  revEscape ){.   
3b00: 20 20 20 70 72 65 76 45 73 63 61 70 65 20 3d 20     prevEscape = 
3b10: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
3b20: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
3b30: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
3b40: 2c 20 30 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a  , 0, &zString);.
3b50: 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65        if( noCase
3b60: 20 29 7b 0a 20 20 20 20 20 20 20 20 47 6c 6f 67   ){.        Glog
3b70: 55 70 70 65 72 54 6f 4c 6f 77 65 72 28 63 29 3b  UpperToLower(c);
3b80: 0a 20 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70  .        GlogUpp
3b90: 65 72 54 6f 4c 6f 77 65 72 28 63 32 29 3b 0a 20  erToLower(c2);. 
3ba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3bb0: 20 63 21 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c!=c2 ){.      
3bc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3bd0: 20 20 7d 0a 20 20 20 20 20 20 70 72 65 76 45 73    }.      prevEs
3be0: 63 61 70 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  cape = 0;.    }.
3bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53    }.  return *zS
3c00: 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  tring==0;.}../*.
3c10: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
3c20: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
3c30: 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  t the LIKE opera
3c40: 74 6f 72 20 28 6f 72 20 47 4c 4f 42 20 77 68 69  tor (or GLOB whi
3c50: 63 68 20 69 73 0a 2a 2a 20 6a 75 73 74 20 61 20  ch is.** just a 
3c60: 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 4c 49 4b  variation of LIK
3c70: 45 29 20 67 65 74 73 20 63 61 6c 6c 65 64 2e 20  E) gets called. 
3c80: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
3c90: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c  r testing.** onl
3ca0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
3cb0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
3cc0: 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20  ite3_like_count 
3cd0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  = 0;.#endif.../*
3ce0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
3cf0: 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6b 65 28 29  on of the like()
3d00: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
3d10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d  This function im
3d20: 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20  plements.** the 
3d30: 62 75 69 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70  build-in LIKE op
3d40: 65 72 61 74 6f 72 2e 20 20 54 68 65 20 66 69 72  erator.  The fir
3d50: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
3d60: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  he function is t
3d70: 68 65 0a 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e  he.** pattern an
3d80: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  d the second arg
3d90: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 73 74 72  ument is the str
3da0: 69 6e 67 2e 20 20 53 6f 2c 20 74 68 65 20 53 51  ing.  So, the SQ
3db0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a  L statements:.**
3dc0: 0a 2a 2a 20 20 20 20 20 20 20 41 20 4c 49 4b 45  .**       A LIKE
3dd0: 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c   B.**.** is impl
3de0: 65 6d 65 6e 74 65 64 20 61 73 20 6c 69 6b 65 28  emented as like(
3df0: 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  B,A)..**.** This
3e00: 20 73 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20 28   same function (
3e10: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
3e20: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74 72   compareInfo str
3e30: 75 63 74 75 72 65 29 20 63 6f 6d 70 75 74 65 73  ucture) computes
3e40: 0a 2a 2a 20 74 68 65 20 47 4c 4f 42 20 6f 70 65  .** the GLOB ope
3e50: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
3e60: 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e 63 28 0a   void likeFunc(.
3e70: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3e80: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
3e90: 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69  nt argc, .  sqli
3ea0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
3eb0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
3ec0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 2c 20 2a  gned char *zA, *
3ed0: 7a 42 3b 0a 20 20 69 6e 74 20 65 73 63 61 70 65  zB;.  int escape
3ee0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
3ef0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
3f00: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
3f10: 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 7a 42 20  context);..  zB 
3f20: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3f30: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
3f40: 20 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   zA = sqlite3_va
3f50: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
3f60: 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74  );..  /* Limit t
3f70: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
3f80: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61   LIKE or GLOB pa
3f90: 74 74 65 72 6e 20 74 6f 20 61 76 6f 69 64 20 70  ttern to avoid p
3fa0: 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20  roblems.  ** of 
3fb0: 64 65 65 70 20 72 65 63 75 72 73 69 6f 6e 20 61  deep recursion a
3fc0: 6e 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20  nd N*N behavior 
3fd0: 69 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  in patternCompar
3fe0: 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e()..  */.  if( 
3ff0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
4000: 74 65 73 28 61 72 67 76 5b 30 5d 29 20 3e 0a 20  tes(argv[0]) >. 
4010: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
4020: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
4030: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
4040: 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TH] ){.    sqlit
4050: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
4060: 63 6f 6e 74 65 78 74 2c 20 22 4c 49 4b 45 20 6f  context, "LIKE o
4070: 72 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74  r GLOB pattern t
4080: 6f 6f 20 63 6f 6d 70 6c 65 78 22 2c 20 2d 31 29  oo complex", -1)
4090: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
40a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 42 3d 3d  }.  assert( zB==
40b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
40c0: 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20  xt(argv[0]) );  
40d0: 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 64 69 64 20  /* Encoding did 
40e0: 6e 6f 74 20 63 68 61 6e 67 65 20 2a 2f 0a 0a 20  not change */.. 
40f0: 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a   if( argc==3 ){.
4100: 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70      /* The escap
4110: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
4120: 6e 67 20 6d 75 73 74 20 63 6f 6e 73 69 73 74 20  ng must consist 
4130: 6f 66 20 61 20 73 69 6e 67 6c 65 20 55 54 46 2d  of a single UTF-
4140: 38 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20  8 character..   
4150: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72   ** Otherwise, r
4160: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  eturn an error..
4170: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
4180: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4190: 7a 45 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 76  zEsc = sqlite3_v
41a0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32  alue_text(argv[2
41b0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 73 63  ]);.    if( zEsc
41c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
41d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 55 74 66    if( sqlite3Utf
41e0: 38 43 68 61 72 4c 65 6e 28 28 63 68 61 72 2a 29  8CharLen((char*)
41f0: 7a 45 73 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a  zEsc, -1)!=1 ){.
4200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4210: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
4220: 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  xt, .          "
4230: 45 53 43 41 50 45 20 65 78 70 72 65 73 73 69 6f  ESCAPE expressio
4240: 6e 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67  n must be a sing
4250: 6c 65 20 63 68 61 72 61 63 74 65 72 22 2c 20 2d  le character", -
4260: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
4270: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 73 63 61  ;.    }.    esca
4280: 70 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  pe = sqlite3Utf8
4290: 52 65 61 64 28 7a 45 73 63 2c 20 30 2c 20 26 7a  Read(zEsc, 0, &z
42a0: 45 73 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Esc);.  }.  if( 
42b0: 7a 41 20 26 26 20 7a 42 20 29 7b 0a 20 20 20 20  zA && zB ){.    
42c0: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
42d0: 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 73 71 6c 69  fo *pInfo = sqli
42e0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
42f0: 6e 74 65 78 74 29 3b 0a 23 69 66 64 65 66 20 53  ntext);.#ifdef S
4300: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
4310: 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e  qlite3_like_coun
4320: 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
4330: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
4340: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
4350: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
4360: 7a 42 2c 20 7a 41 2c 20 70 49 6e 66 6f 2c 20 65  zB, zA, pInfo, e
4370: 73 63 61 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  scape));.  }.}..
4380: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
4390: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c  tion of the NULL
43a0: 49 46 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e  IF(x,y) function
43b0: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
43c0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
43d0: 67 75 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72  gument if the ar
43e0: 67 75 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66  guments are diff
43f0: 65 72 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75  erent.  The resu
4400: 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  lt is NULL if th
4410: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61  e.** arguments a
4420: 72 65 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68  re equal to each
4430: 20 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   other..*/.stati
4440: 63 20 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e  c void nullifFun
4450: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
4460: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
4470: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
4480: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
4490: 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  v.){.  CollSeq *
44a0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
44b0: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f  etFuncCollSeq(co
44c0: 6e 74 65 78 74 29 3b 0a 20 20 69 66 28 20 73 71  ntext);.  if( sq
44d0: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
44e0: 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d  argv[0], argv[1]
44f0: 2c 20 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20  , pColl)!=0 ){. 
4500: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4510: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
4520: 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d   argv[0]);.  }.}
4530: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
4540: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 56 45  tation of the VE
4550: 52 53 49 4f 4e 28 2a 29 20 66 75 6e 63 74 69 6f  RSION(*) functio
4560: 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69  n.  The result i
4570: 73 20 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a  s the version.**
4580: 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c   of the SQLite l
4590: 69 62 72 61 72 79 20 74 68 61 74 20 69 73 20 72  ibrary that is r
45a0: 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  unning..*/.stati
45b0: 63 20 76 6f 69 64 20 76 65 72 73 69 6f 6e 46 75  c void versionFu
45c0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
45d0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
45e0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
45f0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
4600: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gv.){.  sqlite3_
4610: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
4620: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 65 72  ext, sqlite3_ver
4630: 73 69 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45  sion, -1, SQLITE
4640: 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 20  _STATIC);.}../* 
4650: 41 72 72 61 79 20 66 6f 72 20 63 6f 6e 76 65 72  Array for conver
4660: 74 69 6e 67 20 66 72 6f 6d 20 68 61 6c 66 2d 62  ting from half-b
4670: 79 74 65 73 20 28 6e 79 62 62 6c 65 73 29 20 69  ytes (nybbles) i
4680: 6e 74 6f 20 41 53 43 49 49 20 68 65 78 0a 2a 2a  nto ASCII hex.**
4690: 20 64 69 67 69 74 73 2e 20 2a 2f 0a 73 74 61 74   digits. */.stat
46a0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 68 65  ic const char he
46b0: 78 64 69 67 69 74 73 5b 5d 20 3d 20 7b 0a 20 20  xdigits[] = {.  
46c0: 27 30 27 2c 20 27 31 27 2c 20 27 32 27 2c 20 27  '0', '1', '2', '
46d0: 33 27 2c 20 27 34 27 2c 20 27 35 27 2c 20 27 36  3', '4', '5', '6
46e0: 27 2c 20 27 37 27 2c 0a 20 20 27 38 27 2c 20 27  ', '7',.  '8', '
46f0: 39 27 2c 20 27 41 27 2c 20 27 42 27 2c 20 27 43  9', 'A', 'B', 'C
4700: 27 2c 20 27 44 27 2c 20 27 45 27 2c 20 27 46 27  ', 'D', 'E', 'F'
4710: 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 58 50 45   .};../*.** EXPE
4720: 52 49 4d 45 4e 54 41 4c 20 2d 20 54 68 69 73 20  RIMENTAL - This 
4730: 69 73 20 6e 6f 74 20 61 6e 20 6f 66 66 69 63 69  is not an offici
4740: 61 6c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  al function.  Th
4750: 65 20 69 6e 74 65 72 66 61 63 65 20 6d 61 79 0a  e interface may.
4760: 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54 68 69 73  ** change.  This
4770: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 69   function may di
4780: 73 61 70 70 65 61 72 2e 20 20 44 6f 20 6e 6f 74  sappear.  Do not
4790: 20 77 72 69 74 65 20 63 6f 64 65 20 74 68 61 74   write code that
47a0: 20 64 65 70 65 6e 64 73 0a 2a 2a 20 6f 6e 20 74   depends.** on t
47b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
47c0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
47d0: 6f 6e 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28  on of the QUOTE(
47e0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  ) function.  Thi
47f0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  s function takes
4800: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67   a single.** arg
4810: 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61  ument.  If the a
4820: 72 67 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72  rgument is numer
4830: 69 63 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  ic, the return v
4840: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
4850: 20 61 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d   as.** the argum
4860: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67  ent.  If the arg
4870: 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
4880: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
4890: 69 73 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  is the string.**
48a0: 20 22 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77   "NULL".  Otherw
48b0: 69 73 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e  ise, the argumen
48c0: 74 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  t is enclosed in
48d0: 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77   single quotes w
48e0: 69 74 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75  ith.** single-qu
48f0: 6f 74 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a  ote escapes..*/.
4900: 73 74 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74  static void quot
4910: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
4920: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
4930: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
4940: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
4950: 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20  .  if( argc<1 ) 
4960: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
4970: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
4980: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
4990: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
49a0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
49b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
49c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c  xt(context, "NUL
49d0: 4c 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54  L", 4, SQLITE_ST
49e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
49f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4a00: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
4a10: 52 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  R:.    case SQLI
4a20: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
4a30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4a40: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
4a50: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
4a60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4a70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
4a80: 42 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  B: {.      char 
4a90: 2a 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  *zText = 0;.    
4aa0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42    char const *zB
4ab0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
4ac0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
4ad0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  );.      int nBl
4ae0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
4af0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
4b00: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
4b10: 20 7a 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f   zBlob==sqlite3_
4b20: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
4b30: 30 5d 29 20 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63  0]) ); /* No enc
4b40: 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a  oding change */.
4b50: 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 28 63        zText = (c
4b60: 68 61 72 20 2a 29 63 6f 6e 74 65 78 74 4d 61 6c  har *)contextMal
4b70: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 32 2a  loc(context, (2*
4b80: 28 69 36 34 29 6e 42 6c 6f 62 29 2b 34 29 3b 20  (i64)nBlob)+4); 
4b90: 0a 20 20 20 20 20 20 69 66 28 20 7a 54 65 78 74  .      if( zText
4ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
4bb0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
4bc0: 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b  =0; i<nBlob; i++
4bd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
4be0: 78 74 5b 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65  xt[(i*2)+2] = he
4bf0: 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69  xdigits[(zBlob[i
4c00: 5d 3e 3e 34 29 26 30 78 30 46 5d 3b 0a 20 20 20  ]>>4)&0x0F];.   
4c10: 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a         zText[(i*
4c20: 32 29 2b 33 5d 20 3d 20 68 65 78 64 69 67 69 74  2)+3] = hexdigit
4c30: 73 5b 28 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30  s[(zBlob[i])&0x0
4c40: 46 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  F];.        }.  
4c50: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c        zText[(nBl
4c60: 6f 62 2a 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b  ob*2)+2] = '\'';
4c70: 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28  .        zText[(
4c80: 6e 42 6c 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c  nBlob*2)+3] = '\
4c90: 30 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78  0';.        zTex
4ca0: 74 5b 30 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20  t[0] = 'X';.    
4cb0: 20 20 20 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27      zText[1] = '
4cc0: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  \'';.        sql
4cd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
4ce0: 28 63 6f 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c  (context, zText,
4cf0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
4d00: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20  SIENT);.        
4d10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
4d20: 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
4d30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4d40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4d50: 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TEXT: {.      in
4d60: 74 20 69 2c 6a 3b 0a 20 20 20 20 20 20 75 36 34  t i,j;.      u64
4d70: 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
4d80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
4d90: 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Arg = sqlite3_va
4da0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
4db0: 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
4dc0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 41 72  ;..      if( zAr
4dd0: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  g==0 ) return;. 
4de0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d       for(i=0, n=
4df0: 30 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29  0; zArg[i]; i++)
4e00: 7b 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27  { if( zArg[i]=='
4e10: 5c 27 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20  \'' ) n++; }.   
4e20: 20 20 20 7a 20 3d 20 63 6f 6e 74 65 78 74 4d 61     z = contextMa
4e30: 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28  lloc(context, ((
4e40: 69 36 34 29 69 29 2b 28 28 69 36 34 29 6e 29 2b  i64)i)+((i64)n)+
4e50: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20  3);.      if( z 
4e60: 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 30 5d 20  ){.        z[0] 
4e70: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
4e80: 66 6f 72 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41  for(i=0, j=1; zA
4e90: 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  rg[i]; i++){.   
4ea0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
4eb0: 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
4ec0: 20 20 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d     if( zArg[i]==
4ed0: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
4ee0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27      z[j++] = '\'
4ef0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
4f00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4f10: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[j++] = '\'';.
4f20: 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30          z[j] = 0
4f30: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4f40: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
4f50: 6e 74 65 78 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c  ntext, z, j, sql
4f60: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20  ite3_free);.    
4f70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
4f80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 78 28 29  ./*.** The hex()
4f90: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 6e 74 65   function.  Inte
4fa0: 72 70 72 65 74 20 74 68 65 20 61 72 67 75 6d 65  rpret the argume
4fb0: 6e 74 20 61 73 20 61 20 62 6c 6f 62 2e 20 20 52  nt as a blob.  R
4fc0: 65 74 75 72 6e 0a 2a 2a 20 61 20 68 65 78 61 64  eturn.** a hexad
4fd0: 65 63 69 6d 61 6c 20 72 65 6e 64 65 72 69 6e 67  ecimal rendering
4fe0: 20 61 73 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61   as text..*/.sta
4ff0: 74 69 63 20 76 6f 69 64 20 68 65 78 46 75 6e 63  tic void hexFunc
5000: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5010: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
5020: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
5030: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5040: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  .){.  int i, n;.
5050: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
5060: 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20   char *pBlob;.  
5070: 63 68 61 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a  char *zHex, *z;.
5080: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
5090: 31 20 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73  1 );.  pBlob = s
50a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
50b0: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20  b(argv[0]);.  n 
50c0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
50d0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
50e0: 20 20 61 73 73 65 72 74 28 20 70 42 6c 6f 62 3d    assert( pBlob=
50f0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  =sqlite3_value_b
5100: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  lob(argv[0]) ); 
5110: 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20   /* No encoding 
5120: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 20 3d 20  change */.  z = 
5130: 7a 48 65 78 20 3d 20 63 6f 6e 74 65 78 74 4d 61  zHex = contextMa
5140: 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28  lloc(context, ((
5150: 69 36 34 29 6e 29 2a 32 20 2b 20 31 29 3b 0a 20  i64)n)*2 + 1);. 
5160: 20 69 66 28 20 7a 48 65 78 20 29 7b 0a 20 20 20   if( zHex ){.   
5170: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
5180: 2b 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a 20 20  ++, pBlob++){.  
5190: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
51a0: 72 20 63 20 3d 20 2a 70 42 6c 6f 62 3b 0a 20 20  r c = *pBlob;.  
51b0: 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78      *(z++) = hex
51c0: 64 69 67 69 74 73 5b 28 63 3e 3e 34 29 26 30 78  digits[(c>>4)&0x
51d0: 66 5d 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29  f];.      *(z++)
51e0: 20 3d 20 68 65 78 64 69 67 69 74 73 5b 63 26 30   = hexdigits[c&0
51f0: 78 66 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  xf];.    }.    *
5200: 7a 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  z = 0;.    sqlit
5210: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5220: 6f 6e 74 65 78 74 2c 20 7a 48 65 78 2c 20 6e 2a  ontext, zHex, n*
5230: 32 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  2, sqlite3_free)
5240: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
5250: 68 65 20 7a 65 72 6f 62 6c 6f 62 28 4e 29 20 66  he zeroblob(N) f
5260: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5270: 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 62 6c  a zero-filled bl
5280: 6f 62 20 6f 66 20 73 69 7a 65 20 4e 20 62 79 74  ob of size N byt
5290: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
52a0: 69 64 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 28  id zeroblobFunc(
52b0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
52c0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
52d0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
52e0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
52f0: 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61 73  ){.  i64 n;.  as
5300: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
5310: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
5320: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
5330: 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 53 51 4c  0]);.  if( n>SQL
5340: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29  ITE_MAX_LENGTH )
5350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
5360: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
5370: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  g(context);.  }e
5380: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
5390: 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62  _result_zeroblob
53a0: 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20  (context, n);.  
53b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  }.}../*.** The r
53c0: 65 70 6c 61 63 65 28 29 20 66 75 6e 63 74 69 6f  eplace() functio
53d0: 6e 2e 20 20 54 68 72 65 65 20 61 72 67 75 6d 65  n.  Three argume
53e0: 6e 74 73 20 61 72 65 20 61 6c 6c 20 73 74 72 69  nts are all stri
53f0: 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68 65  ngs: call.** the
5400: 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20 54  m A, B, and C. T
5410: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 73  he result is als
5420: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
5430: 20 69 73 20 64 65 72 69 76 65 64 0a 2a 2a 20 66   is derived.** f
5440: 72 6f 6d 20 41 20 62 79 20 72 65 70 6c 61 63 69  rom A by replaci
5450: 6e 67 20 65 76 65 72 79 20 6f 63 63 75 72 61 6e  ng every occuran
5460: 63 65 20 6f 66 20 42 20 77 69 74 68 20 43 2e 20  ce of B with C. 
5470: 20 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20 6d 75   The match.** mu
5480: 73 74 20 62 65 20 65 78 61 63 74 2e 20 20 43 6f  st be exact.  Co
5490: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
54a0: 73 20 61 72 65 20 6e 6f 74 20 75 73 65 64 2e 0a  s are not used..
54b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
54c0: 65 70 6c 61 63 65 46 75 6e 63 28 0a 20 20 73 71  eplaceFunc(.  sq
54d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
54e0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
54f0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
5500: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5510: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5520: 68 61 72 20 2a 7a 53 74 72 3b 20 20 20 20 20 20  har *zStr;      
5530: 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 73    /* The input s
5540: 74 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63 6f 6e  tring A */.  con
5550: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
5560: 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20 2f   *zPattern;    /
5570: 2a 20 54 68 65 20 70 61 74 74 65 72 6e 20 73 74  * The pattern st
5580: 72 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f 6e 73  ring B */.  cons
5590: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
55a0: 2a 7a 52 65 70 3b 20 20 20 20 20 20 20 20 2f 2a  *zRep;        /*
55b0: 20 54 68 65 20 72 65 70 6c 61 63 65 6d 65 6e 74   The replacement
55c0: 20 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20 20 75   string C */.  u
55d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f  nsigned char *zO
55e0: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
55f0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 2a   /* The output *
5600: 2f 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20 20 20  /.  int nStr;   
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5620: 53 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a 2f 0a  Size of zStr */.
5630: 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20    int nPattern; 
5640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
5650: 7a 65 20 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a  ze of zPattern *
5660: 2f 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20 20 20  /.  int nRep;   
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5680: 53 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a 2f 0a  Size of zRep */.
5690: 20 20 69 36 34 20 6e 4f 75 74 3b 20 20 20 20 20    i64 nOut;     
56a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
56b0: 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 7a 4f  ximum size of zO
56c0: 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f 70  ut */.  int loop
56d0: 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  Limit;          
56e0: 20 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b 5d 20   /* Last zStr[] 
56f0: 74 68 61 74 20 6d 69 67 68 74 20 6d 61 74 63 68  that might match
5700: 20 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a 20   zPattern[] */. 
5710: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
5720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
5730: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a 20  p counters */.. 
5740: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33   assert( argc==3
5750: 20 29 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c   );.  zStr = sql
5760: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5770: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
5780: 7a 53 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  zStr==0 ) return
5790: 3b 0a 20 20 6e 53 74 72 20 3d 20 73 71 6c 69 74  ;.  nStr = sqlit
57a0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
57b0: 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[0]);.  asser
57c0: 74 28 20 7a 53 74 72 3d 3d 73 71 6c 69 74 65 33  t( zStr==sqlite3
57d0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
57e0: 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65  [0]) );  /* No e
57f0: 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a  ncoding change *
5800: 2f 0a 20 20 7a 50 61 74 74 65 72 6e 20 3d 20 73  /.  zPattern = s
5810: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5820: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66  t(argv[1]);.  if
5830: 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20 7c 7c  ( zPattern==0 ||
5840: 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 30 20   zPattern[0]==0 
5850: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 50 61 74  ) return;.  nPat
5860: 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  tern = sqlite3_v
5870: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
5880: 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  1]);.  assert( z
5890: 50 61 74 74 65 72 6e 3d 3d 73 71 6c 69 74 65 33  Pattern==sqlite3
58a0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
58b0: 5b 31 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65  [1]) );  /* No e
58c0: 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a  ncoding change *
58d0: 2f 0a 20 20 7a 52 65 70 20 3d 20 73 71 6c 69 74  /.  zRep = sqlit
58e0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
58f0: 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 52  gv[2]);.  if( zR
5900: 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ep==0 ) return;.
5910: 20 20 6e 52 65 70 20 3d 20 73 71 6c 69 74 65 33    nRep = sqlite3
5920: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
5930: 76 5b 32 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[2]);.  assert(
5940: 20 7a 52 65 70 3d 3d 73 71 6c 69 74 65 33 5f 76   zRep==sqlite3_v
5950: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32  alue_text(argv[2
5960: 5d 29 20 29 3b 0a 20 20 6e 4f 75 74 20 3d 20 6e  ]) );.  nOut = n
5970: 53 74 72 20 2b 20 31 3b 0a 20 20 61 73 73 65 72  Str + 1;.  asser
5980: 74 28 20 6e 4f 75 74 3c 53 51 4c 49 54 45 5f 4d  t( nOut<SQLITE_M
5990: 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 7a  AX_LENGTH );.  z
59a0: 4f 75 74 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c  Out = contextMal
59b0: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 69 36  loc(context, (i6
59c0: 34 29 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 7a  4)nOut);.  if( z
59d0: 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Out==0 ){.    re
59e0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 6f 6f 70  turn;.  }.  loop
59f0: 4c 69 6d 69 74 20 3d 20 6e 53 74 72 20 2d 20 6e  Limit = nStr - n
5a00: 50 61 74 74 65 72 6e 3b 20 20 0a 20 20 66 6f 72  Pattern;  .  for
5a10: 28 69 3d 6a 3d 30 3b 20 69 3c 3d 6c 6f 6f 70 4c  (i=j=0; i<=loopL
5a20: 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  imit; i++){.    
5a30: 69 66 28 20 7a 53 74 72 5b 69 5d 21 3d 7a 50 61  if( zStr[i]!=zPa
5a40: 74 74 65 72 6e 5b 30 5d 20 7c 7c 20 6d 65 6d 63  ttern[0] || memc
5a50: 6d 70 28 26 7a 53 74 72 5b 69 5d 2c 20 7a 50 61  mp(&zStr[i], zPa
5a60: 74 74 65 72 6e 2c 20 6e 50 61 74 74 65 72 6e 29  ttern, nPattern)
5a70: 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6a   ){.      zOut[j
5a80: 2b 2b 5d 20 3d 20 7a 53 74 72 5b 69 5d 3b 0a 20  ++] = zStr[i];. 
5a90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5aa0: 75 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20  u8 *zOld;.      
5ab0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
5ac0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
5ad0: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
5ae0: 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ;.      nOut += 
5af0: 6e 52 65 70 20 2d 20 6e 50 61 74 74 65 72 6e 3b  nRep - nPattern;
5b00: 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3e  .      if( nOut>
5b10: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
5b20: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
5b30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5b40: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5b50: 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29  _toobig(context)
5b60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5b70: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4f 75 74  3DbFree(db, zOut
5b80: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
5b90: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
5ba0: 20 7a 4f 6c 64 20 3d 20 7a 4f 75 74 3b 0a 20 20   zOld = zOut;.  
5bb0: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
5bc0: 65 33 5f 72 65 61 6c 6c 6f 63 28 7a 4f 75 74 2c  e3_realloc(zOut,
5bd0: 20 28 69 6e 74 29 6e 4f 75 74 29 3b 0a 20 20 20   (int)nOut);.   
5be0: 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29     if( zOut==0 )
5bf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5c00: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
5c10: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
5c20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
5c30: 46 72 65 65 28 64 62 2c 20 7a 4f 6c 64 29 3b 0a  Free(db, zOld);.
5c40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
5c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
5c60: 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a  mcpy(&zOut[j], z
5c70: 52 65 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20  Rep, nRep);.    
5c80: 20 20 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20    j += nRep;.   
5c90: 20 20 20 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e     i += nPattern
5ca0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
5cb0: 61 73 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69  assert( j+nStr-i
5cc0: 2b 31 3d 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65  +1==nOut );.  me
5cd0: 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26  mcpy(&zOut[j], &
5ce0: 7a 53 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29  zStr[i], nStr-i)
5cf0: 3b 0a 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20  ;.  j += nStr - 
5d00: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 3d  i;.  assert( j<=
5d10: 6e 4f 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a  nOut );.  zOut[j
5d20: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
5d30: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
5d40: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75  text, (char*)zOu
5d50: 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  t, j, sqlite3_fr
5d60: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  ee);.}../*.** Im
5d70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
5d80: 74 68 65 20 54 52 49 4d 28 29 2c 20 4c 54 52 49  the TRIM(), LTRI
5d90: 4d 28 29 2c 20 61 6e 64 20 52 54 52 49 4d 28 29  M(), and RTRIM()
5da0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54   functions..** T
5db0: 68 65 20 75 73 65 72 64 61 74 61 20 69 73 20 30  he userdata is 0
5dc0: 78 31 20 66 6f 72 20 6c 65 66 74 20 74 72 69 6d  x1 for left trim
5dd0: 2c 20 30 78 32 20 66 6f 72 20 72 69 67 68 74 20  , 0x2 for right 
5de0: 74 72 69 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f  trim, 0x3 for bo
5df0: 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  th..*/.static vo
5e00: 69 64 20 74 72 69 6d 46 75 6e 63 28 0a 20 20 73  id trimFunc(.  s
5e10: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5e20: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
5e30: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
5e40: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5e50: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5e60: 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20  char *zIn;      
5e70: 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69     /* Input stri
5e80: 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e  ng */.  const un
5e90: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 43 68  signed char *zCh
5ea0: 61 72 53 65 74 3b 20 20 20 20 2f 2a 20 53 65 74  arSet;    /* Set
5eb0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74   of characters t
5ec0: 6f 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20  o trim */.  int 
5ed0: 6e 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  nIn;            
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ef0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
5f00: 20 69 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69   in input */.  i
5f10: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 2f 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74 20   /* 1: trimleft 
5f40: 20 32 3a 20 74 72 69 6d 72 69 67 68 74 20 20 33   2: trimright  3
5f50: 3a 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20  : trim */.  int 
5f60: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f80: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
5f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5fa0: 20 2a 61 4c 65 6e 3b 20 20 20 20 20 20 20 20 20   *aLen;         
5fb0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
5fc0: 66 20 65 61 63 68 20 63 68 61 72 61 63 74 65 72  f each character
5fd0: 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a   in zCharSet */.
5fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5ff0: 2a 2a 61 7a 43 68 61 72 3b 20 20 20 20 20 20 20  **azChar;       
6000: 20 20 20 20 2f 2a 20 49 6e 64 69 76 69 64 75 61      /* Individua
6010: 6c 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  l characters in 
6020: 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e  zCharSet */.  in
6030: 74 20 6e 43 68 61 72 3b 20 20 20 20 20 20 20 20  t nChar;        
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
6060: 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72  racters in zChar
6070: 53 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71  Set */..  if( sq
6080: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6090: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
60a0: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_NULL ){.    re
60b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20  turn;.  }.  zIn 
60c0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
60d0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
60e0: 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65   if( zIn==0 ) re
60f0: 74 75 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71  turn;.  nIn = sq
6100: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6110: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73  s(argv[0]);.  as
6120: 73 65 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74  sert( zIn==sqlit
6130: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6140: 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  gv[0]) );.  if( 
6150: 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73  argc==1 ){.    s
6160: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
6170: 67 6e 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65  gned char lenOne
6180: 5b 5d 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20  [] = { 1 };.    
6190: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
61a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 7a 4f 6e  igned char *azOn
61b0: 65 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20 22  e[] = { (u8*)" "
61c0: 20 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d 20   };.    nChar = 
61d0: 31 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28 75  1;.    aLen = (u
61e0: 38 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61  8*)lenOne;.    a
61f0: 7a 43 68 61 72 20 3d 20 28 75 6e 73 69 67 6e 65  zChar = (unsigne
6200: 64 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b  d char **)azOne;
6210: 0a 20 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20  .    zCharSet = 
6220: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
6230: 7a 43 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74  zCharSet = sqlit
6240: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6250: 67 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20  gv[1]))==0 ){.  
6260: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
6270: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e{.    const uns
6280: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20  igned char *z;. 
6290: 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65     for(z=zCharSe
62a0: 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20  t, nChar=0; *z; 
62b0: 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20  nChar++){.      
62c0: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
62d0: 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (z);.    }.    i
62e0: 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20  f( nChar>0 ){.  
62f0: 20 20 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e      azChar = con
6300: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
6310: 78 74 2c 20 28 28 69 36 34 29 6e 43 68 61 72 29  xt, ((i64)nChar)
6320: 2a 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b  *(sizeof(char*)+
6330: 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  1));.      if( a
6340: 7a 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  zChar==0 ){.    
6350: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6360: 20 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d    }.      aLen =
6370: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
6380: 29 26 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b  )&azChar[nChar];
6390: 0a 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68  .      for(z=zCh
63a0: 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20  arSet, nChar=0; 
63b0: 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20  *z; nChar++){.  
63c0: 20 20 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68        azChar[nCh
63d0: 61 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ar] = (unsigned 
63e0: 63 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20  char *)z;.      
63f0: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
6400: 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 61  F8(z);.        a
6410: 4c 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 7a 20 2d  Len[nChar] = z -
6420: 20 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a   azChar[nChar];.
6430: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6440: 7d 0a 20 20 69 66 28 20 6e 43 68 61 72 3e 30 20  }.  if( nChar>0 
6450: 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 53  ){.    flags = S
6460: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
6470: 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  (sqlite3_user_da
6480: 74 61 28 63 6f 6e 74 65 78 74 29 29 3b 0a 20 20  ta(context));.  
6490: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 31 20    if( flags & 1 
64a0: 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
64b0: 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  nIn>0 ){.       
64c0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
64d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68    for(i=0; i<nCh
64e0: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
64f0: 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69      len = aLen[i
6500: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
6510: 20 6d 65 6d 63 6d 70 28 7a 49 6e 2c 20 61 7a 43   memcmp(zIn, azC
6520: 68 61 72 5b 69 5d 2c 20 6c 65 6e 29 3d 3d 30 20  har[i], len)==0 
6530: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
6540: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
6550: 3e 3d 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b  >=nChar ) break;
6560: 0a 20 20 20 20 20 20 20 20 7a 49 6e 20 2b 3d 20  .        zIn += 
6570: 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e  len;.        nIn
6580: 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d   -= len;.      }
6590: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
65a0: 6c 61 67 73 20 26 20 32 20 29 7b 0a 20 20 20 20  lags & 2 ){.    
65b0: 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29    while( nIn>0 )
65c0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
65d0: 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  n;.        for(i
65e0: 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
65f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
6600: 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20   = aLen[i];.    
6610: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e        if( len<=n
6620: 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 7a 49  In && memcmp(&zI
6630: 6e 5b 6e 49 6e 2d 6c 65 6e 5d 2c 61 7a 43 68 61  n[nIn-len],azCha
6640: 72 5b 69 5d 2c 6c 65 6e 29 3d 3d 30 20 29 20 62  r[i],len)==0 ) b
6650: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6660: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e          if( i>=n
6670: 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Char ) break;.  
6680: 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e        nIn -= len
6690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
66a0: 20 20 20 20 69 66 28 20 7a 43 68 61 72 53 65 74      if( zCharSet
66b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
66c0: 33 5f 66 72 65 65 28 61 7a 43 68 61 72 29 3b 0a  3_free(azChar);.
66d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
66e0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
66f0: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
6700: 7a 49 6e 2c 20 6e 49 6e 2c 20 53 51 4c 49 54 45  zIn, nIn, SQLITE
6710: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a  _TRANSIENT);.}..
6720: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f  #ifdef SQLITE_SO
6730: 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  UNDEX./*.** Comp
6740: 75 74 65 20 74 68 65 20 73 6f 75 6e 64 65 78 20  ute the soundex 
6750: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 77 6f  encoding of a wo
6760: 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rd..*/.static vo
6770: 69 64 20 73 6f 75 6e 64 65 78 46 75 6e 63 28 0a  id soundexFunc(.
6780: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6790: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
67a0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
67b0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
67c0: 7b 0a 20 20 63 68 61 72 20 7a 52 65 73 75 6c 74  {.  char zResult
67d0: 5b 38 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  [8];.  const u8 
67e0: 2a 7a 49 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  *zIn;.  int i, j
67f0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
6800: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
6810: 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30  Code[] = {.    0
6820: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6830: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6840: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
6850: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
6860: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6870: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6880: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,.    0, 0, 0, 
6890: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
68a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
68b0: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
68c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
68d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
68e0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
68f0: 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c  , 0, 1, 2, 3, 0,
6900: 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20   1, 2, 0, 0, 2, 
6910: 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20  2, 4, 5, 5, 0,. 
6920: 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33     1, 2, 6, 2, 3
6930: 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 1, 0, 2, 0,
6940: 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   2, 0, 0, 0, 0, 
6950: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20  0,.    0, 0, 1, 
6960: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30  2, 3, 0, 1, 2, 0
6970: 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c  , 0, 2, 2, 4, 5,
6980: 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c   5, 0,.    1, 2,
6990: 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   6, 2, 3, 0, 1, 
69a0: 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30  0, 2, 0, 2, 0, 0
69b0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a  , 0, 0, 0,.  };.
69c0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
69d0: 31 20 29 3b 0a 20 20 7a 49 6e 20 3d 20 28 75 38  1 );.  zIn = (u8
69e0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
69f0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
6a00: 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 7a 49   if( zIn==0 ) zI
6a10: 6e 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20 20 66  n = (u8*)"";.  f
6a20: 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26  or(i=0; zIn[i] &
6a30: 26 20 21 69 73 61 6c 70 68 61 28 7a 49 6e 5b 69  & !isalpha(zIn[i
6a40: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  ]); i++){}.  if(
6a50: 20 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75   zIn[i] ){.    u
6a60: 38 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43 6f  8 prevcode = iCo
6a70: 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b  de[zIn[i]&0x7f];
6a80: 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20  .    zResult[0] 
6a90: 3d 20 74 6f 75 70 70 65 72 28 7a 49 6e 5b 69 5d  = toupper(zIn[i]
6aa0: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  );.    for(j=1; 
6ab0: 6a 3c 34 20 26 26 20 7a 49 6e 5b 69 5d 3b 20 69  j<4 && zIn[i]; i
6ac0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ++){.      int c
6ad0: 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b  ode = iCode[zIn[
6ae0: 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 20 20  i]&0x7f];.      
6af0: 69 66 28 20 63 6f 64 65 3e 30 20 29 7b 0a 20 20  if( code>0 ){.  
6b00: 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 21 3d        if( code!=
6b10: 70 72 65 76 63 6f 64 65 20 29 7b 0a 20 20 20 20  prevcode ){.    
6b20: 20 20 20 20 20 20 70 72 65 76 63 6f 64 65 20 3d        prevcode =
6b30: 20 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20   code;.         
6b40: 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20   zResult[j++] = 
6b50: 63 6f 64 65 20 2b 20 27 30 27 3b 0a 20 20 20 20  code + '0';.    
6b60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6b70: 65 7b 0a 20 20 20 20 20 20 20 20 70 72 65 76 63  e{.        prevc
6b80: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ode = 0;.      }
6b90: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
6ba0: 28 20 6a 3c 34 20 29 7b 0a 20 20 20 20 20 20 7a  ( j<4 ){.      z
6bb0: 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30  Result[j++] = '0
6bc0: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65  ';.    }.    zRe
6bd0: 73 75 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  sult[j] = 0;.   
6be0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6bf0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52  text(context, zR
6c00: 65 73 75 6c 74 2c 20 34 2c 20 53 51 4c 49 54 45  esult, 4, SQLITE
6c10: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
6c20: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6c30: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
6c40: 6e 74 65 78 74 2c 20 22 3f 30 30 30 22 2c 20 34  ntext, "?000", 4
6c50: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
6c60: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
6c70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6c80: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
6c90: 4f 4e 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63 74  ON./*.** A funct
6ca0: 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 73 20 61  ion that loads a
6cb0: 20 73 68 61 72 65 64 2d 6c 69 62 72 61 72 79 20   shared-library 
6cc0: 65 78 74 65 6e 73 69 6f 6e 20 74 68 65 6e 20 72  extension then r
6cd0: 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  eturns NULL..*/.
6ce0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61 64  static void load
6cf0: 45 78 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  Ext(sqlite3_cont
6d00: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
6d10: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
6d20: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
6d30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
6d40: 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
6d50: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
6d60: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
6d70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
6d80: 72 6f 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  roc;.  sqlite3 *
6d90: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
6da0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
6db0: 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72 20  ontext);.  char 
6dc0: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  *zErrMsg = 0;.. 
6dd0: 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a   if( argc==2 ){.
6de0: 20 20 20 20 7a 50 72 6f 63 20 3d 20 28 63 6f 6e      zProc = (con
6df0: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
6e00: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6e10: 76 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v[1]);.  }else{.
6e20: 20 20 20 20 7a 50 72 6f 63 20 3d 20 30 3b 0a 20      zProc = 0;. 
6e30: 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 20 26   }.  if( zFile &
6e40: 26 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  & sqlite3_load_e
6e50: 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69  xtension(db, zFi
6e60: 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72  le, zProc, &zErr
6e70: 4d 73 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Msg) ){.    sqli
6e80: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6e90: 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 4d 73  (context, zErrMs
6ea0: 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  g, -1);.    sqli
6eb0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
6ec0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
6ed0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
6ee0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
6ef0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 68  wing structure h
6f00: 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74 65 78 74  olds the context
6f10: 20 6f 66 20 61 0a 2a 2a 20 73 75 6d 28 29 20 6f   of a.** sum() o
6f20: 72 20 61 76 67 28 29 20 61 67 67 72 65 67 61 74  r avg() aggregat
6f30: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a  e computation..*
6f40: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
6f50: 20 53 75 6d 43 74 78 20 53 75 6d 43 74 78 3b 0a   SumCtx SumCtx;.
6f60: 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 7b 0a  struct SumCtx {.
6f70: 20 20 64 6f 75 62 6c 65 20 72 53 75 6d 3b 20 20    double rSum;  
6f80: 20 20 20 20 2f 2a 20 46 6c 6f 61 74 69 6e 67 20      /* Floating 
6f90: 70 6f 69 6e 74 20 73 75 6d 20 2a 2f 0a 20 20 69  point sum */.  i
6fa0: 36 34 20 69 53 75 6d 3b 20 20 20 20 20 20 20 20  64 iSum;        
6fb0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 73 75 6d 20   /* Integer sum 
6fc0: 2a 2f 20 20 20 0a 20 20 69 36 34 20 63 6e 74 3b  */   .  i64 cnt;
6fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6fe0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
6ff0: 73 75 6d 6d 65 64 20 2a 2f 0a 20 20 75 38 20 6f  summed */.  u8 o
7000: 76 65 72 66 6c 6f 77 3b 20 20 20 20 20 20 2f 2a  verflow;      /*
7010: 20 54 72 75 65 20 69 66 20 69 6e 74 65 67 65 72   True if integer
7020: 20 6f 76 65 72 66 6c 6f 77 20 73 65 65 6e 20 2a   overflow seen *
7030: 2f 0a 20 20 75 38 20 61 70 70 72 6f 78 3b 20 20  /.  u8 approx;  
7040: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7050: 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 76 61 6c   non-integer val
7060: 75 65 20 77 61 73 20 69 6e 70 75 74 20 74 6f 20  ue was input to 
7070: 74 68 65 20 73 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f  the sum */.};../
7080: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 75 73  *.** Routines us
7090: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
70a0: 65 20 73 75 6d 2c 20 61 76 65 72 61 67 65 2c 20  e sum, average, 
70b0: 61 6e 64 20 74 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a  and total..**.**
70c0: 20 54 68 65 20 53 55 4d 28 29 20 66 75 6e 63 74   The SUM() funct
70d0: 69 6f 6e 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  ion follows the 
70e0: 28 62 72 6f 6b 65 6e 29 20 53 51 4c 20 73 74 61  (broken) SQL sta
70f0: 6e 64 61 72 64 20 77 68 69 63 68 20 6d 65 61 6e  ndard which mean
7100: 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 72 65 74  s.** that it ret
7110: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 69 74 20  urns NULL if it 
7120: 73 75 6d 73 20 6f 76 65 72 20 6e 6f 20 69 6e 70  sums over no inp
7130: 75 74 73 2e 20 20 54 4f 54 41 4c 20 72 65 74 75  uts.  TOTAL retu
7140: 72 6e 73 0a 2a 2a 20 30 2e 30 20 69 6e 20 74 68  rns.** 0.0 in th
7150: 61 74 20 63 61 73 65 2e 20 20 49 6e 20 61 64 64  at case.  In add
7160: 69 74 69 6f 6e 2c 20 54 4f 54 41 4c 20 61 6c 77  ition, TOTAL alw
7170: 61 79 73 20 72 65 74 75 72 6e 73 20 61 20 66 6c  ays returns a fl
7180: 6f 61 74 20 77 68 65 72 65 0a 2a 2a 20 53 55 4d  oat where.** SUM
7190: 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 61 6e   might return an
71a0: 20 69 6e 74 65 67 65 72 20 69 66 20 69 74 20 6e   integer if it n
71b0: 65 76 65 72 20 65 6e 63 6f 75 6e 74 65 72 73 20  ever encounters 
71c0: 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  a floating point
71d0: 0a 2a 2a 20 76 61 6c 75 65 2e 20 20 54 4f 54 41  .** value.  TOTA
71e0: 4c 20 6e 65 76 65 72 20 66 61 69 6c 73 2c 20 62  L never fails, b
71f0: 75 74 20 53 55 4d 20 6d 69 67 68 74 20 74 68 72  ut SUM might thr
7200: 6f 75 67 68 20 61 6e 20 65 78 63 65 70 74 69 6f  ough an exceptio
7210: 6e 20 69 66 0a 2a 2a 20 69 74 20 6f 76 65 72 66  n if.** it overf
7220: 6c 6f 77 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  lows an integer.
7230: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7240: 73 75 6d 53 74 65 70 28 73 71 6c 69 74 65 33 5f  sumStep(sqlite3_
7250: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
7260: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
7270: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
7280: 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a  ){.  SumCtx *p;.
7290: 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 61 73    int type;.  as
72a0: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
72b0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
72c0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
72d0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
72e0: 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  (*p));.  type = 
72f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75  sqlite3_value_nu
7300: 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76 5b  meric_type(argv[
7310: 30 5d 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0]);.  if( p && 
7320: 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  type!=SQLITE_NUL
7330: 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e 74 2b  L ){.    p->cnt+
7340: 2b 3b 0a 20 20 20 20 69 66 28 20 74 79 70 65 3d  +;.    if( type=
7350: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
7360: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 20 3d  ){.      i64 v =
7370: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
7380: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
7390: 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20       p->rSum += 
73a0: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d  v;.      if( (p-
73b0: 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76 65 72 66  >approx|p->overf
73c0: 6c 6f 77 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  low)==0 ){.     
73d0: 20 20 20 69 36 34 20 69 4e 65 77 53 75 6d 20 3d     i64 iNewSum =
73e0: 20 70 2d 3e 69 53 75 6d 20 2b 20 76 3b 0a 20 20   p->iSum + v;.  
73f0: 20 20 20 20 20 20 69 6e 74 20 73 31 20 3d 20 70        int s1 = p
7400: 2d 3e 69 53 75 6d 20 3e 3e 20 28 73 69 7a 65 6f  ->iSum >> (sizeo
7410: 66 28 69 36 34 29 2a 38 2d 31 29 3b 0a 20 20 20  f(i64)*8-1);.   
7420: 20 20 20 20 20 69 6e 74 20 73 32 20 3d 20 76 20       int s2 = v 
7430: 20 20 20 20 20 20 3e 3e 20 28 73 69 7a 65 6f 66        >> (sizeof
7440: 28 69 36 34 29 2a 38 2d 31 29 3b 0a 20 20 20 20  (i64)*8-1);.    
7450: 20 20 20 20 69 6e 74 20 73 33 20 3d 20 69 4e 65      int s3 = iNe
7460: 77 53 75 6d 20 3e 3e 20 28 73 69 7a 65 6f 66 28  wSum >> (sizeof(
7470: 69 36 34 29 2a 38 2d 31 29 3b 0a 20 20 20 20 20  i64)*8-1);.     
7480: 20 20 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 3d     p->overflow =
7490: 20 28 73 31 26 73 32 26 7e 73 33 29 20 7c 20 28   (s1&s2&~s3) | (
74a0: 7e 73 31 26 7e 73 32 26 73 33 29 3b 0a 20 20 20  ~s1&~s2&s3);.   
74b0: 20 20 20 20 20 70 2d 3e 69 53 75 6d 20 3d 20 69       p->iSum = i
74c0: 4e 65 77 53 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  NewSum;.      }.
74d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
74e0: 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69   p->rSum += sqli
74f0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
7500: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
7510: 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a   p->approx = 1;.
7520: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
7530: 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c  ic void sumFinal
7540: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
7550: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
7560: 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20   SumCtx *p;.  p 
7570: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
7580: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
7590: 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ext, 0);.  if( p
75a0: 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a   && p->cnt>0 ){.
75b0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 76 65 72 66      if( p->overf
75c0: 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  low ){.      sql
75d0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
75e0: 72 28 63 6f 6e 74 65 78 74 2c 22 69 6e 74 65 67  r(context,"integ
75f0: 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c 2d 31 29  er overflow",-1)
7600: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7610: 70 2d 3e 61 70 70 72 6f 78 20 29 7b 0a 20 20 20  p->approx ){.   
7620: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7630: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
7640: 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a 20 20 20 20  , p->rSum);.    
7650: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7660: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
7670: 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 53  4(context, p->iS
7680: 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  um);.    }.  }.}
7690: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 76 67  .static void avg
76a0: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
76b0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
76c0: 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b  t){.  SumCtx *p;
76d0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
76e0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
76f0: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
7700: 69 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e  if( p && p->cnt>
7710: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7720: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
7730: 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d 2f  ontext, p->rSum/
7740: 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b  (double)p->cnt);
7750: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
7760: 69 64 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65  id totalFinalize
7770: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7780: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
7790: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
77a0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
77b0: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
77c0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
77d0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
77e0: 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 72 53  ntext, p ? p->rS
77f0: 75 6d 20 3a 20 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a  um : 0.0);.}../*
7800: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
7810: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
7820: 73 20 74 72 61 63 6b 20 6f 66 20 73 74 61 74 65  s track of state
7830: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
7840: 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20   the.** count() 
7850: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
7860: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
7870: 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 43  truct CountCtx C
7880: 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20  ountCtx;.struct 
7890: 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 36 34  CountCtx {.  i64
78a0: 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f   n;.};../*.** Ro
78b0: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
78c0: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 28 29 20  ent the count() 
78d0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
78e0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
78f0: 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73 71 6c  id countStep(sql
7900: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7910: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
7920: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7930: 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43  *argv){.  CountC
7940: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
7950: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
7960: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
7970: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
7980: 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53  f( (argc==0 || S
7990: 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69  QLITE_NULL!=sqli
79a0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
79b0: 72 67 76 5b 30 5d 29 29 20 26 26 20 70 20 29 7b  rgv[0])) && p ){
79c0: 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d  .    p->n++;.  }
79d0: 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69  .}   .static voi
79e0: 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28  d countFinalize(
79f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7a00: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75  *context){.  Cou
7a10: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
7a20: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
7a30: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
7a40: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
7a50: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
7a60: 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20  ntext, p ? p->n 
7a70: 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  : 0);.}../*.** R
7a80: 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65  outines to imple
7a90: 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64 20 6d  ment min() and m
7aa0: 61 78 28 29 20 61 67 67 72 65 67 61 74 65 20 66  ax() aggregate f
7ab0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  unctions..*/.sta
7ac0: 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78 53  tic void minmaxS
7ad0: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
7ae0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
7af0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
7b00: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
7b10: 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d   Mem *pArg  = (M
7b20: 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20  em *)argv[0];.  
7b30: 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 0a 20 20 69  Mem *pBest;..  i
7b40: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
7b50: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
7b60: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
7b70: 74 75 72 6e 3b 0a 20 20 70 42 65 73 74 20 3d 20  turn;.  pBest = 
7b80: 28 4d 65 6d 20 2a 29 73 71 6c 69 74 65 33 5f 61  (Mem *)sqlite3_a
7b90: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
7ba0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
7bb0: 28 2a 70 42 65 73 74 29 29 3b 0a 20 20 69 66 28  (*pBest));.  if(
7bc0: 20 21 70 42 65 73 74 20 29 20 72 65 74 75 72 6e   !pBest ) return
7bd0: 3b 0a 0a 20 20 69 66 28 20 70 42 65 73 74 2d 3e  ;..  if( pBest->
7be0: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 6e 74  flags ){.    int
7bf0: 20 6d 61 78 3b 0a 20 20 20 20 69 6e 74 20 63 6d   max;.    int cm
7c00: 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  p;.    CollSeq *
7c10: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
7c20: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f  etFuncCollSeq(co
7c30: 6e 74 65 78 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ntext);.    /* T
7c40: 68 69 73 20 73 74 65 70 20 66 75 6e 63 74 69 6f  his step functio
7c50: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 62 6f  n is used for bo
7c60: 74 68 20 74 68 65 20 6d 69 6e 28 29 20 61 6e 64  th the min() and
7c70: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
7c80: 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e  s,.    ** the on
7c90: 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  ly difference be
7ca0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 65  tween the two be
7cb0: 69 6e 67 20 74 68 61 74 20 74 68 65 20 73 65 6e  ing that the sen
7cc0: 73 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  se of the.    **
7cd0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 69   comparison is i
7ce0: 6e 76 65 72 74 65 64 2e 20 46 6f 72 20 74 68 65  nverted. For the
7cf0: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
7d00: 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  , the.    ** sql
7d10: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 29  ite3_user_data()
7d20: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
7d30: 73 20 28 76 6f 69 64 20 2a 29 2d 31 2e 20 46 6f  s (void *)-1. Fo
7d40: 72 20 6d 69 6e 28 29 20 69 74 0a 20 20 20 20 2a  r min() it.    *
7d50: 2a 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20  * returns (void 
7d60: 2a 29 64 62 2c 20 77 68 65 72 65 20 64 62 20 69  *)db, where db i
7d70: 73 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 64  s the sqlite3* d
7d80: 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 2e  atabase pointer.
7d90: 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 66 6f 72  .    ** Therefor
7da0: 65 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  e the next state
7db0: 6d 65 6e 74 20 73 65 74 73 20 76 61 72 69 61 62  ment sets variab
7dc0: 6c 65 20 27 6d 61 78 27 20 74 6f 20 31 20 66 6f  le 'max' to 1 fo
7dd0: 72 20 74 68 65 20 6d 61 78 28 29 0a 20 20 20 20  r the max().    
7de0: 2a 2a 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72  ** aggregate, or
7df0: 20 30 20 66 6f 72 20 6d 69 6e 28 29 2e 0a 20 20   0 for min()..  
7e00: 20 20 2a 2f 0a 20 20 20 20 6d 61 78 20 3d 20 73    */.    max = s
7e10: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
7e20: 28 63 6f 6e 74 65 78 74 29 21 3d 30 3b 0a 20 20  (context)!=0;.  
7e30: 20 20 63 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d    cmp = sqlite3M
7e40: 65 6d 43 6f 6d 70 61 72 65 28 70 42 65 73 74 2c  emCompare(pBest,
7e50: 20 70 41 72 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20   pArg, pColl);. 
7e60: 20 20 20 69 66 28 20 28 6d 61 78 20 26 26 20 63     if( (max && c
7e70: 6d 70 3c 30 29 20 7c 7c 20 28 21 6d 61 78 20 26  mp<0) || (!max &
7e80: 26 20 63 6d 70 3e 30 29 20 29 7b 0a 20 20 20 20  & cmp>0) ){.    
7e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
7ea0: 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72 67  Copy(pBest, pArg
7eb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
7ec0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
7ed0: 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20  eMemCopy(pBest, 
7ee0: 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  pArg);.  }.}.sta
7ef0: 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46  tic void minMaxF
7f00: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
7f10: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
7f20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ){.  sqlite3_val
7f30: 75 65 20 2a 70 52 65 73 3b 0a 20 20 70 52 65 73  ue *pRes;.  pRes
7f40: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75   = (sqlite3_valu
7f50: 65 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  e *)sqlite3_aggr
7f60: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
7f70: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28  ntext, 0);.  if(
7f80: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 69 66 28   pRes ){.    if(
7f90: 20 70 52 65 73 2d 3e 66 6c 61 67 73 20 29 7b 0a   pRes->flags ){.
7fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7fb0: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
7fc0: 78 74 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  xt, pRes);.    }
7fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7fe0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65 73 29  MemRelease(pRes)
7ff0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67  ;.  }.}../*.** g
8000: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 45 58 50 52  roup_concat(EXPR
8010: 2c 20 3f 53 45 50 41 52 41 54 4f 52 3f 29 0a 2a  , ?SEPARATOR?).*
8020: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72  /.static void gr
8030: 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 28 0a 20  oupConcatStep(. 
8040: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8050: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
8060: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
8070: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
8080: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8090: 56 61 6c 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  Val;.  StrAccum 
80a0: 2a 70 41 63 63 75 6d 3b 0a 20 20 63 6f 6e 73 74  *pAccum;.  const
80b0: 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 69   char *zSep;.  i
80c0: 6e 74 20 6e 56 61 6c 2c 20 6e 53 65 70 2c 20 69  nt nVal, nSep, i
80d0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20  ;.  if( argc==0 
80e0: 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  || sqlite3_value
80f0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
8100: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
8110: 74 75 72 6e 3b 0a 20 20 70 41 63 63 75 6d 20 3d  turn;.  pAccum =
8120: 20 28 53 74 72 41 63 63 75 6d 2a 29 73 71 6c 69   (StrAccum*)sqli
8130: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
8140: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
8150: 69 7a 65 6f 66 28 2a 70 41 63 63 75 6d 29 29 3b  izeof(*pAccum));
8160: 0a 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20 29  ..  if( pAccum )
8170: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
8180: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
8190: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
81a0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 70 41 63 63  ntext);.    pAcc
81b0: 75 6d 2d 3e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20  um->useMalloc = 
81c0: 31 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 6d  1;.    pAccum->m
81d0: 78 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c 69  xAlloc = db->aLi
81e0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
81f0: 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 69 66  _LENGTH];.    if
8200: 28 20 70 41 63 63 75 6d 2d 3e 6e 43 68 61 72 20  ( pAccum->nChar 
8210: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72 67  ){.      if( arg
8220: 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  c>1 ){.        z
8230: 53 65 70 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  Sep = (char*)sql
8240: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8250: 61 72 67 76 5b 61 72 67 63 2d 31 5d 29 3b 0a 20  argv[argc-1]);. 
8260: 20 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 71         nSep = sq
8270: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8280: 73 28 61 72 67 76 5b 61 72 67 63 2d 31 5d 29 3b  s(argv[argc-1]);
8290: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
82a0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22        zSep = ","
82b0: 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70 20 3d  ;.        nSep =
82c0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
82d0: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
82e0: 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20  mAppend(pAccum, 
82f0: 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20 20 20  zSep, nSep);.   
8300: 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20   }.    i = 0;.  
8310: 20 20 64 6f 7b 0a 20 20 20 20 20 20 7a 56 61 6c    do{.      zVal
8320: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
8330: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8340: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6e 56 61  v[i]);.      nVa
8350: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
8360: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 69 5d 29  e_bytes(argv[i])
8370: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
8380: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41  trAccumAppend(pA
8390: 63 63 75 6d 2c 20 7a 56 61 6c 2c 20 6e 56 61 6c  ccum, zVal, nVal
83a0: 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  );.      i++;.  
83b0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 61 72 67 63    }while( i<argc
83c0: 2d 31 20 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  -1 );.  }.}.stat
83d0: 69 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e  ic void groupCon
83e0: 63 61 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  catFinalize(sqli
83f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
8400: 74 65 78 74 29 7b 0a 20 20 53 74 72 41 63 63 75  text){.  StrAccu
8410: 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 70 41 63  m *pAccum;.  pAc
8420: 63 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 61 67  cum = sqlite3_ag
8430: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
8440: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
8450: 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20  f( pAccum ){.   
8460: 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 74 6f 6f   if( pAccum->too
8470: 42 69 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Big ){.      sql
8480: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8490: 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74  r_toobig(context
84a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
84b0: 20 70 41 63 63 75 6d 2d 3e 6d 61 6c 6c 6f 63 46   pAccum->mallocF
84c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
84d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
84e0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
84f0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20  t);.    }else{  
8500: 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33    .      sqlite3
8510: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
8520: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53 74 72  text, sqlite3Str
8530: 41 63 63 75 6d 46 69 6e 69 73 68 28 70 41 63 63  AccumFinish(pAcc
8540: 75 6d 29 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  um), -1, .      
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8570: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
8580: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
8590: 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 61  ion registered a
85a0: 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
85b0: 43 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 53  C functions as S
85c0: 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e  QL.** functions.
85d0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
85e0: 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e   the only routin
85f0: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 77  e in this file w
8600: 69 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20  ith.** external 
8610: 6c 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  linkage..*/.void
8620: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
8630: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
8640: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
8650: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8660: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
8670: 73 71 6c 69 74 65 33 41 6c 74 65 72 46 75 6e 63  sqlite3AlterFunc
8680: 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69  tions(db);.#endi
8690: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
86a0: 5f 4f 4d 49 54 5f 50 41 52 53 45 52 0a 20 20 73  _OMIT_PARSER.  s
86b0: 71 6c 69 74 65 33 41 74 74 61 63 68 46 75 6e 63  qlite3AttachFunc
86c0: 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69  tions(db);.#endi
86d0: 66 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  f.  if( !db->mal
86e0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
86f0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
8700: 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
8710: 69 6f 6e 28 64 62 2c 20 22 4d 41 54 43 48 22 2c  ion(db, "MATCH",
8720: 20 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   2);.    assert(
8730: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
8740: 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  M || rc==SQLITE_
8750: 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OK );.    if( rc
8760: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
8770: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  {.      db->mall
8780: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
8790: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
87a0: 51 4c 49 54 45 5f 53 53 45 0a 20 20 28 76 6f 69  QLITE_SSE.  (voi
87b0: 64 29 73 71 6c 69 74 65 33 53 73 65 46 75 6e 63  d)sqlite3SseFunc
87c0: 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69  tions(db);.#endi
87d0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  f.}../*.** Set t
87e0: 68 65 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67 20  he LIKEOPT flag 
87f0: 6f 6e 20 74 68 65 20 32 2d 61 72 67 75 6d 65 6e  on the 2-argumen
8800: 74 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  t function with 
8810: 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a  the given name..
8820: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
8830: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73 71  etLikeOptFlag(sq
8840: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
8850: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
8860: 74 20 66 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75  t flagVal){.  Fu
8870: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 70  ncDef *pDef;.  p
8880: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
8890: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
88a0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
88b0: 65 29 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  e), 2, SQLITE_UT
88c0: 46 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 44  F8, 0);.  if( pD
88d0: 65 66 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e  ef ){.    pDef->
88e0: 66 6c 61 67 73 20 3d 20 66 6c 61 67 56 61 6c 3b  flags = flagVal;
88f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
8900: 67 69 73 74 65 72 20 74 68 65 20 62 75 69 6c 74  gister the built
8910: 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f  -in LIKE and GLO
8920: 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  B functions.  Th
8930: 65 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 0a  e caseSensitive.
8940: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  ** parameter det
8950: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
8960: 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49 4b 45 20  or not the LIKE 
8970: 6f 70 65 72 61 74 6f 72 20 69 73 20 63 61 73 65  operator is case
8980: 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65 2e 20 20  .** sensitive.  
8990: 47 4c 4f 42 20 69 73 20 61 6c 77 61 79 73 20 63  GLOB is always c
89a0: 61 73 65 20 73 65 6e 73 69 74 69 76 65 2e 0a 2a  ase sensitive..*
89b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
89c0: 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69  gisterLikeFuncti
89d0: 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ons(sqlite3 *db,
89e0: 20 69 6e 74 20 63 61 73 65 53 65 6e 73 69 74 69   int caseSensiti
89f0: 76 65 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  ve){.  struct co
8a00: 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f  mpareInfo *pInfo
8a10: 3b 0a 20 20 69 66 28 20 63 61 73 65 53 65 6e 73  ;.  if( caseSens
8a20: 69 74 69 76 65 20 29 7b 0a 20 20 20 20 70 49 6e  itive ){.    pIn
8a30: 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d  fo = (struct com
8a40: 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49  pareInfo*)&likeI
8a50: 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b  nfoAlt;.  }else{
8a60: 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73 74  .    pInfo = (st
8a70: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
8a80: 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 3b  *)&likeInfoNorm;
8a90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 72  .  }.  sqlite3Cr
8aa0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 6c 69  eateFunc(db, "li
8ab0: 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  ke", 2, SQLITE_U
8ac0: 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65  TF8, pInfo, like
8ad0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73  Func, 0, 0);.  s
8ae0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
8af0: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 33 2c 20  (db, "like", 3, 
8b00: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e  SQLITE_UTF8, pIn
8b10: 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c  fo, likeFunc, 0,
8b20: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72   0);.  sqlite3Cr
8b30: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 67 6c  eateFunc(db, "gl
8b40: 6f 62 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  ob", 2, SQLITE_U
8b50: 54 46 38 2c 20 0a 20 20 20 20 20 20 28 73 74 72  TF8, .      (str
8b60: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a  uct compareInfo*
8b70: 29 26 67 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65  )&globInfo, like
8b80: 46 75 6e 63 2c 20 30 2c 30 29 3b 0a 20 20 73 65  Func, 0,0);.  se
8b90: 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c  tLikeOptFlag(db,
8ba0: 20 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f   "glob", SQLITE_
8bb0: 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49  FUNC_LIKE | SQLI
8bc0: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20  TE_FUNC_CASE);. 
8bd0: 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28   setLikeOptFlag(
8be0: 64 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20  db, "like", .   
8bf0: 20 20 20 63 61 73 65 53 65 6e 73 69 74 69 76 65     caseSensitive
8c00: 20 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ? (SQLITE_FUNC_
8c10: 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55  LIKE | SQLITE_FU
8c20: 4e 43 5f 43 41 53 45 29 20 3a 20 53 51 4c 49 54  NC_CASE) : SQLIT
8c30: 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a  E_FUNC_LIKE);.}.
8c40: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69  ./*.** pExpr poi
8c50: 6e 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65 73  nts to an expres
8c60: 73 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c 65  sion which imple
8c70: 6d 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f 6e  ments a function
8c80: 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 61  .  If.** it is a
8c90: 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61 70  ppropriate to ap
8ca0: 70 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  ply the LIKE opt
8cb0: 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61  imization to tha
8cc0: 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68  t function.** th
8cd0: 65 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74 68  en set aWc[0] th
8ce0: 72 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f 20  rough aWc[2] to 
8cf0: 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68 61  the wildcard cha
8d00: 72 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20 72  racters and.** r
8d10: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
8d20: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
8d30: 6e 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c 65  not a LIKE-style
8d40: 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a 2a   function then.*
8d50: 2a 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  * return FALSE..
8d60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
8d70: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c  LikeFunction(sql
8d80: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
8d90: 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73 4e  pExpr, int *pIsN
8da0: 6f 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57 63  ocase, char *aWc
8db0: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44  ){.  FuncDef *pD
8dc0: 65 66 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  ef;.  if( pExpr-
8dd0: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
8de0: 20 7c 7c 20 21 70 45 78 70 72 2d 3e 70 4c 69 73   || !pExpr->pLis
8df0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
8e00: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  0;.  }.  if( pEx
8e10: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
8e20: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
8e30: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 44 65 66 20  n 0;.  }.  pDef 
8e40: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
8e50: 63 74 69 6f 6e 28 64 62 2c 20 28 63 68 61 72 2a  ction(db, (char*
8e60: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
8e70: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
8e80: 20 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   2,.            
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
8eb0: 3b 0a 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20  ;.  if( pDef==0 
8ec0: 7c 7c 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  || (pDef->flags 
8ed0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  & SQLITE_FUNC_LI
8ee0: 4b 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  KE)==0 ){.    re
8ef0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
8f00: 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73  * The memcpy() s
8f10: 74 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73  tatement assumes
8f20: 20 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61   that the wildca
8f30: 72 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72  rd characters ar
8f40: 65 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  e.  ** the first
8f50: 20 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74   three statement
8f60: 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65  s in the compare
8f70: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
8f80: 20 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   The.  ** assert
8f90: 73 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  s() that follow 
8fa0: 76 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75  verify that assu
8fb0: 6d 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65  mption.  */.  me
8fc0: 6d 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e  mcpy(aWc, pDef->
8fd0: 70 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20  pUserData, 3);. 
8fe0: 20 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29   assert( (char*)
8ff0: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20  &likeInfoAlt == 
9000: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
9010: 41 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a  Alt.matchAll );.
9020: 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61    assert( &((cha
9030: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29  r*)&likeInfoAlt)
9040: 5b 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c  [1] == (char*)&l
9050: 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68  ikeInfoAlt.match
9060: 4f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  One );.  assert(
9070: 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49   &((char*)&likeI
9080: 6e 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63  nfoAlt)[2] == (c
9090: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
90a0: 74 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20  t.matchSet );.  
90b0: 2a 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44  *pIsNocase = (pD
90c0: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
90d0: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30  TE_FUNC_CASE)==0
90e0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
90f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
9100: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
9110: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
9120: 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  res for all of t
9130: 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  he functions.** 
9140: 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
9150: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
9160: 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20  array cannot be 
9170: 63 6f 6e 73 74 61 6e 74 20 73 69 6e 63 65 20 63  constant since c
9180: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
9190: 74 6f 20 74 68 65 0a 2a 2a 20 46 75 6e 63 44 65  to the.** FuncDe
91a0: 66 2e 70 48 61 73 68 20 65 6c 65 6d 65 6e 74 73  f.pHash elements
91b0: 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 2e 20   at start-time. 
91c0: 20 54 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   The elements of
91d0: 20 74 68 69 73 20 61 72 72 61 79 0a 2a 2a 20 61   this array.** a
91e0: 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
91f0: 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  er initializatio
9200: 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a  n is complete..*
9210: 2f 0a 73 74 61 74 69 63 20 46 75 6e 63 44 65 66  /.static FuncDef
9220: 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20   aBuiltinFunc[] 
9230: 3d 20 7b 0a 20 20 46 55 4e 43 54 49 4f 4e 28 6c  = {.  FUNCTION(l
9240: 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20  trim,           
9250: 20 20 20 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d     1, 1, 0, trim
9260: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
9270: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d    FUNCTION(ltrim
9280: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ,              2
9290: 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 1, 0, trimFunc
92a0: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 46 55           ),.  FU
92b0: 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20  NCTION(rtrim,   
92c0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 32 2c             1, 2,
92d0: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
92e0: 20 20 20 20 20 29 2c 0a 20 20 46 55 4e 43 54 49       ),.  FUNCTI
92f0: 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20  ON(rtrim,       
9300: 20 20 20 20 20 20 20 32 2c 20 32 2c 20 30 2c 20         2, 2, 0, 
9310: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
9320: 20 29 2c 0a 20 20 46 55 4e 43 54 49 4f 4e 28 74   ),.  FUNCTION(t
9330: 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rim,            
9340: 20 20 20 31 2c 20 33 2c 20 30 2c 20 74 72 69 6d     1, 3, 0, trim
9350: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
9360: 20 20 46 55 4e 43 54 49 4f 4e 28 74 72 69 6d 2c    FUNCTION(trim,
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
9380: 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 3, 0, trimFunc
9390: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 46 55           ),.  FU
93a0: 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20 20 20 20  NCTION(min,     
93b0: 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c            -1, 0,
93c0: 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 20   1, minmaxFunc  
93d0: 20 20 20 20 20 29 2c 0a 20 20 46 55 4e 43 54 49       ),.  FUNCTI
93e0: 4f 4e 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20  ON(min,         
93f0: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 31 2c 20         0, 0, 1, 
9400: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
9410: 20 29 2c 0a 20 20 41 47 47 52 45 47 41 54 45 28   ),.  AGGREGATE(
9420: 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  min,            
9430: 20 20 20 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d     1, 0, 1, minm
9440: 61 78 53 74 65 70 2c 20 20 20 20 20 20 6d 69 6e  axStep,      min
9450: 4d 61 78 46 69 6e 61 6c 69 7a 65 20 29 2c 0a 20  MaxFinalize ),. 
9460: 20 46 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20   FUNCTION(max,  
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
9480: 20 31 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e   1, 1, minmaxFun
9490: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 46 55 4e  c       ),.  FUN
94a0: 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20  CTION(max,      
94b0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20            0, 1, 
94c0: 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  1, 0            
94d0: 20 20 20 20 29 2c 0a 20 20 41 47 47 52 45 47 41      ),.  AGGREGA
94e0: 54 45 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20  TE(max,         
94f0: 20 20 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 6d        1, 1, 1, m
9500: 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 20 20 20  inmaxStep,      
9510: 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20 29  minMaxFinalize )
9520: 2c 0a 20 20 46 55 4e 43 54 49 4f 4e 28 74 79 70  ,.  FUNCTION(typ
9530: 65 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  eof,            
9540: 20 31 2c 20 30 2c 20 30 2c 20 74 79 70 65 6f 66   1, 0, 0, typeof
9550: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
9560: 46 55 4e 43 54 49 4f 4e 28 6c 65 6e 67 74 68 2c  FUNCTION(length,
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
9580: 30 2c 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63  0, 0, lengthFunc
9590: 20 20 20 20 20 20 20 29 2c 0a 20 20 46 55 4e 43         ),.  FUNC
95a0: 54 49 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20  TION(substr,    
95b0: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30           2, 0, 0
95c0: 2c 20 73 75 62 73 74 72 46 75 6e 63 20 20 20 20  , substrFunc    
95d0: 20 20 20 29 2c 0a 20 20 46 55 4e 43 54 49 4f 4e     ),.  FUNCTION
95e0: 28 73 75 62 73 74 72 2c 20 20 20 20 20 20 20 20  (substr,        
95f0: 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 73 75       3, 0, 0, su
9600: 62 73 74 72 46 75 6e 63 20 20 20 20 20 20 20 29  bstrFunc       )
9610: 2c 0a 20 20 46 55 4e 43 54 49 4f 4e 28 61 62 73  ,.  FUNCTION(abs
9620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9630: 20 31 2c 20 30 2c 20 30 2c 20 61 62 73 46 75 6e   1, 0, 0, absFun
9640: 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  c          ),.  
9650: 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20  FUNCTION(round, 
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
9670: 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20  0, 0, roundFunc 
9680: 20 20 20 20 20 20 20 29 2c 0a 20 20 46 55 4e 43         ),.  FUNC
9690: 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20 20 20  TION(round,     
96a0: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30           2, 0, 0
96b0: 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 20 20 20  , roundFunc     
96c0: 20 20 20 29 2c 0a 20 20 46 55 4e 43 54 49 4f 4e     ),.  FUNCTION
96d0: 28 75 70 70 65 72 2c 20 20 20 20 20 20 20 20 20  (upper,         
96e0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 70       1, 0, 0, up
96f0: 70 65 72 46 75 6e 63 20 20 20 20 20 20 20 20 29  perFunc        )
9700: 2c 0a 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77  ,.  FUNCTION(low
9710: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
9720: 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46   1, 0, 0, lowerF
9730: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20  unc        ),.  
9740: 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63  FUNCTION(coalesc
9750: 65 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  e,           1, 
9760: 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20 20  0, 0, 0         
9770: 20 20 20 20 20 20 20 29 2c 0a 20 20 46 55 4e 43         ),.  FUNC
9780: 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20  TION(coalesce,  
9790: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30          -1, 0, 0
97a0: 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20 20 20 20  , ifnullFunc    
97b0: 20 20 20 29 2c 0a 20 20 46 55 4e 43 54 49 4f 4e     ),.  FUNCTION
97c0: 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20  (coalesce,      
97d0: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 20       0, 0, 0, 0 
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
97f0: 2c 0a 20 20 46 55 4e 43 54 49 4f 4e 28 68 65 78  ,.  FUNCTION(hex
9800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9810: 20 31 2c 20 30 2c 20 30 2c 20 68 65 78 46 75 6e   1, 0, 0, hexFun
9820: 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  c          ),.  
9830: 46 55 4e 43 54 49 4f 4e 28 69 66 6e 75 6c 6c 2c  FUNCTION(ifnull,
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
9850: 30 2c 20 31 2c 20 69 66 6e 75 6c 6c 46 75 6e 63  0, 1, ifnullFunc
9860: 20 20 20 20 20 20 20 29 2c 0a 20 20 46 55 4e 43         ),.  FUNC
9870: 54 49 4f 4e 28 72 61 6e 64 6f 6d 2c 20 20 20 20  TION(random,    
9880: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30          -1, 0, 0
9890: 2c 20 72 61 6e 64 6f 6d 46 75 6e 63 20 20 20 20  , randomFunc    
98a0: 20 20 20 29 2c 0a 20 20 46 55 4e 43 54 49 4f 4e     ),.  FUNCTION
98b0: 28 72 61 6e 64 6f 6d 62 6c 6f 62 2c 20 20 20 20  (randomblob,    
98c0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 72 61       1, 0, 0, ra
98d0: 6e 64 6f 6d 42 6c 6f 62 20 20 20 20 20 20 20 29  ndomBlob       )
98e0: 2c 0a 20 20 46 55 4e 43 54 49 4f 4e 28 6e 75 6c  ,.  FUNCTION(nul
98f0: 6c 69 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  lif,            
9900: 20 32 2c 20 30 2c 20 31 2c 20 6e 75 6c 6c 69 66   2, 0, 1, nullif
9910: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
9920: 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f  FUNCTION(sqlite_
9930: 76 65 72 73 69 6f 6e 2c 20 20 20 20 20 30 2c 20  version,     0, 
9940: 30 2c 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e  0, 0, versionFun
9950: 63 20 20 20 20 20 20 29 2c 0a 20 20 46 55 4e 43  c      ),.  FUNC
9960: 54 49 4f 4e 28 71 75 6f 74 65 2c 20 20 20 20 20  TION(quote,     
9970: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
9980: 2c 20 71 75 6f 74 65 46 75 6e 63 20 20 20 20 20  , quoteFunc     
9990: 20 20 20 29 2c 0a 20 20 46 55 4e 43 54 49 4f 4e     ),.  FUNCTION
99a0: 28 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  (last_insert_row
99b0: 69 64 2c 20 20 30 2c 20 30 2c 20 30 2c 20 6c 61  id,  0, 0, 0, la
99c0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 29  st_insert_rowid)
99d0: 2c 0a 20 20 46 55 4e 43 54 49 4f 4e 28 63 68 61  ,.  FUNCTION(cha
99e0: 6e 67 65 73 2c 20 20 20 20 20 20 20 20 20 20 20  nges,           
99f0: 20 30 2c 20 30 2c 20 30 2c 20 63 68 61 6e 67 65   0, 0, 0, change
9a00: 73 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  s          ),.  
9a10: 46 55 4e 43 54 49 4f 4e 28 74 6f 74 61 6c 5f 63  FUNCTION(total_c
9a20: 68 61 6e 67 65 73 2c 20 20 20 20 20 20 30 2c 20  hanges,      0, 
9a30: 30 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61 6e  0, 0, total_chan
9a40: 67 65 73 20 20 20 20 29 2c 0a 20 20 46 55 4e 43  ges    ),.  FUNC
9a50: 54 49 4f 4e 28 72 65 70 6c 61 63 65 2c 20 20 20  TION(replace,   
9a60: 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20 30           3, 0, 0
9a70: 2c 20 72 65 70 6c 61 63 65 46 75 6e 63 20 20 20  , replaceFunc   
9a80: 20 20 20 29 2c 0a 20 20 46 55 4e 43 54 49 4f 4e     ),.  FUNCTION
9a90: 28 7a 65 72 6f 62 6c 6f 62 2c 20 20 20 20 20 20  (zeroblob,      
9aa0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 7a 65       1, 0, 0, ze
9ab0: 72 6f 62 6c 6f 62 46 75 6e 63 20 20 20 20 20 29  roblobFunc     )
9ac0: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
9ad0: 53 4f 55 4e 44 45 58 0a 20 20 46 55 4e 43 54 49  SOUNDEX.  FUNCTI
9ae0: 4f 4e 28 73 6f 75 6e 64 65 78 2c 20 20 20 20 20  ON(soundex,     
9af0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
9b00: 73 6f 75 6e 64 65 78 46 75 6e 63 20 20 20 20 20  soundexFunc     
9b10: 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   ),.#endif.#ifnd
9b20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
9b30: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
9b40: 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78  FUNCTION(load_ex
9b50: 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 31 2c 20  tension,     1, 
9b60: 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20  0, 0, loadExt   
9b70: 20 20 20 20 20 20 20 29 2c 0a 20 20 46 55 4e 43         ),.  FUNC
9b80: 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73  TION(load_extens
9b90: 69 6f 6e 2c 20 20 20 20 20 32 2c 20 30 2c 20 30  ion,     2, 0, 0
9ba0: 2c 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20 20  , loadExt       
9bb0: 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 41     ),.#endif.  A
9bc0: 47 47 52 45 47 41 54 45 28 73 75 6d 2c 20 20 20  GGREGATE(sum,   
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
9be0: 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20  , 0, sumStep,   
9bf0: 20 20 20 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a        sumFinaliz
9c00: 65 20 20 20 20 29 2c 0a 20 20 41 47 47 52 45 47  e    ),.  AGGREG
9c10: 41 54 45 28 74 6f 74 61 6c 2c 20 20 20 20 20 20  ATE(total,      
9c20: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
9c30: 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20  sumStep,        
9c40: 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 20 20   totalFinalize  
9c50: 20 20 29 2c 0a 20 20 41 47 47 52 45 47 41 54 45    ),.  AGGREGATE
9c60: 28 61 76 67 2c 20 20 20 20 20 20 20 20 20 20 20  (avg,           
9c70: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d      1, 0, 0, sum
9c80: 53 74 65 70 2c 20 20 20 20 20 20 20 20 20 61 76  Step,         av
9c90: 67 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a  gFinalize    ),.
9ca0: 20 20 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e    AGGREGATE(coun
9cb0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  t,             0
9cc0: 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65  , 0, 0, countSte
9cd0: 70 2c 20 20 20 20 20 20 20 63 6f 75 6e 74 46 69  p,       countFi
9ce0: 6e 61 6c 69 7a 65 20 20 29 2c 0a 20 20 41 47 47  nalize  ),.  AGG
9cf0: 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 20 20  REGATE(count,   
9d00: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
9d10: 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20  0, countStep,   
9d20: 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a      countFinaliz
9d30: 65 20 20 29 2c 0a 20 20 41 47 47 52 45 47 41 54  e  ),.  AGGREGAT
9d40: 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20  E(group_concat, 
9d50: 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 67 72      -1, 0, 0, gr
9d60: 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 2c 20 67  oupConcatStep, g
9d70: 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69  roupConcatFinali
9d80: 7a 65 29 2c 0a 0a 20 20 4c 49 4b 45 46 55 4e 43  ze),..  LIKEFUNC
9d90: 28 67 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f 62 49  (glob, 2, &globI
9da0: 6e 66 6f 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  nfo, SQLITE_FUNC
9db0: 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e  _LIKE|SQLITE_FUN
9dc0: 43 5f 43 41 53 45 29 2c 0a 23 69 66 64 65 66 20  C_CASE),.#ifdef 
9dd0: 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53  SQLITE_CASE_SENS
9de0: 49 54 49 56 45 5f 4c 49 4b 45 0a 20 20 4c 49 4b  ITIVE_LIKE.  LIK
9df0: 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26  EFUNC(like, 2, &
9e00: 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c  likeInfoAlt, SQL
9e10: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51  ITE_FUNC_LIKE|SQ
9e20: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c  LITE_FUNC_CASE),
9e30: 0a 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65  .  LIKEFUNC(like
9e40: 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c  , 3, &likeInfoAl
9e50: 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  t, SQLITE_FUNC_L
9e60: 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  IKE|SQLITE_FUNC_
9e70: 43 41 53 45 29 2c 0a 23 65 6c 73 65 0a 20 20 4c  CASE),.#else.  L
9e80: 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c  IKEFUNC(like, 2,
9e90: 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20   &likeInfoNorm, 
9ea0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
9eb0: 29 2c 0a 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69  ),.  LIKEFUNC(li
9ec0: 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f  ke, 3, &likeInfo
9ed0: 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e  Norm, SQLITE_FUN
9ee0: 43 5f 4c 49 4b 45 29 2c 0a 23 65 6e 64 69 66 0a  C_LIKE),.#endif.
9ef0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 61 6c  };../*.** All al
9f00: 6c 20 6f 66 20 74 68 65 20 46 75 6e 63 44 65 66  l of the FuncDef
9f10: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
9f20: 68 65 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b  he aBuiltinFunc[
9f30: 5d 20 61 72 72 61 79 20 61 62 6f 76 65 0a 2a 2a  ] array above.**
9f40: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 66   to the global f
9f50: 75 6e 63 74 69 6f 6e 20 68 61 73 68 20 74 61 62  unction hash tab
9f60: 6c 65 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  le.  This occurs
9f70: 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20 28   at start-time (
9f80: 61 73 0a 2a 2a 20 61 20 63 6f 6e 73 65 71 75 65  as.** a conseque
9f90: 6e 63 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20 73  nce of calling s
9fa0: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
9fb0: 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  e())..**.** Afte
9fc0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
9fd0: 75 6e 73 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  uns.*/.void sqli
9fe0: 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61  te3RegisterGloba
9ff0: 6c 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29  lFunctions(void)
a000: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
a010: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
a020: 65 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 3b  e(aBuiltinFunc);
a030: 20 69 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   i++){.    FuncD
a040: 65 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  efHash *pHash = 
a050: 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48  &GLOBAL(FuncDefH
a060: 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  ash, sqlite3Glob
a070: 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20  alFunctions);.  
a080: 20 20 73 71 6c 69 74 65 33 46 75 6e 63 44 65 66    sqlite3FuncDef
a090: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 26 61  Insert(pHash, &a
a0a0: 42 75 69 6c 74 69 6e 46 75 6e 63 5b 69 5d 29 3b  BuiltinFunc[i]);
a0b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
a0c0: 67 69 73 74 65 72 44 61 74 65 54 69 6d 65 46 75  gisterDateTimeFu
a0d0: 6e 63 74 69 6f 6e 73 28 29 3b 0a 7d 0a           nctions();.}.