/ Hex Artifact Content
Login

Artifact e013c3b6c607c6a1654f5260eab59f5609a5ce4a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 32 20 46 65 62 72 75  /*.** 2002 Febru
0010: 61 72 79 20 32 33 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 23.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
0190: 43 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  C functions that
01a0: 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
01b0: 75 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69  us SQL.** functi
01c0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 20 20  ons of SQLite.  
01d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
01e0: 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72 74 65  only one exporte
01f0: 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  d symbol in this
0200: 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75 6e 63   file - the func
0210: 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65 52 65  tion.** sqliteRe
0220: 67 69 73 74 65 72 42 75 69 6c 64 69 6e 46 75 6e  gisterBuildinFun
0230: 63 74 69 6f 6e 73 28 29 20 66 6f 75 6e 64 20 61  ctions() found a
0240: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
0250: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 41 6c 6c  the file..** All
0260: 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
0270: 66 69 6c 65 20 73 63 6f 70 65 2e 0a 2a 2a 0a 2a  file scope..**.*
0280: 2a 20 24 49 64 3a 20 66 75 6e 63 2e 63 2c 76 20  * $Id: func.c,v 
0290: 31 2e 31 31 35 20 32 30 30 36 2f 30 31 2f 30 39  1.115 2006/01/09
02a0: 20 31 36 3a 31 32 3a 30 35 20 64 61 6e 69 65 6c   16:12:05 daniel
02b0: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
02c0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
02d0: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
02e0: 63 74 79 70 65 2e 68 3e 0a 2f 2a 20 23 69 6e 63  ctype.h>./* #inc
02f0: 6c 75 64 65 20 3c 6d 61 74 68 2e 68 3e 20 2a 2f  lude <math.h> */
0300: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
0310: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  b.h>.#include <a
0320: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0330: 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 23 69  e "vdbeInt.h".#i
0340: 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 0a 2f  nclude "os.h"../
0350: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0360: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
0370: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
0380: 74 68 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  th a function..*
0390: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
03a0: 20 2a 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63   *sqlite3GetFunc
03b0: 43 6f 6c 6c 53 65 71 28 73 71 6c 69 74 65 33 5f  CollSeq(sqlite3_
03c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6e 74  ){.  return cont
03e0: 65 78 74 2d 3e 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  ext->pColl;.}../
03f0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
0400: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 6f 6e 2d 61  ion of the non-a
0410: 67 67 72 65 67 61 74 65 20 6d 69 6e 28 29 20 61  ggregate min() a
0420: 6e 64 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  nd max() functio
0430: 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns.*/.static voi
0440: 64 20 6d 69 6e 6d 61 78 46 75 6e 63 28 0a 20 20  d minmaxFunc(.  
0450: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
0460: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
0470: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
0480: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
0490: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
04a0: 61 73 6b 3b 20 20 20 20 2f 2a 20 30 20 66 6f 72  ask;    /* 0 for
04b0: 20 6d 69 6e 28 29 20 6f 72 20 30 78 66 66 66 66   min() or 0xffff
04c0: 66 66 66 66 20 66 6f 72 20 6d 61 78 28 29 20 2a  ffff for max() *
04d0: 2f 0a 20 20 69 6e 74 20 69 42 65 73 74 3b 0a 20  /.  int iBest;. 
04e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
04f0: 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20  ..  if( argc==0 
0500: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 61 73 6b  ) return;.  mask
0510: 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
0520: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3d 3d 30  data(context)==0
0530: 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 70 43 6f   ? 0 : -1;.  pCo
0540: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46  ll = sqlite3GetF
0550: 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65  uncCollSeq(conte
0560: 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xt);.  assert( p
0570: 43 6f 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Coll );.  assert
0580: 28 20 6d 61 73 6b 3d 3d 2d 31 20 7c 7c 20 6d 61  ( mask==-1 || ma
0590: 73 6b 3d 3d 30 20 29 3b 0a 20 20 69 42 65 73 74  sk==0 );.  iBest
05a0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
05b0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
05c0: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
05d0: 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20  NULL ) return;. 
05e0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
05f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
0600: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
0610: 70 65 28 61 72 67 76 5b 69 5d 29 3d 3d 53 51 4c  pe(argv[i])==SQL
0620: 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72  ITE_NULL ) retur
0630: 6e 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  n;.    if( (sqli
0640: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72  te3MemCompare(ar
0650: 67 76 5b 69 42 65 73 74 5d 2c 20 61 72 67 76 5b  gv[iBest], argv[
0660: 69 5d 2c 20 70 43 6f 6c 6c 29 5e 6d 61 73 6b 29  i], pColl)^mask)
0670: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 42 65  >=0 ){.      iBe
0680: 73 74 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  st = i;.    }.  
0690: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
06a0: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
06b0: 2c 20 61 72 67 76 5b 69 42 65 73 74 5d 29 3b 0a  , argv[iBest]);.
06c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
06d0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20  the type of the 
06e0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
06f0: 74 69 63 20 76 6f 69 64 20 74 79 70 65 6f 66 46  tic void typeofF
0700: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
0710: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
0720: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
0730: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
0740: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
0750: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 77  har *z = 0;.  sw
0760: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
0770: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0780: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
0790: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 20 20 20 7a 20  LITE_NULL:    z 
07a0: 3d 20 22 6e 75 6c 6c 22 3b 20 20 20 20 62 72 65  = "null";    bre
07b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
07c0: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7a 20 3d  ITE_INTEGER: z =
07d0: 20 22 69 6e 74 65 67 65 72 22 3b 20 62 72 65 61   "integer"; brea
07e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
07f0: 54 45 5f 54 45 58 54 3a 20 20 20 20 7a 20 3d 20  TE_TEXT:    z = 
0800: 22 74 65 78 74 22 3b 20 20 20 20 62 72 65 61 6b  "text";    break
0810: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0820: 45 5f 46 4c 4f 41 54 3a 20 20 20 7a 20 3d 20 22  E_FLOAT:   z = "
0830: 72 65 61 6c 22 3b 20 20 20 20 62 72 65 61 6b 3b  real";    break;
0840: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0850: 5f 42 4c 4f 42 3a 20 20 20 20 7a 20 3d 20 22 62  _BLOB:    z = "b
0860: 6c 6f 62 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  lob";    break;.
0870: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
0880: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
0890: 74 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  t, z, -1, SQLITE
08a0: 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a  _STATIC);.}.../*
08b0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
08c0: 6f 6e 20 6f 66 20 74 68 65 20 6c 65 6e 67 74 68  on of the length
08d0: 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73  () function.*/.s
08e0: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 6e 67 74  tatic void lengt
08f0: 68 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  hFunc(.  sqlite3
0900: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
0910: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
0920: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0930: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6c  *argv.){.  int l
0940: 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  en;..  assert( a
0950: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 73 77 69 74  rgc==1 );.  swit
0960: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
0970: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
0980: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
0990: 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73  TE_BLOB:.    cas
09a0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
09b0: 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
09c0: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
09d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
09e0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
09f0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
0a00: 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 20 20  (argv[0]));.    
0a10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0a20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
0a30: 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  EXT: {.      con
0a40: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
0a50: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   *z = sqlite3_va
0a60: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
0a70: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 6e  );.      for(len
0a80: 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 20 69 66  =0; *z; z++){ if
0a90: 28 20 28 30 78 63 30 26 2a 7a 29 21 3d 30 78 38  ( (0xc0&*z)!=0x8
0aa0: 30 20 29 20 6c 65 6e 2b 2b 3b 20 7d 0a 20 20 20  0 ) len++; }.   
0ab0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
0ac0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6c  t_int(context, l
0ad0: 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
0ae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
0af0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
0b00: 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
0b10: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
0b20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0b30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
0b40: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
0b50: 20 61 62 73 28 29 20 66 75 6e 63 74 69 6f 6e 0a   abs() function.
0b60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
0b70: 62 73 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  bsFunc(sqlite3_c
0b80: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
0b90: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
0ba0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
0bb0: 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  {.  assert( argc
0bc0: 3d 3d 31 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ==1 );.  switch(
0bd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
0be0: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a  ype(argv[0]) ){.
0bf0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0c00: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
0c10: 20 69 36 34 20 69 56 61 6c 20 3d 20 73 71 6c 69   i64 iVal = sqli
0c20: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
0c30: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
0c40: 69 66 28 20 69 56 61 6c 3c 30 20 29 20 69 56 61  if( iVal<0 ) iVa
0c50: 6c 20 3d 20 69 56 61 6c 20 2a 20 2d 31 3b 0a 20  l = iVal * -1;. 
0c60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
0c70: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
0c80: 74 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, iVal);.      
0c90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0ca0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
0cb0: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
0cc0: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
0cd0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 62  ontext);.      b
0ce0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
0cf0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
0d00: 20 64 6f 75 62 6c 65 20 72 56 61 6c 20 3d 20 73   double rVal = s
0d10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
0d20: 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
0d30: 20 20 20 20 69 66 28 20 72 56 61 6c 3c 30 20 29      if( rVal<0 )
0d40: 20 72 56 61 6c 20 3d 20 72 56 61 6c 20 2a 20 2d   rVal = rVal * -
0d50: 31 2e 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1.0;.      sqlit
0d60: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
0d70: 28 63 6f 6e 74 65 78 74 2c 20 72 56 61 6c 29 3b  (context, rVal);
0d80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0d90: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
0da0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
0db0: 6f 66 20 74 68 65 20 73 75 62 73 74 72 28 29 20  of the substr() 
0dc0: 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  function.*/.stat
0dd0: 69 63 20 76 6f 69 64 20 73 75 62 73 74 72 46 75  ic void substrFu
0de0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
0df0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
0e00: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
0e10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
0e20: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  gv.){.  const un
0e30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
0e40: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
0e50: 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74   char *z2;.  int
0e60: 20 69 3b 0a 20 20 69 6e 74 20 70 31 2c 20 70 32   i;.  int p1, p2
0e70: 2c 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74  , len;..  assert
0e80: 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 7a  ( argc==3 );.  z
0e90: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
0ea0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
0eb0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
0ec0: 75 72 6e 3b 0a 20 20 70 31 20 3d 20 73 71 6c 69  urn;.  p1 = sqli
0ed0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
0ee0: 67 76 5b 31 5d 29 3b 0a 20 20 70 32 20 3d 20 73  gv[1]);.  p2 = s
0ef0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
0f00: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 66 6f 72  (argv[2]);.  for
0f10: 28 6c 65 6e 3d 30 2c 20 7a 32 3d 7a 3b 20 2a 7a  (len=0, z2=z; *z
0f20: 32 3b 20 7a 32 2b 2b 29 7b 20 69 66 28 20 28 30  2; z2++){ if( (0
0f30: 78 63 30 26 2a 7a 32 29 21 3d 30 78 38 30 20 29  xc0&*z2)!=0x80 )
0f40: 20 6c 65 6e 2b 2b 3b 20 7d 0a 20 20 69 66 28 20   len++; }.  if( 
0f50: 70 31 3c 30 20 29 7b 0a 20 20 20 20 70 31 20 2b  p1<0 ){.    p1 +
0f60: 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28 20 70  = len;.    if( p
0f70: 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20  1<0 ){.      p2 
0f80: 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 70 31 20  += p1;.      p1 
0f90: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
0fa0: 73 65 20 69 66 28 20 70 31 3e 30 20 29 7b 0a 20  se if( p1>0 ){. 
0fb0: 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 0a 20 20 69     p1--;.  }.  i
0fc0: 66 28 20 70 31 2b 70 32 3e 6c 65 6e 20 29 7b 0a  f( p1+p2>len ){.
0fd0: 20 20 20 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b      p2 = len-p1;
0fe0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
0ff0: 69 3c 70 31 20 26 26 20 7a 5b 69 5d 3b 20 69 2b  i<p1 && z[i]; i+
1000: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 5b 69  +){.    if( (z[i
1010: 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  ]&0xc0)==0x80 ) 
1020: 70 31 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  p1++;.  }.  whil
1030: 65 28 20 7a 5b 69 5d 20 26 26 20 28 7a 5b 69 5d  e( z[i] && (z[i]
1040: 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 20  &0xc0)==0x80 ){ 
1050: 69 2b 2b 3b 20 70 31 2b 2b 3b 20 7d 0a 20 20 66  i++; p1++; }.  f
1060: 6f 72 28 3b 20 69 3c 70 31 2b 70 32 20 26 26 20  or(; i<p1+p2 && 
1070: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
1080: 69 66 28 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d  if( (z[i]&0xc0)=
1090: 3d 30 78 38 30 20 29 20 70 32 2b 2b 3b 0a 20 20  =0x80 ) p2++;.  
10a0: 7d 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20  }.  while( z[i] 
10b0: 26 26 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d 3d  && (z[i]&0xc0)==
10c0: 30 78 38 30 20 29 7b 20 69 2b 2b 3b 20 70 32 2b  0x80 ){ i++; p2+
10d0: 2b 3b 20 7d 0a 20 20 69 66 28 20 70 32 3c 30 20  +; }.  if( p2<0 
10e0: 29 20 70 32 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ) p2 = 0;.  sqli
10f0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1100: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
1110: 26 7a 5b 70 31 5d 2c 20 70 32 2c 20 53 51 4c 49  &z[p1], p2, SQLI
1120: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d  TE_TRANSIENT);.}
1130: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1140: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  tation of the ro
1150: 75 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a  und() function.*
1160: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f  /.static void ro
1170: 75 6e 64 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  undFunc(sqlite3_
1180: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1190: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
11a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
11b0: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
11c0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68    double r;.  ch
11d0: 61 72 20 7a 42 75 66 5b 35 30 30 5d 3b 20 20 2f  ar zBuf[500];  /
11e0: 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  * larger than th
11f0: 65 20 25 66 20 72 65 70 72 65 73 65 6e 74 61 74  e %f representat
1200: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ion of the large
1210: 73 74 20 64 6f 75 62 6c 65 20 2a 2f 0a 20 20 61  st double */.  a
1220: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
1230: 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69  | argc==2 );.  i
1240: 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20  f( argc==2 ){.  
1250: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
1260: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
1270: 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 20 29  _type(argv[1]) )
1280: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d   return;.    n =
1290: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
12a0: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  nt(argv[1]);.   
12b0: 20 69 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d 20   if( n>30 ) n = 
12c0: 33 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20  30;.    if( n<0 
12d0: 29 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ) n = 0;.  }.  i
12e0: 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d  f( SQLITE_NULL==
12f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1300: 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 72 65  pe(argv[0]) ) re
1310: 74 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71 6c 69  turn;.  r = sqli
1320: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
1330: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c  (argv[0]);.  sql
1340: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1350: 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c  zeof(zBuf),zBuf,
1360: 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a 20 20 73  "%.*f",n,r);.  s
1370: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
1380: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  xt(context, zBuf
1390: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
13a0: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  NSIENT);.}../*.*
13b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
13c0: 20 6f 66 20 74 68 65 20 75 70 70 65 72 28 29 20   of the upper() 
13d0: 61 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20  and lower() SQL 
13e0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  functions..*/.st
13f0: 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72 46  atic void upperF
1400: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
1410: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
1420: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
1430: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
1440: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1450: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  z;.  int i;.  if
1460: 28 20 61 72 67 63 3c 31 20 7c 7c 20 53 51 4c 49  ( argc<1 || SQLI
1470: 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33  TE_NULL==sqlite3
1480: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
1490: 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  [0]) ) return;. 
14a0: 20 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f   z = sqliteMallo
14b0: 63 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  c(sqlite3_value_
14c0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 2b 31  bytes(argv[0])+1
14d0: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
14e0: 72 65 74 75 72 6e 3b 0a 20 20 73 74 72 63 70 79  return;.  strcpy
14f0: 28 28 63 68 61 72 2a 29 7a 2c 20 28 63 68 61 72  ((char*)z, (char
1500: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1510: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 3b 0a  text(argv[0]));.
1520: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
1530: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 5d 20   i++){.    z[i] 
1540: 3d 20 74 6f 75 70 70 65 72 28 7a 5b 69 5d 29 3b  = toupper(z[i]);
1550: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
1560: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
1570: 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 2d 31  xt, (char*)z, -1
1580: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
1590: 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  NT);.  sqliteFre
15a0: 65 28 7a 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  e(z);.}.static v
15b0: 6f 69 64 20 6c 6f 77 65 72 46 75 6e 63 28 73 71  oid lowerFunc(sq
15c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
15d0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
15e0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
15f0: 2a 2a 61 72 67 76 29 7b 0a 20 20 75 6e 73 69 67  **argv){.  unsig
1600: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ned char *z;.  i
1610: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63  nt i;.  if( argc
1620: 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c  <1 || SQLITE_NUL
1630: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
1640: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29  _type(argv[0]) )
1650: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
1660: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 71 6c 69  qliteMalloc(sqli
1670: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
1680: 61 72 67 76 5b 30 5d 29 2b 31 29 3b 0a 20 20 69  argv[0])+1);.  i
1690: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
16a0: 3b 0a 20 20 73 74 72 63 70 79 28 28 63 68 61 72  ;.  strcpy((char
16b0: 2a 29 7a 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  *)z, (char*)sqli
16c0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
16d0: 72 67 76 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28  rgv[0]));.  for(
16e0: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
16f0: 0a 20 20 20 20 7a 5b 69 5d 20 3d 20 74 6f 6c 6f  .    z[i] = tolo
1700: 77 65 72 28 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 20  wer(z[i]);.  }. 
1710: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1720: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
1730: 68 61 72 2a 29 7a 2c 20 2d 31 2c 20 53 51 4c 49  har*)z, -1, SQLI
1740: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
1750: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
1760: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1770: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
1780: 46 4e 55 4c 4c 28 29 2c 20 4e 56 4c 28 29 2c 20  FNULL(), NVL(), 
1790: 61 6e 64 20 43 4f 41 4c 45 53 43 45 28 29 20 66  and COALESCE() f
17a0: 75 6e 63 74 69 6f 6e 73 2e 20 20 0a 2a 2a 20 41  unctions.  .** A
17b0: 6c 6c 20 74 68 72 65 65 20 64 6f 20 74 68 65 20  ll three do the 
17c0: 73 61 6d 65 20 74 68 69 6e 67 2e 20 20 54 68 65  same thing.  The
17d0: 79 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72  y return the fir
17e0: 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61  st non-NULL.** a
17f0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
1800: 69 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75  ic void ifnullFu
1810: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
1820: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
1830: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
1840: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1850: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  gv.){.  int i;. 
1860: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1870: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1880: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
1890: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
18a0: 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20  argv[i]) ){.    
18b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
18c0: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
18d0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
18e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
18f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1900: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64  entation of rand
1910: 6f 6d 28 29 2e 20 20 52 65 74 75 72 6e 20 61 20  om().  Return a 
1920: 72 61 6e 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20  random integer. 
1930: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
1940: 20 72 61 6e 64 6f 6d 46 75 6e 63 28 0a 20 20 73   randomFunc(.  s
1950: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1960: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
1970: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
1980: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
1990: 20 69 6e 74 20 72 3b 0a 20 20 73 71 6c 69 74 65   int r;.  sqlite
19a0: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
19b0: 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 73 71  of(r), &r);.  sq
19c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
19d0: 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 7d 0a  (context, r);.}.
19e0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
19f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 73  ation of the las
1a00: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
1a10: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
1a20: 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61  The return.** va
1a30: 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  lue is the same 
1a40: 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  as the sqlite3_l
1a50: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
1a60: 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  () API function.
1a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a80: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
1a90: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  d(.  sqlite3_con
1aa0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
1ab0: 20 20 69 6e 74 20 61 72 67 2c 20 0a 20 20 73 71    int arg, .  sq
1ac0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1ad0: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
1ae0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  *db = sqlite3_us
1af0: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
1b00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1b10: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
1b20: 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  , sqlite3_last_i
1b30: 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29 29  nsert_rowid(db))
1b40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1b50: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1b60: 20 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66   changes() SQL f
1b70: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65  unction.  The re
1b80: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1b90: 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 65  e.** same as the
1ba0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
1bb0: 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  () API function.
1bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bd0: 63 68 61 6e 67 65 73 28 0a 20 20 73 71 6c 69 74  changes(.  sqlit
1be0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1bf0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 2c 0a  ext,.  int arg,.
1c00: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1c10: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1c20: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
1c30: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
1c40: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ext);.  sqlite3_
1c50: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
1c60: 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  xt, sqlite3_chan
1c70: 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ges(db));.}../*.
1c80: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1c90: 6e 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 5f 63  n of the total_c
1ca0: 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e  hanges() SQL fun
1cb0: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75  ction.  The retu
1cc0: 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 74  rn value is.** t
1cd0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
1ce0: 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
1cf0: 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e 63 74  nges() API funct
1d00: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1d10: 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  oid total_change
1d20: 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  s(.  sqlite3_con
1d30: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
1d40: 20 69 6e 74 20 61 72 67 2c 0a 20 20 73 71 6c 69   int arg,.  sqli
1d50: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1d60: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1d70: 62 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  b = sqlite3_user
1d80: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
1d90: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1da0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
1db0: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
1dc0: 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ges(db));.}../*.
1dd0: 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 64  ** A structure d
1de0: 65 66 69 6e 69 6e 67 20 68 6f 77 20 74 6f 20 64  efining how to d
1df0: 6f 20 47 4c 4f 42 2d 73 74 79 6c 65 20 63 6f 6d  o GLOB-style com
1e00: 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f 0a 73 74 72  parisons..*/.str
1e10: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
1e20: 7b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c 3b  {.  u8 matchAll;
1e30: 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e 65 3b 0a  .  u8 matchOne;.
1e40: 20 20 75 38 20 6d 61 74 63 68 53 65 74 3b 0a 20    u8 matchSet;. 
1e50: 20 75 38 20 6e 6f 43 61 73 65 3b 0a 7d 3b 0a 0a   u8 noCase;.};..
1e60: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1e70: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
1e80: 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20 27 2a 27  globInfo = { '*'
1e90: 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30 20 7d 3b  , '?', '[', 0 };
1ea0: 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20  ./* The correct 
1eb0: 53 51 4c 2d 39 32 20 62 65 68 61 76 69 6f 72 20  SQL-92 behavior 
1ec0: 69 73 20 66 6f 72 20 74 68 65 20 4c 49 4b 45 20  is for the LIKE 
1ed0: 6f 70 65 72 61 74 6f 72 20 74 6f 20 69 67 6e 6f  operator to igno
1ee0: 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20 54 68 75  re.** case.  Thu
1ef0: 73 20 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  s  'a' LIKE 'A' 
1f00: 77 6f 75 6c 64 20 62 65 20 74 72 75 65 2e 20 2a  would be true. *
1f10: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
1f20: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
1f30: 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 20 3d  o likeInfoNorm =
1f40: 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20 30   { '%', '_',   0
1f50: 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20 53 51 4c  , 1 };./* If SQL
1f60: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
1f70: 56 45 5f 4c 49 4b 45 20 69 73 20 64 65 66 69 6e  VE_LIKE is defin
1f80: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 4c 49 4b  ed, then the LIK
1f90: 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  E operator.** is
1fa0: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 20   case sensitive 
1fb0: 63 61 75 73 69 6e 67 20 27 61 27 20 4c 49 4b 45  causing 'a' LIKE
1fc0: 20 27 41 27 20 74 6f 20 62 65 20 66 61 6c 73 65   'A' to be false
1fd0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
1fe0: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
1ff0: 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41 6c 74 20  nfo likeInfoAlt 
2000: 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20  = { '%', '_',   
2010: 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 58  0, 0 };../*.** X
2020: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2030: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
2040: 6f 66 20 61 20 55 54 46 2d 38 20 63 68 61 72 61  of a UTF-8 chara
2050: 63 74 65 72 2e 20 20 49 6e 63 72 65 6d 65 6e 74  cter.  Increment
2060: 0a 2a 2a 20 58 20 73 6f 20 74 68 61 74 20 69 74  .** X so that it
2070: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
2080: 65 78 74 20 63 68 61 72 61 63 74 65 72 2e 20 20  ext character.  
2090: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
20a0: 72 69 67 68 74 0a 2a 2a 20 69 66 20 58 20 70 6f  right.** if X po
20b0: 69 6e 74 73 20 74 6f 20 61 20 77 65 6c 6c 2d 66  ints to a well-f
20c0: 6f 72 6d 65 64 20 55 54 46 2d 38 20 73 74 72 69  ormed UTF-8 stri
20d0: 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73  ng..*/.#define s
20e0: 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 58 29  qliteNextChar(X)
20f0: 20 20 77 68 69 6c 65 28 20 28 30 78 63 30 26 2a    while( (0xc0&*
2100: 2b 2b 28 58 29 29 3d 3d 30 78 38 30 20 29 7b 7d  ++(X))==0x80 ){}
2110: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 43  .#define sqliteC
2120: 68 61 72 56 61 6c 28 58 29 20 20 20 73 71 6c 69  harVal(X)   sqli
2130: 74 65 33 52 65 61 64 55 74 66 38 28 58 29 0a 0a  te3ReadUtf8(X)..
2140: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
2150: 77 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73  wo UTF-8 strings
2160: 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 77 68   for equality wh
2170: 65 72 65 20 74 68 65 20 66 69 72 73 74 20 73 74  ere the first st
2180: 72 69 6e 67 20 63 61 6e 0a 2a 2a 20 70 6f 74 65  ring can.** pote
2190: 6e 74 69 61 6c 6c 79 20 62 65 20 61 20 22 67 6c  ntially be a "gl
21a0: 6f 62 22 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ob" expression. 
21b0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 31 29   Return true (1)
21c0: 20 69 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20   if they.** are 
21d0: 74 68 65 20 73 61 6d 65 20 61 6e 64 20 66 61 6c  the same and fal
21e0: 73 65 20 28 30 29 20 69 66 20 74 68 65 79 20 61  se (0) if they a
21f0: 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a 2a  re different..**
2200: 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c  .** Globbing rul
2210: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  es:.**.**      '
2220: 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  *'       Matches
2230: 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
2240: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
2250: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
2260: 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d       '?'       M
2270: 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f  atches exactly o
2280: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ne character..**
2290: 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20  .**     [...]   
22a0: 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
22b0: 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
22c0: 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20  e enclosed list 
22d0: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
22e0: 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e       characters.
22f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e  .**.**     [^...
2300: 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e  ]     Matches on
2310: 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20  e character not 
2320: 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  in the enclosed 
2330: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  list..**.** With
2340: 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e 64 20 5b   the [...] and [
2350: 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e 67 2c 20  ^...] matching, 
2360: 61 20 27 5d 27 20 63 68 61 72 61 63 74 65 72 20  a ']' character 
2370: 63 61 6e 20 62 65 20 69 6e 63 6c 75 64 65 64 0a  can be included.
2380: 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 20 62  ** in the list b
2390: 79 20 6d 61 6b 69 6e 67 20 69 74 20 74 68 65 20  y making it the 
23a0: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
23b0: 61 66 74 65 72 20 27 5b 27 20 6f 72 20 27 5e 27  after '[' or '^'
23c0: 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65 20 6f 66  .  A.** range of
23d0: 20 63 68 61 72 61 63 74 65 72 73 20 63 61 6e 20   characters can 
23e0: 62 65 20 73 70 65 63 69 66 69 65 64 20 75 73 69  be specified usi
23f0: 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d 70 6c 65  ng '-'.  Example
2400: 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20 6d 61 74  :.** "[a-z]" mat
2410: 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65 20  ches any single 
2420: 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65 74 74 65  lower-case lette
2430: 72 2e 20 20 54 6f 20 6d 61 74 63 68 20 61 20 27  r.  To match a '
2440: 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74  -', make.** it t
2450: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
2460: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  r in the list..*
2470: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2480: 65 20 69 73 20 75 73 75 61 6c 6c 79 20 71 75 69  e is usually qui
2490: 63 6b 2c 20 62 75 74 20 63 61 6e 20 62 65 20 4e  ck, but can be N
24a0: 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f 72 73 74  **2 in the worst
24b0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 69 6e   case..**.** Hin
24c0: 74 73 3a 20 74 6f 20 6d 61 74 63 68 20 27 2a 27  ts: to match '*'
24d0: 20 6f 72 20 27 3f 27 2c 20 70 75 74 20 74 68 65   or '?', put the
24e0: 6d 20 69 6e 20 22 5b 5d 22 2e 20 20 4c 69 6b 65  m in "[]".  Like
24f0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2500: 20 20 20 20 20 61 62 63 5b 2a 5d 78 79 7a 20 20       abc[*]xyz  
2510: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 22 61        Matches "a
2520: 62 63 2a 78 79 7a 22 20 6f 6e 6c 79 0a 2a 2f 0a  bc*xyz" only.*/.
2530: 73 74 61 74 69 63 20 69 6e 74 20 70 61 74 74 65  static int patte
2540: 72 6e 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e  rnCompare(.  con
2550: 73 74 20 75 38 20 2a 7a 50 61 74 74 65 72 6e 2c  st u8 *zPattern,
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2570: 20 54 68 65 20 67 6c 6f 62 20 70 61 74 74 65 72   The glob patter
2580: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
2590: 2a 7a 53 74 72 69 6e 67 2c 20 20 20 20 20 20 20  *zString,       
25a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
25b0: 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65  tring to compare
25c0: 20 61 67 61 69 6e 73 74 20 74 68 65 20 67 6c 6f   against the glo
25d0: 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 74 72  b */.  const str
25e0: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
25f0: 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49 6e 66 6f 72  *pInfo, /* Infor
2600: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 68 6f 77  mation about how
2610: 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61   to do the compa
2620: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  re */.  const in
2630: 74 20 65 73 63 20 20 20 20 20 20 20 20 20 20 20  t esc           
2640: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2650: 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72  escape character
2660: 20 2a 2f 0a 29 7b 0a 20 20 72 65 67 69 73 74 65   */.){.  registe
2670: 72 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69  r int c;.  int i
2680: 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65  nvert;.  int see
2690: 6e 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 20 20 75  n;.  int c2;.  u
26a0: 38 20 6d 61 74 63 68 4f 6e 65 20 3d 20 70 49 6e  8 matchOne = pIn
26b0: 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65 3b 0a 20 20  fo->matchOne;.  
26c0: 75 38 20 6d 61 74 63 68 41 6c 6c 20 3d 20 70 49  u8 matchAll = pI
26d0: 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c 6c 3b 0a 20  nfo->matchAll;. 
26e0: 20 75 38 20 6d 61 74 63 68 53 65 74 20 3d 20 70   u8 matchSet = p
26f0: 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3b 0a  Info->matchSet;.
2700: 20 20 75 38 20 6e 6f 43 61 73 65 20 3d 20 70 49    u8 noCase = pI
2710: 6e 66 6f 2d 3e 6e 6f 43 61 73 65 3b 20 0a 20 20  nfo->noCase; .  
2720: 69 6e 74 20 70 72 65 76 45 73 63 61 70 65 20 3d  int prevEscape =
2730: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
2740: 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  if the previous 
2750: 63 68 61 72 61 63 74 65 72 20 77 61 73 20 27 65  character was 'e
2760: 73 63 61 70 65 27 20 2a 2f 0a 0a 20 20 77 68 69  scape' */..  whi
2770: 6c 65 28 20 28 63 20 3d 20 2a 7a 50 61 74 74 65  le( (c = *zPatte
2780: 72 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  rn)!=0 ){.    if
2790: 28 20 21 70 72 65 76 45 73 63 61 70 65 20 26 26  ( !prevEscape &&
27a0: 20 63 3d 3d 6d 61 74 63 68 41 6c 6c 20 29 7b 0a   c==matchAll ){.
27b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
27c0: 7a 50 61 74 74 65 72 6e 5b 31 5d 29 20 3d 3d 20  zPattern[1]) == 
27d0: 6d 61 74 63 68 41 6c 6c 20 7c 7c 20 63 20 3d 3d  matchAll || c ==
27e0: 20 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20   matchOne ){.   
27f0: 20 20 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63       if( c==matc
2800: 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hOne ){.        
2810: 20 20 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d    if( *zString==
2820: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2830: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65          sqliteNe
2840: 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b  xtChar(zString);
2850: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2860: 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20     zPattern++;. 
2870: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2880: 20 63 20 26 26 20 65 73 63 20 26 26 20 73 71 6c   c && esc && sql
2890: 69 74 65 33 52 65 61 64 55 74 66 38 28 26 7a 50  ite3ReadUtf8(&zP
28a0: 61 74 74 65 72 6e 5b 31 5d 29 3d 3d 65 73 63 20  attern[1])==esc 
28b0: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 63 6f  ){.        u8 co
28c0: 6e 73 74 20 2a 7a 54 65 6d 70 20 3d 20 26 7a 50  nst *zTemp = &zP
28d0: 61 74 74 65 72 6e 5b 31 5d 3b 0a 20 20 20 20 20  attern[1];.     
28e0: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
28f0: 72 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  r(zTemp);.      
2900: 20 20 63 20 3d 20 2a 7a 54 65 6d 70 3b 0a 20 20    c = *zTemp;.  
2910: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2920: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
2930: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 6d 61  .      if( c==ma
2940: 74 63 68 53 65 74 20 29 7b 0a 20 20 20 20 20 20  tchSet ){.      
2950: 20 20 61 73 73 65 72 74 28 20 65 73 63 3d 3d 30    assert( esc==0
2960: 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73   );   /* This is
2970: 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20   GLOB, not LIKE 
2980: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
2990: 28 20 2a 7a 53 74 72 69 6e 67 20 26 26 20 70 61  ( *zString && pa
29a0: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 26 7a 50  tternCompare(&zP
29b0: 61 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e  attern[1],zStrin
29c0: 67 2c 70 49 6e 66 6f 2c 65 73 63 29 3d 3d 30 20  g,pInfo,esc)==0 
29d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
29e0: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
29f0: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ing);.        }.
2a00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2a          return *
2a10: 7a 53 74 72 69 6e 67 21 3d 30 3b 0a 20 20 20 20  zString!=0;.    
2a20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a30: 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 2a 7a   while( (c2 = *z
2a40: 53 74 72 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20  String)!=0 ){.  
2a50: 20 20 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61          if( noCa
2a60: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
2a70: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 70    c2 = sqlite3Up
2a80: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 32 5d 3b 0a  perToLower[c2];.
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
2aa0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
2ab0: 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 20 20  wer[c];.        
2ac0: 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d      while( c2 !=
2ad0: 20 30 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b   0 && c2 != c ){
2ae0: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 70 70   c2 = sqlite3Upp
2af0: 65 72 54 6f 4c 6f 77 65 72 5b 2a 2b 2b 7a 53 74  erToLower[*++zSt
2b00: 72 69 6e 67 5d 3b 20 7d 0a 20 20 20 20 20 20 20  ring]; }.       
2b10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b20: 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20        while( c2 
2b30: 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63 20  != 0 && c2 != c 
2b40: 29 7b 20 63 32 20 3d 20 2a 2b 2b 7a 53 74 72 69  ){ c2 = *++zStri
2b50: 6e 67 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  ng; }.          
2b60: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2b70: 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  c2==0 ) return 0
2b80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b90: 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 26  patternCompare(&
2ba0: 7a 50 61 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72  zPattern[1],zStr
2bb0: 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29 20 29  ing,pInfo,esc) )
2bc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2bd0: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
2be0: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
2bf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2c10: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
2c20: 21 70 72 65 76 45 73 63 61 70 65 20 26 26 20 63  !prevEscape && c
2c30: 3d 3d 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20  ==matchOne ){.  
2c40: 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69 6e 67      if( *zString
2c50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2c60: 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74        sqliteNext
2c70: 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20  Char(zString);. 
2c80: 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b       zPattern++;
2c90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
2ca0: 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a 20 20  ==matchSet ){.  
2cb0: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20      int prior_c 
2cc0: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
2cd0: 74 28 20 65 73 63 3d 3d 30 20 29 3b 20 20 20 20  t( esc==0 );    
2ce0: 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63  /* This only occ
2cf0: 75 72 73 20 66 6f 72 20 47 4c 4f 42 2c 20 6e 6f  urs for GLOB, no
2d00: 74 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20 20 20  t LIKE */.      
2d10: 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  seen = 0;.      
2d20: 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20  invert = 0;.    
2d30: 20 20 63 20 3d 20 73 71 6c 69 74 65 43 68 61 72    c = sqliteChar
2d40: 56 61 6c 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  Val(zString);.  
2d50: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
2d60: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63  eturn 0;.      c
2d70: 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b  2 = *++zPattern;
2d80: 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
2d90: 5e 27 20 29 7b 20 69 6e 76 65 72 74 20 3d 20 31  ^' ){ invert = 1
2da0: 3b 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65  ; c2 = *++zPatte
2db0: 72 6e 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  rn; }.      if( 
2dc0: 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2==']' ){.     
2dd0: 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20     if( c==']' ) 
2de0: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
2df0: 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65    c2 = *++zPatte
2e00: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
2e10: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73    while( (c2 = s
2e20: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61  qliteCharVal(zPa
2e30: 74 74 65 72 6e 29 29 21 3d 30 20 26 26 20 63 32  ttern))!=0 && c2
2e40: 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
2e50: 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20   if( c2=='-' && 
2e60: 7a 50 61 74 74 65 72 6e 5b 31 5d 21 3d 27 5d 27  zPattern[1]!=']'
2e70: 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21   && zPattern[1]!
2e80: 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20  =0 && prior_c>0 
2e90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 50 61  ){.          zPa
2ea0: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ttern++;.       
2eb0: 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 43 68     c2 = sqliteCh
2ec0: 61 72 56 61 6c 28 7a 50 61 74 74 65 72 6e 29 3b  arVal(zPattern);
2ed0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
2ee0: 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d  >=prior_c && c<=
2ef0: 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  c2 ) seen = 1;. 
2f00: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
2f10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
2f20: 6c 73 65 20 69 66 28 20 63 3d 3d 63 32 20 29 7b  lse if( c==c2 ){
2f30: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20  .          seen 
2f40: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
2f50: 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20  rior_c = c2;.   
2f60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f70: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
2f80: 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
2f90: 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74        sqliteNext
2fa0: 43 68 61 72 28 7a 50 61 74 74 65 72 6e 29 3b 0a  Char(zPattern);.
2fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2fc0: 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e  ( c2==0 || (seen
2fd0: 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20   ^ invert)==0 ) 
2fe0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2ff0: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
3000: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 7a  String);.      z
3010: 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 7d  Pattern++;.    }
3020: 65 6c 73 65 20 69 66 28 20 65 73 63 20 26 26 20  else if( esc && 
3030: 21 70 72 65 76 45 73 63 61 70 65 20 26 26 20 73  !prevEscape && s
3040: 71 6c 69 74 65 33 52 65 61 64 55 74 66 38 28 7a  qlite3ReadUtf8(z
3050: 50 61 74 74 65 72 6e 29 3d 3d 65 73 63 29 7b 0a  Pattern)==esc){.
3060: 20 20 20 20 20 20 70 72 65 76 45 73 63 61 70 65        prevEscape
3070: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
3080: 74 65 4e 65 78 74 43 68 61 72 28 7a 50 61 74 74  teNextChar(zPatt
3090: 65 72 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ern);.    }else{
30a0: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
30b0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
30c0: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
30d0: 6f 77 65 72 5b 63 5d 20 21 3d 20 73 71 6c 69 74  ower[c] != sqlit
30e0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
30f0: 7a 53 74 72 69 6e 67 5d 20 29 20 72 65 74 75 72  zString] ) retur
3100: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
3110: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  {.        if( c 
3120: 21 3d 20 2a 7a 53 74 72 69 6e 67 20 29 20 72 65  != *zString ) re
3130: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3140: 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b        zPattern++
3150: 3b 0a 20 20 20 20 20 20 7a 53 74 72 69 6e 67 2b  ;.      zString+
3160: 2b 3b 0a 20 20 20 20 20 20 70 72 65 76 45 73 63  +;.      prevEsc
3170: 61 70 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ape = 0;.    }. 
3180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74   }.  return *zSt
3190: 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ring==0;.}../*.*
31a0: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
31b0: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
31c0: 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   the LIKE operat
31d0: 6f 72 20 28 6f 72 20 47 4c 4f 42 20 77 68 69 63  or (or GLOB whic
31e0: 68 20 69 73 0a 2a 2a 20 6a 75 73 74 20 61 20 76  h is.** just a v
31f0: 61 72 69 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45  ariation of LIKE
3200: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 2e 20 20  ) gets called.  
3210: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
3220: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79   testing.** only
3230: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3240: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3250: 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d  te3_like_count =
3260: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
3270: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3280: 6e 20 6f 66 20 74 68 65 20 6c 69 6b 65 28 29 20  n of the like() 
3290: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  SQL function.  T
32a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  his function imp
32b0: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62  lements.** the b
32c0: 75 69 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65  uild-in LIKE ope
32d0: 72 61 74 6f 72 2e 20 20 54 68 65 20 66 69 72 73  rator.  The firs
32e0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
32f0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  e function is th
3300: 65 0a 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e 64  e.** pattern and
3310: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
3320: 6d 65 6e 74 20 69 73 20 74 68 65 20 73 74 72 69  ment is the stri
3330: 6e 67 2e 20 20 53 6f 2c 20 74 68 65 20 53 51 4c  ng.  So, the SQL
3340: 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a   statements:.**.
3350: 2a 2a 20 20 20 20 20 20 20 41 20 4c 49 4b 45 20  **       A LIKE 
3360: 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65  B.**.** is imple
3370: 6d 65 6e 74 65 64 20 61 73 20 6c 69 6b 65 28 42  mented as like(B
3380: 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ,A)..**.** This 
3390: 73 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20 28 77  same function (w
33a0: 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
33b0: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75  compareInfo stru
33c0: 63 74 75 72 65 29 20 63 6f 6d 70 75 74 65 73 0a  cture) computes.
33d0: 2a 2a 20 74 68 65 20 47 4c 4f 42 20 6f 70 65 72  ** the GLOB oper
33e0: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
33f0: 76 6f 69 64 20 6c 69 6b 65 46 75 6e 63 28 0a 20  void likeFunc(. 
3400: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3410: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
3420: 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74  t argc, .  sqlit
3430: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
3440: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
3450: 6e 65 64 20 63 68 61 72 20 2a 7a 41 20 3d 20 73  ned char *zA = s
3460: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
3470: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f  t(argv[0]);.  co
3480: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3490: 72 20 2a 7a 42 20 3d 20 73 71 6c 69 74 65 33 5f  r *zB = sqlite3_
34a0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
34b0: 31 5d 29 3b 0a 20 20 69 6e 74 20 65 73 63 61 70  1]);.  int escap
34c0: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67  e = 0;.  if( arg
34d0: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54  c==3 ){.    /* T
34e0: 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63  he escape charac
34f0: 74 65 72 20 73 74 72 69 6e 67 20 6d 75 73 74 20  ter string must 
3500: 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69 6e  consist of a sin
3510: 67 6c 65 20 55 54 46 2d 38 20 63 68 61 72 61 63  gle UTF-8 charac
3520: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65  ter..    ** Othe
3530: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
3540: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
3550: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
3560: 64 20 63 68 61 72 20 2a 7a 45 73 63 20 3d 20 73  d char *zEsc = s
3570: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
3580: 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20  t(argv[2]);.    
3590: 69 66 28 20 73 71 6c 69 74 65 33 75 74 66 38 43  if( sqlite3utf8C
35a0: 68 61 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45  harLen((char*)zE
35b0: 73 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20  sc, -1)!=1 ){.  
35c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
35d0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
35e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 45 53  , .          "ES
35f0: 43 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20  CAPE expression 
3600: 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65  must be a single
3610: 20 63 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29   character", -1)
3620: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
3630: 20 20 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65      }.    escape
3640: 20 3d 20 73 71 6c 69 74 65 33 52 65 61 64 55 74   = sqlite3ReadUt
3650: 66 38 28 7a 45 73 63 29 3b 0a 20 20 7d 0a 20 20  f8(zEsc);.  }.  
3660: 69 66 28 20 7a 41 20 26 26 20 7a 42 20 29 7b 0a  if( zA && zB ){.
3670: 20 20 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61      struct compa
3680: 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  reInfo *pInfo = 
3690: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
36a0: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 23 69 66 64  a(context);.#ifd
36b0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
36c0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f     sqlite3_like_
36d0: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
36e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
36f0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
3700: 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a  patternCompare(z
3710: 41 2c 20 7a 42 2c 20 70 49 6e 66 6f 2c 20 65 73  A, zB, pInfo, es
3720: 63 61 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  cape));.  }.}../
3730: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
3740: 69 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49  ion of the NULLI
3750: 46 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e  F(x,y) function.
3760: 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
3770: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
3780: 75 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72 67  ument if the arg
3790: 75 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66 65  uments are diffe
37a0: 72 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rent.  The resul
37b0: 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  t is NULL if the
37c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72  .** arguments ar
37d0: 65 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20  e equal to each 
37e0: 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  other..*/.static
37f0: 20 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63   void nullifFunc
3800: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3810: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
3820: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
3830: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
3840: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
3850: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
3860: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e  tFuncCollSeq(con
3870: 74 65 78 74 29 3b 0a 20 20 69 66 28 20 73 71 6c  text);.  if( sql
3880: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61  ite3MemCompare(a
3890: 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c  rgv[0], argv[1],
38a0: 20 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20   pColl)!=0 ){.  
38b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
38c0: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
38d0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a  argv[0]);.  }.}.
38e0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
38f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 56 45 52  ation of the VER
3900: 53 49 4f 4e 28 2a 29 20 66 75 6e 63 74 69 6f 6e  SION(*) function
3910: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
3920: 20 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20   the version.** 
3930: 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  of the SQLite li
3940: 62 72 61 72 79 20 74 68 61 74 20 69 73 20 72 75  brary that is ru
3950: 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  nning..*/.static
3960: 20 76 6f 69 64 20 76 65 72 73 69 6f 6e 46 75 6e   void versionFun
3970: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
3980: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
3990: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
39a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
39b0: 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  v.){.  sqlite3_r
39c0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
39d0: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 65 72 73  xt, sqlite3_vers
39e0: 69 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ion, -1, SQLITE_
39f0: 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  STATIC);.}.../*.
3a00: 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20  ** EXPERIMENTAL 
3a10: 2d 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 6e  - This is not an
3a20: 20 6f 66 66 69 63 69 61 6c 20 66 75 6e 63 74 69   official functi
3a30: 6f 6e 2e 20 20 54 68 65 20 69 6e 74 65 72 66 61  on.  The interfa
3a40: 63 65 20 6d 61 79 0a 2a 2a 20 63 68 61 6e 67 65  ce may.** change
3a50: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
3a60: 20 6d 61 79 20 64 69 73 61 70 70 65 61 72 2e 20   may disappear. 
3a70: 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 63 6f   Do not write co
3a80: 64 65 20 74 68 61 74 20 64 65 70 65 6e 64 73 0a  de that depends.
3a90: 2a 2a 20 6f 6e 20 74 68 69 73 20 66 75 6e 63 74  ** on this funct
3aa0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  ion..**.** Imple
3ab0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
3ac0: 20 51 55 4f 54 45 28 29 20 66 75 6e 63 74 69 6f   QUOTE() functio
3ad0: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
3ae0: 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  n takes a single
3af0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  .** argument.  I
3b00: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
3b10: 73 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 20 72  s numeric, the r
3b20: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
3b30: 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68  he same as.** th
3b40: 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20  e argument.  If 
3b50: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
3b60: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 74 75 72 6e  NULL, the return
3b70: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 74   value is the st
3b80: 72 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20  ring.** "NULL". 
3b90: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
3ba0: 61 72 67 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c  argument is encl
3bb0: 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 71  osed in single q
3bc0: 75 6f 74 65 73 20 77 69 74 68 0a 2a 2a 20 73 69  uotes with.** si
3bd0: 6e 67 6c 65 2d 71 75 6f 74 65 20 65 73 63 61 70  ngle-quote escap
3be0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
3bf0: 69 64 20 71 75 6f 74 65 46 75 6e 63 28 73 71 6c  id quoteFunc(sql
3c00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3c10: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
3c20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3c30: 2a 61 72 67 76 29 7b 0a 20 20 69 66 28 20 61 72  *argv){.  if( ar
3c40: 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
3c50: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
3c60: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
3c70: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65  [0]) ){.    case
3c80: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a   SQLITE_NULL: {.
3c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3ca0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
3cb0: 74 2c 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51  t, "NULL", 4, SQ
3cc0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
3cd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3ce0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3cf0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
3d00: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
3d10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3d20: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
3d30: 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b  ntext, argv[0]);
3d40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3d50: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3d60: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
3d70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
3d80: 68 61 72 20 68 65 78 64 69 67 69 74 73 5b 5d 20  har hexdigits[] 
3d90: 3d 20 7b 20 0a 20 20 20 20 20 20 20 20 27 30 27  = { .        '0'
3da0: 2c 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27 2c  , '1', '2', '3',
3db0: 20 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c 20   '4', '5', '6', 
3dc0: 27 37 27 2c 0a 20 20 20 20 20 20 20 20 27 38 27  '7',.        '8'
3dd0: 2c 20 27 39 27 2c 20 27 41 27 2c 20 27 42 27 2c  , '9', 'A', 'B',
3de0: 20 27 43 27 2c 20 27 44 27 2c 20 27 45 27 2c 20   'C', 'D', 'E', 
3df0: 27 46 27 20 0a 20 20 20 20 20 20 7d 3b 0a 20 20  'F' .      };.  
3e00: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20      char *zText 
3e10: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
3e20: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
3e30: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
3e40: 30 5d 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  0]);.      char 
3e50: 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73  const *zBlob = s
3e60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
3e70: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 20  b(argv[0]);..   
3e80: 20 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61 72     zText = (char
3e90: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
3ea0: 28 32 2a 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20  (2*nBlob)+4); . 
3eb0: 20 20 20 20 20 69 66 28 20 21 7a 54 65 78 74 20       if( !zText 
3ec0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3ed0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
3ee0: 63 6f 6e 74 65 78 74 2c 20 22 6f 75 74 20 6f 66  context, "out of
3ef0: 20 6d 65 6d 6f 72 79 22 2c 20 2d 31 29 3b 0a 20   memory", -1);. 
3f00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3f10: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
3f20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42     for(i=0; i<nB
3f30: 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lob; i++){.     
3f40: 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29       zText[(i*2)
3f50: 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b  +2] = hexdigits[
3f60: 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30 78  (zBlob[i]>>4)&0x
3f70: 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  0F];.          z
3f80: 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d 20  Text[(i*2)+3] = 
3f90: 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62  hexdigits[(zBlob
3fa0: 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20 20  [i])&0x0F];.    
3fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54      }.        zT
3fc0: 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32 5d  ext[(nBlob*2)+2]
3fd0: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
3fe0: 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29   zText[(nBlob*2)
3ff0: 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +3] = '\0';.    
4000: 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20 27      zText[0] = '
4010: 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78  X';.        zTex
4020: 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20  t[1] = '\'';.   
4030: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
4040: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
4050: 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51 4c  , zText, -1, SQL
4060: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
4070: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
4080: 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 20  ee(zText);.     
4090: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
40a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
40b0: 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
40c0: 20 20 20 20 69 6e 74 20 69 2c 6a 2c 6e 3b 0a 20      int i,j,n;. 
40d0: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
40e0: 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  ned char *zArg =
40f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
4100: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
4110: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20      char *z;..  
4120: 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a      for(i=n=0; z
4130: 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66  Arg[i]; i++){ if
4140: 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20  ( zArg[i]=='\'' 
4150: 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a  ) n++; }.      z
4160: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
4170: 20 69 2b 6e 2b 33 20 29 3b 0a 20 20 20 20 20 20   i+n+3 );.      
4180: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
4190: 6e 3b 0a 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20  n;.      z[0] = 
41a0: 27 5c 27 27 3b 0a 20 20 20 20 20 20 66 6f 72 28  '\'';.      for(
41b0: 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69  i=0, j=1; zArg[i
41c0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
41d0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69   z[j++] = zArg[i
41e0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
41f0: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a  Arg[i]=='\'' ){.
4200: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
4210: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
4220: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
4230: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[j++] = '\'';.
4240: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
4250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4260: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
4270: 74 2c 20 7a 2c 20 6a 2c 20 53 51 4c 49 54 45 5f  t, z, j, SQLITE_
4280: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
4290: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
42a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
42b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e  fdef SQLITE_SOUN
42c0: 44 45 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  DEX./*.** Comput
42d0: 65 20 74 68 65 20 73 6f 75 6e 64 65 78 20 65 6e  e the soundex en
42e0: 63 6f 64 69 6e 67 20 6f 66 20 61 20 77 6f 72 64  coding of a word
42f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4300: 20 73 6f 75 6e 64 65 78 46 75 6e 63 28 73 71 6c   soundexFunc(sql
4310: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
4320: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
4330: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4340: 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 7a  *argv){.  char z
4350: 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20 63 6f 6e  Result[8];.  con
4360: 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20 20 69 6e  st u8 *zIn;.  in
4370: 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74 69 63  t i, j;.  static
4380: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4390: 63 68 61 72 20 69 43 6f 64 65 5b 5d 20 3d 20 7b  char iCode[] = {
43a0: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
43b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
43c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
43d0: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30  , 0,.    0, 0, 0
43e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
43f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4400: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
4410: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
4420: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4430: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
4440: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4450: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
4460: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4470: 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c  .    0, 0, 1, 2,
4480: 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20   3, 0, 1, 2, 0, 
4490: 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35  0, 2, 2, 4, 5, 5
44a0: 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36  , 0,.    1, 2, 6
44b0: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c  , 2, 3, 0, 1, 0,
44c0: 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20   2, 0, 2, 0, 0, 
44d0: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
44e0: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31  0, 1, 2, 3, 0, 1
44f0: 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c  , 2, 0, 0, 2, 2,
4500: 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20   4, 5, 5, 0,.   
4510: 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20   1, 2, 6, 2, 3, 
4520: 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32  0, 1, 0, 2, 0, 2
4530: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4540: 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20  .  };.  assert( 
4550: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a 49 6e  argc==1 );.  zIn
4560: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 5f   = (u8*)sqlite3_
4570: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
4580: 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
4590: 7a 49 6e 5b 69 5d 20 26 26 20 21 69 73 61 6c 70  zIn[i] && !isalp
45a0: 68 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29  ha(zIn[i]); i++)
45b0: 7b 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20  {}.  if( zIn[i] 
45c0: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 30  ){.    zResult[0
45d0: 5d 20 3d 20 74 6f 75 70 70 65 72 28 7a 49 6e 5b  ] = toupper(zIn[
45e0: 69 5d 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  i]);.    for(j=1
45f0: 3b 20 6a 3c 34 20 26 26 20 7a 49 6e 5b 69 5d 3b  ; j<4 && zIn[i];
4600: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
4610: 20 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49   code = iCode[zI
4620: 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20  n[i]&0x7f];.    
4630: 20 20 69 66 28 20 63 6f 64 65 3e 30 20 29 7b 0a    if( code>0 ){.
4640: 20 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b          zResult[
4650: 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30  j++] = code + '0
4660: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
4670: 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 34 20  .    while( j<4 
4680: 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74  ){.      zResult
4690: 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20  [j++] = '0';.   
46a0: 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a   }.    zResult[j
46b0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
46c0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
46d0: 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c 74 2c  ontext, zResult,
46e0: 20 34 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   4, SQLITE_TRANS
46f0: 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
4700: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4710: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
4720: 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51 4c 49   "?000", 4, SQLI
4730: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  TE_STATIC);.  }.
4740: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
4750: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
4760: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4770: 20 67 65 6e 65 72 61 74 65 73 20 61 20 73 74 72   generates a str
4780: 69 6e 67 20 6f 66 20 72 61 6e 64 6f 6d 20 63 68  ing of random ch
4790: 61 72 61 63 74 65 72 73 2e 20 20 55 73 65 64 20  aracters.  Used 
47a0: 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e  for.** generatin
47b0: 67 20 74 65 73 74 20 64 61 74 61 2e 0a 2a 2f 0a  g test data..*/.
47c0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64  static void rand
47d0: 53 74 72 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  Str(sqlite3_cont
47e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
47f0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
4800: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
4810: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
4820: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 53 72 63  signed char zSrc
4830: 5b 5d 20 3d 20 0a 20 20 20 20 20 22 61 62 63 64  [] = .     "abcd
4840: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
4850: 75 76 77 78 79 7a 22 0a 20 20 20 20 20 22 41 42  uvwxyz".     "AB
4860: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
4870: 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 20 22  STUVWXYZ".     "
4880: 30 31 32 33 34 35 36 37 38 39 22 0a 20 20 20 20  0123456789".    
4890: 20 22 2e 2d 21 2c 3a 2a 5e 2b 3d 5f 7c 3f 2f 3c   ".-!,:*^+=_|?/<
48a0: 3e 20 22 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 2c  > ";.  int iMin,
48b0: 20 69 4d 61 78 2c 20 6e 2c 20 72 2c 20 69 3b 0a   iMax, n, r, i;.
48c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
48d0: 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66  zBuf[1000];.  if
48e0: 28 20 61 72 67 63 3e 3d 31 20 29 7b 0a 20 20 20  ( argc>=1 ){.   
48f0: 20 69 4d 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f   iMin = sqlite3_
4900: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
4910: 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4d 69 6e  ]);.    if( iMin
4920: 3c 30 20 29 20 69 4d 69 6e 20 3d 20 30 3b 0a 20  <0 ) iMin = 0;. 
4930: 20 20 20 69 66 28 20 69 4d 69 6e 3e 3d 73 69 7a     if( iMin>=siz
4940: 65 6f 66 28 7a 42 75 66 29 20 29 20 69 4d 69 6e  eof(zBuf) ) iMin
4950: 20 3d 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d   = sizeof(zBuf)-
4960: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
4970: 69 4d 69 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  iMin = 1;.  }.  
4980: 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20  if( argc>=2 ){. 
4990: 20 20 20 69 4d 61 78 20 3d 20 73 71 6c 69 74 65     iMax = sqlite
49a0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
49b0: 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4d  [1]);.    if( iM
49c0: 61 78 3c 69 4d 69 6e 20 29 20 69 4d 61 78 20 3d  ax<iMin ) iMax =
49d0: 20 69 4d 69 6e 3b 0a 20 20 20 20 69 66 28 20 69   iMin;.    if( i
49e0: 4d 61 78 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66  Max>=sizeof(zBuf
49f0: 29 20 29 20 69 4d 61 78 20 3d 20 73 69 7a 65 6f  ) ) iMax = sizeo
4a00: 66 28 7a 42 75 66 29 2d 31 3b 0a 20 20 7d 65 6c  f(zBuf)-1;.  }el
4a10: 73 65 7b 0a 20 20 20 20 69 4d 61 78 20 3d 20 35  se{.    iMax = 5
4a20: 30 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 69 4d 69  0;.  }.  n = iMi
4a30: 6e 3b 0a 20 20 69 66 28 20 69 4d 61 78 3e 69 4d  n;.  if( iMax>iM
4a40: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
4a50: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
4a60: 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20  of(r), &r);.    
4a70: 72 20 26 3d 20 30 78 37 66 66 66 66 66 66 66 3b  r &= 0x7fffffff;
4a80: 0a 20 20 20 20 6e 20 2b 3d 20 72 25 28 69 4d 61  .    n += r%(iMa
4a90: 78 20 2b 20 31 20 2d 20 69 4d 69 6e 29 3b 0a 20  x + 1 - iMin);. 
4aa0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 73   }.  assert( n<s
4ab0: 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 3b 0a 20  izeof(zBuf) );. 
4ac0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
4ad0: 73 73 28 6e 2c 20 7a 42 75 66 29 3b 0a 20 20 66  ss(n, zBuf);.  f
4ae0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
4af0: 29 7b 0a 20 20 20 20 7a 42 75 66 5b 69 5d 20 3d  ){.    zBuf[i] =
4b00: 20 7a 53 72 63 5b 7a 42 75 66 5b 69 5d 25 28 73   zSrc[zBuf[i]%(s
4b10: 69 7a 65 6f 66 28 7a 53 72 63 29 2d 31 29 5d 3b  izeof(zSrc)-1)];
4b20: 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6e 5d 20 3d  .  }.  zBuf[n] =
4b30: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
4b40: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
4b50: 74 2c 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20  t, (char*)zBuf, 
4b60: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
4b70: 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ENT);.}.#endif /
4b80: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
4b90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4ba0: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  TEST./*.** The f
4bb0: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 53 51 4c  ollowing two SQL
4bc0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75   functions are u
4bd0: 73 65 64 20 74 6f 20 74 65 73 74 20 72 65 74 75  sed to test retu
4be0: 72 6e 69 6e 67 20 61 20 74 65 78 74 0a 2a 2a 20  rning a text.** 
4bf0: 72 65 73 75 6c 74 20 77 69 74 68 20 61 20 64 65  result with a de
4c00: 73 74 72 75 63 74 6f 72 2e 20 46 75 6e 63 74 69  structor. Functi
4c10: 6f 6e 20 27 74 65 73 74 5f 64 65 73 74 72 75 63  on 'test_destruc
4c20: 74 6f 72 27 20 74 61 6b 65 73 20 6f 6e 65 20 61  tor' takes one a
4c30: 72 67 75 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20 72  rgument.** and r
4c40: 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20  eturns the same 
4c50: 61 72 67 75 6d 65 6e 74 20 69 6e 74 65 72 70 72  argument interpr
4c60: 65 74 65 64 20 61 73 20 54 45 58 54 2e 20 41 20  eted as TEXT. A 
4c70: 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
4c80: 20 70 61 73 73 65 64 20 77 69 74 68 20 74 68 65   passed with the
4c90: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4ca0: 74 65 78 74 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  text() call..**.
4cb0: 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ** SQL function 
4cc0: 27 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72  'test_destructor
4cd0: 5f 63 6f 75 6e 74 27 20 72 65 74 75 72 6e 73 20  _count' returns 
4ce0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
4cf0: 74 73 74 61 6e 64 69 6e 67 20 0a 2a 2a 20 61 6c  tstanding .** al
4d00: 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62  locations made b
4d10: 79 20 27 74 65 73 74 5f 64 65 73 74 72 75 63 74  y 'test_destruct
4d20: 6f 72 27 3b 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  or';.**.** WARNI
4d30: 4e 47 3a 20 4e 6f 74 20 74 68 72 65 61 64 73 61  NG: Not threadsa
4d40: 66 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  fe..*/.static in
4d50: 74 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f  t test_destructo
4d60: 72 5f 63 6f 75 6e 74 5f 76 61 72 20 3d 20 30 3b  r_count_var = 0;
4d70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
4d80: 74 72 75 63 74 6f 72 28 76 6f 69 64 20 2a 70 29  tructor(void *p)
4d90: 7b 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d  {.  char *zVal =
4da0: 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 61 73   (char *)p;.  as
4db0: 73 65 72 74 28 7a 56 61 6c 29 3b 0a 20 20 7a 56  sert(zVal);.  zV
4dc0: 61 6c 2d 2d 3b 0a 20 20 73 71 6c 69 74 65 46 72  al--;.  sqliteFr
4dd0: 65 65 28 7a 56 61 6c 29 3b 0a 20 20 74 65 73 74  ee(zVal);.  test
4de0: 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e  _destructor_coun
4df0: 74 5f 76 61 72 2d 2d 3b 0a 7d 0a 73 74 61 74 69  t_var--;.}.stati
4e00: 63 20 76 6f 69 64 20 74 65 73 74 5f 64 65 73 74  c void test_dest
4e10: 72 75 63 74 6f 72 28 0a 20 20 73 71 6c 69 74 65  ructor(.  sqlite
4e20: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
4e30: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
4e40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4e50: 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 2a  argv.){.  char *
4e60: 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  zVal;.  int len;
4e70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4e80: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
4e90: 74 61 28 70 43 74 78 29 3b 0a 20 0a 20 20 74 65  ta(pCtx);. .  te
4ea0: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
4eb0: 75 6e 74 5f 76 61 72 2b 2b 3b 0a 20 20 61 73 73  unt_var++;.  ass
4ec0: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
4ed0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
4ee0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
4ef0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
4f00: 20 72 65 74 75 72 6e 3b 0a 20 20 6c 65 6e 20 3d   return;.  len =
4f10: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74   sqlite3ValueByt
4f20: 65 73 28 61 72 67 76 5b 30 5d 2c 20 45 4e 43 28  es(argv[0], ENC(
4f30: 64 62 29 29 3b 20 0a 20 20 7a 56 61 6c 20 3d 20  db)); .  zVal = 
4f40: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
4f50: 2b 33 29 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e 5d  +3);.  zVal[len]
4f60: 20 3d 20 30 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e   = 0;.  zVal[len
4f70: 2d 31 5d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  -1] = 0;.  asser
4f80: 74 28 20 7a 56 61 6c 20 29 3b 0a 20 20 7a 56 61  t( zVal );.  zVa
4f90: 6c 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 56  l++;.  memcpy(zV
4fa0: 61 6c 2c 20 73 71 6c 69 74 65 33 56 61 6c 75 65  al, sqlite3Value
4fb0: 54 65 78 74 28 61 72 67 76 5b 30 5d 2c 20 45 4e  Text(argv[0], EN
4fc0: 43 28 64 62 29 29 2c 20 6c 65 6e 29 3b 0a 20 20  C(db)), len);.  
4fd0: 69 66 28 20 45 4e 43 28 64 62 29 3d 3d 53 51 4c  if( ENC(db)==SQL
4fe0: 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
4ff0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5000: 65 78 74 28 70 43 74 78 2c 20 7a 56 61 6c 2c 20  ext(pCtx, zVal, 
5010: 2d 31 2c 20 64 65 73 74 72 75 63 74 6f 72 29 3b  -1, destructor);
5020: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5030: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c  OMIT_UTF16.  }el
5040: 73 65 20 69 66 28 20 45 4e 43 28 64 62 29 3d 3d  se if( ENC(db)==
5050: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29  SQLITE_UTF16LE )
5060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
5070: 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43  sult_text16le(pC
5080: 74 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20 64 65  tx, zVal, -1, de
5090: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 7d 65 6c  structor);.  }el
50a0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
50b0: 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28  result_text16be(
50c0: 70 43 74 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20  pCtx, zVal, -1, 
50d0: 64 65 73 74 72 75 63 74 6f 72 29 3b 0a 23 65 6e  destructor);.#en
50e0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
50f0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 7d 0a  IT_UTF16 */.  }.
5100: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  }.static void te
5110: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
5120: 75 6e 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unt(.  sqlite3_c
5130: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
5140: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
5150: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5160: 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  v.){.  sqlite3_r
5170: 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20  esult_int(pCtx, 
5180: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  test_destructor_
5190: 63 6f 75 6e 74 5f 76 61 72 29 3b 0a 7d 0a 23 65  count_var);.}.#e
51a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
51b0: 45 53 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  EST */..#ifdef S
51c0: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
51d0: 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 65   Routines for te
51e0: 73 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  sting the sqlite
51f0: 33 5f 67 65 74 5f 61 75 78 64 61 74 61 28 29 20  3_get_auxdata() 
5200: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f  and sqlite3_set_
5210: 61 75 78 64 61 74 61 28 29 0a 2a 2a 20 69 6e 74  auxdata().** int
5220: 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erface..**.** Th
5230: 65 20 74 65 73 74 5f 61 75 78 64 61 74 61 28 29  e test_auxdata()
5240: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 74   SQL function at
5250: 74 65 6d 70 74 73 20 74 6f 20 72 65 67 69 73 74  tempts to regist
5260: 65 72 20 65 61 63 68 20 6f 66 20 69 74 73 20 61  er each of its a
5270: 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 61 73 20 61  rguments.** as a
5280: 75 78 69 6c 69 61 72 79 20 64 61 74 61 2e 20 20  uxiliary data.  
5290: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
52a0: 70 72 69 6f 72 20 72 65 67 69 73 74 72 61 74 69  prior registrati
52b0: 6f 6e 73 20 6f 66 20 61 75 78 20 64 61 74 61 20  ons of aux data 
52c0: 66 6f 72 0a 2a 2a 20 74 68 61 74 20 61 72 67 75  for.** that argu
52d0: 6d 65 6e 74 20 28 6d 65 61 6e 69 6e 67 20 74 68  ment (meaning th
52e0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  e argument is no
52f0: 74 20 61 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20  t a constant or 
5300: 74 68 69 73 20 69 73 20 69 74 73 20 66 69 72 73  this is its firs
5310: 74 0a 2a 2a 20 63 61 6c 6c 29 20 74 68 65 6e 20  t.** call) then 
5320: 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 74  the result for t
5330: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
5340: 30 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  0.  If there is 
5350: 61 20 70 72 69 6f 72 0a 2a 2a 20 72 65 67 69 73  a prior.** regis
5360: 74 72 61 74 69 6f 6e 2c 20 74 68 65 20 72 65 73  tration, the res
5370: 75 6c 74 20 66 6f 72 20 74 68 61 74 20 61 72 67  ult for that arg
5380: 75 6d 65 6e 74 20 69 73 20 31 2e 20 20 54 68 65  ument is 1.  The
5390: 20 6f 76 65 72 61 6c 6c 20 72 65 73 75 6c 74 0a   overall result.
53a0: 2a 2a 20 69 73 20 74 68 65 20 69 6e 64 69 76 69  ** is the indivi
53b0: 64 75 61 6c 20 61 72 67 75 6d 65 6e 74 20 72 65  dual argument re
53c0: 73 75 6c 74 73 20 73 65 70 61 72 61 74 65 64 20  sults separated 
53d0: 62 79 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  by spaces..*/.st
53e0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 5f 74  atic void free_t
53f0: 65 73 74 5f 61 75 78 64 61 74 61 28 76 6f 69 64  est_auxdata(void
5400: 20 2a 70 29 20 7b 73 71 6c 69 74 65 46 72 65 65   *p) {sqliteFree
5410: 28 70 29 3b 7d 0a 73 74 61 74 69 63 20 76 6f 69  (p);}.static voi
5420: 64 20 74 65 73 74 5f 61 75 78 64 61 74 61 28 0a  d test_auxdata(.
5430: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5440: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
5450: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
5460: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
5470: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
5480: 2a 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 4d 61  *zRet = sqliteMa
5490: 6c 6c 6f 63 28 6e 41 72 67 2a 32 29 3b 0a 20 20  lloc(nArg*2);.  
54a0: 69 66 28 20 21 7a 52 65 74 20 29 20 72 65 74 75  if( !zRet ) retu
54b0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
54c0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
54d0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 20 3d   char const *z =
54e0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
54f0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5500: 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29  i]);.    if( z )
5510: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41  {.      char *zA
5520: 75 78 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  ux = sqlite3_get
5530: 5f 61 75 78 64 61 74 61 28 70 43 74 78 2c 20 69  _auxdata(pCtx, i
5540: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  );.      if( zAu
5550: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  x ){.        zRe
5560: 74 5b 69 2a 32 5d 20 3d 20 27 31 27 3b 0a 20 20  t[i*2] = '1';.  
5570: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
5580: 28 7a 41 75 78 2c 20 7a 29 20 29 7b 0a 20 20 20  (zAux, z) ){.   
5590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
55a0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
55b0: 2c 20 22 41 75 78 69 6c 61 72 79 20 64 61 74 61  , "Auxilary data
55c0: 20 63 6f 72 72 75 70 74 69 6f 6e 22 2c 20 2d 31   corruption", -1
55d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
55e0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
55f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5600: 20 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20 3d 20      zRet[i*2] = 
5610: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 7a 41 75  '0';.        zAu
5620: 78 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  x = sqliteStrDup
5630: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (z);.        sql
5640: 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61  ite3_set_auxdata
5650: 28 70 43 74 78 2c 20 69 2c 20 7a 41 75 78 2c 20  (pCtx, i, zAux, 
5660: 66 72 65 65 5f 74 65 73 74 5f 61 75 78 64 61 74  free_test_auxdat
5670: 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
5680: 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d 20 3d 20    zRet[i*2+1] = 
5690: 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ' ';.    }.  }. 
56a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
56b0: 74 65 78 74 28 70 43 74 78 2c 20 7a 52 65 74 2c  text(pCtx, zRet,
56c0: 20 32 2a 6e 41 72 67 2d 31 2c 20 66 72 65 65 5f   2*nArg-1, free_
56d0: 74 65 73 74 5f 61 75 78 64 61 74 61 29 3b 0a 7d  test_auxdata);.}
56e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
56f0: 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66 64 65  E_TEST */..#ifde
5700: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
5710: 0a 2a 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20 74  .** A function t
5720: 6f 20 74 65 73 74 20 65 72 72 6f 72 20 72 65 70  o test error rep
5730: 6f 72 74 69 6e 67 20 66 72 6f 6d 20 75 73 65 72  orting from user
5740: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 54 68 69 73   functions. This
5750: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74   function.** ret
5760: 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 69  urns a copy of i
5770: 74 27 73 20 66 69 72 73 74 20 61 72 67 75 6d 65  t's first argume
5780: 6e 74 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 0a  nt as an error..
5790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
57a0: 65 73 74 5f 65 72 72 6f 72 28 0a 20 20 73 71 6c  est_error(.  sql
57b0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
57c0: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
57d0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
57e0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
57f0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5800: 72 28 70 43 74 78 2c 20 28 63 68 61 72 2a 29 73  r(pCtx, (char*)s
5810: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5820: 74 28 61 72 67 76 5b 30 5d 29 2c 20 30 29 3b 0a  t(argv[0]), 0);.
5830: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5840: 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a  TE_TEST */../*.*
5850: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
5860: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
5870: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74  tructure holds t
5880: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a  he context of a.
5890: 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28  ** sum() or avg(
58a0: 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70  ) aggregate comp
58b0: 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  utation..*/.type
58c0: 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43 74  def struct SumCt
58d0: 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74  x SumCtx;.struct
58e0: 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62   SumCtx {.  doub
58f0: 6c 65 20 73 75 6d 3b 20 20 20 20 20 2f 2a 20 53  le sum;     /* S
5900: 75 6d 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20  um of terms */. 
5910: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
5920: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
5930: 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f  ements summed */
5940: 0a 20 20 75 38 20 73 65 65 6e 46 6c 6f 61 74 3b  .  u8 seenFloat;
5950: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5960: 65 72 65 20 68 61 73 20 62 65 65 6e 20 61 6e 79  ere has been any
5970: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
5980: 76 61 6c 75 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  value */.};../*.
5990: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64  ** Routines used
59a0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
59b0: 73 75 6d 20 6f 72 20 61 76 65 72 61 67 65 2e 0a  sum or average..
59c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
59d0: 75 6d 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63  umStep(sqlite3_c
59e0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
59f0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5a00: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
5a10: 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20  {.  SumCtx *p;. 
5a20: 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 61 73 73   int type;.  ass
5a30: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a  ert( argc==1 );.
5a40: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
5a50: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
5a60: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
5a70: 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 73  *p));.  type = s
5a80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
5a90: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  e(argv[0]);.  if
5aa0: 28 20 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c  ( p && type!=SQL
5ab0: 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
5ac0: 70 2d 3e 73 75 6d 20 2b 3d 20 73 71 6c 69 74 65  p->sum += sqlite
5ad0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
5ae0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 70 2d 3e  rgv[0]);.    p->
5af0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74  cnt++;.    if( t
5b00: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
5b10: 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65  T ){.      p->se
5b20: 65 6e 46 6c 6f 61 74 20 3d 20 31 3b 0a 20 20 20  enFloat = 1;.   
5b30: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5b40: 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65  void sumFinalize
5b50: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5b60: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
5b70: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
5b80: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
5b90: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
5ba0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
5bb0: 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20   p->cnt>0 ){.   
5bc0: 20 69 66 28 20 70 2d 3e 73 65 65 6e 46 6c 6f 61   if( p->seenFloa
5bd0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
5be0: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
5bf0: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 73 75 6d  (context, p->sum
5c00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5c10: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5c20: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
5c30: 2c 20 28 69 36 34 29 70 2d 3e 73 75 6d 29 3b 0a  , (i64)p->sum);.
5c40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
5c50: 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e 61 6c  ic void avgFinal
5c60: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
5c70: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
5c80: 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20   SumCtx *p;.  p 
5c90: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
5ca0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
5cb0: 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ext, 0);.  if( p
5cc0: 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a   && p->cnt>0 ){.
5cd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5ce0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
5cf0: 74 2c 20 70 2d 3e 73 75 6d 2f 28 64 6f 75 62 6c  t, p->sum/(doubl
5d00: 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d 0a 7d  e)p->cnt);.  }.}
5d10: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
5d20: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
5d30: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 68  wing structure h
5d40: 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74 65 78 74  olds the context
5d50: 20 6f 66 20 61 0a 2a 2a 20 76 61 72 69 61 6e 63   of a.** varianc
5d60: 65 20 6f 72 20 73 74 61 6e 64 61 72 64 20 64 65  e or standard de
5d70: 76 69 61 74 69 6f 6e 20 63 6f 6d 70 75 74 61 74  viation computat
5d80: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
5d90: 73 74 72 75 63 74 20 53 74 64 44 65 76 43 74 78  struct StdDevCtx
5da0: 20 53 74 64 44 65 76 43 74 78 3b 0a 73 74 72 75   StdDevCtx;.stru
5db0: 63 74 20 53 74 64 44 65 76 43 74 78 20 7b 0a 20  ct StdDevCtx {. 
5dc0: 20 64 6f 75 62 6c 65 20 73 75 6d 3b 20 20 20 20   double sum;    
5dd0: 20 2f 2a 20 53 75 6d 20 6f 66 20 74 65 72 6d 73   /* Sum of terms
5de0: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 73 75 6d   */.  double sum
5df0: 32 3b 20 20 20 20 2f 2a 20 53 75 6d 20 6f 66 20  2;    /* Sum of 
5e00: 74 68 65 20 73 71 75 61 72 65 73 20 6f 66 20 74  the squares of t
5e10: 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  erms */.  int cn
5e20: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  t;        /* Num
5e30: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 63 6f 75  ber of terms cou
5e40: 6e 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nted */.};../*.*
5e50: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5e60: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
5e70: 74 72 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69  track of state i
5e80: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
5e90: 68 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67  he.** count() ag
5ea0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
5eb0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
5ec0: 75 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75  uct CountCtx Cou
5ed0: 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f  ntCtx;.struct Co
5ee0: 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e  untCtx {.  int n
5ef0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ;.};../*.** Rout
5f00: 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ines to implemen
5f10: 74 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67  t the count() ag
5f20: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
5f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5f40: 20 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74   countStep(sqlit
5f50: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5f60: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
5f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5f80: 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78  rgv){.  CountCtx
5f90: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
5fa0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
5fb0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
5fc0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
5fd0: 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c   (argc==0 || SQL
5fe0: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
5ff0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
6000: 76 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20  v[0])) && p ){. 
6010: 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d     p->n++;.  }.}
6020: 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20     .static void 
6030: 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  countFinalize(sq
6040: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6050: 6f 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74  ontext){.  Count
6060: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
6070: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
6080: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
6090: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72   0);.  sqlite3_r
60a0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
60b0: 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29  t, p ? p->n : 0)
60c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ;.}../*.** Routi
60d0: 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  nes to implement
60e0: 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29   min() and max()
60f0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
6100: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
6110: 76 6f 69 64 20 6d 69 6e 6d 61 78 53 74 65 70 28  void minmaxStep(
6120: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6130: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
6140: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
6150: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 65 6d  e **argv){.  Mem
6160: 20 2a 70 41 72 67 20 20 3d 20 28 4d 65 6d 20 2a   *pArg  = (Mem *
6170: 29 61 72 67 76 5b 30 5d 3b 0a 20 20 4d 65 6d 20  )argv[0];.  Mem 
6180: 2a 70 42 65 73 74 3b 0a 0a 20 20 69 66 28 20 73  *pBest;..  if( s
6190: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
61a0: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
61b0: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
61c0: 3b 0a 20 20 70 42 65 73 74 20 3d 20 28 4d 65 6d  ;.  pBest = (Mem
61d0: 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65   *)sqlite3_aggre
61e0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
61f0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42  text, sizeof(*pB
6200: 65 73 74 29 29 3b 0a 20 20 69 66 28 20 21 70 42  est));.  if( !pB
6210: 65 73 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  est ) return;.. 
6220: 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67   if( pBest->flag
6230: 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78  s ){.    int max
6240: 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20  ;.    int cmp;. 
6250: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
6260: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75  l = sqlite3GetFu
6270: 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78  ncCollSeq(contex
6280: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  t);.    /* This 
6290: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73  step function is
62a0: 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
62b0: 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  he min() and max
62c0: 28 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20  () aggregates,. 
62d0: 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64     ** the only d
62e0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
62f0: 6e 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20  n the two being 
6300: 74 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f  that the sense o
6310: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  f the.    ** com
6320: 70 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72  parison is inver
6330: 74 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78  ted. For the max
6340: 28 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  () aggregate, th
6350: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
6360: 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e  _user_data() fun
6370: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76  ction returns (v
6380: 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69  oid *)-1. For mi
6390: 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65  n() it.    ** re
63a0: 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62  turns (void *)db
63b0: 2c 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68  , where db is th
63c0: 65 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62  e sqlite3* datab
63d0: 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20  ase pointer..   
63e0: 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68   ** Therefore th
63f0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
6400: 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27   sets variable '
6410: 6d 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68  max' to 1 for th
6420: 65 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61  e max().    ** a
6430: 67 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66  ggregate, or 0 f
6440: 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  or min()..    */
6450: 0a 20 20 20 20 6d 61 78 20 3d 20 28 28 73 71 6c  .    max = ((sql
6460: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
6470: 6f 6e 74 65 78 74 29 3d 3d 28 76 6f 69 64 20 2a  ontext)==(void *
6480: 29 2d 31 29 3f 31 3a 30 29 3b 0a 20 20 20 20 63  )-1)?1:0);.    c
6490: 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  mp = sqlite3MemC
64a0: 6f 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70 41  ompare(pBest, pA
64b0: 72 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  rg, pColl);.    
64c0: 69 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c  if( (max && cmp<
64d0: 30 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63  0) || (!max && c
64e0: 6d 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73  mp>0) ){.      s
64f0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
6500: 79 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a  y(pBest, pArg);.
6510: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6520: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
6530: 6d 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72  mCopy(pBest, pAr
6540: 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  g);.  }.}.static
6550: 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e 61   void minMaxFina
6560: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
6570: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
6580: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6590: 2a 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d 20  *pRes;.  pRes = 
65a0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  (sqlite3_value *
65b0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
65c0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
65d0: 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 52  xt, 0);.  if( pR
65e0: 65 73 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52  es ){.    if( pR
65f0: 65 73 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  es->flags ){.   
6600: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6610: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
6620: 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20   pRes);.    }.  
6630: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
6640: 52 65 6c 65 61 73 65 28 70 52 65 73 29 3b 0a 20  Release(pRes);. 
6650: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
6660: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73  s function regis
6670: 74 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  tered all of the
6680: 20 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f   above C functio
6690: 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e  ns as SQL.** fun
66a0: 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68  ctions.  This sh
66b0: 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79  ould be the only
66c0: 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73   routine in this
66d0: 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78   file with.** ex
66e0: 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a  ternal linkage..
66f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
6700: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
6710: 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20  nctions(sqlite3 
6720: 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
6730: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
6740: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
6750: 20 20 20 20 20 73 69 67 6e 65 64 20 63 68 61 72       signed char
6760: 20 6e 41 72 67 3b 0a 20 20 20 20 20 75 38 20 61   nArg;.     u8 a
6770: 72 67 54 79 70 65 3b 20 20 20 20 20 20 20 20 20  rgType;         
6780: 20 20 2f 2a 20 30 3a 20 6e 6f 6e 65 2e 20 20 31    /* 0: none.  1
6790: 3a 20 64 62 20 20 32 3a 20 28 2d 31 29 20 2a 2f  : db  2: (-1) */
67a0: 0a 20 20 20 20 20 75 38 20 65 54 65 78 74 52 65  .     u8 eTextRe
67b0: 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31  p;          /* 1
67c0: 3a 20 55 54 46 2d 31 36 2e 20 20 30 3a 20 55 54  : UTF-16.  0: UT
67d0: 46 2d 38 20 2a 2f 0a 20 20 20 20 20 75 38 20 6e  F-8 */.     u8 n
67e0: 65 65 64 43 6f 6c 6c 53 65 71 3b 0a 20 20 20 20  eedCollSeq;.    
67f0: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
6800: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
6810: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
6820: 65 20 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63  e **);.  } aFunc
6830: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6d  s[] = {.    { "m
6840: 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  in",            
6850: 20 20 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45     -1, 0, SQLITE
6860: 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 6d 69 6e  _UTF8,    1, min
6870: 6d 61 78 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  maxFunc },.    {
6880: 20 22 6d 69 6e 22 2c 20 20 20 20 20 20 20 20 20   "min",         
6890: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c         0, 0, SQL
68a0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20  ITE_UTF8,    1, 
68b0: 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  0          },.  
68c0: 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 20 20    { "max",      
68d0: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 32 2c 20           -1, 2, 
68e0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
68f0: 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 7d 2c  1, minmaxFunc },
6900: 0a 20 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20  .    { "max",   
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
6920: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
6930: 20 20 20 31 2c 20 30 20 20 20 20 20 20 20 20 20     1, 0         
6940: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 79 70 65 6f   },.    { "typeo
6950: 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  f",             
6960: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
6970: 38 2c 20 20 20 20 30 2c 20 74 79 70 65 6f 66 46  8,    0, typeofF
6980: 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65  unc },.    { "le
6990: 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20  ngth",          
69a0: 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f     1, 0, SQLITE_
69b0: 55 54 46 38 2c 20 20 20 20 30 2c 20 6c 65 6e 67  UTF8,    0, leng
69c0: 74 68 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  thFunc },.    { 
69d0: 22 73 75 62 73 74 72 22 2c 20 20 20 20 20 20 20  "substr",       
69e0: 20 20 20 20 20 20 33 2c 20 30 2c 20 53 51 4c 49        3, 0, SQLI
69f0: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73  TE_UTF8,    0, s
6a00: 75 62 73 74 72 46 75 6e 63 20 7d 2c 0a 23 69 66  ubstrFunc },.#if
6a10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6a20: 5f 55 54 46 31 36 0a 20 20 20 20 7b 20 22 73 75  _UTF16.    { "su
6a30: 62 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20  bstr",          
6a40: 20 20 20 33 2c 20 30 2c 20 53 51 4c 49 54 45 5f     3, 0, SQLITE_
6a50: 55 54 46 31 36 4c 45 2c 20 30 2c 20 73 71 6c 69  UTF16LE, 0, sqli
6a60: 74 65 33 75 74 66 31 36 53 75 62 73 74 72 20 7d  te3utf16Substr }
6a70: 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 22  ,.#endif.    { "
6a80: 61 62 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  abs",           
6a90: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
6aa0: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 61 62  E_UTF8,    0, ab
6ab0: 73 46 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20  sFunc    },.    
6ac0: 7b 20 22 72 6f 75 6e 64 22 2c 20 20 20 20 20 20  { "round",      
6ad0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51          1, 0, SQ
6ae0: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
6af0: 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c 0a 20   roundFunc  },. 
6b00: 20 20 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 20     { "round",   
6b10: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
6b20: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
6b30: 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d   0, roundFunc  }
6b40: 2c 0a 20 20 20 20 7b 20 22 75 70 70 65 72 22 2c  ,.    { "upper",
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
6b60: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
6b70: 20 20 20 20 30 2c 20 75 70 70 65 72 46 75 6e 63      0, upperFunc
6b80: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 77 65    },.    { "lowe
6b90: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
6ba0: 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   1, 0, SQLITE_UT
6bb0: 46 38 2c 20 20 20 20 30 2c 20 6c 6f 77 65 72 46  F8,    0, lowerF
6bc0: 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63  unc  },.    { "c
6bd0: 6f 61 6c 65 73 63 65 22 2c 20 20 20 20 20 20 20  oalesce",       
6be0: 20 20 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45     -1, 0, SQLITE
6bf0: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 69 66 6e  _UTF8,    0, ifn
6c00: 75 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  ullFunc },.    {
6c10: 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20 20   "coalesce",    
6c20: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c         0, 0, SQL
6c30: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
6c40: 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  0          },.  
6c50: 20 20 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c 20    { "coalesce", 
6c60: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
6c70: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
6c80: 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c  0, 0          },
6c90: 0a 20 20 20 20 7b 20 22 69 66 6e 75 6c 6c 22 2c  .    { "ifnull",
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
6cb0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
6cc0: 20 20 20 31 2c 20 69 66 6e 75 6c 6c 46 75 6e 63     1, ifnullFunc
6cd0: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6e 64 6f   },.    { "rando
6ce0: 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d  m",            -
6cf0: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
6d00: 38 2c 20 20 20 20 30 2c 20 72 61 6e 64 6f 6d 46  8,    0, randomF
6d10: 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 75  unc },.    { "nu
6d20: 6c 6c 69 66 22 2c 20 20 20 20 20 20 20 20 20 20  llif",          
6d30: 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f     2, 0, SQLITE_
6d40: 55 54 46 38 2c 20 20 20 20 31 2c 20 6e 75 6c 6c  UTF8,    1, null
6d50: 69 66 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  ifFunc },.    { 
6d60: 22 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 22  "sqlite_version"
6d70: 2c 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c 49  ,     0, 0, SQLI
6d80: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 76  TE_UTF8,    0, v
6d90: 65 72 73 69 6f 6e 46 75 6e 63 7d 2c 0a 20 20 20  ersionFunc},.   
6da0: 20 7b 20 22 71 75 6f 74 65 22 2c 20 20 20 20 20   { "quote",     
6db0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
6dc0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
6dd0: 2c 20 71 75 6f 74 65 46 75 6e 63 20 20 7d 2c 0a  , quoteFunc  },.
6de0: 20 20 20 20 7b 20 22 6c 61 73 74 5f 69 6e 73 65      { "last_inse
6df0: 72 74 5f 72 6f 77 69 64 22 2c 20 20 30 2c 20 31  rt_rowid",  0, 1
6e00: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
6e10: 20 20 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74    0, last_insert
6e20: 5f 72 6f 77 69 64 20 7d 2c 0a 20 20 20 20 7b 20  _rowid },.    { 
6e30: 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  "changes",      
6e40: 20 20 20 20 20 20 30 2c 20 31 2c 20 53 51 4c 49        0, 1, SQLI
6e50: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 63  TE_UTF8,    0, c
6e60: 68 61 6e 67 65 73 20 20 20 20 7d 2c 0a 20 20 20  hanges    },.   
6e70: 20 7b 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65   { "total_change
6e80: 73 22 2c 20 20 20 20 20 20 30 2c 20 31 2c 20 53  s",      0, 1, S
6e90: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
6ea0: 2c 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20  , total_changes 
6eb0: 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
6ec0: 5f 53 4f 55 4e 44 45 58 0a 20 20 20 20 7b 20 22  _SOUNDEX.    { "
6ed0: 73 6f 75 6e 64 65 78 22 2c 20 20 20 20 20 20 20  soundex",       
6ee0: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
6ef0: 45 5f 55 54 46 38 2c 20 30 2c 20 73 6f 75 6e 64  E_UTF8, 0, sound
6f00: 65 78 46 75 6e 63 7d 2c 0a 23 65 6e 64 69 66 0a  exFunc},.#endif.
6f10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
6f20: 53 54 0a 20 20 20 20 7b 20 22 72 61 6e 64 73 74  ST.    { "randst
6f30: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
6f40: 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    2, 0, SQLITE_U
6f50: 54 46 38 2c 20 30 2c 20 72 61 6e 64 53 74 72 20  TF8, 0, randStr 
6f60: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73     },.    { "tes
6f70: 74 5f 64 65 73 74 72 75 63 74 6f 72 22 2c 20 20  t_destructor",  
6f80: 20 20 20 20 20 31 2c 20 31 2c 20 53 51 4c 49 54       1, 1, SQLIT
6f90: 45 5f 55 54 46 38 2c 20 30 2c 20 74 65 73 74 5f  E_UTF8, 0, test_
6fa0: 64 65 73 74 72 75 63 74 6f 72 7d 2c 0a 20 20 20  destructor},.   
6fb0: 20 7b 20 22 74 65 73 74 5f 64 65 73 74 72 75 63   { "test_destruc
6fc0: 74 6f 72 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30  tor_count", 0, 0
6fd0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
6fe0: 2c 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f  , test_destructo
6ff0: 72 5f 63 6f 75 6e 74 7d 2c 0a 20 20 20 20 7b 20  r_count},.    { 
7000: 22 74 65 73 74 5f 61 75 78 64 61 74 61 22 2c 20  "test_auxdata", 
7010: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 53          -1, 0, S
7020: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74  QLITE_UTF8, 0, t
7030: 65 73 74 5f 61 75 78 64 61 74 61 7d 2c 0a 20 20  est_auxdata},.  
7040: 20 20 7b 20 22 74 65 73 74 5f 65 72 72 6f 72 22    { "test_error"
7050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ,            1, 
7060: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
7070: 30 2c 20 74 65 73 74 5f 65 72 72 6f 72 7d 2c 0a  0, test_error},.
7080: 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 73 74  #endif.  };.  st
7090: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
70a0: 74 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  t {.    char *zN
70b0: 61 6d 65 3b 0a 20 20 20 20 73 69 67 6e 65 64 20  ame;.    signed 
70c0: 63 68 61 72 20 6e 41 72 67 3b 0a 20 20 20 20 75  char nArg;.    u
70d0: 38 20 61 72 67 54 79 70 65 3b 0a 20 20 20 20 75  8 argType;.    u
70e0: 38 20 6e 65 65 64 43 6f 6c 6c 53 65 71 3b 0a 20  8 needCollSeq;. 
70f0: 20 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29     void (*xStep)
7100: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7110: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
7120: 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 76 6f 69 64  lue**);.    void
7130: 20 28 2a 78 46 69 6e 61 6c 69 7a 65 29 28 73 71   (*xFinalize)(sq
7140: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b  lite3_context*);
7150: 0a 20 20 7d 20 61 41 67 67 73 5b 5d 20 3d 20 7b  .  } aAggs[] = {
7160: 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20  .    { "min",   
7170: 20 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78   1, 0, 1, minmax
7180: 53 74 65 70 2c 20 20 20 6d 69 6e 4d 61 78 46 69  Step,   minMaxFi
7190: 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20 20 20 7b 20  nalize },.    { 
71a0: 22 6d 61 78 22 2c 20 20 20 20 31 2c 20 32 2c 20  "max",    1, 2, 
71b0: 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20  1, minmaxStep,  
71c0: 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20   minMaxFinalize 
71d0: 7d 2c 0a 20 20 20 20 7b 20 22 73 75 6d 22 2c 20  },.    { "sum", 
71e0: 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53     1, 0, 0, sumS
71f0: 74 65 70 2c 20 20 20 20 20 20 73 75 6d 46 69 6e  tep,      sumFin
7200: 61 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20  alize    },.    
7210: 7b 20 22 61 76 67 22 2c 20 20 20 20 31 2c 20 30  { "avg",    1, 0
7220: 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20  , 0, sumStep,   
7230: 20 20 20 61 76 67 46 69 6e 61 6c 69 7a 65 20 20     avgFinalize  
7240: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e    },.    { "coun
7250: 74 22 2c 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f  t",  0, 0, 0, co
7260: 75 6e 74 53 74 65 70 2c 20 20 20 20 63 6f 75 6e  untStep,    coun
7270: 74 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20  tFinalize  },.  
7280: 20 20 7b 20 22 63 6f 75 6e 74 22 2c 20 20 31 2c    { "count",  1,
7290: 20 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70   0, 0, countStep
72a0: 2c 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69  ,    countFinali
72b0: 7a 65 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  ze  },.  };.  in
72c0: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  t i;..  for(i=0;
72d0: 20 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 73   i<sizeof(aFuncs
72e0: 29 2f 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b  )/sizeof(aFuncs[
72f0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76  0]); i++){.    v
7300: 6f 69 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20  oid *pArg = 0;. 
7310: 20 20 20 73 77 69 74 63 68 28 20 61 46 75 6e 63     switch( aFunc
7320: 73 5b 69 5d 2e 61 72 67 54 79 70 65 20 29 7b 0a  s[i].argType ){.
7330: 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 41        case 1: pA
7340: 72 67 20 3d 20 64 62 3b 20 62 72 65 61 6b 3b 0a  rg = db; break;.
7350: 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 41        case 2: pA
7360: 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 28 2d 31  rg = (void *)(-1
7370: 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  ); break;.    }.
7380: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
7390: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
73a0: 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c  aFuncs[i].zName,
73b0: 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c   aFuncs[i].nArg,
73c0: 0a 20 20 20 20 20 20 20 20 61 46 75 6e 63 73 5b  .        aFuncs[
73d0: 69 5d 2e 65 54 65 78 74 52 65 70 2c 20 70 41 72  i].eTextRep, pAr
73e0: 67 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 78 46 75  g, aFuncs[i].xFu
73f0: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nc, 0, 0);.    i
7400: 66 28 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 65 65  f( aFuncs[i].nee
7410: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
7420: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
7430: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
7440: 6e 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63  nction(db, aFunc
7450: 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20  s[i].zName, .   
7460: 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 61 46         strlen(aF
7470: 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 29 2c 20  uncs[i].zName), 
7480: 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 20  aFuncs[i].nArg, 
7490: 61 46 75 6e 63 73 5b 69 5d 2e 65 54 65 78 74 52  aFuncs[i].eTextR
74a0: 65 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ep, 0);.      if
74b0: 28 20 70 46 75 6e 63 20 26 26 20 61 46 75 6e 63  ( pFunc && aFunc
74c0: 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71  s[i].needCollSeq
74d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 75 6e   ){.        pFun
74e0: 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d  c->needCollSeq =
74f0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7500: 7d 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  }.  }.#ifndef SQ
7510: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
7520: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c  ABLE.  sqlite3Al
7530: 74 65 72 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  terFunctions(db)
7540: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ;.#endif.#ifndef
7550: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 52   SQLITE_OMIT_PAR
7560: 53 45 52 0a 20 20 73 71 6c 69 74 65 33 41 74 74  SER.  sqlite3Att
7570: 61 63 68 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  achFunctions(db)
7580: 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  ;.#endif.  for(i
7590: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 41 67  =0; i<sizeof(aAg
75a0: 67 73 29 2f 73 69 7a 65 6f 66 28 61 41 67 67 73  gs)/sizeof(aAggs
75b0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
75c0: 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a  void *pArg = 0;.
75d0: 20 20 20 20 73 77 69 74 63 68 28 20 61 41 67 67      switch( aAgg
75e0: 73 5b 69 5d 2e 61 72 67 54 79 70 65 20 29 7b 0a  s[i].argType ){.
75f0: 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 41        case 1: pA
7600: 72 67 20 3d 20 64 62 3b 20 62 72 65 61 6b 3b 0a  rg = db; break;.
7610: 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 41        case 2: pA
7620: 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 28 2d 31  rg = (void *)(-1
7630: 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  ); break;.    }.
7640: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
7650: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7660: 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  aAggs[i].zName, 
7670: 61 41 67 67 73 5b 69 5d 2e 6e 41 72 67 2c 20 53  aAggs[i].nArg, S
7680: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
7690: 20 20 20 20 20 70 41 72 67 2c 20 30 2c 20 61 41       pArg, 0, aA
76a0: 67 67 73 5b 69 5d 2e 78 53 74 65 70 2c 20 61 41  ggs[i].xStep, aA
76b0: 67 67 73 5b 69 5d 2e 78 46 69 6e 61 6c 69 7a 65  ggs[i].xFinalize
76c0: 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67 73  );.    if( aAggs
76d0: 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  [i].needCollSeq 
76e0: 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  ){.      FuncDef
76f0: 20 2a 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65   *pFunc = sqlite
7700: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 20 64  3FindFunction( d
7710: 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d  b, aAggs[i].zNam
7720: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  e,.          str
7730: 6c 65 6e 28 61 41 67 67 73 5b 69 5d 2e 7a 4e 61  len(aAggs[i].zNa
7740: 6d 65 29 2c 20 61 41 67 67 73 5b 69 5d 2e 6e 41  me), aAggs[i].nA
7750: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
7760: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
7770: 46 75 6e 63 20 26 26 20 61 41 67 67 73 5b 69 5d  Func && aAggs[i]
7780: 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a  .needCollSeq ){.
7790: 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 6e          pFunc->n
77a0: 65 65 64 43 6f 6c 6c 53 65 71 20 3d 20 31 3b 0a  eedCollSeq = 1;.
77b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
77c0: 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  }.  sqlite3Regis
77d0: 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e 63 74  terDateTimeFunct
77e0: 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 64 65 66  ions(db);.#ifdef
77f0: 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 73 71   SQLITE_SSE.  sq
7800: 6c 69 74 65 33 53 73 65 46 75 6e 63 74 69 6f 6e  lite3SseFunction
7810: 73 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 23 69  s(db);.#endif.#i
7820: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 41 53 45  fdef SQLITE_CASE
7830: 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 0a  _SENSITIVE_LIKE.
7840: 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
7850: 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64  rLikeFunctions(d
7860: 62 2c 20 31 29 3b 0a 23 65 6c 73 65 0a 20 20 73  b, 1);.#else.  s
7870: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c 69  qlite3RegisterLi
7880: 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20  keFunctions(db, 
7890: 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  0);.#endif.}../*
78a0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 4c 49 4b 45  .** Set the LIKE
78b0: 4f 50 54 20 66 6c 61 67 20 6f 6e 20 74 68 65 20  OPT flag on the 
78c0: 32 2d 61 72 67 75 6d 65 6e 74 20 66 75 6e 63 74  2-argument funct
78d0: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
78e0: 65 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  en name..*/.stat
78f0: 69 63 20 76 6f 69 64 20 73 65 74 4c 69 6b 65 4f  ic void setLikeO
7900: 70 74 46 6c 61 67 28 73 71 6c 69 74 65 33 20 2a  ptFlag(sqlite3 *
7910: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
7920: 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67 56  zName, int flagV
7930: 61 6c 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  al){.  FuncDef *
7940: 70 44 65 66 3b 0a 20 20 70 44 65 66 20 3d 20 73  pDef;.  pDef = s
7950: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
7960: 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 73 74  on(db, zName, st
7970: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c 20 32 2c 20  rlen(zName), 2, 
7980: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
7990: 0a 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20  .  if( pDef ){. 
79a0: 20 20 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 3d     pDef->flags =
79b0: 20 66 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a 7d 0a   flagVal;.  }.}.
79c0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
79d0: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 4c 49 4b  the built-in LIK
79e0: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
79f0: 69 6f 6e 73 2e 20 20 54 68 65 20 63 61 73 65 53  ions.  The caseS
7a00: 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61 72 61  ensitive.** para
7a10: 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
7a20: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
7a30: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
7a40: 72 20 69 73 20 63 61 73 65 0a 2a 2a 20 73 65 6e  r is case.** sen
7a50: 73 69 74 69 76 65 2e 20 20 47 4c 4f 42 20 69 73  sitive.  GLOB is
7a60: 20 61 6c 77 61 79 73 20 63 61 73 65 20 73 65 6e   always case sen
7a70: 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20  sitive..*/.void 
7a80: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c  sqlite3RegisterL
7a90: 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c  ikeFunctions(sql
7aa0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 63 61  ite3 *db, int ca
7ab0: 73 65 53 65 6e 73 69 74 69 76 65 29 7b 0a 20 20  seSensitive){.  
7ac0: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
7ad0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69 66 28  fo *pInfo;.  if(
7ae0: 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 29   caseSensitive )
7af0: 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73  {.    pInfo = (s
7b00: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
7b10: 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b  o*)&likeInfoAlt;
7b20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
7b30: 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f  nfo = (struct co
7b40: 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65  mpareInfo*)&like
7b50: 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a 20 20  InfoNorm;.  }.  
7b60: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7b70: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 69 6b  unction(db, "lik
7b80: 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  e", 2, SQLITE_UT
7b90: 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46  F8, pInfo, likeF
7ba0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  unc, 0, 0);.  sq
7bb0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7bc0: 63 74 69 6f 6e 28 64 62 2c 20 22 6c 69 6b 65 22  ction(db, "like"
7bd0: 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 3, SQLITE_UTF8
7be0: 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e  , pInfo, likeFun
7bf0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  c, 0, 0);.  sqli
7c00: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7c10: 69 6f 6e 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20  ion(db, "glob", 
7c20: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
7c30: 0a 20 20 20 20 20 20 28 73 74 72 75 63 74 20 63  .      (struct c
7c40: 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f  ompareInfo*)&glo
7c50: 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c  bInfo, likeFunc,
7c60: 20 30 2c 30 29 3b 0a 20 20 73 65 74 4c 69 6b 65   0,0);.  setLike
7c70: 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67 6c 6f  OptFlag(db, "glo
7c80: 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  b", SQLITE_FUNC_
7c90: 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55  LIKE | SQLITE_FU
7ca0: 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65 74 4c  NC_CASE);.  setL
7cb0: 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22  ikeOptFlag(db, "
7cc0: 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20 63 61  like", .      ca
7cd0: 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20 28 53  seSensitive ? (S
7ce0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20  QLITE_FUNC_LIKE 
7cf0: 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  | SQLITE_FUNC_CA
7d00: 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46 55 4e  SE) : SQLITE_FUN
7d10: 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_LIKE);.}../*.*
7d20: 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73 20 74  * pExpr points t
7d30: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
7d40: 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74 73  which implements
7d50: 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66   a function.  If
7d60: 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72 6f 70  .** it is approp
7d70: 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79 20 74  riate to apply t
7d80: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
7d90: 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66 75 6e  tion to that fun
7da0: 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73 65  ction.** then se
7db0: 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75 67 68  t aWc[0] through
7dc0: 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65 20 77   aWc[2] to the w
7dd0: 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65  ildcard characte
7de0: 72 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  rs and.** return
7df0: 20 54 52 55 45 2e 20 20 49 66 20 74 68 65 20 66   TRUE.  If the f
7e00: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  unction is not a
7e10: 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75 6e 63   LIKE-style func
7e20: 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 72 65 74  tion then.** ret
7e30: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e  urn FALSE..*/.in
7e40: 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46  t sqlite3IsLikeF
7e50: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
7e60: 2a 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70 72  *db, Expr *pExpr
7e70: 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73 65  , int *pIsNocase
7e80: 2c 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20 20  , char *aWc){.  
7e90: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
7ea0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
7eb0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
7ec0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7ed0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  .  if( pExpr->pL
7ee0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b  ist->nExpr!=2 ){
7ef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7f00: 20 7d 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69   }.  pDef = sqli
7f10: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
7f20: 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72  db, (char*)pExpr
7f30: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
7f40: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 32 2c 0a 20 20  ->token.n, 2,.  
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
7f70: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66  E_UTF8, 0);.  if
7f80: 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 28 70 44  ( pDef==0 || (pD
7f90: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
7fa0: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d 30  TE_FUNC_LIKE)==0
7fb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7fc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
7fd0: 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65 6d 65  memcpy() stateme
7fe0: 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  nt assumes that 
7ff0: 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68 61  the wildcard cha
8000: 72 61 63 74 65 72 73 20 61 72 65 0a 20 20 2a 2a  racters are.  **
8010: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
8020: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
8030: 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73  he compareInfo s
8040: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 0a 20  tructure.  The. 
8050: 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20 74 68   ** asserts() th
8060: 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66 79  at follow verify
8070: 20 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f 6e   that assumption
8080: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 61  .  */.  memcpy(a
8090: 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65 72 44  Wc, pDef->pUserD
80a0: 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73 65 72  ata, 3);.  asser
80b0: 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49  t( (char*)&likeI
80c0: 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72 2a  nfoAlt == (char*
80d0: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61  )&likeInfoAlt.ma
80e0: 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73 65  tchAll );.  asse
80f0: 72 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c 69  rt( &((char*)&li
8100: 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d 3d  keInfoAlt)[1] ==
8110: 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66   (char*)&likeInf
8120: 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29 3b  oAlt.matchOne );
8130: 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68  .  assert( &((ch
8140: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
8150: 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26  )[2] == (char*)&
8160: 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63  likeInfoAlt.matc
8170: 68 53 65 74 20 29 3b 0a 20 20 2a 70 49 73 4e 6f  hSet );.  *pIsNo
8180: 63 61 73 65 20 3d 20 28 70 44 65 66 2d 3e 66 6c  case = (pDef->fl
8190: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
81a0: 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20 20 72 65  C_CASE)==0;.  re
81b0: 74 75 72 6e 20 31 3b 0a 7d 0a                    turn 1;.}.