/ Hex Artifact Content
Login

Artifact 54efe220cc1ef3859a4b738011621b63a0d697c5:


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 39 36 20 32 30 30 38 2f 30 37 2f 32 38  1.196 2008/07/28
02a0: 20 31 39 3a 33 34 3a 35 33 20 64 72 68 20 45 78   19:34:53 drh Ex
02b0: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
02c0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
02d0: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
02e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
02f0: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  b.h>.#include <a
0300: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0310: 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 0a  e "vdbeInt.h"...
0320: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0330: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
0340: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
0350: 69 74 68 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a  ith a function..
0360: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
0370: 71 20 2a 73 71 6c 69 74 65 33 47 65 74 46 75 6e  q *sqlite3GetFun
0380: 63 43 6f 6c 6c 53 65 71 28 73 71 6c 69 74 65 33  cCollSeq(sqlite3
0390: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
03a0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6e  t){.  return con
03b0: 74 65 78 74 2d 3e 70 43 6f 6c 6c 3b 0a 7d 0a 0a  text->pColl;.}..
03c0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
03d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 6f 6e 2d  tion of the non-
03e0: 61 67 67 72 65 67 61 74 65 20 6d 69 6e 28 29 20  aggregate min() 
03f0: 61 6e 64 20 6d 61 78 28 29 20 66 75 6e 63 74 69  and max() functi
0400: 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons.*/.static vo
0410: 69 64 20 6d 69 6e 6d 61 78 46 75 6e 63 28 0a 20  id minmaxFunc(. 
0420: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
0430: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
0440: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
0450: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
0460: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
0470: 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 30 20 66 6f  mask;    /* 0 fo
0480: 72 20 6d 69 6e 28 29 20 6f 72 20 30 78 66 66 66  r min() or 0xfff
0490: 66 66 66 66 66 20 66 6f 72 20 6d 61 78 28 29 20  fffff for max() 
04a0: 2a 2f 0a 20 20 69 6e 74 20 69 42 65 73 74 3b 0a  */.  int iBest;.
04b0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
04c0: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30  ;..  if( argc==0
04d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 61 73   ) return;.  mas
04e0: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  k = sqlite3_user
04f0: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3d 3d  _data(context)==
0500: 30 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 70 43  0 ? 0 : -1;.  pC
0510: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
0520: 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74  FuncCollSeq(cont
0530: 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ext);.  assert( 
0540: 70 43 6f 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  pColl );.  asser
0550: 74 28 20 6d 61 73 6b 3d 3d 2d 31 20 7c 7c 20 6d  t( mask==-1 || m
0560: 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 69 42 65 73  ask==0 );.  iBes
0570: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0580: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
0590: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
05a0: 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a  _NULL ) return;.
05b0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67    for(i=1; i<arg
05c0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
05d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
05e0: 79 70 65 28 61 72 67 76 5b 69 5d 29 3d 3d 53 51  ype(argv[i])==SQ
05f0: 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75  LITE_NULL ) retu
0600: 72 6e 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c  rn;.    if( (sql
0610: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61  ite3MemCompare(a
0620: 72 67 76 5b 69 42 65 73 74 5d 2c 20 61 72 67 76  rgv[iBest], argv
0630: 5b 69 5d 2c 20 70 43 6f 6c 6c 29 5e 6d 61 73 6b  [i], pColl)^mask
0640: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 42  )>=0 ){.      iB
0650: 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20  est = i;.    }. 
0660: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
0670: 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78  ult_value(contex
0680: 74 2c 20 61 72 67 76 5b 69 42 65 73 74 5d 29 3b  t, argv[iBest]);
0690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
06a0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
06b0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
06c0: 61 74 69 63 20 76 6f 69 64 20 74 79 70 65 6f 66  atic void typeof
06d0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
06e0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
06f0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
0700: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0710: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
0720: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73  char *z = 0;.  s
0730: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76  witch( sqlite3_v
0740: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
0750: 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ]) ){.    case S
0760: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 20 20 20 7a  QLITE_NULL:    z
0770: 20 3d 20 22 6e 75 6c 6c 22 3b 20 20 20 20 62 72   = "null";    br
0780: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0790: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7a 20  LITE_INTEGER: z 
07a0: 3d 20 22 69 6e 74 65 67 65 72 22 3b 20 62 72 65  = "integer"; 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 54 45 58 54 3a 20 20 20 20 7a 20 3d  ITE_TEXT:    z =
07d0: 20 22 74 65 78 74 22 3b 20 20 20 20 62 72 65 61   "text";    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 46 4c 4f 41 54 3a 20 20 20 7a 20 3d 20  TE_FLOAT:   z = 
0800: 22 72 65 61 6c 22 3b 20 20 20 20 62 72 65 61 6b  "real";    break
0810: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0820: 45 5f 42 4c 4f 42 3a 20 20 20 20 7a 20 3d 20 22  E_BLOB:    z = "
0830: 62 6c 6f 62 22 3b 20 20 20 20 62 72 65 61 6b 3b  blob";    break;
0840: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
0850: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
0860: 78 74 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54  xt, z, -1, SQLIT
0870: 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 0a 2f  E_STATIC);.}.../
0880: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
0890: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 65 6e 67 74  ion of the lengt
08a0: 68 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a  h() function.*/.
08b0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 6e 67  static void leng
08c0: 74 68 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  thFunc(.  sqlite
08d0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
08e0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
08f0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
0900: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
0910: 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  len;..  assert( 
0920: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 73 77 69  argc==1 );.  swi
0930: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  tch( sqlite3_val
0940: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
0950: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
0960: 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 63 61  ITE_BLOB:.    ca
0970: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
0980: 52 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  R:.    case SQLI
0990: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
09a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
09b0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
09c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
09d0: 73 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 20  s(argv[0]));.   
09e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
09f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0a00: 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f  TEXT: {.      co
0a10: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
0a20: 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  r *z = sqlite3_v
0a30: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
0a40: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d  ]);.      if( z=
0a50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
0a60: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20     len = 0;.    
0a70: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0a80: 20 20 20 20 20 20 20 6c 65 6e 2b 2b 3b 0a 20 20         len++;.  
0a90: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
0aa0: 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 20  P_UTF8(z);.     
0ab0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
0ac0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
0ad0: 65 78 74 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  ext, len);.     
0ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0af0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
0b00: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
0b10: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
0b20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0b30: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
0b40: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
0b50: 6f 66 20 74 68 65 20 61 62 73 28 29 20 66 75 6e  of the abs() fun
0b60: 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ction.*/.static 
0b70: 76 6f 69 64 20 61 62 73 46 75 6e 63 28 73 71 6c  void absFunc(sql
0b80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0b90: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
0ba0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0bb0: 2a 61 72 67 76 29 7b 0a 20 20 61 73 73 65 72 74  *argv){.  assert
0bc0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 73  ( argc==1 );.  s
0bd0: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76  witch( sqlite3_v
0be0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
0bf0: 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ]) ){.    case S
0c00: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
0c10: 0a 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 20  .      i64 iVal 
0c20: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
0c30: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
0c40: 20 20 20 20 20 20 69 66 28 20 69 56 61 6c 3c 30        if( iVal<0
0c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
0c60: 28 69 56 61 6c 3c 3c 31 29 3d 3d 30 20 29 7b 0a  (iVal<<1)==0 ){.
0c70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
0c80: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
0c90: 6f 6e 74 65 78 74 2c 20 22 69 6e 74 65 67 65 72  ontext, "integer
0ca0: 20 6f 76 65 72 66 6c 6f 77 22 2c 20 2d 31 29 3b   overflow", -1);
0cb0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
0cc0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
0cd0: 20 20 20 20 20 69 56 61 6c 20 3d 20 2d 69 56 61       iVal = -iVa
0ce0: 6c 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20  l;.      } .    
0cf0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0d00: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
0d10: 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  iVal);.      bre
0d20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
0d30: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
0d40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
0d50: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
0d60: 65 78 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ext);.      brea
0d70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
0d80: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 64 6f  ault: {.      do
0d90: 75 62 6c 65 20 72 56 61 6c 20 3d 20 73 71 6c 69  uble rVal = sqli
0da0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
0db0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
0dc0: 20 69 66 28 20 72 56 61 6c 3c 30 20 29 20 72 56   if( rVal<0 ) rV
0dd0: 61 6c 20 3d 20 2d 72 56 61 6c 3b 0a 20 20 20 20  al = -rVal;.    
0de0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0df0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
0e00: 20 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 62 72   rVal);.      br
0e10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
0e20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
0e30: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
0e40: 62 73 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e  bstr() function.
0e50: 0a 2a 2a 0a 2a 2a 20 73 75 62 73 74 72 28 78 2c  .**.** substr(x,
0e60: 70 31 2c 70 32 29 20 20 72 65 74 75 72 6e 73 20  p1,p2)  returns 
0e70: 70 32 20 63 68 61 72 61 63 74 65 72 73 20 6f 66  p2 characters of
0e80: 20 78 5b 5d 20 62 65 67 69 6e 6e 69 6e 67 20 77   x[] beginning w
0e90: 69 74 68 20 70 31 2e 0a 2a 2a 20 70 31 20 69 73  ith p1..** p1 is
0ea0: 20 31 2d 69 6e 64 65 78 65 64 2e 20 20 53 6f 20   1-indexed.  So 
0eb0: 73 75 62 73 74 72 28 78 2c 31 2c 31 29 20 72 65  substr(x,1,1) re
0ec0: 74 75 72 6e 73 20 74 68 65 20 66 69 72 73 74 20  turns the first 
0ed0: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20  character.** of 
0ee0: 78 2e 20 20 49 66 20 78 20 69 73 20 74 65 78 74  x.  If x is text
0ef0: 2c 20 74 68 65 6e 20 77 65 20 61 63 74 75 61 6c  , then we actual
0f00: 6c 79 20 63 6f 75 6e 74 20 55 54 46 2d 38 20 63  ly count UTF-8 c
0f10: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20 49 66  haracters..** If
0f20: 20 78 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68   x is a blob, th
0f30: 65 6e 20 77 65 20 63 6f 75 6e 74 20 62 79 74 65  en we count byte
0f40: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 31 20 69  s..**.** If p1 i
0f50: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
0f60: 20 77 65 20 62 65 67 69 6e 20 61 62 73 28 70 31   we begin abs(p1
0f70: 29 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  ) from the end o
0f80: 66 20 78 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63  f x[]..*/.static
0f90: 20 76 6f 69 64 20 73 75 62 73 74 72 46 75 6e 63   void substrFunc
0fa0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
0fb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
0fc0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
0fd0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
0fe0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
0ff0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
1000: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1010: 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 6c  har *z2;.  int l
1020: 65 6e 3b 0a 20 20 69 6e 74 20 70 30 74 79 70 65  en;.  int p0type
1030: 3b 0a 20 20 69 36 34 20 70 31 2c 20 70 32 3b 0a  ;.  i64 p1, p2;.
1040: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
1050: 3d 33 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =3 || argc==2 );
1060: 0a 20 20 70 30 74 79 70 65 20 3d 20 73 71 6c 69  .  p0type = sqli
1070: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1080: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70  rgv[0]);.  if( p
1090: 30 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  0type==SQLITE_BL
10a0: 4f 42 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  OB ){.    len = 
10b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
10c0: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
10d0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
10e0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
10f0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
1100: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73  ) return;.    as
1110: 73 65 72 74 28 20 6c 65 6e 3d 3d 73 71 6c 69 74  sert( len==sqlit
1120: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
1130: 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 7d 65 6c  rgv[0]) );.  }el
1140: 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  se{.    z = sqli
1150: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1160: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
1170: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
1180: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20      len = 0;.   
1190: 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 3b 20   for(z2=z; *z2; 
11a0: 6c 65 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51  len++){.      SQ
11b0: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
11c0: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2);.    }.  }.  
11d0: 70 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  p1 = sqlite3_val
11e0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b  ue_int(argv[1]);
11f0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29  .  if( argc==3 )
1200: 7b 0a 20 20 20 20 70 32 20 3d 20 73 71 6c 69 74  {.    p2 = sqlit
1210: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
1220: 76 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v[2]);.  }else{.
1230: 20 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33      p2 = sqlite3
1240: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
1250: 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e 61 4c 69  le(context)->aLi
1260: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
1270: 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 7d 0a 20 20  _LENGTH];.  }.  
1280: 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20  if( p1<0 ){.    
1290: 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 69  p1 += len;.    i
12a0: 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20  f( p1<0 ){.     
12b0: 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20   p2 += p1;.     
12c0: 20 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   p1 = 0;.    }. 
12d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 31 3e 30 20   }else if( p1>0 
12e0: 29 7b 0a 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d  ){.    p1--;.  }
12f0: 0a 20 20 69 66 28 20 70 31 2b 70 32 3e 6c 65 6e  .  if( p1+p2>len
1300: 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 6c 65 6e   ){.    p2 = len
1310: 2d 70 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  -p1;.  }.  if( p
1320: 30 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 42 4c  0type!=SQLITE_BL
1330: 4f 42 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  OB ){.    while(
1340: 20 2a 7a 20 26 26 20 70 31 20 29 7b 0a 20 20 20   *z && p1 ){.   
1350: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
1360: 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 70 31  TF8(z);.      p1
1370: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  --;.    }.    fo
1380: 72 28 7a 32 3d 7a 3b 20 2a 7a 32 20 26 26 20 70  r(z2=z; *z2 && p
1390: 32 3b 20 70 32 2d 2d 29 7b 0a 20 20 20 20 20 20  2; p2--){.      
13a0: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
13b0: 28 7a 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  (z2);.    }.    
13c0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
13d0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
13e0: 61 72 2a 29 7a 2c 20 7a 32 2d 7a 2c 20 53 51 4c  ar*)z, z2-z, SQL
13f0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1400: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1410: 20 70 32 3c 30 20 29 20 70 32 20 3d 20 30 3b 0a   p2<0 ) p2 = 0;.
1420: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1430: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
1440: 20 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20   (char*)&z[p1], 
1450: 70 32 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  p2, SQLITE_TRANS
1460: 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  IENT);.  }.}../*
1470: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1480: 6f 6e 20 6f 66 20 74 68 65 20 72 6f 75 6e 64 28  on of the round(
1490: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74  ) function.*/.st
14a0: 61 74 69 63 20 76 6f 69 64 20 72 6f 75 6e 64 46  atic void roundF
14b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
14c0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
14d0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
14e0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
14f0: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 64 6f   int n = 0;.  do
1500: 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 7a  uble r;.  char z
1510: 42 75 66 5b 35 30 30 5d 3b 20 20 2f 2a 20 6c 61  Buf[500];  /* la
1520: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 25 66  rger than the %f
1530: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1540: 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 64  of the largest d
1550: 6f 75 62 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72  ouble */.  asser
1560: 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72  t( argc==1 || ar
1570: 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 61  gc==2 );.  if( a
1580: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  rgc==2 ){.    if
1590: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  ( SQLITE_NULL==s
15a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
15b0: 65 28 61 72 67 76 5b 31 5d 29 20 29 20 72 65 74  e(argv[1]) ) ret
15c0: 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  urn;.    n = sql
15d0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
15e0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[1]);.    if(
15f0: 20 6e 3e 33 30 20 29 20 6e 20 3d 20 33 30 3b 0a   n>30 ) n = 30;.
1600: 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20      if( n<0 ) n 
1610: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
1620: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
1630: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
1640: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
1650: 3b 0a 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  r = sqlite3_
1660: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
1670: 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  v[0]);.  sqlite3
1680: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1690: 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 2e 2a  (zBuf),zBuf,"%.*
16a0: 66 22 2c 6e 2c 72 29 3b 0a 20 20 73 71 6c 69 74  f",n,r);.  sqlit
16b0: 65 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 29  e3AtoF(zBuf, &r)
16c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
16d0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
16e0: 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t, r);.}../*.** 
16f0: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
1700: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 75 73  ytes of space us
1710: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ing sqlite3_mall
1720: 6f 63 28 29 2e 20 49 66 20 74 68 65 0a 2a 2a 20  oc(). If the.** 
1730: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1740: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 72  , call sqlite3_r
1750: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
1760: 6d 28 29 20 74 6f 20 6e 6f 74 69 66 79 0a 2a 2a  m() to notify.**
1770: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1780: 6e 64 6c 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63  ndle that malloc
1790: 28 29 20 68 61 73 20 66 61 69 6c 65 64 2e 0a 2a  () has failed..*
17a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
17b0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 73 71 6c  ontextMalloc(sql
17c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
17d0: 6e 74 65 78 74 2c 20 69 36 34 20 6e 42 79 74 65  ntext, i64 nByte
17e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
17f0: 69 66 28 20 6e 42 79 74 65 3e 73 71 6c 69 74 65  if( nByte>sqlite
1800: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
1810: 64 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e 61 4c  dle(context)->aL
1820: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
1830: 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
1840: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1850: 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e  error_toobig(con
1860: 74 65 78 74 29 3b 0a 20 20 20 20 7a 20 3d 20 30  text);.    z = 0
1870: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
1880: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1890: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
18a0: 20 21 7a 20 26 26 20 6e 42 79 74 65 3e 30 20 29   !z && nByte>0 )
18b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
18c0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
18d0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
18e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18f0: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  z;.}../*.** Impl
1900: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1910: 65 20 75 70 70 65 72 28 29 20 61 6e 64 20 6c 6f  e upper() and lo
1920: 77 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74 69  wer() SQL functi
1930: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ons..*/.static v
1940: 6f 69 64 20 75 70 70 65 72 46 75 6e 63 28 73 71  oid upperFunc(sq
1950: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1960: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
1970: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
1980: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20  **argv){.  char 
1990: 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *z1;.  const cha
19a0: 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20  r *z2;.  int i, 
19b0: 6e 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20  n;.  if( argc<1 
19c0: 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d  || SQLITE_NULL==
19d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
19e0: 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 72 65  pe(argv[0]) ) re
19f0: 74 75 72 6e 3b 0a 20 20 7a 32 20 3d 20 28 63 68  turn;.  z2 = (ch
1a00: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
1a10: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
1a20: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
1a30: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
1a40: 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79  0]);.  /* Verify
1a50: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
1a60: 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20  o _bytes() does 
1a70: 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74  not invalidate t
1a80: 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74  he _text() point
1a90: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
1aa0: 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74  z2==(char*)sqlit
1ab0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1ac0: 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  gv[0]) );.  if( 
1ad0: 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63  z2 ){.    z1 = c
1ae0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
1af0: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31  text, ((i64)n)+1
1b00: 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b  );.    if( z1 ){
1b10: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 31  .      memcpy(z1
1b20: 2c 20 7a 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20  , z2, n+1);.    
1b30: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d    for(i=0; z1[i]
1b40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1b50: 7a 31 5b 69 5d 20 3d 20 74 6f 75 70 70 65 72 28  z1[i] = toupper(
1b60: 7a 31 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  z1[i]);.      }.
1b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
1b80: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
1b90: 74 2c 20 7a 31 2c 20 2d 31 2c 20 73 71 6c 69 74  t, z1, -1, sqlit
1ba0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a  e3_free);.    }.
1bb0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1bc0: 64 20 6c 6f 77 65 72 46 75 6e 63 28 73 71 6c 69  d lowerFunc(sqli
1bd0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1be0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
1bf0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1c00: 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a  argv){.  char *z
1c10: 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1;.  const char 
1c20: 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  *z2;.  int i, n;
1c30: 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 7c 7c  .  if( argc<1 ||
1c40: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71   SQLITE_NULL==sq
1c50: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1c60: 28 61 72 67 76 5b 30 5d 29 20 29 20 72 65 74 75  (argv[0]) ) retu
1c70: 72 6e 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72  rn;.  z2 = (char
1c80: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1c90: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
1ca0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
1cb0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
1cc0: 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  );.  /* Verify t
1cd0: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
1ce0: 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f  _bytes() does no
1cf0: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  t invalidate the
1d00: 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72   _text() pointer
1d10: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32   */.  assert( z2
1d20: 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  ==(char*)sqlite3
1d30: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1d40: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32  [0]) );.  if( z2
1d50: 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e   ){.    z1 = con
1d60: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
1d70: 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b  xt, ((i64)n)+1);
1d80: 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20  .    if( z1 ){. 
1d90: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 31 2c 20       memcpy(z1, 
1da0: 7a 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20  z2, n+1);.      
1db0: 66 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d 3b 20  for(i=0; z1[i]; 
1dc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31  i++){.        z1
1dd0: 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 31  [i] = tolower(z1
1de0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
1df0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1e00: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1e10: 20 7a 31 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33   z1, -1, sqlite3
1e20: 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _free);.    }.  
1e30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
1e40: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1e50: 20 49 46 4e 55 4c 4c 28 29 2c 20 4e 56 4c 28 29   IFNULL(), NVL()
1e60: 2c 20 61 6e 64 20 43 4f 41 4c 45 53 43 45 28 29  , and COALESCE()
1e70: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 0a 2a 2a   functions.  .**
1e80: 20 41 6c 6c 20 74 68 72 65 65 20 64 6f 20 74 68   All three do th
1e90: 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 20 20 54  e same thing.  T
1ea0: 68 65 79 20 72 65 74 75 72 6e 20 74 68 65 20 66  hey return the f
1eb0: 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  irst non-NULL.**
1ec0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
1ed0: 61 74 69 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c  atic void ifnull
1ee0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1ef0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1f00: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1f10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1f20: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  argv.){.  int i;
1f30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
1f40: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
1f50: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73  ( SQLITE_NULL!=s
1f60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
1f70: 65 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20  e(argv[i]) ){.  
1f80: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1f90: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
1fa0: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
1fb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1fc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
1fd0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61  ementation of ra
1fe0: 6e 64 6f 6d 28 29 2e 20 20 52 65 74 75 72 6e 20  ndom().  Return 
1ff0: 61 20 72 61 6e 64 6f 6d 20 69 6e 74 65 67 65 72  a random integer
2000: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .  .*/.static vo
2010: 69 64 20 72 61 6e 64 6f 6d 46 75 6e 63 28 0a 20  id randomFunc(. 
2020: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2030: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
2040: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
2050: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
2060: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
2070: 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  r;.  sqlite3_ran
2080: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
2090: 29 2c 20 26 72 29 3b 0a 20 20 69 66 28 20 28 72  ), &r);.  if( (r
20a0: 3c 3c 31 29 3d 3d 30 20 29 20 72 20 3d 20 30 3b  <<1)==0 ) r = 0;
20b0: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 30 78 38    /* Prevent 0x8
20c0: 30 30 30 2e 2e 2e 2e 20 61 73 20 74 68 65 20 72  000.... as the r
20d0: 65 73 75 6c 74 20 73 6f 20 74 68 61 74 20 77 65  esult so that we
20e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2100: 20 63 61 6e 20 61 6c 77 61 79 73 20 64 6f 20 61   can always do a
2110: 62 73 28 29 20 6f 66 20 74 68 65 20 72 65 73 75  bs() of the resu
2120: 6c 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  lt */.  sqlite3_
2130: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
2140: 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a  text, r);.}../*.
2150: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2160: 6e 20 6f 66 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  n of randomblob(
2170: 4e 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61  N).  Return a ra
2180: 6e 64 6f 6d 20 62 6c 6f 62 0a 2a 2a 20 74 68 61  ndom blob.** tha
2190: 74 20 69 73 20 4e 20 62 79 74 65 73 20 6c 6f 6e  t is N bytes lon
21a0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
21b0: 64 20 72 61 6e 64 6f 6d 42 6c 6f 62 28 0a 20 20  d randomBlob(.  
21c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
21d0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
21e0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
21f0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
2200: 20 20 69 6e 74 20 6e 3b 0a 20 20 75 6e 73 69 67    int n;.  unsig
2210: 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 61  ned char *p;.  a
2220: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
2230: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
2240: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
2250: 5d 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 29 7b  ]);.  if( n<1 ){
2260: 0a 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 7d 0a  .    n = 1;.  }.
2270: 20 20 70 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c    p = contextMal
2280: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b  loc(context, n);
2290: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
22a0: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
22b0: 73 73 28 6e 2c 20 70 29 3b 0a 20 20 20 20 73 71  ss(n, p);.    sq
22c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
22d0: 62 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  b(context, (char
22e0: 2a 29 70 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f  *)p, n, sqlite3_
22f0: 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  free);.  }.}../*
2300: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2310: 6f 6e 20 6f 66 20 74 68 65 20 6c 61 73 74 5f 69  on of the last_i
2320: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 53 51  nsert_rowid() SQ
2330: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  L function.  The
2340: 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65   return.** value
2350: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2360: 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  the sqlite3_last
2370: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20  _insert_rowid() 
2380: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
2390: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73  .static void las
23a0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 0a  t_insert_rowid(.
23b0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
23c0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
23d0: 6e 74 20 61 72 67 2c 20 0a 20 20 73 71 6c 69 74  nt arg, .  sqlit
23e0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
23f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2400: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
2410: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
2420: 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  text);.  sqlite3
2430: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
2440: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c  ntext, sqlite3_l
2450: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
2460: 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (db));.}../*.** 
2470: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2480: 66 20 74 68 65 20 63 68 61 6e 67 65 73 28 29 20  f the changes() 
2490: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  SQL function.  T
24a0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
24b0: 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  is the.** same a
24c0: 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 68  s the sqlite3_ch
24d0: 61 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e 63  anges() API func
24e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
24f0: 76 6f 69 64 20 63 68 61 6e 67 65 73 28 0a 20 20  void changes(.  
2500: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2510: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
2520: 61 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  arg,.  sqlite3_v
2530: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
2540: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
2550: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
2560: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
2570: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
2580: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
2590: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
25a0: 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (db));.}../*.** 
25b0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
25c0: 66 20 74 68 65 20 74 6f 74 61 6c 5f 63 68 61 6e  f the total_chan
25d0: 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ges() SQL functi
25e0: 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  on.  The return 
25f0: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20  value is.** the 
2600: 73 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69  same as the sqli
2610: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
2620: 73 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  s() API function
2630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2640: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 0a   total_changes(.
2650: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
2660: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
2670: 74 20 61 72 67 2c 0a 20 20 73 71 6c 69 74 65 33  t arg,.  sqlite3
2680: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
2690: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
26a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
26b0: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
26c0: 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  xt);.  sqlite3_r
26d0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
26e0: 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  t, sqlite3_total
26f0: 5f 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d  _changes(db));.}
2700: 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74  ../*.** A struct
2710: 75 72 65 20 64 65 66 69 6e 69 6e 67 20 68 6f 77  ure defining how
2720: 20 74 6f 20 64 6f 20 47 4c 4f 42 2d 73 74 79 6c   to do GLOB-styl
2730: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  e comparisons..*
2740: 2f 0a 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65  /.struct compare
2750: 49 6e 66 6f 20 7b 0a 20 20 75 38 20 6d 61 74 63  Info {.  u8 matc
2760: 68 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68  hAll;.  u8 match
2770: 4f 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63 68 53  One;.  u8 matchS
2780: 65 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65 3b  et;.  u8 noCase;
2790: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 4c  .};../*.** For L
27a0: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6d 61 74  IKE and GLOB mat
27b0: 63 68 69 6e 67 20 6f 6e 20 45 42 43 44 49 43 20  ching on EBCDIC 
27c0: 6d 61 63 68 69 6e 65 73 2c 20 61 73 73 75 6d 65  machines, assume
27d0: 20 74 68 61 74 20 65 76 65 72 79 0a 2a 2a 20 63   that every.** c
27e0: 68 61 72 61 63 74 65 72 20 69 73 20 65 78 61 63  haracter is exac
27f0: 74 6c 79 20 6f 6e 65 20 62 79 74 65 20 69 6e 20  tly one byte in 
2800: 73 69 7a 65 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c  size.  Also, all
2810: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 0a   characters are.
2820: 2a 2a 20 61 62 6c 65 20 74 6f 20 70 61 72 74 69  ** able to parti
2830: 63 69 70 61 74 65 20 69 6e 20 75 70 70 65 72 2d  cipate in upper-
2840: 63 61 73 65 2d 74 6f 2d 6c 6f 77 65 72 2d 63 61  case-to-lower-ca
2850: 73 65 20 6d 61 70 70 69 6e 67 73 20 69 6e 20 45  se mappings in E
2860: 42 43 44 49 43 0a 2a 2a 20 77 68 65 72 65 61 73  BCDIC.** whereas
2870: 20 6f 6e 6c 79 20 63 68 61 72 61 63 74 65 72 73   only characters
2880: 20 6c 65 73 73 20 74 68 61 6e 20 30 78 38 30 20   less than 0x80 
2890: 64 6f 20 69 6e 20 41 53 43 49 49 2e 0a 2a 2f 0a  do in ASCII..*/.
28a0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
28b0: 54 45 5f 45 42 43 44 49 43 29 0a 23 20 64 65 66  TE_EBCDIC).# def
28c0: 69 6e 65 20 73 71 6c 69 74 65 33 55 74 66 38 52  ine sqlite3Utf8R
28d0: 65 61 64 28 41 2c 42 2c 43 29 20 20 28 2a 28 41  ead(A,B,C)  (*(A
28e0: 2b 2b 29 29 0a 23 20 64 65 66 69 6e 65 20 47 6c  ++)).# define Gl
28f0: 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28 41  ogUpperToLower(A
2900: 29 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65  )     A = sqlite
2910: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 41 5d  3UpperToLower[A]
2920: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2930: 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72  GlogUpperToLower
2940: 28 41 29 20 20 20 20 20 69 66 28 20 41 3c 30 78  (A)     if( A<0x
2950: 38 30 20 29 7b 20 41 20 3d 20 73 71 6c 69 74 65  80 ){ A = sqlite
2960: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 41 5d  3UpperToLower[A]
2970: 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  ; }.#endif..stat
2980: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2990: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 67 6c 6f 62  compareInfo glob
29a0: 49 6e 66 6f 20 3d 20 7b 20 27 2a 27 2c 20 27 3f  Info = { '*', '?
29b0: 27 2c 20 27 5b 27 2c 20 30 20 7d 3b 0a 2f 2a 20  ', '[', 0 };./* 
29c0: 54 68 65 20 63 6f 72 72 65 63 74 20 53 51 4c 2d  The correct SQL-
29d0: 39 32 20 62 65 68 61 76 69 6f 72 20 69 73 20 66  92 behavior is f
29e0: 6f 72 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  or the LIKE oper
29f0: 61 74 6f 72 20 74 6f 20 69 67 6e 6f 72 65 0a 2a  ator to ignore.*
2a00: 2a 20 63 61 73 65 2e 20 20 54 68 75 73 20 20 27  * case.  Thus  '
2a10: 61 27 20 4c 49 4b 45 20 27 41 27 20 77 6f 75 6c  a' LIKE 'A' woul
2a20: 64 20 62 65 20 74 72 75 65 2e 20 2a 2f 0a 73 74  d be true. */.st
2a30: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2a40: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69  t compareInfo li
2a50: 6b 65 49 6e 66 6f 4e 6f 72 6d 20 3d 20 7b 20 27  keInfoNorm = { '
2a60: 25 27 2c 20 27 5f 27 2c 20 20 20 30 2c 20 31 20  %', '_',   0, 1 
2a70: 7d 3b 0a 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  };./* If SQLITE_
2a80: 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c  CASE_SENSITIVE_L
2a90: 49 4b 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20  IKE is defined, 
2aa0: 74 68 65 6e 20 74 68 65 20 4c 49 4b 45 20 6f 70  then the LIKE op
2ab0: 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 63 61 73  erator.** is cas
2ac0: 65 20 73 65 6e 73 69 74 69 76 65 20 63 61 75 73  e sensitive caus
2ad0: 69 6e 67 20 27 61 27 20 4c 49 4b 45 20 27 41 27  ing 'a' LIKE 'A'
2ae0: 20 74 6f 20 62 65 20 66 61 6c 73 65 20 2a 2f 0a   to be false */.
2af0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2b00: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
2b10: 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 20 7b 20  likeInfoAlt = { 
2b20: 27 25 27 2c 20 27 5f 27 2c 20 20 20 30 2c 20 30  '%', '_',   0, 0
2b30: 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61   };../*.** Compa
2b40: 72 65 20 74 77 6f 20 55 54 46 2d 38 20 73 74 72  re two UTF-8 str
2b50: 69 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69 74  ings for equalit
2b60: 79 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  y where the firs
2b70: 74 20 73 74 72 69 6e 67 20 63 61 6e 0a 2a 2a 20  t string can.** 
2b80: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 61  potentially be a
2b90: 20 22 67 6c 6f 62 22 20 65 78 70 72 65 73 73 69   "glob" expressi
2ba0: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  on.  Return true
2bb0: 20 28 31 29 20 69 66 20 74 68 65 79 0a 2a 2a 20   (1) if they.** 
2bc0: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64  are the same and
2bd0: 20 66 61 6c 73 65 20 28 30 29 20 69 66 20 74 68   false (0) if th
2be0: 65 79 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ey are different
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67  ..**.** Globbing
2c00: 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
2c10: 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74     '*'       Mat
2c20: 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63  ches any sequenc
2c30: 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  e of zero or mor
2c40: 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a  e characters..**
2c50: 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20  .**      '?'    
2c60: 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74     Matches exact
2c70: 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  ly one character
2c80: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e  ..**.**     [...
2c90: 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  ]      Matches o
2ca0: 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f  ne character fro
2cb0: 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c  m the enclosed l
2cc0: 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  ist of.**       
2cd0: 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74           charact
2ce0: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b  ers..**.**     [
2cf0: 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65  ^...]     Matche
2d00: 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20  s one character 
2d10: 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f  not in the enclo
2d20: 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  sed list..**.** 
2d30: 57 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61  With the [...] a
2d40: 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69  nd [^...] matchi
2d50: 6e 67 2c 20 61 20 27 5d 27 20 63 68 61 72 61 63  ng, a ']' charac
2d60: 74 65 72 20 63 61 6e 20 62 65 20 69 6e 63 6c 75  ter can be inclu
2d70: 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ded.** in the li
2d80: 73 74 20 62 79 20 6d 61 6b 69 6e 67 20 69 74 20  st by making it 
2d90: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
2da0: 74 65 72 20 61 66 74 65 72 20 27 5b 27 20 6f 72  ter after '[' or
2db0: 20 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67   '^'.  A.** rang
2dc0: 65 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  e of characters 
2dd0: 63 61 6e 20 62 65 20 73 70 65 63 69 66 69 65 64  can be specified
2de0: 20 75 73 69 6e 67 20 27 2d 27 2e 20 20 45 78 61   using '-'.  Exa
2df0: 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22  mple:.** "[a-z]"
2e00: 20 6d 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e   matches any sin
2e10: 67 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c  gle lower-case l
2e20: 65 74 74 65 72 2e 20 20 54 6f 20 6d 61 74 63 68  etter.  To match
2e30: 20 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20   a '-', make.** 
2e40: 69 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  it the last char
2e50: 61 63 74 65 72 20 69 6e 20 74 68 65 20 6c 69 73  acter in the lis
2e60: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
2e70: 75 74 69 6e 65 20 69 73 20 75 73 75 61 6c 6c 79  utine is usually
2e80: 20 71 75 69 63 6b 2c 20 62 75 74 20 63 61 6e 20   quick, but can 
2e90: 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77  be N**2 in the w
2ea0: 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  orst case..**.**
2eb0: 20 48 69 6e 74 73 3a 20 74 6f 20 6d 61 74 63 68   Hints: to match
2ec0: 20 27 2a 27 20 6f 72 20 27 3f 27 2c 20 70 75 74   '*' or '?', put
2ed0: 20 74 68 65 6d 20 69 6e 20 22 5b 5d 22 2e 20 20   them in "[]".  
2ee0: 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
2ef0: 20 20 20 20 20 20 20 20 20 61 62 63 5b 2a 5d 78           abc[*]x
2f00: 79 7a 20 20 20 20 20 20 20 20 4d 61 74 63 68 65  yz        Matche
2f10: 73 20 22 61 62 63 2a 78 79 7a 22 20 6f 6e 6c 79  s "abc*xyz" only
2f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2f30: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 0a 20  atternCompare(. 
2f40: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 61 74 74   const u8 *zPatt
2f50: 65 72 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ern,            
2f60: 20 20 2f 2a 20 54 68 65 20 67 6c 6f 62 20 70 61    /* The glob pa
2f70: 74 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ttern */.  const
2f80: 20 75 38 20 2a 7a 53 74 72 69 6e 67 2c 20 20 20   u8 *zString,   
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2fa0: 68 65 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d  he string to com
2fb0: 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 65  pare against the
2fc0: 20 67 6c 6f 62 20 2a 2f 0a 20 20 63 6f 6e 73 74   glob */.  const
2fd0: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
2fe0: 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49  nfo *pInfo, /* I
2ff0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
3000: 20 68 6f 77 20 74 6f 20 64 6f 20 74 68 65 20 63   how to do the c
3010: 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  ompare */.  cons
3020: 74 20 69 6e 74 20 65 73 63 20 20 20 20 20 20 20  t int esc       
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3040: 54 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61  The escape chara
3050: 63 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  cter */.){.  int
3060: 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e   c, c2;.  int in
3070: 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  vert;.  int seen
3080: 3b 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e 65 20  ;.  u8 matchOne 
3090: 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 4f 6e  = pInfo->matchOn
30a0: 65 3b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c  e;.  u8 matchAll
30b0: 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 41   = pInfo->matchA
30c0: 6c 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68 53 65  ll;.  u8 matchSe
30d0: 74 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68  t = pInfo->match
30e0: 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65  Set;.  u8 noCase
30f0: 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43 61 73 65   = pInfo->noCase
3100: 3b 20 0a 20 20 69 6e 74 20 70 72 65 76 45 73 63  ; .  int prevEsc
3110: 61 70 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ape = 0;     /* 
3120: 54 72 75 65 20 69 66 20 74 68 65 20 70 72 65 76  True if the prev
3130: 69 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 77  ious character w
3140: 61 73 20 27 65 73 63 61 70 65 27 20 2a 2f 0a 0a  as 'escape' */..
3150: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 73 71    while( (c = sq
3160: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50  lite3Utf8Read(zP
3170: 61 74 74 65 72 6e 2c 30 2c 26 7a 50 61 74 74 65  attern,0,&zPatte
3180: 72 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  rn))!=0 ){.    i
3190: 66 28 20 21 70 72 65 76 45 73 63 61 70 65 20 26  f( !prevEscape &
31a0: 26 20 63 3d 3d 6d 61 74 63 68 41 6c 6c 20 29 7b  & c==matchAll ){
31b0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
31c0: 3d 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64  =sqlite3Utf8Read
31d0: 28 7a 50 61 74 74 65 72 6e 2c 30 2c 26 7a 50 61  (zPattern,0,&zPa
31e0: 74 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74 63 68  ttern)) == match
31f0: 41 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  All.            
3200: 20 20 20 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68     || c == match
3210: 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  One ){.        i
3220: 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26  f( c==matchOne &
3230: 26 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  & sqlite3Utf8Rea
3240: 64 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a  d(zString, 0, &z
3250: 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20  String)==0 ){.  
3260: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
3270: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3280: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
3290: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
32a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
32b0: 6c 73 65 20 69 66 28 20 63 3d 3d 65 73 63 20 29  lse if( c==esc )
32c0: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71  {.        c = sq
32d0: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50  lite3Utf8Read(zP
32e0: 61 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74  attern, 0, &zPat
32f0: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  tern);.        i
3300: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
3310: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3320: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3330: 65 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63  else if( c==matc
3340: 68 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  hSet ){.        
3350: 61 73 73 65 72 74 28 20 65 73 63 3d 3d 30 20 29  assert( esc==0 )
3360: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  ;         /* Thi
3370: 73 20 69 73 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c  s is GLOB, not L
3380: 49 4b 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  IKE */.        a
3390: 73 73 65 72 74 28 20 6d 61 74 63 68 53 65 74 3c  ssert( matchSet<
33a0: 30 78 38 30 20 29 3b 20 20 2f 2a 20 27 5b 27 20  0x80 );  /* '[' 
33b0: 69 73 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65  is a single-byte
33c0: 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
33d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53        while( *zS
33e0: 74 72 69 6e 67 20 26 26 20 70 61 74 74 65 72 6e  tring && pattern
33f0: 43 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72  Compare(&zPatter
3400: 6e 5b 2d 31 5d 2c 7a 53 74 72 69 6e 67 2c 70 49  n[-1],zString,pI
3410: 6e 66 6f 2c 65 73 63 29 3d 3d 30 20 29 7b 0a 20  nfo,esc)==0 ){. 
3420: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
3430: 53 4b 49 50 5f 55 54 46 38 28 7a 53 74 72 69 6e  SKIP_UTF8(zStrin
3440: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
3450: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2a 7a 53        return *zS
3460: 74 72 69 6e 67 21 3d 30 3b 0a 20 20 20 20 20 20  tring!=0;.      
3470: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  }.      while( (
3480: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
3490: 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 30 2c 26  Read(zString,0,&
34a0: 7a 53 74 72 69 6e 67 29 29 21 3d 30 20 29 7b 0a  zString))!=0 ){.
34b0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61          if( noCa
34c0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
34d0: 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72  GlogUpperToLower
34e0: 28 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (c2);.          
34f0: 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72  GlogUpperToLower
3500: 28 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77  (c);.          w
3510: 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26  hile( c2 != 0 &&
3520: 20 63 32 20 21 3d 20 63 20 29 7b 0a 20 20 20 20   c2 != c ){.    
3530: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
3540: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 53 74  ite3Utf8Read(zSt
3550: 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74 72 69 6e  ring, 0, &zStrin
3560: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
3570: 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72  GlogUpperToLower
3580: 28 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (c2);.          
3590: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
35a0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
35b0: 28 20 63 32 20 21 3d 20 30 20 26 26 20 63 32 20  ( c2 != 0 && c2 
35c0: 21 3d 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  != c ){.        
35d0: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
35e0: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
35f0: 2c 20 30 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a  , 0, &zString);.
3600: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3610: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
3620: 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( c2==0 ) return
3630: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
3640: 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a  patternCompare(z
3650: 50 61 74 74 65 72 6e 2c 7a 53 74 72 69 6e 67 2c  Pattern,zString,
3660: 70 49 6e 66 6f 2c 65 73 63 29 20 29 20 72 65 74  pInfo,esc) ) ret
3670: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
3680: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3690: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 72     }else if( !pr
36a0: 65 76 45 73 63 61 70 65 20 26 26 20 63 3d 3d 6d  evEscape && c==m
36b0: 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20  atchOne ){.     
36c0: 20 69 66 28 20 73 71 6c 69 74 65 33 55 74 66 38   if( sqlite3Utf8
36d0: 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 30 2c  Read(zString, 0,
36e0: 20 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b   &zString)==0 ){
36f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3700: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
3710: 65 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63  else if( c==matc
3720: 68 53 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  hSet ){.      in
3730: 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20  t prior_c = 0;. 
3740: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 73 63       assert( esc
3750: 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 54 68 69  ==0 );    /* Thi
3760: 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 66 6f  s only occurs fo
3770: 72 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45  r GLOB, not LIKE
3780: 20 2a 2f 0a 20 20 20 20 20 20 73 65 65 6e 20 3d   */.      seen =
3790: 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74   0;.      invert
37a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20   = 0;.      c = 
37b0: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
37c0: 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74  zString, 0, &zSt
37d0: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28  ring);.      if(
37e0: 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   c==0 ) return 0
37f0: 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c  ;.      c2 = sql
3800: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61  ite3Utf8Read(zPa
3810: 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74  ttern, 0, &zPatt
3820: 65 72 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ern);.      if( 
3830: 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20  c2=='^' ){.     
3840: 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20     invert = 1;. 
3850: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
3860: 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74  te3Utf8Read(zPat
3870: 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65  tern, 0, &zPatte
3880: 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rn);.      }.   
3890: 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29     if( c2==']' )
38a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
38b0: 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b  =']' ) seen = 1;
38c0: 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71  .        c2 = sq
38d0: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50  lite3Utf8Read(zP
38e0: 61 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74  attern, 0, &zPat
38f0: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tern);.      }. 
3900: 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 26       while( c2 &
3910: 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20  & c2!=']' ){.   
3920: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27       if( c2=='-'
3930: 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 30 5d 21   && zPattern[0]!
3940: 3d 27 5d 27 20 26 26 20 7a 50 61 74 74 65 72 6e  =']' && zPattern
3950: 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f  [0]!=0 && prior_
3960: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
3970: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
3980: 38 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20  8Read(zPattern, 
3990: 30 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  0, &zPattern);. 
39a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
39b0: 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
39c0: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
39d0: 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
39e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
39f0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
3a00: 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c==c2 ){.      
3a10: 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
3a20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3a30: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
3a40: 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
3a50: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
3a60: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
3a70: 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65 72  ern, 0, &zPatter
3a80: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
3a90: 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28    if( c2==0 || (
3aa0: 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d  seen ^ invert)==
3ab0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
3ac0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
3ad0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 73 63     }else if( esc
3ae0: 3d 3d 63 20 26 26 20 21 70 72 65 76 45 73 63 61  ==c && !prevEsca
3af0: 70 65 20 29 7b 0a 20 20 20 20 20 20 70 72 65 76  pe ){.      prev
3b00: 45 73 63 61 70 65 20 3d 20 31 3b 0a 20 20 20 20  Escape = 1;.    
3b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 32 20  }else{.      c2 
3b20: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
3b30: 64 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a  d(zString, 0, &z
3b40: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 69  String);.      i
3b50: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
3b60: 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f       GlogUpperTo
3b70: 4c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20  Lower(c);.      
3b80: 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77    GlogUpperToLow
3b90: 65 72 28 63 32 29 3b 0a 20 20 20 20 20 20 7d 0a  er(c2);.      }.
3ba0: 20 20 20 20 20 20 69 66 28 20 63 21 3d 63 32 20        if( c!=c2 
3bb0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3bc0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
3bd0: 20 20 20 70 72 65 76 45 73 63 61 70 65 20 3d 20     prevEscape = 
3be0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
3bf0: 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d  eturn *zString==
3c00: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  0;.}../*.** Coun
3c10: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
3c20: 74 69 6d 65 73 20 74 68 61 74 20 74 68 65 20 4c  times that the L
3c30: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 28 6f 72  IKE operator (or
3c40: 20 47 4c 4f 42 20 77 68 69 63 68 20 69 73 0a 2a   GLOB which is.*
3c50: 2a 20 6a 75 73 74 20 61 20 76 61 72 69 61 74 69  * just a variati
3c60: 6f 6e 20 6f 66 20 4c 49 4b 45 29 20 67 65 74 73  on of LIKE) gets
3c70: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
3c80: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
3c90: 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  ng.** only..*/.#
3ca0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3cb0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  T.int sqlite3_li
3cc0: 6b 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  ke_count = 0;.#e
3cd0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ndif.../*.** Imp
3ce0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
3cf0: 68 65 20 6c 69 6b 65 28 29 20 53 51 4c 20 66 75  he like() SQL fu
3d00: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75  nction.  This fu
3d10: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
3d20: 73 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2d 69  s.** the build-i
3d30: 6e 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e  n LIKE operator.
3d40: 20 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75    The first argu
3d50: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
3d60: 74 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a 20 70  tion is the.** p
3d70: 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 73  attern and the s
3d80: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
3d90: 73 20 74 68 65 20 73 74 72 69 6e 67 2e 20 20 53  s the string.  S
3da0: 6f 2c 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  o, the SQL state
3db0: 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ments:.**.**    
3dc0: 20 20 20 41 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a     A LIKE B.**.*
3dd0: 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  * is implemented
3de0: 20 61 73 20 6c 69 6b 65 28 42 2c 41 29 2e 0a 2a   as like(B,A)..*
3df0: 2a 0a 2a 2a 20 54 68 69 73 20 73 61 6d 65 20 66  *.** This same f
3e00: 75 6e 63 74 69 6f 6e 20 28 77 69 74 68 20 61 20  unction (with a 
3e10: 64 69 66 66 65 72 65 6e 74 20 63 6f 6d 70 61 72  different compar
3e20: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 29  eInfo structure)
3e30: 20 63 6f 6d 70 75 74 65 73 0a 2a 2a 20 74 68 65   computes.** the
3e40: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 2e 0a   GLOB operator..
3e50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
3e60: 69 6b 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ikeFunc(.  sqlit
3e70: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3e80: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
3e90: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
3ea0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
3eb0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3ec0: 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b 0a 20 20 69  ar *zA, *zB;.  i
3ed0: 6e 74 20 65 73 63 61 70 65 20 3d 20 30 3b 0a 20  nt escape = 0;. 
3ee0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
3ef0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
3f00: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
3f10: 29 3b 0a 0a 20 20 7a 42 20 3d 20 73 71 6c 69 74  );..  zB = sqlit
3f20: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
3f30: 67 76 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20 73  gv[0]);.  zA = s
3f40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
3f50: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f  t(argv[1]);..  /
3f60: 2a 20 4c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67  * Limit the leng
3f70: 74 68 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f  th of the LIKE o
3f80: 72 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74  r GLOB pattern t
3f90: 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
3fa0: 0a 20 20 2a 2a 20 6f 66 20 64 65 65 70 20 72 65  .  ** of deep re
3fb0: 63 75 72 73 69 6f 6e 20 61 6e 64 20 4e 2a 4e 20  cursion and N*N 
3fc0: 62 65 68 61 76 69 6f 72 20 69 6e 20 70 61 74 74  behavior in patt
3fd0: 65 72 6e 43 6f 6d 70 61 72 65 28 29 2e 0a 20 20  ernCompare()..  
3fe0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
3ff0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
4000: 76 5b 30 5d 29 20 3e 0a 20 20 20 20 20 20 20 20  v[0]) >.        
4010: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4020: 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
4030: 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a  TERN_LENGTH] ){.
4040: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4050: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
4060: 2c 20 22 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20  , "LIKE or GLOB 
4070: 70 61 74 74 65 72 6e 20 74 6f 6f 20 63 6f 6d 70  pattern too comp
4080: 6c 65 78 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72  lex", -1);.    r
4090: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
40a0: 65 72 74 28 20 7a 42 3d 3d 73 71 6c 69 74 65 33  ert( zB==sqlite3
40b0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
40c0: 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 45 6e 63 6f  [0]) );  /* Enco
40d0: 64 69 6e 67 20 64 69 64 20 6e 6f 74 20 63 68 61  ding did not cha
40e0: 6e 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20 61 72  nge */..  if( ar
40f0: 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20  gc==3 ){.    /* 
4100: 54 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61  The escape chara
4110: 63 74 65 72 20 73 74 72 69 6e 67 20 6d 75 73 74  cter string must
4120: 20 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69   consist of a si
4130: 6e 67 6c 65 20 55 54 46 2d 38 20 63 68 61 72 61  ngle UTF-8 chara
4140: 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 74 68  cter..    ** Oth
4150: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
4160: 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  n error..    */.
4170: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
4180: 65 64 20 63 68 61 72 20 2a 7a 45 73 63 20 3d 20  ed char *zEsc = 
4190: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
41a0: 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  xt(argv[2]);.   
41b0: 20 69 66 28 20 7a 45 73 63 3d 3d 30 20 29 20 72   if( zEsc==0 ) r
41c0: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 73  eturn;.    if( s
41d0: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
41e0: 6e 28 28 63 68 61 72 2a 29 7a 45 73 63 2c 20 2d  n((char*)zEsc, -
41f0: 31 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  1)!=1 ){.      s
4200: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
4210: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20  ror(context, .  
4220: 20 20 20 20 20 20 20 20 22 45 53 43 41 50 45 20          "ESCAPE 
4230: 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
4240: 62 65 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72  be a single char
4250: 61 63 74 65 72 22 2c 20 2d 31 29 3b 0a 20 20 20  acter", -1);.   
4260: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
4270: 0a 20 20 20 20 65 73 63 61 70 65 20 3d 20 73 71  .    escape = sq
4280: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 45  lite3Utf8Read(zE
4290: 73 63 2c 20 30 2c 20 26 7a 45 73 63 29 3b 0a 20  sc, 0, &zEsc);. 
42a0: 20 7d 0a 20 20 69 66 28 20 7a 41 20 26 26 20 7a   }.  if( zA && z
42b0: 42 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  B ){.    struct 
42c0: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e  compareInfo *pIn
42d0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  fo = sqlite3_use
42e0: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
42f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4300: 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
4310: 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  like_count++;.#e
4320: 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20 73 71  ndif.    .    sq
4330: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
4340: 28 63 6f 6e 74 65 78 74 2c 20 70 61 74 74 65 72  (context, patter
4350: 6e 43 6f 6d 70 61 72 65 28 7a 42 2c 20 7a 41 2c  nCompare(zB, zA,
4360: 20 70 49 6e 66 6f 2c 20 65 73 63 61 70 65 29 29   pInfo, escape))
4370: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
4380: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
4390: 20 74 68 65 20 4e 55 4c 4c 49 46 28 78 2c 79 29   the NULLIF(x,y)
43a0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
43b0: 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69  result is the fi
43c0: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
43d0: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  if the arguments
43e0: 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
43f0: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   The result is N
4400: 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20 61 72  ULL if the.** ar
4410: 67 75 6d 65 6e 74 73 20 61 72 65 20 65 71 75 61  guments are equa
4420: 6c 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 2e  l to each other.
4430: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4440: 6e 75 6c 6c 69 66 46 75 6e 63 28 0a 20 20 73 71  nullifFunc(.  sq
4450: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
4460: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
4470: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
4480: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
4490: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
44a0: 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43   sqlite3GetFuncC
44b0: 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b  ollSeq(context);
44c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 65  .  if( sqlite3Me
44d0: 6d 43 6f 6d 70 61 72 65 28 61 72 67 76 5b 30 5d  mCompare(argv[0]
44e0: 2c 20 61 72 67 76 5b 31 5d 2c 20 70 43 6f 6c 6c  , argv[1], pColl
44f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4500: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
4510: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30  (context, argv[0
4520: 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ]);.  }.}../*.**
4530: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
4540: 6f 66 20 74 68 65 20 56 45 52 53 49 4f 4e 28 2a  of the VERSION(*
4550: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  ) function.  The
4560: 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
4570: 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  ersion.** of the
4580: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
4590: 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  that is running.
45a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
45b0: 76 65 72 73 69 6f 6e 46 75 6e 63 28 0a 20 20 73  versionFunc(.  s
45c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
45d0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
45e0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
45f0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
4600: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4610: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  text(context, sq
4620: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 20 2d  lite3_version, -
4630: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
4640: 29 3b 0a 7d 0a 0a 2f 2a 20 41 72 72 61 79 20 66  );.}../* Array f
4650: 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72  or converting fr
4660: 6f 6d 20 68 61 6c 66 2d 62 79 74 65 73 20 28 6e  om half-bytes (n
4670: 79 62 62 6c 65 73 29 20 69 6e 74 6f 20 41 53 43  ybbles) into ASC
4680: 49 49 20 68 65 78 0a 2a 2a 20 64 69 67 69 74 73  II hex.** digits
4690: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  . */.static cons
46a0: 74 20 63 68 61 72 20 68 65 78 64 69 67 69 74 73  t char hexdigits
46b0: 5b 5d 20 3d 20 7b 0a 20 20 27 30 27 2c 20 27 31  [] = {.  '0', '1
46c0: 27 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34 27  ', '2', '3', '4'
46d0: 2c 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27 2c  , '5', '6', '7',
46e0: 0a 20 20 27 38 27 2c 20 27 39 27 2c 20 27 41 27  .  '8', '9', 'A'
46f0: 2c 20 27 42 27 2c 20 27 43 27 2c 20 27 44 27 2c  , 'B', 'C', 'D',
4700: 20 27 45 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f   'E', 'F' .};../
4710: 2a 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41  *.** EXPERIMENTA
4720: 4c 20 2d 20 54 68 69 73 20 69 73 20 6e 6f 74 20  L - This is not 
4730: 61 6e 20 6f 66 66 69 63 69 61 6c 20 66 75 6e 63  an official func
4740: 74 69 6f 6e 2e 20 20 54 68 65 20 69 6e 74 65 72  tion.  The inter
4750: 66 61 63 65 20 6d 61 79 0a 2a 2a 20 63 68 61 6e  face may.** chan
4760: 67 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  ge.  This functi
4770: 6f 6e 20 6d 61 79 20 64 69 73 61 70 70 65 61 72  on may disappear
4780: 2e 20 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20  .  Do not write 
4790: 63 6f 64 65 20 74 68 61 74 20 64 65 70 65 6e 64  code that depend
47a0: 73 0a 2a 2a 20 6f 6e 20 74 68 69 73 20 66 75 6e  s.** on this fun
47b0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70  ction..**.** Imp
47c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
47d0: 68 65 20 51 55 4f 54 45 28 29 20 66 75 6e 63 74  he QUOTE() funct
47e0: 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ion.  This funct
47f0: 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67  ion takes a sing
4800: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  le.** argument. 
4810: 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   If the argument
4820: 20 69 73 20 6e 75 6d 65 72 69 63 2c 20 74 68 65   is numeric, the
4830: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
4840: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20   the same as.** 
4850: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  the argument.  I
4860: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
4870: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 74 75  s NULL, the retu
4880: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
4890: 73 74 72 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22  string.** "NULL"
48a0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  .  Otherwise, th
48b0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 6e  e argument is en
48c0: 63 6c 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65  closed in single
48d0: 20 71 75 6f 74 65 73 20 77 69 74 68 0a 2a 2a 20   quotes with.** 
48e0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 20 65 73 63  single-quote esc
48f0: 61 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  apes..*/.static 
4900: 76 6f 69 64 20 71 75 6f 74 65 46 75 6e 63 28 73  void quoteFunc(s
4910: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
4920: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
4930: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
4940: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 66 28 20   **argv){.  if( 
4950: 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b  argc<1 ) return;
4960: 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74  .  switch( sqlit
4970: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
4980: 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61  gv[0]) ){.    ca
4990: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
49a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
49b0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
49c0: 65 78 74 2c 20 22 4e 55 4c 4c 22 2c 20 34 2c 20  ext, "NULL", 4, 
49d0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
49e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
49f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
4a00: 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TE_INTEGER:.    
4a10: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
4a20: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
4a30: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
4a40: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
4a50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4a60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4a70: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
4a80: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20      char *zText 
4a90: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
4aa0: 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73  const *zBlob = s
4ab0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
4ac0: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
4ad0: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
4ae0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
4af0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
4b00: 20 20 61 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d    assert( zBlob=
4b10: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  =sqlite3_value_b
4b20: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  lob(argv[0]) ); 
4b30: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
4b40: 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 7a  hange */.      z
4b50: 54 65 78 74 20 3d 20 28 63 68 61 72 20 2a 29 63  Text = (char *)c
4b60: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
4b70: 74 65 78 74 2c 20 28 32 2a 28 69 36 34 29 6e 42  text, (2*(i64)nB
4b80: 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20 20 20 20  lob)+4); .      
4b90: 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
4ba0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
4bb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
4bc0: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Blob; i++){.    
4bd0: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32        zText[(i*2
4be0: 29 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73  )+2] = hexdigits
4bf0: 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30  [(zBlob[i]>>4)&0
4c00: 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x0F];.          
4c10: 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d  zText[(i*2)+3] =
4c20: 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f   hexdigits[(zBlo
4c30: 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20  b[i])&0x0F];.   
4c40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
4c50: 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32  Text[(nBlob*2)+2
4c60: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
4c70: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
4c80: 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  )+3] = '\0';.   
4c90: 20 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20       zText[0] = 
4ca0: 27 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  'X';.        zTe
4cb0: 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  xt[1] = '\'';.  
4cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4cd0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
4ce0: 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51  t, zText, -1, SQ
4cf0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4d00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4d10: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
4d20: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
4d30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4d40: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
4d50: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a  .      int i,j;.
4d60: 20 20 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20        u64 n;.   
4d70: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
4d80: 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73  d char *zArg = s
4d90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4da0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
4db0: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20    char *z;..    
4dc0: 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20    if( zArg==0 ) 
4dd0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
4de0: 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67  r(i=0, n=0; zArg
4df0: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a  [i]; i++){ if( z
4e00: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  Arg[i]=='\'' ) n
4e10: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20  ++; }.      z = 
4e20: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
4e30: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 69 29 2b  ntext, ((i64)i)+
4e40: 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a 20 20 20  ((i64)n)+3);.   
4e50: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
4e60: 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b      z[0] = '\'';
4e70: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
4e80: 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20  , j=1; zArg[i]; 
4e90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
4ea0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d  z[j++] = zArg[i]
4eb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4ec0: 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  zArg[i]=='\'' ){
4ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  .            z[j
4ee0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
4ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4f00: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  }.        z[j++]
4f10: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
4f20: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
4f30: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4f40: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
4f50: 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  z, j, sqlite3_fr
4f60: 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ee);.      }.   
4f70: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4f80: 54 68 65 20 68 65 78 28 29 20 66 75 6e 63 74 69  The hex() functi
4f90: 6f 6e 2e 20 20 49 6e 74 65 72 70 72 65 74 20 74  on.  Interpret t
4fa0: 68 65 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61  he argument as a
4fb0: 20 62 6c 6f 62 2e 20 20 52 65 74 75 72 6e 0a 2a   blob.  Return.*
4fc0: 2a 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20  * a hexadecimal 
4fd0: 72 65 6e 64 65 72 69 6e 67 20 61 73 20 74 65 78  rendering as tex
4fe0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4ff0: 64 20 68 65 78 46 75 6e 63 28 0a 20 20 73 71 6c  d hexFunc(.  sql
5000: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
5010: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
5020: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
5030: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
5040: 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74  nt i, n;.  const
5050: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5060: 70 42 6c 6f 62 3b 0a 20 20 63 68 61 72 20 2a 7a  pBlob;.  char *z
5070: 48 65 78 2c 20 2a 7a 3b 0a 20 20 61 73 73 65 72  Hex, *z;.  asser
5080: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
5090: 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
50a0: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
50b0: 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  0]);.  n = sqlit
50c0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
50d0: 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[0]);.  asser
50e0: 74 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65  t( pBlob==sqlite
50f0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
5100: 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20  v[0]) );  /* No 
5110: 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20  encoding change 
5120: 2a 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20  */.  z = zHex = 
5130: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
5140: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2a  ntext, ((i64)n)*
5150: 32 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a 48  2 + 1);.  if( zH
5160: 65 78 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ex ){.    for(i=
5170: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42 6c  0; i<n; i++, pBl
5180: 6f 62 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73  ob++){.      uns
5190: 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 2a  igned char c = *
51a0: 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 2a 28 7a  pBlob;.      *(z
51b0: 2b 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b  ++) = hexdigits[
51c0: 28 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20  (c>>4)&0xf];.   
51d0: 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64     *(z++) = hexd
51e0: 69 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a 20 20  igits[c&0xf];.  
51f0: 20 20 7d 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a    }.    *z = 0;.
5200: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5210: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
5220: 20 7a 48 65 78 2c 20 6e 2a 32 2c 20 73 71 6c 69   zHex, n*2, sqli
5230: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d  te3_free);.  }.}
5240: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a 65 72 6f  ../*.** The zero
5250: 62 6c 6f 62 28 4e 29 20 66 75 6e 63 74 69 6f 6e  blob(N) function
5260: 20 72 65 74 75 72 6e 73 20 61 20 7a 65 72 6f 2d   returns a zero-
5270: 66 69 6c 6c 65 64 20 62 6c 6f 62 20 6f 66 20 73  filled blob of s
5280: 69 7a 65 20 4e 20 62 79 74 65 73 2e 0a 2a 2f 0a  ize N bytes..*/.
5290: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
52a0: 62 6c 6f 62 46 75 6e 63 28 0a 20 20 73 71 6c 69  blobFunc(.  sqli
52b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
52c0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
52d0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
52e0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 36  e **argv.){.  i6
52f0: 34 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61  4 n;.  assert( a
5300: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20  rgc==1 );.  n = 
5310: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
5320: 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t64(argv[0]);.  
5330: 69 66 28 20 6e 3e 53 51 4c 49 54 45 5f 4d 41 58  if( n>SQLITE_MAX
5340: 5f 4c 45 4e 47 54 48 20 29 7b 0a 20 20 20 20 73  _LENGTH ){.    s
5350: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5360: 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65  ror_toobig(conte
5370: 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  xt);.  }else{.  
5380: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5390: 5f 7a 65 72 6f 62 6c 6f 62 28 63 6f 6e 74 65 78  _zeroblob(contex
53a0: 74 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, n);.  }.}../*
53b0: 0a 2a 2a 20 54 68 65 20 72 65 70 6c 61 63 65 28  .** The replace(
53c0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 72  ) function.  Thr
53d0: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ee arguments are
53e0: 20 61 6c 6c 20 73 74 72 69 6e 67 73 3a 20 63 61   all strings: ca
53f0: 6c 6c 0a 2a 2a 20 74 68 65 6d 20 41 2c 20 42 2c  ll.** them A, B,
5400: 20 61 6e 64 20 43 2e 20 54 68 65 20 72 65 73 75   and C. The resu
5410: 6c 74 20 69 73 20 61 6c 73 6f 20 61 20 73 74 72  lt is also a str
5420: 69 6e 67 20 77 68 69 63 68 20 69 73 20 64 65 72  ing which is der
5430: 69 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 41 20 62  ived.** from A b
5440: 79 20 72 65 70 6c 61 63 69 6e 67 20 65 76 65 72  y replacing ever
5450: 79 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 42  y occurance of B
5460: 20 77 69 74 68 20 43 2e 20 20 54 68 65 20 6d 61   with C.  The ma
5470: 74 63 68 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  tch.** must be e
5480: 78 61 63 74 2e 20 20 43 6f 6c 6c 61 74 69 6e 67  xact.  Collating
5490: 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 6e   sequences are n
54a0: 6f 74 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  ot used..*/.stat
54b0: 69 63 20 76 6f 69 64 20 72 65 70 6c 61 63 65 46  ic void replaceF
54c0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
54d0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
54e0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
54f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5500: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
5510: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
5520: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  tr;        /* Th
5530: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 41  e input string A
5540: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
5550: 67 6e 65 64 20 63 68 61 72 20 2a 7a 50 61 74 74  gned char *zPatt
5560: 65 72 6e 3b 20 20 20 20 2f 2a 20 54 68 65 20 70  ern;    /* The p
5570: 61 74 74 65 72 6e 20 73 74 72 69 6e 67 20 42 20  attern string B 
5580: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  */.  const unsig
5590: 6e 65 64 20 63 68 61 72 20 2a 7a 52 65 70 3b 20  ned char *zRep; 
55a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
55b0: 70 6c 61 63 65 6d 65 6e 74 20 73 74 72 69 6e 67  placement string
55c0: 20 43 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64   C */.  unsigned
55d0: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20   char *zOut;    
55e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
55f0: 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
5600: 20 6e 53 74 72 3b 20 20 20 20 20 20 20 20 20 20   nStr;          
5610: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
5620: 20 7a 53 74 72 20 2a 2f 0a 20 20 69 6e 74 20 6e   zStr */.  int n
5630: 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20  Pattern;        
5640: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
5650: 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74  Pattern */.  int
5660: 20 6e 52 65 70 3b 20 20 20 20 20 20 20 20 20 20   nRep;          
5670: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
5680: 20 7a 52 65 70 20 2a 2f 0a 20 20 69 36 34 20 6e   zRep */.  i64 n
5690: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
56a0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 73      /* Maximum s
56b0: 69 7a 65 20 6f 66 20 7a 4f 75 74 20 2a 2f 0a 20  ize of zOut */. 
56c0: 20 69 6e 74 20 6c 6f 6f 70 4c 69 6d 69 74 3b 20   int loopLimit; 
56d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
56e0: 74 20 7a 53 74 72 5b 5d 20 74 68 61 74 20 6d 69  t zStr[] that mi
56f0: 67 68 74 20 6d 61 74 63 68 20 7a 50 61 74 74 65  ght match zPatte
5700: 72 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  rn[] */.  int i,
5710: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
5720: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
5730: 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ers */..  assert
5740: 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 7a  ( argc==3 );.  z
5750: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Str = sqlite3_va
5760: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5770: 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 3d 3d 30  );.  if( zStr==0
5780: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 53 74   ) return;.  nSt
5790: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
57a0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
57b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 74 72  ;.  assert( zStr
57c0: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
57d0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b  text(argv[0]) );
57e0: 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67    /* No encoding
57f0: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 50 61   change */.  zPa
5800: 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ttern = sqlite3_
5810: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5820: 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74  1]);.  if( zPatt
5830: 65 72 6e 3d 3d 30 20 7c 7c 20 7a 50 61 74 74 65  ern==0 || zPatte
5840: 72 6e 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72  rn[0]==0 ) retur
5850: 6e 3b 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20  n;.  nPattern = 
5860: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5870: 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  tes(argv[1]);.  
5880: 61 73 73 65 72 74 28 20 7a 50 61 74 74 65 72 6e  assert( zPattern
5890: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
58a0: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 20 29 3b  text(argv[1]) );
58b0: 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67    /* No encoding
58c0: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65   change */.  zRe
58d0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  p = sqlite3_valu
58e0: 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b  e_text(argv[2]);
58f0: 0a 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29  .  if( zRep==0 )
5900: 20 72 65 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20   return;.  nRep 
5910: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5920: 62 79 74 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a  bytes(argv[2]);.
5930: 20 20 61 73 73 65 72 74 28 20 7a 52 65 70 3d 3d    assert( zRep==
5940: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5950: 78 74 28 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20  xt(argv[2]) );. 
5960: 20 6e 4f 75 74 20 3d 20 6e 53 74 72 20 2b 20 31   nOut = nStr + 1
5970: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74  ;.  assert( nOut
5980: 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  <SQLITE_MAX_LENG
5990: 54 48 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63  TH );.  zOut = c
59a0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
59b0: 74 65 78 74 2c 20 28 69 36 34 29 6e 4f 75 74 29  text, (i64)nOut)
59c0: 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20  ;.  if( zOut==0 
59d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
59e0: 20 7d 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d   }.  loopLimit =
59f0: 20 6e 53 74 72 20 2d 20 6e 50 61 74 74 65 72 6e   nStr - nPattern
5a00: 3b 20 20 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ;  .  for(i=j=0;
5a10: 20 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69   i<=loopLimit; i
5a20: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 74  ++){.    if( zSt
5a30: 72 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30  r[i]!=zPattern[0
5a40: 5d 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74  ] || memcmp(&zSt
5a50: 72 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20  r[i], zPattern, 
5a60: 6e 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20 20  nPattern) ){.   
5a70: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a     zOut[j++] = z
5a80: 53 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  Str[i];.    }els
5a90: 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 7a 4f 6c  e{.      u8 *zOl
5aa0: 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
5ab0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
5ac0: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
5ad0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
5ae0: 20 6e 4f 75 74 20 2b 3d 20 6e 52 65 70 20 2d 20   nOut += nRep - 
5af0: 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  nPattern;.      
5b00: 69 66 28 20 6e 4f 75 74 3e 3d 64 62 2d 3e 61 4c  if( nOut>=db->aL
5b10: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5b20: 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
5b30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5b40: 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67  ult_error_toobig
5b50: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
5b60: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5b70: 28 64 62 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  (db, zOut);.    
5b80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
5b90: 20 20 7d 0a 20 20 20 20 20 20 7a 4f 6c 64 20 3d    }.      zOld =
5ba0: 20 7a 4f 75 74 3b 0a 20 20 20 20 20 20 7a 4f 75   zOut;.      zOu
5bb0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  t = sqlite3_real
5bc0: 6c 6f 63 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e  loc(zOut, (int)n
5bd0: 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Out);.      if( 
5be0: 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zOut==0 ){.     
5bf0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5c00: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
5c10: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
5c20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5c30: 2c 20 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20  , zOld);.       
5c40: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
5c50: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  .      memcpy(&z
5c60: 4f 75 74 5b 6a 5d 2c 20 7a 52 65 70 2c 20 6e 52  Out[j], zRep, nR
5c70: 65 70 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d 20  ep);.      j += 
5c80: 6e 52 65 70 3b 0a 20 20 20 20 20 20 69 20 2b 3d  nRep;.      i +=
5c90: 20 6e 50 61 74 74 65 72 6e 2d 31 3b 0a 20 20 20   nPattern-1;.   
5ca0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
5cb0: 20 6a 2b 6e 53 74 72 2d 69 2b 31 3d 3d 6e 4f 75   j+nStr-i+1==nOu
5cc0: 74 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a  t );.  memcpy(&z
5cd0: 4f 75 74 5b 6a 5d 2c 20 26 7a 53 74 72 5b 69 5d  Out[j], &zStr[i]
5ce0: 2c 20 6e 53 74 72 2d 69 29 3b 0a 20 20 6a 20 2b  , nStr-i);.  j +
5cf0: 3d 20 6e 53 74 72 20 2d 20 69 3b 0a 20 20 61 73  = nStr - i;.  as
5d00: 73 65 72 74 28 20 6a 3c 3d 6e 4f 75 74 20 29 3b  sert( j<=nOut );
5d10: 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a  .  zOut[j] = 0;.
5d20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5d30: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
5d40: 63 68 61 72 2a 29 7a 4f 75 74 2c 20 6a 2c 20 73  char*)zOut, j, s
5d50: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a  qlite3_free);.}.
5d60: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
5d70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 52 49  ation of the TRI
5d80: 4d 28 29 2c 20 4c 54 52 49 4d 28 29 2c 20 61 6e  M(), LTRIM(), an
5d90: 64 20 52 54 52 49 4d 28 29 20 66 75 6e 63 74 69  d RTRIM() functi
5da0: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 75 73 65 72  ons..** The user
5db0: 64 61 74 61 20 69 73 20 30 78 31 20 66 6f 72 20  data is 0x1 for 
5dc0: 6c 65 66 74 20 74 72 69 6d 2c 20 30 78 32 20 66  left trim, 0x2 f
5dd0: 6f 72 20 72 69 67 68 74 20 74 72 69 6d 2c 20 30  or right trim, 0
5de0: 78 33 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  x3 for both..*/.
5df0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 69 6d  static void trim
5e00: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
5e10: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
5e20: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
5e30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5e40: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
5e50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
5e60: 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  In;         /* I
5e70: 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  nput string */. 
5e80: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5e90: 63 68 61 72 20 2a 7a 43 68 61 72 53 65 74 3b 20  char *zCharSet; 
5ea0: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 63 68 61     /* Set of cha
5eb0: 72 61 63 74 65 72 73 20 74 6f 20 74 72 69 6d 20  racters to trim 
5ec0: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 3b 20 20 20  */.  int nIn;   
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5ef0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 69 6e 70   of bytes in inp
5f00: 75 74 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ut */.  int flag
5f10: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
5f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
5f30: 74 72 69 6d 6c 65 66 74 20 20 32 3a 20 74 72 69  trimleft  2: tri
5f40: 6d 72 69 67 68 74 20 20 33 3a 20 74 72 69 6d 20  mright  3: trim 
5f50: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f70: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5f80: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
5f90: 67 6e 65 64 20 63 68 61 72 20 2a 61 4c 65 6e 3b  gned char *aLen;
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5fb0: 20 4c 65 6e 67 74 68 20 6f 66 20 65 61 63 68 20   Length of each 
5fc0: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 43 68  character in zCh
5fd0: 61 72 53 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  arSet */.  unsig
5fe0: 6e 65 64 20 63 68 61 72 20 2a 2a 61 7a 43 68 61  ned char **azCha
5ff0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
6000: 49 6e 64 69 76 69 64 75 61 6c 20 63 68 61 72 61  Individual chara
6010: 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65  cters in zCharSe
6020: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61 72  t */.  int nChar
6030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6040: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6050: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
6060: 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a   in zCharSet */.
6070: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
6080: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
6090: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
60a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
60b0: 20 7d 0a 20 20 7a 49 6e 20 3d 20 73 71 6c 69 74   }.  zIn = sqlit
60c0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
60d0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49  gv[0]);.  if( zI
60e0: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
60f0: 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76   nIn = sqlite3_v
6100: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
6110: 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0]);.  assert( z
6120: 49 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  In==sqlite3_valu
6130: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20  e_text(argv[0]) 
6140: 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31  );.  if( argc==1
6150: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
6160: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
6170: 61 72 20 6c 65 6e 4f 6e 65 5b 5d 20 3d 20 7b 20  ar lenOne[] = { 
6180: 31 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20  1 };.    static 
6190: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
61a0: 68 61 72 20 2a 61 7a 4f 6e 65 5b 5d 20 3d 20 7b  har *azOne[] = {
61b0: 20 28 75 38 2a 29 22 20 22 20 7d 3b 0a 20 20 20   (u8*)" " };.   
61c0: 20 6e 43 68 61 72 20 3d 20 31 3b 0a 20 20 20 20   nChar = 1;.    
61d0: 61 4c 65 6e 20 3d 20 28 75 38 2a 29 6c 65 6e 4f  aLen = (u8*)lenO
61e0: 6e 65 3b 0a 20 20 20 20 61 7a 43 68 61 72 20 3d  ne;.    azChar =
61f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
6200: 2a 2a 29 61 7a 4f 6e 65 3b 0a 20 20 20 20 7a 43  **)azOne;.    zC
6210: 68 61 72 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  harSet = 0;.  }e
6220: 6c 73 65 20 69 66 28 20 28 7a 43 68 61 72 53 65  lse if( (zCharSe
6230: 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
6240: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 29  e_text(argv[1]))
6250: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6260: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
6270: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
6280: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 66 6f 72 28  har *z;.    for(
6290: 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43 68 61  z=zCharSet, nCha
62a0: 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b  r=0; *z; nChar++
62b0: 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ){.      SQLITE_
62c0: 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20  SKIP_UTF8(z);.  
62d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 68 61    }.    if( nCha
62e0: 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 7a 43  r>0 ){.      azC
62f0: 68 61 72 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c  har = contextMal
6300: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69  loc(context, ((i
6310: 36 34 29 6e 43 68 61 72 29 2a 28 73 69 7a 65 6f  64)nChar)*(sizeo
6320: 66 28 63 68 61 72 2a 29 2b 31 29 29 3b 0a 20 20  f(char*)+1));.  
6330: 20 20 20 20 69 66 28 20 61 7a 43 68 61 72 3d 3d      if( azChar==
6340: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
6350: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
6360: 20 20 20 61 4c 65 6e 20 3d 20 28 75 6e 73 69 67     aLen = (unsig
6370: 6e 65 64 20 63 68 61 72 2a 29 26 61 7a 43 68 61  ned char*)&azCha
6380: 72 5b 6e 43 68 61 72 5d 3b 0a 20 20 20 20 20 20  r[nChar];.      
6390: 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20  for(z=zCharSet, 
63a0: 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68  nChar=0; *z; nCh
63b0: 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  ar++){.        a
63c0: 7a 43 68 61 72 5b 6e 43 68 61 72 5d 20 3d 20 28  zChar[nChar] = (
63d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
63e0: 7a 3b 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  z;.        SQLIT
63f0: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a  E_SKIP_UTF8(z);.
6400: 20 20 20 20 20 20 20 20 61 4c 65 6e 5b 6e 43 68          aLen[nCh
6410: 61 72 5d 20 3d 20 7a 20 2d 20 61 7a 43 68 61 72  ar] = z - azChar
6420: 5b 6e 43 68 61 72 5d 3b 0a 20 20 20 20 20 20 7d  [nChar];.      }
6430: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6440: 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20   nChar>0 ){.    
6450: 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 50  flags = SQLITE_P
6460: 54 52 5f 54 4f 5f 49 4e 54 28 73 71 6c 69 74 65  TR_TO_INT(sqlite
6470: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
6480: 65 78 74 29 29 3b 0a 20 20 20 20 69 66 28 20 66  ext));.    if( f
6490: 6c 61 67 73 20 26 20 31 20 29 7b 0a 20 20 20 20  lags & 1 ){.    
64a0: 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29    while( nIn>0 )
64b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
64c0: 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  n;.        for(i
64d0: 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
64e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
64f0: 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20   = aLen[i];.    
6500: 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
6510: 28 7a 49 6e 2c 20 61 7a 43 68 61 72 5b 69 5d 2c  (zIn, azChar[i],
6520: 20 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b   len)==0 ) break
6530: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6540: 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72      if( i>=nChar
6550: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6560: 20 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20    zIn += len;.  
6570: 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e        nIn -= len
6580: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6590: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
65a0: 32 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  2 ){.      while
65b0: 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  ( nIn>0 ){.     
65c0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
65d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
65e0: 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Char; i++){.    
65f0: 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e        len = aLen
6600: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
6610: 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d  f( len<=nIn && m
6620: 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c  emcmp(&zIn[nIn-l
6630: 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65  en],azChar[i],le
6640: 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  n)==0 ) break;. 
6650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6660: 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20   if( i>=nChar ) 
6670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e  break;.        n
6680: 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  In -= len;.     
6690: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
66a0: 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20   zCharSet ){.   
66b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
66c0: 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20  azChar);.    }. 
66d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
66e0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
66f0: 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49  , (char*)zIn, nI
6700: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
6710: 45 4e 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  ENT);.}..#ifdef 
6720: 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 2f  SQLITE_SOUNDEX./
6730: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
6740: 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e   soundex encodin
6750: 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2f 0a  g of a word..*/.
6760: 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 6e  static void soun
6770: 64 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  dexFunc(.  sqlit
6780: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6790: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
67a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
67b0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61   **argv.){.  cha
67c0: 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20  r zResult[8];.  
67d0: 63 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20  const u8 *zIn;. 
67e0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61   int i, j;.  sta
67f0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
6800: 65 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d 20  ed char iCode[] 
6810: 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c  = {.    0, 0, 0,
6820: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6830: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6840: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30  , 0, 0,.    0, 0
6850: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6860: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6870: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
6880: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6890: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
68a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
68b0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
68c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
68d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
68e0: 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c   0,.    0, 0, 1,
68f0: 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20   2, 3, 0, 1, 2, 
6900: 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35  0, 0, 2, 2, 4, 5
6910: 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32  , 5, 0,.    1, 2
6920: 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c  , 6, 2, 3, 0, 1,
6930: 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20   0, 2, 0, 2, 0, 
6940: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
6950: 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30  0, 0, 1, 2, 3, 0
6960: 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c  , 1, 2, 0, 0, 2,
6970: 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a   2, 4, 5, 5, 0,.
6980: 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20      1, 2, 6, 2, 
6990: 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30  3, 0, 1, 0, 2, 0
69a0: 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 2, 0, 0, 0, 0,
69b0: 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72   0,.  };.  asser
69c0: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
69d0: 7a 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69 74  zIn = (u8*)sqlit
69e0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
69f0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49  gv[0]);.  if( zI
6a00: 6e 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75 38  n==0 ) zIn = (u8
6a10: 2a 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  *)"";.  for(i=0;
6a20: 20 7a 49 6e 5b 69 5d 20 26 26 20 21 69 73 61 6c   zIn[i] && !isal
6a30: 70 68 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b  pha(zIn[i]); i++
6a40: 29 7b 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69 5d  ){}.  if( zIn[i]
6a50: 20 29 7b 0a 20 20 20 20 75 38 20 70 72 65 76 63   ){.    u8 prevc
6a60: 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b  ode = iCode[zIn[
6a70: 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 7a 52  i]&0x7f];.    zR
6a80: 65 73 75 6c 74 5b 30 5d 20 3d 20 74 6f 75 70 70  esult[0] = toupp
6a90: 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20  er(zIn[i]);.    
6aa0: 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20  for(j=1; j<4 && 
6ab0: 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  zIn[i]; i++){.  
6ac0: 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 69      int code = i
6ad0: 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66  Code[zIn[i]&0x7f
6ae0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64  ];.      if( cod
6af0: 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  e>0 ){.        i
6b00: 66 28 20 63 6f 64 65 21 3d 70 72 65 76 63 6f 64  f( code!=prevcod
6b10: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
6b20: 72 65 76 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a  revcode = code;.
6b30: 20 20 20 20 20 20 20 20 20 20 7a 52 65 73 75 6c            zResul
6b40: 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20  t[j++] = code + 
6b50: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  '0';.        }. 
6b60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6b70: 20 20 20 20 70 72 65 76 63 6f 64 65 20 3d 20 30      prevcode = 0
6b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6b90: 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 34 20 29      while( j<4 )
6ba0: 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b  {.      zResult[
6bb0: 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20  j++] = '0';.    
6bc0: 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d  }.    zResult[j]
6bd0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
6be0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
6bf0: 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20  ntext, zResult, 
6c00: 34 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  4, SQLITE_TRANSI
6c10: 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ENT);.  }else{. 
6c20: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6c30: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6c40: 22 3f 30 30 30 22 2c 20 34 2c 20 53 51 4c 49 54  "?000", 4, SQLIT
6c50: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d  E_STATIC);.  }.}
6c60: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6c70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
6c80: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
6c90: 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  * A function tha
6ca0: 74 20 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64  t loads a shared
6cb0: 2d 6c 69 62 72 61 72 79 20 65 78 74 65 6e 73 69  -library extensi
6cc0: 6f 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  on then returns 
6cd0: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
6ce0: 76 6f 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c  void loadExt(sql
6cf0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6d00: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
6d10: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6d20: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
6d30: 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63  char *zFile = (c
6d40: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
6d50: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6d60: 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74  rgv[0]);.  const
6d70: 20 63 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20   char *zProc;.  
6d80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
6d90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
6da0: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
6db0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
6dc0: 67 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72  g = 0;..  if( ar
6dd0: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72  gc==2 ){.    zPr
6de0: 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  oc = (const char
6df0: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
6e00: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
6e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72    }else{.    zPr
6e20: 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  oc = 0;.  }.  if
6e30: 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c 69 74  ( zFile && sqlit
6e40: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
6e50: 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  n(db, zFile, zPr
6e60: 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20 29 7b  oc, &zErrMsg) ){
6e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
6e80: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
6e90: 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b  t, zErrMsg, -1);
6ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6eb0: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  e(zErrMsg);.  }.
6ec0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
6ed0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
6ee0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
6ef0: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68  ructure holds th
6f00: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a  e context of a.*
6f10: 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29  * sum() or avg()
6f20: 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75   aggregate compu
6f30: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  tation..*/.typed
6f40: 65 66 20 73 74 72 75 63 74 20 53 75 6d 43 74 78  ef struct SumCtx
6f50: 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20   SumCtx;.struct 
6f60: 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c  SumCtx {.  doubl
6f70: 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20  e rSum;      /* 
6f80: 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73  Floating point s
6f90: 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d  um */.  i64 iSum
6fa0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
6fb0: 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20  eger sum */   . 
6fc0: 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20 20 20   i64 cnt;       
6fd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6fe0: 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20  elements summed 
6ff0: 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f 77  */.  u8 overflow
7000: 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
7010: 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c  f integer overfl
7020: 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20  ow seen */.  u8 
7030: 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20 20 2f  approx;        /
7040: 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e  * True if non-in
7050: 74 65 67 65 72 20 76 61 6c 75 65 20 77 61 73 20  teger value was 
7060: 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73 75 6d  input to the sum
7070: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f   */.};../*.** Ro
7080: 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63  utines used to c
7090: 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d 2c 20  ompute the sum, 
70a0: 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74 6f 74  average, and tot
70b0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55  al..**.** The SU
70c0: 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c  M() function fol
70d0: 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b 65 6e  lows the (broken
70e0: 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64 20 77  ) SQL standard w
70f0: 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  hich means.** th
7100: 61 74 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55  at it returns NU
7110: 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20 6f 76  LL if it sums ov
7120: 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54  er no inputs.  T
7130: 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20  OTAL returns.** 
7140: 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61 73 65  0.0 in that case
7150: 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20  .  In addition, 
7160: 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72 65 74  TOTAL always ret
7170: 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77 68 65  urns a float whe
7180: 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20  re.** SUM might 
7190: 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
71a0: 72 20 69 66 20 69 74 20 6e 65 76 65 72 20 65 6e  r if it never en
71b0: 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f 61 74  counters a float
71c0: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
71d0: 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65 72  ue.  TOTAL never
71e0: 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55 4d 20   fails, but SUM 
71f0: 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20 61 6e  might through an
7200: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a   exception if.**
7210: 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e   it overflows an
7220: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
7230: 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70  tic void sumStep
7240: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7250: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
7260: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
7270: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75  ue **argv){.  Su
7280: 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74  mCtx *p;.  int t
7290: 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ype;.  assert( a
72a0: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 70 20 3d 20  rgc==1 );.  p = 
72b0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
72c0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
72d0: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
72e0: 20 20 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33    type = sqlite3
72f0: 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74  _value_numeric_t
7300: 79 70 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ype(argv[0]);.  
7310: 69 66 28 20 70 20 26 26 20 74 79 70 65 21 3d 53  if( p && type!=S
7320: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
7330: 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20    p->cnt++;.    
7340: 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45  if( type==SQLITE
7350: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
7360: 20 20 69 36 34 20 76 20 3d 20 73 71 6c 69 74 65    i64 v = sqlite
7370: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
7380: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d  gv[0]);.      p-
7390: 3e 72 53 75 6d 20 2b 3d 20 76 3b 0a 20 20 20 20  >rSum += v;.    
73a0: 20 20 69 66 28 20 28 70 2d 3e 61 70 70 72 6f 78    if( (p->approx
73b0: 7c 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3d 3d 30  |p->overflow)==0
73c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
73d0: 69 4e 65 77 53 75 6d 20 3d 20 70 2d 3e 69 53 75  iNewSum = p->iSu
73e0: 6d 20 2b 20 76 3b 0a 20 20 20 20 20 20 20 20 69  m + v;.        i
73f0: 6e 74 20 73 31 20 3d 20 70 2d 3e 69 53 75 6d 20  nt s1 = p->iSum 
7400: 3e 3e 20 28 73 69 7a 65 6f 66 28 69 36 34 29 2a  >> (sizeof(i64)*
7410: 38 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  8-1);.        in
7420: 74 20 73 32 20 3d 20 76 20 20 20 20 20 20 20 3e  t s2 = v       >
7430: 3e 20 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38  > (sizeof(i64)*8
7440: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  -1);.        int
7450: 20 73 33 20 3d 20 69 4e 65 77 53 75 6d 20 3e 3e   s3 = iNewSum >>
7460: 20 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d   (sizeof(i64)*8-
7470: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f  1);.        p->o
7480: 76 65 72 66 6c 6f 77 20 3d 20 28 73 31 26 73 32  verflow = (s1&s2
7490: 26 7e 73 33 29 20 7c 20 28 7e 73 31 26 7e 73 32  &~s3) | (~s1&~s2
74a0: 26 73 33 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  &s3);.        p-
74b0: 3e 69 53 75 6d 20 3d 20 69 4e 65 77 53 75 6d 3b  >iSum = iNewSum;
74c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
74d0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  se{.      p->rSu
74e0: 6d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  m += sqlite3_val
74f0: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
7500: 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 70  ]);.      p->app
7510: 72 6f 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  rox = 1;.    }. 
7520: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
7530: 20 73 75 6d 46 69 6e 61 6c 69 7a 65 28 73 71 6c   sumFinalize(sql
7540: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7550: 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78  ntext){.  SumCtx
7560: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
7570: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
7580: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
7590: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
75a0: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  cnt>0 ){.    if(
75b0: 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 29 7b 0a   p->overflow ){.
75c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
75d0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
75e0: 78 74 2c 22 69 6e 74 65 67 65 72 20 6f 76 65 72  xt,"integer over
75f0: 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20 20 20 20 7d  flow",-1);.    }
7600: 65 6c 73 65 20 69 66 28 20 70 2d 3e 61 70 70 72  else if( p->appr
7610: 6f 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ox ){.      sqli
7620: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
7630: 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53  e(context, p->rS
7640: 75 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  um);.    }else{.
7650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7660: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
7670: 78 74 2c 20 70 2d 3e 69 53 75 6d 29 3b 0a 20 20  xt, p->iSum);.  
7680: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
7690: 20 76 6f 69 64 20 61 76 67 46 69 6e 61 6c 69 7a   void avgFinaliz
76a0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
76b0: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
76c0: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  umCtx *p;.  p = 
76d0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
76e0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
76f0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26  t, 0);.  if( p &
7700: 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20  & p->cnt>0 ){.  
7710: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7720: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
7730: 20 70 2d 3e 72 53 75 6d 2f 28 64 6f 75 62 6c 65   p->rSum/(double
7740: 29 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  )p->cnt);.  }.}.
7750: 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 74 61  static void tota
7760: 6c 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  lFinalize(sqlite
7770: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7780: 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70  xt){.  SumCtx *p
7790: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
77a0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
77b0: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
77c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
77d0: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
77e0: 70 20 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 30 2e  p ? p->rSum : 0.
77f0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  0);.}../*.** The
7800: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
7810: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
7820: 20 6f 66 20 73 74 61 74 65 20 69 6e 66 6f 72 6d   of state inform
7830: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a  ation for the.**
7840: 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61   count() aggrega
7850: 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  te function..*/.
7860: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
7870: 6f 75 6e 74 43 74 78 20 43 6f 75 6e 74 43 74 78  ountCtx CountCtx
7880: 3b 0a 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74  ;.struct CountCt
7890: 78 20 7b 0a 20 20 69 36 34 20 6e 3b 0a 7d 3b 0a  x {.  i64 n;.};.
78a0: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
78b0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
78c0: 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61   count() aggrega
78d0: 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  te function..*/.
78e0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e  static void coun
78f0: 74 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f  tStep(sqlite3_co
7900: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
7910: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
7920: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
7930: 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a  .  CountCtx *p;.
7940: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
7950: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
7960: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
7970: 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72 67  *p));.  if( (arg
7980: 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e  c==0 || SQLITE_N
7990: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
79a0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
79b0: 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d  ) && p ){.    p-
79c0: 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20 20 20 0a 73  >n++;.  }.}   .s
79d0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74  tatic void count
79e0: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
79f0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7a00: 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a  t){.  CountCtx *
7a10: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  p;.  p = sqlite3
7a20: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
7a30: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
7a40: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7a50: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
7a60: 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d  p ? p->n : 0);.}
7a70: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
7a80: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69   to implement mi
7a90: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67  n() and max() ag
7aa0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
7ab0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7ac0: 64 20 6d 69 6e 6d 61 78 53 74 65 70 28 73 71 6c  d minmaxStep(sql
7ad0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7ae0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
7af0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7b00: 2a 61 72 67 76 29 7b 0a 20 20 4d 65 6d 20 2a 70  *argv){.  Mem *p
7b10: 41 72 67 20 20 3d 20 28 4d 65 6d 20 2a 29 61 72  Arg  = (Mem *)ar
7b20: 67 76 5b 30 5d 3b 0a 20 20 4d 65 6d 20 2a 70 42  gv[0];.  Mem *pB
7b30: 65 73 74 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  est;..  if( sqli
7b40: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
7b50: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
7b60: 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20  NULL ) return;. 
7b70: 20 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29   pBest = (Mem *)
7b80: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
7b90: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
7ba0: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73 74  t, sizeof(*pBest
7bb0: 29 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73 74  ));.  if( !pBest
7bc0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
7bd0: 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29  ( pBest->flags )
7be0: 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a 20  {.    int max;. 
7bf0: 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20 20     int cmp;.    
7c00: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
7c10: 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43   sqlite3GetFuncC
7c20: 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b  ollSeq(context);
7c30: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 65  .    /* This ste
7c40: 70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  p function is us
7c50: 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
7c60: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20  min() and max() 
7c70: 61 67 67 72 65 67 61 74 65 73 2c 0a 20 20 20 20  aggregates,.    
7c80: 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69 66 66  ** the only diff
7c90: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
7ca0: 68 65 20 74 77 6f 20 62 65 69 6e 67 20 74 68 61  he two being tha
7cb0: 74 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20 74  t the sense of t
7cc0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  he.    ** compar
7cd0: 69 73 6f 6e 20 69 73 20 69 6e 76 65 72 74 65 64  ison is inverted
7ce0: 2e 20 46 6f 72 20 74 68 65 20 6d 61 78 28 29 20  . For the max() 
7cf0: 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 0a 20  aggregate, the. 
7d00: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 73     ** sqlite3_us
7d10: 65 72 5f 64 61 74 61 28 29 20 66 75 6e 63 74 69  er_data() functi
7d20: 6f 6e 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64  on returns (void
7d30: 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28 29   *)-1. For min()
7d40: 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   it.    ** retur
7d50: 6e 73 20 28 76 6f 69 64 20 2a 29 64 62 2c 20 77  ns (void *)db, w
7d60: 68 65 72 65 20 64 62 20 69 73 20 74 68 65 20 73  here db is the s
7d70: 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65  qlite3* database
7d80: 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a   pointer..    **
7d90: 20 54 68 65 72 65 66 6f 72 65 20 74 68 65 20 6e   Therefore the n
7da0: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 73 65  ext statement se
7db0: 74 73 20 76 61 72 69 61 62 6c 65 20 27 6d 61 78  ts variable 'max
7dc0: 27 20 74 6f 20 31 20 66 6f 72 20 74 68 65 20 6d  ' to 1 for the m
7dd0: 61 78 28 29 0a 20 20 20 20 2a 2a 20 61 67 67 72  ax().    ** aggr
7de0: 65 67 61 74 65 2c 20 6f 72 20 30 20 66 6f 72 20  egate, or 0 for 
7df0: 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  min()..    */.  
7e00: 20 20 6d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f    max = sqlite3_
7e10: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
7e20: 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20 3d  t)!=0;.    cmp =
7e30: 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
7e40: 72 65 28 70 42 65 73 74 2c 20 70 41 72 67 2c 20  re(pBest, pArg, 
7e50: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pColl);.    if( 
7e60: 28 6d 61 78 20 26 26 20 63 6d 70 3c 30 29 20 7c  (max && cmp<0) |
7e70: 7c 20 28 21 6d 61 78 20 26 26 20 63 6d 70 3e 30  | (!max && cmp>0
7e80: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7e90: 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42  e3VdbeMemCopy(pB
7ea0: 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 20 20  est, pArg);.    
7eb0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
7ec0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
7ed0: 79 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a  y(pBest, pArg);.
7ee0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
7ef0: 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65  d minMaxFinalize
7f00: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7f10: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71   *context){.  sq
7f20: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
7f30: 73 3b 0a 20 20 70 52 65 73 20 3d 20 28 73 71 6c  s;.  pRes = (sql
7f40: 69 74 65 33 5f 76 61 6c 75 65 20 2a 29 73 71 6c  ite3_value *)sql
7f50: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
7f60: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
7f70: 30 29 3b 0a 20 20 69 66 28 20 70 52 65 73 20 29  0);.  if( pRes )
7f80: 7b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e  {.    if( pRes->
7f90: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 73  flags ){.      s
7fa0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
7fb0: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 70 52 65  lue(context, pRe
7fc0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  s);.    }.    sq
7fd0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
7fe0: 61 73 65 28 70 52 65 73 29 3b 0a 20 20 7d 0a 7d  ase(pRes);.  }.}
7ff0: 0a 0a 2f 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63 6f  ../*.** group_co
8000: 6e 63 61 74 28 45 58 50 52 2c 20 3f 53 45 50 41  ncat(EXPR, ?SEPA
8010: 52 41 54 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74 69  RATOR?).*/.stati
8020: 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63  c void groupConc
8030: 61 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  atStep(.  sqlite
8040: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
8050: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
8060: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8070: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
8080: 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20  t char *zVal;.  
8090: 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d  StrAccum *pAccum
80a0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
80b0: 7a 53 65 70 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  zSep;.  int nVal
80c0: 2c 20 6e 53 65 70 2c 20 69 3b 0a 20 20 69 66 28  , nSep, i;.  if(
80d0: 20 61 72 67 63 3d 3d 30 20 7c 7c 20 73 71 6c 69   argc==0 || sqli
80e0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
80f0: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
8100: 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20  NULL ) return;. 
8110: 20 70 41 63 63 75 6d 20 3d 20 28 53 74 72 41 63   pAccum = (StrAc
8120: 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  cum*)sqlite3_agg
8130: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
8140: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
8150: 70 41 63 63 75 6d 29 29 3b 0a 0a 20 20 69 66 28  pAccum));..  if(
8160: 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20 73   pAccum ){.    s
8170: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
8180: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
8190: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
81a0: 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 75 73 65  .    pAccum->use
81b0: 4d 61 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20  Malloc = 1;.    
81c0: 70 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20  pAccum->mxAlloc 
81d0: 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  = db->aLimit[SQL
81e0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
81f0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 41 63 63 75  ];.    if( pAccu
8200: 6d 2d 3e 6e 43 68 61 72 20 29 7b 0a 20 20 20 20  m->nChar ){.    
8210: 20 20 69 66 28 20 61 72 67 63 3e 31 20 29 7b 0a    if( argc>1 ){.
8220: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 28          zSep = (
8230: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
8240: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 61 72  lue_text(argv[ar
8250: 67 63 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  gc-1]);.        
8260: 6e 53 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76  nSep = sqlite3_v
8270: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
8280: 61 72 67 63 2d 31 5d 29 3b 0a 20 20 20 20 20 20  argc-1]);.      
8290: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
82a0: 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20  Sep = ",";.     
82b0: 20 20 20 6e 53 65 70 20 3d 20 31 3b 0a 20 20 20     nSep = 1;.   
82c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
82d0: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
82e0: 28 70 41 63 63 75 6d 2c 20 7a 53 65 70 2c 20 6e  (pAccum, zSep, n
82f0: 53 65 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sep);.    }.    
8300: 69 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20  i = 0;.    do{. 
8310: 20 20 20 20 20 7a 56 61 6c 20 3d 20 28 63 68 61       zVal = (cha
8320: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8330: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a  _text(argv[i]);.
8340: 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c        nVal = sql
8350: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8360: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20  (argv[i]);.     
8370: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
8380: 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a  Append(pAccum, z
8390: 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 20 20  Val, nVal);.    
83a0: 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 77 68 69 6c    i++;.    }whil
83b0: 65 28 20 69 3c 61 72 67 63 2d 31 20 29 3b 0a 20  e( i<argc-1 );. 
83c0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
83d0: 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61   groupConcatFina
83e0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
83f0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
8400: 20 20 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63    StrAccum *pAcc
8410: 75 6d 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20 73  um;.  pAccum = s
8420: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
8430: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
8440: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 41 63 63  , 0);.  if( pAcc
8450: 75 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  um ){.    if( pA
8460: 63 63 75 6d 2d 3e 74 6f 6f 42 69 67 20 29 7b 0a  ccum->tooBig ){.
8470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
8480: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
8490: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  g(context);.    
84a0: 7d 65 6c 73 65 20 69 66 28 20 70 41 63 63 75 6d  }else if( pAccum
84b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
84c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
84d0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
84e0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
84f0: 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20 20 20 20   }else{    .    
8500: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8510: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  _text(context, s
8520: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
8530: 6e 69 73 68 28 70 41 63 63 75 6d 29 2c 20 2d 31  nish(pAccum), -1
8540: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8560: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20  ite3_free);.    
8570: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
8580: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 67  his function reg
8590: 69 73 74 65 72 65 64 20 61 6c 6c 20 6f 66 20 74  istered all of t
85a0: 68 65 20 61 62 6f 76 65 20 43 20 66 75 6e 63 74  he above C funct
85b0: 69 6f 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66  ions as SQL.** f
85c0: 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  unctions.  This 
85d0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
85e0: 6c 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68  ly routine in th
85f0: 69 73 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20  is file with.** 
8600: 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65  external linkage
8610: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8620: 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
8630: 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65  Functions(sqlite
8640: 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
8650: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
8660: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
8670: 3b 0a 20 20 20 20 20 73 69 67 6e 65 64 20 63 68  ;.     signed ch
8680: 61 72 20 6e 41 72 67 3b 0a 20 20 20 20 20 75 38  ar nArg;.     u8
8690: 20 61 72 67 54 79 70 65 3b 20 20 20 20 20 20 20   argType;       
86a0: 20 20 20 20 2f 2a 20 31 3a 20 30 2c 20 32 3a 20      /* 1: 0, 2: 
86b0: 31 2c 20 33 3a 20 32 2c 2e 2e 2e 20 20 4e 3a 20  1, 3: 2,...  N: 
86c0: 20 4e 2d 31 2e 20 2a 2f 0a 20 20 20 20 20 75 38   N-1. */.     u8
86d0: 20 65 54 65 78 74 52 65 70 3b 20 20 20 20 20 20   eTextRep;      
86e0: 20 20 20 20 2f 2a 20 31 3a 20 55 54 46 2d 31 36      /* 1: UTF-16
86f0: 2e 20 20 30 3a 20 55 54 46 2d 38 20 2a 2f 0a 20  .  0: UTF-8 */. 
8700: 20 20 20 20 75 38 20 6e 65 65 64 43 6f 6c 6c 53      u8 needCollS
8710: 65 71 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a  eq;.     void (*
8720: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
8730: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8740: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 3b 0a 20  te3_value **);. 
8750: 20 7d 20 61 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a   } aFuncs[] = {.
8760: 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20      { "min",    
8770: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30             -1, 0
8780: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
8790: 20 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20    1, minmaxFunc 
87a0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20  },.    { "min", 
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
87c0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
87d0: 2c 20 20 20 20 31 2c 20 30 20 20 20 20 20 20 20  ,    1, 0       
87e0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78     },.    { "max
87f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
8800: 20 2d 31 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55   -1, 1, SQLITE_U
8810: 54 46 38 2c 20 20 20 20 31 2c 20 6d 69 6e 6d 61  TF8,    1, minma
8820: 78 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  xFunc },.    { "
8830: 6d 61 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  max",           
8840: 20 20 20 20 20 30 2c 20 31 2c 20 53 51 4c 49 54       0, 1, SQLIT
8850: 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 30 20  E_UTF8,    1, 0 
8860: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8870: 7b 20 22 74 79 70 65 6f 66 22 2c 20 20 20 20 20  { "typeof",     
8880: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51          1, 0, SQ
8890: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
88a0: 20 74 79 70 65 6f 66 46 75 6e 63 20 7d 2c 0a 20   typeofFunc },. 
88b0: 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20     { "length",  
88c0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
88d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
88e0: 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63 20 7d   0, lengthFunc }
88f0: 2c 0a 20 20 20 20 7b 20 22 73 75 62 73 74 72 22  ,.    { "substr"
8900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  ,             2,
8910: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
8920: 20 20 20 20 30 2c 20 73 75 62 73 74 72 46 75 6e      0, substrFun
8930: 63 20 7d 2c 0a 20 20 20 20 7b 20 22 73 75 62 73  c },.    { "subs
8940: 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  tr",            
8950: 20 33 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   3, 0, SQLITE_UT
8960: 46 38 2c 20 20 20 20 30 2c 20 73 75 62 73 74 72  F8,    0, substr
8970: 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 61  Func },.    { "a
8980: 62 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  bs",            
8990: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
89a0: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 61 62 73  _UTF8,    0, abs
89b0: 46 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b  Func    },.    {
89c0: 20 22 72 6f 75 6e 64 22 2c 20 20 20 20 20 20 20   "round",       
89d0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c         1, 0, SQL
89e0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
89f0: 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c 0a 20 20  roundFunc  },.  
8a00: 20 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 20 20    { "round",    
8a10: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
8a20: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
8a30: 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c  0, roundFunc  },
8a40: 0a 20 20 20 20 7b 20 22 75 70 70 65 72 22 2c 20  .    { "upper", 
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
8a60: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
8a70: 20 20 20 30 2c 20 75 70 70 65 72 46 75 6e 63 20     0, upperFunc 
8a80: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 77 65 72   },.    { "lower
8a90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
8aa0: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
8ab0: 38 2c 20 20 20 20 30 2c 20 6c 6f 77 65 72 46 75  8,    0, lowerFu
8ac0: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f  nc  },.    { "co
8ad0: 61 6c 65 73 63 65 22 2c 20 20 20 20 20 20 20 20  alesce",        
8ae0: 20 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f    -1, 0, SQLITE_
8af0: 55 54 46 38 2c 20 20 20 20 30 2c 20 69 66 6e 75  UTF8,    0, ifnu
8b00: 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  llFunc },.    { 
8b10: 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20 20 20  "coalesce",     
8b20: 20 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c 49        0, 0, SQLI
8b30: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 30  TE_UTF8,    0, 0
8b40: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8b50: 20 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20   { "coalesce",  
8b60: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
8b70: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
8b80: 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  , 0          },.
8b90: 20 20 20 20 7b 20 22 68 65 78 22 2c 20 20 20 20      { "hex",    
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
8bb0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
8bc0: 20 20 30 2c 20 68 65 78 46 75 6e 63 20 20 20 20    0, hexFunc    
8bd0: 7d 2c 0a 20 20 20 20 7b 20 22 69 66 6e 75 6c 6c  },.    { "ifnull
8be0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ",             2
8bf0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
8c00: 2c 20 20 20 20 31 2c 20 69 66 6e 75 6c 6c 46 75  ,    1, ifnullFu
8c10: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6e  nc },.    { "ran
8c20: 64 6f 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20  dom",           
8c30: 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55   -1, 0, SQLITE_U
8c40: 54 46 38 2c 20 20 20 20 30 2c 20 72 61 6e 64 6f  TF8,    0, rando
8c50: 6d 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  mFunc },.    { "
8c60: 72 61 6e 64 6f 6d 62 6c 6f 62 22 2c 20 20 20 20  randomblob",    
8c70: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
8c80: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 72 61  E_UTF8,    0, ra
8c90: 6e 64 6f 6d 42 6c 6f 62 20 7d 2c 0a 20 20 20 20  ndomBlob },.    
8ca0: 7b 20 22 6e 75 6c 6c 69 66 22 2c 20 20 20 20 20  { "nullif",     
8cb0: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51          2, 0, SQ
8cc0: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c  LITE_UTF8,    1,
8cd0: 20 6e 75 6c 6c 69 66 46 75 6e 63 20 7d 2c 0a 20   nullifFunc },. 
8ce0: 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 76 65 72     { "sqlite_ver
8cf0: 73 69 6f 6e 22 2c 20 20 20 20 20 30 2c 20 30 2c  sion",     0, 0,
8d00: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
8d10: 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 7d   0, versionFunc}
8d20: 2c 0a 20 20 20 20 7b 20 22 71 75 6f 74 65 22 2c  ,.    { "quote",
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
8d40: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
8d50: 20 20 20 20 30 2c 20 71 75 6f 74 65 46 75 6e 63      0, quoteFunc
8d60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 73 74    },.    { "last
8d70: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20  _insert_rowid", 
8d80: 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   0, 0, SQLITE_UT
8d90: 46 38 2c 20 30 2c 20 6c 61 73 74 5f 69 6e 73 65  F8, 0, last_inse
8da0: 72 74 5f 72 6f 77 69 64 20 7d 2c 0a 20 20 20 20  rt_rowid },.    
8db0: 7b 20 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20  { "changes",    
8dc0: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 53 51          0, 0, SQ
8dd0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 63 68  LITE_UTF8, 0, ch
8de0: 61 6e 67 65 73 20 20 20 20 20 20 20 20 20 20 20  anges           
8df0: 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74 61 6c 5f  },.    { "total_
8e00: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 30  changes",      0
8e10: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
8e20: 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61 6e 67  , 0, total_chang
8e30: 65 73 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  es     },.    { 
8e40: 22 72 65 70 6c 61 63 65 22 2c 20 20 20 20 20 20  "replace",      
8e50: 20 20 20 20 20 20 33 2c 20 30 2c 20 53 51 4c 49        3, 0, SQLI
8e60: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 72  TE_UTF8,    0, r
8e70: 65 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20  eplaceFunc      
8e80: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 74 72 69 6d   },.    { "ltrim
8e90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
8ea0: 31 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 1, SQLITE_UTF
8eb0: 38 2c 20 20 20 20 30 2c 20 74 72 69 6d 46 75 6e  8,    0, trimFun
8ec0: 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  c          },.  
8ed0: 20 20 7b 20 22 6c 74 72 69 6d 22 2c 20 20 20 20    { "ltrim",    
8ee0: 20 20 20 20 20 20 20 20 20 20 32 2c 20 31 2c 20            2, 1, 
8ef0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
8f00: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
8f10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
8f20: 74 72 69 6d 22 2c 20 20 20 20 20 20 20 20 20 20  trim",          
8f30: 20 20 20 20 31 2c 20 32 2c 20 53 51 4c 49 54 45      1, 2, SQLITE
8f40: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 74 72 69  _UTF8,    0, tri
8f50: 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d  mFunc          }
8f60: 2c 0a 20 20 20 20 7b 20 22 72 74 72 69 6d 22 2c  ,.    { "rtrim",
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
8f80: 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
8f90: 20 20 20 20 30 2c 20 74 72 69 6d 46 75 6e 63 20      0, trimFunc 
8fa0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8fb0: 7b 20 22 74 72 69 6d 22 2c 20 20 20 20 20 20 20  { "trim",       
8fc0: 20 20 20 20 20 20 20 20 31 2c 20 33 2c 20 53 51          1, 3, SQ
8fd0: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
8fe0: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
8ff0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 69     },.    { "tri
9000: 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  m",             
9010: 20 20 32 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55    2, 3, SQLITE_U
9020: 54 46 38 2c 20 20 20 20 30 2c 20 74 72 69 6d 46  TF8,    0, trimF
9030: 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  unc          },.
9040: 20 20 20 20 7b 20 22 7a 65 72 6f 62 6c 6f 62 22      { "zeroblob"
9050: 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30  ,           1, 0
9060: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
9070: 20 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46 75 6e    0, zeroblobFun
9080: 63 20 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66  c      },.#ifdef
9090: 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a   SQLITE_SOUNDEX.
90a0: 20 20 20 20 7b 20 22 73 6f 75 6e 64 65 78 22 2c      { "soundex",
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
90c0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
90d0: 20 20 30 2c 20 73 6f 75 6e 64 65 78 46 75 6e 63    0, soundexFunc
90e0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  },.#endif.#ifnde
90f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
9100: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
9110: 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69   { "load_extensi
9120: 6f 6e 22 2c 20 20 20 20 20 31 2c 20 30 2c 20 53  on",     1, 0, S
9130: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6c  QLITE_UTF8, 0, l
9140: 6f 61 64 45 78 74 20 7d 2c 0a 20 20 20 20 7b 20  oadExt },.    { 
9150: 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  "load_extension"
9160: 2c 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49  ,     2, 0, SQLI
9170: 54 45 5f 55 54 46 38 2c 20 30 2c 20 6c 6f 61 64  TE_UTF8, 0, load
9180: 45 78 74 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  Ext },.#endif.  
9190: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
91a0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
91b0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
91c0: 73 69 67 6e 65 64 20 63 68 61 72 20 6e 41 72 67  signed char nArg
91d0: 3b 0a 20 20 20 20 75 38 20 61 72 67 54 79 70 65  ;.    u8 argType
91e0: 3b 0a 20 20 20 20 75 38 20 6e 65 65 64 43 6f 6c  ;.    u8 needCol
91f0: 6c 53 65 71 3b 0a 20 20 20 20 76 6f 69 64 20 28  lSeq;.    void (
9200: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
9210: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
9220: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20  ite3_value**);. 
9230: 20 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c     void (*xFinal
9240: 69 7a 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ize)(sqlite3_con
9250: 74 65 78 74 2a 29 3b 0a 20 20 7d 20 61 41 67 67  text*);.  } aAgg
9260: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6d  s[] = {.    { "m
9270: 69 6e 22 2c 20 20 20 20 31 2c 20 30 2c 20 31 2c  in",    1, 0, 1,
9280: 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 6d   minmaxStep,   m
9290: 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20 7d 2c  inMaxFinalize },
92a0: 0a 20 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20  .    { "max",   
92b0: 20 31 2c 20 31 2c 20 31 2c 20 6d 69 6e 6d 61 78   1, 1, 1, minmax
92c0: 53 74 65 70 2c 20 20 20 6d 69 6e 4d 61 78 46 69  Step,   minMaxFi
92d0: 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20 20 20 7b 20  nalize },.    { 
92e0: 22 73 75 6d 22 2c 20 20 20 20 31 2c 20 30 2c 20  "sum",    1, 0, 
92f0: 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20  0, sumStep,     
9300: 20 73 75 6d 46 69 6e 61 6c 69 7a 65 20 20 20 20   sumFinalize    
9310: 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74 61 6c 22  },.    { "total"
9320: 2c 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53  ,  1, 0, 0, sumS
9330: 74 65 70 2c 20 20 20 20 20 20 74 6f 74 61 6c 46  tep,      totalF
9340: 69 6e 61 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20  inalize    },.  
9350: 20 20 7b 20 22 61 76 67 22 2c 20 20 20 20 31 2c    { "avg",    1,
9360: 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20   0, 0, sumStep, 
9370: 20 20 20 20 20 61 76 67 46 69 6e 61 6c 69 7a 65       avgFinalize
9380: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f      },.    { "co
9390: 75 6e 74 22 2c 20 20 30 2c 20 30 2c 20 30 2c 20  unt",  0, 0, 0, 
93a0: 63 6f 75 6e 74 53 74 65 70 2c 20 20 20 20 63 6f  countStep,    co
93b0: 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a  untFinalize  },.
93c0: 20 20 20 20 7b 20 22 63 6f 75 6e 74 22 2c 20 20      { "count",  
93d0: 31 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74  1, 0, 0, countSt
93e0: 65 70 2c 20 20 20 20 63 6f 75 6e 74 46 69 6e 61  ep,    countFina
93f0: 6c 69 7a 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22  lize  },.    { "
9400: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 22 2c 20 2d  group_concat", -
9410: 31 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f  1, 0, 0, groupCo
9420: 6e 63 61 74 53 74 65 70 2c 20 67 72 6f 75 70 43  ncatStep, groupC
9430: 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 20 7d 2c  oncatFinalize },
9440: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  .  };.  int i;..
9450: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
9460: 65 6f 66 28 61 46 75 6e 63 73 29 2f 73 69 7a 65  eof(aFuncs)/size
9470: 6f 66 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69  of(aFuncs[0]); i
9480: 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ++){.    void *p
9490: 41 72 67 3b 0a 20 20 20 20 75 38 20 61 72 67 54  Arg;.    u8 argT
94a0: 79 70 65 20 3d 20 61 46 75 6e 63 73 5b 69 5d 2e  ype = aFuncs[i].
94b0: 61 72 67 54 79 70 65 3b 0a 20 20 20 20 70 41 72  argType;.    pAr
94c0: 67 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  g = SQLITE_INT_T
94d0: 4f 5f 50 54 52 28 61 72 67 54 79 70 65 29 3b 0a  O_PTR(argType);.
94e0: 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74      sqlite3Creat
94f0: 65 46 75 6e 63 28 64 62 2c 20 61 46 75 6e 63 73  eFunc(db, aFuncs
9500: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63  [i].zName, aFunc
9510: 73 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20  s[i].nArg,.     
9520: 20 20 20 61 46 75 6e 63 73 5b 69 5d 2e 65 54 65     aFuncs[i].eTe
9530: 78 74 52 65 70 2c 20 70 41 72 67 2c 20 61 46 75  xtRep, pArg, aFu
9540: 6e 63 73 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 2c  ncs[i].xFunc, 0,
9550: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 46 75   0);.    if( aFu
9560: 6e 63 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53  ncs[i].needCollS
9570: 65 71 20 29 7b 0a 20 20 20 20 20 20 46 75 6e 63  eq ){.      Func
9580: 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 73 71 6c  Def *pFunc = sql
9590: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
95a0: 28 64 62 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 7a  (db, aFuncs[i].z
95b0: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Name, .         
95c0: 20 73 74 72 6c 65 6e 28 61 46 75 6e 63 73 5b 69   strlen(aFuncs[i
95d0: 5d 2e 7a 4e 61 6d 65 29 2c 20 61 46 75 6e 63 73  ].zName), aFuncs
95e0: 5b 69 5d 2e 6e 41 72 67 2c 20 61 46 75 6e 63 73  [i].nArg, aFuncs
95f0: 5b 69 5d 2e 65 54 65 78 74 52 65 70 2c 20 30 29  [i].eTextRep, 0)
9600: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e  ;.      if( pFun
9610: 63 20 26 26 20 61 46 75 6e 63 73 5b 69 5d 2e 6e  c && aFuncs[i].n
9620: 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20  eedCollSeq ){.  
9630: 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 6e 65 65        pFunc->nee
9640: 64 43 6f 6c 6c 53 65 71 20 3d 20 31 3b 0a 20 20  dCollSeq = 1;.  
9650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9660: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9670: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
9680: 20 73 71 6c 69 74 65 33 41 6c 74 65 72 46 75 6e   sqlite3AlterFun
9690: 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64  ctions(db);.#end
96a0: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
96b0: 45 5f 4f 4d 49 54 5f 50 41 52 53 45 52 0a 20 20  E_OMIT_PARSER.  
96c0: 73 71 6c 69 74 65 33 41 74 74 61 63 68 46 75 6e  sqlite3AttachFun
96d0: 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64  ctions(db);.#end
96e0: 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  if.  for(i=0; i<
96f0: 73 69 7a 65 6f 66 28 61 41 67 67 73 29 2f 73 69  sizeof(aAggs)/si
9700: 7a 65 6f 66 28 61 41 67 67 73 5b 30 5d 29 3b 20  zeof(aAggs[0]); 
9710: 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  i++){.    void *
9720: 70 41 72 67 20 3d 20 53 51 4c 49 54 45 5f 49 4e  pArg = SQLITE_IN
9730: 54 5f 54 4f 5f 50 54 52 28 61 41 67 67 73 5b 69  T_TO_PTR(aAggs[i
9740: 5d 2e 61 72 67 54 79 70 65 29 3b 0a 20 20 20 20  ].argType);.    
9750: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
9760: 63 28 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a  c(db, aAggs[i].z
9770: 4e 61 6d 65 2c 20 61 41 67 67 73 5b 69 5d 2e 6e  Name, aAggs[i].n
9780: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
9790: 2c 20 0a 20 20 20 20 20 20 20 20 70 41 72 67 2c  , .        pArg,
97a0: 20 30 2c 20 61 41 67 67 73 5b 69 5d 2e 78 53 74   0, aAggs[i].xSt
97b0: 65 70 2c 20 61 41 67 67 73 5b 69 5d 2e 78 46 69  ep, aAggs[i].xFi
97c0: 6e 61 6c 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  nalize);.    if(
97d0: 20 61 41 67 67 73 5b 69 5d 2e 6e 65 65 64 43 6f   aAggs[i].needCo
97e0: 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 46  llSeq ){.      F
97f0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
9800: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
9810: 69 6f 6e 28 20 64 62 2c 20 61 41 67 67 73 5b 69  ion( db, aAggs[i
9820: 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ].zName,.       
9830: 20 20 20 73 74 72 6c 65 6e 28 61 41 67 67 73 5b     strlen(aAggs[
9840: 69 5d 2e 7a 4e 61 6d 65 29 2c 20 61 41 67 67 73  i].zName), aAggs
9850: 5b 69 5d 2e 6e 41 72 67 2c 20 53 51 4c 49 54 45  [i].nArg, SQLITE
9860: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 20  _UTF8, 0);.     
9870: 20 69 66 28 20 70 46 75 6e 63 20 26 26 20 61 41   if( pFunc && aA
9880: 67 67 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53  ggs[i].needCollS
9890: 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  eq ){.        pF
98a0: 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  unc->needCollSeq
98b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
98c0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
98d0: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
98e0: 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  eFunctions(db);.
98f0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
9900: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
9910: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
9920: 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
9930: 6e 28 64 62 2c 20 22 4d 41 54 43 48 22 2c 20 32  n(db, "MATCH", 2
9940: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
9950: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
9960: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
9970: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
9980: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
9990: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
99a0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
99b0: 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
99c0: 49 54 45 5f 53 53 45 0a 20 20 28 76 6f 69 64 29  ITE_SSE.  (void)
99d0: 73 71 6c 69 74 65 33 53 73 65 46 75 6e 63 74 69  sqlite3SseFuncti
99e0: 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a  ons(db);.#endif.
99f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 41  #ifdef SQLITE_CA
9a00: 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b  SE_SENSITIVE_LIK
9a10: 45 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  E.  sqlite3Regis
9a20: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
9a30: 28 64 62 2c 20 31 29 3b 0a 23 65 6c 73 65 0a 20  (db, 1);.#else. 
9a40: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
9a50: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64 62  LikeFunctions(db
9a60: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  , 0);.#endif.}..
9a70: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 4c 49  /*.** Set the LI
9a80: 4b 45 4f 50 54 20 66 6c 61 67 20 6f 6e 20 74 68  KEOPT flag on th
9a90: 65 20 32 2d 61 72 67 75 6d 65 6e 74 20 66 75 6e  e 2-argument fun
9aa0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
9ab0: 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  iven name..*/.st
9ac0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4c 69 6b  atic void setLik
9ad0: 65 4f 70 74 46 6c 61 67 28 73 71 6c 69 74 65 33  eOptFlag(sqlite3
9ae0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
9af0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61   *zName, int fla
9b00: 67 56 61 6c 29 7b 0a 20 20 46 75 6e 63 44 65 66  gVal){.  FuncDef
9b10: 20 2a 70 44 65 66 3b 0a 20 20 70 44 65 66 20 3d   *pDef;.  pDef =
9b20: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
9b30: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
9b40: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c 20 32  strlen(zName), 2
9b50: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
9b60: 29 3b 0a 20 20 69 66 28 20 70 44 65 66 20 29 7b  );.  if( pDef ){
9b70: 0a 20 20 20 20 70 44 65 66 2d 3e 66 6c 61 67 73  .    pDef->flags
9b80: 20 3d 20 66 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a   = flagVal;.  }.
9b90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
9ba0: 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 4c  r the built-in L
9bb0: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e  IKE and GLOB fun
9bc0: 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 63 61 73  ctions.  The cas
9bd0: 65 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61  eSensitive.** pa
9be0: 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
9bf0: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
9c00: 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  t the LIKE opera
9c10: 74 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a 20 73  tor is case.** s
9c20: 65 6e 73 69 74 69 76 65 2e 20 20 47 4c 4f 42 20  ensitive.  GLOB 
9c30: 69 73 20 61 6c 77 61 79 73 20 63 61 73 65 20 73  is always case s
9c40: 65 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69  ensitive..*/.voi
9c50: 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  d sqlite3Registe
9c60: 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73  rLikeFunctions(s
9c70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
9c80: 63 61 73 65 53 65 6e 73 69 74 69 76 65 29 7b 0a  caseSensitive){.
9c90: 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65    struct compare
9ca0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69  Info *pInfo;.  i
9cb0: 66 28 20 63 61 73 65 53 65 6e 73 69 74 69 76 65  f( caseSensitive
9cc0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20   ){.    pInfo = 
9cd0: 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  (struct compareI
9ce0: 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  nfo*)&likeInfoAl
9cf0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
9d00: 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20  pInfo = (struct 
9d10: 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69  compareInfo*)&li
9d20: 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a  keInfoNorm;.  }.
9d30: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
9d40: 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20  unc(db, "like", 
9d50: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
9d60: 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c  pInfo, likeFunc,
9d70: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
9d80: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
9d90: 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54  "like", 3, SQLIT
9da0: 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c  E_UTF8, pInfo, l
9db0: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ikeFunc, 0, 0);.
9dc0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
9dd0: 75 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20  unc(db, "glob", 
9de0: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
9df0: 0a 20 20 20 20 20 20 28 73 74 72 75 63 74 20 63  .      (struct c
9e00: 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f  ompareInfo*)&glo
9e10: 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c  bInfo, likeFunc,
9e20: 20 30 2c 30 29 3b 0a 20 20 73 65 74 4c 69 6b 65   0,0);.  setLike
9e30: 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67 6c 6f  OptFlag(db, "glo
9e40: 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  b", SQLITE_FUNC_
9e50: 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55  LIKE | SQLITE_FU
9e60: 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65 74 4c  NC_CASE);.  setL
9e70: 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22  ikeOptFlag(db, "
9e80: 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20 63 61  like", .      ca
9e90: 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20 28 53  seSensitive ? (S
9ea0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20  QLITE_FUNC_LIKE 
9eb0: 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  | SQLITE_FUNC_CA
9ec0: 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46 55 4e  SE) : SQLITE_FUN
9ed0: 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_LIKE);.}../*.*
9ee0: 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73 20 74  * pExpr points t
9ef0: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
9f00: 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74 73  which implements
9f10: 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66   a function.  If
9f20: 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72 6f 70  .** it is approp
9f30: 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79 20 74  riate to apply t
9f40: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
9f50: 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66 75 6e  tion to that fun
9f60: 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73 65  ction.** then se
9f70: 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75 67 68  t aWc[0] through
9f80: 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65 20 77   aWc[2] to the w
9f90: 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65  ildcard characte
9fa0: 72 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  rs and.** return
9fb0: 20 54 52 55 45 2e 20 20 49 66 20 74 68 65 20 66   TRUE.  If the f
9fc0: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  unction is not a
9fd0: 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75 6e 63   LIKE-style func
9fe0: 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 72 65 74  tion then.** ret
9ff0: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e  urn FALSE..*/.in
a000: 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46  t sqlite3IsLikeF
a010: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
a020: 2a 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70 72  *db, Expr *pExpr
a030: 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73 65  , int *pIsNocase
a040: 2c 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20 20  , char *aWc){.  
a050: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
a060: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
a070: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 21  TK_FUNCTION || !
a080: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
a090: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a0a0: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  }.  if( pExpr->p
a0b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
a0c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a0d0: 20 20 7d 0a 20 20 70 44 65 66 20 3d 20 73 71 6c    }.  pDef = sql
a0e0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
a0f0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70  (db, (char*)pExp
a100: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
a110: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 32 2c 0a 20  r->token.n, 2,. 
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
a140: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69  TE_UTF8, 0);.  i
a150: 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 28 70  f( pDef==0 || (p
a160: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
a170: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d  ITE_FUNC_LIKE)==
a180: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a190: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
a1a0: 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65 6d   memcpy() statem
a1b0: 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61 74  ent assumes that
a1c0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
a1d0: 61 72 61 63 74 65 72 73 20 61 72 65 0a 20 20 2a  aracters are.  *
a1e0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  * the first thre
a1f0: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  e statements in 
a200: 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  the compareInfo 
a210: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 0a  structure.  The.
a220: 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20 74    ** asserts() t
a230: 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66  hat follow verif
a240: 79 20 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f  y that assumptio
a250: 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  n.  */.  memcpy(
a260: 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65 72  aWc, pDef->pUser
a270: 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73 65  Data, 3);.  asse
a280: 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b 65  rt( (char*)&like
a290: 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72  InfoAlt == (char
a2a0: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d  *)&likeInfoAlt.m
a2b0: 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73  atchAll );.  ass
a2c0: 65 72 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c  ert( &((char*)&l
a2d0: 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d  ikeInfoAlt)[1] =
a2e0: 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  = (char*)&likeIn
a2f0: 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29  foAlt.matchOne )
a300: 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63  ;.  assert( &((c
a310: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
a320: 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29  t)[2] == (char*)
a330: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74  &likeInfoAlt.mat
a340: 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49 73 4e  chSet );.  *pIsN
a350: 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d 3e 66  ocase = (pDef->f
a360: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
a370: 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20 20 72  NC_CASE)==0;.  r
a380: 65 74 75 72 6e 20 31 3b 0a 7d 0a                 eturn 1;.}.