/ Hex Artifact Content
Login

Artifact b4570eb73d873041b8e68f5cdbb4556ff13a94c3:


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 36 20 32 30 30 38 2f 31 31 2f 31 39  1.206 2008/11/19
02a0: 20 31 36 3a 35 32 3a 34 34 20 64 61 6e 69 65 6c   16:52:44 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 4e  context,.  int N
0700: 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65  otUsed,.  sqlite
0710: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
0720: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
0730: 7a 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  z = 0;.  UNUSED_
0740: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
0750: 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  d);.  switch( sq
0760: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
0770: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
0780: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
0790: 4c 3a 20 20 20 20 7a 20 3d 20 22 6e 75 6c 6c 22  L:    z = "null"
07a0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
07b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
07c0: 47 45 52 3a 20 7a 20 3d 20 22 69 6e 74 65 67 65  GER: z = "intege
07d0: 72 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  r"; break;.    c
07e0: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
07f0: 20 20 20 20 7a 20 3d 20 22 74 65 78 74 22 3b 20      z = "text"; 
0800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0810: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
0820: 20 20 20 7a 20 3d 20 22 72 65 61 6c 22 3b 20 20     z = "real";  
0830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0840: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 20  e SQLITE_BLOB:  
0850: 20 20 7a 20 3d 20 22 62 6c 6f 62 22 3b 20 20 20    z = "blob";   
0860: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71   break;.  }.  sq
0870: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
0880: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d 31  t(context, z, -1
0890: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
08a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
08b0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
08c0: 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e 63 74  e length() funct
08d0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
08e0: 69 64 20 6c 65 6e 67 74 68 46 75 6e 63 28 0a 20  id lengthFunc(. 
08f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
0900: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
0910: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
0920: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
0930: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61  .  int len;..  a
0940: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
0950: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
0960: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 73 77  ETER(argc);.  sw
0970: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
0980: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0990: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
09a0: 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 63  LITE_BLOB:.    c
09b0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
09c0: 45 52 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ER:.    case SQL
09d0: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
09e0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
09f0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
0a00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
0a10: 65 73 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20  es(argv[0]));.  
0a20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0a30: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0a40: 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63  _TEXT: {.      c
0a50: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
0a60: 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
0a70: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
0a80: 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  0]);.      if( z
0a90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
0aa0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20      len = 0;.   
0ab0: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
0ac0: 20 20 20 20 20 20 20 20 6c 65 6e 2b 2b 3b 0a 20          len++;. 
0ad0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b         SQLITE_SK
0ae0: 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20  IP_UTF8(z);.    
0af0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
0b00: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
0b10: 74 65 78 74 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  text, len);.    
0b20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0b30: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
0b40: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0b50: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
0b60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0b70: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0b80: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
0b90: 20 6f 66 20 74 68 65 20 61 62 73 28 29 20 66 75   of the abs() fu
0ba0: 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  nction.*/.static
0bb0: 20 76 6f 69 64 20 61 62 73 46 75 6e 63 28 73 71   void absFunc(sq
0bc0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
0bd0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
0be0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
0bf0: 2a 2a 61 72 67 76 29 7b 0a 20 20 61 73 73 65 72  **argv){.  asser
0c00: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
0c10: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
0c20: 28 61 72 67 63 29 3b 0a 20 20 73 77 69 74 63 68  (argc);.  switch
0c30: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
0c40: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
0c50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0c60: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
0c70: 20 20 69 36 34 20 69 56 61 6c 20 3d 20 73 71 6c    i64 iVal = sql
0c80: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
0c90: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
0ca0: 20 69 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20   if( iVal<0 ){. 
0cb0: 20 20 20 20 20 20 20 69 66 28 20 28 69 56 61 6c         if( (iVal
0cc0: 3c 3c 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  <<1)==0 ){.     
0cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
0ce0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
0cf0: 74 2c 20 22 69 6e 74 65 67 65 72 20 6f 76 65 72  t, "integer over
0d00: 66 6c 6f 77 22 2c 20 2d 31 29 3b 0a 20 20 20 20  flow", -1);.    
0d10: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
0d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0d30: 69 56 61 6c 20 3d 20 2d 69 56 61 6c 3b 0a 20 20  iVal = -iVal;.  
0d40: 20 20 20 20 7d 20 0a 20 20 20 20 20 20 73 71 6c      } .      sql
0d50: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
0d60: 34 28 63 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29  4(context, iVal)
0d70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0d80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
0d90: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
0da0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
0db0: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
0dc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0dd0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
0de0: 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20   {.      double 
0df0: 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  rVal = sqlite3_v
0e00: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
0e10: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [0]);.      if( 
0e20: 72 56 61 6c 3c 30 20 29 20 72 56 61 6c 20 3d 20  rVal<0 ) rVal = 
0e30: 2d 72 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c  -rVal;.      sql
0e40: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
0e50: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 56 61 6c  le(context, rVal
0e60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0e80: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
0e90: 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 28  n of the substr(
0ea0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
0eb0: 2a 20 73 75 62 73 74 72 28 78 2c 70 31 2c 70 32  * substr(x,p1,p2
0ec0: 29 20 20 72 65 74 75 72 6e 73 20 70 32 20 63 68  )  returns p2 ch
0ed0: 61 72 61 63 74 65 72 73 20 6f 66 20 78 5b 5d 20  aracters of x[] 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 70  beginning with p
0ef0: 31 2e 0a 2a 2a 20 70 31 20 69 73 20 31 2d 69 6e  1..** p1 is 1-in
0f00: 64 65 78 65 64 2e 20 20 53 6f 20 73 75 62 73 74  dexed.  So subst
0f10: 72 28 78 2c 31 2c 31 29 20 72 65 74 75 72 6e 73  r(x,1,1) returns
0f20: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
0f30: 63 74 65 72 0a 2a 2a 20 6f 66 20 78 2e 20 20 49  cter.** of x.  I
0f40: 66 20 78 20 69 73 20 74 65 78 74 2c 20 74 68 65  f x is text, the
0f50: 6e 20 77 65 20 61 63 74 75 61 6c 6c 79 20 63 6f  n we actually co
0f60: 75 6e 74 20 55 54 46 2d 38 20 63 68 61 72 61 63  unt UTF-8 charac
0f70: 74 65 72 73 2e 0a 2a 2a 20 49 66 20 78 20 69 73  ters..** If x is
0f80: 20 61 20 62 6c 6f 62 2c 20 74 68 65 6e 20 77 65   a blob, then we
0f90: 20 63 6f 75 6e 74 20 62 79 74 65 73 2e 0a 2a 2a   count bytes..**
0fa0: 0a 2a 2a 20 49 66 20 70 31 20 69 73 20 6e 65 67  .** If p1 is neg
0fb0: 61 74 69 76 65 2c 20 74 68 65 6e 20 77 65 20 62  ative, then we b
0fc0: 65 67 69 6e 20 61 62 73 28 70 31 29 20 66 72 6f  egin abs(p1) fro
0fd0: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 78 5b 5d  m the end of x[]
0fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0ff0: 20 73 75 62 73 74 72 46 75 6e 63 28 0a 20 20 73   substrFunc(.  s
1000: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1010: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
1020: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
1030: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
1040: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1050: 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74  char *z;.  const
1060: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1070: 7a 32 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  z2;.  int len;. 
1080: 20 69 6e 74 20 70 30 74 79 70 65 3b 0a 20 20 69   int p0type;.  i
1090: 36 34 20 70 31 2c 20 70 32 3b 0a 0a 20 20 61 73  64 p1, p2;..  as
10a0: 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 7c 7c  sert( argc==3 ||
10b0: 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 70 30   argc==2 );.  p0
10c0: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  type = sqlite3_v
10d0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
10e0: 5d 29 3b 0a 20 20 69 66 28 20 70 30 74 79 70 65  ]);.  if( p0type
10f0: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  ==SQLITE_BLOB ){
1100: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
1110: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
1120: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7a 20 3d  rgv[0]);.    z =
1130: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
1140: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  lob(argv[0]);.  
1150: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
1160: 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  urn;.    assert(
1170: 20 6c 65 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61   len==sqlite3_va
1180: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
1190: 5d 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ]) );.  }else{. 
11a0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
11b0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
11c0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  ]);.    if( z==0
11d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6c   ) return;.    l
11e0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  en = 0;.    for(
11f0: 7a 32 3d 7a 3b 20 2a 7a 32 3b 20 6c 65 6e 2b 2b  z2=z; *z2; len++
1200: 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ){.      SQLITE_
1210: 53 4b 49 50 5f 55 54 46 38 28 7a 32 29 3b 0a 20  SKIP_UTF8(z2);. 
1220: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 31 20 3d 20     }.  }.  p1 = 
1230: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1240: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66  t(argv[1]);.  if
1250: 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20  ( argc==3 ){.   
1260: 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   p2 = sqlite3_va
1270: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29  lue_int(argv[2])
1280: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1290: 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  2 = sqlite3_cont
12a0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
12b0: 6e 74 65 78 74 29 2d 3e 61 4c 69 6d 69 74 5b 53  ntext)->aLimit[S
12c0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
12d0: 54 48 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  TH];.  }.  if( p
12e0: 31 3c 30 20 29 7b 0a 20 20 20 20 70 31 20 2b 3d  1<0 ){.    p1 +=
12f0: 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28 20 70 31   len;.    if( p1
1300: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20 2b  <0 ){.      p2 +
1310: 3d 20 70 31 3b 0a 20 20 20 20 20 20 70 31 20 3d  = p1;.      p1 =
1320: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
1330: 65 20 69 66 28 20 70 31 3e 30 20 29 7b 0a 20 20  e if( p1>0 ){.  
1340: 20 20 70 31 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66    p1--;.  }.  if
1350: 28 20 70 31 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20  ( p1+p2>len ){. 
1360: 20 20 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a     p2 = len-p1;.
1370: 20 20 7d 0a 20 20 69 66 28 20 70 30 74 79 70 65    }.  if( p0type
1380: 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  !=SQLITE_BLOB ){
1390: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26  .    while( *z &
13a0: 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 53 51  & p1 ){.      SQ
13b0: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
13c0: 29 3b 0a 20 20 20 20 20 20 70 31 2d 2d 3b 0a 20  );.      p1--;. 
13d0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 7a 32 3d     }.    for(z2=
13e0: 7a 3b 20 2a 7a 32 20 26 26 20 70 32 3b 20 70 32  z; *z2 && p2; p2
13f0: 2d 2d 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54  --){.      SQLIT
1400: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 32 29 3b  E_SKIP_UTF8(z2);
1410: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1420: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
1430: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a  ontext, (char*)z
1440: 2c 20 7a 32 2d 7a 2c 20 53 51 4c 49 54 45 5f 54  , z2-z, SQLITE_T
1450: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
1460: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 32 3c 30  se{.    if( p2<0
1470: 20 29 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 73   ) p2 = 0;.    s
1480: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
1490: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  ob(context, (cha
14a0: 72 2a 29 26 7a 5b 70 31 5d 2c 20 70 32 2c 20 53  r*)&z[p1], p2, S
14b0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
14d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
14e0: 20 74 68 65 20 72 6f 75 6e 64 28 29 20 66 75 6e   the round() fun
14f0: 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ction.*/.static 
1500: 76 6f 69 64 20 72 6f 75 6e 64 46 75 6e 63 28 73  void roundFunc(s
1510: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1520: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
1530: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
1540: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20   **argv){.  int 
1550: 6e 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20  n = 0;.  double 
1560: 72 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  r;.  char zBuf[5
1570: 30 30 5d 3b 20 20 2f 2a 20 6c 61 72 67 65 72 20  00];  /* larger 
1580: 74 68 61 6e 20 74 68 65 20 25 66 20 72 65 70 72  than the %f repr
1590: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
15a0: 65 20 6c 61 72 67 65 73 74 20 64 6f 75 62 6c 65  e largest double
15b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 72   */.  assert( ar
15c0: 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32  gc==1 || argc==2
15d0: 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d   );.  if( argc==
15e0: 32 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  2 ){.    if( SQL
15f0: 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65  ITE_NULL==sqlite
1600: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
1610: 76 5b 31 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a  v[1]) ) return;.
1620: 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f      n = sqlite3_
1630: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
1640: 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 33 30  ]);.    if( n>30
1650: 20 29 20 6e 20 3d 20 33 30 3b 0a 20 20 20 20 69   ) n = 30;.    i
1660: 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a  f( n<0 ) n = 0;.
1670: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1680: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
1690: 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[0])==SQLITE_NU
16a0: 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72  LL ) return;.  r
16b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
16c0: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29  _double(argv[0])
16d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
16e0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
16f0: 29 2c 7a 42 75 66 2c 22 25 2e 2a 66 22 2c 6e 2c  ),zBuf,"%.*f",n,
1700: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 41 74 6f  r);.  sqlite3Ato
1710: 46 28 7a 42 75 66 2c 20 26 72 29 3b 0a 20 20 73  F(zBuf, &r);.  s
1720: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
1730: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29  uble(context, r)
1740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
1750: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
1760: 6f 66 20 73 70 61 63 65 20 75 73 69 6e 67 20 73  of space using s
1770: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
1780: 20 49 66 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63   If the.** alloc
1790: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 63 61 6c  ation fails, cal
17a0: 6c 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  l sqlite3_result
17b0: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 29 20 74  _error_nomem() t
17c0: 6f 20 6e 6f 74 69 66 79 0a 2a 2a 20 74 68 65 20  o notify.** the 
17d0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
17e0: 74 68 61 74 20 6d 61 6c 6c 6f 63 28 29 20 68 61  that malloc() ha
17f0: 73 20 66 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s failed..*/.sta
1800: 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 74 65 78  tic void *contex
1810: 74 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f  tMalloc(sqlite3_
1820: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1830: 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1840: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 6e  char *z;.  if( n
1850: 42 79 74 65 3e 73 71 6c 69 74 65 33 5f 63 6f 6e  Byte>sqlite3_con
1860: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
1870: 6f 6e 74 65 78 74 29 2d 3e 61 4c 69 6d 69 74 5b  ontext)->aLimit[
1880: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
1890: 47 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  GTH] ){.    sqli
18a0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
18b0: 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29  _toobig(context)
18c0: 3b 0a 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 7d  ;.    z = 0;.  }
18d0: 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71  else{.    z = sq
18e0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 42 79 74  lite3Malloc(nByt
18f0: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 20 26  e);.    if( !z &
1900: 26 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20 20 20  & nByte>0 ){.   
1910: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1920: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
1930: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ntext);.    }.  
1940: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
1950: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1960: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 70 70  ation of the upp
1970: 65 72 28 29 20 61 6e 64 20 6c 6f 77 65 72 28 29  er() and lower()
1980: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e 0a   SQL functions..
1990: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
19a0: 70 70 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33  pperFunc(sqlite3
19b0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
19c0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
19d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
19e0: 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a  v){.  char *z1;.
19f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
1a00: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
1a10: 69 66 28 20 61 72 67 63 3c 31 20 7c 7c 20 53 51  if( argc<1 || SQ
1a20: 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74  LITE_NULL==sqlit
1a30: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
1a40: 67 76 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 3b  gv[0]) ) return;
1a50: 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a 29 73  .  z2 = (char*)s
1a60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1a70: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20  t(argv[0]);.  n 
1a80: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1a90: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
1aa0: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1ab0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62 79   the call to _by
1ac0: 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74 20 69  tes() does not i
1ad0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 5f 74  nvalidate the _t
1ae0: 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20 2a 2f  ext() pointer */
1af0: 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d 3d 28  .  assert( z2==(
1b00: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
1b10: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
1b20: 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b  ) );.  if( z2 ){
1b30: 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65 78  .    z1 = contex
1b40: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
1b50: 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a 20 20   ((i64)n)+1);.  
1b60: 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20 20 20    if( z1 ){.    
1b70: 20 20 6d 65 6d 63 70 79 28 7a 31 2c 20 7a 32 2c    memcpy(z1, z2,
1b80: 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 66 6f 72   n+1);.      for
1b90: 28 69 3d 30 3b 20 7a 31 5b 69 5d 3b 20 69 2b 2b  (i=0; z1[i]; i++
1ba0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b 69 5d  ){.        z1[i]
1bb0: 20 3d 20 74 6f 75 70 70 65 72 28 7a 31 5b 69 5d   = toupper(z1[i]
1bc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1bd0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1be0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31  text(context, z1
1bf0: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72  , -1, sqlite3_fr
1c00: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ee);.    }.  }.}
1c10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 77  .static void low
1c20: 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  erFunc(sqlite3_c
1c30: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1c40: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
1c50: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
1c60: 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  {.  char *z1;.  
1c70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
1c80: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66    int i, n;.  if
1c90: 28 20 61 72 67 63 3c 31 20 7c 7c 20 53 51 4c 49  ( argc<1 || SQLI
1ca0: 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33  TE_NULL==sqlite3
1cb0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
1cc0: 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  [0]) ) return;. 
1cd0: 20 7a 32 20 3d 20 28 63 68 61 72 2a 29 73 71 6c   z2 = (char*)sql
1ce0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1cf0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20  argv[0]);.  n = 
1d00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
1d10: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
1d20: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1d30: 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65  he call to _byte
1d40: 73 28 29 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76  s() does not inv
1d50: 61 6c 69 64 61 74 65 20 74 68 65 20 5f 74 65 78  alidate the _tex
1d60: 74 28 29 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  t() pointer */. 
1d70: 20 61 73 73 65 72 74 28 20 7a 32 3d 3d 28 63 68   assert( z2==(ch
1d80: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
1d90: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20  e_text(argv[0]) 
1da0: 29 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b 0a 20  );.  if( z2 ){. 
1db0: 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65 78 74 4d     z1 = contextM
1dc0: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28  alloc(context, (
1dd0: 28 69 36 34 29 6e 29 2b 31 29 3b 0a 20 20 20 20  (i64)n)+1);.    
1de0: 69 66 28 20 7a 31 20 29 7b 0a 20 20 20 20 20 20  if( z1 ){.      
1df0: 6d 65 6d 63 70 79 28 7a 31 2c 20 7a 32 2c 20 6e  memcpy(z1, z2, n
1e00: 2b 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  +1);.      for(i
1e10: 3d 30 3b 20 7a 31 5b 69 5d 3b 20 69 2b 2b 29 7b  =0; z1[i]; i++){
1e20: 0a 20 20 20 20 20 20 20 20 7a 31 5b 69 5d 20 3d  .        z1[i] =
1e30: 20 74 6f 6c 6f 77 65 72 28 7a 31 5b 69 5d 29 3b   tolower(z1[i]);
1e40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e50: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
1e60: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20  xt(context, z1, 
1e70: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
1e80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1e90: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1ea0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 46 4e 55  tion of the IFNU
1eb0: 4c 4c 28 29 2c 20 4e 56 4c 28 29 2c 20 61 6e 64  LL(), NVL(), and
1ec0: 20 43 4f 41 4c 45 53 43 45 28 29 20 66 75 6e 63   COALESCE() func
1ed0: 74 69 6f 6e 73 2e 20 20 0a 2a 2a 20 41 6c 6c 20  tions.  .** All 
1ee0: 74 68 72 65 65 20 64 6f 20 74 68 65 20 73 61 6d  three do the sam
1ef0: 65 20 74 68 69 6e 67 2e 20 20 54 68 65 79 20 72  e thing.  They r
1f00: 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
1f10: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61 72 67 75  non-NULL.** argu
1f20: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1f30: 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28  void ifnullFunc(
1f40: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1f50: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
1f60: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
1f70: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1f80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1f90: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
1fa0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
1fb0: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
1fc0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
1fd0: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 73  v[i]) ){.      s
1fe0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
1ff0: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  lue(context, arg
2000: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  v[i]);.      bre
2010: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
2020: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2030: 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 28  ation of random(
2040: 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61 6e  ).  Return a ran
2050: 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20 20 0a 2a  dom integer.  .*
2060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61  /.static void ra
2070: 6e 64 6f 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69  ndomFunc(.  sqli
2080: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
2090: 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55  text,.  int NotU
20a0: 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  sed,.  sqlite3_v
20b0: 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a  alue **NotUsed2.
20c0: 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  ){.  sqlite_int6
20d0: 34 20 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  4 r;.  UNUSED_PA
20e0: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
20f0: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73  , NotUsed2);.  s
2100: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
2110: 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
2120: 3b 0a 20 20 69 66 28 20 28 72 3c 3c 31 29 3d 3d  ;.  if( (r<<1)==
2130: 30 20 29 20 72 20 3d 20 30 3b 20 20 2f 2a 20 50  0 ) r = 0;  /* P
2140: 72 65 76 65 6e 74 20 30 78 38 30 30 30 2e 2e 2e  revent 0x8000...
2150: 2e 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  . as the result 
2160: 73 6f 20 74 68 61 74 20 77 65 20 2a 2f 0a 20 20  so that we */.  
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6e 20 61          /* can a
2190: 6c 77 61 79 73 20 64 6f 20 61 62 73 28 29 20 6f  lways do abs() o
21a0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  f the result */.
21b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
21c0: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
21d0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  r);.}../*.** Imp
21e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72  lementation of r
21f0: 61 6e 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52  andomblob(N).  R
2200: 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62  eturn a random b
2210: 6c 6f 62 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e  lob.** that is N
2220: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a   bytes long..*/.
2230: 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64  static void rand
2240: 6f 6d 42 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65  omBlob(.  sqlite
2250: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
2260: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
2270: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2280: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
2290: 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  n;.  unsigned ch
22a0: 61 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  ar *p;.  assert(
22b0: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
22c0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
22d0: 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  rgc);.  n = sqli
22e0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
22f0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c  gv[0]);.  if( n<
2300: 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 31 3b 0a  1 ){.    n = 1;.
2310: 20 20 7d 0a 20 20 70 20 3d 20 63 6f 6e 74 65 78    }.  p = contex
2320: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
2330: 20 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   n);.  if( p ){.
2340: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2350: 6f 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a 20 20  omness(n, p);.  
2360: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2370: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28  _blob(context, (
2380: 63 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71 6c 69  char*)p, n, sqli
2390: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d  te3_free);.  }.}
23a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
23b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
23c0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
23d0: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
23e0: 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
23f0: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
2400: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
2410: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
2420: 64 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  d() API function
2430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2440: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
2450: 69 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  id(.  sqlite3_co
2460: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
2470: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20  .  int NotUsed, 
2480: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2490: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
24a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
24b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
24c0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
24d0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
24e0: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
24f0: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c  NotUsed2);.  sql
2500: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
2510: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
2520: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
2530: 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  owid(db));.}../*
2540: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2550: 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  on of the change
2560: 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  s() SQL function
2570: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
2580: 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61  lue is the.** sa
2590: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
25a0: 33 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49 20  3_changes() API 
25b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
25c0: 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 73  tic void changes
25d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
25e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
25f0: 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73  int NotUsed,.  s
2600: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e  qlite3_value **N
2610: 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c  otUsed2.){.  sql
2620: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
2630: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
2640: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
2650: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2660: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
2670: 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  sed2);.  sqlite3
2680: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
2690: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ext, sqlite3_cha
26a0: 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  nges(db));.}../*
26b0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
26c0: 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 5f  on of the total_
26d0: 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75  changes() SQL fu
26e0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74  nction.  The ret
26f0: 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  urn value is.** 
2700: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2710: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
2720: 61 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e 63  anges() API func
2730: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2740: 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61 6e 67  void total_chang
2750: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  es(.  sqlite3_co
2760: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
2770: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
2780: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2790: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
27a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
27b0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
27c0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
27d0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
27e0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
27f0: 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74  tUsed2);.  sqlit
2800: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
2810: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 74  ntext, sqlite3_t
2820: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 64 62 29  otal_changes(db)
2830: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  );.}../*.** A st
2840: 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 6e 67  ructure defining
2850: 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f 42 2d   how to do GLOB-
2860: 73 74 79 6c 65 20 63 6f 6d 70 61 72 69 73 6f 6e  style comparison
2870: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6d  s..*/.struct com
2880: 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20  pareInfo {.  u8 
2890: 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d  matchAll;.  u8 m
28a0: 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61  atchOne;.  u8 ma
28b0: 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43  tchSet;.  u8 noC
28c0: 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46  ase;.};../*.** F
28d0: 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  or LIKE and GLOB
28e0: 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20 45 42 43   matching on EBC
28f0: 44 49 43 20 6d 61 63 68 69 6e 65 73 2c 20 61 73  DIC machines, as
2900: 73 75 6d 65 20 74 68 61 74 20 65 76 65 72 79 0a  sume that every.
2910: 2a 2a 20 63 68 61 72 61 63 74 65 72 20 69 73 20  ** character is 
2920: 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74 65  exactly one byte
2930: 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c 73 6f 2c   in size.  Also,
2940: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
2950: 61 72 65 0a 2a 2a 20 61 62 6c 65 20 74 6f 20 70  are.** able to p
2960: 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 75 70  articipate in up
2970: 70 65 72 2d 63 61 73 65 2d 74 6f 2d 6c 6f 77 65  per-case-to-lowe
2980: 72 2d 63 61 73 65 20 6d 61 70 70 69 6e 67 73 20  r-case mappings 
2990: 69 6e 20 45 42 43 44 49 43 0a 2a 2a 20 77 68 65  in EBCDIC.** whe
29a0: 72 65 61 73 20 6f 6e 6c 79 20 63 68 61 72 61 63  reas only charac
29b0: 74 65 72 73 20 6c 65 73 73 20 74 68 61 6e 20 30  ters less than 0
29c0: 78 38 30 20 64 6f 20 69 6e 20 41 53 43 49 49 2e  x80 do in ASCII.
29d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
29e0: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 29 0a 23  SQLITE_EBCDIC).#
29f0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 55   define sqlite3U
2a00: 74 66 38 52 65 61 64 28 41 2c 42 2c 43 29 20 20  tf8Read(A,B,C)  
2a10: 28 2a 28 41 2b 2b 29 29 0a 23 20 64 65 66 69 6e  (*(A++)).# defin
2a20: 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77  e GlogUpperToLow
2a30: 65 72 28 41 29 20 20 20 20 20 41 20 3d 20 73 71  er(A)     A = sq
2a40: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
2a50: 72 5b 41 5d 0a 23 65 6c 73 65 0a 23 20 64 65 66  r[A].#else.# def
2a60: 69 6e 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c  ine GlogUpperToL
2a70: 6f 77 65 72 28 41 29 20 20 20 20 20 69 66 28 20  ower(A)     if( 
2a80: 41 3c 30 78 38 30 20 29 7b 20 41 20 3d 20 73 71  A<0x80 ){ A = sq
2a90: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
2aa0: 72 5b 41 5d 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  r[A]; }.#endif..
2ab0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2ac0: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
2ad0: 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20 27 2a 27  globInfo = { '*'
2ae0: 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30 20 7d 3b  , '?', '[', 0 };
2af0: 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20  ./* The correct 
2b00: 53 51 4c 2d 39 32 20 62 65 68 61 76 69 6f 72 20  SQL-92 behavior 
2b10: 69 73 20 66 6f 72 20 74 68 65 20 4c 49 4b 45 20  is for the LIKE 
2b20: 6f 70 65 72 61 74 6f 72 20 74 6f 20 69 67 6e 6f  operator to igno
2b30: 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20 54 68 75  re.** case.  Thu
2b40: 73 20 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  s  'a' LIKE 'A' 
2b50: 77 6f 75 6c 64 20 62 65 20 74 72 75 65 2e 20 2a  would be true. *
2b60: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2b70: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
2b80: 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 20 3d  o likeInfoNorm =
2b90: 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20 30   { '%', '_',   0
2ba0: 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20 53 51 4c  , 1 };./* If SQL
2bb0: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
2bc0: 56 45 5f 4c 49 4b 45 20 69 73 20 64 65 66 69 6e  VE_LIKE is defin
2bd0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 4c 49 4b  ed, then the LIK
2be0: 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  E operator.** is
2bf0: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 20   case sensitive 
2c00: 63 61 75 73 69 6e 67 20 27 61 27 20 4c 49 4b 45  causing 'a' LIKE
2c10: 20 27 41 27 20 74 6f 20 62 65 20 66 61 6c 73 65   'A' to be false
2c20: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
2c30: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
2c40: 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41 6c 74 20  nfo likeInfoAlt 
2c50: 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20  = { '%', '_',   
2c60: 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  0, 0 };../*.** C
2c70: 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38  ompare two UTF-8
2c80: 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75   strings for equ
2c90: 61 6c 69 74 79 20 77 68 65 72 65 20 74 68 65 20  ality where the 
2ca0: 66 69 72 73 74 20 73 74 72 69 6e 67 20 63 61 6e  first string can
2cb0: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
2cc0: 62 65 20 61 20 22 67 6c 6f 62 22 20 65 78 70 72  be a "glob" expr
2cd0: 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ession.  Return 
2ce0: 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65 79  true (1) if they
2cf0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
2d00: 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69   and false (0) i
2d10: 66 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65  f they are diffe
2d20: 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  rent..**.** Glob
2d30: 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
2d40: 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
2d50: 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
2d60: 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
2d70: 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
2d80: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
2d90: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
2da0: 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
2db0: 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
2dc0: 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
2dd0: 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
2de0: 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
2df0: 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
2e10: 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
2e20: 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
2e30: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
2e40: 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
2e50: 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
2e60: 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e  .** With the [..
2e70: 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61  .] and [^...] ma
2e80: 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68  tching, a ']' ch
2e90: 61 72 61 63 74 65 72 20 63 61 6e 20 62 65 20 69  aracter can be i
2ea0: 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68  ncluded.** in th
2eb0: 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67  e list by making
2ec0: 20 69 74 20 74 68 65 20 66 69 72 73 74 20 63 68   it the first ch
2ed0: 61 72 61 63 74 65 72 20 61 66 74 65 72 20 27 5b  aracter after '[
2ee0: 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20  ' or '^'.  A.** 
2ef0: 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74  range of charact
2f00: 65 72 73 20 63 61 6e 20 62 65 20 73 70 65 63 69  ers can be speci
2f10: 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20  fied using '-'. 
2f20: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61   Example:.** "[a
2f30: 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79  -z]" matches any
2f40: 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61   single lower-ca
2f50: 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d  se letter.  To m
2f60: 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65  atch a '-', make
2f70: 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20  .** it the last 
2f80: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
2f90: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   list..**.** Thi
2fa0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75  s routine is usu
2fb0: 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20  ally quick, but 
2fc0: 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74  can be N**2 in t
2fd0: 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a  he worst case..*
2fe0: 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f 20 6d  *.** Hints: to m
2ff0: 61 74 63 68 20 27 2a 27 20 6f 72 20 27 3f 27 2c  atch '*' or '?',
3000: 20 70 75 74 20 74 68 65 6d 20 69 6e 20 22 5b 5d   put them in "[]
3010: 22 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  ".  Like this:.*
3020: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 62 63  *.**         abc
3030: 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20 20 4d 61  [*]xyz        Ma
3040: 74 63 68 65 73 20 22 61 62 63 2a 78 79 7a 22 20  tches "abc*xyz" 
3050: 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20 69  only.*/.static i
3060: 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  nt patternCompar
3070: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  e(.  const u8 *z
3080: 50 61 74 74 65 72 6e 2c 20 20 20 20 20 20 20 20  Pattern,        
3090: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 6c 6f        /* The glo
30a0: 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63  b pattern */.  c
30b0: 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72 69 6e 67  onst u8 *zString
30c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30d0: 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20 74 6f  /* The string to
30e0: 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
30f0: 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20 20 63   the glob */.  c
3100: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
3110: 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20  areInfo *pInfo, 
3120: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
3130: 62 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 74  bout how to do t
3140: 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  he compare */.  
3150: 63 6f 6e 73 74 20 69 6e 74 20 65 73 63 20 20 20  const int esc   
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3170: 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63   /* The escape c
3180: 68 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20  haracter */.){. 
3190: 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e   int c, c2;.  in
31a0: 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
31b0: 73 65 65 6e 3b 0a 20 20 75 38 20 6d 61 74 63 68  seen;.  u8 match
31c0: 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74  One = pInfo->mat
31d0: 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63  chOne;.  u8 matc
31e0: 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61  hAll = pInfo->ma
31f0: 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74  tchAll;.  u8 mat
3200: 63 68 53 65 74 20 3d 20 70 49 6e 66 6f 2d 3e 6d  chSet = pInfo->m
3210: 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f  atchSet;.  u8 no
3220: 43 61 73 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f  Case = pInfo->no
3230: 43 61 73 65 3b 20 0a 20 20 69 6e 74 20 70 72 65  Case; .  int pre
3240: 76 45 73 63 61 70 65 20 3d 20 30 3b 20 20 20 20  vEscape = 0;    
3250: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
3260: 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
3270: 65 72 20 77 61 73 20 27 65 73 63 61 70 65 27 20  er was 'escape' 
3280: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  */..  while( (c 
3290: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
32a0: 64 28 7a 50 61 74 74 65 72 6e 2c 30 2c 26 7a 50  d(zPattern,0,&zP
32b0: 61 74 74 65 72 6e 29 29 21 3d 30 20 29 7b 0a 20  attern))!=0 ){. 
32c0: 20 20 20 69 66 28 20 21 70 72 65 76 45 73 63 61     if( !prevEsca
32d0: 70 65 20 26 26 20 63 3d 3d 6d 61 74 63 68 41 6c  pe && c==matchAl
32e0: 6c 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  l ){.      while
32f0: 28 20 28 63 3d 73 71 6c 69 74 65 33 55 74 66 38  ( (c=sqlite3Utf8
3300: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 30 2c  Read(zPattern,0,
3310: 26 7a 50 61 74 74 65 72 6e 29 29 20 3d 3d 20 6d  &zPattern)) == m
3320: 61 74 63 68 41 6c 6c 0a 20 20 20 20 20 20 20 20  atchAll.        
3330: 20 20 20 20 20 20 20 7c 7c 20 63 20 3d 3d 20 6d         || c == m
3340: 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20  atchOne ){.     
3350: 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f     if( c==matchO
3360: 6e 65 20 26 26 20 73 71 6c 69 74 65 33 55 74 66  ne && sqlite3Utf
3370: 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 30  8Read(zString, 0
3380: 2c 20 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29  , &zString)==0 )
3390: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
33a0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
33b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33c0: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
33d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
33e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 65    }else if( c==e
33f0: 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  sc ){.        c 
3400: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
3410: 64 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20 26  d(zPattern, 0, &
3420: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
3430: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
3440: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3450: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
3460: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
3470: 6d 61 74 63 68 53 65 74 20 29 7b 0a 20 20 20 20  matchSet ){.    
3480: 20 20 20 20 61 73 73 65 72 74 28 20 65 73 63 3d      assert( esc=
3490: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  =0 );         /*
34a0: 20 54 68 69 73 20 69 73 20 47 4c 4f 42 2c 20 6e   This is GLOB, n
34b0: 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20 20  ot LIKE */.     
34c0: 20 20 20 61 73 73 65 72 74 28 20 6d 61 74 63 68     assert( match
34d0: 53 65 74 3c 30 78 38 30 20 29 3b 20 20 2f 2a 20  Set<0x80 );  /* 
34e0: 27 5b 27 20 69 73 20 61 20 73 69 6e 67 6c 65 2d  '[' is a single-
34f0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 2a  byte character *
3500: 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
3510: 20 2a 7a 53 74 72 69 6e 67 20 26 26 20 70 61 74   *zString && pat
3520: 74 65 72 6e 43 6f 6d 70 61 72 65 28 26 7a 50 61  ternCompare(&zPa
3530: 74 74 65 72 6e 5b 2d 31 5d 2c 7a 53 74 72 69 6e  ttern[-1],zStrin
3540: 67 2c 70 49 6e 66 6f 2c 65 73 63 29 3d 3d 30 20  g,pInfo,esc)==0 
3550: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  ){.          SQL
3560: 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 53  ITE_SKIP_UTF8(zS
3570: 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  tring);.        
3580: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
3590: 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a 20 20   *zString!=0;.  
35a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
35b0: 65 28 20 28 63 32 20 3d 20 73 71 6c 69 74 65 33  e( (c2 = sqlite3
35c0: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
35d0: 2c 30 2c 26 7a 53 74 72 69 6e 67 29 29 21 3d 30  ,0,&zString))!=0
35e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
35f0: 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20  noCase ){.      
3600: 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c      GlogUpperToL
3610: 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20 20  ower(c2);.      
3620: 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c      GlogUpperToL
3630: 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20 20  ower(c);.       
3640: 20 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20     while( c2 != 
3650: 30 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b 0a  0 && c2 != c ){.
3660: 20 20 20 20 20 20 20 20 20 20 20 20 63 32 20 3d              c2 =
3670: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
3680: 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53  (zString, 0, &zS
3690: 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  tring);.        
36a0: 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c      GlogUpperToL
36b0: 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20 20  ower(c2);.      
36c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
36d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
36e0: 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26  hile( c2 != 0 &&
36f0: 20 63 32 20 21 3d 20 63 20 29 7b 0a 20 20 20 20   c2 != c ){.    
3700: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
3710: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 53 74  ite3Utf8Read(zSt
3720: 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74 72 69 6e  ring, 0, &zStrin
3730: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
3740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3750: 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65    if( c2==0 ) re
3760: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
3770: 69 66 28 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  if( patternCompa
3780: 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72  re(zPattern,zStr
3790: 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29 20 29  ing,pInfo,esc) )
37a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
37b0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
37c0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
37d0: 20 21 70 72 65 76 45 73 63 61 70 65 20 26 26 20   !prevEscape && 
37e0: 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20  c==matchOne ){. 
37f0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3800: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
3810: 2c 20 30 2c 20 26 7a 53 74 72 69 6e 67 29 3d 3d  , 0, &zString)==
3820: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
3830: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
3840: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
3850: 6d 61 74 63 68 53 65 74 20 29 7b 0a 20 20 20 20  matchSet ){.    
3860: 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20    int prior_c = 
3870: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
3880: 20 65 73 63 3d 3d 30 20 29 3b 20 20 20 20 2f 2a   esc==0 );    /*
3890: 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72   This only occur
38a0: 73 20 66 6f 72 20 47 4c 4f 42 2c 20 6e 6f 74 20  s for GLOB, not 
38b0: 4c 49 4b 45 20 2a 2f 0a 20 20 20 20 20 20 73 65  LIKE */.      se
38c0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  en = 0;.      in
38d0: 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vert = 0;.      
38e0: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  c = sqlite3Utf8R
38f0: 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20  ead(zString, 0, 
3900: 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  &zString);.     
3910: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
3920: 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 32 20 3d  rn 0;.      c2 =
3930: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
3940: 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20 26 7a  (zPattern, 0, &z
3950: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
3960: 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20  if( c2=='^' ){. 
3970: 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20         invert = 
3980: 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  1;.        c2 = 
3990: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
39a0: 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50  zPattern, 0, &zP
39b0: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d  attern);.      }
39c0: 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
39d0: 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
39e0: 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20  ( c==']' ) seen 
39f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20  = 1;.        c2 
3a00: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
3a10: 64 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20 26  d(zPattern, 0, &
3a20: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
3a30: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
3a40: 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b  c2 && c2!=']' ){
3a50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
3a60: 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e  ='-' && zPattern
3a70: 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74  [0]!=']' && zPat
3a80: 74 65 72 6e 5b 30 5d 21 3d 30 20 26 26 20 70 72  tern[0]!=0 && pr
3a90: 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
3aa0: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
3ab0: 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65  3Utf8Read(zPatte
3ac0: 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65 72 6e  rn, 0, &zPattern
3ad0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
3ae0: 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63   c>=prior_c && c
3af0: 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b  <=c2 ) seen = 1;
3b00: 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
3b10: 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
3b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3b30: 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20   if( c==c2 ){.  
3b40: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d            seen =
3b50: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
3b60: 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
3b70: 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
3b80: 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 73  }.        c2 = s
3b90: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
3ba0: 50 61 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61  Pattern, 0, &zPa
3bb0: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ttern);.      }.
3bc0: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
3bd0: 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72  || (seen ^ inver
3be0: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
3bf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
3c00: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
3c10: 20 65 73 63 3d 3d 63 20 26 26 20 21 70 72 65 76   esc==c && !prev
3c20: 45 73 63 61 70 65 20 29 7b 0a 20 20 20 20 20 20  Escape ){.      
3c30: 70 72 65 76 45 73 63 61 70 65 20 3d 20 31 3b 0a  prevEscape = 1;.
3c40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3c50: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
3c60: 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 30  8Read(zString, 0
3c70: 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  , &zString);.   
3c80: 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b     if( noCase ){
3c90: 0a 20 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70  .        GlogUpp
3ca0: 65 72 54 6f 4c 6f 77 65 72 28 63 29 3b 0a 20 20  erToLower(c);.  
3cb0: 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54        GlogUpperT
3cc0: 6f 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20  oLower(c2);.    
3cd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 21    }.      if( c!
3ce0: 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =c2 ){.        r
3cf0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
3d00: 0a 20 20 20 20 20 20 70 72 65 76 45 73 63 61 70  .      prevEscap
3d10: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
3d20: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69  .  return *zStri
3d30: 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ng==0;.}../*.** 
3d40: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
3d50: 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 74   of times that t
3d60: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
3d70: 20 28 6f 72 20 47 4c 4f 42 20 77 68 69 63 68 20   (or GLOB which 
3d80: 69 73 0a 2a 2a 20 6a 75 73 74 20 61 20 76 61 72  is.** just a var
3d90: 69 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 29 20  iation of LIKE) 
3da0: 67 65 74 73 20 63 61 6c 6c 65 64 2e 20 20 54 68  gets called.  Th
3db0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
3dc0: 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a  esting.** only..
3dd0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3de0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
3df0: 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d 20 30  3_like_count = 0
3e00: 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
3e10: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
3e20: 6f 66 20 74 68 65 20 6c 69 6b 65 28 29 20 53 51  of the like() SQ
3e30: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  L function.  Thi
3e40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  s function imple
3e50: 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69  ments.** the bui
3e60: 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61  ld-in LIKE opera
3e70: 74 6f 72 2e 20 20 54 68 65 20 66 69 72 73 74 20  tor.  The first 
3e80: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3e90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a  function is the.
3ea0: 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e 64 20 74  ** pattern and t
3eb0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
3ec0: 6e 74 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  nt is the string
3ed0: 2e 20 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73  .  So, the SQL s
3ee0: 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  tatements:.**.**
3ef0: 20 20 20 20 20 20 20 41 20 4c 49 4b 45 20 42 0a         A LIKE B.
3f00: 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65  **.** is impleme
3f10: 6e 74 65 64 20 61 73 20 6c 69 6b 65 28 42 2c 41  nted as like(B,A
3f20: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 61  )..**.** This sa
3f30: 6d 65 20 66 75 6e 63 74 69 6f 6e 20 28 77 69 74  me function (wit
3f40: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f  h a different co
3f50: 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75 63 74  mpareInfo struct
3f60: 75 72 65 29 20 63 6f 6d 70 75 74 65 73 0a 2a 2a  ure) computes.**
3f70: 20 74 68 65 20 47 4c 4f 42 20 6f 70 65 72 61 74   the GLOB operat
3f80: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
3f90: 69 64 20 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73  id likeFunc(.  s
3fa0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3fb0: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
3fc0: 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  argc, .  sqlite3
3fd0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
3fe0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
3ff0: 64 20 63 68 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b  d char *zA, *zB;
4000: 0a 20 20 69 6e 74 20 65 73 63 61 70 65 20 3d 20  .  int escape = 
4010: 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
4020: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
4030: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
4040: 74 65 78 74 29 3b 0a 0a 20 20 7a 42 20 3d 20 73  text);..  zB = s
4050: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4060: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 41  t(argv[0]);.  zA
4070: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4080: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
4090: 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74 68 65 20  .  /* Limit the 
40a0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 4c 49  length of the LI
40b0: 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74 74 65  KE or GLOB patte
40c0: 72 6e 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  rn to avoid prob
40d0: 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20 64 65 65  lems.  ** of dee
40e0: 70 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20  p recursion and 
40f0: 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20 69 6e 20  N*N behavior in 
4100: 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 29  patternCompare()
4110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
4120: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
4130: 28 61 72 67 76 5b 30 5d 29 20 3e 0a 20 20 20 20  (argv[0]) >.    
4140: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
4150: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
4160: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
4170: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4180: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
4190: 74 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20 47  text, "LIKE or G
41a0: 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f 20  LOB pattern too 
41b0: 63 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a 20  complex", -1);. 
41c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
41d0: 20 61 73 73 65 72 74 28 20 7a 42 3d 3d 73 71 6c   assert( zB==sql
41e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
41f0: 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20  argv[0]) );  /* 
4200: 45 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e 6f 74  Encoding did not
4210: 20 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20 69 66   change */..  if
4220: 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20  ( argc==3 ){.   
4230: 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63   /* The escape c
4240: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20  haracter string 
4250: 6d 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 20  must consist of 
4260: 61 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63  a single UTF-8 c
4270: 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a  haracter..    **
4280: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
4290: 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  rn an error..   
42a0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
42b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 73  signed char *zEs
42c0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  c = sqlite3_valu
42d0: 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b  e_text(argv[2]);
42e0: 0a 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d 30  .    if( zEsc==0
42f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
4300: 66 28 20 73 71 6c 69 74 65 33 55 74 66 38 43 68  f( sqlite3Utf8Ch
4310: 61 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45 73  arLen((char*)zEs
4320: 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20 20  c, -1)!=1 ){.   
4330: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4340: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
4350: 20 0a 20 20 20 20 20 20 20 20 20 20 22 45 53 43   .          "ESC
4360: 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  APE expression m
4370: 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
4380: 63 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29 3b  character", -1);
4390: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
43a0: 20 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65 20     }.    escape 
43b0: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
43c0: 64 28 7a 45 73 63 2c 20 30 2c 20 26 7a 45 73 63  d(zEsc, 0, &zEsc
43d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20  );.  }.  if( zA 
43e0: 26 26 20 7a 42 20 29 7b 0a 20 20 20 20 73 74 72  && zB ){.    str
43f0: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
4400: 2a 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  *pInfo = sqlite3
4410: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
4420: 78 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  xt);.#ifdef SQLI
4430: 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
4440: 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b  te3_like_count++
4450: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
4460: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4470: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 61  _int(context, pa
4480: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 42 2c  tternCompare(zB,
4490: 20 7a 41 2c 20 70 49 6e 66 6f 2c 20 65 73 63 61   zA, pInfo, esca
44a0: 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pe));.  }.}../*.
44b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
44c0: 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46 28  n of the NULLIF(
44d0: 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  x,y) function.  
44e0: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
44f0: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
4500: 65 6e 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ent if the argum
4510: 65 6e 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ents are differe
4520: 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  nt.  The result 
4530: 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a 2a  is NULL if the.*
4540: 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  * arguments are 
4550: 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20 6f 74  equal to each ot
4560: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  her..*/.static v
4570: 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28 0a  oid nullifFunc(.
4580: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
4590: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
45a0: 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c  t NotUsed,.  sql
45b0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
45c0: 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  v.){.  CollSeq *
45d0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
45e0: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f  etFuncCollSeq(co
45f0: 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44  ntext);.  UNUSED
4600: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
4610: 65 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ed);.  if( sqlit
4620: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72 67  e3MemCompare(arg
4630: 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20 70  v[0], argv[1], p
4640: 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Coll)!=0 ){.    
4650: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
4660: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
4670: 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  gv[0]);.  }.}../
4680: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
4690: 69 6f 6e 20 6f 66 20 74 68 65 20 56 45 52 53 49  ion of the VERSI
46a0: 4f 4e 28 2a 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ON(*) function. 
46b0: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
46c0: 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66  he version.** of
46d0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
46e0: 61 72 79 20 74 68 61 74 20 69 73 20 72 75 6e 6e  ary that is runn
46f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
4700: 6f 69 64 20 76 65 72 73 69 6f 6e 46 75 6e 63 28  oid versionFunc(
4710: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
4720: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
4730: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
4740: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f  lite3_value **No
4750: 74 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53  tUsed2.){.  UNUS
4760: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
4770: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
4780: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
4790: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
47a0: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
47b0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
47c0: 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 20 41 72 72 61  TIC);.}../* Arra
47d0: 79 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67  y for converting
47e0: 20 66 72 6f 6d 20 68 61 6c 66 2d 62 79 74 65 73   from half-bytes
47f0: 20 28 6e 79 62 62 6c 65 73 29 20 69 6e 74 6f 20   (nybbles) into 
4800: 41 53 43 49 49 20 68 65 78 0a 2a 2a 20 64 69 67  ASCII hex.** dig
4810: 69 74 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63  its. */.static c
4820: 6f 6e 73 74 20 63 68 61 72 20 68 65 78 64 69 67  onst char hexdig
4830: 69 74 73 5b 5d 20 3d 20 7b 0a 20 20 27 30 27 2c  its[] = {.  '0',
4840: 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20   '1', '2', '3', 
4850: 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27  '4', '5', '6', '
4860: 37 27 2c 0a 20 20 27 38 27 2c 20 27 39 27 2c 20  7',.  '8', '9', 
4870: 27 41 27 2c 20 27 42 27 2c 20 27 43 27 2c 20 27  'A', 'B', 'C', '
4880: 44 27 2c 20 27 45 27 2c 20 27 46 27 20 0a 7d 3b  D', 'E', 'F' .};
4890: 0a 0a 2f 2a 0a 2a 2a 20 45 58 50 45 52 49 4d 45  ../*.** EXPERIME
48a0: 4e 54 41 4c 20 2d 20 54 68 69 73 20 69 73 20 6e  NTAL - This is n
48b0: 6f 74 20 61 6e 20 6f 66 66 69 63 69 61 6c 20 66  ot an official f
48c0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 69 6e  unction.  The in
48d0: 74 65 72 66 61 63 65 20 6d 61 79 0a 2a 2a 20 63  terface may.** c
48e0: 68 61 6e 67 65 2e 20 20 54 68 69 73 20 66 75 6e  hange.  This fun
48f0: 63 74 69 6f 6e 20 6d 61 79 20 64 69 73 61 70 70  ction may disapp
4900: 65 61 72 2e 20 20 44 6f 20 6e 6f 74 20 77 72 69  ear.  Do not wri
4910: 74 65 20 63 6f 64 65 20 74 68 61 74 20 64 65 70  te code that dep
4920: 65 6e 64 73 0a 2a 2a 20 6f 6e 20 74 68 69 73 20  ends.** on this 
4930: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
4940: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
4950: 66 20 74 68 65 20 51 55 4f 54 45 28 29 20 66 75  f the QUOTE() fu
4960: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75  nction.  This fu
4970: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73  nction takes a s
4980: 69 6e 67 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  ingle.** argumen
4990: 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d  t.  If the argum
49a0: 65 6e 74 20 69 73 20 6e 75 6d 65 72 69 63 2c 20  ent is numeric, 
49b0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
49c0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 0a   is the same as.
49d0: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  ** the argument.
49e0: 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e    If the argumen
49f0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
4a00: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
4a10: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 4e 55  he string.** "NU
4a20: 4c 4c 22 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  LL".  Otherwise,
4a30: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
4a40: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 73 69 6e   enclosed in sin
4a50: 67 6c 65 20 71 75 6f 74 65 73 20 77 69 74 68 0a  gle quotes with.
4a60: 2a 2a 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 20  ** single-quote 
4a70: 65 73 63 61 70 65 73 2e 0a 2a 2f 0a 73 74 61 74  escapes..*/.stat
4a80: 69 63 20 76 6f 69 64 20 71 75 6f 74 65 46 75 6e  ic void quoteFun
4a90: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
4aa0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
4ab0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
4ac0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69  lue **argv){.  i
4ad0: 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75  f( argc<1 ) retu
4ae0: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  rn;.  switch( sq
4af0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
4b00: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
4b10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
4b20: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
4b30: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
4b40: 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 22 2c 20  ontext, "NULL", 
4b50: 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  4, SQLITE_STATIC
4b60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4b80: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20  QLITE_INTEGER:. 
4b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
4ba0: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  LOAT: {.      sq
4bb0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
4bc0: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
4bd0: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  [0]);.      brea
4be0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4bf0: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
4c00: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 65  .      char *zTe
4c10: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  xt = 0;.      ch
4c20: 61 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20  ar const *zBlob 
4c30: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4c40: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
4c50: 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d       int nBlob =
4c60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
4c70: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
4c80: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 42 6c       assert( zBl
4c90: 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ob==sqlite3_valu
4ca0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20  e_blob(argv[0]) 
4cb0: 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e  ); /* No encodin
4cc0: 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20  g change */.    
4cd0: 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61 72 20    zText = (char 
4ce0: 2a 29 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28  *)contextMalloc(
4cf0: 63 6f 6e 74 65 78 74 2c 20 28 32 2a 28 69 36 34  context, (2*(i64
4d00: 29 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20  )nBlob)+4); .   
4d10: 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a     if( zText ){.
4d20: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
4d30: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
4d40: 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20  i<nBlob; i++){. 
4d50: 20 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28           zText[(
4d60: 69 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64 69 67  i*2)+2] = hexdig
4d70: 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34  its[(zBlob[i]>>4
4d80: 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20 20 20  )&0x0F];.       
4d90: 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33     zText[(i*2)+3
4da0: 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28 7a  ] = hexdigits[(z
4db0: 42 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a  Blob[i])&0x0F];.
4dc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4dd0: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
4de0: 29 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20  )+2] = '\'';.   
4df0: 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f       zText[(nBlo
4e00: 62 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a  b*2)+3] = '\0';.
4e10: 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 30 5d          zText[0]
4e20: 20 3d 20 27 58 27 3b 0a 20 20 20 20 20 20 20 20   = 'X';.        
4e30: 7a 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b  zText[1] = '\'';
4e40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4e50: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
4e60: 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  text, zText, -1,
4e70: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4e80: 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  T);.        sqli
4e90: 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29 3b  te3_free(zText);
4ea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4eb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
4ed0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c  : {.      int i,
4ee0: 6a 3b 0a 20 20 20 20 20 20 75 36 34 20 6e 3b 0a  j;.      u64 n;.
4ef0: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
4f00: 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67 20  gned char *zArg 
4f10: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4f20: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
4f30: 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20       char *z;.. 
4f40: 20 20 20 20 20 69 66 28 20 7a 41 72 67 3d 3d 30       if( zArg==0
4f50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
4f60: 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a   for(i=0, n=0; z
4f70: 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66  Arg[i]; i++){ if
4f80: 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20  ( zArg[i]=='\'' 
4f90: 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a  ) n++; }.      z
4fa0: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
4fb0: 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29  (context, ((i64)
4fc0: 69 29 2b 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a  i)+((i64)n)+3);.
4fd0: 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20        if( z ){. 
4fe0: 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c         z[0] = '\
4ff0: 27 27 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  '';.        for(
5000: 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69  i=0, j=1; zArg[i
5010: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
5020: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67     z[j++] = zArg
5030: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
5040: 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27  f( zArg[i]=='\''
5050: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5060: 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[j++] = '\'';. 
5070: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5080: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
5090: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
50a0: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
50b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
50c0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
50d0: 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33  t, z, j, sqlite3
50e0: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a  _free);.      }.
50f0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
5100: 2a 2a 20 54 68 65 20 68 65 78 28 29 20 66 75 6e  ** The hex() fun
5110: 63 74 69 6f 6e 2e 20 20 49 6e 74 65 72 70 72 65  ction.  Interpre
5120: 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61  t the argument a
5130: 73 20 61 20 62 6c 6f 62 2e 20 20 52 65 74 75 72  s a blob.  Retur
5140: 6e 0a 2a 2a 20 61 20 68 65 78 61 64 65 63 69 6d  n.** a hexadecim
5150: 61 6c 20 72 65 6e 64 65 72 69 6e 67 20 61 73 20  al rendering as 
5160: 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  text..*/.static 
5170: 76 6f 69 64 20 68 65 78 46 75 6e 63 28 0a 20 20  void hexFunc(.  
5180: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5190: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
51a0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
51b0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
51c0: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 6f    int i, n;.  co
51d0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
51e0: 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 63 68 61 72  r *pBlob;.  char
51f0: 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a 20 20 61 73   *zHex, *z;.  as
5200: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
5210: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
5220: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 70 42 6c  TER(argc);.  pBl
5230: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
5240: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
5250: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
5260: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
5270: 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [0]);.  assert( 
5280: 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76  pBlob==sqlite3_v
5290: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
52a0: 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63  ]) );  /* No enc
52b0: 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a  oding change */.
52c0: 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20 63 6f 6e    z = zHex = con
52d0: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
52e0: 78 74 2c 20 28 28 69 36 34 29 6e 29 2a 32 20 2b  xt, ((i64)n)*2 +
52f0: 20 31 29 3b 0a 20 20 69 66 28 20 7a 48 65 78 20   1);.  if( zHex 
5300: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
5310: 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42 6c 6f 62 2b  i<n; i++, pBlob+
5320: 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e  +){.      unsign
5330: 65 64 20 63 68 61 72 20 63 20 3d 20 2a 70 42 6c  ed char c = *pBl
5340: 6f 62 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29  ob;.      *(z++)
5350: 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28 63 3e   = hexdigits[(c>
5360: 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 20 20  >4)&0xf];.      
5370: 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67 69  *(z++) = hexdigi
5380: 74 73 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d  ts[c&0xf];.    }
5390: 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  .    *z = 0;.   
53a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
53b0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 48  text(context, zH
53c0: 65 78 2c 20 6e 2a 32 2c 20 73 71 6c 69 74 65 33  ex, n*2, sqlite3
53d0: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _free);.  }.}../
53e0: 2a 0a 2a 2a 20 54 68 65 20 7a 65 72 6f 62 6c 6f  *.** The zeroblo
53f0: 62 28 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  b(N) function re
5400: 74 75 72 6e 73 20 61 20 7a 65 72 6f 2d 66 69 6c  turns a zero-fil
5410: 6c 65 64 20 62 6c 6f 62 20 6f 66 20 73 69 7a 65  led blob of size
5420: 20 4e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61   N bytes..*/.sta
5430: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 62 6c 6f  tic void zeroblo
5440: 62 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  bFunc(.  sqlite3
5450: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5460: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
5470: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5480: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 36 34 20 6e  *argv.){.  i64 n
5490: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
54a0: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
54b0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
54c0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
54d0: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
54e0: 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 53 51 4c  0]);.  if( n>SQL
54f0: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29  ITE_MAX_LENGTH )
5500: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
5510: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
5520: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  g(context);.  }e
5530: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
5540: 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62  _result_zeroblob
5550: 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20  (context, n);.  
5560: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  }.}../*.** The r
5570: 65 70 6c 61 63 65 28 29 20 66 75 6e 63 74 69 6f  eplace() functio
5580: 6e 2e 20 20 54 68 72 65 65 20 61 72 67 75 6d 65  n.  Three argume
5590: 6e 74 73 20 61 72 65 20 61 6c 6c 20 73 74 72 69  nts are all stri
55a0: 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68 65  ngs: call.** the
55b0: 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20 54  m A, B, and C. T
55c0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 73  he result is als
55d0: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
55e0: 20 69 73 20 64 65 72 69 76 65 64 0a 2a 2a 20 66   is derived.** f
55f0: 72 6f 6d 20 41 20 62 79 20 72 65 70 6c 61 63 69  rom A by replaci
5600: 6e 67 20 65 76 65 72 79 20 6f 63 63 75 72 61 6e  ng every occuran
5610: 63 65 20 6f 66 20 42 20 77 69 74 68 20 43 2e 20  ce of B with C. 
5620: 20 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20 6d 75   The match.** mu
5630: 73 74 20 62 65 20 65 78 61 63 74 2e 20 20 43 6f  st be exact.  Co
5640: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
5650: 73 20 61 72 65 20 6e 6f 74 20 75 73 65 64 2e 0a  s are not used..
5660: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
5670: 65 70 6c 61 63 65 46 75 6e 63 28 0a 20 20 73 71  eplaceFunc(.  sq
5680: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5690: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
56a0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
56b0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
56c0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
56d0: 68 61 72 20 2a 7a 53 74 72 3b 20 20 20 20 20 20  har *zStr;      
56e0: 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 73    /* The input s
56f0: 74 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63 6f 6e  tring A */.  con
5700: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
5710: 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20 2f   *zPattern;    /
5720: 2a 20 54 68 65 20 70 61 74 74 65 72 6e 20 73 74  * The pattern st
5730: 72 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f 6e 73  ring B */.  cons
5740: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
5750: 2a 7a 52 65 70 3b 20 20 20 20 20 20 20 20 2f 2a  *zRep;        /*
5760: 20 54 68 65 20 72 65 70 6c 61 63 65 6d 65 6e 74   The replacement
5770: 20 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20 20 75   string C */.  u
5780: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f  nsigned char *zO
5790: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
57a0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 2a   /* The output *
57b0: 2f 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20 20 20  /.  int nStr;   
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
57d0: 53 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a 2f 0a  Size of zStr */.
57e0: 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20    int nPattern; 
57f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
5800: 7a 65 20 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a  ze of zPattern *
5810: 2f 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20 20 20  /.  int nRep;   
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5830: 53 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a 2f 0a  Size of zRep */.
5840: 20 20 69 36 34 20 6e 4f 75 74 3b 20 20 20 20 20    i64 nOut;     
5850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
5860: 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 7a 4f  ximum size of zO
5870: 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f 70  ut */.  int loop
5880: 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  Limit;          
5890: 20 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b 5d 20   /* Last zStr[] 
58a0: 74 68 61 74 20 6d 69 67 68 74 20 6d 61 74 63 68  that might match
58b0: 20 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a 20   zPattern[] */. 
58c0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
58d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
58e0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a 20  p counters */.. 
58f0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33   assert( argc==3
5900: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
5910: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
5920: 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  zStr = sqlite3_v
5930: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
5940: 5d 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 3d 3d  ]);.  if( zStr==
5950: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 53  0 ) return;.  nS
5960: 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  tr = sqlite3_val
5970: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
5980: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 74  );.  assert( zSt
5990: 72 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r==sqlite3_value
59a0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29  _text(argv[0]) )
59b0: 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e  ;  /* No encodin
59c0: 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 50  g change */.  zP
59d0: 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33  attern = sqlite3
59e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
59f0: 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  [1]);.  if( zPat
5a00: 74 65 72 6e 3d 3d 30 20 7c 7c 20 7a 50 61 74 74  tern==0 || zPatt
5a10: 65 72 6e 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75  ern[0]==0 ) retu
5a20: 72 6e 3b 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d  rn;.  nPattern =
5a30: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5a40: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ytes(argv[1]);. 
5a50: 20 61 73 73 65 72 74 28 20 7a 50 61 74 74 65 72   assert( zPatter
5a60: 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n==sqlite3_value
5a70: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 20 29  _text(argv[1]) )
5a80: 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e  ;  /* No encodin
5a90: 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 52  g change */.  zR
5aa0: 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ep = sqlite3_val
5ab0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
5ac0: 3b 0a 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20  ;.  if( zRep==0 
5ad0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 52 65 70  ) return;.  nRep
5ae0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5af0: 5f 62 79 74 65 73 28 61 72 67 76 5b 32 5d 29 3b  _bytes(argv[2]);
5b00: 0a 20 20 61 73 73 65 72 74 28 20 7a 52 65 70 3d  .  assert( zRep=
5b10: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
5b20: 65 78 74 28 61 72 67 76 5b 32 5d 29 20 29 3b 0a  ext(argv[2]) );.
5b30: 20 20 6e 4f 75 74 20 3d 20 6e 53 74 72 20 2b 20    nOut = nStr + 
5b40: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 75  1;.  assert( nOu
5b50: 74 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  t<SQLITE_MAX_LEN
5b60: 47 54 48 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20  GTH );.  zOut = 
5b70: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
5b80: 6e 74 65 78 74 2c 20 28 69 36 34 29 6e 4f 75 74  ntext, (i64)nOut
5b90: 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30  );.  if( zOut==0
5ba0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
5bb0: 20 20 7d 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20    }.  loopLimit 
5bc0: 3d 20 6e 53 74 72 20 2d 20 6e 50 61 74 74 65 72  = nStr - nPatter
5bd0: 6e 3b 20 20 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  n;  .  for(i=j=0
5be0: 3b 20 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20  ; i<=loopLimit; 
5bf0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i++){.    if( zS
5c00: 74 72 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b  tr[i]!=zPattern[
5c10: 30 5d 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53  0] || memcmp(&zS
5c20: 74 72 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c  tr[i], zPattern,
5c30: 20 6e 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20   nPattern) ){.  
5c40: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
5c50: 7a 53 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  zStr[i];.    }el
5c60: 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 7a 4f  se{.      u8 *zO
5c70: 6c 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ld;.      sqlite
5c80: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
5c90: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
5ca0: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  e(context);.    
5cb0: 20 20 6e 4f 75 74 20 2b 3d 20 6e 52 65 70 20 2d    nOut += nRep -
5cc0: 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20   nPattern;.     
5cd0: 20 69 66 28 20 6e 4f 75 74 3e 3d 64 62 2d 3e 61   if( nOut>=db->a
5ce0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5cf0: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
5d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5d10: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
5d20: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  g(context);.    
5d30: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5d40: 65 28 64 62 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  e(db, zOut);.   
5d50: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5d60: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4f 6c 64 20     }.      zOld 
5d70: 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 20 20 7a 4f  = zOut;.      zO
5d80: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ut = sqlite3_rea
5d90: 6c 6c 6f 63 28 7a 4f 75 74 2c 20 28 69 6e 74 29  lloc(zOut, (int)
5da0: 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  nOut);.      if(
5db0: 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zOut==0 ){.    
5dc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5dd0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
5de0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
5df0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5e00: 62 2c 20 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20  b, zOld);.      
5e10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
5e20: 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  }.      memcpy(&
5e30: 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65 70 2c 20 6e  zOut[j], zRep, n
5e40: 52 65 70 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d  Rep);.      j +=
5e50: 20 6e 52 65 70 3b 0a 20 20 20 20 20 20 69 20 2b   nRep;.      i +
5e60: 3d 20 6e 50 61 74 74 65 72 6e 2d 31 3b 0a 20 20  = nPattern-1;.  
5e70: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5e80: 28 20 6a 2b 6e 53 74 72 2d 69 2b 31 3d 3d 6e 4f  ( j+nStr-i+1==nO
5e90: 75 74 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ut );.  memcpy(&
5ea0: 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53 74 72 5b 69  zOut[j], &zStr[i
5eb0: 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a 20 20 6a 20  ], nStr-i);.  j 
5ec0: 2b 3d 20 6e 53 74 72 20 2d 20 69 3b 0a 20 20 61  += nStr - i;.  a
5ed0: 73 73 65 72 74 28 20 6a 3c 3d 6e 4f 75 74 20 29  ssert( j<=nOut )
5ee0: 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b  ;.  zOut[j] = 0;
5ef0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5f00: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
5f10: 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20 6a 2c 20  (char*)zOut, j, 
5f20: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d  sqlite3_free);.}
5f30: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
5f40: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 52  tation of the TR
5f50: 49 4d 28 29 2c 20 4c 54 52 49 4d 28 29 2c 20 61  IM(), LTRIM(), a
5f60: 6e 64 20 52 54 52 49 4d 28 29 20 66 75 6e 63 74  nd RTRIM() funct
5f70: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 75 73 65  ions..** The use
5f80: 72 64 61 74 61 20 69 73 20 30 78 31 20 66 6f 72  rdata is 0x1 for
5f90: 20 6c 65 66 74 20 74 72 69 6d 2c 20 30 78 32 20   left trim, 0x2 
5fa0: 66 6f 72 20 72 69 67 68 74 20 74 72 69 6d 2c 20  for right trim, 
5fb0: 30 78 33 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  0x3 for both..*/
5fc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 69  .static void tri
5fd0: 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  mFunc(.  sqlite3
5fe0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5ff0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
6000: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6010: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
6020: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6030: 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  zIn;         /* 
6040: 49 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a  Input string */.
6050: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
6060: 20 63 68 61 72 20 2a 7a 43 68 61 72 53 65 74 3b   char *zCharSet;
6070: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 63 68      /* Set of ch
6080: 61 72 61 63 74 65 72 73 20 74 6f 20 74 72 69 6d  aracters to trim
6090: 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 3b 20 20   */.  int nIn;  
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
60c0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 69 6e  r of bytes in in
60d0: 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  put */.  int fla
60e0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
60f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a             /* 1:
6100: 20 74 72 69 6d 6c 65 66 74 20 20 32 3a 20 74 72   trimleft  2: tr
6110: 69 6d 72 69 67 68 74 20 20 33 3a 20 74 72 69 6d  imright  3: trim
6120: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6150: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
6160: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4c 65 6e  igned char *aLen
6170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6180: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 65 61 63 68  * Length of each
6190: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 43   character in zC
61a0: 68 61 72 53 65 74 20 2a 2f 0a 20 20 75 6e 73 69  harSet */.  unsi
61b0: 67 6e 65 64 20 63 68 61 72 20 2a 2a 61 7a 43 68  gned char **azCh
61c0: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ar;           /*
61d0: 20 49 6e 64 69 76 69 64 75 61 6c 20 63 68 61 72   Individual char
61e0: 61 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53  acters in zCharS
61f0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61  et */.  int nCha
6200: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
6210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6220: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
6230: 73 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f  s in zCharSet */
6240: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
6250: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
6260: 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
6270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
6280: 20 20 7d 0a 20 20 7a 49 6e 20 3d 20 73 71 6c 69    }.  zIn = sqli
6290: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
62a0: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
62b0: 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  In==0 ) return;.
62c0: 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f    nIn = sqlite3_
62d0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
62e0: 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [0]);.  assert( 
62f0: 7a 49 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  zIn==sqlite3_val
6300: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
6310: 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d   );.  if( argc==
6320: 31 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  1 ){.    static 
6330: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
6340: 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d 20 3d 20 7b  har lenOne[] = {
6350: 20 31 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63   1 };.    static
6360: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6370: 20 63 6f 6e 73 74 20 61 7a 4f 6e 65 5b 5d 20 3d   const azOne[] =
6380: 20 7b 20 28 75 38 2a 29 22 20 22 20 7d 3b 0a 20   { (u8*)" " };. 
6390: 20 20 20 6e 43 68 61 72 20 3d 20 31 3b 0a 20 20     nChar = 1;.  
63a0: 20 20 61 4c 65 6e 20 3d 20 28 75 38 2a 29 6c 65    aLen = (u8*)le
63b0: 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a 43 68 61 72  nOne;.    azChar
63c0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
63d0: 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a 20 20 20 20  r **)azOne;.    
63e0: 7a 43 68 61 72 53 65 74 20 3d 20 30 3b 0a 20 20  zCharSet = 0;.  
63f0: 7d 65 6c 73 65 20 69 66 28 20 28 7a 43 68 61 72  }else if( (zChar
6400: 53 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Set = sqlite3_va
6410: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
6420: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))==0 ){.    ret
6430: 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  urn;.  }else{.  
6440: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
6450: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 66 6f   char *z;.    fo
6460: 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43  r(z=zCharSet, nC
6470: 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72  har=0; *z; nChar
6480: 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54  ++){.      SQLIT
6490: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a  E_SKIP_UTF8(z);.
64a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43      }.    if( nC
64b0: 68 61 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 61  har>0 ){.      a
64c0: 7a 43 68 61 72 20 3d 20 63 6f 6e 74 65 78 74 4d  zChar = contextM
64d0: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28  alloc(context, (
64e0: 28 69 36 34 29 6e 43 68 61 72 29 2a 28 73 69 7a  (i64)nChar)*(siz
64f0: 65 6f 66 28 63 68 61 72 2a 29 2b 31 29 29 3b 0a  eof(char*)+1));.
6500: 20 20 20 20 20 20 69 66 28 20 61 7a 43 68 61 72        if( azChar
6510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
6520: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
6530: 20 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 6e 73       aLen = (uns
6540: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 61 7a 43  igned char*)&azC
6550: 68 61 72 5b 6e 43 68 61 72 5d 3b 0a 20 20 20 20  har[nChar];.    
6560: 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74    for(z=zCharSet
6570: 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e  , nChar=0; *z; n
6580: 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Char++){.       
6590: 20 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 20 3d   azChar[nChar] =
65a0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
65b0: 2a 29 7a 3b 0a 20 20 20 20 20 20 20 20 53 51 4c  *)z;.        SQL
65c0: 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29  ITE_SKIP_UTF8(z)
65d0: 3b 0a 20 20 20 20 20 20 20 20 61 4c 65 6e 5b 6e  ;.        aLen[n
65e0: 43 68 61 72 5d 20 3d 20 7a 20 2d 20 61 7a 43 68  Char] = z - azCh
65f0: 61 72 5b 6e 43 68 61 72 5d 3b 0a 20 20 20 20 20  ar[nChar];.     
6600: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
6610: 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20  f( nChar>0 ){.  
6620: 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
6630: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 73 71 6c 69  _PTR_TO_INT(sqli
6640: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
6650: 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 69 66 28  ntext));.    if(
6660: 20 66 6c 61 67 73 20 26 20 31 20 29 7b 0a 20 20   flags & 1 ){.  
6670: 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30      while( nIn>0
6680: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
6690: 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  len;.        for
66a0: 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69  (i=0; i<nChar; i
66b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  ++){.          l
66c0: 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20  en = aLen[i];.  
66d0: 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63          if( memc
66e0: 6d 70 28 7a 49 6e 2c 20 61 7a 43 68 61 72 5b 69  mp(zIn, azChar[i
66f0: 5d 2c 20 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65  ], len)==0 ) bre
6700: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6710: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68        if( i>=nCh
6720: 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ar ) break;.    
6730: 20 20 20 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a      zIn += len;.
6740: 20 20 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c          nIn -= l
6750: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
6760: 7d 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  }.    if( flags 
6770: 26 20 32 20 29 7b 0a 20 20 20 20 20 20 77 68 69  & 2 ){.      whi
6780: 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  le( nIn>0 ){.   
6790: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
67a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
67b0: 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nChar; i++){.  
67c0: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c          len = aL
67d0: 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  en[i];.         
67e0: 20 69 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26   if( len<=nIn &&
67f0: 20 6d 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e   memcmp(&zIn[nIn
6800: 2d 6c 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c  -len],azChar[i],
6810: 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  len)==0 ) break;
6820: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6830: 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20     if( i>=nChar 
6840: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
6850: 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20   nIn -= len;.   
6860: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6870: 66 28 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20  f( zCharSet ){. 
6880: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6890: 65 28 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d  e(azChar);.    }
68a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
68b0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
68c0: 78 74 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20  xt, (char*)zIn, 
68d0: 6e 49 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  nIn, SQLITE_TRAN
68e0: 53 49 45 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64  SIENT);.}...#ifd
68f0: 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45  ef SQLITE_SOUNDE
6900: 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  X./*.** Compute 
6910: 74 68 65 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f  the soundex enco
6920: 64 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a  ding of a word..
6930: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
6940: 6f 75 6e 64 65 78 46 75 6e 63 28 0a 20 20 73 71  oundexFunc(.  sq
6950: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6960: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
6970: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
6980: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
6990: 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b  char zResult[8];
69a0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49 6e  .  const u8 *zIn
69b0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
69c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
69d0: 69 67 6e 65 64 20 63 68 61 72 20 69 43 6f 64 65  igned char iCode
69e0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c  [] = {.    0, 0,
69f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6a10: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
6a20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6a30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6a40: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
6a50: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
6a60: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6a70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6a80: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,.    0, 0, 0, 
6a90: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6aa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6ab0: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
6ac0: 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   1, 2, 3, 0, 1, 
6ad0: 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34  2, 0, 0, 2, 2, 4
6ae0: 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31  , 5, 5, 0,.    1
6af0: 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c  , 2, 6, 2, 3, 0,
6b00: 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20   1, 0, 2, 0, 2, 
6b10: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
6b20: 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33     0, 0, 1, 2, 3
6b30: 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c  , 0, 1, 2, 0, 0,
6b40: 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20   2, 2, 4, 5, 5, 
6b50: 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20  0,.    1, 2, 6, 
6b60: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32  2, 3, 0, 1, 0, 2
6b70: 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 2, 0, 0, 0,
6b80: 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73   0, 0,.  };.  as
6b90: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
6ba0: 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29 73 71  .  zIn = (u8*)sq
6bb0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6bc0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
6bd0: 20 7a 49 6e 3d 3d 30 20 29 20 7a 49 6e 20 3d 20   zIn==0 ) zIn = 
6be0: 28 75 38 2a 29 22 22 3b 0a 20 20 66 6f 72 28 69  (u8*)"";.  for(i
6bf0: 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26 20 21 69  =0; zIn[i] && !i
6c00: 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d 29 3b 20  salpha(zIn[i]); 
6c10: 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 49 6e  i++){}.  if( zIn
6c20: 5b 69 5d 20 29 7b 0a 20 20 20 20 75 38 20 70 72  [i] ){.    u8 pr
6c30: 65 76 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a  evcode = iCode[z
6c40: 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20  In[i]&0x7f];.   
6c50: 20 7a 52 65 73 75 6c 74 5b 30 5d 20 3d 20 74 6f   zResult[0] = to
6c60: 75 70 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20  upper(zIn[i]);. 
6c70: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20     for(j=1; j<4 
6c80: 26 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b  && zIn[i]; i++){
6c90: 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20  .      int code 
6ca0: 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30  = iCode[zIn[i]&0
6cb0: 78 37 66 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f];.      if( 
6cc0: 63 6f 64 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  code>0 ){.      
6cd0: 20 20 69 66 28 20 63 6f 64 65 21 3d 70 72 65 76    if( code!=prev
6ce0: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
6cf0: 20 20 70 72 65 76 63 6f 64 65 20 3d 20 63 6f 64    prevcode = cod
6d00: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  e;.          zRe
6d10: 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65  sult[j++] = code
6d20: 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   + '0';.        
6d30: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
6d40: 20 20 20 20 20 20 20 70 72 65 76 63 6f 64 65 20         prevcode 
6d50: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6d60: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c   }.    while( j<
6d70: 34 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75  4 ){.      zResu
6d80: 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20  lt[j++] = '0';. 
6d90: 20 20 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74     }.    zResult
6da0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
6db0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
6dc0: 28 63 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c  (context, zResul
6dd0: 74 2c 20 34 2c 20 53 51 4c 49 54 45 5f 54 52 41  t, 4, SQLITE_TRA
6de0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
6df0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
6e00: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
6e10: 74 2c 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51  t, "?000", 4, SQ
6e20: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
6e30: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  }.}.#endif..#ifn
6e40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6e50: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
6e60: 2a 0a 2a 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20  *.** A function 
6e70: 74 68 61 74 20 6c 6f 61 64 73 20 61 20 73 68 61  that loads a sha
6e80: 72 65 64 2d 6c 69 62 72 61 72 79 20 65 78 74 65  red-library exte
6e90: 6e 73 69 6f 6e 20 74 68 65 6e 20 72 65 74 75 72  nsion then retur
6ea0: 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  ns NULL..*/.stat
6eb0: 69 63 20 76 6f 69 64 20 6c 6f 61 64 45 78 74 28  ic void loadExt(
6ec0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6ed0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
6ee0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
6ef0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
6f00: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
6f10: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
6f20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6f30: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f  t(argv[0]);.  co
6f40: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 6f 63 3b  nst char *zProc;
6f50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
6f60: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6f70: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
6f80: 78 74 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  xt);.  char *zEr
6f90: 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 69 66 28  rMsg = 0;..  if(
6fa0: 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20   argc==2 ){.    
6fb0: 7a 50 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63  zProc = (const c
6fc0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
6fd0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
6fe0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6ff0: 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  zProc = 0;.  }. 
7000: 20 69 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71   if( zFile && sq
7010: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
7020: 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20  sion(db, zFile, 
7030: 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29  zProc, &zErrMsg)
7040: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7050: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
7060: 74 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d  text, zErrMsg, -
7070: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
7080: 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
7090: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
70a0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
70b0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
70c0: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
70d0: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
70e0: 61 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76  a.** sum() or av
70f0: 67 28 29 20 61 67 67 72 65 67 61 74 65 20 63 6f  g() aggregate co
7100: 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  mputation..*/.ty
7110: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75 6d  pedef struct Sum
7120: 43 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75  Ctx SumCtx;.stru
7130: 63 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f  ct SumCtx {.  do
7140: 75 62 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20  uble rSum;      
7150: 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  /* Floating poin
7160: 74 20 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69  t sum */.  i64 i
7170: 53 75 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Sum;         /* 
7180: 49 6e 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20  Integer sum */  
7190: 20 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20   .  i64 cnt;    
71a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
71b0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d  of elements summ
71c0: 65 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66  ed */.  u8 overf
71d0: 6c 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  low;      /* Tru
71e0: 65 20 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65  e if integer ove
71f0: 72 66 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20  rflow seen */.  
7200: 75 38 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20  u8 approx;      
7210: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e    /* True if non
7220: 2d 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77  -integer value w
7230: 61 73 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  as input to the 
7240: 73 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  sum */.};../*.**
7250: 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74   Routines used t
7260: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75  o compute the su
7270: 6d 2c 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20  m, average, and 
7280: 74 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  total..**.** The
7290: 20 53 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20   SUM() function 
72a0: 66 6f 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f  follows the (bro
72b0: 6b 65 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72  ken) SQL standar
72c0: 64 20 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a  d which means.**
72d0: 20 74 68 61 74 20 69 74 20 72 65 74 75 72 6e 73   that it returns
72e0: 20 4e 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73   NULL if it sums
72f0: 20 6f 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e   over no inputs.
7300: 20 20 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a    TOTAL returns.
7310: 2a 2a 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63  ** 0.0 in that c
7320: 61 73 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  ase.  In additio
7330: 6e 2c 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20  n, TOTAL always 
7340: 72 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20  returns a float 
7350: 77 68 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67  where.** SUM mig
7360: 68 74 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74  ht return an int
7370: 65 67 65 72 20 69 66 20 69 74 20 6e 65 76 65 72  eger if it never
7380: 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c   encounters a fl
7390: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
73a0: 76 61 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65  value.  TOTAL ne
73b0: 76 65 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53  ver fails, but S
73c0: 55 4d 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68  UM might through
73d0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
73e0: 0a 2a 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73  .** it overflows
73f0: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
7400: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53  static void sumS
7410: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
7420: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
7430: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
7440: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
7450: 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e   SumCtx *p;.  in
7460: 74 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74  t type;.  assert
7470: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55  ( argc==1 );.  U
7480: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
7490: 61 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c  argc);.  p = sql
74a0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
74b0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
74c0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74  sizeof(*p));.  t
74d0: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ype = sqlite3_va
74e0: 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65  lue_numeric_type
74f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
7500: 20 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49   p && type!=SQLI
7510: 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  TE_NULL ){.    p
7520: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28  ->cnt++;.    if(
7530: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e   type==SQLITE_IN
7540: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69  TEGER ){.      i
7550: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76  64 v = sqlite3_v
7560: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
7570: 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53  0]);.      p->rS
7580: 75 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69  um += v;.      i
7590: 66 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d  f( (p->approx|p-
75a0: 3e 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 29 7b  >overflow)==0 ){
75b0: 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
75c0: 77 53 75 6d 20 3d 20 70 2d 3e 69 53 75 6d 20 2b  wSum = p->iSum +
75d0: 20 76 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   v;.        int 
75e0: 73 31 20 3d 20 70 2d 3e 69 53 75 6d 20 3e 3e 20  s1 = p->iSum >> 
75f0: 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31  (sizeof(i64)*8-1
7600: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  );.        int s
7610: 32 20 3d 20 76 20 20 20 20 20 20 20 3e 3e 20 28  2 = v       >> (
7620: 73 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31 29  sizeof(i64)*8-1)
7630: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 33  ;.        int s3
7640: 20 3d 20 69 4e 65 77 53 75 6d 20 3e 3e 20 28 73   = iNewSum >> (s
7650: 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31 29 3b  izeof(i64)*8-1);
7660: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72  .        p->over
7670: 66 6c 6f 77 20 3d 20 28 73 31 26 73 32 26 7e 73  flow = (s1&s2&~s
7680: 33 29 20 7c 20 28 7e 73 31 26 7e 73 32 26 73 33  3) | (~s1&~s2&s3
7690: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 53  );.        p->iS
76a0: 75 6d 20 3d 20 69 4e 65 77 53 75 6d 3b 0a 20 20  um = iNewSum;.  
76b0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
76c0: 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b  .      p->rSum +
76d0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
76e0: 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b  double(argv[0]);
76f0: 0a 20 20 20 20 20 20 70 2d 3e 61 70 70 72 6f 78  .      p->approx
7700: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
7710: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
7720: 6d 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  mFinalize(sqlite
7730: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7740: 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70  xt){.  SumCtx *p
7750: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
7760: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
7770: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
7780: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74   if( p && p->cnt
7790: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  >0 ){.    if( p-
77a0: 3e 6f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  >overflow ){.   
77b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
77c0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
77d0: 22 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f  "integer overflo
77e0: 77 22 2c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  w",-1);.    }els
77f0: 65 20 69 66 28 20 70 2d 3e 61 70 70 72 6f 78 20  e if( p->approx 
7800: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7810: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
7820: 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d 29  ontext, p->rSum)
7830: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7840: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7850: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
7860: 20 70 2d 3e 69 53 75 6d 29 3b 0a 20 20 20 20 7d   p->iSum);.    }
7870: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
7880: 69 64 20 61 76 67 46 69 6e 61 6c 69 7a 65 28 73  id avgFinalize(s
7890: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
78a0: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43  context){.  SumC
78b0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
78c0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
78d0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
78e0: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
78f0: 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 73  ->cnt>0 ){.    s
7900: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
7910: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d  uble(context, p-
7920: 3e 72 53 75 6d 2f 28 64 6f 75 62 6c 65 29 70 2d  >rSum/(double)p-
7930: 3e 63 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  >cnt);.  }.}.sta
7940: 74 69 63 20 76 6f 69 64 20 74 6f 74 61 6c 46 69  tic void totalFi
7950: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
7960: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
7970: 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20  {.  SumCtx *p;. 
7980: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
7990: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
79a0: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 73 71  ontext, 0);.  sq
79b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
79c0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  ble(context, p ?
79d0: 20 70 2d 3e 72 53 75 6d 20 3a 20 30 2e 30 29 3b   p->rSum : 0.0);
79e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
79f0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
7a00: 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66  e keeps track of
7a10: 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   state informati
7a20: 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f  on for the.** co
7a30: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
7a40: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  function..*/.typ
7a50: 65 64 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e  edef struct Coun
7a60: 74 43 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73  tCtx CountCtx;.s
7a70: 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b  truct CountCtx {
7a80: 0a 20 20 69 36 34 20 6e 3b 0a 7d 3b 0a 0a 2f 2a  .  i64 n;.};../*
7a90: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
7aa0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
7ab0: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
7ac0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
7ad0: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74  tic void countSt
7ae0: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
7af0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
7b00: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
7b10: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
7b20: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
7b30: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
7b40: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
7b50: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
7b60: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
7b70: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
7b80: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
7b90: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29 20 26  type(argv[0])) &
7ba0: 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b  & p ){.    p->n+
7bb0: 2b 3b 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74  +;.  }.}   .stat
7bc0: 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e  ic void countFin
7bd0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
7be0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
7bf0: 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a  .  CountCtx *p;.
7c00: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
7c10: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
7c20: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 73  context, 0);.  s
7c30: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
7c40: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  t64(context, p ?
7c50: 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f   p->n : 0);.}../
7c60: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
7c70: 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29   implement min()
7c80: 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65   and max() aggre
7c90: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  gate functions..
7ca0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
7cb0: 69 6e 6d 61 78 53 74 65 70 28 0a 20 20 73 71 6c  inmaxStep(.  sql
7cc0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7cd0: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f  ntext, .  int No
7ce0: 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74 65  tUsed, .  sqlite
7cf0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7d00: 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d  {.  Mem *pArg  =
7d10: 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b   (Mem *)argv[0];
7d20: 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 20  .  Mem *pBest;. 
7d30: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
7d40: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20 20 69  R(NotUsed);..  i
7d50: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
7d60: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
7d70: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
7d80: 74 75 72 6e 3b 0a 20 20 70 42 65 73 74 20 3d 20  turn;.  pBest = 
7d90: 28 4d 65 6d 20 2a 29 73 71 6c 69 74 65 33 5f 61  (Mem *)sqlite3_a
7da0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
7db0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
7dc0: 28 2a 70 42 65 73 74 29 29 3b 0a 20 20 69 66 28  (*pBest));.  if(
7dd0: 20 21 70 42 65 73 74 20 29 20 72 65 74 75 72 6e   !pBest ) return
7de0: 3b 0a 0a 20 20 69 66 28 20 70 42 65 73 74 2d 3e  ;..  if( pBest->
7df0: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 6e 74  flags ){.    int
7e00: 20 6d 61 78 3b 0a 20 20 20 20 69 6e 74 20 63 6d   max;.    int cm
7e10: 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  p;.    CollSeq *
7e20: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
7e30: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f  etFuncCollSeq(co
7e40: 6e 74 65 78 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ntext);.    /* T
7e50: 68 69 73 20 73 74 65 70 20 66 75 6e 63 74 69 6f  his step functio
7e60: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 62 6f  n is used for bo
7e70: 74 68 20 74 68 65 20 6d 69 6e 28 29 20 61 6e 64  th the min() and
7e80: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
7e90: 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e  s,.    ** the on
7ea0: 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  ly difference be
7eb0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 65  tween the two be
7ec0: 69 6e 67 20 74 68 61 74 20 74 68 65 20 73 65 6e  ing that the sen
7ed0: 73 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  se of the.    **
7ee0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 69   comparison is i
7ef0: 6e 76 65 72 74 65 64 2e 20 46 6f 72 20 74 68 65  nverted. For the
7f00: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
7f10: 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  , the.    ** sql
7f20: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 29  ite3_user_data()
7f30: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
7f40: 73 20 28 76 6f 69 64 20 2a 29 2d 31 2e 20 46 6f  s (void *)-1. Fo
7f50: 72 20 6d 69 6e 28 29 20 69 74 0a 20 20 20 20 2a  r min() it.    *
7f60: 2a 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20  * returns (void 
7f70: 2a 29 64 62 2c 20 77 68 65 72 65 20 64 62 20 69  *)db, where db i
7f80: 73 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 64  s the sqlite3* d
7f90: 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 2e  atabase pointer.
7fa0: 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 66 6f 72  .    ** Therefor
7fb0: 65 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  e the next state
7fc0: 6d 65 6e 74 20 73 65 74 73 20 76 61 72 69 61 62  ment sets variab
7fd0: 6c 65 20 27 6d 61 78 27 20 74 6f 20 31 20 66 6f  le 'max' to 1 fo
7fe0: 72 20 74 68 65 20 6d 61 78 28 29 0a 20 20 20 20  r the max().    
7ff0: 2a 2a 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72  ** aggregate, or
8000: 20 30 20 66 6f 72 20 6d 69 6e 28 29 2e 0a 20 20   0 for min()..  
8010: 20 20 2a 2f 0a 20 20 20 20 6d 61 78 20 3d 20 73    */.    max = s
8020: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
8030: 28 63 6f 6e 74 65 78 74 29 21 3d 30 3b 0a 20 20  (context)!=0;.  
8040: 20 20 63 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d    cmp = sqlite3M
8050: 65 6d 43 6f 6d 70 61 72 65 28 70 42 65 73 74 2c  emCompare(pBest,
8060: 20 70 41 72 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20   pArg, pColl);. 
8070: 20 20 20 69 66 28 20 28 6d 61 78 20 26 26 20 63     if( (max && c
8080: 6d 70 3c 30 29 20 7c 7c 20 28 21 6d 61 78 20 26  mp<0) || (!max &
8090: 26 20 63 6d 70 3e 30 29 20 29 7b 0a 20 20 20 20  & cmp>0) ){.    
80a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
80b0: 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72 67  Copy(pBest, pArg
80c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
80d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
80e0: 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20  eMemCopy(pBest, 
80f0: 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  pArg);.  }.}.sta
8100: 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46  tic void minMaxF
8110: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
8120: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
8130: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ){.  sqlite3_val
8140: 75 65 20 2a 70 52 65 73 3b 0a 20 20 70 52 65 73  ue *pRes;.  pRes
8150: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75   = (sqlite3_valu
8160: 65 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  e *)sqlite3_aggr
8170: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
8180: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28  ntext, 0);.  if(
8190: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 69 66 28   pRes ){.    if(
81a0: 20 70 52 65 73 2d 3e 66 6c 61 67 73 20 29 7b 0a   pRes->flags ){.
81b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
81c0: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
81d0: 78 74 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  xt, pRes);.    }
81e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
81f0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65 73 29  MemRelease(pRes)
8200: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67  ;.  }.}../*.** g
8210: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 45 58 50 52  roup_concat(EXPR
8220: 2c 20 3f 53 45 50 41 52 41 54 4f 52 3f 29 0a 2a  , ?SEPARATOR?).*
8230: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72  /.static void gr
8240: 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 28 0a 20  oupConcatStep(. 
8250: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8260: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
8270: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
8280: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
8290: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
82a0: 56 61 6c 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  Val;.  StrAccum 
82b0: 2a 70 41 63 63 75 6d 3b 0a 20 20 63 6f 6e 73 74  *pAccum;.  const
82c0: 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 69   char *zSep;.  i
82d0: 6e 74 20 6e 56 61 6c 2c 20 6e 53 65 70 2c 20 69  nt nVal, nSep, i
82e0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20  ;.  if( argc==0 
82f0: 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  || sqlite3_value
8300: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
8310: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
8320: 74 75 72 6e 3b 0a 20 20 70 41 63 63 75 6d 20 3d  turn;.  pAccum =
8330: 20 28 53 74 72 41 63 63 75 6d 2a 29 73 71 6c 69   (StrAccum*)sqli
8340: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
8350: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
8360: 69 7a 65 6f 66 28 2a 70 41 63 63 75 6d 29 29 3b  izeof(*pAccum));
8370: 0a 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20 29  ..  if( pAccum )
8380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
8390: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
83a0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
83b0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 70 41 63 63  ntext);.    pAcc
83c0: 75 6d 2d 3e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20  um->useMalloc = 
83d0: 31 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 6d  1;.    pAccum->m
83e0: 78 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c 69  xAlloc = db->aLi
83f0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8400: 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 69 66  _LENGTH];.    if
8410: 28 20 70 41 63 63 75 6d 2d 3e 6e 43 68 61 72 20  ( pAccum->nChar 
8420: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72 67  ){.      if( arg
8430: 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  c>1 ){.        z
8440: 53 65 70 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  Sep = (char*)sql
8450: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8460: 61 72 67 76 5b 61 72 67 63 2d 31 5d 29 3b 0a 20  argv[argc-1]);. 
8470: 20 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 71         nSep = sq
8480: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8490: 73 28 61 72 67 76 5b 61 72 67 63 2d 31 5d 29 3b  s(argv[argc-1]);
84a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
84b0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22        zSep = ","
84c0: 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70 20 3d  ;.        nSep =
84d0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
84e0: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
84f0: 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20  mAppend(pAccum, 
8500: 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20 20 20  zSep, nSep);.   
8510: 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20   }.    i = 0;.  
8520: 20 20 64 6f 7b 0a 20 20 20 20 20 20 7a 56 61 6c    do{.      zVal
8530: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
8540: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8550: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6e 56 61  v[i]);.      nVa
8560: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
8570: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 69 5d 29  e_bytes(argv[i])
8580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
8590: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41  trAccumAppend(pA
85a0: 63 63 75 6d 2c 20 7a 56 61 6c 2c 20 6e 56 61 6c  ccum, zVal, nVal
85b0: 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  );.      i++;.  
85c0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 61 72 67 63    }while( i<argc
85d0: 2d 31 20 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  -1 );.  }.}.stat
85e0: 69 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e  ic void groupCon
85f0: 63 61 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  catFinalize(sqli
8600: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
8610: 74 65 78 74 29 7b 0a 20 20 53 74 72 41 63 63 75  text){.  StrAccu
8620: 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 70 41 63  m *pAccum;.  pAc
8630: 63 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 61 67  cum = sqlite3_ag
8640: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
8650: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
8660: 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20  f( pAccum ){.   
8670: 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 74 6f 6f   if( pAccum->too
8680: 42 69 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Big ){.      sql
8690: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
86a0: 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74  r_toobig(context
86b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
86c0: 20 70 41 63 63 75 6d 2d 3e 6d 61 6c 6c 6f 63 46   pAccum->mallocF
86d0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
86e0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
86f0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
8700: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20  t);.    }else{  
8710: 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33    .      sqlite3
8720: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
8730: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53 74 72  text, sqlite3Str
8740: 41 63 63 75 6d 46 69 6e 69 73 68 28 70 41 63 63  AccumFinish(pAcc
8750: 75 6d 29 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  um), -1, .      
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8780: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
8790: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
87a0: 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 61  ion registered a
87b0: 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
87c0: 43 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 53  C functions as S
87d0: 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e  QL.** functions.
87e0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
87f0: 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e   the only routin
8800: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 77  e in this file w
8810: 69 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20  ith.** external 
8820: 6c 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  linkage..*/.void
8830: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
8840: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
8850: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
8860: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8870: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
8880: 73 71 6c 69 74 65 33 41 6c 74 65 72 46 75 6e 63  sqlite3AlterFunc
8890: 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69  tions(db);.#endi
88a0: 66 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  f.  if( !db->mal
88b0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
88c0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
88d0: 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
88e0: 69 6f 6e 28 64 62 2c 20 22 4d 41 54 43 48 22 2c  ion(db, "MATCH",
88f0: 20 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   2);.    assert(
8900: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
8910: 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  M || rc==SQLITE_
8920: 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OK );.    if( rc
8930: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
8940: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  {.      db->mall
8950: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
8960: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
8970: 51 4c 49 54 45 5f 53 53 45 0a 20 20 28 76 6f 69  QLITE_SSE.  (voi
8980: 64 29 73 71 6c 69 74 65 33 53 73 65 46 75 6e 63  d)sqlite3SseFunc
8990: 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69  tions(db);.#endi
89a0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  f.}../*.** Set t
89b0: 68 65 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67 20  he LIKEOPT flag 
89c0: 6f 6e 20 74 68 65 20 32 2d 61 72 67 75 6d 65 6e  on the 2-argumen
89d0: 74 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  t function with 
89e0: 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a  the given name..
89f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
8a00: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73 71  etLikeOptFlag(sq
8a10: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
8a20: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
8a30: 74 20 66 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75  t flagVal){.  Fu
8a40: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 70  ncDef *pDef;.  p
8a50: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
8a60: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
8a70: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
8a80: 65 29 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  e), 2, SQLITE_UT
8a90: 46 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 44  F8, 0);.  if( pD
8aa0: 65 66 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e  ef ){.    pDef->
8ab0: 66 6c 61 67 73 20 3d 20 66 6c 61 67 56 61 6c 3b  flags = flagVal;
8ac0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
8ad0: 67 69 73 74 65 72 20 74 68 65 20 62 75 69 6c 74  gister the built
8ae0: 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f  -in LIKE and GLO
8af0: 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  B functions.  Th
8b00: 65 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 0a  e caseSensitive.
8b10: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  ** parameter det
8b20: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
8b30: 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49 4b 45 20  or not the LIKE 
8b40: 6f 70 65 72 61 74 6f 72 20 69 73 20 63 61 73 65  operator is case
8b50: 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65 2e 20 20  .** sensitive.  
8b60: 47 4c 4f 42 20 69 73 20 61 6c 77 61 79 73 20 63  GLOB is always c
8b70: 61 73 65 20 73 65 6e 73 69 74 69 76 65 2e 0a 2a  ase sensitive..*
8b80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
8b90: 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69  gisterLikeFuncti
8ba0: 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ons(sqlite3 *db,
8bb0: 20 69 6e 74 20 63 61 73 65 53 65 6e 73 69 74 69   int caseSensiti
8bc0: 76 65 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  ve){.  struct co
8bd0: 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f  mpareInfo *pInfo
8be0: 3b 0a 20 20 69 66 28 20 63 61 73 65 53 65 6e 73  ;.  if( caseSens
8bf0: 69 74 69 76 65 20 29 7b 0a 20 20 20 20 70 49 6e  itive ){.    pIn
8c00: 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d  fo = (struct com
8c10: 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49  pareInfo*)&likeI
8c20: 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b  nfoAlt;.  }else{
8c30: 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73 74  .    pInfo = (st
8c40: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
8c50: 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 3b  *)&likeInfoNorm;
8c60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 72  .  }.  sqlite3Cr
8c70: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 6c 69  eateFunc(db, "li
8c80: 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  ke", 2, SQLITE_U
8c90: 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65  TF8, pInfo, like
8ca0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73  Func, 0, 0);.  s
8cb0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
8cc0: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 33 2c 20  (db, "like", 3, 
8cd0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e  SQLITE_UTF8, pIn
8ce0: 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c  fo, likeFunc, 0,
8cf0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72   0);.  sqlite3Cr
8d00: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 67 6c  eateFunc(db, "gl
8d10: 6f 62 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  ob", 2, SQLITE_U
8d20: 54 46 38 2c 20 0a 20 20 20 20 20 20 28 73 74 72  TF8, .      (str
8d30: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a  uct compareInfo*
8d40: 29 26 67 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65  )&globInfo, like
8d50: 46 75 6e 63 2c 20 30 2c 30 29 3b 0a 20 20 73 65  Func, 0,0);.  se
8d60: 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c  tLikeOptFlag(db,
8d70: 20 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f   "glob", SQLITE_
8d80: 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49  FUNC_LIKE | SQLI
8d90: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20  TE_FUNC_CASE);. 
8da0: 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28   setLikeOptFlag(
8db0: 64 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20  db, "like", .   
8dc0: 20 20 20 63 61 73 65 53 65 6e 73 69 74 69 76 65     caseSensitive
8dd0: 20 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ? (SQLITE_FUNC_
8de0: 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55  LIKE | SQLITE_FU
8df0: 4e 43 5f 43 41 53 45 29 20 3a 20 53 51 4c 49 54  NC_CASE) : SQLIT
8e00: 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a  E_FUNC_LIKE);.}.
8e10: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69  ./*.** pExpr poi
8e20: 6e 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65 73  nts to an expres
8e30: 73 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c 65  sion which imple
8e40: 6d 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f 6e  ments a function
8e50: 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 61  .  If.** it is a
8e60: 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61 70  ppropriate to ap
8e70: 70 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  ply the LIKE opt
8e80: 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61  imization to tha
8e90: 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68  t function.** th
8ea0: 65 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74 68  en set aWc[0] th
8eb0: 72 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f 20  rough aWc[2] to 
8ec0: 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68 61  the wildcard cha
8ed0: 72 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20 72  racters and.** r
8ee0: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
8ef0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
8f00: 6e 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c 65  not a LIKE-style
8f10: 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a 2a   function then.*
8f20: 2a 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  * return FALSE..
8f30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
8f40: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c  LikeFunction(sql
8f50: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
8f60: 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73 4e  pExpr, int *pIsN
8f70: 6f 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57 63  ocase, char *aWc
8f80: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44  ){.  FuncDef *pD
8f90: 65 66 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  ef;.  if( pExpr-
8fa0: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
8fb0: 20 7c 7c 20 21 70 45 78 70 72 2d 3e 70 4c 69 73   || !pExpr->pLis
8fc0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
8fd0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  0;.  }.  if( pEx
8fe0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
8ff0: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
9000: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 44 65 66 20  n 0;.  }.  pDef 
9010: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
9020: 63 74 69 6f 6e 28 64 62 2c 20 28 63 68 61 72 2a  ction(db, (char*
9030: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
9040: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
9050: 20 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   2,.            
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
9080: 3b 0a 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20  ;.  if( pDef==0 
9090: 7c 7c 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  || (pDef->flags 
90a0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  & SQLITE_FUNC_LI
90b0: 4b 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  KE)==0 ){.    re
90c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
90d0: 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73  * The memcpy() s
90e0: 74 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73  tatement assumes
90f0: 20 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61   that the wildca
9100: 72 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72  rd characters ar
9110: 65 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  e.  ** the first
9120: 20 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74   three statement
9130: 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65  s in the compare
9140: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
9150: 20 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   The.  ** assert
9160: 73 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  s() that follow 
9170: 76 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75  verify that assu
9180: 6d 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65  mption.  */.  me
9190: 6d 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e  mcpy(aWc, pDef->
91a0: 70 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20  pUserData, 3);. 
91b0: 20 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29   assert( (char*)
91c0: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20  &likeInfoAlt == 
91d0: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
91e0: 41 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a  Alt.matchAll );.
91f0: 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61    assert( &((cha
9200: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29  r*)&likeInfoAlt)
9210: 5b 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c  [1] == (char*)&l
9220: 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68  ikeInfoAlt.match
9230: 4f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  One );.  assert(
9240: 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49   &((char*)&likeI
9250: 6e 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63  nfoAlt)[2] == (c
9260: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
9270: 74 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20  t.matchSet );.  
9280: 2a 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44  *pIsNocase = (pD
9290: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
92a0: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30  TE_FUNC_CASE)==0
92b0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
92c0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 61 6c 6c 20 6f  ./*.** All all o
92d0: 66 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74  f the FuncDef st
92e0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
92f0: 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61  aBuiltinFunc[] a
9300: 72 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  rray above.** to
9310: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
9320: 74 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e  tion hash table.
9330: 20 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 74    This occurs at
9340: 20 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a   start-time (as.
9350: 2a 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65  ** a consequence
9360: 20 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   of calling sqli
9370: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
9380: 29 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  )..**.** After t
9390: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
93a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
93b0: 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75  RegisterGlobalFu
93c0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
93d0: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c   /*.  ** The fol
93e0: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
93f0: 64 73 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ds FuncDef struc
9400: 74 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66  tures for all of
9410: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20   the functions. 
9420: 20 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74   ** defined in t
9430: 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  his file..  **. 
9440: 20 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63 61   ** The array ca
9450: 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  nnot be constant
9460: 20 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61   since changes a
9470: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20  re made to the. 
9480: 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73   ** FuncDef.pHas
9490: 68 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74  h elements at st
94a0: 61 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65  art-time.  The e
94b0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20  lements of this 
94c0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72  array.  ** are r
94d0: 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69  ead-only after i
94e0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73  nitialization is
94f0: 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2f 0a   complete..  */.
9500: 20 20 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f    static SQLITE_
9510: 57 53 44 20 46 75 6e 63 44 65 66 20 61 42 75 69  WSD FuncDef aBui
9520: 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20  ltinFunc[] = {. 
9530: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69     FUNCTION(ltri
9540: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
9550: 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e  1, 1, 0, trimFun
9560: 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  c         ),.   
9570: 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c   FUNCTION(ltrim,
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
9590: 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20   1, 0, trimFunc 
95a0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
95b0: 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20  UNCTION(rtrim,  
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 32              1, 2
95d0: 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20  , 0, trimFunc   
95e0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
95f0: 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20  CTION(rtrim,    
9600: 20 20 20 20 20 20 20 20 20 20 32 2c 20 32 2c 20            2, 2, 
9610: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
9620: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9630: 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20  ION(trim,       
9640: 20 20 20 20 20 20 20 20 31 2c 20 33 2c 20 30 2c          1, 3, 0,
9650: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
9660: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
9670: 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20  N(trim,         
9680: 20 20 20 20 20 20 32 2c 20 33 2c 20 30 2c 20 74        2, 3, 0, t
9690: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
96a0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
96b0: 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  min,            
96c0: 20 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69 6e     -1, 0, 1, min
96d0: 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20 29 2c  maxFunc       ),
96e0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69  .    FUNCTION(mi
96f0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
9700: 20 20 30 2c 20 30 2c 20 31 2c 20 30 20 20 20 20    0, 0, 1, 0    
9710: 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20              ),. 
9720: 20 20 20 41 47 47 52 45 47 41 54 45 28 6d 69 6e     AGGREGATE(min
9730: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9740: 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53  1, 0, 1, minmaxS
9750: 74 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61 78  tep,      minMax
9760: 46 69 6e 61 6c 69 7a 65 20 29 2c 0a 20 20 20 20  Finalize ),.    
9770: 46 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20  FUNCTION(max,   
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
9790: 31 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63  1, 1, minmaxFunc
97a0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
97b0: 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20  NCTION(max,     
97c0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c             0, 1,
97d0: 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   1, 0           
97e0: 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52       ),.    AGGR
97f0: 45 47 41 54 45 28 6d 61 78 2c 20 20 20 20 20 20  EGATE(max,      
9800: 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 31           1, 1, 1
9810: 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20  , minmaxStep,   
9820: 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a     minMaxFinaliz
9830: 65 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f  e ),.    FUNCTIO
9840: 4e 28 74 79 70 65 6f 66 2c 20 20 20 20 20 20 20  N(typeof,       
9850: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 74        1, 0, 0, t
9860: 79 70 65 6f 66 46 75 6e 63 20 20 20 20 20 20 20  ypeofFunc       
9870: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
9880: 6c 65 6e 67 74 68 2c 20 20 20 20 20 20 20 20 20  length,         
9890: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 65 6e      1, 0, 0, len
98a0: 67 74 68 46 75 6e 63 20 20 20 20 20 20 20 29 2c  gthFunc       ),
98b0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75  .    FUNCTION(su
98c0: 62 73 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  bstr,           
98d0: 20 20 32 2c 20 30 2c 20 30 2c 20 73 75 62 73 74    2, 0, 0, subst
98e0: 72 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  rFunc       ),. 
98f0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62 73     FUNCTION(subs
9900: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
9910: 33 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72 46  3, 0, 0, substrF
9920: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
9930: 20 46 55 4e 43 54 49 4f 4e 28 61 62 73 2c 20 20   FUNCTION(abs,  
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
9950: 20 30 2c 20 30 2c 20 61 62 73 46 75 6e 63 20 20   0, 0, absFunc  
9960: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
9970: 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20  UNCTION(round,  
9980: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
9990: 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20  , 0, roundFunc  
99a0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
99b0: 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20 20  CTION(round,    
99c0: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
99d0: 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 20 20  0, roundFunc    
99e0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
99f0: 49 4f 4e 28 75 70 70 65 72 2c 20 20 20 20 20 20  ION(upper,      
9a00: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
9a10: 20 75 70 70 65 72 46 75 6e 63 20 20 20 20 20 20   upperFunc      
9a20: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
9a30: 4e 28 6c 6f 77 65 72 2c 20 20 20 20 20 20 20 20  N(lower,        
9a40: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c        1, 0, 0, l
9a50: 6f 77 65 72 46 75 6e 63 20 20 20 20 20 20 20 20  owerFunc        
9a60: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
9a70: 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20  coalesce,       
9a80: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 30 20 20      1, 0, 0, 0  
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c                ),
9aa0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f  .    FUNCTION(co
9ab0: 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20 20  alesce,         
9ac0: 20 2d 31 2c 20 30 2c 20 30 2c 20 69 66 6e 75 6c   -1, 0, 0, ifnul
9ad0: 6c 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  lFunc       ),. 
9ae0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c     FUNCTION(coal
9af0: 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  esce,           
9b00: 30 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20  0, 0, 0, 0      
9b10: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
9b20: 20 46 55 4e 43 54 49 4f 4e 28 68 65 78 2c 20 20   FUNCTION(hex,  
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
9b40: 20 30 2c 20 30 2c 20 68 65 78 46 75 6e 63 20 20   0, 0, hexFunc  
9b50: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
9b60: 55 4e 43 54 49 4f 4e 28 69 66 6e 75 6c 6c 2c 20  UNCTION(ifnull, 
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
9b80: 2c 20 31 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20  , 1, ifnullFunc 
9b90: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
9ba0: 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 2c 20 20 20  CTION(random,   
9bb0: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20           -1, 0, 
9bc0: 30 2c 20 72 61 6e 64 6f 6d 46 75 6e 63 20 20 20  0, randomFunc   
9bd0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9be0: 49 4f 4e 28 72 61 6e 64 6f 6d 62 6c 6f 62 2c 20  ION(randomblob, 
9bf0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
9c00: 20 72 61 6e 64 6f 6d 42 6c 6f 62 20 20 20 20 20   randomBlob     
9c10: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
9c20: 4e 28 6e 75 6c 6c 69 66 2c 20 20 20 20 20 20 20  N(nullif,       
9c30: 20 20 20 20 20 20 32 2c 20 30 2c 20 31 2c 20 6e        2, 0, 1, n
9c40: 75 6c 6c 69 66 46 75 6e 63 20 20 20 20 20 20 20  ullifFunc       
9c50: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
9c60: 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 2c 20  sqlite_version, 
9c70: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 76 65 72      0, 0, 0, ver
9c80: 73 69 6f 6e 46 75 6e 63 20 20 20 20 20 20 29 2c  sionFunc      ),
9c90: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 71 75  .    FUNCTION(qu
9ca0: 6f 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ote,            
9cb0: 20 20 31 2c 20 30 2c 20 30 2c 20 71 75 6f 74 65    1, 0, 0, quote
9cc0: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
9cd0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 61 73 74     FUNCTION(last
9ce0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 2c 20 20  _insert_rowid,  
9cf0: 30 2c 20 30 2c 20 30 2c 20 6c 61 73 74 5f 69 6e  0, 0, 0, last_in
9d00: 73 65 72 74 5f 72 6f 77 69 64 29 2c 0a 20 20 20  sert_rowid),.   
9d10: 20 46 55 4e 43 54 49 4f 4e 28 63 68 61 6e 67 65   FUNCTION(change
9d20: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  s,            0,
9d30: 20 30 2c 20 30 2c 20 63 68 61 6e 67 65 73 20 20   0, 0, changes  
9d40: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
9d50: 55 4e 43 54 49 4f 4e 28 74 6f 74 61 6c 5f 63 68  UNCTION(total_ch
9d60: 61 6e 67 65 73 2c 20 20 20 20 20 20 30 2c 20 30  anges,      0, 0
9d70: 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61 6e 67  , 0, total_chang
9d80: 65 73 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e  es    ),.    FUN
9d90: 43 54 49 4f 4e 28 72 65 70 6c 61 63 65 2c 20 20  CTION(replace,  
9da0: 20 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20            3, 0, 
9db0: 30 2c 20 72 65 70 6c 61 63 65 46 75 6e 63 20 20  0, replaceFunc  
9dc0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9dd0: 49 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c 20 20 20  ION(zeroblob,   
9de0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
9df0: 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 20 20 20   zeroblobFunc   
9e00: 20 20 29 2c 0a 20 20 23 69 66 64 65 66 20 53 51    ),.  #ifdef SQ
9e10: 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20 20 20  LITE_SOUNDEX.   
9e20: 20 46 55 4e 43 54 49 4f 4e 28 73 6f 75 6e 64 65   FUNCTION(sounde
9e30: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  x,            1,
9e40: 20 30 2c 20 30 2c 20 73 6f 75 6e 64 65 78 46 75   0, 0, soundexFu
9e50: 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 23 65 6e  nc      ),.  #en
9e60: 64 69 66 0a 20 20 23 69 66 6e 64 65 66 20 53 51  dif.  #ifndef SQ
9e70: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
9e80: 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 46 55 4e  XTENSION.    FUN
9e90: 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e  CTION(load_exten
9ea0: 73 69 6f 6e 2c 20 20 20 20 20 31 2c 20 30 2c 20  sion,     1, 0, 
9eb0: 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20  0, loadExt      
9ec0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9ed0: 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ION(load_extensi
9ee0: 6f 6e 2c 20 20 20 20 20 32 2c 20 30 2c 20 30 2c  on,     2, 0, 0,
9ef0: 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20 20 20   loadExt        
9f00: 20 20 29 2c 0a 20 20 23 65 6e 64 69 66 0a 20 20    ),.  #endif.  
9f10: 20 20 41 47 47 52 45 47 41 54 45 28 73 75 6d 2c    AGGREGATE(sum,
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
9f30: 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c  , 0, 0, sumStep,
9f40: 20 20 20 20 20 20 20 20 20 73 75 6d 46 69 6e 61           sumFina
9f50: 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20 20 41  lize    ),.    A
9f60: 47 47 52 45 47 41 54 45 28 74 6f 74 61 6c 2c 20  GGREGATE(total, 
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
9f80: 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20  , 0, sumStep,   
9f90: 20 20 20 20 20 20 74 6f 74 61 6c 46 69 6e 61 6c        totalFinal
9fa0: 69 7a 65 20 20 20 20 29 2c 0a 20 20 20 20 41 47  ize    ),.    AG
9fb0: 47 52 45 47 41 54 45 28 61 76 67 2c 20 20 20 20  GREGATE(avg,    
9fc0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
9fd0: 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20   0, sumStep,    
9fe0: 20 20 20 20 20 61 76 67 46 69 6e 61 6c 69 7a 65       avgFinalize
9ff0: 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45      ),.    AGGRE
a000: 47 41 54 45 28 63 6f 75 6e 74 2c 20 20 20 20 20  GATE(count,     
a010: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
a020: 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20 20 20   countStep,     
a030: 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20    countFinalize 
a040: 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54   ),.    AGGREGAT
a050: 45 28 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  E(count,        
a060: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 63 6f       1, 0, 0, co
a070: 75 6e 74 53 74 65 70 2c 20 20 20 20 20 20 20 63  untStep,       c
a080: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20 29 2c  ountFinalize  ),
a090: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 67  .    AGGREGATE(g
a0a0: 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20 20 20 20  roup_concat,    
a0b0: 20 2d 31 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70   -1, 0, 0, group
a0c0: 43 6f 6e 63 61 74 53 74 65 70 2c 20 67 72 6f 75  ConcatStep, grou
a0d0: 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 29  pConcatFinalize)
a0e0: 2c 0a 20 20 0a 20 20 20 20 4c 49 4b 45 46 55 4e  ,.  .    LIKEFUN
a0f0: 43 28 67 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f 62  C(glob, 2, &glob
a100: 49 6e 66 6f 2c 20 53 51 4c 49 54 45 5f 46 55 4e  Info, SQLITE_FUN
a110: 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55  C_LIKE|SQLITE_FU
a120: 4e 43 5f 43 41 53 45 29 2c 0a 20 20 23 69 66 64  NC_CASE),.  #ifd
a130: 65 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53  ef SQLITE_CASE_S
a140: 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 0a 20 20  ENSITIVE_LIKE.  
a150: 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c    LIKEFUNC(like,
a160: 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74   2, &likeInfoAlt
a170: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  , SQLITE_FUNC_LI
a180: 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  KE|SQLITE_FUNC_C
a190: 41 53 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55  ASE),.    LIKEFU
a1a0: 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b  NC(like, 3, &lik
a1b0: 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45  eInfoAlt, SQLITE
a1c0: 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54  _FUNC_LIKE|SQLIT
a1d0: 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20  E_FUNC_CASE),.  
a1e0: 23 65 6c 73 65 0a 20 20 20 20 4c 49 4b 45 46 55  #else.    LIKEFU
a1f0: 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b  NC(like, 2, &lik
a200: 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54  eInfoNorm, SQLIT
a210: 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20  E_FUNC_LIKE),.  
a220: 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c    LIKEFUNC(like,
a230: 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72   3, &likeInfoNor
a240: 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  m, SQLITE_FUNC_L
a250: 49 4b 45 29 2c 0a 20 20 23 65 6e 64 69 66 0a 20  IKE),.  #endif. 
a260: 20 7d 3b 0a 0a 20 20 69 6e 74 20 69 3b 0a 20 20   };..  int i;.  
a270: 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61  FuncDefHash *pHa
a280: 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e  sh = &GLOBAL(Fun
a290: 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65  cDefHash, sqlite
a2a0: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
a2b0: 29 3b 0a 20 20 46 75 6e 63 44 65 66 20 2a 61 46  );.  FuncDef *aF
a2c0: 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66 2a 29  unc = (FuncDef*)
a2d0: 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 2c  &GLOBAL(FuncDef,
a2e0: 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 3b 0a   aBuiltinFunc);.
a2f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
a300: 72 61 79 53 69 7a 65 28 61 42 75 69 6c 74 69 6e  raySize(aBuiltin
a310: 46 75 6e 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Func); i++){.   
a320: 20 73 71 6c 69 74 65 33 46 75 6e 63 44 65 66 49   sqlite3FuncDefI
a330: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 26 61 46  nsert(pHash, &aF
a340: 75 6e 63 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  unc[i]);.  }.  s
a350: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 44 61  qlite3RegisterDa
a360: 74 65 54 69 6d 65 46 75 6e 63 74 69 6f 6e 73 28  teTimeFunctions(
a370: 29 3b 0a 7d 0a                                   );.}.