/ Hex Artifact Content
Login

Artifact 49f98cfe26b9ab507b96a34404295c4d89dfc620:


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 37 37 20 32 30 30 37 2f 31 31 2f 32 38  1.177 2007/11/28
02a0: 20 32 32 3a 33 36 3a 34 31 20 64 72 68 20 45 78   22:36:41 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 53 51 4c 49 54 45 5f      p2 = SQLITE_
1240: 4d 41 58 5f 4c 45 4e 47 54 48 3b 0a 20 20 7d 0a  MAX_LENGTH;.  }.
1250: 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20    if( p1<0 ){.  
1260: 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20    p1 += len;.   
1270: 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20   if( p1<0 ){.   
1280: 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20 20     p2 += p1;.   
1290: 20 20 20 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d     p1 = 0;.    }
12a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 31 3e  .  }else if( p1>
12b0: 30 20 29 7b 0a 20 20 20 20 70 31 2d 2d 3b 0a 20  0 ){.    p1--;. 
12c0: 20 7d 0a 20 20 69 66 28 20 70 31 2b 70 32 3e 6c   }.  if( p1+p2>l
12d0: 65 6e 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 6c  en ){.    p2 = l
12e0: 65 6e 2d 70 31 3b 0a 20 20 7d 0a 20 20 69 66 28  en-p1;.  }.  if(
12f0: 20 70 30 74 79 70 65 21 3d 53 51 4c 49 54 45 5f   p0type!=SQLITE_
1300: 42 4c 4f 42 20 29 7b 0a 20 20 20 20 77 68 69 6c  BLOB ){.    whil
1310: 65 28 20 2a 7a 20 26 26 20 70 31 20 29 7b 0a 20  e( *z && p1 ){. 
1320: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50       SQLITE_SKIP
1330: 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20  _UTF8(z);.      
1340: 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p1--;.    }.    
1350: 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 20 26 26  for(z2=z; *z2 &&
1360: 20 70 32 3b 20 70 32 2d 2d 29 7b 0a 20 20 20 20   p2; p2--){.    
1370: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
1380: 46 38 28 7a 32 29 3b 0a 20 20 20 20 7d 0a 20 20  F8(z2);.    }.  
1390: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
13a0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
13b0: 63 68 61 72 2a 29 7a 2c 20 7a 32 2d 7a 2c 20 53  char*)z, z2-z, S
13c0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
13d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
13e0: 66 28 20 70 32 3c 30 20 29 20 70 32 20 3d 20 30  f( p2<0 ) p2 = 0
13f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
1400: 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78  sult_blob(contex
1410: 74 2c 20 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d  t, (char*)&z[p1]
1420: 2c 20 70 32 2c 20 53 51 4c 49 54 45 5f 54 52 41  , p2, SQLITE_TRA
1430: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a  NSIENT);.  }.}..
1440: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1450: 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 75 6e  tion of the roun
1460: 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a  d() function.*/.
1470: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 75 6e  static void roun
1480: 64 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  dFunc(sqlite3_co
1490: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
14a0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
14b0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
14c0: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
14d0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72  double r;.  char
14e0: 20 7a 42 75 66 5b 35 30 30 5d 3b 20 20 2f 2a 20   zBuf[500];  /* 
14f0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1500: 25 66 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  %f representatio
1510: 6e 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  n of the largest
1520: 20 64 6f 75 62 6c 65 20 2a 2f 0a 20 20 61 73 73   double */.  ass
1530: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20  ert( argc==1 || 
1540: 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28  argc==2 );.  if(
1550: 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20   argc==2 ){.    
1560: 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d  if( SQLITE_NULL=
1570: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
1580: 79 70 65 28 61 72 67 76 5b 31 5d 29 20 29 20 72  ype(argv[1]) ) r
1590: 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 73  eturn;.    n = s
15a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
15b0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
15c0: 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d 20 33 30  f( n>30 ) n = 30
15d0: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20  ;.    if( n<0 ) 
15e0: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
15f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1600: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
1610: 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75  LITE_NULL ) retu
1620: 72 6e 3b 0a 20 20 72 20 3d 20 73 71 6c 69 74 65  rn;.  r = sqlite
1630: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
1640: 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74  rgv[0]);.  sqlit
1650: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1660: 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25  of(zBuf),zBuf,"%
1670: 2e 2a 66 22 2c 6e 2c 72 29 3b 0a 20 20 73 71 6c  .*f",n,r);.  sql
1680: 69 74 65 33 41 74 6f 46 28 7a 42 75 66 2c 20 26  ite3AtoF(zBuf, &
1690: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  r);.  sqlite3_re
16a0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
16b0: 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ext, r);.}../*.*
16c0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
16d0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
16e0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61  using sqlite3_ma
16f0: 6c 6c 6f 63 28 29 2e 20 49 66 20 74 68 65 0a 2a  lloc(). If the.*
1700: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  * allocation fai
1710: 6c 73 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ls, call sqlite3
1720: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
1730: 6d 65 6d 28 29 20 74 6f 20 6e 6f 74 69 66 79 0a  mem() to notify.
1740: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1750: 68 61 6e 64 6c 65 20 74 68 61 74 20 6d 61 6c 6c  handle that mall
1760: 6f 63 28 29 20 68 61 73 20 66 61 69 6c 65 64 2e  oc() has failed.
1770: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1780: 2a 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 73  *contextMalloc(s
1790: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
17a0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 6e 42 79  context, int nBy
17b0: 74 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  te){.  char *z =
17c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
17d0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21 7a  nByte);.  if( !z
17e0: 20 26 26 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20   && nByte>0 ){. 
17f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1800: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
1810: 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 65  ntext);.  }.  re
1820: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
1830: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1840: 6f 66 20 74 68 65 20 75 70 70 65 72 28 29 20 61  of the upper() a
1850: 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20 66  nd lower() SQL f
1860: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  unctions..*/.sta
1870: 74 69 63 20 76 6f 69 64 20 75 70 70 65 72 46 75  tic void upperFu
1880: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
1890: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
18a0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
18b0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
18c0: 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73  char *z1;.  cons
18d0: 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e  t char *z2;.  in
18e0: 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 61 72  t i, n;.  if( ar
18f0: 67 63 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 4e  gc<1 || SQLITE_N
1900: 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL==sqlite3_val
1910: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
1920: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 32 20   ) return;.  z2 
1930: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
1940: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1950: 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  [0]);.  n = sqli
1960: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
1970: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20 56  argv[0]);.  /* V
1980: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
1990: 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28 29 20  all to _bytes() 
19a0: 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c 69 64  does not invalid
19b0: 61 74 65 20 74 68 65 20 5f 74 65 78 74 28 29 20  ate the _text() 
19c0: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61 73 73  pointer */.  ass
19d0: 65 72 74 28 20 7a 32 3d 3d 28 63 68 61 72 2a 29  ert( z2==(char*)
19e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
19f0: 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20  xt(argv[0]) );. 
1a00: 20 69 66 28 20 7a 32 20 29 7b 0a 20 20 20 20 7a   if( z2 ){.    z
1a10: 31 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  1 = contextMallo
1a20: 63 28 63 6f 6e 74 65 78 74 2c 20 6e 2b 31 29 3b  c(context, n+1);
1a30: 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20  .    if( z1 ){. 
1a40: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 31 2c 20       memcpy(z1, 
1a50: 7a 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20  z2, n+1);.      
1a60: 66 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d 3b 20  for(i=0; z1[i]; 
1a70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31  i++){.        z1
1a80: 5b 69 5d 20 3d 20 74 6f 75 70 70 65 72 28 7a 31  [i] = toupper(z1
1a90: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
1aa0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1ab0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1ac0: 20 7a 31 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33   z1, -1, sqlite3
1ad0: 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _free);.    }.  
1ae0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1af0: 6c 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65  lowerFunc(sqlite
1b00: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1b10: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
1b20: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1b30: 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b  gv){.  char *z1;
1b40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b50: 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  2;.  int i, n;. 
1b60: 20 69 66 28 20 61 72 67 63 3c 31 20 7c 7c 20 53   if( argc<1 || S
1b70: 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69  QLITE_NULL==sqli
1b80: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1b90: 72 67 76 5b 30 5d 29 20 29 20 72 65 74 75 72 6e  rgv[0]) ) return
1ba0: 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a 29  ;.  z2 = (char*)
1bb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1bc0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e  xt(argv[0]);.  n
1bd0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1be0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
1bf0: 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1c00: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62  t the call to _b
1c10: 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74 20  ytes() does not 
1c20: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 5f  invalidate the _
1c30: 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20 2a  text() pointer *
1c40: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d 3d  /.  assert( z2==
1c50: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
1c60: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
1c70: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20 29  ]) );.  if( z2 )
1c80: 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65  {.    z1 = conte
1c90: 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74  xtMalloc(context
1ca0: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  , n+1);.    if( 
1cb0: 7a 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  z1 ){.      memc
1cc0: 70 79 28 7a 31 2c 20 7a 32 2c 20 6e 2b 31 29 3b  py(z1, z2, n+1);
1cd0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1ce0: 7a 31 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  z1[i]; i++){.   
1cf0: 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20 74 6f 6c       z1[i] = tol
1d00: 6f 77 65 72 28 7a 31 5b 69 5d 29 3b 0a 20 20 20  ower(z1[i]);.   
1d10: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d20: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
1d30: 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 2d 31 2c 20  ontext, z1, -1, 
1d40: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
1d50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1d60: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1d70: 20 6f 66 20 74 68 65 20 49 46 4e 55 4c 4c 28 29   of the IFNULL()
1d80: 2c 20 4e 56 4c 28 29 2c 20 61 6e 64 20 43 4f 41  , NVL(), and COA
1d90: 4c 45 53 43 45 28 29 20 66 75 6e 63 74 69 6f 6e  LESCE() function
1da0: 73 2e 20 20 0a 2a 2a 20 41 6c 6c 20 74 68 72 65  s.  .** All thre
1db0: 65 20 64 6f 20 74 68 65 20 73 61 6d 65 20 74 68  e do the same th
1dc0: 69 6e 67 2e 20 20 54 68 65 79 20 72 65 74 75 72  ing.  They retur
1dd0: 6e 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  n the first non-
1de0: 4e 55 4c 4c 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  NULL.** argument
1df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e00: 20 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73   ifnullFunc(.  s
1e10: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1e20: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
1e30: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
1e40: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
1e50: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1e60: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
1e70: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1e80: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
1e90: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d  lue_type(argv[i]
1ea0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1eb0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
1ec0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 69 5d  context, argv[i]
1ed0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ee0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1ef0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1f00: 6e 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20  n of random().  
1f10: 52 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20  Return a random 
1f20: 69 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74  integer.  .*/.st
1f30: 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d  atic void random
1f40: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1f50: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1f60: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1f70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1f80: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1f90: 5f 69 6e 74 36 34 20 72 3b 0a 20 20 73 71 6c 69  _int64 r;.  sqli
1fa0: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
1fb0: 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
1fc0: 69 66 28 20 28 72 3c 3c 31 29 3d 3d 30 20 29 20  if( (r<<1)==0 ) 
1fd0: 72 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  r = 0;  /* Preve
1fe0: 6e 74 20 30 78 38 30 30 30 2e 2e 2e 2e 20 61 73  nt 0x8000.... as
1ff0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 6f 20 74   the result so t
2000: 68 61 74 20 77 65 20 2a 2f 0a 20 20 20 20 20 20  hat we */.      
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 2f 2a 20 63 61 6e 20 61 6c 77 61 79      /* can alway
2030: 73 20 64 6f 20 61 62 73 28 29 20 6f 66 20 74 68  s do abs() of th
2040: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 73 71  e result */.  sq
2050: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
2060: 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a  64(context, r);.
2070: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2080: 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f  ntation of rando
2090: 6d 62 6c 6f 62 28 4e 29 2e 20 20 52 65 74 75 72  mblob(N).  Retur
20a0: 6e 20 61 20 72 61 6e 64 6f 6d 20 62 6c 6f 62 0a  n a random blob.
20b0: 2a 2a 20 74 68 61 74 20 69 73 20 4e 20 62 79 74  ** that is N byt
20c0: 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  es long..*/.stat
20d0: 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 42 6c  ic void randomBl
20e0: 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ob(.  sqlite3_co
20f0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
2100: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
2110: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
2120: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  gv.){.  int n;. 
2130: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2140: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  p;.  assert( arg
2150: 63 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 73 71  c==1 );.  n = sq
2160: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
2170: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
2180: 6e 3c 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 31  n<1 ){.    n = 1
2190: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 53 51  ;.  }.  if( n>SQ
21a0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
21b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
21c0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62  esult_error_toob
21d0: 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ig(context);.   
21e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
21f0: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
2200: 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20  (context, n);.  
2210: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
2220: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 6e  ite3Randomness(n
2230: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
2240: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
2250: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 70 2c  ntext, (char*)p,
2260: 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   n, sqlite3_free
2270: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2280: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2290: 66 20 74 68 65 20 6c 61 73 74 5f 69 6e 73 65 72  f the last_inser
22a0: 74 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75  t_rowid() SQL fu
22b0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74  nction.  The ret
22c0: 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  urn.** value is 
22d0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
22e0: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
22f0: 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20  ert_rowid() API 
2300: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2310: 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 69 6e  tic void last_in
2320: 73 65 72 74 5f 72 6f 77 69 64 28 0a 20 20 73 71  sert_rowid(.  sq
2330: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
2340: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
2350: 72 67 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  rg, .  sqlite3_v
2360: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
2370: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
2380: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
2390: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c  (context);.  sql
23a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
23b0: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
23c0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
23d0: 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  owid(db));.}../*
23e0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
23f0: 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  on of the change
2400: 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  s() SQL function
2410: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
2420: 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61  lue is the.** sa
2430: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
2440: 33 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49 20  3_changes() API 
2450: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2460: 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 73  tic void changes
2470: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2480: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
2490: 69 6e 74 20 61 72 67 2c 0a 20 20 73 71 6c 69 74  int arg,.  sqlit
24a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
24b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
24c0: 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
24d0: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20  data(context);. 
24e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
24f0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
2500: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29  ite3_changes(db)
2510: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
2520: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2530: 65 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  e total_changes(
2540: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
2550: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2560: 65 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65  e is.** the same
2570: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
2580: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20  total_changes() 
2590: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
25a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 74  .static void tot
25b0: 61 6c 5f 63 68 61 6e 67 65 73 28 0a 20 20 73 71  al_changes(.  sq
25c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
25d0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
25e0: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
25f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
2600: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2610: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
2620: 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74  ontext);.  sqlit
2630: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
2640: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 74  ntext, sqlite3_t
2650: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 64 62 29  otal_changes(db)
2660: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  );.}../*.** A st
2670: 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 6e 67  ructure defining
2680: 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f 42 2d   how to do GLOB-
2690: 73 74 79 6c 65 20 63 6f 6d 70 61 72 69 73 6f 6e  style comparison
26a0: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6d  s..*/.struct com
26b0: 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20  pareInfo {.  u8 
26c0: 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d  matchAll;.  u8 m
26d0: 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61  atchOne;.  u8 ma
26e0: 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43  tchSet;.  u8 noC
26f0: 61 73 65 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  ase;.};..static 
2700: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d  const struct com
2710: 70 61 72 65 49 6e 66 6f 20 67 6c 6f 62 49 6e 66  pareInfo globInf
2720: 6f 20 3d 20 7b 20 27 2a 27 2c 20 27 3f 27 2c 20  o = { '*', '?', 
2730: 27 5b 27 2c 20 30 20 7d 3b 0a 2f 2a 20 54 68 65  '[', 0 };./* The
2740: 20 63 6f 72 72 65 63 74 20 53 51 4c 2d 39 32 20   correct SQL-92 
2750: 62 65 68 61 76 69 6f 72 20 69 73 20 66 6f 72 20  behavior is for 
2760: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
2770: 72 20 74 6f 20 69 67 6e 6f 72 65 0a 2a 2a 20 63  r to ignore.** c
2780: 61 73 65 2e 20 20 54 68 75 73 20 20 27 61 27 20  ase.  Thus  'a' 
2790: 4c 49 4b 45 20 27 41 27 20 77 6f 75 6c 64 20 62  LIKE 'A' would b
27a0: 65 20 74 72 75 65 2e 20 2a 2f 0a 73 74 61 74 69  e true. */.stati
27b0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63  c const struct c
27c0: 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49  ompareInfo likeI
27d0: 6e 66 6f 4e 6f 72 6d 20 3d 20 7b 20 27 25 27 2c  nfoNorm = { '%',
27e0: 20 27 5f 27 2c 20 20 20 30 2c 20 31 20 7d 3b 0a   '_',   0, 1 };.
27f0: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 41 53  /* If SQLITE_CAS
2800: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
2810: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
2820: 6e 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  n the LIKE opera
2830: 74 6f 72 0a 2a 2a 20 69 73 20 63 61 73 65 20 73  tor.** is case s
2840: 65 6e 73 69 74 69 76 65 20 63 61 75 73 69 6e 67  ensitive causing
2850: 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20 74 6f   'a' LIKE 'A' to
2860: 20 62 65 20 66 61 6c 73 65 20 2a 2f 0a 73 74 61   be false */.sta
2870: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2880: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b   compareInfo lik
2890: 65 49 6e 66 6f 41 6c 74 20 3d 20 7b 20 27 25 27  eInfoAlt = { '%'
28a0: 2c 20 27 5f 27 2c 20 20 20 30 2c 20 30 20 7d 3b  , '_',   0, 0 };
28b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
28c0: 74 77 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67  two UTF-8 string
28d0: 73 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 77  s for equality w
28e0: 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 73  here the first s
28f0: 74 72 69 6e 67 20 63 61 6e 0a 2a 2a 20 70 6f 74  tring can.** pot
2900: 65 6e 74 69 61 6c 6c 79 20 62 65 20 61 20 22 67  entially be a "g
2910: 6c 6f 62 22 20 65 78 70 72 65 73 73 69 6f 6e 2e  lob" expression.
2920: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 31    Return true (1
2930: 29 20 69 66 20 74 68 65 79 0a 2a 2a 20 61 72 65  ) if they.** are
2940: 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20 66 61   the same and fa
2950: 6c 73 65 20 28 30 29 20 69 66 20 74 68 65 79 20  lse (0) if they 
2960: 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a  are different..*
2970: 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75  *.** Globbing ru
2980: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
2990: 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '*'       Matche
29a0: 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f  s any sequence o
29b0: 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63  f zero or more c
29c0: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
29d0: 20 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20        '?'       
29e0: 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20  Matches exactly 
29f0: 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  one character..*
2a00: 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20  *.**     [...]  
2a10: 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20      Matches one 
2a20: 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74  character from t
2a30: 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
2a40: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
2a50: 20 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73        characters
2a60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e  ..**.**     [^..
2a70: 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  .]     Matches o
2a80: 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74  ne character not
2a90: 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64   in the enclosed
2aa0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74   list..**.** Wit
2ab0: 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e 64 20  h the [...] and 
2ac0: 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e 67 2c  [^...] matching,
2ad0: 20 61 20 27 5d 27 20 63 68 61 72 61 63 74 65 72   a ']' character
2ae0: 20 63 61 6e 20 62 65 20 69 6e 63 6c 75 64 65 64   can be included
2af0: 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 20  .** in the list 
2b00: 62 79 20 6d 61 6b 69 6e 67 20 69 74 20 74 68 65  by making it the
2b10: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
2b20: 20 61 66 74 65 72 20 27 5b 27 20 6f 72 20 27 5e   after '[' or '^
2b30: 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65 20 6f  '.  A.** range o
2b40: 66 20 63 68 61 72 61 63 74 65 72 73 20 63 61 6e  f characters can
2b50: 20 62 65 20 73 70 65 63 69 66 69 65 64 20 75 73   be specified us
2b60: 69 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d 70 6c  ing '-'.  Exampl
2b70: 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20 6d 61  e:.** "[a-z]" ma
2b80: 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65  tches any single
2b90: 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65 74 74   lower-case lett
2ba0: 65 72 2e 20 20 54 6f 20 6d 61 74 63 68 20 61 20  er.  To match a 
2bb0: 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  '-', make.** it 
2bc0: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
2bd0: 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  er in the list..
2be0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2bf0: 6e 65 20 69 73 20 75 73 75 61 6c 6c 79 20 71 75  ne is usually qu
2c00: 69 63 6b 2c 20 62 75 74 20 63 61 6e 20 62 65 20  ick, but can be 
2c10: 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f 72 73  N**2 in the wors
2c20: 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 69  t case..**.** Hi
2c30: 6e 74 73 3a 20 74 6f 20 6d 61 74 63 68 20 27 2a  nts: to match '*
2c40: 27 20 6f 72 20 27 3f 27 2c 20 70 75 74 20 74 68  ' or '?', put th
2c50: 65 6d 20 69 6e 20 22 5b 5d 22 2e 20 20 4c 69 6b  em in "[]".  Lik
2c60: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
2c70: 20 20 20 20 20 20 61 62 63 5b 2a 5d 78 79 7a 20        abc[*]xyz 
2c80: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 22         Matches "
2c90: 61 62 63 2a 78 79 7a 22 20 6f 6e 6c 79 0a 2a 2f  abc*xyz" only.*/
2ca0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 74 74  .static int patt
2cb0: 65 72 6e 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f  ernCompare(.  co
2cc0: 6e 73 74 20 75 38 20 2a 7a 50 61 74 74 65 72 6e  nst u8 *zPattern
2cd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ce0: 2a 20 54 68 65 20 67 6c 6f 62 20 70 61 74 74 65  * The glob patte
2cf0: 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  rn */.  const u8
2d00: 20 2a 7a 53 74 72 69 6e 67 2c 20 20 20 20 20 20   *zString,      
2d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d20: 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72  string to compar
2d30: 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 67 6c  e against the gl
2d40: 6f 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 74  ob */.  const st
2d50: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
2d60: 20 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49 6e 66 6f   *pInfo, /* Info
2d70: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 68 6f  rmation about ho
2d80: 77 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70  w to do the comp
2d90: 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  are */.  const i
2da0: 6e 74 20 65 73 63 20 20 20 20 20 20 20 20 20 20  nt esc          
2db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2dc0: 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65   escape characte
2dd0: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 2c  r */.){.  int c,
2de0: 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e 76 65 72   c2;.  int inver
2df0: 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a 20  t;.  int seen;. 
2e00: 20 75 38 20 6d 61 74 63 68 4f 6e 65 20 3d 20 70   u8 matchOne = p
2e10: 49 6e 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65 3b 0a  Info->matchOne;.
2e20: 20 20 75 38 20 6d 61 74 63 68 41 6c 6c 20 3d 20    u8 matchAll = 
2e30: 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c 6c 3b  pInfo->matchAll;
2e40: 0a 20 20 75 38 20 6d 61 74 63 68 53 65 74 20 3d  .  u8 matchSet =
2e50: 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74   pInfo->matchSet
2e60: 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65 20 3d 20  ;.  u8 noCase = 
2e70: 70 49 6e 66 6f 2d 3e 6e 6f 43 61 73 65 3b 20 0a  pInfo->noCase; .
2e80: 20 20 69 6e 74 20 70 72 65 76 45 73 63 61 70 65    int prevEscape
2e90: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
2ea0: 65 20 69 66 20 74 68 65 20 70 72 65 76 69 6f 75  e if the previou
2eb0: 73 20 63 68 61 72 61 63 74 65 72 20 77 61 73 20  s character was 
2ec0: 27 65 73 63 61 70 65 27 20 2a 2f 0a 0a 20 20 77  'escape' */..  w
2ed0: 68 69 6c 65 28 20 28 63 20 3d 20 73 71 6c 69 74  hile( (c = sqlit
2ee0: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
2ef0: 65 72 6e 2c 30 2c 26 7a 50 61 74 74 65 72 6e 29  ern,0,&zPattern)
2f00: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
2f10: 21 70 72 65 76 45 73 63 61 70 65 20 26 26 20 63  !prevEscape && c
2f20: 3d 3d 6d 61 74 63 68 41 6c 6c 20 29 7b 0a 20 20  ==matchAll ){.  
2f30: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 73 71      while( (c=sq
2f40: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50  lite3Utf8Read(zP
2f50: 61 74 74 65 72 6e 2c 30 2c 26 7a 50 61 74 74 65  attern,0,&zPatte
2f60: 72 6e 29 29 20 3d 3d 20 6d 61 74 63 68 41 6c 6c  rn)) == matchAll
2f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f80: 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68 4f 6e 65  || c == matchOne
2f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2fa0: 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26 26 20 73  c==matchOne && s
2fb0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
2fc0: 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74 72  String, 0, &zStr
2fd0: 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ing)==0 ){.     
2fe0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2ff0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3000: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
3010: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3020: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
3030: 20 69 66 28 20 63 3d 3d 65 73 63 20 29 7b 0a 20   if( c==esc ){. 
3040: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
3050: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
3060: 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65 72  ern, 0, &zPatter
3070: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
3080: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
3090: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
30a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
30b0: 65 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 53 65  e if( c==matchSe
30c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
30d0: 65 72 74 28 20 65 73 63 3d 3d 30 20 29 3b 20 20  ert( esc==0 );  
30e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
30f0: 73 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45  s GLOB, not LIKE
3100: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
3110: 72 74 28 20 6d 61 74 63 68 53 65 74 3c 30 78 38  rt( matchSet<0x8
3120: 30 20 29 3b 20 20 2f 2a 20 27 5b 27 20 69 73 20  0 );  /* '[' is 
3130: 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 63 68  a single-byte ch
3140: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 20 20 20  aracter */.     
3150: 20 20 20 77 68 69 6c 65 28 20 2a 7a 53 74 72 69     while( *zStri
3160: 6e 67 20 26 26 20 70 61 74 74 65 72 6e 43 6f 6d  ng && patternCom
3170: 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 2d  pare(&zPattern[-
3180: 31 5d 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f  1],zString,pInfo
3190: 2c 65 73 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,esc)==0 ){.    
31a0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
31b0: 50 5f 55 54 46 38 28 7a 53 74 72 69 6e 67 29 3b  P_UTF8(zString);
31c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31d0: 20 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69     return *zStri
31e0: 6e 67 21 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ng!=0;.      }. 
31f0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 20       while( (c2 
3200: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
3210: 64 28 7a 53 74 72 69 6e 67 2c 30 2c 26 7a 53 74  d(zString,0,&zSt
3220: 72 69 6e 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  ring))!=0 ){.   
3230: 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20       if( noCase 
3240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20  ){.          c2 
3250: 3d 20 63 32 3c 30 78 38 30 20 3f 20 73 71 6c 69  = c2<0x80 ? sqli
3260: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
3270: 63 32 5d 20 3a 20 63 32 3b 0a 20 20 20 20 20 20  c2] : c2;.      
3280: 20 20 20 20 63 20 3d 20 63 3c 30 78 38 30 20 3f      c = c<0x80 ?
3290: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
32a0: 6f 77 65 72 5b 63 5d 20 3a 20 63 3b 0a 20 20 20  ower[c] : c;.   
32b0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32         while( c2
32c0: 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63   != 0 && c2 != c
32d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32e0: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
32f0: 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 30 2c  Read(zString, 0,
3300: 20 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20   &zString);.    
3310: 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3c 30          if( c2<0
3320: 78 38 30 20 29 20 63 32 20 3d 20 73 71 6c 69 74  x80 ) c2 = sqlit
3330: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
3340: 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  2];.          }.
3350: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
3360: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
3370: 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d  c2 != 0 && c2 !=
3380: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
3390: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74    c2 = sqlite3Ut
33a0: 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20  f8Read(zString, 
33b0: 30 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20  0, &zString);.  
33c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
33e0: 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  c2==0 ) return 0
33f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 61  ;.        if( pa
3400: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 50 61  tternCompare(zPa
3410: 74 74 65 72 6e 2c 7a 53 74 72 69 6e 67 2c 70 49  ttern,zString,pI
3420: 6e 66 6f 2c 65 73 63 29 20 29 20 72 65 74 75 72  nfo,esc) ) retur
3430: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
3440: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
3450: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 72 65 76   }else if( !prev
3460: 45 73 63 61 70 65 20 26 26 20 63 3d 3d 6d 61 74  Escape && c==mat
3470: 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 69  chOne ){.      i
3480: 66 28 20 73 71 6c 69 74 65 33 55 74 66 38 52 65  f( sqlite3Utf8Re
3490: 61 64 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26  ad(zString, 0, &
34a0: 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a 20  zString)==0 ){. 
34b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
34c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
34d0: 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 53  se if( c==matchS
34e0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
34f0: 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
3500: 20 20 20 61 73 73 65 72 74 28 20 65 73 63 3d 3d     assert( esc==
3510: 30 20 29 3b 20 20 20 20 2f 2a 20 54 68 69 73 20  0 );    /* This 
3520: 6f 6e 6c 79 20 6f 63 63 75 72 73 20 66 6f 72 20  only occurs for 
3530: 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a  GLOB, not LIKE *
3540: 2f 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30  /.      seen = 0
3550: 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d  ;.      invert =
3560: 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 73 71   0;.      c = sq
3570: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 53  lite3Utf8Read(zS
3580: 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74 72 69  tring, 0, &zStri
3590: 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ng);.      if( c
35a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
35b0: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
35c0: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
35d0: 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65 72  ern, 0, &zPatter
35e0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32  n);.      if( c2
35f0: 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='^' ){.       
3600: 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20   invert = 1;.   
3610: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
3620: 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65  3Utf8Read(zPatte
3630: 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65 72 6e  rn, 0, &zPattern
3640: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3650: 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a   if( c2==']' ){.
3660: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
3670: 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  ]' ) seen = 1;. 
3680: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
3690: 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74  te3Utf8Read(zPat
36a0: 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65  tern, 0, &zPatte
36b0: 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rn);.      }.   
36c0: 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26 20     while( c2 && 
36d0: 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2!=']' ){.     
36e0: 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26     if( c2=='-' &
36f0: 26 20 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d 27  & zPattern[0]!='
3700: 5d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 30  ]' && zPattern[0
3710: 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e  ]!=0 && prior_c>
3720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
3730: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
3740: 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c  ead(zPattern, 0,
3750: 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20   &zPattern);.   
3760: 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72         if( c>=pr
3770: 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29  ior_c && c<=c2 )
3780: 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
3790: 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30       prior_c = 0
37a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
37b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
37c0: 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==c2 ){.        
37d0: 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20      seen = 1;.  
37e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37f0: 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32      prior_c = c2
3800: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3810: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
3820: 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65 72  Utf8Read(zPatter
3830: 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65 72 6e 29  n, 0, &zPattern)
3840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3850: 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65  if( c2==0 || (se
3860: 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20  en ^ invert)==0 
3870: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3880: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
3890: 20 7d 65 6c 73 65 20 69 66 28 20 65 73 63 3d 3d   }else if( esc==
38a0: 63 20 26 26 20 21 70 72 65 76 45 73 63 61 70 65  c && !prevEscape
38b0: 20 29 7b 0a 20 20 20 20 20 20 70 72 65 76 45 73   ){.      prevEs
38c0: 63 61 70 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65  cape = 1;.    }e
38d0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 32 20 3d 20  lse{.      c2 = 
38e0: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
38f0: 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74  zString, 0, &zSt
3900: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28  ring);.      if(
3910: 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20   noCase ){.     
3920: 20 20 20 63 20 3d 20 63 3c 30 78 38 30 20 3f 20     c = c<0x80 ? 
3930: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
3940: 77 65 72 5b 63 5d 20 3a 20 63 3b 0a 20 20 20 20  wer[c] : c;.    
3950: 20 20 20 20 63 32 20 3d 20 63 32 3c 30 78 38 30      c2 = c2<0x80
3960: 20 3f 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   ? sqlite3UpperT
3970: 6f 4c 6f 77 65 72 5b 63 32 5d 20 3a 20 63 32 3b  oLower[c2] : c2;
3980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3990: 66 28 20 63 21 3d 63 32 20 29 7b 0a 20 20 20 20  f( c!=c2 ){.    
39a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
39b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 65 76      }.      prev
39c0: 45 73 63 61 70 65 20 3d 20 30 3b 0a 20 20 20 20  Escape = 0;.    
39d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  }.  }.  return *
39e0: 7a 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f  zString==0;.}../
39f0: 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
3a00: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
3a10: 68 61 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  hat the LIKE ope
3a20: 72 61 74 6f 72 20 28 6f 72 20 47 4c 4f 42 20 77  rator (or GLOB w
3a30: 68 69 63 68 20 69 73 0a 2a 2a 20 6a 75 73 74 20  hich is.** just 
3a40: 61 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 4c  a variation of L
3a50: 49 4b 45 29 20 67 65 74 73 20 63 61 6c 6c 65 64  IKE) gets called
3a60: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
3a70: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 6f  for testing.** o
3a80: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
3a90: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
3aa0: 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e  qlite3_like_coun
3ab0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a  t = 0;.#endif...
3ac0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
3ad0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6b 65  tion of the like
3ae0: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  () SQL function.
3af0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
3b00: 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  implements.** th
3b10: 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49 4b 45 20  e build-in LIKE 
3b20: 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20 66  operator.  The f
3b30: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
3b40: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
3b50: 20 74 68 65 0a 2a 2a 20 70 61 74 74 65 72 6e 20   the.** pattern 
3b60: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 61  and the second a
3b70: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 73  rgument is the s
3b80: 74 72 69 6e 67 2e 20 20 53 6f 2c 20 74 68 65 20  tring.  So, the 
3b90: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a  SQL statements:.
3ba0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20 4c 49  **.**       A LI
3bb0: 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69 6d  KE B.**.** is im
3bc0: 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 6c 69 6b  plemented as lik
3bd0: 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  e(B,A)..**.** Th
3be0: 69 73 20 73 61 6d 65 20 66 75 6e 63 74 69 6f 6e  is same function
3bf0: 20 28 77 69 74 68 20 61 20 64 69 66 66 65 72 65   (with a differe
3c00: 6e 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73  nt compareInfo s
3c10: 74 72 75 63 74 75 72 65 29 20 63 6f 6d 70 75 74  tructure) comput
3c20: 65 73 0a 2a 2a 20 74 68 65 20 47 4c 4f 42 20 6f  es.** the GLOB o
3c30: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
3c40: 69 63 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e 63  ic void likeFunc
3c50: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3c60: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
3c70: 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71   int argc, .  sq
3c80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
3c90: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  gv.){.  const un
3ca0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 2c  signed char *zA,
3cb0: 20 2a 7a 42 3b 0a 20 20 69 6e 74 20 65 73 63 61   *zB;.  int esca
3cc0: 70 65 20 3d 20 30 3b 0a 0a 20 20 7a 42 20 3d 20  pe = 0;..  zB = 
3cd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
3ce0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
3cf0: 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  A = sqlite3_valu
3d00: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
3d10: 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74 68 65  ..  /* Limit the
3d20: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 4c   length of the L
3d30: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74 74  IKE or GLOB patt
3d40: 65 72 6e 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  ern to avoid pro
3d50: 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20 64 65  blems.  ** of de
3d60: 65 70 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64  ep recursion and
3d70: 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20 69 6e   N*N behavior in
3d80: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
3d90: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  )..  */.  if( sq
3da0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
3db0: 73 28 61 72 67 76 5b 30 5d 29 3e 53 51 4c 49 54  s(argv[0])>SQLIT
3dc0: 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
3dd0: 52 4e 5f 4c 45 4e 47 54 48 20 29 7b 0a 20 20 20  RN_LENGTH ){.   
3de0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3df0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
3e00: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74  LIKE or GLOB pat
3e10: 74 65 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c 65 78  tern too complex
3e20: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  ", -1);.    retu
3e30: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
3e40: 28 20 7a 42 3d 3d 73 71 6c 69 74 65 33 5f 76 61  ( zB==sqlite3_va
3e50: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
3e60: 29 20 29 3b 20 20 2f 2a 20 45 6e 63 6f 64 69 6e  ) );  /* Encodin
3e70: 67 20 64 69 64 20 6e 6f 74 20 63 68 61 6e 67 65  g did not change
3e80: 20 2a 2f 0a 0a 20 20 69 66 28 20 61 72 67 63 3d   */..  if( argc=
3e90: 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =3 ){.    /* The
3ea0: 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65   escape characte
3eb0: 72 20 73 74 72 69 6e 67 20 6d 75 73 74 20 63 6f  r string must co
3ec0: 6e 73 69 73 74 20 6f 66 20 61 20 73 69 6e 67 6c  nsist of a singl
3ed0: 65 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  e UTF-8 characte
3ee0: 72 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  r..    ** Otherw
3ef0: 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
3f00: 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
3f10: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3f20: 63 68 61 72 20 2a 7a 45 73 63 20 3d 20 73 71 6c  char *zEsc = sql
3f30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
3f40: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66  argv[2]);.    if
3f50: 28 20 7a 45 73 63 3d 3d 30 20 29 20 72 65 74 75  ( zEsc==0 ) retu
3f60: 72 6e 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  rn;.    if( sqli
3f70: 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 28  te3Utf8CharLen((
3f80: 63 68 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29 21  char*)zEsc, -1)!
3f90: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
3fa0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
3fb0: 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  (context, .     
3fc0: 20 20 20 20 20 22 45 53 43 41 50 45 20 65 78 70       "ESCAPE exp
3fd0: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
3fe0: 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74  a single charact
3ff0: 65 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  er", -1);.      
4000: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
4010: 20 20 65 73 63 61 70 65 20 3d 20 73 71 6c 69 74    escape = sqlit
4020: 65 33 55 74 66 38 52 65 61 64 28 7a 45 73 63 2c  e3Utf8Read(zEsc,
4030: 20 30 2c 20 26 7a 45 73 63 29 3b 0a 20 20 7d 0a   0, &zEsc);.  }.
4040: 20 20 69 66 28 20 7a 41 20 26 26 20 7a 42 20 29    if( zA && zB )
4050: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6d  {.    struct com
4060: 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  pareInfo *pInfo 
4070: 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
4080: 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 23 69  ata(context);.#i
4090: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
40a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b  .    sqlite3_lik
40b0: 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  e_count++;.#endi
40c0: 66 0a 20 20 20 20 0a 20 20 20 20 73 71 6c 69 74  f.    .    sqlit
40d0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
40e0: 6e 74 65 78 74 2c 20 70 61 74 74 65 72 6e 43 6f  ntext, patternCo
40f0: 6d 70 61 72 65 28 7a 42 2c 20 7a 41 2c 20 70 49  mpare(zB, zA, pI
4100: 6e 66 6f 2c 20 65 73 63 61 70 65 29 29 3b 0a 20  nfo, escape));. 
4110: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
4120: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
4130: 65 20 4e 55 4c 4c 49 46 28 78 2c 79 29 20 66 75  e NULLIF(x,y) fu
4140: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 73  nction.  The res
4150: 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ult is the first
4160: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 66 20  .** argument if 
4170: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72  the arguments ar
4180: 65 20 64 69 66 66 65 72 65 6e 74 2e 20 20 54 68  e different.  Th
4190: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
41a0: 20 69 66 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   if the.** argum
41b0: 65 6e 74 73 20 61 72 65 20 65 71 75 61 6c 20 74  ents are equal t
41c0: 6f 20 65 61 63 68 20 6f 74 68 65 72 2e 0a 2a 2f  o each other..*/
41d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 75 6c  .static void nul
41e0: 6c 69 66 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  lifFunc(.  sqlit
41f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4200: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
4210: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4220: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 43 6f 6c   **argv.){.  Col
4230: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
4240: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
4250: 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  Seq(context);.  
4260: 69 66 28 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  if( sqlite3MemCo
4270: 6d 70 61 72 65 28 61 72 67 76 5b 30 5d 2c 20 61  mpare(argv[0], a
4280: 72 67 76 5b 31 5d 2c 20 70 43 6f 6c 6c 29 21 3d  rgv[1], pColl)!=
4290: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
42a0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
42b0: 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b  ntext, argv[0]);
42c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
42d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
42e0: 74 68 65 20 56 45 52 53 49 4f 4e 28 2a 29 20 66  the VERSION(*) f
42f0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65  unction.  The re
4300: 73 75 6c 74 20 69 73 20 74 68 65 20 76 65 72 73  sult is the vers
4310: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 53 51  ion.** of the SQ
4320: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 74 68 61  Lite library tha
4330: 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2f  t is running..*/
4340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72  .static void ver
4350: 73 69 6f 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69  sionFunc(.  sqli
4360: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
4370: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
4380: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
4390: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  e **argv.){.  sq
43a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
43b0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
43c0: 65 33 5f 76 65 72 73 69 6f 6e 2c 20 2d 31 2c 20  e3_version, -1, 
43d0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
43e0: 7d 0a 0a 2f 2a 20 41 72 72 61 79 20 66 6f 72 20  }../* Array for 
43f0: 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20  converting from 
4400: 68 61 6c 66 2d 62 79 74 65 73 20 28 6e 79 62 62  half-bytes (nybb
4410: 6c 65 73 29 20 69 6e 74 6f 20 41 53 43 49 49 20  les) into ASCII 
4420: 68 65 78 0a 2a 2a 20 64 69 67 69 74 73 2e 20 2a  hex.** digits. *
4430: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
4440: 68 61 72 20 68 65 78 64 69 67 69 74 73 5b 5d 20  har hexdigits[] 
4450: 3d 20 7b 0a 20 20 27 30 27 2c 20 27 31 27 2c 20  = {.  '0', '1', 
4460: 27 32 27 2c 20 27 33 27 2c 20 27 34 27 2c 20 27  '2', '3', '4', '
4470: 35 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a 20 20  5', '6', '7',.  
4480: 27 38 27 2c 20 27 39 27 2c 20 27 41 27 2c 20 27  '8', '9', 'A', '
4490: 42 27 2c 20 27 43 27 2c 20 27 44 27 2c 20 27 45  B', 'C', 'D', 'E
44a0: 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f 2a 0a 2a  ', 'F' .};../*.*
44b0: 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2d  * EXPERIMENTAL -
44c0: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20   This is not an 
44d0: 6f 66 66 69 63 69 61 6c 20 66 75 6e 63 74 69 6f  official functio
44e0: 6e 2e 20 20 54 68 65 20 69 6e 74 65 72 66 61 63  n.  The interfac
44f0: 65 20 6d 61 79 0a 2a 2a 20 63 68 61 6e 67 65 2e  e may.** change.
4500: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
4510: 6d 61 79 20 64 69 73 61 70 70 65 61 72 2e 20 20  may disappear.  
4520: 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 63 6f 64  Do not write cod
4530: 65 20 74 68 61 74 20 64 65 70 65 6e 64 73 0a 2a  e that depends.*
4540: 2a 20 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69  * on this functi
4550: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  on..**.** Implem
4560: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
4570: 51 55 4f 54 45 28 29 20 66 75 6e 63 74 69 6f 6e  QUOTE() function
4580: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
4590: 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a   takes a single.
45a0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66  ** argument.  If
45b0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
45c0: 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 20 72 65   numeric, the re
45d0: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
45e0: 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68 65  e same as.** the
45f0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74   argument.  If t
4600: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  he argument is N
4610: 55 4c 4c 2c 20 74 68 65 20 72 65 74 75 72 6e 20  ULL, the return 
4620: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 74 72  value is the str
4630: 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20  ing.** "NULL".  
4640: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
4650: 72 67 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c 6f  rgument is enclo
4660: 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 71 75  sed in single qu
4670: 6f 74 65 73 20 77 69 74 68 0a 2a 2a 20 73 69 6e  otes with.** sin
4680: 67 6c 65 2d 71 75 6f 74 65 20 65 73 63 61 70 65  gle-quote escape
4690: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
46a0: 64 20 71 75 6f 74 65 46 75 6e 63 28 73 71 6c 69  d quoteFunc(sqli
46b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
46c0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
46d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
46e0: 61 72 67 76 29 7b 0a 20 20 69 66 28 20 61 72 67  argv){.  if( arg
46f0: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
4700: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
4710: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
4720: 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  0]) ){.    case 
4730: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
4740: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
4750: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
4760: 2c 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51 4c  , "NULL", 4, SQL
4770: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
4780: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4790: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
47a0: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
47b0: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
47c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
47d0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
47e0: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  text, argv[0]);.
47f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4800: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
4810: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
4820: 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 30   char *zText = 0
4830: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e  ;.      char con
4840: 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69  st *zBlob = sqli
4850: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
4860: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  rgv[0]);.      i
4870: 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  nt nBlob = sqlit
4880: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
4890: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 61  rgv[0]);.      a
48a0: 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d 3d 73 71  ssert( zBlob==sq
48b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
48c0: 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 2f 2a 20  (argv[0]) ); /* 
48d0: 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e  No encoding chan
48e0: 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ge */..      if(
48f0: 20 32 2a 6e 42 6c 6f 62 2b 34 3e 53 51 4c 49 54   2*nBlob+4>SQLIT
4900: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 7b 0a  E_MAX_LENGTH ){.
4910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4920: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f  result_error_too
4930: 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  big(context);.  
4940: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
4950: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 78      }.      zTex
4960: 74 20 3d 20 28 63 68 61 72 20 2a 29 63 6f 6e 74  t = (char *)cont
4970: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
4980: 74 2c 20 28 32 2a 6e 42 6c 6f 62 29 2b 34 29 3b  t, (2*nBlob)+4);
4990: 20 0a 20 20 20 20 20 20 69 66 28 20 7a 54 65 78   .      if( zTex
49a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
49b0: 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
49c0: 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b  i=0; i<nBlob; i+
49d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  +){.          zT
49e0: 65 78 74 5b 28 69 2a 32 29 2b 32 5d 20 3d 20 68  ext[(i*2)+2] = h
49f0: 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b  exdigits[(zBlob[
4a00: 69 5d 3e 3e 34 29 26 30 78 30 46 5d 3b 0a 20 20  i]>>4)&0x0F];.  
4a10: 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69          zText[(i
4a20: 2a 32 29 2b 33 5d 20 3d 20 68 65 78 64 69 67 69  *2)+3] = hexdigi
4a30: 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 29 26 30 78  ts[(zBlob[i])&0x
4a40: 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  0F];.        }. 
4a50: 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42         zText[(nB
4a60: 6c 6f 62 2a 32 29 2b 32 5d 20 3d 20 27 5c 27 27  lob*2)+2] = '\''
4a70: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b  ;.        zText[
4a80: 28 6e 42 6c 6f 62 2a 32 29 2b 33 5d 20 3d 20 27  (nBlob*2)+3] = '
4a90: 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  \0';.        zTe
4aa0: 78 74 5b 30 5d 20 3d 20 27 58 27 3b 0a 20 20 20  xt[0] = 'X';.   
4ab0: 20 20 20 20 20 7a 54 65 78 74 5b 31 5d 20 3d 20       zText[1] = 
4ac0: 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 73 71  '\'';.        sq
4ad0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4ae0: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 54 65 78 74  t(context, zText
4af0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
4b00: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20  NSIENT);.       
4b10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
4b20: 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ext);.      }.  
4b30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4b40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4b50: 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEXT: {.      i
4b60: 6e 74 20 69 2c 6a 3b 0a 20 20 20 20 20 20 75 36  nt i,j;.      u6
4b70: 34 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  4 n;.      const
4b80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4b90: 7a 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 76  zArg = sqlite3_v
4ba0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
4bb0: 5d 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ]);.      char *
4bc0: 7a 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 41  z;..      if( zA
4bd0: 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  rg==0 ) return;.
4be0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6e        for(i=0, n
4bf0: 3d 30 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b  =0; zArg[i]; i++
4c00: 29 7b 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d  ){ if( zArg[i]==
4c10: 27 5c 27 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20  '\'' ) n++; }.  
4c20: 20 20 20 20 69 66 28 20 69 2b 6e 2b 33 3e 53 51      if( i+n+3>SQ
4c30: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
4c40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4c50: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
4c60: 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b  toobig(context);
4c70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
4c80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
4c90: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
4ca0: 28 63 6f 6e 74 65 78 74 2c 20 69 2b 6e 2b 33 29  (context, i+n+3)
4cb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b  ;.      if( z ){
4cc0: 0a 20 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20  .        z[0] = 
4cd0: 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 66 6f  '\'';.        fo
4ce0: 72 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67  r(i=0, j=1; zArg
4cf0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
4d00: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41       z[j++] = zA
4d10: 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  rg[i];.         
4d20: 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c   if( zArg[i]=='\
4d30: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  '' ){.          
4d40: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b    z[j++] = '\'';
4d50: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
4d70: 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [j++] = '\'';.  
4d80: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
4d90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4da0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
4db0: 65 78 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74  ext, z, j, sqlit
4dc0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20  e3_free);.      
4dd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
4de0: 2a 0a 2a 2a 20 54 68 65 20 68 65 78 28 29 20 66  *.** The hex() f
4df0: 75 6e 63 74 69 6f 6e 2e 20 20 49 6e 74 65 72 70  unction.  Interp
4e00: 72 65 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ret the argument
4e10: 20 61 73 20 61 20 62 6c 6f 62 2e 20 20 52 65 74   as a blob.  Ret
4e20: 75 72 6e 0a 2a 2a 20 61 20 68 65 78 61 64 65 63  urn.** a hexadec
4e30: 69 6d 61 6c 20 72 65 6e 64 65 72 69 6e 67 20 61  imal rendering a
4e40: 73 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69  s text..*/.stati
4e50: 63 20 76 6f 69 64 20 68 65 78 46 75 6e 63 28 0a  c void hexFunc(.
4e60: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
4e70: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
4e80: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
4e90: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
4ea0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
4eb0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4ec0: 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 63 68  har *pBlob;.  ch
4ed0: 61 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a 20 20  ar *zHex, *z;.  
4ee0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
4ef0: 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c  );.  pBlob = sql
4f00: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
4f10: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20  argv[0]);.  n = 
4f20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
4f30: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
4f40: 69 66 28 20 6e 2a 32 2b 31 3e 53 51 4c 49 54 45  if( n*2+1>SQLITE
4f50: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 7b 0a 20  _MAX_LENGTH ){. 
4f60: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4f70: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
4f80: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74  ontext);.    ret
4f90: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
4fa0: 74 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65  t( pBlob==sqlite
4fb0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
4fc0: 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20  v[0]) );  /* No 
4fd0: 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20  encoding change 
4fe0: 2a 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20  */.  z = zHex = 
4ff0: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
5000: 6e 74 65 78 74 2c 20 6e 2a 32 20 2b 20 31 29 3b  ntext, n*2 + 1);
5010: 0a 20 20 69 66 28 20 7a 48 65 78 20 29 7b 0a 20  .  if( zHex ){. 
5020: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
5030: 20 69 2b 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a   i++, pBlob++){.
5040: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
5050: 68 61 72 20 63 20 3d 20 2a 70 42 6c 6f 62 3b 0a  har c = *pBlob;.
5060: 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68        *(z++) = h
5070: 65 78 64 69 67 69 74 73 5b 28 63 3e 3e 34 29 26  exdigits[(c>>4)&
5080: 30 78 66 5d 3b 0a 20 20 20 20 20 20 2a 28 7a 2b  0xf];.      *(z+
5090: 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b 63  +) = hexdigits[c
50a0: 26 30 78 66 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  &0xf];.    }.   
50b0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c   *z = 0;.    sql
50c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
50d0: 28 63 6f 6e 74 65 78 74 2c 20 7a 48 65 78 2c 20  (context, zHex, 
50e0: 6e 2a 32 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  n*2, sqlite3_fre
50f0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
5100: 20 54 68 65 20 7a 65 72 6f 62 6c 6f 62 28 4e 29   The zeroblob(N)
5110: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5120: 73 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  s a zero-filled 
5130: 62 6c 6f 62 20 6f 66 20 73 69 7a 65 20 4e 20 62  blob of size N b
5140: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
5150: 76 6f 69 64 20 7a 65 72 6f 62 6c 6f 62 46 75 6e  void zeroblobFun
5160: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5170: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
5180: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
5190: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
51a0: 76 0a 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  v.){.  i64 n;.  
51b0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
51c0: 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
51d0: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
51e0: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 53  v[0]);.  if( n>S
51f0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
5200: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5210: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f  result_error_too
5220: 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  big(context);.  
5230: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
5240: 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c  e3_result_zerobl
5250: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a  ob(context, n);.
5260: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
5270: 20 72 65 70 6c 61 63 65 28 29 20 66 75 6e 63 74   replace() funct
5280: 69 6f 6e 2e 20 20 54 68 72 65 65 20 61 72 67 75  ion.  Three argu
5290: 6d 65 6e 74 73 20 61 72 65 20 61 6c 6c 20 73 74  ments are all st
52a0: 72 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74  rings: call.** t
52b0: 68 65 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43 2e  hem A, B, and C.
52c0: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
52d0: 6c 73 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69  lso a string whi
52e0: 63 68 20 69 73 20 64 65 72 69 76 65 64 0a 2a 2a  ch is derived.**
52f0: 20 66 72 6f 6d 20 41 20 62 79 20 72 65 70 6c 61   from A by repla
5300: 63 69 6e 67 20 65 76 65 72 79 20 6f 63 63 75 72  cing every occur
5310: 61 6e 63 65 20 6f 66 20 42 20 77 69 74 68 20 43  ance of B with C
5320: 2e 20 20 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20  .  The match.** 
5330: 6d 75 73 74 20 62 65 20 65 78 61 63 74 2e 20 20  must be exact.  
5340: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
5350: 63 65 73 20 61 72 65 20 6e 6f 74 20 75 73 65 64  ces are not used
5360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5370: 20 72 65 70 6c 61 63 65 46 75 6e 63 28 0a 20 20   replaceFunc(.  
5380: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5390: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
53a0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
53b0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
53c0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
53d0: 20 63 68 61 72 20 2a 7a 53 74 72 3b 20 20 20 20   char *zStr;    
53e0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74      /* The input
53f0: 20 73 74 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63   string A */.  c
5400: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5410: 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20  ar *zPattern;   
5420: 20 2f 2a 20 54 68 65 20 70 61 74 74 65 72 6e 20   /* The pattern 
5430: 73 74 72 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f  string B */.  co
5440: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5450: 72 20 2a 7a 52 65 70 3b 20 20 20 20 20 20 20 20  r *zRep;        
5460: 2f 2a 20 54 68 65 20 72 65 70 6c 61 63 65 6d 65  /* The replaceme
5470: 6e 74 20 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20  nt string C */. 
5480: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5490: 7a 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  zOut;           
54a0: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
54b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20   */.  int nStr; 
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
54d0: 2a 20 53 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a  * Size of zStr *
54e0: 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e  /.  int nPattern
54f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5500: 53 69 7a 65 20 6f 66 20 7a 50 61 74 74 65 72 6e  Size of zPattern
5510: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20   */.  int nRep; 
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5530: 2a 20 53 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a  * Size of zRep *
5540: 2f 0a 20 20 69 36 34 20 6e 4f 75 74 3b 20 20 20  /.  i64 nOut;   
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5560: 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  Maximum size of 
5570: 7a 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  zOut */.  int lo
5580: 6f 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  opLimit;        
5590: 20 20 20 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b     /* Last zStr[
55a0: 5d 20 74 68 61 74 20 6d 69 67 68 74 20 6d 61 74  ] that might mat
55b0: 63 68 20 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f  ch zPattern[] */
55c0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
55e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
55f0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
5600: 3d 33 20 29 3b 0a 20 20 7a 53 74 72 20 3d 20 73  =3 );.  zStr = s
5610: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5620: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
5630: 28 20 7a 53 74 72 3d 3d 30 20 29 20 72 65 74 75  ( zStr==0 ) retu
5640: 72 6e 3b 0a 20 20 6e 53 74 72 20 3d 20 73 71 6c  rn;.  nStr = sql
5650: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
5660: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73  (argv[0]);.  ass
5670: 65 72 74 28 20 7a 53 74 72 3d 3d 73 71 6c 69 74  ert( zStr==sqlit
5680: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5690: 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f  gv[0]) );  /* No
56a0: 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65   encoding change
56b0: 20 2a 2f 0a 20 20 7a 50 61 74 74 65 72 6e 20 3d   */.  zPattern =
56c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
56d0: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
56e0: 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20  if( zPattern==0 
56f0: 7c 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d  || zPattern[0]==
5700: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 50  0 ) return;.  nP
5710: 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33  attern = sqlite3
5720: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
5730: 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[1]);.  assert(
5740: 20 7a 50 61 74 74 65 72 6e 3d 3d 73 71 6c 69 74   zPattern==sqlit
5750: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5760: 67 76 5b 31 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f  gv[1]) );  /* No
5770: 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65   encoding change
5780: 20 2a 2f 0a 20 20 7a 52 65 70 20 3d 20 73 71 6c   */.  zRep = sql
5790: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
57a0: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  argv[2]);.  if( 
57b0: 7a 52 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  zRep==0 ) return
57c0: 3b 0a 20 20 6e 52 65 70 20 3d 20 73 71 6c 69 74  ;.  nRep = sqlit
57d0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
57e0: 72 67 76 5b 32 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[2]);.  asser
57f0: 74 28 20 7a 52 65 70 3d 3d 73 71 6c 69 74 65 33  t( zRep==sqlite3
5800: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
5810: 5b 32 5d 29 20 29 3b 0a 20 20 6e 4f 75 74 20 3d  [2]) );.  nOut =
5820: 20 6e 53 74 72 20 2b 20 31 3b 0a 20 20 61 73 73   nStr + 1;.  ass
5830: 65 72 74 28 20 6e 4f 75 74 3c 53 51 4c 49 54 45  ert( nOut<SQLITE
5840: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
5850: 20 7a 4f 75 74 20 3d 20 63 6f 6e 74 65 78 74 4d   zOut = contextM
5860: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28  alloc(context, (
5870: 69 6e 74 29 6e 4f 75 74 29 3b 0a 20 20 69 66 28  int)nOut);.  if(
5880: 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zOut==0 ){.    
5890: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 6f  return;.  }.  lo
58a0: 6f 70 4c 69 6d 69 74 20 3d 20 6e 53 74 72 20 2d  opLimit = nStr -
58b0: 20 6e 50 61 74 74 65 72 6e 3b 20 20 0a 20 20 66   nPattern;  .  f
58c0: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 3d 6c 6f 6f  or(i=j=0; i<=loo
58d0: 70 4c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20 20  pLimit; i++){.  
58e0: 20 20 69 66 28 20 7a 53 74 72 5b 69 5d 21 3d 7a    if( zStr[i]!=z
58f0: 50 61 74 74 65 72 6e 5b 30 5d 20 7c 7c 20 6d 65  Pattern[0] || me
5900: 6d 63 6d 70 28 26 7a 53 74 72 5b 69 5d 2c 20 7a  mcmp(&zStr[i], z
5910: 50 61 74 74 65 72 6e 2c 20 6e 50 61 74 74 65 72  Pattern, nPatter
5920: 6e 29 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74  n) ){.      zOut
5930: 5b 6a 2b 2b 5d 20 3d 20 7a 53 74 72 5b 69 5d 3b  [j++] = zStr[i];
5940: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5950: 20 20 75 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20    u8 *zOld;.    
5960: 20 20 6e 4f 75 74 20 2b 3d 20 6e 52 65 70 20 2d    nOut += nRep -
5970: 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20   nPattern;.     
5980: 20 69 66 28 20 6e 4f 75 74 3e 3d 53 51 4c 49 54   if( nOut>=SQLIT
5990: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 7b 0a  E_MAX_LENGTH ){.
59a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
59b0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f  result_error_too
59c0: 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  big(context);.  
59d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
59e0: 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
59f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
5a00: 7d 0a 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 7a  }.      zOld = z
5a10: 4f 75 74 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  Out;.      zOut 
5a20: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
5a30: 63 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e 4f 75  c(zOut, (int)nOu
5a40: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f  t);.      if( zO
5a50: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
5a60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5a70: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
5a80: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ext);.        sq
5a90: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29  lite3_free(zOld)
5aa0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
5ab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ac0: 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c  memcpy(&zOut[j],
5ad0: 20 7a 52 65 70 2c 20 6e 52 65 70 29 3b 0a 20 20   zRep, nRep);.  
5ae0: 20 20 20 20 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20      j += nRep;. 
5af0: 20 20 20 20 20 69 20 2b 3d 20 6e 50 61 74 74 65       i += nPatte
5b00: 72 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn-1;.    }.  }.
5b10: 20 20 61 73 73 65 72 74 28 20 6a 2b 6e 53 74 72    assert( j+nStr
5b20: 2d 69 2b 31 3d 3d 6e 4f 75 74 20 29 3b 0a 20 20  -i+1==nOut );.  
5b30: 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c  memcpy(&zOut[j],
5b40: 20 26 7a 53 74 72 5b 69 5d 2c 20 6e 53 74 72 2d   &zStr[i], nStr-
5b50: 69 29 3b 0a 20 20 6a 20 2b 3d 20 6e 53 74 72 20  i);.  j += nStr 
5b60: 2d 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  - i;.  assert( j
5b70: 3c 3d 6e 4f 75 74 20 29 3b 0a 20 20 7a 4f 75 74  <=nOut );.  zOut
5b80: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [j] = 0;.  sqlit
5b90: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5ba0: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a  ontext, (char*)z
5bb0: 4f 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f  Out, j, sqlite3_
5bc0: 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  free);.}../*.** 
5bd0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
5be0: 66 20 74 68 65 20 54 52 49 4d 28 29 2c 20 4c 54  f the TRIM(), LT
5bf0: 52 49 4d 28 29 2c 20 61 6e 64 20 52 54 52 49 4d  RIM(), and RTRIM
5c00: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  () functions..**
5c10: 20 54 68 65 20 75 73 65 72 64 61 74 61 20 69 73   The userdata is
5c20: 20 30 78 31 20 66 6f 72 20 6c 65 66 74 20 74 72   0x1 for left tr
5c30: 69 6d 2c 20 30 78 32 20 66 6f 72 20 72 69 67 68  im, 0x2 for righ
5c40: 74 20 74 72 69 6d 2c 20 30 78 33 20 66 6f 72 20  t trim, 0x3 for 
5c50: 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
5c60: 76 6f 69 64 20 74 72 69 6d 46 75 6e 63 28 0a 20  void trimFunc(. 
5c70: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
5c80: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
5c90: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
5ca0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5cb0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
5cc0: 64 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20  d char *zIn;    
5cd0: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74       /* Input st
5ce0: 72 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ring */.  const 
5cf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
5d00: 43 68 61 72 53 65 74 3b 20 20 20 20 2f 2a 20 53  CharSet;    /* S
5d10: 65 74 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  et of characters
5d20: 20 74 6f 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e   to trim */.  in
5d30: 74 20 6e 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t nIn;          
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
5d60: 65 73 20 69 6e 20 69 6e 70 75 74 20 2a 2f 0a 20  es in input */. 
5d70: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 2f 2a 20 31 3a 20 74 72 69 6d 6c 65 66     /* 1: trimlef
5da0: 74 20 20 32 3a 20 74 72 69 6d 72 69 67 68 74 20  t  2: trimright 
5db0: 20 33 3a 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e   3: trim */.  in
5dc0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5de0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
5df0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
5e00: 61 72 20 2a 61 4c 65 6e 3b 20 20 20 20 20 20 20  ar *aLen;       
5e10: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
5e20: 20 6f 66 20 65 61 63 68 20 63 68 61 72 61 63 74   of each charact
5e30: 65 72 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a  er in zCharSet *
5e40: 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  /.  const unsign
5e50: 65 64 20 63 68 61 72 20 2a 2a 61 7a 43 68 61 72  ed char **azChar
5e60: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 76 69 64  ;     /* Individ
5e70: 75 61 6c 20 63 68 61 72 61 63 74 65 72 73 20 69  ual characters i
5e80: 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20  n zCharSet */.  
5e90: 69 6e 74 20 6e 43 68 61 72 3b 20 20 20 20 20 20  int nChar;      
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5eb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5ec0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68  haracters in zCh
5ed0: 61 72 53 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20  arSet */..  if( 
5ee0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
5ef0: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
5f00: 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
5f10: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49  return;.  }.  zI
5f20: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
5f30: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5f40: 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20  .  if( zIn==0 ) 
5f50: 72 65 74 75 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20  return;.  nIn = 
5f60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5f70: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
5f80: 61 73 73 65 72 74 28 20 7a 49 6e 3d 3d 73 71 6c  assert( zIn==sql
5f90: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5fa0: 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66  argv[0]) );.  if
5fb0: 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20 20  ( argc==1 ){.   
5fc0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
5fd0: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 6e 4f  signed char lenO
5fe0: 6e 65 5b 5d 20 3d 20 7b 20 31 20 7d 3b 0a 20 20  ne[] = { 1 };.  
5ff0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
6000: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 7a  nsigned char *az
6010: 4f 6e 65 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22  One[] = { (u8*)"
6020: 20 22 20 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20   " };.    nChar 
6030: 3d 20 31 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20  = 1;.    aLen = 
6040: 28 75 38 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20  (u8*)lenOne;.   
6050: 20 61 7a 43 68 61 72 20 3d 20 61 7a 4f 6e 65 3b   azChar = azOne;
6060: 0a 20 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20  .    zCharSet = 
6070: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
6080: 7a 43 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74  zCharSet = sqlit
6090: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
60a0: 67 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20  gv[1]))==0 ){.  
60b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
60c0: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e{.    const uns
60d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20  igned char *z;. 
60e0: 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65     for(z=zCharSe
60f0: 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20  t, nChar=0; *z; 
6100: 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20  nChar++){.      
6110: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
6120: 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (z);.    }.    i
6130: 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20  f( nChar>0 ){.  
6140: 20 20 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e      azChar = con
6150: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
6160: 78 74 2c 20 6e 43 68 61 72 2a 28 73 69 7a 65 6f  xt, nChar*(sizeo
6170: 66 28 63 68 61 72 2a 29 2b 31 29 29 3b 0a 20 20  f(char*)+1));.  
6180: 20 20 20 20 69 66 28 20 61 7a 43 68 61 72 3d 3d      if( azChar==
6190: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
61a0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
61b0: 20 20 20 61 4c 65 6e 20 3d 20 28 75 6e 73 69 67     aLen = (unsig
61c0: 6e 65 64 20 63 68 61 72 2a 29 26 61 7a 43 68 61  ned char*)&azCha
61d0: 72 5b 6e 43 68 61 72 5d 3b 0a 20 20 20 20 20 20  r[nChar];.      
61e0: 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20  for(z=zCharSet, 
61f0: 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68  nChar=0; *z; nCh
6200: 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  ar++){.        a
6210: 7a 43 68 61 72 5b 6e 43 68 61 72 5d 20 3d 20 7a  zChar[nChar] = z
6220: 3b 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ;.        SQLITE
6230: 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20  _SKIP_UTF8(z);. 
6240: 20 20 20 20 20 20 20 61 4c 65 6e 5b 6e 43 68 61         aLen[nCha
6250: 72 5d 20 3d 20 7a 20 2d 20 61 7a 43 68 61 72 5b  r] = z - azChar[
6260: 6e 43 68 61 72 5d 3b 0a 20 20 20 20 20 20 7d 0a  nChar];.      }.
6270: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6280: 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20 66  nChar>0 ){.    f
6290: 6c 61 67 73 20 3d 20 28 69 6e 74 29 73 71 6c 69  lags = (int)sqli
62a0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
62b0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 66 28 20  ntext);.    if( 
62c0: 66 6c 61 67 73 20 26 20 31 20 29 7b 0a 20 20 20  flags & 1 ){.   
62d0: 20 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20     while( nIn>0 
62e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
62f0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  en;.        for(
6300: 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b  i=0; i<nChar; i+
6310: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65  +){.          le
6320: 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20  n = aLen[i];.   
6330: 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d         if( memcm
6340: 70 28 7a 49 6e 2c 20 61 7a 43 68 61 72 5b 69 5d  p(zIn, azChar[i]
6350: 2c 20 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61  , len)==0 ) brea
6360: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6370: 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61       if( i>=nCha
6380: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
6390: 20 20 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a 20     zIn += len;. 
63a0: 20 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65         nIn -= le
63b0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
63c0: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
63d0: 20 32 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c   2 ){.      whil
63e0: 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20  e( nIn>0 ){.    
63f0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
6400: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6410: 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nChar; i++){.   
6420: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65         len = aLe
6430: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[i];.          
6440: 69 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20  if( len<=nIn && 
6450: 6d 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d  memcmp(&zIn[nIn-
6460: 6c 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c  len],azChar[i],l
6470: 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  en)==0 ) break;.
6480: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6490: 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29    if( i>=nChar )
64a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
64b0: 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20  nIn -= len;.    
64c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
64d0: 28 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20  ( zCharSet ){.  
64e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
64f0: 28 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a  (azChar);.    }.
6500: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
6510: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
6520: 74 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e  t, (char*)zIn, n
6530: 49 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  In, SQLITE_TRANS
6540: 49 45 4e 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  IENT);.}..#ifdef
6550: 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a   SQLITE_SOUNDEX.
6560: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
6570: 65 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69  e soundex encodi
6580: 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2f  ng of a word..*/
6590: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75  .static void sou
65a0: 6e 64 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69  ndexFunc(.  sqli
65b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
65c0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
65d0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
65e0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68  e **argv.){.  ch
65f0: 61 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20  ar zResult[8];. 
6600: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a   const u8 *zIn;.
6610: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
6620: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
6630: 6e 65 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d  ned char iCode[]
6640: 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30   = {.    0, 0, 0
6650: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6660: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6670: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
6680: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6690: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
66a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
66b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
66c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
66d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
66e0: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
66f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6700: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6710: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31  , 0,.    0, 0, 1
6720: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c  , 2, 3, 0, 1, 2,
6730: 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20   0, 0, 2, 2, 4, 
6740: 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20  5, 5, 0,.    1, 
6750: 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31  2, 6, 2, 3, 0, 1
6760: 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 2, 0, 2, 0,
6770: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
6780: 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20   0, 0, 1, 2, 3, 
6790: 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32  0, 1, 2, 0, 0, 2
67a0: 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c  , 2, 4, 5, 5, 0,
67b0: 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c  .    1, 2, 6, 2,
67c0: 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20   3, 0, 1, 0, 2, 
67d0: 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 2, 0, 0, 0, 0
67e0: 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65  , 0,.  };.  asse
67f0: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
6800: 20 7a 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69   zIn = (u8*)sqli
6810: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6820: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
6830: 49 6e 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75  In==0 ) zIn = (u
6840: 38 2a 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30  8*)"";.  for(i=0
6850: 3b 20 7a 49 6e 5b 69 5d 20 26 26 20 21 69 73 61  ; zIn[i] && !isa
6860: 6c 70 68 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b  lpha(zIn[i]); i+
6870: 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69  +){}.  if( zIn[i
6880: 5d 20 29 7b 0a 20 20 20 20 75 38 20 70 72 65 76  ] ){.    u8 prev
6890: 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e  code = iCode[zIn
68a0: 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 7a  [i]&0x7f];.    z
68b0: 52 65 73 75 6c 74 5b 30 5d 20 3d 20 74 6f 75 70  Result[0] = toup
68c0: 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20  per(zIn[i]);.   
68d0: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26   for(j=1; j<4 &&
68e0: 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20   zIn[i]; i++){. 
68f0: 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20       int code = 
6900: 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37  iCode[zIn[i]&0x7
6910: 66 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f  f];.      if( co
6920: 64 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  de>0 ){.        
6930: 69 66 28 20 63 6f 64 65 21 3d 70 72 65 76 63 6f  if( code!=prevco
6940: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
6950: 70 72 65 76 63 6f 64 65 20 3d 20 63 6f 64 65 3b  prevcode = code;
6960: 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 73 75  .          zResu
6970: 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b  lt[j++] = code +
6980: 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   '0';.        }.
6990: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
69a0: 20 20 20 20 20 70 72 65 76 63 6f 64 65 20 3d 20       prevcode = 
69b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
69c0: 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 34 20  .    while( j<4 
69d0: 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74  ){.      zResult
69e0: 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20  [j++] = '0';.   
69f0: 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a   }.    zResult[j
6a00: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
6a10: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
6a20: 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c 74 2c  ontext, zResult,
6a30: 20 34 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   4, SQLITE_TRANS
6a40: 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
6a50: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6a60: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6a70: 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51 4c 49   "?000", 4, SQLI
6a80: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  TE_STATIC);.  }.
6a90: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
6aa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
6ab0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
6ac0: 2a 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20 74 68  ** A function th
6ad0: 61 74 20 6c 6f 61 64 73 20 61 20 73 68 61 72 65  at loads a share
6ae0: 64 2d 6c 69 62 72 61 72 79 20 65 78 74 65 6e 73  d-library extens
6af0: 69 6f 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 73  ion then returns
6b00: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6b10: 20 76 6f 69 64 20 6c 6f 61 64 45 78 74 28 73 71   void loadExt(sq
6b20: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6b30: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
6b40: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
6b50: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
6b60: 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28   char *zFile = (
6b70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
6b80: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6b90: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73  argv[0]);.  cons
6ba0: 74 20 63 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20  t char *zProc;. 
6bb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
6bc0: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
6bd0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68 61  (context);.  cha
6be0: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
6bf0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29  .  if( argc==2 )
6c00: 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 28 63  {.    zProc = (c
6c10: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
6c20: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6c30: 72 67 76 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65  rgv[1]);.  }else
6c40: 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 30 3b  {.    zProc = 0;
6c50: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65  .  }.  if( zFile
6c60: 20 26 26 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64   && sqlite3_load
6c70: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  _extension(db, z
6c80: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
6c90: 72 72 4d 73 67 29 20 29 7b 0a 20 20 20 20 73 71  rrMsg) ){.    sq
6ca0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
6cb0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72  or(context, zErr
6cc0: 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  Msg, -1);.    sq
6cd0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
6ce0: 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  sg);.  }.}.#endi
6cf0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
6d00: 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
6d10: 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61   function genera
6d20: 74 65 73 20 61 20 73 74 72 69 6e 67 20 6f 66 20  tes a string of 
6d30: 72 61 6e 64 6f 6d 20 63 68 61 72 61 63 74 65 72  random character
6d40: 73 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  s.  Used for.** 
6d50: 67 65 6e 65 72 61 74 69 6e 67 20 74 65 73 74 20  generating test 
6d60: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
6d70: 76 6f 69 64 20 72 61 6e 64 53 74 72 28 73 71 6c  void randStr(sql
6d80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6d90: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
6da0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6db0: 2a 61 72 67 76 29 7b 0a 20 20 73 74 61 74 69 63  *argv){.  static
6dc0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6dd0: 63 68 61 72 20 7a 53 72 63 5b 5d 20 3d 20 0a 20  char zSrc[] = . 
6de0: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
6df0: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
6e00: 0a 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49  .     "ABCDEFGHI
6e10: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
6e20: 5a 22 0a 20 20 20 20 20 22 30 31 32 33 34 35 36  Z".     "0123456
6e30: 37 38 39 22 0a 20 20 20 20 20 22 2e 2d 21 2c 3a  789".     ".-!,:
6e40: 2a 5e 2b 3d 5f 7c 3f 2f 3c 3e 20 22 3b 0a 20 20  *^+=_|?/<> ";.  
6e50: 69 6e 74 20 69 4d 69 6e 2c 20 69 4d 61 78 2c 20  int iMin, iMax, 
6e60: 6e 2c 20 72 2c 20 69 3b 0a 20 20 75 6e 73 69 67  n, r, i;.  unsig
6e70: 6e 65 64 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ned char zBuf[10
6e80: 30 30 5d 3b 0a 0a 20 20 2f 2a 20 49 74 20 75 73  00];..  /* It us
6e90: 65 64 20 74 6f 20 62 65 20 70 6f 73 73 69 62 6c  ed to be possibl
6ea0: 65 20 74 6f 20 63 61 6c 6c 20 72 61 6e 64 73 74  e to call randst
6eb0: 72 28 29 20 77 69 74 68 20 61 6e 79 20 6e 75 6d  r() with any num
6ec0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
6ed0: 2c 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 77 20 69  ,.  ** but now i
6ee0: 74 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  t is registered 
6ef0: 77 69 74 68 20 53 51 4c 69 74 65 20 61 73 20 72  with SQLite as r
6f00: 65 71 75 69 72 69 6e 67 20 65 78 61 63 74 6c 79  equiring exactly
6f10: 20 32 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72   2..  */.  asser
6f20: 74 28 61 72 67 63 3d 3d 32 29 3b 0a 0a 20 20 69  t(argc==2);..  i
6f30: 4d 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Min = sqlite3_va
6f40: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29  lue_int(argv[0])
6f50: 3b 0a 20 20 69 66 28 20 69 4d 69 6e 3c 30 20 29  ;.  if( iMin<0 )
6f60: 20 69 4d 69 6e 20 3d 20 30 3b 0a 20 20 69 66 28   iMin = 0;.  if(
6f70: 20 69 4d 69 6e 3e 3d 73 69 7a 65 6f 66 28 7a 42   iMin>=sizeof(zB
6f80: 75 66 29 20 29 20 69 4d 69 6e 20 3d 20 73 69 7a  uf) ) iMin = siz
6f90: 65 6f 66 28 7a 42 75 66 29 2d 31 3b 0a 20 20 69  eof(zBuf)-1;.  i
6fa0: 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Max = sqlite3_va
6fb0: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
6fc0: 3b 0a 20 20 69 66 28 20 69 4d 61 78 3c 69 4d 69  ;.  if( iMax<iMi
6fd0: 6e 20 29 20 69 4d 61 78 20 3d 20 69 4d 69 6e 3b  n ) iMax = iMin;
6fe0: 0a 20 20 69 66 28 20 69 4d 61 78 3e 3d 73 69 7a  .  if( iMax>=siz
6ff0: 65 6f 66 28 7a 42 75 66 29 20 29 20 69 4d 61 78  eof(zBuf) ) iMax
7000: 20 3d 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d   = sizeof(zBuf)-
7010: 31 3b 0a 20 20 6e 20 3d 20 69 4d 69 6e 3b 0a 20  1;.  n = iMin;. 
7020: 20 69 66 28 20 69 4d 61 78 3e 69 4d 69 6e 20 29   if( iMax>iMin )
7030: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e  {.    sqlite3Ran
7040: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
7050: 29 2c 20 26 72 29 3b 0a 20 20 20 20 72 20 26 3d  ), &r);.    r &=
7060: 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
7070: 20 6e 20 2b 3d 20 72 25 28 69 4d 61 78 20 2b 20   n += r%(iMax + 
7080: 31 20 2d 20 69 4d 69 6e 29 3b 0a 20 20 7d 0a 20  1 - iMin);.  }. 
7090: 20 61 73 73 65 72 74 28 20 6e 3c 73 69 7a 65 6f   assert( n<sizeo
70a0: 66 28 7a 42 75 66 29 20 29 3b 0a 20 20 73 71 6c  f(zBuf) );.  sql
70b0: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 6e  ite3Randomness(n
70c0: 2c 20 7a 42 75 66 29 3b 0a 20 20 66 6f 72 28 69  , zBuf);.  for(i
70d0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
70e0: 20 20 20 7a 42 75 66 5b 69 5d 20 3d 20 7a 53 72     zBuf[i] = zSr
70f0: 63 5b 7a 42 75 66 5b 69 5d 25 28 73 69 7a 65 6f  c[zBuf[i]%(sizeo
7100: 66 28 7a 53 72 63 29 2d 31 29 5d 3b 0a 20 20 7d  f(zSrc)-1)];.  }
7110: 0a 20 20 7a 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a  .  zBuf[n] = 0;.
7120: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7130: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
7140: 63 68 61 72 2a 29 7a 42 75 66 2c 20 6e 2c 20 53  char*)zBuf, n, S
7150: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
7160: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7170: 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69  LITE_TEST */..#i
7180: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
7190: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
71a0: 77 69 6e 67 20 74 77 6f 20 53 51 4c 20 66 75 6e  wing two SQL fun
71b0: 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
71c0: 74 6f 20 74 65 73 74 20 72 65 74 75 72 6e 69 6e  to test returnin
71d0: 67 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 73 75  g a text.** resu
71e0: 6c 74 20 77 69 74 68 20 61 20 64 65 73 74 72 75  lt with a destru
71f0: 63 74 6f 72 2e 20 46 75 6e 63 74 69 6f 6e 20 27  ctor. Function '
7200: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 27  test_destructor'
7210: 20 74 61 6b 65 73 20 6f 6e 65 20 61 72 67 75 6d   takes one argum
7220: 65 6e 74 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ent.** and retur
7230: 6e 73 20 74 68 65 20 73 61 6d 65 20 61 72 67 75  ns the same argu
7240: 6d 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 64  ment interpreted
7250: 20 61 73 20 54 45 58 54 2e 20 41 20 64 65 73 74   as TEXT. A dest
7260: 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 70 61 73  ructor is.** pas
7270: 73 65 64 20 77 69 74 68 20 74 68 65 20 73 71 6c  sed with the sql
7280: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7290: 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 53  () call..**.** S
72a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 27 74 65 73  QL function 'tes
72b0: 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75  t_destructor_cou
72c0: 6e 74 27 20 72 65 74 75 72 6e 73 20 74 68 65 20  nt' returns the 
72d0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
72e0: 6e 64 69 6e 67 20 0a 2a 2a 20 61 6c 6c 6f 63 61  nding .** alloca
72f0: 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 27 74  tions made by 't
7300: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 27 3b  est_destructor';
7310: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
7320: 4e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 0a  Not threadsafe..
7330: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
7340: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
7350: 75 6e 74 5f 76 61 72 20 3d 20 30 3b 0a 73 74 61  unt_var = 0;.sta
7360: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 75 63  tic void destruc
7370: 74 6f 72 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20  tor(void *p){.  
7380: 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 28 63 68  char *zVal = (ch
7390: 61 72 20 2a 29 70 3b 0a 20 20 61 73 73 65 72 74  ar *)p;.  assert
73a0: 28 7a 56 61 6c 29 3b 0a 20 20 7a 56 61 6c 2d 2d  (zVal);.  zVal--
73b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
73c0: 28 7a 56 61 6c 29 3b 0a 20 20 74 65 73 74 5f 64  (zVal);.  test_d
73d0: 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 5f  estructor_count_
73e0: 76 61 72 2d 2d 3b 0a 7d 0a 73 74 61 74 69 63 20  var--;.}.static 
73f0: 76 6f 69 64 20 74 65 73 74 5f 64 65 73 74 72 75  void test_destru
7400: 63 74 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  ctor(.  sqlite3_
7410: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
7420: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
7430: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7440: 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 56  gv.){.  char *zV
7450: 61 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  al;.  int len;. 
7460: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
7470: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
7480: 28 70 43 74 78 29 3b 0a 20 0a 20 20 74 65 73 74  (pCtx);. .  test
7490: 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e  _destructor_coun
74a0: 74 5f 76 61 72 2b 2b 3b 0a 20 20 61 73 73 65 72  t_var++;.  asser
74b0: 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20  t( nArg==1 );.  
74c0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
74d0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
74e0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72  =SQLITE_NULL ) r
74f0: 65 74 75 72 6e 3b 0a 20 20 6c 65 6e 20 3d 20 73  eturn;.  len = s
7500: 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73  qlite3ValueBytes
7510: 28 61 72 67 76 5b 30 5d 2c 20 45 4e 43 28 64 62  (argv[0], ENC(db
7520: 29 29 3b 20 0a 20 20 7a 56 61 6c 20 3d 20 63 6f  )); .  zVal = co
7530: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 70 43 74 78  ntextMalloc(pCtx
7540: 2c 20 6c 65 6e 2b 33 29 3b 0a 20 20 69 66 28 20  , len+3);.  if( 
7550: 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  !zVal ){.    ret
7560: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 56 61 6c 5b  urn;.  }.  zVal[
7570: 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 7a 56  len+1] = 0;.  zV
7580: 61 6c 5b 6c 65 6e 2b 32 5d 20 3d 20 30 3b 0a 20  al[len+2] = 0;. 
7590: 20 7a 56 61 6c 2b 2b 3b 0a 20 20 6d 65 6d 63 70   zVal++;.  memcp
75a0: 79 28 7a 56 61 6c 2c 20 73 71 6c 69 74 65 33 56  y(zVal, sqlite3V
75b0: 61 6c 75 65 54 65 78 74 28 61 72 67 76 5b 30 5d  alueText(argv[0]
75c0: 2c 20 45 4e 43 28 64 62 29 29 2c 20 6c 65 6e 29  , ENC(db)), len)
75d0: 3b 0a 20 20 69 66 28 20 45 4e 43 28 64 62 29 3d  ;.  if( ENC(db)=
75e0: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a  =SQLITE_UTF8 ){.
75f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7600: 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 56  lt_text(pCtx, zV
7610: 61 6c 2c 20 2d 31 2c 20 64 65 73 74 72 75 63 74  al, -1, destruct
7620: 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  or);.#ifndef SQL
7630: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
7640: 20 7d 65 6c 73 65 20 69 66 28 20 45 4e 43 28 64   }else if( ENC(d
7650: 62 29 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  b)==SQLITE_UTF16
7660: 4c 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  LE ){.    sqlite
7670: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c  3_result_text16l
7680: 65 28 70 43 74 78 2c 20 7a 56 61 6c 2c 20 2d 31  e(pCtx, zVal, -1
7690: 2c 20 64 65 73 74 72 75 63 74 6f 72 29 3b 0a 20  , destructor);. 
76a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
76b0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
76c0: 36 62 65 28 70 43 74 78 2c 20 7a 56 61 6c 2c 20  6be(pCtx, zVal, 
76d0: 2d 31 2c 20 64 65 73 74 72 75 63 74 6f 72 29 3b  -1, destructor);
76e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
76f0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
7700: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
7710: 64 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f  d test_destructo
7720: 72 5f 63 6f 75 6e 74 28 0a 20 20 73 71 6c 69 74  r_count(.  sqlit
7730: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
7740: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
7750: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7760: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
7770: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
7780: 74 78 2c 20 74 65 73 74 5f 64 65 73 74 72 75 63  tx, test_destruc
7790: 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72 29 3b 0a  tor_count_var);.
77a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
77b0: 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66 64  TE_TEST */..#ifd
77c0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
77d0: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f  *.** Routines fo
77e0: 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71  r testing the sq
77f0: 6c 69 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74  lite3_get_auxdat
7800: 61 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  a() and sqlite3_
7810: 73 65 74 5f 61 75 78 64 61 74 61 28 29 0a 2a 2a  set_auxdata().**
7820: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
7830: 2a 20 54 68 65 20 74 65 73 74 5f 61 75 78 64 61  * The test_auxda
7840: 74 61 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  ta() SQL functio
7850: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
7860: 67 69 73 74 65 72 20 65 61 63 68 20 6f 66 20 69  gister each of i
7870: 74 73 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20  ts arguments.** 
7880: 61 73 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  as auxiliary dat
7890: 61 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  a.  If there are
78a0: 20 6e 6f 20 70 72 69 6f 72 20 72 65 67 69 73 74   no prior regist
78b0: 72 61 74 69 6f 6e 73 20 6f 66 20 61 75 78 20 64  rations of aux d
78c0: 61 74 61 20 66 6f 72 0a 2a 2a 20 74 68 61 74 20  ata for.** that 
78d0: 61 72 67 75 6d 65 6e 74 20 28 6d 65 61 6e 69 6e  argument (meanin
78e0: 67 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  g the argument i
78f0: 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74  s not a constant
7900: 20 6f 72 20 74 68 69 73 20 69 73 20 69 74 73 20   or this is its 
7910: 66 69 72 73 74 0a 2a 2a 20 63 61 6c 6c 29 20 74  first.** call) t
7920: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 66  hen the result f
7930: 6f 72 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  or that argument
7940: 20 69 73 20 30 2e 20 20 49 66 20 74 68 65 72 65   is 0.  If there
7950: 20 69 73 20 61 20 70 72 69 6f 72 0a 2a 2a 20 72   is a prior.** r
7960: 65 67 69 73 74 72 61 74 69 6f 6e 2c 20 74 68 65  egistration, the
7970: 20 72 65 73 75 6c 74 20 66 6f 72 20 74 68 61 74   result for that
7980: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 31 2e 20   argument is 1. 
7990: 20 54 68 65 20 6f 76 65 72 61 6c 6c 20 72 65 73   The overall res
79a0: 75 6c 74 0a 2a 2a 20 69 73 20 74 68 65 20 69 6e  ult.** is the in
79b0: 64 69 76 69 64 75 61 6c 20 61 72 67 75 6d 65 6e  dividual argumen
79c0: 74 20 72 65 73 75 6c 74 73 20 73 65 70 61 72 61  t results separa
79d0: 74 65 64 20 62 79 20 73 70 61 63 65 73 2e 0a 2a  ted by spaces..*
79e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
79f0: 65 65 5f 74 65 73 74 5f 61 75 78 64 61 74 61 28  ee_test_auxdata(
7a00: 76 6f 69 64 20 2a 70 29 20 7b 73 71 6c 69 74 65  void *p) {sqlite
7a10: 33 5f 66 72 65 65 28 70 29 3b 7d 0a 73 74 61 74  3_free(p);}.stat
7a20: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 75 78  ic void test_aux
7a30: 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 5f  data(.  sqlite3_
7a40: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
7a50: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
7a60: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7a70: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  gv.){.  int i;. 
7a80: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 63 6f   char *zRet = co
7a90: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 70 43 74 78  ntextMalloc(pCtx
7aa0: 2c 20 6e 41 72 67 2a 32 29 3b 0a 20 20 69 66 28  , nArg*2);.  if(
7ab0: 20 21 7a 52 65 74 20 29 20 72 65 74 75 72 6e 3b   !zRet ) return;
7ac0: 0a 20 20 6d 65 6d 73 65 74 28 7a 52 65 74 2c 20  .  memset(zRet, 
7ad0: 30 2c 20 6e 41 72 67 2a 32 29 3b 0a 20 20 66 6f  0, nArg*2);.  fo
7ae0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
7af0: 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  ++){.    char co
7b00: 6e 73 74 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29  nst *z = (char*)
7b10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
7b20: 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  xt(argv[i]);.   
7b30: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
7b40: 63 68 61 72 20 2a 7a 41 75 78 20 3d 20 73 71 6c  char *zAux = sql
7b50: 69 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74 61  ite3_get_auxdata
7b60: 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20 20  (pCtx, i);.     
7b70: 20 69 66 28 20 7a 41 75 78 20 29 7b 0a 20 20 20   if( zAux ){.   
7b80: 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20 3d       zRet[i*2] =
7b90: 20 27 31 27 3b 0a 20 20 20 20 20 20 20 20 69 66   '1';.        if
7ba0: 28 20 73 74 72 63 6d 70 28 7a 41 75 78 2c 20 7a  ( strcmp(zAux, z
7bb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
7bc0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
7bd0: 72 6f 72 28 70 43 74 78 2c 20 22 41 75 78 69 6c  ror(pCtx, "Auxil
7be0: 61 72 79 20 64 61 74 61 20 63 6f 72 72 75 70 74  ary data corrupt
7bf0: 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ion", -1);.     
7c00: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7c10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
7c20: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  se {.        zRe
7c30: 74 5b 69 2a 32 5d 20 3d 20 27 30 27 3b 0a 20 20  t[i*2] = '0';.  
7c40: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 41 75      }..      zAu
7c50: 78 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  x = contextMallo
7c60: 63 28 70 43 74 78 2c 20 73 74 72 6c 65 6e 28 7a  c(pCtx, strlen(z
7c70: 29 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  )+1);.      if( 
7c80: 7a 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20  zAux ){.        
7c90: 73 74 72 63 70 79 28 7a 41 75 78 2c 20 7a 29 3b  strcpy(zAux, z);
7ca0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7cb0: 5f 73 65 74 5f 61 75 78 64 61 74 61 28 70 43 74  _set_auxdata(pCt
7cc0: 78 2c 20 69 2c 20 7a 41 75 78 2c 20 66 72 65 65  x, i, zAux, free
7cd0: 5f 74 65 73 74 5f 61 75 78 64 61 74 61 29 3b 0a  _test_auxdata);.
7ce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 52        }.      zR
7cf0: 65 74 5b 69 2a 32 2b 31 5d 20 3d 20 27 20 27 3b  et[i*2+1] = ' ';
7d00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
7d10: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7d20: 28 70 43 74 78 2c 20 7a 52 65 74 2c 20 32 2a 6e  (pCtx, zRet, 2*n
7d30: 41 72 67 2d 31 2c 20 66 72 65 65 5f 74 65 73 74  Arg-1, free_test
7d40: 5f 61 75 78 64 61 74 61 29 3b 0a 7d 0a 23 65 6e  _auxdata);.}.#en
7d50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
7d60: 53 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  ST */..#ifdef SQ
7d70: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
7d80: 41 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 65  A function to te
7d90: 73 74 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69  st error reporti
7da0: 6e 67 20 66 72 6f 6d 20 75 73 65 72 20 66 75 6e  ng from user fun
7db0: 63 74 69 6f 6e 73 2e 20 54 68 69 73 20 66 75 6e  ctions. This fun
7dc0: 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73  ction.** returns
7dd0: 20 61 20 63 6f 70 79 20 6f 66 20 69 74 27 73 20   a copy of it's 
7de0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 61  first argument a
7df0: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  s an error..*/.s
7e00: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
7e10: 65 72 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33  error(.  sqlite3
7e20: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
7e30: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
7e40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7e50: 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
7e60: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
7e70: 74 78 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  tx, (char*)sqlit
7e80: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7e90: 67 76 5b 30 5d 29 2c 20 30 29 3b 0a 7d 0a 23 65  gv[0]), 0);.}.#e
7ea0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
7eb0: 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  EST */../*.** An
7ec0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7ed0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
7ee0: 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20 63  ture holds the c
7ef0: 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20 73  ontext of a.** s
7f00: 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61 67  um() or avg() ag
7f10: 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61 74  gregate computat
7f20: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
7f30: 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53 75  struct SumCtx Su
7f40: 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75 6d  mCtx;.struct Sum
7f50: 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Ctx {.  double r
7f60: 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46 6c 6f  Sum;      /* Flo
7f70: 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75 6d 20  ating point sum 
7f80: 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b 20 20  */.  i64 iSum;  
7f90: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
7fa0: 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20 69 36  r sum */   .  i6
7fb0: 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  4 cnt;          
7fc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
7fd0: 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f 0a  ments summed */.
7fe0: 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b 20 20    u8 overflow;  
7ff0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
8000: 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
8010: 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61 70 70  seen */.  u8 app
8020: 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  rox;        /* T
8030: 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74 65 67  rue if non-integ
8040: 65 72 20 76 61 6c 75 65 20 77 61 73 20 69 6e 70  er value was inp
8050: 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20 2a 2f  ut to the sum */
8060: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
8070: 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  nes used to comp
8080: 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61 76 65  ute the sum, ave
8090: 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61 6c 2e  rage, and total.
80a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d 28 29  .**.** The SUM()
80b0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f 77   function follow
80c0: 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29 20 53  s the (broken) S
80d0: 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68 69 63  QL standard whic
80e0: 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  h means.** that 
80f0: 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  it returns NULL 
8100: 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65 72 20  if it sums over 
8110: 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f 54 41  no inputs.  TOTA
8120: 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 2e 30  L returns.** 0.0
8130: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 20   in that case.  
8140: 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54 4f 54  In addition, TOT
8150: 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  AL always return
8160: 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72 65 0a  s a float where.
8170: 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72 65 74  ** SUM might ret
8180: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 69  urn an integer i
8190: 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63 6f 75  f it never encou
81a0: 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69 6e 67  nters a floating
81b0: 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 2e   point.** value.
81c0: 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20 66 61    TOTAL never fa
81d0: 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d 69 67  ils, but SUM mig
81e0: 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20 65 78  ht through an ex
81f0: 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20 69 74  ception if.** it
8200: 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20 69 6e   overflows an in
8210: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
8220: 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73 71   void sumStep(sq
8230: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
8240: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
8250: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
8260: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43 74  **argv){.  SumCt
8270: 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70 65  x *p;.  int type
8280: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
8290: 3d 3d 31 20 29 3b 0a 20 20 70 20 3d 20 73 71 6c  ==1 );.  p = sql
82a0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
82b0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
82c0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74  sizeof(*p));.  t
82d0: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ype = sqlite3_va
82e0: 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65  lue_numeric_type
82f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
8300: 20 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49   p && type!=SQLI
8310: 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  TE_NULL ){.    p
8320: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28  ->cnt++;.    if(
8330: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e   type==SQLITE_IN
8340: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69  TEGER ){.      i
8350: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76  64 v = sqlite3_v
8360: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
8370: 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53  0]);.      p->rS
8380: 75 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69  um += v;.      i
8390: 66 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d  f( (p->approx|p-
83a0: 3e 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 29 7b  >overflow)==0 ){
83b0: 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
83c0: 77 53 75 6d 20 3d 20 70 2d 3e 69 53 75 6d 20 2b  wSum = p->iSum +
83d0: 20 76 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   v;.        int 
83e0: 73 31 20 3d 20 70 2d 3e 69 53 75 6d 20 3e 3e 20  s1 = p->iSum >> 
83f0: 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31  (sizeof(i64)*8-1
8400: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  );.        int s
8410: 32 20 3d 20 76 20 20 20 20 20 20 20 3e 3e 20 28  2 = v       >> (
8420: 73 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31 29  sizeof(i64)*8-1)
8430: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 33  ;.        int s3
8440: 20 3d 20 69 4e 65 77 53 75 6d 20 3e 3e 20 28 73   = iNewSum >> (s
8450: 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31 29 3b  izeof(i64)*8-1);
8460: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72  .        p->over
8470: 66 6c 6f 77 20 3d 20 28 73 31 26 73 32 26 7e 73  flow = (s1&s2&~s
8480: 33 29 20 7c 20 28 7e 73 31 26 7e 73 32 26 73 33  3) | (~s1&~s2&s3
8490: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 53  );.        p->iS
84a0: 75 6d 20 3d 20 69 4e 65 77 53 75 6d 3b 0a 20 20  um = iNewSum;.  
84b0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
84c0: 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b  .      p->rSum +
84d0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
84e0: 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b  double(argv[0]);
84f0: 0a 20 20 20 20 20 20 70 2d 3e 61 70 70 72 6f 78  .      p->approx
8500: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
8510: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
8520: 6d 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  mFinalize(sqlite
8530: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
8540: 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70  xt){.  SumCtx *p
8550: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
8560: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
8570: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
8580: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74   if( p && p->cnt
8590: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  >0 ){.    if( p-
85a0: 3e 6f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  >overflow ){.   
85b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
85c0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
85d0: 22 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f  "integer overflo
85e0: 77 22 2c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  w",-1);.    }els
85f0: 65 20 69 66 28 20 70 2d 3e 61 70 70 72 6f 78 20  e if( p->approx 
8600: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8610: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
8620: 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d 29  ontext, p->rSum)
8630: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8640: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8650: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
8660: 20 70 2d 3e 69 53 75 6d 29 3b 0a 20 20 20 20 7d   p->iSum);.    }
8670: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
8680: 69 64 20 61 76 67 46 69 6e 61 6c 69 7a 65 28 73  id avgFinalize(s
8690: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
86a0: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43  context){.  SumC
86b0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
86c0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
86d0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
86e0: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
86f0: 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 73  ->cnt>0 ){.    s
8700: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
8710: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d  uble(context, p-
8720: 3e 72 53 75 6d 2f 28 64 6f 75 62 6c 65 29 70 2d  >rSum/(double)p-
8730: 3e 63 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  >cnt);.  }.}.sta
8740: 74 69 63 20 76 6f 69 64 20 74 6f 74 61 6c 46 69  tic void totalFi
8750: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
8760: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
8770: 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20  {.  SumCtx *p;. 
8780: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
8790: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
87a0: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 73 71  ontext, 0);.  sq
87b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
87c0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  ble(context, p ?
87d0: 20 70 2d 3e 72 53 75 6d 20 3a 20 30 2e 30 29 3b   p->rSum : 0.0);
87e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
87f0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
8800: 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66  e keeps track of
8810: 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   state informati
8820: 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f  on for the.** co
8830: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
8840: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  function..*/.typ
8850: 65 64 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e  edef struct Coun
8860: 74 43 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73  tCtx CountCtx;.s
8870: 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b  truct CountCtx {
8880: 0a 20 20 69 36 34 20 6e 3b 0a 7d 3b 0a 0a 2f 2a  .  i64 n;.};../*
8890: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
88a0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
88b0: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
88c0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
88d0: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74  tic void countSt
88e0: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
88f0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
8900: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
8910: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
8920: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
8930: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
8940: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
8950: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
8960: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
8970: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
8980: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
8990: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29 20 26  type(argv[0])) &
89a0: 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b  & p ){.    p->n+
89b0: 2b 3b 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74  +;.  }.}   .stat
89c0: 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e  ic void countFin
89d0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
89e0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
89f0: 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a  .  CountCtx *p;.
8a00: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
8a10: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
8a20: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 73  context, 0);.  s
8a30: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
8a40: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  t64(context, p ?
8a50: 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f   p->n : 0);.}../
8a60: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
8a70: 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29   implement min()
8a80: 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65   and max() aggre
8a90: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  gate functions..
8aa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
8ab0: 69 6e 6d 61 78 53 74 65 70 28 73 71 6c 69 74 65  inmaxStep(sqlite
8ac0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
8ad0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
8ae0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
8af0: 67 76 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67  gv){.  Mem *pArg
8b00: 20 20 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b    = (Mem *)argv[
8b10: 30 5d 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74  0];.  Mem *pBest
8b20: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
8b30: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8b40: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
8b50: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 42  L ) return;.  pB
8b60: 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c  est = (Mem *)sql
8b70: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
8b80: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
8b90: 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 29 3b  sizeof(*pBest));
8ba0: 0a 20 20 69 66 28 20 21 70 42 65 73 74 20 29 20  .  if( !pBest ) 
8bb0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70  return;..  if( p
8bc0: 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 7b 0a 20  Best->flags ){. 
8bd0: 20 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20 20 20     int max;.    
8be0: 69 6e 74 20 63 6d 70 3b 0a 20 20 20 20 43 6f 6c  int cmp;.    Col
8bf0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
8c00: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
8c10: 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  Seq(context);.  
8c20: 20 20 2f 2a 20 54 68 69 73 20 73 74 65 70 20 66    /* This step f
8c30: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
8c40: 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6d 69 6e  for both the min
8c50: 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67  () and max() agg
8c60: 72 65 67 61 74 65 73 2c 0a 20 20 20 20 2a 2a 20  regates,.    ** 
8c70: 74 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65  the only differe
8c80: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  nce between the 
8c90: 74 77 6f 20 62 65 69 6e 67 20 74 68 61 74 20 74  two being that t
8ca0: 68 65 20 73 65 6e 73 65 20 6f 66 20 74 68 65 0a  he sense of the.
8cb0: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
8cc0: 6e 20 69 73 20 69 6e 76 65 72 74 65 64 2e 20 46  n is inverted. F
8cd0: 6f 72 20 74 68 65 20 6d 61 78 28 29 20 61 67 67  or the max() agg
8ce0: 72 65 67 61 74 65 2c 20 74 68 65 0a 20 20 20 20  regate, the.    
8cf0: 2a 2a 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  ** sqlite3_user_
8d00: 64 61 74 61 28 29 20 66 75 6e 63 74 69 6f 6e 20  data() function 
8d10: 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29  returns (void *)
8d20: 2d 31 2e 20 46 6f 72 20 6d 69 6e 28 29 20 69 74  -1. For min() it
8d30: 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  .    ** returns 
8d40: 28 76 6f 69 64 20 2a 29 64 62 2c 20 77 68 65 72  (void *)db, wher
8d50: 65 20 64 62 20 69 73 20 74 68 65 20 73 71 6c 69  e db is the sqli
8d60: 74 65 33 2a 20 64 61 74 61 62 61 73 65 20 70 6f  te3* database po
8d70: 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a 20 54 68  inter..    ** Th
8d80: 65 72 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74  erefore the next
8d90: 20 73 74 61 74 65 6d 65 6e 74 20 73 65 74 73 20   statement sets 
8da0: 76 61 72 69 61 62 6c 65 20 27 6d 61 78 27 20 74  variable 'max' t
8db0: 6f 20 31 20 66 6f 72 20 74 68 65 20 6d 61 78 28  o 1 for the max(
8dc0: 29 0a 20 20 20 20 2a 2a 20 61 67 67 72 65 67 61  ).    ** aggrega
8dd0: 74 65 2c 20 6f 72 20 30 20 66 6f 72 20 6d 69 6e  te, or 0 for min
8de0: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  ()..    */.    m
8df0: 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  ax = sqlite3_use
8e00: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 21  r_data(context)!
8e10: 3d 30 3b 0a 20 20 20 20 63 6d 70 20 3d 20 73 71  =0;.    cmp = sq
8e20: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
8e30: 70 42 65 73 74 2c 20 70 41 72 67 2c 20 70 43 6f  pBest, pArg, pCo
8e40: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 6d 61  ll);.    if( (ma
8e50: 78 20 26 26 20 63 6d 70 3c 30 29 20 7c 7c 20 28  x && cmp<0) || (
8e60: 21 6d 61 78 20 26 26 20 63 6d 70 3e 30 29 20 29  !max && cmp>0) )
8e70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8e80: 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74  dbeMemCopy(pBest
8e90: 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20  , pArg);.    }. 
8ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8eb0: 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70  te3VdbeMemCopy(p
8ec0: 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d  Best, pArg);.  }
8ed0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  .}.static void m
8ee0: 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 28 73 71  inMaxFinalize(sq
8ef0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
8f00: 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74  ontext){.  sqlit
8f10: 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a  e3_value *pRes;.
8f20: 20 20 70 52 65 73 20 3d 20 28 73 71 6c 69 74 65    pRes = (sqlite
8f30: 33 5f 76 61 6c 75 65 20 2a 29 73 71 6c 69 74 65  3_value *)sqlite
8f40: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
8f50: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
8f60: 0a 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20  .  if( pRes ){. 
8f70: 20 20 20 69 66 28 20 70 52 65 73 2d 3e 66 6c 61     if( pRes->fla
8f80: 67 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  gs ){.      sqli
8f90: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
8fa0: 28 63 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b  (context, pRes);
8fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8fc0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
8fd0: 28 70 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pRes);.  }.}../
8fe0: 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e 63 61  *.** group_conca
8ff0: 74 28 45 58 50 52 2c 20 3f 53 45 50 41 52 41 54  t(EXPR, ?SEPARAT
9000: 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  OR?).*/.static v
9010: 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 53  oid groupConcatS
9020: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
9030: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
9040: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
9050: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
9060: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
9070: 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 53 74 72  har *zVal;.  Str
9080: 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20  Accum *pAccum;. 
9090: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
90a0: 70 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 6e  p;.  int nVal, n
90b0: 53 65 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  Sep;.  if( sqlit
90c0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
90d0: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
90e0: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
90f0: 70 41 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63  pAccum = (StrAcc
9100: 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  um*)sqlite3_aggr
9110: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
9120: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
9130: 41 63 63 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20  Accum));..  if( 
9140: 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20 70 41  pAccum ){.    pA
9150: 63 63 75 6d 2d 3e 75 73 65 4d 61 6c 6c 6f 63 20  ccum->useMalloc 
9160: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 41 63  = 1;.    if( pAc
9170: 63 75 6d 2d 3e 6e 43 68 61 72 20 29 7b 0a 20 20  cum->nChar ){.  
9180: 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20      if( argc==2 
9190: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20  ){.        zSep 
91a0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
91b0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
91c0: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 53  [1]);.        nS
91d0: 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ep = sqlite3_val
91e0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d  ue_bytes(argv[1]
91f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9200: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
9210: 2c 22 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70  ,";.        nSep
9220: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9230: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
9240: 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d  cumAppend(pAccum
9250: 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20  , zSep, nSep);. 
9260: 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20 3d 20     }.    zVal = 
9270: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
9280: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
9290: 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20 73  ]);.    nVal = s
92a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
92b0: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
92c0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
92d0: 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a  Append(pAccum, z
92e0: 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 7d 0a  Val, nVal);.  }.
92f0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72  }.static void gr
9300: 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a  oupConcatFinaliz
9310: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
9320: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
9330: 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b  trAccum *pAccum;
9340: 0a 20 20 70 41 63 63 75 6d 20 3d 20 73 71 6c 69  .  pAccum = sqli
9350: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
9360: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
9370: 29 3b 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20  );.  if( pAccum 
9380: 29 7b 0a 20 20 20 20 69 66 28 20 70 41 63 63 75  ){.    if( pAccu
9390: 6d 2d 3e 74 6f 6f 42 69 67 20 29 7b 0a 20 20 20  m->tooBig ){.   
93a0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
93b0: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
93c0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ontext);.    }el
93d0: 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 6d  se if( pAccum->m
93e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
93f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
9400: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
9410: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65  context);.    }e
9420: 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20 20 73  lse{    .      s
9430: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
9440: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  xt(context, sqli
9450: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
9460: 68 28 70 41 63 63 75 6d 29 2c 20 2d 31 2c 20 0a  h(pAccum), -1, .
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9480: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9490: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  3_free);.    }. 
94a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
94b0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74   function regist
94c0: 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  ered all of the 
94d0: 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f 6e  above C function
94e0: 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63  s as SQL.** func
94f0: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68 6f  tions.  This sho
9500: 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  uld be the only 
9510: 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20  routine in this 
9520: 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78 74  file with.** ext
9530: 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a  ernal linkage..*
9540: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
9550: 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
9560: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
9570: 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
9580: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
9590: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
95a0: 20 20 20 20 73 69 67 6e 65 64 20 63 68 61 72 20      signed char 
95b0: 6e 41 72 67 3b 0a 20 20 20 20 20 75 38 20 61 72  nArg;.     u8 ar
95c0: 67 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  gType;          
95d0: 20 2f 2a 20 66 66 3a 20 64 62 20 20 20 31 3a 20   /* ff: db   1: 
95e0: 30 2c 20 32 3a 20 31 2c 20 33 3a 20 32 2c 2e 2e  0, 2: 1, 3: 2,..
95f0: 2e 20 20 4e 3a 20 20 4e 2d 31 2e 20 2a 2f 0a 20  .  N:  N-1. */. 
9600: 20 20 20 20 75 38 20 65 54 65 78 74 52 65 70 3b      u8 eTextRep;
9610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
9620: 55 54 46 2d 31 36 2e 20 20 30 3a 20 55 54 46 2d  UTF-16.  0: UTF-
9630: 38 20 2a 2f 0a 20 20 20 20 20 75 38 20 6e 65 65  8 */.     u8 nee
9640: 64 43 6f 6c 6c 53 65 71 3b 0a 20 20 20 20 20 76  dCollSeq;.     v
9650: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
9660: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
9670: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
9680: 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63 73 5b  **);.  } aFuncs[
9690: 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6d 69 6e  ] = {.    { "min
96a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
96b0: 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55   -1, 0, SQLITE_U
96c0: 54 46 38 2c 20 20 20 20 31 2c 20 6d 69 6e 6d 61  TF8,    1, minma
96d0: 78 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  xFunc },.    { "
96e0: 6d 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  min",           
96f0: 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c 49 54       0, 0, SQLIT
9700: 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 30 20  E_UTF8,    1, 0 
9710: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9720: 7b 20 22 6d 61 78 22 2c 20 20 20 20 20 20 20 20  { "max",        
9730: 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 53 51         -1, 1, SQ
9740: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c  LITE_UTF8,    1,
9750: 20 6d 69 6e 6d 61 78 46 75 6e 63 20 7d 2c 0a 20   minmaxFunc },. 
9760: 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 20     { "max",     
9770: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c             0, 1,
9780: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
9790: 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d   1, 0          }
97a0: 2c 0a 20 20 20 20 7b 20 22 74 79 70 65 6f 66 22  ,.    { "typeof"
97b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  ,             1,
97c0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
97d0: 20 20 20 20 30 2c 20 74 79 70 65 6f 66 46 75 6e      0, typeofFun
97e0: 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 6e 67  c },.    { "leng
97f0: 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
9800: 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   1, 0, SQLITE_UT
9810: 46 38 2c 20 20 20 20 30 2c 20 6c 65 6e 67 74 68  F8,    0, length
9820: 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 73  Func },.    { "s
9830: 75 62 73 74 72 22 2c 20 20 20 20 20 20 20 20 20  ubstr",         
9840: 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45      2, 0, SQLITE
9850: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73 75 62  _UTF8,    0, sub
9860: 73 74 72 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  strFunc },.    {
9870: 20 22 73 75 62 73 74 72 22 2c 20 20 20 20 20 20   "substr",      
9880: 20 20 20 20 20 20 20 33 2c 20 30 2c 20 53 51 4c         3, 0, SQL
9890: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
98a0: 73 75 62 73 74 72 46 75 6e 63 20 7d 2c 0a 20 20  substrFunc },.  
98b0: 20 20 7b 20 22 61 62 73 22 2c 20 20 20 20 20 20    { "abs",      
98c0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
98d0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
98e0: 30 2c 20 61 62 73 46 75 6e 63 20 20 20 20 7d 2c  0, absFunc    },
98f0: 0a 20 20 20 20 7b 20 22 72 6f 75 6e 64 22 2c 20  .    { "round", 
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
9910: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
9920: 20 20 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20     0, roundFunc 
9930: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6f 75 6e 64   },.    { "round
9940: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
9950: 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  2, 0, SQLITE_UTF
9960: 38 2c 20 20 20 20 30 2c 20 72 6f 75 6e 64 46 75  8,    0, roundFu
9970: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70  nc  },.    { "up
9980: 70 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  per",           
9990: 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f     1, 0, SQLITE_
99a0: 55 54 46 38 2c 20 20 20 20 30 2c 20 75 70 70 65  UTF8,    0, uppe
99b0: 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20  rFunc  },.    { 
99c0: 22 6c 6f 77 65 72 22 2c 20 20 20 20 20 20 20 20  "lower",        
99d0: 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49        1, 0, SQLI
99e0: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 6c  TE_UTF8,    0, l
99f0: 6f 77 65 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20  owerFunc  },.   
9a00: 20 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20   { "coalesce",  
9a10: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 53          -1, 0, S
9a20: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
9a30: 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20 7d 2c 0a  , ifnullFunc },.
9a40: 20 20 20 20 7b 20 22 63 6f 61 6c 65 73 63 65 22      { "coalesce"
9a50: 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30  ,           0, 0
9a60: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
9a70: 20 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20    0, 0          
9a80: 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65 73  },.    { "coales
9a90: 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 31  ce",           1
9aa0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
9ab0: 2c 20 20 20 20 30 2c 20 30 20 20 20 20 20 20 20  ,    0, 0       
9ac0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 78     },.    { "hex
9ad0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
9ae0: 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    1, 0, SQLITE_U
9af0: 54 46 38 2c 20 20 20 20 30 2c 20 68 65 78 46 75  TF8,    0, hexFu
9b00: 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  nc    },.    { "
9b10: 69 66 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20  ifnull",        
9b20: 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49 54       2, 0, SQLIT
9b30: 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 69 66  E_UTF8,    1, if
9b40: 6e 75 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20  nullFunc },.    
9b50: 7b 20 22 72 61 6e 64 6f 6d 22 2c 20 20 20 20 20  { "random",     
9b60: 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 53 51         -1, 0, SQ
9b70: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
9b80: 20 72 61 6e 64 6f 6d 46 75 6e 63 20 7d 2c 0a 20   randomFunc },. 
9b90: 20 20 20 7b 20 22 72 61 6e 64 6f 6d 62 6c 6f 62     { "randomblob
9ba0: 22 2c 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c  ",         1, 0,
9bb0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
9bc0: 20 30 2c 20 72 61 6e 64 6f 6d 42 6c 6f 62 20 7d   0, randomBlob }
9bd0: 2c 0a 20 20 20 20 7b 20 22 6e 75 6c 6c 69 66 22  ,.    { "nullif"
9be0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  ,             2,
9bf0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
9c00: 20 20 20 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e      1, nullifFun
9c10: 63 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69  c },.    { "sqli
9c20: 74 65 5f 76 65 72 73 69 6f 6e 22 2c 20 20 20 20  te_version",    
9c30: 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   0, 0, SQLITE_UT
9c40: 46 38 2c 20 20 20 20 30 2c 20 76 65 72 73 69 6f  F8,    0, versio
9c50: 6e 46 75 6e 63 7d 2c 0a 20 20 20 20 7b 20 22 71  nFunc},.    { "q
9c60: 75 6f 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  uote",          
9c70: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
9c80: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 71 75 6f  _UTF8,    0, quo
9c90: 74 65 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b  teFunc  },.    {
9ca0: 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f   "last_insert_ro
9cb0: 77 69 64 22 2c 20 20 30 2c 20 30 78 66 66 2c 20  wid",  0, 0xff, 
9cc0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
9cd0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
9ce0: 64 20 7d 2c 0a 20 20 20 20 7b 20 22 63 68 61 6e  d },.    { "chan
9cf0: 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  ges",           
9d00: 20 30 2c 20 30 78 66 66 2c 20 53 51 4c 49 54 45   0, 0xff, SQLITE
9d10: 5f 55 54 46 38 2c 20 30 2c 20 63 68 61 6e 67 65  _UTF8, 0, change
9d20: 73 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  s           },. 
9d30: 20 20 20 7b 20 22 74 6f 74 61 6c 5f 63 68 61 6e     { "total_chan
9d40: 67 65 73 22 2c 20 20 20 20 20 20 30 2c 20 30 78  ges",      0, 0x
9d50: 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  ff, SQLITE_UTF8,
9d60: 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65   0, total_change
9d70: 73 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  s     },.    { "
9d80: 72 65 70 6c 61 63 65 22 2c 20 20 20 20 20 20 20  replace",       
9d90: 20 20 20 20 20 33 2c 20 30 2c 20 53 51 4c 49 54       3, 0, SQLIT
9da0: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 72 65  E_UTF8,    0, re
9db0: 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20 20  placeFunc       
9dc0: 7d 2c 0a 20 20 20 20 7b 20 22 6c 74 72 69 6d 22  },.    { "ltrim"
9dd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
9de0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
9df0: 2c 20 20 20 20 30 2c 20 74 72 69 6d 46 75 6e 63  ,    0, trimFunc
9e00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9e10: 20 7b 20 22 6c 74 72 69 6d 22 2c 20 20 20 20 20   { "ltrim",     
9e20: 20 20 20 20 20 20 20 20 20 32 2c 20 31 2c 20 53           2, 1, S
9e30: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
9e40: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
9e50: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74      },.    { "rt
9e60: 72 69 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20  rim",           
9e70: 20 20 20 31 2c 20 32 2c 20 53 51 4c 49 54 45 5f     1, 2, SQLITE_
9e80: 55 54 46 38 2c 20 20 20 20 30 2c 20 74 72 69 6d  UTF8,    0, trim
9e90: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c  Func          },
9ea0: 0a 20 20 20 20 7b 20 22 72 74 72 69 6d 22 2c 20  .    { "rtrim", 
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
9ec0: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
9ed0: 20 20 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20     0, trimFunc  
9ee0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9ef0: 20 22 74 72 69 6d 22 2c 20 20 20 20 20 20 20 20   "trim",        
9f00: 20 20 20 20 20 20 20 31 2c 20 33 2c 20 53 51 4c         1, 3, SQL
9f10: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
9f20: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
9f30: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 69 6d    },.    { "trim
9f40: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
9f50: 20 32 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54   2, 3, SQLITE_UT
9f60: 46 38 2c 20 20 20 20 30 2c 20 74 72 69 6d 46 75  F8,    0, trimFu
9f70: 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  nc          },. 
9f80: 20 20 20 7b 20 22 7a 65 72 6f 62 6c 6f 62 22 2c     { "zeroblob",
9f90: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
9fa0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
9fb0: 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63   0, zeroblobFunc
9fc0: 20 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20        },.#ifdef 
9fd0: 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20  SQLITE_SOUNDEX. 
9fe0: 20 20 20 7b 20 22 73 6f 75 6e 64 65 78 22 2c 20     { "soundex", 
9ff0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
a000: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
a010: 20 30 2c 20 73 6f 75 6e 64 65 78 46 75 6e 63 7d   0, soundexFunc}
a020: 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
a030: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
a040: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
a050: 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  { "load_extensio
a060: 6e 22 2c 20 20 20 20 20 31 2c 20 30 78 66 66 2c  n",     1, 0xff,
a070: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
a080: 20 6c 6f 61 64 45 78 74 20 7d 2c 0a 20 20 20 20   loadExt },.    
a090: 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  { "load_extensio
a0a0: 6e 22 2c 20 20 20 20 20 32 2c 20 30 78 66 66 2c  n",     2, 0xff,
a0b0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
a0c0: 20 6c 6f 61 64 45 78 74 20 7d 2c 0a 23 65 6e 64   loadExt },.#end
a0d0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
a0e0: 5f 54 45 53 54 0a 20 20 20 20 7b 20 22 72 61 6e  _TEST.    { "ran
a0f0: 64 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20  dstr",          
a100: 20 20 20 20 20 32 2c 20 30 2c 20 20 20 20 53 51       2, 0,    SQ
a110: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 72 61  LITE_UTF8, 0, ra
a120: 6e 64 53 74 72 20 20 20 20 7d 2c 0a 20 20 20 20  ndStr    },.    
a130: 7b 20 22 74 65 73 74 5f 64 65 73 74 72 75 63 74  { "test_destruct
a140: 6f 72 22 2c 20 20 20 20 20 20 20 31 2c 20 30 78  or",       1, 0x
a150: 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  ff, SQLITE_UTF8,
a160: 20 30 2c 20 74 65 73 74 5f 64 65 73 74 72 75 63   0, test_destruc
a170: 74 6f 72 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73  tor},.    { "tes
a180: 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75  t_destructor_cou
a190: 6e 74 22 2c 20 30 2c 20 30 2c 20 20 20 20 53 51  nt", 0, 0,    SQ
a1a0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 65  LITE_UTF8, 0, te
a1b0: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
a1c0: 75 6e 74 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73  unt},.    { "tes
a1d0: 74 5f 61 75 78 64 61 74 61 22 2c 20 20 20 20 20  t_auxdata",     
a1e0: 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 20 53 51      -1, 0,    SQ
a1f0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 65  LITE_UTF8, 0, te
a200: 73 74 5f 61 75 78 64 61 74 61 7d 2c 0a 20 20 20  st_auxdata},.   
a210: 20 7b 20 22 74 65 73 74 5f 65 72 72 6f 72 22 2c   { "test_error",
a220: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
a230: 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38  ,    SQLITE_UTF8
a240: 2c 20 30 2c 20 74 65 73 74 5f 65 72 72 6f 72 7d  , 0, test_error}
a250: 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20  ,.#endif.  };.  
a260: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
a270: 75 63 74 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  uct {.    char *
a280: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 69 67 6e 65  zName;.    signe
a290: 64 20 63 68 61 72 20 6e 41 72 67 3b 0a 20 20 20  d char nArg;.   
a2a0: 20 75 38 20 61 72 67 54 79 70 65 3b 0a 20 20 20   u8 argType;.   
a2b0: 20 75 38 20 6e 65 65 64 43 6f 6c 6c 53 65 71 3b   u8 needCollSeq;
a2c0: 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 53 74 65  .    void (*xSte
a2d0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
a2e0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
a2f0: 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 76 6f  value**);.    vo
a300: 69 64 20 28 2a 78 46 69 6e 61 6c 69 7a 65 29 28  id (*xFinalize)(
a310: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
a320: 29 3b 0a 20 20 7d 20 61 41 67 67 73 5b 5d 20 3d  );.  } aAggs[] =
a330: 20 7b 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20   {.    { "min", 
a340: 20 20 20 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d     1, 0, 1, minm
a350: 61 78 53 74 65 70 2c 20 20 20 6d 69 6e 4d 61 78  axStep,   minMax
a360: 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20 20 20  Finalize },.    
a370: 7b 20 22 6d 61 78 22 2c 20 20 20 20 31 2c 20 31  { "max",    1, 1
a380: 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c  , 1, minmaxStep,
a390: 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a     minMaxFinaliz
a3a0: 65 20 7d 2c 0a 20 20 20 20 7b 20 22 73 75 6d 22  e },.    { "sum"
a3b0: 2c 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75  ,    1, 0, 0, su
a3c0: 6d 53 74 65 70 2c 20 20 20 20 20 20 73 75 6d 46  mStep,      sumF
a3d0: 69 6e 61 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20  inalize    },.  
a3e0: 20 20 7b 20 22 74 6f 74 61 6c 22 2c 20 20 31 2c    { "total",  1,
a3f0: 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20   0, 0, sumStep, 
a400: 20 20 20 20 20 74 6f 74 61 6c 46 69 6e 61 6c 69       totalFinali
a410: 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  ze    },.    { "
a420: 61 76 67 22 2c 20 20 20 20 31 2c 20 30 2c 20 30  avg",    1, 0, 0
a430: 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20  , sumStep,      
a440: 61 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20 7d  avgFinalize    }
a450: 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74 22 2c  ,.    { "count",
a460: 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74    0, 0, 0, count
a470: 53 74 65 70 2c 20 20 20 20 63 6f 75 6e 74 46 69  Step,    countFi
a480: 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 20 20 7b  nalize  },.    {
a490: 20 22 63 6f 75 6e 74 22 2c 20 20 31 2c 20 30 2c   "count",  1, 0,
a4a0: 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20   0, countStep,  
a4b0: 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20    countFinalize 
a4c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 67 72 6f 75 70   },.    { "group
a4d0: 5f 63 6f 6e 63 61 74 22 2c 20 31 2c 20 30 2c 20  _concat", 1, 0, 
a4e0: 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74  0, groupConcatSt
a4f0: 65 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 46  ep, groupConcatF
a500: 69 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20 20 20 7b  inalize },.    {
a510: 20 22 67 72 6f 75 70 5f 63 6f 6e 63 61 74 22 2c   "group_concat",
a520: 20 32 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43   2, 0, 0, groupC
a530: 6f 6e 63 61 74 53 74 65 70 2c 20 67 72 6f 75 70  oncatStep, group
a540: 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 20 7d  ConcatFinalize }
a550: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
a560: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
a570: 7a 65 6f 66 28 61 46 75 6e 63 73 29 2f 73 69 7a  zeof(aFuncs)/siz
a580: 65 6f 66 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20  eof(aFuncs[0]); 
a590: 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  i++){.    void *
a5a0: 70 41 72 67 3b 0a 20 20 20 20 75 38 20 61 72 67  pArg;.    u8 arg
a5b0: 54 79 70 65 20 3d 20 61 46 75 6e 63 73 5b 69 5d  Type = aFuncs[i]
a5c0: 2e 61 72 67 54 79 70 65 3b 0a 20 20 20 20 69 66  .argType;.    if
a5d0: 28 20 61 72 67 54 79 70 65 3d 3d 30 78 66 66 20  ( argType==0xff 
a5e0: 29 7b 0a 20 20 20 20 20 20 70 41 72 67 20 3d 20  ){.      pArg = 
a5f0: 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  db;.    }else{. 
a600: 20 20 20 20 20 70 41 72 67 20 3d 20 28 76 6f 69       pArg = (voi
a610: 64 2a 29 28 69 6e 74 29 61 72 67 54 79 70 65 3b  d*)(int)argType;
a620: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a630: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
a640: 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65   aFuncs[i].zName
a650: 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67  , aFuncs[i].nArg
a660: 2c 0a 20 20 20 20 20 20 20 20 61 46 75 6e 63 73  ,.        aFuncs
a670: 5b 69 5d 2e 65 54 65 78 74 52 65 70 2c 20 70 41  [i].eTextRep, pA
a680: 72 67 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 78 46  rg, aFuncs[i].xF
a690: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
a6a0: 69 66 28 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 65  if( aFuncs[i].ne
a6b0: 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
a6c0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
a6d0: 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
a6e0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e  unction(db, aFun
a6f0: 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20  cs[i].zName, .  
a700: 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 61          strlen(a
a710: 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 29 2c  Funcs[i].zName),
a720: 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c   aFuncs[i].nArg,
a730: 20 61 46 75 6e 63 73 5b 69 5d 2e 65 54 65 78 74   aFuncs[i].eText
a740: 52 65 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Rep, 0);.      i
a750: 66 28 20 70 46 75 6e 63 20 26 26 20 61 46 75 6e  f( pFunc && aFun
a760: 63 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65  cs[i].needCollSe
a770: 71 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 75  q ){.        pFu
a780: 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  nc->needCollSeq 
a790: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
a7a0: 20 7d 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53   }.  }.#ifndef S
a7b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
a7c0: 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41  TABLE.  sqlite3A
a7d0: 6c 74 65 72 46 75 6e 63 74 69 6f 6e 73 28 64 62  lterFunctions(db
a7e0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  );.#endif.#ifnde
a7f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
a800: 52 53 45 52 0a 20 20 73 71 6c 69 74 65 33 41 74  RSER.  sqlite3At
a810: 74 61 63 68 46 75 6e 63 74 69 6f 6e 73 28 64 62  tachFunctions(db
a820: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28  );.#endif.  for(
a830: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 41  i=0; i<sizeof(aA
a840: 67 67 73 29 2f 73 69 7a 65 6f 66 28 61 41 67 67  ggs)/sizeof(aAgg
a850: 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
a860: 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 28 76   void *pArg = (v
a870: 6f 69 64 2a 29 28 69 6e 74 29 61 41 67 67 73 5b  oid*)(int)aAggs[
a880: 69 5d 2e 61 72 67 54 79 70 65 3b 0a 20 20 20 20  i].argType;.    
a890: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
a8a0: 63 28 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a  c(db, aAggs[i].z
a8b0: 4e 61 6d 65 2c 20 61 41 67 67 73 5b 69 5d 2e 6e  Name, aAggs[i].n
a8c0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
a8d0: 2c 20 0a 20 20 20 20 20 20 20 20 70 41 72 67 2c  , .        pArg,
a8e0: 20 30 2c 20 61 41 67 67 73 5b 69 5d 2e 78 53 74   0, aAggs[i].xSt
a8f0: 65 70 2c 20 61 41 67 67 73 5b 69 5d 2e 78 46 69  ep, aAggs[i].xFi
a900: 6e 61 6c 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  nalize);.    if(
a910: 20 61 41 67 67 73 5b 69 5d 2e 6e 65 65 64 43 6f   aAggs[i].needCo
a920: 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 46  llSeq ){.      F
a930: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
a940: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
a950: 69 6f 6e 28 20 64 62 2c 20 61 41 67 67 73 5b 69  ion( db, aAggs[i
a960: 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ].zName,.       
a970: 20 20 20 73 74 72 6c 65 6e 28 61 41 67 67 73 5b     strlen(aAggs[
a980: 69 5d 2e 7a 4e 61 6d 65 29 2c 20 61 41 67 67 73  i].zName), aAggs
a990: 5b 69 5d 2e 6e 41 72 67 2c 20 53 51 4c 49 54 45  [i].nArg, SQLITE
a9a0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 20  _UTF8, 0);.     
a9b0: 20 69 66 28 20 70 46 75 6e 63 20 26 26 20 61 41   if( pFunc && aA
a9c0: 67 67 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53  ggs[i].needCollS
a9d0: 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  eq ){.        pF
a9e0: 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  unc->needCollSeq
a9f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
aa00: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
aa10: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
aa20: 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  eFunctions(db);.
aa30: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
aa40: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
aa50: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
aa60: 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
aa70: 6e 28 64 62 2c 20 22 4d 41 54 43 48 22 2c 20 32  n(db, "MATCH", 2
aa80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
aa90: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
aaa0: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
aab0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
aac0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
aad0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
aae0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
aaf0: 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
ab00: 49 54 45 5f 53 53 45 0a 20 20 28 76 6f 69 64 29  ITE_SSE.  (void)
ab10: 73 71 6c 69 74 65 33 53 73 65 46 75 6e 63 74 69  sqlite3SseFuncti
ab20: 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a  ons(db);.#endif.
ab30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 41  #ifdef SQLITE_CA
ab40: 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b  SE_SENSITIVE_LIK
ab50: 45 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  E.  sqlite3Regis
ab60: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
ab70: 28 64 62 2c 20 31 29 3b 0a 23 65 6c 73 65 0a 20  (db, 1);.#else. 
ab80: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
ab90: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64 62  LikeFunctions(db
aba0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  , 0);.#endif.}..
abb0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 4c 49  /*.** Set the LI
abc0: 4b 45 4f 50 54 20 66 6c 61 67 20 6f 6e 20 74 68  KEOPT flag on th
abd0: 65 20 32 2d 61 72 67 75 6d 65 6e 74 20 66 75 6e  e 2-argument fun
abe0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
abf0: 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  iven name..*/.st
ac00: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4c 69 6b  atic void setLik
ac10: 65 4f 70 74 46 6c 61 67 28 73 71 6c 69 74 65 33  eOptFlag(sqlite3
ac20: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
ac30: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61   *zName, int fla
ac40: 67 56 61 6c 29 7b 0a 20 20 46 75 6e 63 44 65 66  gVal){.  FuncDef
ac50: 20 2a 70 44 65 66 3b 0a 20 20 70 44 65 66 20 3d   *pDef;.  pDef =
ac60: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
ac70: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
ac80: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c 20 32  strlen(zName), 2
ac90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
aca0: 29 3b 0a 20 20 69 66 28 20 70 44 65 66 20 29 7b  );.  if( pDef ){
acb0: 0a 20 20 20 20 70 44 65 66 2d 3e 66 6c 61 67 73  .    pDef->flags
acc0: 20 3d 20 66 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a   = flagVal;.  }.
acd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
ace0: 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 4c  r the built-in L
acf0: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e  IKE and GLOB fun
ad00: 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 63 61 73  ctions.  The cas
ad10: 65 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61  eSensitive.** pa
ad20: 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
ad30: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
ad40: 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  t the LIKE opera
ad50: 74 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a 20 73  tor is case.** s
ad60: 65 6e 73 69 74 69 76 65 2e 20 20 47 4c 4f 42 20  ensitive.  GLOB 
ad70: 69 73 20 61 6c 77 61 79 73 20 63 61 73 65 20 73  is always case s
ad80: 65 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69  ensitive..*/.voi
ad90: 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  d sqlite3Registe
ada0: 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73  rLikeFunctions(s
adb0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
adc0: 63 61 73 65 53 65 6e 73 69 74 69 76 65 29 7b 0a  caseSensitive){.
add0: 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65    struct compare
ade0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69  Info *pInfo;.  i
adf0: 66 28 20 63 61 73 65 53 65 6e 73 69 74 69 76 65  f( caseSensitive
ae00: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20   ){.    pInfo = 
ae10: 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  (struct compareI
ae20: 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  nfo*)&likeInfoAl
ae30: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
ae40: 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20  pInfo = (struct 
ae50: 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69  compareInfo*)&li
ae60: 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a  keInfoNorm;.  }.
ae70: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
ae80: 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20  unc(db, "like", 
ae90: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
aea0: 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c  pInfo, likeFunc,
aeb0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
aec0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
aed0: 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54  "like", 3, SQLIT
aee0: 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c  E_UTF8, pInfo, l
aef0: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ikeFunc, 0, 0);.
af00: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
af10: 75 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20  unc(db, "glob", 
af20: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
af30: 0a 20 20 20 20 20 20 28 73 74 72 75 63 74 20 63  .      (struct c
af40: 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f  ompareInfo*)&glo
af50: 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c  bInfo, likeFunc,
af60: 20 30 2c 30 29 3b 0a 20 20 73 65 74 4c 69 6b 65   0,0);.  setLike
af70: 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67 6c 6f  OptFlag(db, "glo
af80: 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  b", SQLITE_FUNC_
af90: 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55  LIKE | SQLITE_FU
afa0: 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65 74 4c  NC_CASE);.  setL
afb0: 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22  ikeOptFlag(db, "
afc0: 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20 63 61  like", .      ca
afd0: 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20 28 53  seSensitive ? (S
afe0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20  QLITE_FUNC_LIKE 
aff0: 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  | SQLITE_FUNC_CA
b000: 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46 55 4e  SE) : SQLITE_FUN
b010: 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_LIKE);.}../*.*
b020: 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73 20 74  * pExpr points t
b030: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
b040: 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74 73  which implements
b050: 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66   a function.  If
b060: 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72 6f 70  .** it is approp
b070: 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79 20 74  riate to apply t
b080: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
b090: 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66 75 6e  tion to that fun
b0a0: 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73 65  ction.** then se
b0b0: 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75 67 68  t aWc[0] through
b0c0: 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65 20 77   aWc[2] to the w
b0d0: 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65  ildcard characte
b0e0: 72 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  rs and.** return
b0f0: 20 54 52 55 45 2e 20 20 49 66 20 74 68 65 20 66   TRUE.  If the f
b100: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  unction is not a
b110: 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75 6e 63   LIKE-style func
b120: 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 72 65 74  tion then.** ret
b130: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e  urn FALSE..*/.in
b140: 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46  t sqlite3IsLikeF
b150: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
b160: 2a 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70 72  *db, Expr *pExpr
b170: 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73 65  , int *pIsNocase
b180: 2c 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20 20  , char *aWc){.  
b190: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
b1a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
b1b0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 21  TK_FUNCTION || !
b1c0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
b1d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b1e0: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  }.  if( pExpr->p
b1f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
b200: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
b210: 20 20 7d 0a 20 20 70 44 65 66 20 3d 20 73 71 6c    }.  pDef = sql
b220: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
b230: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70  (db, (char*)pExp
b240: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
b250: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 32 2c 0a 20  r->token.n, 2,. 
b260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b270: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
b280: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69  TE_UTF8, 0);.  i
b290: 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 28 70  f( pDef==0 || (p
b2a0: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
b2b0: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d  ITE_FUNC_LIKE)==
b2c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
b2d0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
b2e0: 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65 6d   memcpy() statem
b2f0: 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61 74  ent assumes that
b300: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
b310: 61 72 61 63 74 65 72 73 20 61 72 65 0a 20 20 2a  aracters are.  *
b320: 2a 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  * the first thre
b330: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  e statements in 
b340: 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  the compareInfo 
b350: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 0a  structure.  The.
b360: 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20 74    ** asserts() t
b370: 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66  hat follow verif
b380: 79 20 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f  y that assumptio
b390: 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  n.  */.  memcpy(
b3a0: 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65 72  aWc, pDef->pUser
b3b0: 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73 65  Data, 3);.  asse
b3c0: 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b 65  rt( (char*)&like
b3d0: 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72  InfoAlt == (char
b3e0: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d  *)&likeInfoAlt.m
b3f0: 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73  atchAll );.  ass
b400: 65 72 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c  ert( &((char*)&l
b410: 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d  ikeInfoAlt)[1] =
b420: 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  = (char*)&likeIn
b430: 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29  foAlt.matchOne )
b440: 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63  ;.  assert( &((c
b450: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
b460: 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29  t)[2] == (char*)
b470: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74  &likeInfoAlt.mat
b480: 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49 73 4e  chSet );.  *pIsN
b490: 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d 3e 66  ocase = (pDef->f
b4a0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
b4b0: 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20 20 72  NC_CASE)==0;.  r
b4c0: 65 74 75 72 6e 20 31 3b 0a 7d 0a                 eturn 1;.}.