/ Hex Artifact Content
Login

Artifact 8431b40a7843d1024145684d303c55b4ee087bbe:


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 33 20 32 30 30 38 2f 30 39 2f 30 33  1.203 2008/09/03
02a0: 20 31 37 3a 31 31 3a 31 36 20 64 72 68 20 45 78   17:11:16 drh Ex
02b0: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
02c0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
02d0: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
02e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
02f0: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  b.h>.#include <a
0300: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0310: 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 2f  e "vdbeInt.h"../
0320: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0330: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
0340: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
0350: 74 68 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  th a function..*
0360: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
0370: 20 2a 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63   *sqlite3GetFunc
0380: 43 6f 6c 6c 53 65 71 28 73 71 6c 69 74 65 33 5f  CollSeq(sqlite3_
0390: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
03a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6e 74  ){.  return cont
03b0: 65 78 74 2d 3e 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  ext->pColl;.}../
03c0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
03d0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 6f 6e 2d 61  ion of the non-a
03e0: 67 67 72 65 67 61 74 65 20 6d 69 6e 28 29 20 61  ggregate min() a
03f0: 6e 64 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  nd max() functio
0400: 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns.*/.static voi
0410: 64 20 6d 69 6e 6d 61 78 46 75 6e 63 28 0a 20 20  d minmaxFunc(.  
0420: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
0430: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
0440: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
0450: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
0460: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
0470: 61 73 6b 3b 20 20 20 20 2f 2a 20 30 20 66 6f 72  ask;    /* 0 for
0480: 20 6d 69 6e 28 29 20 6f 72 20 30 78 66 66 66 66   min() or 0xffff
0490: 66 66 66 66 20 66 6f 72 20 6d 61 78 28 29 20 2a  ffff for max() *
04a0: 2f 0a 20 20 69 6e 74 20 69 42 65 73 74 3b 0a 20  /.  int iBest;. 
04b0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
04c0: 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20  ..  if( argc==0 
04d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 61 73 6b  ) return;.  mask
04e0: 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
04f0: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3d 3d 30  data(context)==0
0500: 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 70 43 6f   ? 0 : -1;.  pCo
0510: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46  ll = sqlite3GetF
0520: 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65  uncCollSeq(conte
0530: 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xt);.  assert( p
0540: 43 6f 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Coll );.  assert
0550: 28 20 6d 61 73 6b 3d 3d 2d 31 20 7c 7c 20 6d 61  ( mask==-1 || ma
0560: 73 6b 3d 3d 30 20 29 3b 0a 20 20 69 42 65 73 74  sk==0 );.  iBest
0570: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
0580: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
0590: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
05a0: 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20  NULL ) return;. 
05b0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
05c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
05d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
05e0: 70 65 28 61 72 67 76 5b 69 5d 29 3d 3d 53 51 4c  pe(argv[i])==SQL
05f0: 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72  ITE_NULL ) retur
0600: 6e 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  n;.    if( (sqli
0610: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72  te3MemCompare(ar
0620: 67 76 5b 69 42 65 73 74 5d 2c 20 61 72 67 76 5b  gv[iBest], argv[
0630: 69 5d 2c 20 70 43 6f 6c 6c 29 5e 6d 61 73 6b 29  i], pColl)^mask)
0640: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 42 65  >=0 ){.      iBe
0650: 73 74 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  st = i;.    }.  
0660: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
0670: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
0680: 2c 20 61 72 67 76 5b 69 42 65 73 74 5d 29 3b 0a  , argv[iBest]);.
0690: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
06a0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20  the type of the 
06b0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
06c0: 74 69 63 20 76 6f 69 64 20 74 79 70 65 6f 66 46  tic void typeofF
06d0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
06e0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
06f0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
0700: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
0710: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
0720: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 77  har *z = 0;.  sw
0730: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
0740: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0750: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
0760: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 20 20 20 7a 20  LITE_NULL:    z 
0770: 3d 20 22 6e 75 6c 6c 22 3b 20 20 20 20 62 72 65  = "null";    bre
0780: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0790: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7a 20 3d  ITE_INTEGER: z =
07a0: 20 22 69 6e 74 65 67 65 72 22 3b 20 62 72 65 61   "integer"; brea
07b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
07c0: 54 45 5f 54 45 58 54 3a 20 20 20 20 7a 20 3d 20  TE_TEXT:    z = 
07d0: 22 74 65 78 74 22 3b 20 20 20 20 62 72 65 61 6b  "text";    break
07e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
07f0: 45 5f 46 4c 4f 41 54 3a 20 20 20 7a 20 3d 20 22  E_FLOAT:   z = "
0800: 72 65 61 6c 22 3b 20 20 20 20 62 72 65 61 6b 3b  real";    break;
0810: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0820: 5f 42 4c 4f 42 3a 20 20 20 20 7a 20 3d 20 22 62  _BLOB:    z = "b
0830: 6c 6f 62 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  lob";    break;.
0840: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
0850: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
0860: 74 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  t, z, -1, SQLITE
0870: 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a  _STATIC);.}.../*
0880: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
0890: 6f 6e 20 6f 66 20 74 68 65 20 6c 65 6e 67 74 68  on of the length
08a0: 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73  () function.*/.s
08b0: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 6e 67 74  tatic void lengt
08c0: 68 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  hFunc(.  sqlite3
08d0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
08e0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
08f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0900: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6c  *argv.){.  int l
0910: 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  en;..  assert( a
0920: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 73 77 69 74  rgc==1 );.  swit
0930: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
0940: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
0950: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
0960: 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73  TE_BLOB:.    cas
0970: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
0980: 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
0990: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
09a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
09b0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
09c0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
09d0: 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 20 20  (argv[0]));.    
09e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
09f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
0a00: 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  EXT: {.      con
0a10: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
0a20: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   *z = sqlite3_va
0a30: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
0a40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  );.      if( z==
0a50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
0a60: 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20    len = 0;.     
0a70: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
0a80: 20 20 20 20 20 20 6c 65 6e 2b 2b 3b 0a 20 20 20        len++;.   
0a90: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50       SQLITE_SKIP
0aa0: 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20  _UTF8(z);.      
0ab0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
0ac0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
0ad0: 78 74 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20  xt, len);.      
0ae0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0af0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
0b00: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0b10: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a  _null(context);.
0b20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0b30: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
0b40: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
0b50: 66 20 74 68 65 20 61 62 73 28 29 20 66 75 6e 63  f the abs() func
0b60: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
0b70: 6f 69 64 20 61 62 73 46 75 6e 63 28 73 71 6c 69  oid absFunc(sqli
0b80: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
0b90: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
0ba0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0bb0: 61 72 67 76 29 7b 0a 20 20 61 73 73 65 72 74 28  argv){.  assert(
0bc0: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 73 77   argc==1 );.  sw
0bd0: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
0be0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0bf0: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
0c00: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
0c10: 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d        i64 iVal =
0c20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
0c30: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
0c40: 20 20 20 20 20 69 66 28 20 69 56 61 6c 3c 30 20       if( iVal<0 
0c50: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
0c60: 69 56 61 6c 3c 3c 31 29 3d 3d 30 20 29 7b 0a 20  iVal<<1)==0 ){. 
0c70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
0c80: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
0c90: 6e 74 65 78 74 2c 20 22 69 6e 74 65 67 65 72 20  ntext, "integer 
0ca0: 6f 76 65 72 66 6c 6f 77 22 2c 20 2d 31 29 3b 0a  overflow", -1);.
0cb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0cc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0cd0: 20 20 20 20 69 56 61 6c 20 3d 20 2d 69 56 61 6c      iVal = -iVal
0ce0: 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20  ;.      } .     
0cf0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0d00: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 69  int64(context, i
0d10: 56 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Val);.      brea
0d20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
0d30: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
0d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
0d50: 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65  esult_null(conte
0d60: 78 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  xt);.      break
0d70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
0d80: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75  ult: {.      dou
0d90: 62 6c 65 20 72 56 61 6c 20 3d 20 73 71 6c 69 74  ble rVal = sqlit
0da0: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
0db0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
0dc0: 69 66 28 20 72 56 61 6c 3c 30 20 29 20 72 56 61  if( rVal<0 ) rVa
0dd0: 6c 20 3d 20 2d 72 56 61 6c 3b 0a 20 20 20 20 20  l = -rVal;.     
0de0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0df0: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
0e00: 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  rVal);.      bre
0e10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
0e20: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
0e30: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ation of the sub
0e40: 73 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  str() function..
0e50: 2a 2a 0a 2a 2a 20 73 75 62 73 74 72 28 78 2c 70  **.** substr(x,p
0e60: 31 2c 70 32 29 20 20 72 65 74 75 72 6e 73 20 70  1,p2)  returns p
0e70: 32 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  2 characters of 
0e80: 78 5b 5d 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  x[] beginning wi
0e90: 74 68 20 70 31 2e 0a 2a 2a 20 70 31 20 69 73 20  th p1..** p1 is 
0ea0: 31 2d 69 6e 64 65 78 65 64 2e 20 20 53 6f 20 73  1-indexed.  So s
0eb0: 75 62 73 74 72 28 78 2c 31 2c 31 29 20 72 65 74  ubstr(x,1,1) ret
0ec0: 75 72 6e 73 20 74 68 65 20 66 69 72 73 74 20 63  urns the first c
0ed0: 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 78  haracter.** of x
0ee0: 2e 20 20 49 66 20 78 20 69 73 20 74 65 78 74 2c  .  If x is text,
0ef0: 20 74 68 65 6e 20 77 65 20 61 63 74 75 61 6c 6c   then we actuall
0f00: 79 20 63 6f 75 6e 74 20 55 54 46 2d 38 20 63 68  y count UTF-8 ch
0f10: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20 49 66 20  aracters..** If 
0f20: 78 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  x is a blob, the
0f30: 6e 20 77 65 20 63 6f 75 6e 74 20 62 79 74 65 73  n we count bytes
0f40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 31 20 69 73  ..**.** If p1 is
0f50: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
0f60: 77 65 20 62 65 67 69 6e 20 61 62 73 28 70 31 29  we begin abs(p1)
0f70: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
0f80: 20 78 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   x[]..*/.static 
0f90: 76 6f 69 64 20 73 75 62 73 74 72 46 75 6e 63 28  void substrFunc(
0fa0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
0fb0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
0fc0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
0fd0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
0fe0: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
0ff0: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  ned char *z;.  c
1000: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1010: 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 6c 65  ar *z2;.  int le
1020: 6e 3b 0a 20 20 69 6e 74 20 70 30 74 79 70 65 3b  n;.  int p0type;
1030: 0a 20 20 69 36 34 20 70 31 2c 20 70 32 3b 0a 0a  .  i64 p1, p2;..
1040: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
1050: 33 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a  3 || argc==2 );.
1060: 20 20 70 30 74 79 70 65 20 3d 20 73 71 6c 69 74    p0type = sqlit
1070: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
1080: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 30  gv[0]);.  if( p0
1090: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  type==SQLITE_BLO
10a0: 42 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  B ){.    len = s
10b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
10c0: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
10d0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
10e0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
10f0: 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
1100: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73   return;.    ass
1110: 65 72 74 28 20 6c 65 6e 3d 3d 73 71 6c 69 74 65  ert( len==sqlite
1120: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
1130: 67 76 5b 30 5d 29 20 29 3b 0a 20 20 7d 65 6c 73  gv[0]) );.  }els
1140: 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  e{.    z = sqlit
1150: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1160: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[0]);.    if( 
1170: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
1180: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20     len = 0;.    
1190: 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 3b 20 6c  for(z2=z; *z2; l
11a0: 65 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51 4c  en++){.      SQL
11b0: 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 32  ITE_SKIP_UTF8(z2
11c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
11d0: 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  1 = sqlite3_valu
11e0: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a  e_int(argv[1]);.
11f0: 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b    if( argc==3 ){
1200: 0a 20 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65  .    p2 = sqlite
1210: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
1220: 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [2]);.  }else{. 
1230: 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f     p2 = sqlite3_
1240: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
1250: 65 28 63 6f 6e 74 65 78 74 29 2d 3e 61 4c 69 6d  e(context)->aLim
1260: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1270: 4c 45 4e 47 54 48 5d 3b 0a 20 20 7d 0a 20 20 69  LENGTH];.  }.  i
1280: 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 70  f( p1<0 ){.    p
1290: 31 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66  1 += len;.    if
12a0: 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( p1<0 ){.      
12b0: 70 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20  p2 += p1;.      
12c0: 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  p1 = 0;.    }.  
12d0: 7d 65 6c 73 65 20 69 66 28 20 70 31 3e 30 20 29  }else if( p1>0 )
12e0: 7b 0a 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 0a  {.    p1--;.  }.
12f0: 20 20 69 66 28 20 70 31 2b 70 32 3e 6c 65 6e 20    if( p1+p2>len 
1300: 29 7b 0a 20 20 20 20 70 32 20 3d 20 6c 65 6e 2d  ){.    p2 = len-
1310: 70 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 30  p1;.  }.  if( p0
1320: 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 42 4c 4f  type!=SQLITE_BLO
1330: 42 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  B ){.    while( 
1340: 2a 7a 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20  *z && p1 ){.    
1350: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
1360: 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 70 31 2d  F8(z);.      p1-
1370: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  -;.    }.    for
1380: 28 7a 32 3d 7a 3b 20 2a 7a 32 20 26 26 20 70 32  (z2=z; *z2 && p2
1390: 3b 20 70 32 2d 2d 29 7b 0a 20 20 20 20 20 20 53  ; p2--){.      S
13a0: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
13b0: 7a 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  z2);.    }.    s
13c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
13d0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
13e0: 72 2a 29 7a 2c 20 7a 32 2d 7a 2c 20 53 51 4c 49  r*)z, z2-z, SQLI
13f0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
1400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1410: 70 32 3c 30 20 29 20 70 32 20 3d 20 30 3b 0a 20  p2<0 ) p2 = 0;. 
1420: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1430: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
1440: 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20 70  (char*)&z[p1], p
1450: 32 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  2, SQLITE_TRANSI
1460: 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ENT);.  }.}../*.
1470: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1480: 6e 20 6f 66 20 74 68 65 20 72 6f 75 6e 64 28 29  n of the round()
1490: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61   function.*/.sta
14a0: 74 69 63 20 76 6f 69 64 20 72 6f 75 6e 64 46 75  tic void roundFu
14b0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
14c0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
14d0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
14e0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
14f0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 75  int n = 0;.  dou
1500: 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 7a 42  ble r;.  char zB
1510: 75 66 5b 35 30 30 5d 3b 20 20 2f 2a 20 6c 61 72  uf[500];  /* lar
1520: 67 65 72 20 74 68 61 6e 20 74 68 65 20 25 66 20  ger than the %f 
1530: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
1540: 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 64 6f  f the largest do
1550: 75 62 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  uble */.  assert
1560: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67  ( argc==1 || arg
1570: 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 61 72  c==2 );.  if( ar
1580: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  gc==2 ){.    if(
1590: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71   SQLITE_NULL==sq
15a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
15b0: 28 61 72 67 76 5b 31 5d 29 20 29 20 72 65 74 75  (argv[1]) ) retu
15c0: 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69  rn;.    n = sqli
15d0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
15e0: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[1]);.    if( 
15f0: 6e 3e 33 30 20 29 20 6e 20 3d 20 33 30 3b 0a 20  n>30 ) n = 30;. 
1600: 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d     if( n<0 ) n =
1610: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
1620: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1630: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
1640: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
1650: 0a 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  r = sqlite3_v
1660: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
1670: 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  [0]);.  sqlite3_
1680: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1690: 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 2e 2a 66  zBuf),zBuf,"%.*f
16a0: 22 2c 6e 2c 72 29 3b 0a 20 20 73 71 6c 69 74 65  ",n,r);.  sqlite
16b0: 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 29 3b  3AtoF(zBuf, &r);
16c0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
16d0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
16e0: 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , r);.}../*.** A
16f0: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
1700: 74 65 73 20 6f 66 20 73 70 61 63 65 20 75 73 69  tes of space usi
1710: 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ng sqlite3_mallo
1720: 63 28 29 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  c(). If the.** a
1730: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
1740: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 72 65   call sqlite3_re
1750: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
1760: 28 29 20 74 6f 20 6e 6f 74 69 66 79 0a 2a 2a 20  () to notify.** 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
1780: 64 6c 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 28  dle that malloc(
1790: 29 20 68 61 73 20 66 61 69 6c 65 64 2e 0a 2a 2f  ) has failed..*/
17a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f  .static void *co
17b0: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 73 71 6c 69  ntextMalloc(sqli
17c0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
17d0: 74 65 78 74 2c 20 69 36 34 20 6e 42 79 74 65 29  text, i64 nByte)
17e0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
17f0: 66 28 20 6e 42 79 74 65 3e 73 71 6c 69 74 65 33  f( nByte>sqlite3
1800: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
1810: 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e 61 4c 69  le(context)->aLi
1820: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
1830: 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
1840: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
1850: 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74  rror_toobig(cont
1860: 65 78 74 29 3b 0a 20 20 20 20 7a 20 3d 20 30 3b  ext);.    z = 0;
1870: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
1880: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1890: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
18a0: 21 7a 20 26 26 20 6e 42 79 74 65 3e 30 20 29 7b  !z && nByte>0 ){
18b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
18c0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
18d0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
18e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
18f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1900: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1910: 20 75 70 70 65 72 28 29 20 61 6e 64 20 6c 6f 77   upper() and low
1920: 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  er() SQL functio
1930: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
1940: 69 64 20 75 70 70 65 72 46 75 6e 63 28 73 71 6c  id upperFunc(sql
1950: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1960: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
1970: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1980: 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a  *argv){.  char *
1990: 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  z1;.  const char
19a0: 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6e   *z2;.  int i, n
19b0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 7c  ;.  if( argc<1 |
19c0: 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  | SQLITE_NULL==s
19d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
19e0: 65 28 61 72 67 76 5b 30 5d 29 20 29 20 72 65 74  e(argv[0]) ) ret
19f0: 75 72 6e 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61  urn;.  z2 = (cha
1a00: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1a10: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
1a20: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
1a30: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
1a40: 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  ]);.  /* Verify 
1a50: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
1a60: 20 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e   _bytes() does n
1a70: 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  ot invalidate th
1a80: 65 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65  e _text() pointe
1a90: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  r */.  assert( z
1aa0: 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65  2==(char*)sqlite
1ab0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1ac0: 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  v[0]) );.  if( z
1ad0: 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f  2 ){.    z1 = co
1ae0: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
1af0: 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29  ext, ((i64)n)+1)
1b00: 3b 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a  ;.    if( z1 ){.
1b10: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 31 2c        memcpy(z1,
1b20: 20 7a 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20   z2, n+1);.     
1b30: 20 66 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d 3b   for(i=0; z1[i];
1b40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a   i++){.        z
1b50: 31 5b 69 5d 20 3d 20 74 6f 75 70 70 65 72 28 7a  1[i] = toupper(z
1b60: 31 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1[i]);.      }. 
1b70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1b80: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
1b90: 2c 20 7a 31 2c 20 2d 31 2c 20 73 71 6c 69 74 65  , z1, -1, sqlite
1ba0: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  3_free);.    }. 
1bb0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
1bc0: 20 6c 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74   lowerFunc(sqlit
1bd0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1be0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
1bf0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1c00: 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31  rgv){.  char *z1
1c10: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1c20: 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  z2;.  int i, n;.
1c30: 20 20 69 66 28 20 61 72 67 63 3c 31 20 7c 7c 20    if( argc<1 || 
1c40: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c  SQLITE_NULL==sql
1c50: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
1c60: 61 72 67 76 5b 30 5d 29 20 29 20 72 65 74 75 72  argv[0]) ) retur
1c70: 6e 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a  n;.  z2 = (char*
1c80: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1c90: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
1ca0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
1cb0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
1cc0: 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ;.  /* Verify th
1cd0: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f  at the call to _
1ce0: 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74  bytes() does not
1cf0: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
1d00: 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20  _text() pointer 
1d10: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d  */.  assert( z2=
1d20: 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  =(char*)sqlite3_
1d30: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1d40: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20  0]) );.  if( z2 
1d50: 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74  ){.    z1 = cont
1d60: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
1d70: 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a  t, ((i64)n)+1);.
1d80: 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20      if( z1 ){.  
1d90: 20 20 20 20 6d 65 6d 63 70 79 28 7a 31 2c 20 7a      memcpy(z1, z
1da0: 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 66  2, n+1);.      f
1db0: 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d 3b 20 69  or(i=0; z1[i]; i
1dc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b  ++){.        z1[
1dd0: 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 31 5b  i] = tolower(z1[
1de0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
1df0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1e00: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
1e10: 7a 31 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  z1, -1, sqlite3_
1e20: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
1e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1e40: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1e50: 49 46 4e 55 4c 4c 28 29 2c 20 4e 56 4c 28 29 2c  IFNULL(), NVL(),
1e60: 20 61 6e 64 20 43 4f 41 4c 45 53 43 45 28 29 20   and COALESCE() 
1e70: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 0a 2a 2a 20  functions.  .** 
1e80: 41 6c 6c 20 74 68 72 65 65 20 64 6f 20 74 68 65  All three do the
1e90: 20 73 61 6d 65 20 74 68 69 6e 67 2e 20 20 54 68   same thing.  Th
1ea0: 65 79 20 72 65 74 75 72 6e 20 74 68 65 20 66 69  ey return the fi
1eb0: 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  rst non-NULL.** 
1ec0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
1ed0: 74 69 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c 46  tic void ifnullF
1ee0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1ef0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1f00: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
1f10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1f20: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
1f30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
1f40: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
1f50: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
1f60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1f70: 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20  (argv[i]) ){.   
1f80: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1f90: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
1fa0: 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20   argv[i]);.     
1fb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
1fd0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e  mentation of ran
1fe0: 64 6f 6d 28 29 2e 20 20 52 65 74 75 72 6e 20 61  dom().  Return a
1ff0: 20 72 61 6e 64 6f 6d 20 69 6e 74 65 67 65 72 2e   random integer.
2000: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
2010: 64 20 72 61 6e 64 6f 6d 46 75 6e 63 28 0a 20 20  d randomFunc(.  
2020: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2030: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
2040: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
2050: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
2060: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72    sqlite_int64 r
2070: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  ;.  sqlite3_rand
2080: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29  omness(sizeof(r)
2090: 2c 20 26 72 29 3b 0a 20 20 69 66 28 20 28 72 3c  , &r);.  if( (r<
20a0: 3c 31 29 3d 3d 30 20 29 20 72 20 3d 20 30 3b 20  <1)==0 ) r = 0; 
20b0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 30 78 38 30   /* Prevent 0x80
20c0: 30 30 2e 2e 2e 2e 20 61 73 20 74 68 65 20 72 65  00.... as the re
20d0: 73 75 6c 74 20 73 6f 20 74 68 61 74 20 77 65 20  sult so that we 
20e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2100: 63 61 6e 20 61 6c 77 61 79 73 20 64 6f 20 61 62  can always do ab
2110: 73 28 29 20 6f 66 20 74 68 65 20 72 65 73 75 6c  s() of the resul
2120: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  t */.  sqlite3_r
2130: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
2140: 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ext, r);.}../*.*
2150: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2160: 20 6f 66 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 4e   of randomblob(N
2170: 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61 6e  ).  Return a ran
2180: 64 6f 6d 20 62 6c 6f 62 0a 2a 2a 20 74 68 61 74  dom blob.** that
2190: 20 69 73 20 4e 20 62 79 74 65 73 20 6c 6f 6e 67   is N bytes long
21a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21b0: 20 72 61 6e 64 6f 6d 42 6c 6f 62 28 0a 20 20 73   randomBlob(.  s
21c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
21d0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
21e0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
21f0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
2200: 20 69 6e 74 20 6e 3b 0a 20 20 75 6e 73 69 67 6e   int n;.  unsign
2210: 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 61 73  ed char *p;.  as
2220: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
2230: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
2240: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d  alue_int(argv[0]
2250: 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 29 7b 0a  );.  if( n<1 ){.
2260: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20      n = 1;.  }. 
2270: 20 70 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c   p = contextMall
2280: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a  oc(context, n);.
2290: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
22a0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
22b0: 73 28 6e 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c  s(n, p);.    sql
22c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
22d0: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
22e0: 29 70 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66  )p, n, sqlite3_f
22f0: 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ree);.  }.}../*.
2300: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2310: 6e 20 6f 66 20 74 68 65 20 6c 61 73 74 5f 69 6e  n of the last_in
2320: 73 65 72 74 5f 72 6f 77 69 64 28 29 20 53 51 4c  sert_rowid() SQL
2330: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
2340: 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
2350: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
2360: 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  he sqlite3_last_
2370: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 41  insert_rowid() A
2380: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
2390: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
23a0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 0a 20  _insert_rowid(. 
23b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
23c0: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
23d0: 74 20 61 72 67 2c 20 0a 20 20 73 71 6c 69 74 65  t arg, .  sqlite
23e0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
23f0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
2400: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
2410: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
2420: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ext);.  sqlite3_
2430: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
2440: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 61  text, sqlite3_la
2450: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
2460: 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  db));.}../*.** I
2470: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2480: 20 74 68 65 20 63 68 61 6e 67 65 73 28 29 20 53   the changes() S
2490: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
24a0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
24b0: 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  s the.** same as
24c0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 68 61   the sqlite3_cha
24d0: 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e 63 74  nges() API funct
24e0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
24f0: 6f 69 64 20 63 68 61 6e 67 65 73 28 0a 20 20 73  oid changes(.  s
2500: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2510: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
2520: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
2530: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
2540: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
2550: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
2560: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
2570: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
2580: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
2590: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
25a0: 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  db));.}../*.** I
25b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
25c0: 20 74 68 65 20 74 6f 74 61 6c 5f 63 68 61 6e 67   the total_chang
25d0: 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  es() SQL functio
25e0: 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  n.  The return v
25f0: 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 73  alue is.** the s
2600: 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74  ame as the sqlit
2610: 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
2620: 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  () API function.
2630: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2640: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 0a 20  total_changes(. 
2650: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2660: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
2670: 20 61 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f   arg,.  sqlite3_
2680: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
2690: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
26a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
26b0: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
26c0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  t);.  sqlite3_re
26d0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
26e0: 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  , sqlite3_total_
26f0: 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a  changes(db));.}.
2700: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
2710: 72 65 20 64 65 66 69 6e 69 6e 67 20 68 6f 77 20  re defining how 
2720: 74 6f 20 64 6f 20 47 4c 4f 42 2d 73 74 79 6c 65  to do GLOB-style
2730: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f   comparisons..*/
2740: 0a 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  .struct compareI
2750: 6e 66 6f 20 7b 0a 20 20 75 38 20 6d 61 74 63 68  nfo {.  u8 match
2760: 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68 4f  All;.  u8 matchO
2770: 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63 68 53 65  ne;.  u8 matchSe
2780: 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65 3b 0a  t;.  u8 noCase;.
2790: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 4c 49  };../*.** For LI
27a0: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6d 61 74 63  KE and GLOB matc
27b0: 68 69 6e 67 20 6f 6e 20 45 42 43 44 49 43 20 6d  hing on EBCDIC m
27c0: 61 63 68 69 6e 65 73 2c 20 61 73 73 75 6d 65 20  achines, assume 
27d0: 74 68 61 74 20 65 76 65 72 79 0a 2a 2a 20 63 68  that every.** ch
27e0: 61 72 61 63 74 65 72 20 69 73 20 65 78 61 63 74  aracter is exact
27f0: 6c 79 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 73  ly one byte in s
2800: 69 7a 65 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20  ize.  Also, all 
2810: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 0a 2a  characters are.*
2820: 2a 20 61 62 6c 65 20 74 6f 20 70 61 72 74 69 63  * able to partic
2830: 69 70 61 74 65 20 69 6e 20 75 70 70 65 72 2d 63  ipate in upper-c
2840: 61 73 65 2d 74 6f 2d 6c 6f 77 65 72 2d 63 61 73  ase-to-lower-cas
2850: 65 20 6d 61 70 70 69 6e 67 73 20 69 6e 20 45 42  e mappings in EB
2860: 43 44 49 43 0a 2a 2a 20 77 68 65 72 65 61 73 20  CDIC.** whereas 
2870: 6f 6e 6c 79 20 63 68 61 72 61 63 74 65 72 73 20  only characters 
2880: 6c 65 73 73 20 74 68 61 6e 20 30 78 38 30 20 64  less than 0x80 d
2890: 6f 20 69 6e 20 41 53 43 49 49 2e 0a 2a 2f 0a 23  o in ASCII..*/.#
28a0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
28b0: 45 5f 45 42 43 44 49 43 29 0a 23 20 64 65 66 69  E_EBCDIC).# defi
28c0: 6e 65 20 73 71 6c 69 74 65 33 55 74 66 38 52 65  ne sqlite3Utf8Re
28d0: 61 64 28 41 2c 42 2c 43 29 20 20 28 2a 28 41 2b  ad(A,B,C)  (*(A+
28e0: 2b 29 29 0a 23 20 64 65 66 69 6e 65 20 47 6c 6f  +)).# define Glo
28f0: 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28 41 29  gUpperToLower(A)
2900: 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33       A = sqlite3
2910: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 41 5d 0a  UpperToLower[A].
2920: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 47  #else.# define G
2930: 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  logUpperToLower(
2940: 41 29 20 20 20 20 20 69 66 28 20 41 3c 30 78 38  A)     if( A<0x8
2950: 30 20 29 7b 20 41 20 3d 20 73 71 6c 69 74 65 33  0 ){ A = sqlite3
2960: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 41 5d 3b  UpperToLower[A];
2970: 20 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69   }.#endif..stati
2980: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63  c const struct c
2990: 6f 6d 70 61 72 65 49 6e 66 6f 20 67 6c 6f 62 49  ompareInfo globI
29a0: 6e 66 6f 20 3d 20 7b 20 27 2a 27 2c 20 27 3f 27  nfo = { '*', '?'
29b0: 2c 20 27 5b 27 2c 20 30 20 7d 3b 0a 2f 2a 20 54  , '[', 0 };./* T
29c0: 68 65 20 63 6f 72 72 65 63 74 20 53 51 4c 2d 39  he correct SQL-9
29d0: 32 20 62 65 68 61 76 69 6f 72 20 69 73 20 66 6f  2 behavior is fo
29e0: 72 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  r the LIKE opera
29f0: 74 6f 72 20 74 6f 20 69 67 6e 6f 72 65 0a 2a 2a  tor to ignore.**
2a00: 20 63 61 73 65 2e 20 20 54 68 75 73 20 20 27 61   case.  Thus  'a
2a10: 27 20 4c 49 4b 45 20 27 41 27 20 77 6f 75 6c 64  ' LIKE 'A' would
2a20: 20 62 65 20 74 72 75 65 2e 20 2a 2f 0a 73 74 61   be true. */.sta
2a30: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2a40: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b   compareInfo lik
2a50: 65 49 6e 66 6f 4e 6f 72 6d 20 3d 20 7b 20 27 25  eInfoNorm = { '%
2a60: 27 2c 20 27 5f 27 2c 20 20 20 30 2c 20 31 20 7d  ', '_',   0, 1 }
2a70: 3b 0a 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  ;./* If SQLITE_C
2a80: 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49  ASE_SENSITIVE_LI
2a90: 4b 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  KE is defined, t
2aa0: 68 65 6e 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  hen the LIKE ope
2ab0: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 63 61 73 65  rator.** is case
2ac0: 20 73 65 6e 73 69 74 69 76 65 20 63 61 75 73 69   sensitive causi
2ad0: 6e 67 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  ng 'a' LIKE 'A' 
2ae0: 74 6f 20 62 65 20 66 61 6c 73 65 20 2a 2f 0a 73  to be false */.s
2af0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2b00: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c  ct compareInfo l
2b10: 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 20 7b 20 27  ikeInfoAlt = { '
2b20: 25 27 2c 20 27 5f 27 2c 20 20 20 30 2c 20 30 20  %', '_',   0, 0 
2b30: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  };../*.** Compar
2b40: 65 20 74 77 6f 20 55 54 46 2d 38 20 73 74 72 69  e two UTF-8 stri
2b50: 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69 74 79  ngs for equality
2b60: 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
2b70: 20 73 74 72 69 6e 67 20 63 61 6e 0a 2a 2a 20 70   string can.** p
2b80: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 61 20  otentially be a 
2b90: 22 67 6c 6f 62 22 20 65 78 70 72 65 73 73 69 6f  "glob" expressio
2ba0: 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  n.  Return true 
2bb0: 28 31 29 20 69 66 20 74 68 65 79 0a 2a 2a 20 61  (1) if they.** a
2bc0: 72 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20  re the same and 
2bd0: 66 61 6c 73 65 20 28 30 29 20 69 66 20 74 68 65  false (0) if the
2be0: 79 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  y are different.
2bf0: 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20  .**.** Globbing 
2c00: 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rules:.**.**    
2c10: 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63    '*'       Matc
2c20: 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65  hes any sequence
2c30: 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
2c40: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
2c50: 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20  **      '?'     
2c60: 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c    Matches exactl
2c70: 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e  y one character.
2c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d  .**.**     [...]
2c90: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e        Matches on
2ca0: 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d  e character from
2cb0: 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
2cc0: 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  st of.**        
2cd0: 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65          characte
2ce0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e  rs..**.**     [^
2cf0: 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73  ...]     Matches
2d00: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e   one character n
2d10: 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73  ot in the enclos
2d20: 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57  ed list..**.** W
2d30: 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e  ith the [...] an
2d40: 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e  d [^...] matchin
2d50: 67 2c 20 61 20 27 5d 27 20 63 68 61 72 61 63 74  g, a ']' charact
2d60: 65 72 20 63 61 6e 20 62 65 20 69 6e 63 6c 75 64  er can be includ
2d70: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73  ed.** in the lis
2d80: 74 20 62 79 20 6d 61 6b 69 6e 67 20 69 74 20 74  t by making it t
2d90: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
2da0: 65 72 20 61 66 74 65 72 20 27 5b 27 20 6f 72 20  er after '[' or 
2db0: 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65  '^'.  A.** range
2dc0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 63   of characters c
2dd0: 61 6e 20 62 65 20 73 70 65 63 69 66 69 65 64 20  an be specified 
2de0: 75 73 69 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d  using '-'.  Exam
2df0: 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20  ple:.** "[a-z]" 
2e00: 6d 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67  matches any sing
2e10: 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65  le lower-case le
2e20: 74 74 65 72 2e 20 20 54 6f 20 6d 61 74 63 68 20  tter.  To match 
2e30: 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69  a '-', make.** i
2e40: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
2e50: 63 74 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74  cter in the list
2e60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2e70: 74 69 6e 65 20 69 73 20 75 73 75 61 6c 6c 79 20  tine is usually 
2e80: 71 75 69 63 6b 2c 20 62 75 74 20 63 61 6e 20 62  quick, but can b
2e90: 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f  e N**2 in the wo
2ea0: 72 73 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  rst case..**.** 
2eb0: 48 69 6e 74 73 3a 20 74 6f 20 6d 61 74 63 68 20  Hints: to match 
2ec0: 27 2a 27 20 6f 72 20 27 3f 27 2c 20 70 75 74 20  '*' or '?', put 
2ed0: 74 68 65 6d 20 69 6e 20 22 5b 5d 22 2e 20 20 4c  them in "[]".  L
2ee0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
2ef0: 20 20 20 20 20 20 20 20 61 62 63 5b 2a 5d 78 79          abc[*]xy
2f00: 7a 20 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  z        Matches
2f10: 20 22 61 62 63 2a 78 79 7a 22 20 6f 6e 6c 79 0a   "abc*xyz" only.
2f20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2f30: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 0a 20 20  tternCompare(.  
2f40: 63 6f 6e 73 74 20 75 38 20 2a 7a 50 61 74 74 65  const u8 *zPatte
2f50: 72 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rn,             
2f60: 20 2f 2a 20 54 68 65 20 67 6c 6f 62 20 70 61 74   /* The glob pat
2f70: 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tern */.  const 
2f80: 75 38 20 2a 7a 53 74 72 69 6e 67 2c 20 20 20 20  u8 *zString,    
2f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2fa0: 65 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70  e string to comp
2fb0: 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  are against the 
2fc0: 67 6c 6f 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  glob */.  const 
2fd0: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
2fe0: 66 6f 20 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49 6e  fo *pInfo, /* In
2ff0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
3000: 68 6f 77 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  how to do the co
3010: 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  mpare */.  const
3020: 20 69 6e 74 20 65 73 63 20 20 20 20 20 20 20 20   int esc        
3030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3040: 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63  he escape charac
3050: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ter */.){.  int 
3060: 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e 76  c, c2;.  int inv
3070: 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b  ert;.  int seen;
3080: 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e 65 20 3d  .  u8 matchOne =
3090: 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65   pInfo->matchOne
30a0: 3b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c 20  ;.  u8 matchAll 
30b0: 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c  = pInfo->matchAl
30c0: 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68 53 65 74  l;.  u8 matchSet
30d0: 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53   = pInfo->matchS
30e0: 65 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65 20  et;.  u8 noCase 
30f0: 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43 61 73 65 3b  = pInfo->noCase;
3100: 20 0a 20 20 69 6e 74 20 70 72 65 76 45 73 63 61   .  int prevEsca
3110: 70 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  pe = 0;     /* T
3120: 72 75 65 20 69 66 20 74 68 65 20 70 72 65 76 69  rue if the previ
3130: 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 77 61  ous character wa
3140: 73 20 27 65 73 63 61 70 65 27 20 2a 2f 0a 0a 20  s 'escape' */.. 
3150: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 73 71 6c   while( (c = sql
3160: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61  ite3Utf8Read(zPa
3170: 74 74 65 72 6e 2c 30 2c 26 7a 50 61 74 74 65 72  ttern,0,&zPatter
3180: 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  n))!=0 ){.    if
3190: 28 20 21 70 72 65 76 45 73 63 61 70 65 20 26 26  ( !prevEscape &&
31a0: 20 63 3d 3d 6d 61 74 63 68 41 6c 6c 20 29 7b 0a   c==matchAll ){.
31b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
31c0: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
31d0: 7a 50 61 74 74 65 72 6e 2c 30 2c 26 7a 50 61 74  zPattern,0,&zPat
31e0: 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74 63 68 41  tern)) == matchA
31f0: 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ll.             
3200: 20 20 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68 4f    || c == matchO
3210: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ne ){.        if
3220: 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26 26  ( c==matchOne &&
3230: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
3240: 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53  (zString, 0, &zS
3250: 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20  tring)==0 ){.   
3260: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
3270: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3280: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
3290: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
32a0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 1;.      }el
32b0: 73 65 20 69 66 28 20 63 3d 3d 65 73 63 20 29 7b  se if( c==esc ){
32c0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
32d0: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61  ite3Utf8Read(zPa
32e0: 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74  ttern, 0, &zPatt
32f0: 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ern);.        if
3300: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
3310: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
3330: 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63 68  lse if( c==match
3340: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Set ){.        a
3350: 73 73 65 72 74 28 20 65 73 63 3d 3d 30 20 29 3b  ssert( esc==0 );
3360: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
3370: 20 69 73 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49   is GLOB, not LI
3380: 4b 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  KE */.        as
3390: 73 65 72 74 28 20 6d 61 74 63 68 53 65 74 3c 30  sert( matchSet<0
33a0: 78 38 30 20 29 3b 20 20 2f 2a 20 27 5b 27 20 69  x80 );  /* '[' i
33b0: 73 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  s a single-byte 
33c0: 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 20  character */.   
33d0: 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53 74       while( *zSt
33e0: 72 69 6e 67 20 26 26 20 70 61 74 74 65 72 6e 43  ring && patternC
33f0: 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e  ompare(&zPattern
3400: 5b 2d 31 5d 2c 7a 53 74 72 69 6e 67 2c 70 49 6e  [-1],zString,pIn
3410: 66 6f 2c 65 73 63 29 3d 3d 30 20 29 7b 0a 20 20  fo,esc)==0 ){.  
3420: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
3430: 4b 49 50 5f 55 54 46 38 28 7a 53 74 72 69 6e 67  KIP_UTF8(zString
3440: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3450: 20 20 20 20 20 72 65 74 75 72 6e 20 2a 7a 53 74       return *zSt
3460: 72 69 6e 67 21 3d 30 3b 0a 20 20 20 20 20 20 7d  ring!=0;.      }
3470: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
3480: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
3490: 65 61 64 28 7a 53 74 72 69 6e 67 2c 30 2c 26 7a  ead(zString,0,&z
34a0: 53 74 72 69 6e 67 29 29 21 3d 30 20 29 7b 0a 20  String))!=0 ){. 
34b0: 20 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73         if( noCas
34c0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 47  e ){.          G
34d0: 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  logUpperToLower(
34e0: 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 47  c2);.          G
34f0: 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  logUpperToLower(
3500: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  c);.          wh
3510: 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26 20  ile( c2 != 0 && 
3520: 63 32 20 21 3d 20 63 20 29 7b 0a 20 20 20 20 20  c2 != c ){.     
3530: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
3540: 74 65 33 55 74 66 38 52 65 61 64 28 7a 53 74 72  te3Utf8Read(zStr
3550: 69 6e 67 2c 20 30 2c 20 26 7a 53 74 72 69 6e 67  ing, 0, &zString
3560: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 47  );.            G
3570: 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  logUpperToLower(
3580: 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  c2);.          }
3590: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
35a0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
35b0: 20 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21   c2 != 0 && c2 !
35c0: 3d 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  = c ){.         
35d0: 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55     c2 = sqlite3U
35e0: 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c  tf8Read(zString,
35f0: 20 30 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a 20   0, &zString);. 
3600: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3610: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
3620: 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   c2==0 ) return 
3630: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
3640: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 50  atternCompare(zP
3650: 61 74 74 65 72 6e 2c 7a 53 74 72 69 6e 67 2c 70  attern,zString,p
3660: 49 6e 66 6f 2c 65 73 63 29 20 29 20 72 65 74 75  Info,esc) ) retu
3670: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
3680: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3690: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 72 65    }else if( !pre
36a0: 76 45 73 63 61 70 65 20 26 26 20 63 3d 3d 6d 61  vEscape && c==ma
36b0: 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20  tchOne ){.      
36c0: 69 66 28 20 73 71 6c 69 74 65 33 55 74 66 38 52  if( sqlite3Utf8R
36d0: 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20  ead(zString, 0, 
36e0: 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a  &zString)==0 ){.
36f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
3700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
3710: 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63 68  lse if( c==match
3720: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Set ){.      int
3730: 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20   prior_c = 0;.  
3740: 20 20 20 20 61 73 73 65 72 74 28 20 65 73 63 3d      assert( esc=
3750: 3d 30 20 29 3b 20 20 20 20 2f 2a 20 54 68 69 73  =0 );    /* This
3760: 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 66 6f 72   only occurs for
3770: 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20   GLOB, not LIKE 
3780: 2a 2f 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20  */.      seen = 
3790: 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20  0;.      invert 
37a0: 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 73  = 0;.      c = s
37b0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
37c0: 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74 72  String, 0, &zStr
37d0: 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ing);.      if( 
37e0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
37f0: 0a 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69  .      c2 = sqli
3800: 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74  te3Utf8Read(zPat
3810: 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65  tern, 0, &zPatte
3820: 72 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  rn);.      if( c
3830: 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20  2=='^' ){.      
3840: 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20    invert = 1;.  
3850: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
3860: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
3870: 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65 72  ern, 0, &zPatter
3880: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
3890: 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b    if( c2==']' ){
38a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
38b0: 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a  ']' ) seen = 1;.
38c0: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
38d0: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61  ite3Utf8Read(zPa
38e0: 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74  ttern, 0, &zPatt
38f0: 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ern);.      }.  
3900: 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26      while( c2 &&
3910: 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20   c2!=']' ){.    
3920: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20      if( c2=='-' 
3930: 26 26 20 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d  && zPattern[0]!=
3940: 27 5d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b  ']' && zPattern[
3950: 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63  0]!=0 && prior_c
3960: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
3970: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
3980: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 30  Read(zPattern, 0
3990: 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  , &zPattern);.  
39a0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70          if( c>=p
39b0: 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20  rior_c && c<=c2 
39c0: 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ) seen = 1;.    
39d0: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
39e0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
39f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3a00: 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20  c==c2 ){.       
3a10: 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20       seen = 1;. 
3a20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3a30: 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63       prior_c = c
3a40: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
3a50: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
3a60: 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65  3Utf8Read(zPatte
3a70: 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65 72 6e  rn, 0, &zPattern
3a80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3a90: 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73   if( c2==0 || (s
3aa0: 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30  een ^ invert)==0
3ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3ac0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
3ad0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 73 63 3d    }else if( esc=
3ae0: 3d 63 20 26 26 20 21 70 72 65 76 45 73 63 61 70  =c && !prevEscap
3af0: 65 20 29 7b 0a 20 20 20 20 20 20 70 72 65 76 45  e ){.      prevE
3b00: 73 63 61 70 65 20 3d 20 31 3b 0a 20 20 20 20 7d  scape = 1;.    }
3b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 32 20 3d  else{.      c2 =
3b20: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
3b30: 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53  (zString, 0, &zS
3b40: 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66  tring);.      if
3b50: 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20  ( noCase ){.    
3b60: 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c      GlogUpperToL
3b70: 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20 20  ower(c);.       
3b80: 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65   GlogUpperToLowe
3b90: 72 28 63 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r(c2);.      }. 
3ba0: 20 20 20 20 20 69 66 28 20 63 21 3d 63 32 20 29       if( c!=c2 )
3bb0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3bc0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3bd0: 20 20 70 72 65 76 45 73 63 61 70 65 20 3d 20 30    prevEscape = 0
3be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3bf0: 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d 30  turn *zString==0
3c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  ;.}../*.** Count
3c10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
3c20: 69 6d 65 73 20 74 68 61 74 20 74 68 65 20 4c 49  imes that the LI
3c30: 4b 45 20 6f 70 65 72 61 74 6f 72 20 28 6f 72 20  KE operator (or 
3c40: 47 4c 4f 42 20 77 68 69 63 68 20 69 73 0a 2a 2a  GLOB which is.**
3c50: 20 6a 75 73 74 20 61 20 76 61 72 69 61 74 69 6f   just a variatio
3c60: 6e 20 6f 66 20 4c 49 4b 45 29 20 67 65 74 73 20  n of LIKE) gets 
3c70: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
3c80: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
3c90: 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  g.** only..*/.#i
3ca0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3cb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b  .int sqlite3_lik
3cc0: 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  e_count = 0;.#en
3cd0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  dif.../*.** Impl
3ce0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
3cf0: 65 20 6c 69 6b 65 28 29 20 53 51 4c 20 66 75 6e  e like() SQL fun
3d00: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
3d10: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73  ction implements
3d20: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2d 69 6e  .** the build-in
3d30: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 20   LIKE operator. 
3d40: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
3d50: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
3d60: 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ion is the.** pa
3d70: 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 73 65  ttern and the se
3d80: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
3d90: 20 74 68 65 20 73 74 72 69 6e 67 2e 20 20 53 6f   the string.  So
3da0: 2c 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  , the SQL statem
3db0: 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ents:.**.**     
3dc0: 20 20 41 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a    A LIKE B.**.**
3dd0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
3de0: 61 73 20 6c 69 6b 65 28 42 2c 41 29 2e 0a 2a 2a  as like(B,A)..**
3df0: 0a 2a 2a 20 54 68 69 73 20 73 61 6d 65 20 66 75  .** This same fu
3e00: 6e 63 74 69 6f 6e 20 28 77 69 74 68 20 61 20 64  nction (with a d
3e10: 69 66 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 65  ifferent compare
3e20: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 29 20  Info structure) 
3e30: 63 6f 6d 70 75 74 65 73 0a 2a 2a 20 74 68 65 20  computes.** the 
3e40: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  GLOB operator..*
3e50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69  /.static void li
3e60: 6b 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  keFunc(.  sqlite
3e70: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3e80: 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
3e90: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
3ea0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
3eb0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3ec0: 72 20 2a 7a 41 2c 20 2a 7a 42 3b 0a 20 20 69 6e  r *zA, *zB;.  in
3ed0: 74 20 65 73 63 61 70 65 20 3d 20 30 3b 0a 20 20  t escape = 0;.  
3ee0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
3ef0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
3f00: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
3f10: 3b 0a 0a 20 20 7a 42 20 3d 20 73 71 6c 69 74 65  ;..  zB = sqlite
3f20: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
3f30: 76 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20 73 71  v[0]);.  zA = sq
3f40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
3f50: 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a  (argv[1]);..  /*
3f60: 20 4c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74   Limit the lengt
3f70: 68 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72  h of the LIKE or
3f80: 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f   GLOB pattern to
3f90: 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a   avoid problems.
3fa0: 20 20 2a 2a 20 6f 66 20 64 65 65 70 20 72 65 63    ** of deep rec
3fb0: 75 72 73 69 6f 6e 20 61 6e 64 20 4e 2a 4e 20 62  ursion and N*N b
3fc0: 65 68 61 76 69 6f 72 20 69 6e 20 70 61 74 74 65  ehavior in patte
3fd0: 72 6e 43 6f 6d 70 61 72 65 28 29 2e 0a 20 20 2a  rnCompare()..  *
3fe0: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
3ff0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
4000: 5b 30 5d 29 20 3e 0a 20 20 20 20 20 20 20 20 64  [0]) >.        d
4010: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4020: 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
4030: 45 52 4e 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  ERN_LENGTH] ){. 
4040: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4050: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
4060: 20 22 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70   "LIKE or GLOB p
4070: 61 74 74 65 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c  attern too compl
4080: 65 78 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ex", -1);.    re
4090: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
40a0: 72 74 28 20 7a 42 3d 3d 73 71 6c 69 74 65 33 5f  rt( zB==sqlite3_
40b0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
40c0: 30 5d 29 20 29 3b 20 20 2f 2a 20 45 6e 63 6f 64  0]) );  /* Encod
40d0: 69 6e 67 20 64 69 64 20 6e 6f 74 20 63 68 61 6e  ing did not chan
40e0: 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20 61 72 67  ge */..  if( arg
40f0: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54  c==3 ){.    /* T
4100: 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63  he escape charac
4110: 74 65 72 20 73 74 72 69 6e 67 20 6d 75 73 74 20  ter string must 
4120: 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69 6e  consist of a sin
4130: 67 6c 65 20 55 54 46 2d 38 20 63 68 61 72 61 63  gle UTF-8 charac
4140: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65  ter..    ** Othe
4150: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
4160: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
4170: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
4180: 64 20 63 68 61 72 20 2a 7a 45 73 63 20 3d 20 73  d char *zEsc = s
4190: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
41a0: 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20  t(argv[2]);.    
41b0: 69 66 28 20 7a 45 73 63 3d 3d 30 20 29 20 72 65  if( zEsc==0 ) re
41c0: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 73 71  turn;.    if( sq
41d0: 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
41e0: 28 28 63 68 61 72 2a 29 7a 45 73 63 2c 20 2d 31  ((char*)zEsc, -1
41f0: 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=1 ){.      sq
4200: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
4210: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20  or(context, .   
4220: 20 20 20 20 20 20 20 22 45 53 43 41 50 45 20 65         "ESCAPE e
4230: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
4240: 65 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61  e a single chara
4250: 63 74 65 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20  cter", -1);.    
4260: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4270: 20 20 20 20 65 73 63 61 70 65 20 3d 20 73 71 6c      escape = sql
4280: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 45 73  ite3Utf8Read(zEs
4290: 63 2c 20 30 2c 20 26 7a 45 73 63 29 3b 0a 20 20  c, 0, &zEsc);.  
42a0: 7d 0a 20 20 69 66 28 20 7a 41 20 26 26 20 7a 42  }.  if( zA && zB
42b0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63   ){.    struct c
42c0: 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66  ompareInfo *pInf
42d0: 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  o = sqlite3_user
42e0: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
42f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4300: 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ST.    sqlite3_l
4310: 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ike_count++;.#en
4320: 64 69 66 0a 20 20 20 20 0a 20 20 20 20 73 71 6c  dif.    .    sql
4330: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
4340: 63 6f 6e 74 65 78 74 2c 20 70 61 74 74 65 72 6e  context, pattern
4350: 43 6f 6d 70 61 72 65 28 7a 42 2c 20 7a 41 2c 20  Compare(zB, zA, 
4360: 70 49 6e 66 6f 2c 20 65 73 63 61 70 65 29 29 3b  pInfo, escape));
4370: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
4380: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
4390: 74 68 65 20 4e 55 4c 4c 49 46 28 78 2c 79 29 20  the NULLIF(x,y) 
43a0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72  function.  The r
43b0: 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72  esult is the fir
43c0: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  st.** argument i
43d0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  f the arguments 
43e0: 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 20  are different.  
43f0: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  The result is NU
4400: 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20 61 72 67  LL if the.** arg
4410: 75 6d 65 6e 74 73 20 61 72 65 20 65 71 75 61 6c  uments are equal
4420: 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 2e 0a   to each other..
4430: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
4440: 75 6c 6c 69 66 46 75 6e 63 28 0a 20 20 73 71 6c  ullifFunc(.  sql
4450: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
4460: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
4470: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
4480: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 43  ue **argv.){.  C
4490: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
44a0: 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f  sqlite3GetFuncCo
44b0: 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a  llSeq(context);.
44c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 65 6d    if( sqlite3Mem
44d0: 43 6f 6d 70 61 72 65 28 61 72 67 76 5b 30 5d 2c  Compare(argv[0],
44e0: 20 61 72 67 76 5b 31 5d 2c 20 70 43 6f 6c 6c 29   argv[1], pColl)
44f0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
4500: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
4510: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
4520: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4530: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
4540: 66 20 74 68 65 20 56 45 52 53 49 4f 4e 28 2a 29  f the VERSION(*)
4550: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
4560: 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 65  result is the ve
4570: 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  rsion.** of the 
4580: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 74  SQLite library t
4590: 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  hat is running..
45a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
45b0: 65 72 73 69 6f 6e 46 75 6e 63 28 0a 20 20 73 71  ersionFunc(.  sq
45c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
45d0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
45e0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
45f0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
4600: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4610: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ext(context, sql
4620: 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 20 2d 31  ite3_version, -1
4630: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
4640: 3b 0a 7d 0a 0a 2f 2a 20 41 72 72 61 79 20 66 6f  ;.}../* Array fo
4650: 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f  r converting fro
4660: 6d 20 68 61 6c 66 2d 62 79 74 65 73 20 28 6e 79  m half-bytes (ny
4670: 62 62 6c 65 73 29 20 69 6e 74 6f 20 41 53 43 49  bbles) into ASCI
4680: 49 20 68 65 78 0a 2a 2a 20 64 69 67 69 74 73 2e  I hex.** digits.
4690: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
46a0: 20 63 68 61 72 20 68 65 78 64 69 67 69 74 73 5b   char hexdigits[
46b0: 5d 20 3d 20 7b 0a 20 20 27 30 27 2c 20 27 31 27  ] = {.  '0', '1'
46c0: 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34 27 2c  , '2', '3', '4',
46d0: 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a   '5', '6', '7',.
46e0: 20 20 27 38 27 2c 20 27 39 27 2c 20 27 41 27 2c    '8', '9', 'A',
46f0: 20 27 42 27 2c 20 27 43 27 2c 20 27 44 27 2c 20   'B', 'C', 'D', 
4700: 27 45 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f 2a  'E', 'F' .};../*
4710: 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c  .** EXPERIMENTAL
4720: 20 2d 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61   - This is not a
4730: 6e 20 6f 66 66 69 63 69 61 6c 20 66 75 6e 63 74  n official funct
4740: 69 6f 6e 2e 20 20 54 68 65 20 69 6e 74 65 72 66  ion.  The interf
4750: 61 63 65 20 6d 61 79 0a 2a 2a 20 63 68 61 6e 67  ace may.** chang
4760: 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
4770: 6e 20 6d 61 79 20 64 69 73 61 70 70 65 61 72 2e  n may disappear.
4780: 20 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 63    Do not write c
4790: 6f 64 65 20 74 68 61 74 20 64 65 70 65 6e 64 73  ode that depends
47a0: 0a 2a 2a 20 6f 6e 20 74 68 69 73 20 66 75 6e 63  .** on this func
47b0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tion..**.** Impl
47c0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
47d0: 65 20 51 55 4f 54 45 28 29 20 66 75 6e 63 74 69  e QUOTE() functi
47e0: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
47f0: 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c  on takes a singl
4800: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20  e.** argument.  
4810: 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
4820: 69 73 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 20  is numeric, the 
4830: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
4840: 74 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74  the same as.** t
4850: 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66  he argument.  If
4860: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
4870: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 74 75 72   NULL, the retur
4880: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  n value is the s
4890: 74 72 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e  tring.** "NULL".
48a0: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65    Otherwise, the
48b0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 6e 63   argument is enc
48c0: 6c 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20  losed in single 
48d0: 71 75 6f 74 65 73 20 77 69 74 68 0a 2a 2a 20 73  quotes with.** s
48e0: 69 6e 67 6c 65 2d 71 75 6f 74 65 20 65 73 63 61  ingle-quote esca
48f0: 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pes..*/.static v
4900: 6f 69 64 20 71 75 6f 74 65 46 75 6e 63 28 73 71  oid quoteFunc(sq
4910: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
4920: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
4930: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
4940: 2a 2a 61 72 67 76 29 7b 0a 20 20 69 66 28 20 61  **argv){.  if( a
4950: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
4960: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
4970: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
4980: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
4990: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
49a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
49b0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
49c0: 78 74 2c 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53  xt, "NULL", 4, S
49d0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
49e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
49f0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
4a00: 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  E_INTEGER:.    c
4a10: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
4a20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4a30: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
4a40: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29  ontext, argv[0])
4a50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4a60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
4a70: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
4a80: 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d     char *zText =
4a90: 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63   0;.      char c
4aa0: 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73 71  onst *zBlob = sq
4ab0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
4ac0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
4ad0: 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c   int nBlob = sql
4ae0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
4af0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
4b00: 20 61 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d 3d   assert( zBlob==
4b10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
4b20: 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 2f  ob(argv[0]) ); /
4b30: 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68  * No encoding ch
4b40: 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  ange */.      zT
4b50: 65 78 74 20 3d 20 28 63 68 61 72 20 2a 29 63 6f  ext = (char *)co
4b60: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
4b70: 65 78 74 2c 20 28 32 2a 28 69 36 34 29 6e 42 6c  ext, (2*(i64)nBl
4b80: 6f 62 29 2b 34 29 3b 20 0a 20 20 20 20 20 20 69  ob)+4); .      i
4b90: 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20 20  f( zText ){.    
4ba0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
4bb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42     for(i=0; i<nB
4bc0: 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lob; i++){.     
4bd0: 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29       zText[(i*2)
4be0: 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b  +2] = hexdigits[
4bf0: 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30 78  (zBlob[i]>>4)&0x
4c00: 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  0F];.          z
4c10: 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d 20  Text[(i*2)+3] = 
4c20: 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62  hexdigits[(zBlob
4c30: 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20 20  [i])&0x0F];.    
4c40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54      }.        zT
4c50: 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32 5d  ext[(nBlob*2)+2]
4c60: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
4c70: 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29   zText[(nBlob*2)
4c80: 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +3] = '\0';.    
4c90: 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20 27      zText[0] = '
4ca0: 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78  X';.        zTex
4cb0: 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20  t[1] = '\'';.   
4cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
4cd0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
4ce0: 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51 4c  , zText, -1, SQL
4cf0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
4d00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4d10: 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20  free(zText);.   
4d20: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
4d30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4d40: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a   SQLITE_TEXT: {.
4d50: 20 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a 20        int i,j;. 
4d60: 20 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20 20       u64 n;.    
4d70: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
4d80: 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73 71   char *zArg = sq
4d90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
4da0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
4db0: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20 20   char *z;..     
4dc0: 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20 72   if( zArg==0 ) r
4dd0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72  eturn;.      for
4de0: 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67 5b  (i=0, n=0; zArg[
4df0: 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a 41  i]; i++){ if( zA
4e00: 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b  rg[i]=='\'' ) n+
4e10: 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 63  +; }.      z = c
4e20: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
4e30: 74 65 78 74 2c 20 28 28 69 36 34 29 69 29 2b 28  text, ((i64)i)+(
4e40: 28 69 36 34 29 6e 29 2b 33 29 3b 0a 20 20 20 20  (i64)n)+3);.    
4e50: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
4e60: 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b 0a     z[0] = '\'';.
4e70: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
4e80: 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20 69   j=1; zArg[i]; i
4e90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ++){.          z
4ea0: 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d 3b  [j++] = zArg[i];
4eb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
4ec0: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a  Arg[i]=='\'' ){.
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b              z[j+
4ee0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20  +] = '\'';.     
4ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4f00: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
4f10: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
4f20: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[j] = 0;.      
4f30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4f40: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
4f50: 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  , j, sqlite3_fre
4f60: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
4f70: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
4f80: 68 65 20 68 65 78 28 29 20 66 75 6e 63 74 69 6f  he hex() functio
4f90: 6e 2e 20 20 49 6e 74 65 72 70 72 65 74 20 74 68  n.  Interpret th
4fa0: 65 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61 20  e argument as a 
4fb0: 62 6c 6f 62 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  blob.  Return.**
4fc0: 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20 72   a hexadecimal r
4fd0: 65 6e 64 65 72 69 6e 67 20 61 73 20 74 65 78 74  endering as text
4fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4ff0: 20 68 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69   hexFunc(.  sqli
5000: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5010: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
5020: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5030: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
5040: 74 20 69 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20  t i, n;.  const 
5050: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
5060: 42 6c 6f 62 3b 0a 20 20 63 68 61 72 20 2a 7a 48  Blob;.  char *zH
5070: 65 78 2c 20 2a 7a 3b 0a 20 20 61 73 73 65 72 74  ex, *z;.  assert
5080: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 70  ( argc==1 );.  p
5090: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
50a0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
50b0: 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  ]);.  n = sqlite
50c0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
50d0: 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[0]);.  assert
50e0: 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33  ( pBlob==sqlite3
50f0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
5100: 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65  [0]) );  /* No e
5110: 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a  ncoding change *
5120: 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20 63  /.  z = zHex = c
5130: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
5140: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2a 32  text, ((i64)n)*2
5150: 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a 48 65   + 1);.  if( zHe
5160: 78 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  x ){.    for(i=0
5170: 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42 6c 6f  ; i<n; i++, pBlo
5180: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  b++){.      unsi
5190: 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 2a 70  gned char c = *p
51a0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 2a 28 7a 2b  Blob;.      *(z+
51b0: 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  +) = hexdigits[(
51c0: 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20  c>>4)&0xf];.    
51d0: 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69    *(z++) = hexdi
51e0: 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a 20 20 20  gits[c&0xf];.   
51f0: 20 7d 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20   }.    *z = 0;. 
5200: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5210: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
5220: 7a 48 65 78 2c 20 6e 2a 32 2c 20 73 71 6c 69 74  zHex, n*2, sqlit
5230: 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a  e3_free);.  }.}.
5240: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a 65 72 6f 62  ./*.** The zerob
5250: 6c 6f 62 28 4e 29 20 66 75 6e 63 74 69 6f 6e 20  lob(N) function 
5260: 72 65 74 75 72 6e 73 20 61 20 7a 65 72 6f 2d 66  returns a zero-f
5270: 69 6c 6c 65 64 20 62 6c 6f 62 20 6f 66 20 73 69  illed blob of si
5280: 7a 65 20 4e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  ze N bytes..*/.s
5290: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 62  tatic void zerob
52a0: 6c 6f 62 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  lobFunc(.  sqlit
52b0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
52c0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
52d0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
52e0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 36 34   **argv.){.  i64
52f0: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72   n;.  assert( ar
5300: 67 63 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 73  gc==1 );.  n = s
5310: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
5320: 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  64(argv[0]);.  i
5330: 66 28 20 6e 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  f( n>SQLITE_MAX_
5340: 4c 45 4e 47 54 48 20 29 7b 0a 20 20 20 20 73 71  LENGTH ){.    sq
5350: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5360: 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78  or_toobig(contex
5370: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
5380: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5390: 7a 65 72 6f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  zeroblob(context
53a0: 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , n);.  }.}../*.
53b0: 2a 2a 20 54 68 65 20 72 65 70 6c 61 63 65 28 29  ** The replace()
53c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 72 65   function.  Thre
53d0: 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  e arguments are 
53e0: 61 6c 6c 20 73 74 72 69 6e 67 73 3a 20 63 61 6c  all strings: cal
53f0: 6c 0a 2a 2a 20 74 68 65 6d 20 41 2c 20 42 2c 20  l.** them A, B, 
5400: 61 6e 64 20 43 2e 20 54 68 65 20 72 65 73 75 6c  and C. The resul
5410: 74 20 69 73 20 61 6c 73 6f 20 61 20 73 74 72 69  t is also a stri
5420: 6e 67 20 77 68 69 63 68 20 69 73 20 64 65 72 69  ng which is deri
5430: 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 41 20 62 79  ved.** from A by
5440: 20 72 65 70 6c 61 63 69 6e 67 20 65 76 65 72 79   replacing every
5450: 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 42 20   occurance of B 
5460: 77 69 74 68 20 43 2e 20 20 54 68 65 20 6d 61 74  with C.  The mat
5470: 63 68 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 78  ch.** must be ex
5480: 61 63 74 2e 20 20 43 6f 6c 6c 61 74 69 6e 67 20  act.  Collating 
5490: 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 6e 6f  sequences are no
54a0: 74 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  t used..*/.stati
54b0: 63 20 76 6f 69 64 20 72 65 70 6c 61 63 65 46 75  c void replaceFu
54c0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
54d0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
54e0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
54f0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
5500: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  gv.){.  const un
5510: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74  signed char *zSt
5520: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r;        /* The
5530: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 41 20   input string A 
5540: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  */.  const unsig
5550: 6e 65 64 20 63 68 61 72 20 2a 7a 50 61 74 74 65  ned char *zPatte
5560: 72 6e 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61  rn;    /* The pa
5570: 74 74 65 72 6e 20 73 74 72 69 6e 67 20 42 20 2a  ttern string B *
5580: 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  /.  const unsign
5590: 65 64 20 63 68 61 72 20 2a 7a 52 65 70 3b 20 20  ed char *zRep;  
55a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 70        /* The rep
55b0: 6c 61 63 65 6d 65 6e 74 20 73 74 72 69 6e 67 20  lacement string 
55c0: 43 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  C */.  unsigned 
55d0: 63 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20  char *zOut;     
55e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
55f0: 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
5600: 6e 53 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  nStr;           
5610: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
5620: 7a 53 74 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  zStr */.  int nP
5630: 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20  attern;         
5640: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 50     /* Size of zP
5650: 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  attern */.  int 
5660: 6e 52 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nRep;           
5670: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
5680: 7a 52 65 70 20 2a 2f 0a 20 20 69 36 34 20 6e 4f  zRep */.  i64 nO
5690: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
56a0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69     /* Maximum si
56b0: 7a 65 20 6f 66 20 7a 4f 75 74 20 2a 2f 0a 20 20  ze of zOut */.  
56c0: 69 6e 74 20 6c 6f 6f 70 4c 69 6d 69 74 3b 20 20  int loopLimit;  
56d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
56e0: 20 7a 53 74 72 5b 5d 20 74 68 61 74 20 6d 69 67   zStr[] that mig
56f0: 68 74 20 6d 61 74 63 68 20 7a 50 61 74 74 65 72  ht match zPatter
5700: 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  n[] */.  int i, 
5710: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
5720: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
5730: 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
5740: 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 7a 53   argc==3 );.  zS
5750: 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  tr = sqlite3_val
5760: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
5770: 3b 0a 20 20 69 66 28 20 7a 53 74 72 3d 3d 30 20  ;.  if( zStr==0 
5780: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 53 74 72  ) return;.  nStr
5790: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
57a0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
57b0: 0a 20 20 61 73 73 65 72 74 28 20 7a 53 74 72 3d  .  assert( zStr=
57c0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
57d0: 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  ext(argv[0]) ); 
57e0: 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20   /* No encoding 
57f0: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 50 61 74  change */.  zPat
5800: 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  tern = sqlite3_v
5810: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
5820: 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65  ]);.  if( zPatte
5830: 72 6e 3d 3d 30 20 7c 7c 20 7a 50 61 74 74 65 72  rn==0 || zPatter
5840: 6e 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  n[0]==0 ) return
5850: 3b 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73  ;.  nPattern = s
5860: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
5870: 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61  es(argv[1]);.  a
5880: 73 73 65 72 74 28 20 7a 50 61 74 74 65 72 6e 3d  ssert( zPattern=
5890: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
58a0: 65 78 74 28 61 72 67 76 5b 31 5d 29 20 29 3b 20  ext(argv[1]) ); 
58b0: 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20   /* No encoding 
58c0: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65 70  change */.  zRep
58d0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
58e0: 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a  _text(argv[2]);.
58f0: 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20    if( zRep==0 ) 
5900: 72 65 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20 3d  return;.  nRep =
5910: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5920: 79 74 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20  ytes(argv[2]);. 
5930: 20 61 73 73 65 72 74 28 20 7a 52 65 70 3d 3d 73   assert( zRep==s
5940: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5950: 74 28 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20 20  t(argv[2]) );.  
5960: 6e 4f 75 74 20 3d 20 6e 53 74 72 20 2b 20 31 3b  nOut = nStr + 1;
5970: 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3c  .  assert( nOut<
5980: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
5990: 48 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63 6f  H );.  zOut = co
59a0: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
59b0: 65 78 74 2c 20 28 69 36 34 29 6e 4f 75 74 29 3b  ext, (i64)nOut);
59c0: 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29  .  if( zOut==0 )
59d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
59e0: 7d 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20  }.  loopLimit = 
59f0: 6e 53 74 72 20 2d 20 6e 50 61 74 74 65 72 6e 3b  nStr - nPattern;
5a00: 20 20 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20    .  for(i=j=0; 
5a10: 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b  i<=loopLimit; i+
5a20: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 74 72  +){.    if( zStr
5a30: 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30 5d  [i]!=zPattern[0]
5a40: 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74 72   || memcmp(&zStr
5a50: 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e  [i], zPattern, n
5a60: 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20 20 20  Pattern) ){.    
5a70: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53    zOut[j++] = zS
5a80: 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  tr[i];.    }else
5a90: 7b 0a 20 20 20 20 20 20 75 38 20 2a 7a 4f 6c 64  {.      u8 *zOld
5aa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  ;.      sqlite3 
5ab0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
5ac0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
5ad0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
5ae0: 6e 4f 75 74 20 2b 3d 20 6e 52 65 70 20 2d 20 6e  nOut += nRep - n
5af0: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 69  Pattern;.      i
5b00: 66 28 20 6e 4f 75 74 3e 3d 64 62 2d 3e 61 4c 69  f( nOut>=db->aLi
5b10: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5b20: 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
5b30: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5b40: 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28  lt_error_toobig(
5b50: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
5b60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5b70: 64 62 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 20  db, zOut);.     
5b80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
5b90: 20 7d 0a 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20   }.      zOld = 
5ba0: 7a 4f 75 74 3b 0a 20 20 20 20 20 20 7a 4f 75 74  zOut;.      zOut
5bb0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
5bc0: 6f 63 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e 4f  oc(zOut, (int)nO
5bd0: 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ut);.      if( z
5be0: 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
5bf0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5c00: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
5c10: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73  text);.        s
5c20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5c30: 20 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20   zOld);.        
5c40: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
5c50: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f        memcpy(&zO
5c60: 75 74 5b 6a 5d 2c 20 7a 52 65 70 2c 20 6e 52 65  ut[j], zRep, nRe
5c70: 70 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d 20 6e  p);.      j += n
5c80: 52 65 70 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  Rep;.      i += 
5c90: 6e 50 61 74 74 65 72 6e 2d 31 3b 0a 20 20 20 20  nPattern-1;.    
5ca0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5cb0: 6a 2b 6e 53 74 72 2d 69 2b 31 3d 3d 6e 4f 75 74  j+nStr-i+1==nOut
5cc0: 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 4f   );.  memcpy(&zO
5cd0: 75 74 5b 6a 5d 2c 20 26 7a 53 74 72 5b 69 5d 2c  ut[j], &zStr[i],
5ce0: 20 6e 53 74 72 2d 69 29 3b 0a 20 20 6a 20 2b 3d   nStr-i);.  j +=
5cf0: 20 6e 53 74 72 20 2d 20 69 3b 0a 20 20 61 73 73   nStr - i;.  ass
5d00: 65 72 74 28 20 6a 3c 3d 6e 4f 75 74 20 29 3b 0a  ert( j<=nOut );.
5d10: 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20    zOut[j] = 0;. 
5d20: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5d30: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
5d40: 68 61 72 2a 29 7a 4f 75 74 2c 20 6a 2c 20 73 71  har*)zOut, j, sq
5d50: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a  lite3_free);.}..
5d60: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5d70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 52 49 4d  tion of the TRIM
5d80: 28 29 2c 20 4c 54 52 49 4d 28 29 2c 20 61 6e 64  (), LTRIM(), and
5d90: 20 52 54 52 49 4d 28 29 20 66 75 6e 63 74 69 6f   RTRIM() functio
5da0: 6e 73 2e 0a 2a 2a 20 54 68 65 20 75 73 65 72 64  ns..** The userd
5db0: 61 74 61 20 69 73 20 30 78 31 20 66 6f 72 20 6c  ata is 0x1 for l
5dc0: 65 66 74 20 74 72 69 6d 2c 20 30 78 32 20 66 6f  eft trim, 0x2 fo
5dd0: 72 20 72 69 67 68 74 20 74 72 69 6d 2c 20 30 78  r right trim, 0x
5de0: 33 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  3 for both..*/.s
5df0: 74 61 74 69 63 20 76 6f 69 64 20 74 72 69 6d 46  tatic void trimF
5e00: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
5e10: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5e20: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5e30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5e40: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
5e50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
5e60: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  n;         /* In
5e70: 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  put string */.  
5e80: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5e90: 68 61 72 20 2a 7a 43 68 61 72 53 65 74 3b 20 20  har *zCharSet;  
5ea0: 20 20 2f 2a 20 53 65 74 20 6f 66 20 63 68 61 72    /* Set of char
5eb0: 61 63 74 65 72 73 20 74 6f 20 74 72 69 6d 20 2a  acters to trim *
5ec0: 2f 0a 20 20 69 6e 74 20 6e 49 6e 3b 20 20 20 20  /.  int nIn;    
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5ef0: 6f 66 20 62 79 74 65 73 20 69 6e 20 69 6e 70 75  of bytes in inpu
5f00: 74 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  t */.  int flags
5f10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 74           /* 1: t
5f30: 72 69 6d 6c 65 66 74 20 20 32 3a 20 74 72 69 6d  rimleft  2: trim
5f40: 72 69 67 68 74 20 20 33 3a 20 74 72 69 6d 20 2a  right  3: trim *
5f50: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f70: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
5f80: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
5f90: 6e 65 64 20 63 68 61 72 20 2a 61 4c 65 6e 3b 20  ned char *aLen; 
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5fb0: 4c 65 6e 67 74 68 20 6f 66 20 65 61 63 68 20 63  Length of each c
5fc0: 68 61 72 61 63 74 65 72 20 69 6e 20 7a 43 68 61  haracter in zCha
5fd0: 72 53 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  rSet */.  unsign
5fe0: 65 64 20 63 68 61 72 20 2a 2a 61 7a 43 68 61 72  ed char **azChar
5ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
6000: 6e 64 69 76 69 64 75 61 6c 20 63 68 61 72 61 63  ndividual charac
6010: 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65 74  ters in zCharSet
6020: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b   */.  int nChar;
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6050: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
6060: 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 0a  in zCharSet */..
6070: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
6080: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
6090: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
60a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
60b0: 7d 0a 20 20 7a 49 6e 20 3d 20 73 71 6c 69 74 65  }.  zIn = sqlite
60c0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
60d0: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e  v[0]);.  if( zIn
60e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
60f0: 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  nIn = sqlite3_va
6100: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
6110: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 49  ]);.  assert( zI
6120: 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n==sqlite3_value
6130: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29  _text(argv[0]) )
6140: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20  ;.  if( argc==1 
6150: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
6160: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
6170: 72 20 6c 65 6e 4f 6e 65 5b 5d 20 3d 20 7b 20 31  r lenOne[] = { 1
6180: 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 75   };.    static u
6190: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
61a0: 6f 6e 73 74 20 61 7a 4f 6e 65 5b 5d 20 3d 20 7b  onst azOne[] = {
61b0: 20 28 75 38 2a 29 22 20 22 20 7d 3b 0a 20 20 20   (u8*)" " };.   
61c0: 20 6e 43 68 61 72 20 3d 20 31 3b 0a 20 20 20 20   nChar = 1;.    
61d0: 61 4c 65 6e 20 3d 20 28 75 38 2a 29 6c 65 6e 4f  aLen = (u8*)lenO
61e0: 6e 65 3b 0a 20 20 20 20 61 7a 43 68 61 72 20 3d  ne;.    azChar =
61f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
6200: 2a 2a 29 61 7a 4f 6e 65 3b 0a 20 20 20 20 7a 43  **)azOne;.    zC
6210: 68 61 72 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  harSet = 0;.  }e
6220: 6c 73 65 20 69 66 28 20 28 7a 43 68 61 72 53 65  lse if( (zCharSe
6230: 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
6240: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 29  e_text(argv[1]))
6250: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6260: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
6270: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
6280: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 66 6f 72 28  har *z;.    for(
6290: 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43 68 61  z=zCharSet, nCha
62a0: 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b  r=0; *z; nChar++
62b0: 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ){.      SQLITE_
62c0: 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20  SKIP_UTF8(z);.  
62d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 68 61    }.    if( nCha
62e0: 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 7a 43  r>0 ){.      azC
62f0: 68 61 72 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c  har = contextMal
6300: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69  loc(context, ((i
6310: 36 34 29 6e 43 68 61 72 29 2a 28 73 69 7a 65 6f  64)nChar)*(sizeo
6320: 66 28 63 68 61 72 2a 29 2b 31 29 29 3b 0a 20 20  f(char*)+1));.  
6330: 20 20 20 20 69 66 28 20 61 7a 43 68 61 72 3d 3d      if( azChar==
6340: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
6350: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
6360: 20 20 20 61 4c 65 6e 20 3d 20 28 75 6e 73 69 67     aLen = (unsig
6370: 6e 65 64 20 63 68 61 72 2a 29 26 61 7a 43 68 61  ned char*)&azCha
6380: 72 5b 6e 43 68 61 72 5d 3b 0a 20 20 20 20 20 20  r[nChar];.      
6390: 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20  for(z=zCharSet, 
63a0: 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68  nChar=0; *z; nCh
63b0: 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  ar++){.        a
63c0: 7a 43 68 61 72 5b 6e 43 68 61 72 5d 20 3d 20 28  zChar[nChar] = (
63d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
63e0: 7a 3b 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  z;.        SQLIT
63f0: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a  E_SKIP_UTF8(z);.
6400: 20 20 20 20 20 20 20 20 61 4c 65 6e 5b 6e 43 68          aLen[nCh
6410: 61 72 5d 20 3d 20 7a 20 2d 20 61 7a 43 68 61 72  ar] = z - azChar
6420: 5b 6e 43 68 61 72 5d 3b 0a 20 20 20 20 20 20 7d  [nChar];.      }
6430: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6440: 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20   nChar>0 ){.    
6450: 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 50  flags = SQLITE_P
6460: 54 52 5f 54 4f 5f 49 4e 54 28 73 71 6c 69 74 65  TR_TO_INT(sqlite
6470: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
6480: 65 78 74 29 29 3b 0a 20 20 20 20 69 66 28 20 66  ext));.    if( f
6490: 6c 61 67 73 20 26 20 31 20 29 7b 0a 20 20 20 20  lags & 1 ){.    
64a0: 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29    while( nIn>0 )
64b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
64c0: 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  n;.        for(i
64d0: 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
64e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
64f0: 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20   = aLen[i];.    
6500: 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
6510: 28 7a 49 6e 2c 20 61 7a 43 68 61 72 5b 69 5d 2c  (zIn, azChar[i],
6520: 20 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b   len)==0 ) break
6530: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6540: 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72      if( i>=nChar
6550: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6560: 20 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20    zIn += len;.  
6570: 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e        nIn -= len
6580: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6590: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
65a0: 32 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  2 ){.      while
65b0: 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  ( nIn>0 ){.     
65c0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
65d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
65e0: 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Char; i++){.    
65f0: 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e        len = aLen
6600: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
6610: 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d  f( len<=nIn && m
6620: 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c  emcmp(&zIn[nIn-l
6630: 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65  en],azChar[i],le
6640: 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  n)==0 ) break;. 
6650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6660: 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20   if( i>=nChar ) 
6670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e  break;.        n
6680: 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  In -= len;.     
6690: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
66a0: 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20   zCharSet ){.   
66b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
66c0: 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20  azChar);.    }. 
66d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
66e0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
66f0: 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49  , (char*)zIn, nI
6700: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
6710: 45 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ENT);.}...#ifdef
6720: 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a   SQLITE_SOUNDEX.
6730: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
6740: 65 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69  e soundex encodi
6750: 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2f  ng of a word..*/
6760: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75  .static void sou
6770: 6e 64 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69  ndexFunc(.  sqli
6780: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6790: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
67a0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
67b0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68  e **argv.){.  ch
67c0: 61 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20  ar zResult[8];. 
67d0: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a   const u8 *zIn;.
67e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
67f0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
6800: 6e 65 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d  ned char iCode[]
6810: 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30   = {.    0, 0, 0
6820: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6830: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6840: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
6850: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6860: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6870: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
6880: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6890: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
68a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
68b0: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
68c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
68d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
68e0: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31  , 0,.    0, 0, 1
68f0: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c  , 2, 3, 0, 1, 2,
6900: 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20   0, 0, 2, 2, 4, 
6910: 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20  5, 5, 0,.    1, 
6920: 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31  2, 6, 2, 3, 0, 1
6930: 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 2, 0, 2, 0,
6940: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
6950: 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20   0, 0, 1, 2, 3, 
6960: 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32  0, 1, 2, 0, 0, 2
6970: 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c  , 2, 4, 5, 5, 0,
6980: 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c  .    1, 2, 6, 2,
6990: 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20   3, 0, 1, 0, 2, 
69a0: 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 2, 0, 0, 0, 0
69b0: 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65  , 0,.  };.  asse
69c0: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
69d0: 20 7a 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69   zIn = (u8*)sqli
69e0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
69f0: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
6a00: 49 6e 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75  In==0 ) zIn = (u
6a10: 38 2a 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30  8*)"";.  for(i=0
6a20: 3b 20 7a 49 6e 5b 69 5d 20 26 26 20 21 69 73 61  ; zIn[i] && !isa
6a30: 6c 70 68 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b  lpha(zIn[i]); i+
6a40: 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69  +){}.  if( zIn[i
6a50: 5d 20 29 7b 0a 20 20 20 20 75 38 20 70 72 65 76  ] ){.    u8 prev
6a60: 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e  code = iCode[zIn
6a70: 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 7a  [i]&0x7f];.    z
6a80: 52 65 73 75 6c 74 5b 30 5d 20 3d 20 74 6f 75 70  Result[0] = toup
6a90: 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20  per(zIn[i]);.   
6aa0: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26   for(j=1; j<4 &&
6ab0: 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20   zIn[i]; i++){. 
6ac0: 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20       int code = 
6ad0: 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37  iCode[zIn[i]&0x7
6ae0: 66 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f  f];.      if( co
6af0: 64 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  de>0 ){.        
6b00: 69 66 28 20 63 6f 64 65 21 3d 70 72 65 76 63 6f  if( code!=prevco
6b10: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
6b20: 70 72 65 76 63 6f 64 65 20 3d 20 63 6f 64 65 3b  prevcode = code;
6b30: 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 73 75  .          zResu
6b40: 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b  lt[j++] = code +
6b50: 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   '0';.        }.
6b60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6b70: 20 20 20 20 20 70 72 65 76 63 6f 64 65 20 3d 20       prevcode = 
6b80: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
6b90: 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 34 20  .    while( j<4 
6ba0: 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74  ){.      zResult
6bb0: 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20  [j++] = '0';.   
6bc0: 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a   }.    zResult[j
6bd0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
6be0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
6bf0: 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c 74 2c  ontext, zResult,
6c00: 20 34 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   4, SQLITE_TRANS
6c10: 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
6c20: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6c30: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6c40: 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51 4c 49   "?000", 4, SQLI
6c50: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  TE_STATIC);.  }.
6c60: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
6c70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
6c80: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
6c90: 2a 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20 74 68  ** A function th
6ca0: 61 74 20 6c 6f 61 64 73 20 61 20 73 68 61 72 65  at loads a share
6cb0: 64 2d 6c 69 62 72 61 72 79 20 65 78 74 65 6e 73  d-library extens
6cc0: 69 6f 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 73  ion then returns
6cd0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6ce0: 20 76 6f 69 64 20 6c 6f 61 64 45 78 74 28 73 71   void loadExt(sq
6cf0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6d00: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
6d10: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
6d20: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
6d30: 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28   char *zFile = (
6d40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
6d50: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6d60: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73  argv[0]);.  cons
6d70: 74 20 63 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20  t char *zProc;. 
6d80: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
6d90: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
6da0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
6db0: 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  );.  char *zErrM
6dc0: 73 67 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61  sg = 0;..  if( a
6dd0: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50  rgc==2 ){.    zP
6de0: 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  roc = (const cha
6df0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
6e00: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
6e10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50  .  }else{.    zP
6e20: 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  roc = 0;.  }.  i
6e30: 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c 69  f( zFile && sqli
6e40: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
6e50: 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  on(db, zFile, zP
6e60: 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20 29  roc, &zErrMsg) )
6e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
6e80: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
6e90: 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29  xt, zErrMsg, -1)
6ea0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
6eb0: 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  ee(zErrMsg);.  }
6ec0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
6ed0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
6ee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
6ef0: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74  tructure holds t
6f00: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a  he context of a.
6f10: 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28  ** sum() or avg(
6f20: 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70  ) aggregate comp
6f30: 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  utation..*/.type
6f40: 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43 74  def struct SumCt
6f50: 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74  x SumCtx;.struct
6f60: 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62   SumCtx {.  doub
6f70: 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a  le rSum;      /*
6f80: 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   Floating point 
6f90: 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 75  sum */.  i64 iSu
6fa0: 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  m;         /* In
6fb0: 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a  teger sum */   .
6fc0: 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20 20    i64 cnt;      
6fd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6fe0: 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64   elements summed
6ff0: 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f   */.  u8 overflo
7000: 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w;      /* True 
7010: 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  if integer overf
7020: 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38  low seen */.  u8
7030: 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20 20   approx;        
7040: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69  /* True if non-i
7050: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 61 73  nteger value was
7060: 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73 75   input to the su
7070: 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  m */.};../*.** R
7080: 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20  outines used to 
7090: 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d 2c  compute the sum,
70a0: 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74 6f   average, and to
70b0: 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  tal..**.** The S
70c0: 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  UM() function fo
70d0: 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b 65  llows the (broke
70e0: 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64 20  n) SQL standard 
70f0: 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74  which means.** t
7100: 68 61 74 20 69 74 20 72 65 74 75 72 6e 73 20 4e  hat it returns N
7110: 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20 6f  ULL if it sums o
7120: 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20  ver no inputs.  
7130: 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a  TOTAL returns.**
7140: 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61 73   0.0 in that cas
7150: 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c  e.  In addition,
7160: 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72 65   TOTAL always re
7170: 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77 68  turns a float wh
7180: 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74  ere.** SUM might
7190: 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   return an integ
71a0: 65 72 20 69 66 20 69 74 20 6e 65 76 65 72 20 65  er if it never e
71b0: 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f 61  ncounters a floa
71c0: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
71d0: 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65  lue.  TOTAL neve
71e0: 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55 4d  r fails, but SUM
71f0: 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20 61   might through a
7200: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a  n exception if.*
7210: 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20 61  * it overflows a
7220: 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  n integer..*/.st
7230: 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74 65  atic void sumSte
7240: 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  p(sqlite3_contex
7250: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
7260: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
7270: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53  lue **argv){.  S
7280: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20  umCtx *p;.  int 
7290: 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28 20  type;.  assert( 
72a0: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 70 20 3d  argc==1 );.  p =
72b0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
72c0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
72d0: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
72e0: 0a 20 20 74 79 70 65 20 3d 20 73 71 6c 69 74 65  .  type = sqlite
72f0: 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f  3_value_numeric_
7300: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  type(argv[0]);. 
7310: 20 69 66 28 20 70 20 26 26 20 74 79 70 65 21 3d   if( p && type!=
7320: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
7330: 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20     p->cnt++;.   
7340: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
7350: 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
7360: 20 20 20 69 36 34 20 76 20 3d 20 73 71 6c 69 74     i64 v = sqlit
7370: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
7380: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70  rgv[0]);.      p
7390: 2d 3e 72 53 75 6d 20 2b 3d 20 76 3b 0a 20 20 20  ->rSum += v;.   
73a0: 20 20 20 69 66 28 20 28 70 2d 3e 61 70 70 72 6f     if( (p->appro
73b0: 78 7c 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3d 3d  x|p->overflow)==
73c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  0 ){.        i64
73d0: 20 69 4e 65 77 53 75 6d 20 3d 20 70 2d 3e 69 53   iNewSum = p->iS
73e0: 75 6d 20 2b 20 76 3b 0a 20 20 20 20 20 20 20 20  um + v;.        
73f0: 69 6e 74 20 73 31 20 3d 20 70 2d 3e 69 53 75 6d  int s1 = p->iSum
7400: 20 3e 3e 20 28 73 69 7a 65 6f 66 28 69 36 34 29   >> (sizeof(i64)
7410: 2a 38 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  *8-1);.        i
7420: 6e 74 20 73 32 20 3d 20 76 20 20 20 20 20 20 20  nt s2 = v       
7430: 3e 3e 20 28 73 69 7a 65 6f 66 28 69 36 34 29 2a  >> (sizeof(i64)*
7440: 38 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  8-1);.        in
7450: 74 20 73 33 20 3d 20 69 4e 65 77 53 75 6d 20 3e  t s3 = iNewSum >
7460: 3e 20 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38  > (sizeof(i64)*8
7470: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  -1);.        p->
7480: 6f 76 65 72 66 6c 6f 77 20 3d 20 28 73 31 26 73  overflow = (s1&s
7490: 32 26 7e 73 33 29 20 7c 20 28 7e 73 31 26 7e 73  2&~s3) | (~s1&~s
74a0: 32 26 73 33 29 3b 0a 20 20 20 20 20 20 20 20 70  2&s3);.        p
74b0: 2d 3e 69 53 75 6d 20 3d 20 69 4e 65 77 53 75 6d  ->iSum = iNewSum
74c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
74d0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 53  lse{.      p->rS
74e0: 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61  um += sqlite3_va
74f0: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
7500: 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  0]);.      p->ap
7510: 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  prox = 1;.    }.
7520: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
7530: 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65 28 73 71  d sumFinalize(sq
7540: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7550: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74  ontext){.  SumCt
7560: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7570: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7580: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
7590: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
75a0: 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 69 66  >cnt>0 ){.    if
75b0: 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 29 7b  ( p->overflow ){
75c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
75d0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
75e0: 65 78 74 2c 22 69 6e 74 65 67 65 72 20 6f 76 65  ext,"integer ove
75f0: 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20 20 20 20  rflow",-1);.    
7600: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 61 70 70  }else if( p->app
7610: 72 6f 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rox ){.      sql
7620: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
7630: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72  le(context, p->r
7640: 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sum);.    }else{
7650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7660: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
7670: 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29 3b 0a 20  ext, p->iSum);. 
7680: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
7690: 63 20 76 6f 69 64 20 61 76 67 46 69 6e 61 6c 69  c void avgFinali
76a0: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
76b0: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
76c0: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  SumCtx *p;.  p =
76d0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
76e0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
76f0: 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  xt, 0);.  if( p 
7700: 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20  && p->cnt>0 ){. 
7710: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7720: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
7730: 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f 75 62 6c  , p->rSum/(doubl
7740: 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d 0a 7d  e)p->cnt);.  }.}
7750: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 74  .static void tot
7760: 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  alFinalize(sqlit
7770: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7780: 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a  ext){.  SumCtx *
7790: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  p;.  p = sqlite3
77a0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
77b0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
77c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
77d0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
77e0: 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 30   p ? p->rSum : 0
77f0: 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .0);.}../*.** Th
7800: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
7810: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
7820: 6b 20 6f 66 20 73 74 61 74 65 20 69 6e 66 6f 72  k of state infor
7830: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a  mation for the.*
7840: 2a 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67  * count() aggreg
7850: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ate function..*/
7860: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
7870: 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e 74 43 74  CountCtx CountCt
7880: 78 3b 0a 73 74 72 75 63 74 20 43 6f 75 6e 74 43  x;.struct CountC
7890: 74 78 20 7b 0a 20 20 69 36 34 20 6e 3b 0a 7d 3b  tx {.  i64 n;.};
78a0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
78b0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
78c0: 65 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67  e count() aggreg
78d0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ate function..*/
78e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
78f0: 6e 74 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63  ntStep(sqlite3_c
7900: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
7910: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
7920: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
7930: 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b  {.  CountCtx *p;
7940: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
7950: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
7960: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
7970: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72  (*p));.  if( (ar
7980: 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f  gc==0 || SQLITE_
7990: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
79a0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
79b0: 29 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20 70  )) && p ){.    p
79c0: 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20 20 20 0a  ->n++;.  }.}   .
79d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e  static void coun
79e0: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
79f0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7a00: 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  xt){.  CountCtx 
7a10: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
7a20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
7a30: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
7a40: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
7a50: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
7a60: 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a   p ? p->n : 0);.
7a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
7a80: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d  s to implement m
7a90: 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61  in() and max() a
7aa0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
7ab0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
7ac0: 69 64 20 6d 69 6e 6d 61 78 53 74 65 70 28 73 71  id minmaxStep(sq
7ad0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7ae0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
7af0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
7b00: 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 65 6d 20 2a  **argv){.  Mem *
7b10: 70 41 72 67 20 20 3d 20 28 4d 65 6d 20 2a 29 61  pArg  = (Mem *)a
7b20: 72 67 76 5b 30 5d 3b 0a 20 20 4d 65 6d 20 2a 70  rgv[0];.  Mem *p
7b30: 42 65 73 74 3b 0a 0a 20 20 69 66 28 20 73 71 6c  Best;..  if( sql
7b40: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
7b50: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
7b60: 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a  _NULL ) return;.
7b70: 20 20 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a    pBest = (Mem *
7b80: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
7b90: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
7ba0: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73  xt, sizeof(*pBes
7bb0: 74 29 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73  t));.  if( !pBes
7bc0: 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  t ) return;..  i
7bd0: 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20  f( pBest->flags 
7be0: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a  ){.    int max;.
7bf0: 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20      int cmp;.   
7c00: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
7c10: 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63  = sqlite3GetFunc
7c20: 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29  CollSeq(context)
7c30: 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74  ;.    /* This st
7c40: 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ep function is u
7c50: 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
7c60: 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29   min() and max()
7c70: 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20 20 20   aggregates,.   
7c80: 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69 66   ** the only dif
7c90: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
7ca0: 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20 74 68  the two being th
7cb0: 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20  at the sense of 
7cc0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61  the.    ** compa
7cd0: 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72 74 65  rison is inverte
7ce0: 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78 28 29  d. For the max()
7cf0: 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 0a   aggregate, the.
7d00: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75      ** sqlite3_u
7d10: 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e 63 74  ser_data() funct
7d20: 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76 6f 69  ion returns (voi
7d30: 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28  d *)-1. For min(
7d40: 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) it.    ** retu
7d50: 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62 2c 20  rns (void *)db, 
7d60: 77 68 65 72 65 20 64 62 20 69 73 20 74 68 65 20  where db is the 
7d70: 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73  sqlite3* databas
7d80: 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a  e pointer..    *
7d90: 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68 65 20  * Therefore the 
7da0: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 73  next statement s
7db0: 65 74 73 20 76 61 72 69 61 62 6c 65 20 27 6d 61  ets variable 'ma
7dc0: 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68 65 20  x' to 1 for the 
7dd0: 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61 67 67  max().    ** agg
7de0: 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66 6f 72  regate, or 0 for
7df0: 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20   min()..    */. 
7e00: 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74 65 33     max = sqlite3
7e10: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
7e20: 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20  xt)!=0;.    cmp 
7e30: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
7e40: 61 72 65 28 70 42 65 73 74 2c 20 70 41 72 67 2c  are(pBest, pArg,
7e50: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pColl);.    if(
7e60: 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30 29 20   (max && cmp<0) 
7e70: 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d 70 3e  || (!max && cmp>
7e80: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
7e90: 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70  te3VdbeMemCopy(p
7ea0: 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 20  Best, pArg);.   
7eb0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
7ec0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
7ed0: 70 79 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b  py(pBest, pArg);
7ee0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
7ef0: 69 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a  id minMaxFinaliz
7f00: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
7f10: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73  t *context){.  s
7f20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
7f30: 65 73 3b 0a 20 20 70 52 65 73 20 3d 20 28 73 71  es;.  pRes = (sq
7f40: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 29 73 71  lite3_value *)sq
7f50: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
7f60: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
7f70: 20 30 29 3b 0a 20 20 69 66 28 20 70 52 65 73 20   0);.  if( pRes 
7f80: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d  ){.    if( pRes-
7f90: 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  >flags ){.      
7fa0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
7fb0: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 70 52  alue(context, pR
7fc0: 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  es);.    }.    s
7fd0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
7fe0: 65 61 73 65 28 70 52 65 73 29 3b 0a 20 20 7d 0a  ease(pRes);.  }.
7ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63  }../*.** group_c
8000: 6f 6e 63 61 74 28 45 58 50 52 2c 20 3f 53 45 50  oncat(EXPR, ?SEP
8010: 41 52 41 54 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74  ARATOR?).*/.stat
8020: 69 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e  ic void groupCon
8030: 63 61 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74  catStep(.  sqlit
8040: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
8050: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
8060: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8070: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
8080: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20  st char *zVal;. 
8090: 20 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75   StrAccum *pAccu
80a0: 6d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  m;.  const char 
80b0: 2a 7a 53 65 70 3b 0a 20 20 69 6e 74 20 6e 56 61  *zSep;.  int nVa
80c0: 6c 2c 20 6e 53 65 70 2c 20 69 3b 0a 20 20 69 66  l, nSep, i;.  if
80d0: 28 20 61 72 67 63 3d 3d 30 20 7c 7c 20 73 71 6c  ( argc==0 || sql
80e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
80f0: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
8100: 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a  _NULL ) return;.
8110: 20 20 70 41 63 63 75 6d 20 3d 20 28 53 74 72 41    pAccum = (StrA
8120: 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61 67  ccum*)sqlite3_ag
8130: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
8140: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
8150: 2a 70 41 63 63 75 6d 29 29 3b 0a 0a 20 20 69 66  *pAccum));..  if
8160: 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20  ( pAccum ){.    
8170: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
8180: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
8190: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
81a0: 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 75 73  ;.    pAccum->us
81b0: 65 4d 61 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  eMalloc = 1;.   
81c0: 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63   pAccum->mxAlloc
81d0: 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   = db->aLimit[SQ
81e0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
81f0: 48 5d 3b 0a 20 20 20 20 69 66 28 20 70 41 63 63  H];.    if( pAcc
8200: 75 6d 2d 3e 6e 43 68 61 72 20 29 7b 0a 20 20 20  um->nChar ){.   
8210: 20 20 20 69 66 28 20 61 72 67 63 3e 31 20 29 7b     if( argc>1 ){
8220: 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
8230: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
8240: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 61  alue_text(argv[a
8250: 72 67 63 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20  rgc-1]);.       
8260: 20 6e 53 65 70 20 3d 20 73 71 6c 69 74 65 33 5f   nSep = sqlite3_
8270: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
8280: 5b 61 72 67 63 2d 31 5d 29 3b 0a 20 20 20 20 20  [argc-1]);.     
8290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
82a0: 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20  zSep = ",";.    
82b0: 20 20 20 20 6e 53 65 70 20 3d 20 31 3b 0a 20 20      nSep = 1;.  
82c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
82d0: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
82e0: 64 28 70 41 63 63 75 6d 2c 20 7a 53 65 70 2c 20  d(pAccum, zSep, 
82f0: 6e 53 65 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nSep);.    }.   
8300: 20 69 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a   i = 0;.    do{.
8310: 20 20 20 20 20 20 7a 56 61 6c 20 3d 20 28 63 68        zVal = (ch
8320: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
8330: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
8340: 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 73 71  .      nVal = sq
8350: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8360: 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  s(argv[i]);.    
8370: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
8380: 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20  mAppend(pAccum, 
8390: 7a 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 20  zVal, nVal);.   
83a0: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 77 68 69     i++;.    }whi
83b0: 6c 65 28 20 69 3c 61 72 67 63 2d 31 20 29 3b 0a  le( i<argc-1 );.
83c0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
83d0: 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e  d groupConcatFin
83e0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
83f0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
8400: 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 41 63  .  StrAccum *pAc
8410: 63 75 6d 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20  cum;.  pAccum = 
8420: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8430: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
8440: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 41 63  t, 0);.  if( pAc
8450: 63 75 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  cum ){.    if( p
8460: 41 63 63 75 6d 2d 3e 74 6f 6f 42 69 67 20 29 7b  Accum->tooBig ){
8470: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
8480: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62  esult_error_toob
8490: 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ig(context);.   
84a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 41 63 63 75   }else if( pAccu
84b0: 6d 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  m->mallocFailed 
84c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
84d0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
84e0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
84f0: 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20 20 20    }else{    .   
8500: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8510: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
8520: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
8530: 69 6e 69 73 68 28 70 41 63 63 75 6d 29 2c 20 2d  inish(pAccum), -
8540: 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
8560: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
8570: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8580: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
8590: 67 69 73 74 65 72 65 64 20 61 6c 6c 20 6f 66 20  gistered all of 
85a0: 74 68 65 20 61 62 6f 76 65 20 43 20 66 75 6e 63  the above C func
85b0: 74 69 6f 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20  tions as SQL.** 
85c0: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
85d0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f   should be the o
85e0: 6e 6c 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 74  nly routine in t
85f0: 68 69 73 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a  his file with.**
8600: 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67   external linkag
8610: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
8620: 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
8630: 6e 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74  nFunctions(sqlit
8640: 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66  e3 *db){.#ifndef
8650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
8660: 45 52 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ERTABLE.  sqlite
8670: 33 41 6c 74 65 72 46 75 6e 63 74 69 6f 6e 73 28  3AlterFunctions(
8680: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e  db);.#endif.#ifn
8690: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
86a0: 50 41 52 53 45 52 0a 20 20 73 71 6c 69 74 65 33  PARSER.  sqlite3
86b0: 41 74 74 61 63 68 46 75 6e 63 74 69 6f 6e 73 28  AttachFunctions(
86c0: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  db);.#endif.  if
86d0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
86e0: 6c 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  led ){.    int r
86f0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  c = sqlite3_over
8700: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62  load_function(db
8710: 2c 20 22 4d 41 54 43 48 22 2c 20 32 29 3b 0a 20  , "MATCH", 2);. 
8720: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
8730: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72  QLITE_NOMEM || r
8740: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
8750: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8760: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
8770: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
8780: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
8790: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
87a0: 53 53 45 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  SSE.  (void)sqli
87b0: 74 65 33 53 73 65 46 75 6e 63 74 69 6f 6e 73 28  te3SseFunctions(
87c0: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  db);.#endif.}../
87d0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 4c 49 4b  *.** Set the LIK
87e0: 45 4f 50 54 20 66 6c 61 67 20 6f 6e 20 74 68 65  EOPT flag on the
87f0: 20 32 2d 61 72 67 75 6d 65 6e 74 20 66 75 6e 63   2-argument func
8800: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
8810: 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ven name..*/.sta
8820: 74 69 63 20 76 6f 69 64 20 73 65 74 4c 69 6b 65  tic void setLike
8830: 4f 70 74 46 6c 61 67 28 73 71 6c 69 74 65 33 20  OptFlag(sqlite3 
8840: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
8850: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67  *zName, int flag
8860: 56 61 6c 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  Val){.  FuncDef 
8870: 2a 70 44 65 66 3b 0a 20 20 70 44 65 66 20 3d 20  *pDef;.  pDef = 
8880: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
8890: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 73  ion(db, zName, s
88a0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c 20 32 2c  trlen(zName), 2,
88b0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
88c0: 3b 0a 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a  ;.  if( pDef ){.
88d0: 20 20 20 20 70 44 65 66 2d 3e 66 6c 61 67 73 20      pDef->flags 
88e0: 3d 20 66 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a 7d  = flagVal;.  }.}
88f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
8900: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 4c 49   the built-in LI
8910: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63  KE and GLOB func
8920: 74 69 6f 6e 73 2e 20 20 54 68 65 20 63 61 73 65  tions.  The case
8930: 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61 72  Sensitive.** par
8940: 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
8950: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
8960: 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   the LIKE operat
8970: 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a 20 73 65  or is case.** se
8980: 6e 73 69 74 69 76 65 2e 20 20 47 4c 4f 42 20 69  nsitive.  GLOB i
8990: 73 20 61 6c 77 61 79 73 20 63 61 73 65 20 73 65  s always case se
89a0: 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64  nsitive..*/.void
89b0: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
89c0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73 71  LikeFunctions(sq
89d0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 63  lite3 *db, int c
89e0: 61 73 65 53 65 6e 73 69 74 69 76 65 29 7b 0a 20  aseSensitive){. 
89f0: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
8a00: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69 66  nfo *pInfo;.  if
8a10: 28 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 20  ( caseSensitive 
8a20: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28  ){.    pInfo = (
8a30: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
8a40: 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  fo*)&likeInfoAlt
8a50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8a60: 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63  Info = (struct c
8a70: 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b  ompareInfo*)&lik
8a80: 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a 20  eInfoNorm;.  }. 
8a90: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
8aa0: 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 32  nc(db, "like", 2
8ab0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70  , SQLITE_UTF8, p
8ac0: 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20  Info, likeFunc, 
8ad0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
8ae0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22  CreateFunc(db, "
8af0: 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54 45  like", 3, SQLITE
8b00: 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69  _UTF8, pInfo, li
8b10: 6b 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  keFunc, 0, 0);. 
8b20: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
8b30: 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32  nc(db, "glob", 2
8b40: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
8b50: 20 20 20 20 20 20 28 73 74 72 75 63 74 20 63 6f        (struct co
8b60: 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62  mpareInfo*)&glob
8b70: 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20  Info, likeFunc, 
8b80: 30 2c 30 29 3b 0a 20 20 73 65 74 4c 69 6b 65 4f  0,0);.  setLikeO
8b90: 70 74 46 6c 61 67 28 64 62 2c 20 22 67 6c 6f 62  ptFlag(db, "glob
8ba0: 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  ", SQLITE_FUNC_L
8bb0: 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e  IKE | SQLITE_FUN
8bc0: 43 5f 43 41 53 45 29 3b 0a 20 20 73 65 74 4c 69  C_CASE);.  setLi
8bd0: 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 6c  keOptFlag(db, "l
8be0: 69 6b 65 22 2c 20 0a 20 20 20 20 20 20 63 61 73  ike", .      cas
8bf0: 65 53 65 6e 73 69 74 69 76 65 20 3f 20 28 53 51  eSensitive ? (SQ
8c00: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c  LITE_FUNC_LIKE |
8c10: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53   SQLITE_FUNC_CAS
8c20: 45 29 20 3a 20 53 51 4c 49 54 45 5f 46 55 4e 43  E) : SQLITE_FUNC
8c30: 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _LIKE);.}../*.**
8c40: 20 70 45 78 70 72 20 70 6f 69 6e 74 73 20 74 6f   pExpr points to
8c50: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77   an expression w
8c60: 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74 73 20  hich implements 
8c70: 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 0a  a function.  If.
8c80: 2a 2a 20 69 74 20 69 73 20 61 70 70 72 6f 70 72  ** it is appropr
8c90: 69 61 74 65 20 74 6f 20 61 70 70 6c 79 20 74 68  iate to apply th
8ca0: 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  e LIKE optimizat
8cb0: 69 6f 6e 20 74 6f 20 74 68 61 74 20 66 75 6e 63  ion to that func
8cc0: 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73 65 74  tion.** then set
8cd0: 20 61 57 63 5b 30 5d 20 74 68 72 6f 75 67 68 20   aWc[0] through 
8ce0: 61 57 63 5b 32 5d 20 74 6f 20 74 68 65 20 77 69  aWc[2] to the wi
8cf0: 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72  ldcard character
8d00: 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  s and.** return 
8d10: 54 52 55 45 2e 20 20 49 66 20 74 68 65 20 66 75  TRUE.  If the fu
8d20: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20  nction is not a 
8d30: 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75 6e 63 74  LIKE-style funct
8d40: 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  ion then.** retu
8d50: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74  rn FALSE..*/.int
8d60: 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75   sqlite3IsLikeFu
8d70: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
8d80: 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  db, Expr *pExpr,
8d90: 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73 65 2c   int *pIsNocase,
8da0: 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20 20 46   char *aWc){.  F
8db0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
8dc0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
8dd0: 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 21 70  K_FUNCTION || !p
8de0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
8df0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8e00: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  .  if( pExpr->pL
8e10: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b  ist->nExpr!=2 ){
8e20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8e30: 20 7d 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69   }.  pDef = sqli
8e40: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
8e50: 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72  db, (char*)pExpr
8e60: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
8e70: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 32 2c 0a 20 20  ->token.n, 2,.  
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
8ea0: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66  E_UTF8, 0);.  if
8eb0: 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 28 70 44  ( pDef==0 || (pD
8ec0: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
8ed0: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d 30  TE_FUNC_LIKE)==0
8ee0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8ef0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
8f00: 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65 6d 65  memcpy() stateme
8f10: 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  nt assumes that 
8f20: 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68 61  the wildcard cha
8f30: 72 61 63 74 65 72 73 20 61 72 65 0a 20 20 2a 2a  racters are.  **
8f40: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
8f50: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
8f60: 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73  he compareInfo s
8f70: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 0a 20  tructure.  The. 
8f80: 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20 74 68   ** asserts() th
8f90: 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66 79  at follow verify
8fa0: 20 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f 6e   that assumption
8fb0: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 61  .  */.  memcpy(a
8fc0: 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65 72 44  Wc, pDef->pUserD
8fd0: 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73 65 72  ata, 3);.  asser
8fe0: 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49  t( (char*)&likeI
8ff0: 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72 2a  nfoAlt == (char*
9000: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61  )&likeInfoAlt.ma
9010: 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73 65  tchAll );.  asse
9020: 72 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c 69  rt( &((char*)&li
9030: 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d 3d  keInfoAlt)[1] ==
9040: 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66   (char*)&likeInf
9050: 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29 3b  oAlt.matchOne );
9060: 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68  .  assert( &((ch
9070: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
9080: 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26  )[2] == (char*)&
9090: 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63  likeInfoAlt.matc
90a0: 68 53 65 74 20 29 3b 0a 20 20 2a 70 49 73 4e 6f  hSet );.  *pIsNo
90b0: 63 61 73 65 20 3d 20 28 70 44 65 66 2d 3e 66 6c  case = (pDef->fl
90c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
90d0: 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20 20 72 65  C_CASE)==0;.  re
90e0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
90f0: 20 41 6c 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20   All all of the 
9100: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
9110: 65 73 20 69 6e 20 74 68 65 20 61 42 75 69 6c 74  es in the aBuilt
9120: 69 6e 46 75 6e 63 5b 5d 20 61 72 72 61 79 20 61  inFunc[] array a
9130: 62 6f 76 65 0a 2a 2a 20 74 6f 20 74 68 65 20 67  bove.** to the g
9140: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 68  lobal function h
9150: 61 73 68 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ash table.  This
9160: 20 6f 63 63 75 72 73 20 61 74 20 73 74 61 72 74   occurs at start
9170: 2d 74 69 6d 65 20 28 61 73 0a 2a 2a 20 61 20 63  -time (as.** a c
9180: 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 63 61  onsequence of ca
9190: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6e  lling sqlite3_in
91a0: 69 74 69 61 6c 69 7a 65 28 29 29 2e 0a 2a 2a 0a  itialize())..**.
91b0: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
91c0: 75 74 69 6e 65 20 72 75 6e 73 0a 2a 2f 0a 76 6f  utine runs.*/.vo
91d0: 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  id sqlite3Regist
91e0: 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e  erGlobalFunction
91f0: 73 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 0a 20 20  s(void){.  /*.  
9200: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
9210: 20 61 72 72 61 79 20 68 6f 6c 64 73 20 46 75 6e   array holds Fun
9220: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 73 20  cDef structures 
9230: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 66  for all of the f
9240: 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 64 65  unctions.  ** de
9250: 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69  fined in this fi
9260: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  le..  **.  ** Th
9270: 65 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62  e array cannot b
9280: 65 20 63 6f 6e 73 74 61 6e 74 20 73 69 6e 63 65  e constant since
9290: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
92a0: 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 75  e to the.  ** Fu
92b0: 6e 63 44 65 66 2e 70 48 61 73 68 20 65 6c 65 6d  ncDef.pHash elem
92c0: 65 6e 74 73 20 61 74 20 73 74 61 72 74 2d 74 69  ents at start-ti
92d0: 6d 65 2e 20 20 54 68 65 20 65 6c 65 6d 65 6e 74  me.  The element
92e0: 73 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 0a  s of this array.
92f0: 20 20 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e    ** are read-on
9300: 6c 79 20 61 66 74 65 72 20 69 6e 69 74 69 61 6c  ly after initial
9310: 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c  ization is compl
9320: 65 74 65 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74  ete..  */.  stat
9330: 69 63 20 53 51 4c 49 54 45 5f 57 53 44 20 46 75  ic SQLITE_WSD Fu
9340: 6e 63 44 65 66 20 61 42 75 69 6c 74 69 6e 46 75  ncDef aBuiltinFu
9350: 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 46 55 4e  nc[] = {.    FUN
9360: 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20  CTION(ltrim,    
9370: 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20            1, 1, 
9380: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
9390: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
93a0: 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20 20 20  ION(ltrim,      
93b0: 20 20 20 20 20 20 20 20 32 2c 20 31 2c 20 30 2c          2, 1, 0,
93c0: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
93d0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
93e0: 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20  N(rtrim,        
93f0: 20 20 20 20 20 20 31 2c 20 32 2c 20 30 2c 20 74        1, 2, 0, t
9400: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
9410: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
9420: 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20  rtrim,          
9430: 20 20 20 20 32 2c 20 32 2c 20 30 2c 20 74 72 69      2, 2, 0, tri
9440: 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c  mFunc         ),
9450: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72  .    FUNCTION(tr
9460: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
9470: 20 20 31 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46    1, 3, 0, trimF
9480: 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20  unc         ),. 
9490: 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72 69 6d     FUNCTION(trim
94a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
94b0: 32 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46 75 6e  2, 3, 0, trimFun
94c0: 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  c         ),.   
94d0: 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20   FUNCTION(min,  
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
94f0: 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e   0, 1, minmaxFun
9500: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
9510: 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20 20 20  UNCTION(min,    
9520: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
9530: 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20  , 1, 0          
9540: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47        ),.    AGG
9550: 52 45 47 41 54 45 28 6d 69 6e 2c 20 20 20 20 20  REGATE(min,     
9560: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
9570: 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20  1, minmaxStep,  
9580: 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69      minMaxFinali
9590: 7a 65 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  ze ),.    FUNCTI
95a0: 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20  ON(max,         
95b0: 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 31 2c 20        -1, 1, 1, 
95c0: 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20  minmaxFunc      
95d0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
95e0: 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20 20  (max,           
95f0: 20 20 20 20 20 30 2c 20 31 2c 20 31 2c 20 30 20       0, 1, 1, 0 
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
9610: 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28  ,.    AGGREGATE(
9620: 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  max,            
9630: 20 20 20 31 2c 20 31 2c 20 31 2c 20 6d 69 6e 6d     1, 1, 1, minm
9640: 61 78 53 74 65 70 2c 20 20 20 20 20 20 6d 69 6e  axStep,      min
9650: 4d 61 78 46 69 6e 61 6c 69 7a 65 20 29 2c 0a 20  MaxFinalize ),. 
9660: 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 79 70 65     FUNCTION(type
9670: 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  of,             
9680: 31 2c 20 30 2c 20 30 2c 20 74 79 70 65 6f 66 46  1, 0, 0, typeofF
9690: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
96a0: 20 46 55 4e 43 54 49 4f 4e 28 6c 65 6e 67 74 68   FUNCTION(length
96b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  ,             1,
96c0: 20 30 2c 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e   0, 0, lengthFun
96d0: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
96e0: 55 4e 43 54 49 4f 4e 28 73 75 62 73 74 72 2c 20  UNCTION(substr, 
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
9700: 2c 20 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20  , 0, substrFunc 
9710: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
9720: 43 54 49 4f 4e 28 73 75 62 73 74 72 2c 20 20 20  CTION(substr,   
9730: 20 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20            3, 0, 
9740: 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20 20 20  0, substrFunc   
9750: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9760: 49 4f 4e 28 61 62 73 2c 20 20 20 20 20 20 20 20  ION(abs,        
9770: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
9780: 20 61 62 73 46 75 6e 63 20 20 20 20 20 20 20 20   absFunc        
9790: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
97a0: 4e 28 72 6f 75 6e 64 2c 20 20 20 20 20 20 20 20  N(round,        
97b0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 72        1, 0, 0, r
97c0: 6f 75 6e 64 46 75 6e 63 20 20 20 20 20 20 20 20  oundFunc        
97d0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
97e0: 72 6f 75 6e 64 2c 20 20 20 20 20 20 20 20 20 20  round,          
97f0: 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 72 6f 75      2, 0, 0, rou
9800: 6e 64 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  ndFunc        ),
9810: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 70  .    FUNCTION(up
9820: 70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  per,            
9830: 20 20 31 2c 20 30 2c 20 30 2c 20 75 70 70 65 72    1, 0, 0, upper
9840: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
9850: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77 65     FUNCTION(lowe
9860: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
9870: 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46 75  1, 0, 0, lowerFu
9880: 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  nc        ),.   
9890: 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73   FUNCTION(coales
98a0: 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c  ce,           1,
98b0: 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20   0, 0, 0        
98c0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
98d0: 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65  UNCTION(coalesce
98e0: 2c 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30  ,          -1, 0
98f0: 2c 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20  , 0, ifnullFunc 
9900: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
9910: 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20  CTION(coalesce, 
9920: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
9930: 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  0, 0            
9940: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9950: 49 4f 4e 28 68 65 78 2c 20 20 20 20 20 20 20 20  ION(hex,        
9960: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
9970: 20 68 65 78 46 75 6e 63 20 20 20 20 20 20 20 20   hexFunc        
9980: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
9990: 4e 28 69 66 6e 75 6c 6c 2c 20 20 20 20 20 20 20  N(ifnull,       
99a0: 20 20 20 20 20 20 32 2c 20 30 2c 20 31 2c 20 69        2, 0, 1, i
99b0: 66 6e 75 6c 6c 46 75 6e 63 20 20 20 20 20 20 20  fnullFunc       
99c0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
99d0: 72 61 6e 64 6f 6d 2c 20 20 20 20 20 20 20 20 20  random,         
99e0: 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 72 61 6e     -1, 0, 0, ran
99f0: 64 6f 6d 46 75 6e 63 20 20 20 20 20 20 20 29 2c  domFunc       ),
9a00: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 61  .    FUNCTION(ra
9a10: 6e 64 6f 6d 62 6c 6f 62 2c 20 20 20 20 20 20 20  ndomblob,       
9a20: 20 20 31 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f    1, 0, 0, rando
9a30: 6d 42 6c 6f 62 20 20 20 20 20 20 20 29 2c 0a 20  mBlob       ),. 
9a40: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c     FUNCTION(null
9a50: 69 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  if,             
9a60: 32 2c 20 30 2c 20 31 2c 20 6e 75 6c 6c 69 66 46  2, 0, 1, nullifF
9a70: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
9a80: 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65   FUNCTION(sqlite
9a90: 5f 76 65 72 73 69 6f 6e 2c 20 20 20 20 20 30 2c  _version,     0,
9aa0: 20 30 2c 20 30 2c 20 76 65 72 73 69 6f 6e 46 75   0, 0, versionFu
9ab0: 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  nc      ),.    F
9ac0: 55 4e 43 54 49 4f 4e 28 71 75 6f 74 65 2c 20 20  UNCTION(quote,  
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
9ae0: 2c 20 30 2c 20 71 75 6f 74 65 46 75 6e 63 20 20  , 0, quoteFunc  
9af0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
9b00: 43 54 49 4f 4e 28 6c 61 73 74 5f 69 6e 73 65 72  CTION(last_inser
9b10: 74 5f 72 6f 77 69 64 2c 20 20 30 2c 20 30 2c 20  t_rowid,  0, 0, 
9b20: 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  0, last_insert_r
9b30: 6f 77 69 64 29 2c 0a 20 20 20 20 46 55 4e 43 54  owid),.    FUNCT
9b40: 49 4f 4e 28 63 68 61 6e 67 65 73 2c 20 20 20 20  ION(changes,    
9b50: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
9b60: 20 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 20   changes        
9b70: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
9b80: 4e 28 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 2c  N(total_changes,
9b90: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 74        0, 0, 0, t
9ba0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20 20 20 20  otal_changes    
9bb0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
9bc0: 72 65 70 6c 61 63 65 2c 20 20 20 20 20 20 20 20  replace,        
9bd0: 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 72 65 70      3, 0, 0, rep
9be0: 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20 29 2c  laceFunc      ),
9bf0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 7a 65  .    FUNCTION(ze
9c00: 72 6f 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 20  roblob,         
9c10: 20 20 31 2c 20 30 2c 20 30 2c 20 7a 65 72 6f 62    1, 0, 0, zerob
9c20: 6c 6f 62 46 75 6e 63 20 20 20 20 20 29 2c 0a 20  lobFunc     ),. 
9c30: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53   #ifdef SQLITE_S
9c40: 4f 55 4e 44 45 58 0a 20 20 20 20 46 55 4e 43 54  OUNDEX.    FUNCT
9c50: 49 4f 4e 28 73 6f 75 6e 64 65 78 2c 20 20 20 20  ION(soundex,    
9c60: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
9c70: 20 73 6f 75 6e 64 65 78 46 75 6e 63 20 20 20 20   soundexFunc    
9c80: 20 20 29 2c 0a 20 20 23 65 6e 64 69 66 0a 20 20    ),.  #endif.  
9c90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9ca0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
9cb0: 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ON.    FUNCTION(
9cc0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20  load_extension, 
9cd0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 61      1, 0, 0, loa
9ce0: 64 45 78 74 20 20 20 20 20 20 20 20 20 20 29 2c  dExt          ),
9cf0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f  .    FUNCTION(lo
9d00: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20  ad_extension,   
9d10: 20 20 32 2c 20 30 2c 20 30 2c 20 6c 6f 61 64 45    2, 0, 0, loadE
9d20: 78 74 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20  xt          ),. 
9d30: 20 23 65 6e 64 69 66 0a 20 20 20 20 41 47 47 52   #endif.    AGGR
9d40: 45 47 41 54 45 28 73 75 6d 2c 20 20 20 20 20 20  EGATE(sum,      
9d50: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
9d60: 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20  , sumStep,      
9d70: 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a 65 20 20     sumFinalize  
9d80: 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41    ),.    AGGREGA
9d90: 54 45 28 74 6f 74 61 6c 2c 20 20 20 20 20 20 20  TE(total,       
9da0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73        1, 0, 0, s
9db0: 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20 20  umStep,         
9dc0: 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 20 20 20  totalFinalize   
9dd0: 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54   ),.    AGGREGAT
9de0: 45 28 61 76 67 2c 20 20 20 20 20 20 20 20 20 20  E(avg,          
9df0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75       1, 0, 0, su
9e00: 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20 20 61  mStep,         a
9e10: 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c  vgFinalize    ),
9e20: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 63  .    AGGREGATE(c
9e30: 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ount,           
9e40: 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74    0, 0, 0, count
9e50: 53 74 65 70 2c 20 20 20 20 20 20 20 63 6f 75 6e  Step,       coun
9e60: 74 46 69 6e 61 6c 69 7a 65 20 20 29 2c 0a 20 20  tFinalize  ),.  
9e70: 20 20 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e    AGGREGATE(coun
9e80: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31  t,             1
9e90: 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65  , 0, 0, countSte
9ea0: 70 2c 20 20 20 20 20 20 20 63 6f 75 6e 74 46 69  p,       countFi
9eb0: 6e 61 6c 69 7a 65 20 20 29 2c 0a 20 20 20 20 41  nalize  ),.    A
9ec0: 47 47 52 45 47 41 54 45 28 67 72 6f 75 70 5f 63  GGREGATE(group_c
9ed0: 6f 6e 63 61 74 2c 20 20 20 20 20 2d 31 2c 20 30  oncat,     -1, 0
9ee0: 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74  , 0, groupConcat
9ef0: 53 74 65 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61  Step, groupConca
9f00: 74 46 69 6e 61 6c 69 7a 65 29 2c 0a 20 20 0a 20  tFinalize),.  . 
9f10: 20 20 20 4c 49 4b 45 46 55 4e 43 28 67 6c 6f 62     LIKEFUNC(glob
9f20: 2c 20 32 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c 20  , 2, &globInfo, 
9f30: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
9f40: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53  |SQLITE_FUNC_CAS
9f50: 45 29 2c 0a 20 20 23 69 66 64 65 66 20 53 51 4c  E),.  #ifdef SQL
9f60: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
9f70: 56 45 5f 4c 49 4b 45 0a 20 20 20 20 4c 49 4b 45  VE_LIKE.    LIKE
9f80: 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c  FUNC(like, 2, &l
9f90: 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49  ikeInfoAlt, SQLI
9fa0: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c  TE_FUNC_LIKE|SQL
9fb0: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a  ITE_FUNC_CASE),.
9fc0: 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b      LIKEFUNC(lik
9fd0: 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 41  e, 3, &likeInfoA
9fe0: 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  lt, SQLITE_FUNC_
9ff0: 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43  LIKE|SQLITE_FUNC
a000: 5f 43 41 53 45 29 2c 0a 20 20 23 65 6c 73 65 0a  _CASE),.  #else.
a010: 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b      LIKEFUNC(lik
a020: 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e  e, 2, &likeInfoN
a030: 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  orm, SQLITE_FUNC
a040: 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c 49 4b 45  _LIKE),.    LIKE
a050: 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c  FUNC(like, 3, &l
a060: 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c  ikeInfoNorm, SQL
a070: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a  ITE_FUNC_LIKE),.
a080: 20 20 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 0a 20    #endif.  };.. 
a090: 20 69 6e 74 20 69 3b 0a 20 20 46 75 6e 63 44 65   int i;.  FuncDe
a0a0: 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26  fHash *pHash = &
a0b0: 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61  GLOBAL(FuncDefHa
a0c0: 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  sh, sqlite3Globa
a0d0: 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 46  lFunctions);.  F
a0e0: 75 6e 63 44 65 66 20 2a 61 46 75 6e 63 20 3d 20  uncDef *aFunc = 
a0f0: 28 46 75 6e 63 44 65 66 2a 29 26 47 4c 4f 42 41  (FuncDef*)&GLOBA
a100: 4c 28 46 75 6e 63 44 65 66 2c 20 61 42 75 69 6c  L(FuncDef, aBuil
a110: 74 69 6e 46 75 6e 63 29 3b 0a 0a 20 20 66 6f 72  tinFunc);..  for
a120: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
a130: 65 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 3b  e(aBuiltinFunc);
a140: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
a150: 65 33 46 75 6e 63 44 65 66 49 6e 73 65 72 74 28  e3FuncDefInsert(
a160: 70 48 61 73 68 2c 20 26 61 46 75 6e 63 5b 69 5d  pHash, &aFunc[i]
a170: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
a180: 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d 65  RegisterDateTime
a190: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 7d 0a     Functions();.}.