/ Hex Artifact Content
Login

Artifact 59bb046d7e3df1ab512ac339ccb0a6f996a17cb7:


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 2f 0a 23  file scope..*/.#
0280: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0290: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
02a0: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
02b0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
02c0: 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e  nclude "vdbeInt.
02d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  h"../*.** Return
02e0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
02f0: 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  unction associat
0300: 65 64 20 77 69 74 68 20 61 20 66 75 6e 63 74 69  ed with a functi
0310: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  on..*/.static Co
0320: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 47 65  llSeq *sqlite3Ge
0330: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 73 71 6c  tFuncCollSeq(sql
0340: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0350: 6e 74 65 78 74 29 7b 0a 20 20 72 65 74 75 72 6e  ntext){.  return
0360: 20 63 6f 6e 74 65 78 74 2d 3e 70 43 6f 6c 6c 3b   context->pColl;
0370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
0380: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0390: 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 6d 69  non-aggregate mi
03a0: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 66 75  n() and max() fu
03b0: 6e 63 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69  nctions.*/.stati
03c0: 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78 46 75 6e  c void minmaxFun
03d0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
03e0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
03f0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
0400: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
0410: 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  v.){.  int i;.  
0420: 69 6e 74 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20  int mask;    /* 
0430: 30 20 66 6f 72 20 6d 69 6e 28 29 20 6f 72 20 30  0 for min() or 0
0440: 78 66 66 66 66 66 66 66 66 20 66 6f 72 20 6d 61  xffffffff for ma
0450: 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 42 65  x() */.  int iBe
0460: 73 74 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  st;.  CollSeq *p
0470: 43 6f 6c 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  Coll;..  assert(
0480: 20 61 72 67 63 3e 31 20 29 3b 0a 20 20 6d 61 73   argc>1 );.  mas
0490: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  k = sqlite3_user
04a0: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3d 3d  _data(context)==
04b0: 30 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 70 43  0 ? 0 : -1;.  pC
04c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
04d0: 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74  FuncCollSeq(cont
04e0: 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ext);.  assert( 
04f0: 70 43 6f 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  pColl );.  asser
0500: 74 28 20 6d 61 73 6b 3d 3d 2d 31 20 7c 7c 20 6d  t( mask==-1 || m
0510: 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 69 42 65 73  ask==0 );.  iBes
0520: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0530: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
0540: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
0550: 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a  _NULL ) return;.
0560: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67    for(i=1; i<arg
0570: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
0580: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
0590: 79 70 65 28 61 72 67 76 5b 69 5d 29 3d 3d 53 51  ype(argv[i])==SQ
05a0: 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75  LITE_NULL ) retu
05b0: 72 6e 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c  rn;.    if( (sql
05c0: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61  ite3MemCompare(a
05d0: 72 67 76 5b 69 42 65 73 74 5d 2c 20 61 72 67 76  rgv[iBest], argv
05e0: 5b 69 5d 2c 20 70 43 6f 6c 6c 29 5e 6d 61 73 6b  [i], pColl)^mask
05f0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
0600: 73 74 63 61 73 65 28 20 6d 61 73 6b 3d 3d 30 20  stcase( mask==0 
0610: 29 3b 0a 20 20 20 20 20 20 69 42 65 73 74 20 3d  );.      iBest =
0620: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   i;.    }.  }.  
0630: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
0640: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
0650: 67 76 5b 69 42 65 73 74 5d 29 3b 0a 7d 0a 0a 2f  gv[iBest]);.}../
0660: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0670: 74 79 70 65 20 6f 66 20 74 68 65 20 61 72 67 75  type of the argu
0680: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
0690: 76 6f 69 64 20 74 79 70 65 6f 66 46 75 6e 63 28  void typeofFunc(
06a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
06b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
06c0: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
06d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
06e0: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  gv.){.  const ch
06f0: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 55 4e 55  ar *z = 0;.  UNU
0700: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
0710: 74 55 73 65 64 29 3b 0a 20 20 73 77 69 74 63 68  tUsed);.  switch
0720: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
0730: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
0740: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0750: 5f 49 4e 54 45 47 45 52 3a 20 7a 20 3d 20 22 69  _INTEGER: z = "i
0760: 6e 74 65 67 65 72 22 3b 20 62 72 65 61 6b 3b 0a  nteger"; break;.
0770: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0780: 54 45 58 54 3a 20 20 20 20 7a 20 3d 20 22 74 65  TEXT:    z = "te
0790: 78 74 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  xt";    break;. 
07a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
07b0: 4c 4f 41 54 3a 20 20 20 7a 20 3d 20 22 72 65 61  LOAT:   z = "rea
07c0: 6c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  l";    break;.  
07d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
07e0: 4f 42 3a 20 20 20 20 7a 20 3d 20 22 62 6c 6f 62  OB:    z = "blob
07f0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
0800: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
0810: 20 20 20 20 20 20 7a 20 3d 20 22 6e 75 6c 6c 22        z = "null"
0820: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ;    break;.  }.
0830: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0840: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
0850: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
0860: 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  TIC);.}.../*.** 
0870: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
0880: 66 20 74 68 65 20 6c 65 6e 67 74 68 28 29 20 66  f the length() f
0890: 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  unction.*/.stati
08a0: 63 20 76 6f 69 64 20 6c 65 6e 67 74 68 46 75 6e  c void lengthFun
08b0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
08c0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
08d0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
08e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
08f0: 76 0a 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  v.){.  int len;.
0900: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
0910: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
0920: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
0930: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
0940: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
0950: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
0960: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
0970: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
0980: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
0990: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
09a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
09b0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
09c0: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
09d0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 29  _bytes(argv[0]))
09e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
09f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
0a00: 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20  LITE_TEXT: {.   
0a10: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
0a20: 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  d char *z = sqli
0a30: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
0a40: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  rgv[0]);.      i
0a50: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
0a60: 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 30 3b  ;.      len = 0;
0a70: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  .      while( *z
0a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 2b   ){.        len+
0a90: 2b 3b 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  +;.        SQLIT
0aa0: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a  E_SKIP_UTF8(z);.
0ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
0ac0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
0ad0: 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e 29 3b 0a  (context, len);.
0ae0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0af0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
0b00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
0b10: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
0b20: 65 78 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ext);.      brea
0b30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
0b40: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
0b50: 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 62 73 28  tion of the abs(
0b60: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
0b70: 2a 20 49 4d 50 3a 20 52 2d 32 33 39 37 39 2d 32  * IMP: R-23979-2
0b80: 36 38 35 35 20 54 68 65 20 61 62 73 28 58 29 20  6855 The abs(X) 
0b90: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
0ba0: 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   the absolute va
0bb0: 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 75  lue of.** the nu
0bc0: 6d 65 72 69 63 20 61 72 67 75 6d 65 6e 74 20 58  meric argument X
0bd0: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
0be0: 64 20 61 62 73 46 75 6e 63 28 73 71 6c 69 74 65  d absFunc(sqlite
0bf0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
0c00: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
0c10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
0c20: 67 76 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61  gv){.  assert( a
0c30: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
0c40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
0c50: 63 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  c);.  switch( sq
0c60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
0c70: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
0c80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
0c90: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 36  EGER: {.      i6
0ca0: 34 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  4 iVal = sqlite3
0cb0: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
0cc0: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[0]);.      if(
0cd0: 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iVal<0 ){.     
0ce0: 20 20 20 69 66 28 20 28 69 56 61 6c 3c 3c 31 29     if( (iVal<<1)
0cf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
0d00: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 35 34 36 30   /* IMP: R-35460
0d10: 2d 31 35 30 38 34 20 49 66 20 58 20 69 73 20 74  -15084 If X is t
0d20: 68 65 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33  he integer -9223
0d30: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 20  372036854775807 
0d40: 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  then.          *
0d50: 2a 20 61 62 73 28 58 29 20 74 68 72 6f 77 73 20  * abs(X) throws 
0d60: 61 6e 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  an integer overf
0d70: 6c 6f 77 20 65 72 72 6f 72 20 73 69 6e 63 65 20  low error since 
0d80: 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20 20  there is no.    
0d90: 20 20 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c        ** equival
0da0: 65 6e 74 20 70 6f 73 69 74 69 76 65 20 36 34 2d  ent positive 64-
0db0: 62 69 74 20 74 77 6f 20 63 6f 6d 70 6c 65 6d 65  bit two compleme
0dc0: 6e 74 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  nt value. */.   
0dd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
0de0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
0df0: 65 78 74 2c 20 22 69 6e 74 65 67 65 72 20 6f 76  ext, "integer ov
0e00: 65 72 66 6c 6f 77 22 2c 20 2d 31 29 3b 0a 20 20  erflow", -1);.  
0e10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
0e20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e30: 20 20 69 56 61 6c 20 3d 20 2d 69 56 61 6c 3b 0a    iVal = -iVal;.
0e40: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 73        } .      s
0e50: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
0e60: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 69 56 61  t64(context, iVa
0e70: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
0e80: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
0e90: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
0ea0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
0eb0: 37 34 33 34 2d 31 39 39 32 39 20 41 62 73 28 58  7434-19929 Abs(X
0ec0: 29 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  ) returns NULL i
0ed0: 66 20 58 20 69 73 20 4e 55 4c 4c 2e 20 2a 2f 0a  f X is NULL. */.
0ee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0ef0: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
0f00: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
0f10: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
0f20: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 42  lt: {.      /* B
0f30: 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 76  ecause sqlite3_v
0f40: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 29 20 72 65  alue_double() re
0f50: 74 75 72 6e 73 20 30 2e 30 20 69 66 20 74 68 65  turns 0.0 if the
0f60: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
0f70: 0a 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68  .      ** someth
0f80: 69 6e 67 20 74 68 61 74 20 63 61 6e 20 62 65 20  ing that can be 
0f90: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
0fa0: 20 6e 75 6d 62 65 72 2c 20 77 65 20 68 61 76 65   number, we have
0fb0: 3a 0a 20 20 20 20 20 20 2a 2a 20 49 4d 50 3a 20  :.      ** IMP: 
0fc0: 52 2d 35 37 33 32 36 2d 33 31 35 34 31 20 41 62  R-57326-31541 Ab
0fd0: 73 28 58 29 20 72 65 74 75 72 6e 20 30 2e 30 20  s(X) return 0.0 
0fe0: 69 66 20 58 20 69 73 20 61 20 73 74 72 69 6e 67  if X is a string
0ff0: 20 6f 72 20 62 6c 6f 62 20 74 68 61 74 0a 20 20   or blob that.  
1000: 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65      ** cannot be
1010: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20   converted to a 
1020: 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 2e 20 0a  numeric value. .
1030: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
1040: 6f 75 62 6c 65 20 72 56 61 6c 20 3d 20 73 71 6c  ouble rVal = sql
1050: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
1060: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  e(argv[0]);.    
1070: 20 20 69 66 28 20 72 56 61 6c 3c 30 20 29 20 72    if( rVal<0 ) r
1080: 56 61 6c 20 3d 20 2d 72 56 61 6c 3b 0a 20 20 20  Val = -rVal;.   
1090: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
10a0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
10b0: 2c 20 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 62  , rVal);.      b
10c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
10d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
10e0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
10f0: 75 62 73 74 72 28 29 20 66 75 6e 63 74 69 6f 6e  ubstr() function
1100: 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 73 74 72 28 78  ..**.** substr(x
1110: 2c 70 31 2c 70 32 29 20 20 72 65 74 75 72 6e 73  ,p1,p2)  returns
1120: 20 70 32 20 63 68 61 72 61 63 74 65 72 73 20 6f   p2 characters o
1130: 66 20 78 5b 5d 20 62 65 67 69 6e 6e 69 6e 67 20  f x[] beginning 
1140: 77 69 74 68 20 70 31 2e 0a 2a 2a 20 70 31 20 69  with p1..** p1 i
1150: 73 20 31 2d 69 6e 64 65 78 65 64 2e 20 20 53 6f  s 1-indexed.  So
1160: 20 73 75 62 73 74 72 28 78 2c 31 2c 31 29 20 72   substr(x,1,1) r
1170: 65 74 75 72 6e 73 20 74 68 65 20 66 69 72 73 74  eturns the first
1180: 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66   character.** of
1190: 20 78 2e 20 20 49 66 20 78 20 69 73 20 74 65 78   x.  If x is tex
11a0: 74 2c 20 74 68 65 6e 20 77 65 20 61 63 74 75 61  t, then we actua
11b0: 6c 6c 79 20 63 6f 75 6e 74 20 55 54 46 2d 38 20  lly count UTF-8 
11c0: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20 49  characters..** I
11d0: 66 20 78 20 69 73 20 61 20 62 6c 6f 62 2c 20 74  f x is a blob, t
11e0: 68 65 6e 20 77 65 20 63 6f 75 6e 74 20 62 79 74  hen we count byt
11f0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 31 20  es..**.** If p1 
1200: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
1210: 6e 20 77 65 20 62 65 67 69 6e 20 61 62 73 28 70  n we begin abs(p
1220: 31 29 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  1) from the end 
1230: 6f 66 20 78 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66  of x[]..**.** If
1240: 20 70 32 20 69 73 20 6e 65 67 61 74 69 76 65 2c   p2 is negative,
1250: 20 72 65 74 75 72 6e 20 74 68 65 20 70 32 20 63   return the p2 c
1260: 68 61 72 61 63 74 65 72 73 20 70 72 65 63 65 65  haracters precee
1270: 64 69 6e 67 20 70 31 2e 0a 2a 2f 0a 73 74 61 74  ding p1..*/.stat
1280: 69 63 20 76 6f 69 64 20 73 75 62 73 74 72 46 75  ic void substrFu
1290: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
12a0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
12b0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
12c0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
12d0: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  gv.){.  const un
12e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
12f0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1300: 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74   char *z2;.  int
1310: 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 70 30 74 79   len;.  int p0ty
1320: 70 65 3b 0a 20 20 69 36 34 20 70 31 2c 20 70 32  pe;.  i64 p1, p2
1330: 3b 0a 20 20 69 6e 74 20 6e 65 67 50 32 20 3d 20  ;.  int negP2 = 
1340: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  0;..  assert( ar
1350: 67 63 3d 3d 33 20 7c 7c 20 61 72 67 63 3d 3d 32  gc==3 || argc==2
1360: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
1370: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
1380: 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[1])==SQLITE_NU
1390: 4c 4c 0a 20 20 20 7c 7c 20 28 61 72 67 63 3d 3d  LL.   || (argc==
13a0: 33 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  3 && sqlite3_val
13b0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 32 5d 29  ue_type(argv[2])
13c0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 20  ==SQLITE_NULL). 
13d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
13e0: 20 20 7d 0a 20 20 70 30 74 79 70 65 20 3d 20 73    }.  p0type = s
13f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
1400: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 70 31  e(argv[0]);.  p1
1410: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1420: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
1430: 20 69 66 28 20 70 30 74 79 70 65 3d 3d 53 51 4c   if( p0type==SQL
1440: 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
1450: 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  len = sqlite3_va
1460: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
1470: 5d 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  ]);.    z = sqli
1480: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
1490: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
14a0: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
14b0: 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3d      assert( len=
14c0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  =sqlite3_value_b
14d0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 20 29 3b  ytes(argv[0]) );
14e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
14f0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1500: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
1510: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65     if( z==0 ) re
1520: 74 75 72 6e 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  turn;.    len = 
1530: 30 3b 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20  0;.    if( p1<0 
1540: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 7a 32 3d  ){.      for(z2=
1550: 7a 3b 20 2a 7a 32 3b 20 6c 65 6e 2b 2b 29 7b 0a  z; *z2; len++){.
1560: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
1570: 4b 49 50 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20  KIP_UTF8(z2);.  
1580: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1590: 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b    if( argc==3 ){
15a0: 0a 20 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65  .    p2 = sqlite
15b0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
15c0: 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 32  [2]);.    if( p2
15d0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20 3d  <0 ){.      p2 =
15e0: 20 2d 70 32 3b 0a 20 20 20 20 20 20 6e 65 67 50   -p2;.      negP
15f0: 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2 = 1;.    }.  }
1600: 65 6c 73 65 7b 0a 20 20 20 20 70 32 20 3d 20 73  else{.    p2 = s
1610: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
1620: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
1630: 29 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  )->aLimit[SQLITE
1640: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a  _LIMIT_LENGTH];.
1650: 20 20 7d 0a 20 20 69 66 28 20 70 31 3c 30 20 29    }.  if( p1<0 )
1660: 7b 0a 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b  {.    p1 += len;
1670: 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b  .    if( p1<0 ){
1680: 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b  .      p2 += p1;
1690: 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20  .      if( p2<0 
16a0: 29 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  ) p2 = 0;.      
16b0: 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  p1 = 0;.    }.  
16c0: 7d 65 6c 73 65 20 69 66 28 20 70 31 3e 30 20 29  }else if( p1>0 )
16d0: 7b 0a 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 65  {.    p1--;.  }e
16e0: 6c 73 65 20 69 66 28 20 70 32 3e 30 20 29 7b 0a  lse if( p2>0 ){.
16f0: 20 20 20 20 70 32 2d 2d 3b 0a 20 20 7d 0a 20 20      p2--;.  }.  
1700: 69 66 28 20 6e 65 67 50 32 20 29 7b 0a 20 20 20  if( negP2 ){.   
1710: 20 70 31 20 2d 3d 20 70 32 3b 0a 20 20 20 20 69   p1 -= p2;.    i
1720: 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20  f( p1<0 ){.     
1730: 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20   p2 += p1;.     
1740: 20 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   p1 = 0;.    }. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 31 3e   }.  assert( p1>
1760: 3d 30 20 26 26 20 70 32 3e 3d 30 20 29 3b 0a 20  =0 && p2>=0 );. 
1770: 20 69 66 28 20 70 30 74 79 70 65 21 3d 53 51 4c   if( p0type!=SQL
1780: 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
1790: 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 70 31 20  while( *z && p1 
17a0: 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ){.      SQLITE_
17b0: 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20  SKIP_UTF8(z);.  
17c0: 20 20 20 20 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a      p1--;.    }.
17d0: 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a      for(z2=z; *z
17e0: 32 20 26 26 20 70 32 3b 20 70 32 2d 2d 29 7b 0a  2 && p2; p2--){.
17f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
1800: 50 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20  P_UTF8(z2);.    
1810: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  }.    sqlite3_re
1820: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
1830: 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 28 69 6e  t, (char*)z, (in
1840: 74 29 28 7a 32 2d 7a 29 2c 20 53 51 4c 49 54 45  t)(z2-z), SQLITE
1850: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
1860: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 31  else{.    if( p1
1870: 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 20  +p2>len ){.     
1880: 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a 20 20   p2 = len-p1;.  
1890: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 20 70      if( p2<0 ) p
18a0: 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 0;.    }.   
18b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
18c0: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28 63  blob(context, (c
18d0: 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20 28 69 6e  har*)&z[p1], (in
18e0: 74 29 70 32 2c 20 53 51 4c 49 54 45 5f 54 52 41  t)p2, SQLITE_TRA
18f0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a  NSIENT);.  }.}..
1900: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1910: 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 75 6e  tion of the roun
1920: 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a  d() function.*/.
1930: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1940: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1950: 4e 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  NT.static void r
1960: 6f 75 6e 64 46 75 6e 63 28 73 71 6c 69 74 65 33  oundFunc(sqlite3
1970: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1980: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
1990: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
19a0: 76 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  v){.  int n = 0;
19b0: 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63  .  double r;.  c
19c0: 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 61 73 73  har *zBuf;.  ass
19d0: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20  ert( argc==1 || 
19e0: 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28  argc==2 );.  if(
19f0: 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20   argc==2 ){.    
1a00: 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d  if( SQLITE_NULL=
1a10: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
1a20: 79 70 65 28 61 72 67 76 5b 31 5d 29 20 29 20 72  ype(argv[1]) ) r
1a30: 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 73  eturn;.    n = s
1a40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
1a50: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
1a60: 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d 20 33 30  f( n>30 ) n = 30
1a70: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20  ;.    if( n<0 ) 
1a80: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
1a90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1aa0: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
1ab0: 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75  LITE_NULL ) retu
1ac0: 72 6e 3b 0a 20 20 72 20 3d 20 73 71 6c 69 74 65  rn;.  r = sqlite
1ad0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
1ae0: 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20 49 66  rgv[0]);.  /* If
1af0: 20 59 3d 3d 30 20 61 6e 64 20 58 20 77 69 6c 6c   Y==0 and X will
1b00: 20 66 69 74 20 69 6e 20 61 20 36 34 2d 62 69 74   fit in a 64-bit
1b10: 20 69 6e 74 2c 0a 20 20 2a 2a 20 68 61 6e 64 6c   int,.  ** handl
1b20: 65 20 74 68 65 20 72 6f 75 6e 64 69 6e 67 20 64  e the rounding d
1b30: 69 72 65 63 74 6c 79 2c 0a 20 20 2a 2a 20 6f 74  irectly,.  ** ot
1b40: 68 65 72 77 69 73 65 20 75 73 65 20 70 72 69 6e  herwise use prin
1b50: 74 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  tf..  */.  if( n
1b60: 3d 3d 30 20 26 26 20 72 3e 3d 30 20 26 26 20 72  ==0 && r>=0 && r
1b70: 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2d 31  <LARGEST_INT64-1
1b80: 20 29 7b 0a 20 20 20 20 72 20 3d 20 28 64 6f 75   ){.    r = (dou
1b90: 62 6c 65 29 28 28 73 71 6c 69 74 65 5f 69 6e 74  ble)((sqlite_int
1ba0: 36 34 29 28 72 2b 30 2e 35 29 29 3b 0a 20 20 7d  64)(r+0.5));.  }
1bb0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20 26 26  else if( n==0 &&
1bc0: 20 72 3c 30 20 26 26 20 28 2d 72 29 3c 4c 41 52   r<0 && (-r)<LAR
1bd0: 47 45 53 54 5f 49 4e 54 36 34 2d 31 20 29 7b 0a  GEST_INT64-1 ){.
1be0: 20 20 20 20 72 20 3d 20 2d 28 64 6f 75 62 6c 65      r = -(double
1bf0: 29 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 29  )((sqlite_int64)
1c00: 28 28 2d 72 29 2b 30 2e 35 29 29 3b 0a 20 20 7d  ((-r)+0.5));.  }
1c10: 65 6c 73 65 7b 0a 20 20 20 20 7a 42 75 66 20 3d  else{.    zBuf =
1c20: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1c30: 28 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a 20 20  ("%.*f",n,r);.  
1c40: 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b    if( zBuf==0 ){
1c50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
1c60: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
1c70: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
1c80: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
1c90: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
1ca0: 7a 42 75 66 2c 20 26 72 2c 20 73 71 6c 69 74 65  zBuf, &r, sqlite
1cb0: 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 2c  3Strlen30(zBuf),
1cc0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1cd0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ce0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  zBuf);.  }.  sql
1cf0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
1d00: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a  le(context, r);.
1d10: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1d20: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
1d30: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 75 73  ytes of space us
1d40: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ing sqlite3_mall
1d50: 6f 63 28 29 2e 20 49 66 20 74 68 65 0a 2a 2a 20  oc(). If the.** 
1d60: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1d70: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 72  , call sqlite3_r
1d80: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
1d90: 6d 28 29 20 74 6f 20 6e 6f 74 69 66 79 0a 2a 2a  m() to notify.**
1da0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1db0: 6e 64 6c 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63  ndle that malloc
1dc0: 28 29 20 68 61 73 20 66 61 69 6c 65 64 20 61 6e  () has failed an
1dd0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
1de0: 2a 20 49 66 20 6e 42 79 74 65 20 69 73 20 6c 61  * If nByte is la
1df0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  rger than the ma
1e00: 78 69 6d 75 6d 20 73 74 72 69 6e 67 20 6f 72 20  ximum string or 
1e10: 62 6c 6f 62 20 6c 65 6e 67 74 68 2c 20 74 68 65  blob length, the
1e20: 6e 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53 51  n.** raise an SQ
1e30: 4c 49 54 45 5f 54 4f 4f 42 49 47 20 65 78 63 65  LITE_TOOBIG exce
1e40: 70 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e  ption and return
1e50: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
1e60: 20 76 6f 69 64 20 2a 63 6f 6e 74 65 78 74 4d 61   void *contextMa
1e70: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lloc(sqlite3_con
1e80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
1e90: 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 63 68 61  64 nByte){.  cha
1ea0: 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33 20  r *z;.  sqlite3 
1eb0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
1ec0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
1ed0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61 73 73 65  context);.  asse
1ee0: 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20  rt( nByte>0 );. 
1ef0: 20 74 65 73 74 63 61 73 65 28 20 6e 42 79 74 65   testcase( nByte
1f00: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
1f10: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
1f20: 5d 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ] );.  testcase(
1f30: 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d   nByte==db->aLim
1f40: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1f50: 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69  LENGTH]+1 );.  i
1f60: 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69  f( nByte>db->aLi
1f70: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
1f80: 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
1f90: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
1fa0: 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74  rror_toobig(cont
1fb0: 65 78 74 29 3b 0a 20 20 20 20 7a 20 3d 20 30 3b  ext);.    z = 0;
1fc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
1fd0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1fe0: 28 69 6e 74 29 6e 42 79 74 65 29 3b 0a 20 20 20  (int)nByte);.   
1ff0: 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20   if( !z ){.     
2000: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2010: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
2020: 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ext);.    }.  }.
2030: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
2040: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2050: 69 6f 6e 20 6f 66 20 74 68 65 20 75 70 70 65 72  ion of the upper
2060: 28 29 20 61 6e 64 20 6c 6f 77 65 72 28 29 20 53  () and lower() S
2070: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  QL functions..*/
2080: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 70  .static void upp
2090: 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  erFunc(sqlite3_c
20a0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
20b0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
20c0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
20d0: 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  {.  char *z1;.  
20e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
20f0: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e    int i, n;.  UN
2100: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
2110: 72 67 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68  rgc);.  z2 = (ch
2120: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2130: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
2140: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
2150: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
2160: 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79  0]);.  /* Verify
2170: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
2180: 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20  o _bytes() does 
2190: 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74  not invalidate t
21a0: 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74  he _text() point
21b0: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
21c0: 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74  z2==(char*)sqlit
21d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
21e0: 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  gv[0]) );.  if( 
21f0: 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63  z2 ){.    z1 = c
2200: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
2210: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31  text, ((i64)n)+1
2220: 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b  );.    if( z1 ){
2230: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 31  .      memcpy(z1
2240: 2c 20 7a 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20  , z2, n+1);.    
2250: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d    for(i=0; z1[i]
2260: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2270: 7a 31 5b 69 5d 20 3d 20 28 63 68 61 72 29 73 71  z1[i] = (char)sq
2280: 6c 69 74 65 33 54 6f 75 70 70 65 72 28 7a 31 5b  lite3Toupper(z1[
2290: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
22a0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
22b0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
22c0: 7a 31 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  z1, -1, sqlite3_
22d0: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
22e0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
22f0: 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33  owerFunc(sqlite3
2300: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
2310: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
2320: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
2330: 76 29 7b 0a 20 20 75 38 20 2a 7a 31 3b 0a 20 20  v){.  u8 *z1;.  
2340: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
2350: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e    int i, n;.  UN
2360: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
2370: 72 67 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68  rgc);.  z2 = (ch
2380: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2390: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
23a0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
23b0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
23c0: 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79  0]);.  /* Verify
23d0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
23e0: 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20  o _bytes() does 
23f0: 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74  not invalidate t
2400: 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74  he _text() point
2410: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
2420: 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74  z2==(char*)sqlit
2430: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
2440: 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  gv[0]) );.  if( 
2450: 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63  z2 ){.    z1 = c
2460: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
2470: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31  text, ((i64)n)+1
2480: 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b  );.    if( z1 ){
2490: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 31  .      memcpy(z1
24a0: 2c 20 7a 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20  , z2, n+1);.    
24b0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d    for(i=0; z1[i]
24c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
24d0: 7a 31 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 54  z1[i] = sqlite3T
24e0: 6f 6c 6f 77 65 72 28 7a 31 5b 69 5d 29 3b 0a 20  olower(z1[i]);. 
24f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2500: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
2510: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20  (context, (char 
2520: 2a 29 7a 31 2c 20 2d 31 2c 20 73 71 6c 69 74 65  *)z1, -1, sqlite
2530: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  3_free);.    }. 
2540: 20 7d 0a 7d 0a 0a 0a 23 69 66 20 30 20 20 2f 2a   }.}...#if 0  /*
2550: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2560: 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 2a 2f  s never used. */
2570: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 41 4c 45  ./*.** The COALE
2580: 53 43 45 28 29 20 61 6e 64 20 49 46 4e 55 4c 4c  SCE() and IFNULL
2590: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  () functions use
25a0: 64 20 74 6f 20 62 65 20 69 6d 70 6c 65 6d 65 6e  d to be implemen
25b0: 74 65 64 20 61 73 20 73 68 6f 77 6e 0a 2a 2a 20  ted as shown.** 
25c0: 68 65 72 65 2e 20 20 42 75 74 20 6e 6f 77 20 74  here.  But now t
25d0: 68 65 79 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  hey are implemen
25e0: 74 65 64 20 61 73 20 56 44 42 45 20 63 6f 64 65  ted as VDBE code
25f0: 20 73 6f 20 74 68 61 74 20 75 6e 75 73 65 64 20   so that unused 
2600: 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 64 6f 20  arguments.** do 
2610: 6e 6f 74 20 68 61 76 65 20 74 6f 20 62 65 20 63  not have to be c
2620: 6f 6d 70 75 74 65 64 2e 20 20 54 68 69 73 20 6c  omputed.  This l
2630: 65 67 61 63 79 20 69 6d 70 6c 65 6d 65 6e 74 61  egacy implementa
2640: 74 69 6f 6e 20 69 73 20 72 65 74 61 69 6e 65 64  tion is retained
2650: 20 61 73 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 2e 0a   as.** comment..
2660: 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  */./*.** Impleme
2670: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
2680: 46 4e 55 4c 4c 28 29 2c 20 4e 56 4c 28 29 2c 20  FNULL(), NVL(), 
2690: 61 6e 64 20 43 4f 41 4c 45 53 43 45 28 29 20 66  and COALESCE() f
26a0: 75 6e 63 74 69 6f 6e 73 2e 20 20 0a 2a 2a 20 41  unctions.  .** A
26b0: 6c 6c 20 74 68 72 65 65 20 64 6f 20 74 68 65 20  ll three do the 
26c0: 73 61 6d 65 20 74 68 69 6e 67 2e 20 20 54 68 65  same thing.  The
26d0: 79 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72  y return the fir
26e0: 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61  st non-NULL.** a
26f0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
2700: 69 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75  ic void ifnullFu
2710: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2720: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
2730: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
2740: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
2750: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  gv.){.  int i;. 
2760: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
2770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2780: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
2790: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
27a0: 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20  argv[i]) ){.    
27b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
27c0: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
27d0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
27e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
27f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 4f 54  .}.#endif /* NOT
2800: 20 55 53 45 44 20 2a 2f 0a 23 64 65 66 69 6e 65   USED */.#define
2810: 20 69 66 6e 75 6c 6c 46 75 6e 63 20 76 65 72 73   ifnullFunc vers
2820: 69 6f 6e 46 75 6e 63 20 20 20 2f 2a 20 53 75 62  ionFunc   /* Sub
2830: 73 74 69 74 75 74 65 20 66 75 6e 63 74 69 6f 6e  stitute function
2840: 20 2d 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20   - never called 
2850: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  */../*.** Implem
2860: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64  entation of rand
2870: 6f 6d 28 29 2e 20 20 52 65 74 75 72 6e 20 61 20  om().  Return a 
2880: 72 61 6e 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20  random integer. 
2890: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
28a0: 20 72 61 6e 64 6f 6d 46 75 6e 63 28 0a 20 20 73   randomFunc(.  s
28b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
28c0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e  context,.  int N
28d0: 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65  otUsed,.  sqlite
28e0: 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65  3_value **NotUse
28f0: 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69  d2.){.  sqlite_i
2900: 6e 74 36 34 20 72 3b 0a 20 20 55 4e 55 53 45 44  nt64 r;.  UNUSED
2910: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
2920: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
2930: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
2940: 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20  ness(sizeof(r), 
2950: 26 72 29 3b 0a 20 20 69 66 28 20 72 3c 30 20 29  &r);.  if( r<0 )
2960: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 6e 65 65 64  {.    /* We need
2970: 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 61   to prevent a ra
2980: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 6f 66 20 30  ndom number of 0
2990: 78 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30  x800000000000000
29a0: 30 20 0a 20 20 20 20 2a 2a 20 28 6f 72 20 2d 39  0 .    ** (or -9
29b0: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
29c0: 30 38 29 20 73 69 6e 63 65 20 77 68 65 6e 20 79  08) since when y
29d0: 6f 75 20 64 6f 20 61 62 73 28 29 20 6f 66 20 74  ou do abs() of t
29e0: 68 61 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  hat.    ** numbe
29f0: 72 20 6f 66 20 79 6f 75 20 67 65 74 20 74 68 65  r of you get the
2a00: 20 73 61 6d 65 20 76 61 6c 75 65 20 62 61 63 6b   same value back
2a10: 20 61 67 61 69 6e 2e 20 20 54 6f 20 64 6f 20 74   again.  To do t
2a20: 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20  his.    ** in a 
2a30: 77 61 79 20 74 68 61 74 20 69 73 20 74 65 73 74  way that is test
2a40: 61 62 6c 65 2c 20 6d 61 73 6b 20 74 68 65 20 73  able, mask the s
2a50: 69 67 6e 20 62 69 74 20 6f 66 66 20 6f 66 20 6e  ign bit off of n
2a60: 65 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 76  egative.    ** v
2a70: 61 6c 75 65 73 2c 20 72 65 73 75 6c 74 69 6e 67  alues, resulting
2a80: 20 69 6e 20 61 20 70 6f 73 69 74 69 76 65 20 76   in a positive v
2a90: 61 6c 75 65 2e 20 20 54 68 65 6e 20 74 61 6b 65  alue.  Then take
2aa0: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 32 73 20   the .    ** 2s 
2ab0: 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68  complement of th
2ac0: 61 74 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  at positive valu
2ad0: 65 2e 20 20 54 68 65 20 65 6e 64 20 72 65 73 75  e.  The end resu
2ae0: 6c 74 20 63 61 6e 0a 20 20 20 20 2a 2a 20 74 68  lt can.    ** th
2af0: 65 72 65 66 6f 72 65 20 62 65 20 6e 6f 20 6c 65  erefore be no le
2b00: 73 73 20 74 68 61 6e 20 2d 39 32 32 33 33 37 32  ss than -9223372
2b10: 30 33 36 38 35 34 37 37 35 38 30 37 2e 0a 20 20  036854775807..  
2b20: 20 20 2a 2f 0a 20 20 20 20 72 20 3d 20 2d 28 72    */.    r = -(r
2b30: 20 5e 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e   ^ (((sqlite3_in
2b40: 74 36 34 29 31 29 3c 3c 36 33 29 29 3b 0a 20 20  t64)1)<<63));.  
2b50: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
2b60: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
2b70: 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , r);.}../*.** I
2b80: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2b90: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20   randomblob(N). 
2ba0: 20 52 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d   Return a random
2bb0: 20 62 6c 6f 62 0a 2a 2a 20 74 68 61 74 20 69 73   blob.** that is
2bc0: 20 4e 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a   N bytes long..*
2bd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61  /.static void ra
2be0: 6e 64 6f 6d 42 6c 6f 62 28 0a 20 20 73 71 6c 69  ndomBlob(.  sqli
2bf0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
2c00: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
2c10: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
2c20: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
2c30: 74 20 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t n;.  unsigned 
2c40: 63 68 61 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  char *p;.  asser
2c50: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
2c60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2c70: 28 61 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71  (argc);.  n = sq
2c80: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
2c90: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
2ca0: 6e 3c 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 31  n<1 ){.    n = 1
2cb0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 63 6f 6e 74  ;.  }.  p = cont
2cc0: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
2cd0: 74 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70 20 29  t, n);.  if( p )
2ce0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  {.    sqlite3_ra
2cf0: 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a  ndomness(n, p);.
2d00: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2d10: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
2d20: 20 28 63 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71   (char*)p, n, sq
2d30: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
2d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
2d50: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2d60: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
2d70: 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  d() SQL function
2d80: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a  .  The return.**
2d90: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
2da0: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
2db0: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
2dc0: 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69  wid() API functi
2dd0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2de0: 69 64 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  id last_insert_r
2df0: 6f 77 69 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  owid(.  sqlite3_
2e00: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2e10: 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64  , .  int NotUsed
2e20: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
2e30: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
2e40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2e50: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2e60: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
2e70: 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  xt);.  UNUSED_PA
2e80: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
2e90: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f  , NotUsed2);.  /
2ea0: 2a 20 49 4d 50 3a 20 52 2d 35 31 35 31 33 2d 31  * IMP: R-51513-1
2eb0: 32 30 32 36 20 54 68 65 20 6c 61 73 74 5f 69 6e  2026 The last_in
2ec0: 73 65 72 74 5f 72 6f 77 69 64 28 29 20 53 51 4c  sert_rowid() SQL
2ed0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 20   function is a. 
2ee0: 20 2a 2a 20 77 72 61 70 70 65 72 20 61 72 6f 75   ** wrapper arou
2ef0: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  nd the sqlite3_l
2f00: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
2f10: 28 29 20 43 2f 43 2b 2b 20 69 6e 74 65 72 66 61  () C/C++ interfa
2f20: 63 65 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ce.  ** function
2f30: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  . */.  sqlite3_r
2f40: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
2f50: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73  ext, sqlite3_las
2f60: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64  t_insert_rowid(d
2f70: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  b));.}../*.** Im
2f80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2f90: 74 68 65 20 63 68 61 6e 67 65 73 28 29 20 53 51  the changes() SQ
2fa0: 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  L function..**.*
2fb0: 2a 20 49 4d 50 3a 20 52 2d 36 32 30 37 33 2d 31  * IMP: R-62073-1
2fc0: 31 32 30 39 20 54 68 65 20 63 68 61 6e 67 65 73  1209 The changes
2fd0: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
2fe0: 69 73 20 61 20 77 72 61 70 70 65 72 0a 2a 2a 20  is a wrapper.** 
2ff0: 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74  around the sqlit
3000: 65 33 5f 63 68 61 6e 67 65 73 28 29 20 43 2f 43  e3_changes() C/C
3010: 2b 2b 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  ++ function and 
3020: 68 65 6e 63 65 20 66 6f 6c 6c 6f 77 73 20 74 68  hence follows th
3030: 65 20 73 61 6d 65 0a 2a 2a 20 72 75 6c 65 73 20  e same.** rules 
3040: 66 6f 72 20 63 6f 75 6e 74 69 6e 67 20 63 68 61  for counting cha
3050: 6e 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nges..*/.static 
3060: 76 6f 69 64 20 63 68 61 6e 67 65 73 28 0a 20 20  void changes(.  
3070: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3080: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
3090: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
30a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
30b0: 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ed2.){.  sqlite3
30c0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
30d0: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
30e0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55  (context);.  UNU
30f0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
3100: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
3110: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
3120: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
3130: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
3140: 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (db));.}../*.** 
3150: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
3160: 66 20 74 68 65 20 74 6f 74 61 6c 5f 63 68 61 6e  f the total_chan
3170: 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ges() SQL functi
3180: 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  on.  The return 
3190: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20  value is.** the 
31a0: 73 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69  same as the sqli
31b0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
31c0: 73 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  s() API function
31d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
31e0: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 0a   total_changes(.
31f0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3200: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
3210: 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c  t NotUsed,.  sql
3220: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74  ite3_value **Not
3230: 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74  Used2.){.  sqlit
3240: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
3250: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
3260: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55  le(context);.  U
3270: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
3280: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
3290: 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52  d2);.  /* IMP: R
32a0: 2d 35 32 37 35 36 2d 34 31 39 39 33 20 54 68 69  -52756-41993 Thi
32b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
32c0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
32d0: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
32e0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20  total_changes() 
32f0: 43 2f 43 2b 2b 20 69 6e 74 65 72 66 61 63 65 2e  C/C++ interface.
3300: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   */.  sqlite3_re
3310: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
3320: 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  , sqlite3_total_
3330: 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a  changes(db));.}.
3340: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
3350: 72 65 20 64 65 66 69 6e 69 6e 67 20 68 6f 77 20  re defining how 
3360: 74 6f 20 64 6f 20 47 4c 4f 42 2d 73 74 79 6c 65  to do GLOB-style
3370: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f   comparisons..*/
3380: 0a 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  .struct compareI
3390: 6e 66 6f 20 7b 0a 20 20 75 38 20 6d 61 74 63 68  nfo {.  u8 match
33a0: 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68 4f  All;.  u8 matchO
33b0: 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63 68 53 65  ne;.  u8 matchSe
33c0: 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65 3b 0a  t;.  u8 noCase;.
33d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 4c 49  };../*.** For LI
33e0: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6d 61 74 63  KE and GLOB matc
33f0: 68 69 6e 67 20 6f 6e 20 45 42 43 44 49 43 20 6d  hing on EBCDIC m
3400: 61 63 68 69 6e 65 73 2c 20 61 73 73 75 6d 65 20  achines, assume 
3410: 74 68 61 74 20 65 76 65 72 79 0a 2a 2a 20 63 68  that every.** ch
3420: 61 72 61 63 74 65 72 20 69 73 20 65 78 61 63 74  aracter is exact
3430: 6c 79 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 73  ly one byte in s
3440: 69 7a 65 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20  ize.  Also, all 
3450: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 0a 2a  characters are.*
3460: 2a 20 61 62 6c 65 20 74 6f 20 70 61 72 74 69 63  * able to partic
3470: 69 70 61 74 65 20 69 6e 20 75 70 70 65 72 2d 63  ipate in upper-c
3480: 61 73 65 2d 74 6f 2d 6c 6f 77 65 72 2d 63 61 73  ase-to-lower-cas
3490: 65 20 6d 61 70 70 69 6e 67 73 20 69 6e 20 45 42  e mappings in EB
34a0: 43 44 49 43 0a 2a 2a 20 77 68 65 72 65 61 73 20  CDIC.** whereas 
34b0: 6f 6e 6c 79 20 63 68 61 72 61 63 74 65 72 73 20  only characters 
34c0: 6c 65 73 73 20 74 68 61 6e 20 30 78 38 30 20 64  less than 0x80 d
34d0: 6f 20 69 6e 20 41 53 43 49 49 2e 0a 2a 2f 0a 23  o in ASCII..*/.#
34e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
34f0: 45 5f 45 42 43 44 49 43 29 0a 23 20 64 65 66 69  E_EBCDIC).# defi
3500: 6e 65 20 73 71 6c 69 74 65 33 55 74 66 38 52 65  ne sqlite3Utf8Re
3510: 61 64 28 41 2c 43 29 20 20 28 2a 28 41 2b 2b 29  ad(A,C)  (*(A++)
3520: 29 0a 23 20 64 65 66 69 6e 65 20 47 6c 6f 67 55  ).# define GlogU
3530: 70 70 65 72 54 6f 4c 6f 77 65 72 28 41 29 20 20  pperToLower(A)  
3540: 20 41 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65   A = sqlite3Uppe
3550: 72 54 6f 4c 6f 77 65 72 5b 41 5d 0a 23 65 6c 73  rToLower[A].#els
3560: 65 0a 23 20 64 65 66 69 6e 65 20 47 6c 6f 67 55  e.# define GlogU
3570: 70 70 65 72 54 6f 4c 6f 77 65 72 28 41 29 20 20  pperToLower(A)  
3580: 20 69 66 28 20 21 28 28 41 29 26 7e 30 78 37 66   if( !((A)&~0x7f
3590: 29 20 29 7b 20 41 20 3d 20 73 71 6c 69 74 65 33  ) ){ A = sqlite3
35a0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 41 5d 3b  UpperToLower[A];
35b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69   }.#endif..stati
35c0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63  c const struct c
35d0: 6f 6d 70 61 72 65 49 6e 66 6f 20 67 6c 6f 62 49  ompareInfo globI
35e0: 6e 66 6f 20 3d 20 7b 20 27 2a 27 2c 20 27 3f 27  nfo = { '*', '?'
35f0: 2c 20 27 5b 27 2c 20 30 20 7d 3b 0a 2f 2a 20 54  , '[', 0 };./* T
3600: 68 65 20 63 6f 72 72 65 63 74 20 53 51 4c 2d 39  he correct SQL-9
3610: 32 20 62 65 68 61 76 69 6f 72 20 69 73 20 66 6f  2 behavior is fo
3620: 72 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  r the LIKE opera
3630: 74 6f 72 20 74 6f 20 69 67 6e 6f 72 65 0a 2a 2a  tor to ignore.**
3640: 20 63 61 73 65 2e 20 20 54 68 75 73 20 20 27 61   case.  Thus  'a
3650: 27 20 4c 49 4b 45 20 27 41 27 20 77 6f 75 6c 64  ' LIKE 'A' would
3660: 20 62 65 20 74 72 75 65 2e 20 2a 2f 0a 73 74 61   be true. */.sta
3670: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
3680: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b   compareInfo lik
3690: 65 49 6e 66 6f 4e 6f 72 6d 20 3d 20 7b 20 27 25  eInfoNorm = { '%
36a0: 27 2c 20 27 5f 27 2c 20 20 20 30 2c 20 31 20 7d  ', '_',   0, 1 }
36b0: 3b 0a 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  ;./* If SQLITE_C
36c0: 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49  ASE_SENSITIVE_LI
36d0: 4b 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  KE is defined, t
36e0: 68 65 6e 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  hen the LIKE ope
36f0: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 63 61 73 65  rator.** is case
3700: 20 73 65 6e 73 69 74 69 76 65 20 63 61 75 73 69   sensitive causi
3710: 6e 67 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  ng 'a' LIKE 'A' 
3720: 74 6f 20 62 65 20 66 61 6c 73 65 20 2a 2f 0a 73  to be false */.s
3730: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
3740: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c  ct compareInfo l
3750: 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 20 7b 20 27  ikeInfoAlt = { '
3760: 25 27 2c 20 27 5f 27 2c 20 20 20 30 2c 20 30 20  %', '_',   0, 0 
3770: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  };../*.** Compar
3780: 65 20 74 77 6f 20 55 54 46 2d 38 20 73 74 72 69  e two UTF-8 stri
3790: 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69 74 79  ngs for equality
37a0: 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
37b0: 20 73 74 72 69 6e 67 20 63 61 6e 0a 2a 2a 20 70   string can.** p
37c0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 61 20  otentially be a 
37d0: 22 67 6c 6f 62 22 20 65 78 70 72 65 73 73 69 6f  "glob" expressio
37e0: 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  n.  Return true 
37f0: 28 31 29 20 69 66 20 74 68 65 79 0a 2a 2a 20 61  (1) if they.** a
3800: 72 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20  re the same and 
3810: 66 61 6c 73 65 20 28 30 29 20 69 66 20 74 68 65  false (0) if the
3820: 79 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  y are different.
3830: 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20  .**.** Globbing 
3840: 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rules:.**.**    
3850: 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63    '*'       Matc
3860: 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65  hes any sequence
3870: 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
3880: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
3890: 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20  **      '?'     
38a0: 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c    Matches exactl
38b0: 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e  y one character.
38c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d  .**.**     [...]
38d0: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e        Matches on
38e0: 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d  e character from
38f0: 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
3900: 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  st of.**        
3910: 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65          characte
3920: 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e  rs..**.**     [^
3930: 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73  ...]     Matches
3940: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e   one character n
3950: 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73  ot in the enclos
3960: 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57  ed list..**.** W
3970: 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e  ith the [...] an
3980: 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e  d [^...] matchin
3990: 67 2c 20 61 20 27 5d 27 20 63 68 61 72 61 63 74  g, a ']' charact
39a0: 65 72 20 63 61 6e 20 62 65 20 69 6e 63 6c 75 64  er can be includ
39b0: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73  ed.** in the lis
39c0: 74 20 62 79 20 6d 61 6b 69 6e 67 20 69 74 20 74  t by making it t
39d0: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
39e0: 65 72 20 61 66 74 65 72 20 27 5b 27 20 6f 72 20  er after '[' or 
39f0: 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65  '^'.  A.** range
3a00: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 63   of characters c
3a10: 61 6e 20 62 65 20 73 70 65 63 69 66 69 65 64 20  an be specified 
3a20: 75 73 69 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d  using '-'.  Exam
3a30: 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20  ple:.** "[a-z]" 
3a40: 6d 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67  matches any sing
3a50: 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65  le lower-case le
3a60: 74 74 65 72 2e 20 20 54 6f 20 6d 61 74 63 68 20  tter.  To match 
3a70: 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69  a '-', make.** i
3a80: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
3a90: 63 74 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74  cter in the list
3aa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3ab0: 74 69 6e 65 20 69 73 20 75 73 75 61 6c 6c 79 20  tine is usually 
3ac0: 71 75 69 63 6b 2c 20 62 75 74 20 63 61 6e 20 62  quick, but can b
3ad0: 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f  e N**2 in the wo
3ae0: 72 73 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  rst case..**.** 
3af0: 48 69 6e 74 73 3a 20 74 6f 20 6d 61 74 63 68 20  Hints: to match 
3b00: 27 2a 27 20 6f 72 20 27 3f 27 2c 20 70 75 74 20  '*' or '?', put 
3b10: 74 68 65 6d 20 69 6e 20 22 5b 5d 22 2e 20 20 4c  them in "[]".  L
3b20: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
3b30: 20 20 20 20 20 20 20 20 61 62 63 5b 2a 5d 78 79          abc[*]xy
3b40: 7a 20 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  z        Matches
3b50: 20 22 61 62 63 2a 78 79 7a 22 20 6f 6e 6c 79 0a   "abc*xyz" only.
3b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
3b70: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 0a 20 20  tternCompare(.  
3b80: 63 6f 6e 73 74 20 75 38 20 2a 7a 50 61 74 74 65  const u8 *zPatte
3b90: 72 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rn,             
3ba0: 20 2f 2a 20 54 68 65 20 67 6c 6f 62 20 70 61 74   /* The glob pat
3bb0: 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tern */.  const 
3bc0: 75 38 20 2a 7a 53 74 72 69 6e 67 2c 20 20 20 20  u8 *zString,    
3bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3be0: 65 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70  e string to comp
3bf0: 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  are against the 
3c00: 67 6c 6f 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  glob */.  const 
3c10: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
3c20: 66 6f 20 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49 6e  fo *pInfo, /* In
3c30: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
3c40: 68 6f 77 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  how to do the co
3c50: 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 65  mpare */.  u32 e
3c60: 73 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sc              
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3c80: 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63  he escape charac
3c90: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ter */.){.  u32 
3ca0: 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e 76  c, c2;.  int inv
3cb0: 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b  ert;.  int seen;
3cc0: 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e 65 20 3d  .  u8 matchOne =
3cd0: 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65   pInfo->matchOne
3ce0: 3b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c 20  ;.  u8 matchAll 
3cf0: 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c  = pInfo->matchAl
3d00: 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68 53 65 74  l;.  u8 matchSet
3d10: 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53   = pInfo->matchS
3d20: 65 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65 20  et;.  u8 noCase 
3d30: 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43 61 73 65 3b  = pInfo->noCase;
3d40: 20 0a 20 20 69 6e 74 20 70 72 65 76 45 73 63 61   .  int prevEsca
3d50: 70 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  pe = 0;     /* T
3d60: 72 75 65 20 69 66 20 74 68 65 20 70 72 65 76 69  rue if the previ
3d70: 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 77 61  ous character wa
3d80: 73 20 27 65 73 63 61 70 65 27 20 2a 2f 0a 0a 20  s 'escape' */.. 
3d90: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 73 71 6c   while( (c = sql
3da0: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61  ite3Utf8Read(zPa
3db0: 74 74 65 72 6e 2c 26 7a 50 61 74 74 65 72 6e 29  ttern,&zPattern)
3dc0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
3dd0: 21 70 72 65 76 45 73 63 61 70 65 20 26 26 20 63  !prevEscape && c
3de0: 3d 3d 6d 61 74 63 68 41 6c 6c 20 29 7b 0a 20 20  ==matchAll ){.  
3df0: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 73 71      while( (c=sq
3e00: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50  lite3Utf8Read(zP
3e10: 61 74 74 65 72 6e 2c 26 7a 50 61 74 74 65 72 6e  attern,&zPattern
3e20: 29 29 20 3d 3d 20 6d 61 74 63 68 41 6c 6c 0a 20  )) == matchAll. 
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
3e40: 20 63 20 3d 3d 20 6d 61 74 63 68 4f 6e 65 20 29   c == matchOne )
3e50: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
3e60: 3d 6d 61 74 63 68 4f 6e 65 20 26 26 20 73 71 6c  =matchOne && sql
3e70: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 53 74  ite3Utf8Read(zSt
3e80: 72 69 6e 67 2c 20 26 7a 53 74 72 69 6e 67 29 3d  ring, &zString)=
3e90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3ea0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
3eb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3ec0: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
3ed0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3ee0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3ef0: 63 3d 3d 65 73 63 20 29 7b 0a 20 20 20 20 20 20  c==esc ){.      
3f00: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66    c = sqlite3Utf
3f10: 38 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20  8Read(zPattern, 
3f20: 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  &zPattern);.    
3f30: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
3f40: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3f50: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
3f60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
3f70: 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a 20 20 20  =matchSet ){.   
3f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 73 63       assert( esc
3f90: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ==0 );         /
3fa0: 2a 20 54 68 69 73 20 69 73 20 47 4c 4f 42 2c 20  * This is GLOB, 
3fb0: 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20  not LIKE */.    
3fc0: 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 74 63      assert( matc
3fd0: 68 53 65 74 3c 30 78 38 30 20 29 3b 20 20 2f 2a  hSet<0x80 );  /*
3fe0: 20 27 5b 27 20 69 73 20 61 20 73 69 6e 67 6c 65   '[' is a single
3ff0: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  -byte character 
4000: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
4010: 28 20 2a 7a 53 74 72 69 6e 67 20 26 26 20 70 61  ( *zString && pa
4020: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 26 7a 50  tternCompare(&zP
4030: 61 74 74 65 72 6e 5b 2d 31 5d 2c 7a 53 74 72 69  attern[-1],zStri
4040: 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29 3d 3d 30  ng,pInfo,esc)==0
4050: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 51   ){.          SQ
4060: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
4070: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
4080: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
4090: 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a 20  n *zString!=0;. 
40a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
40b0: 6c 65 28 20 28 63 32 20 3d 20 73 71 6c 69 74 65  le( (c2 = sqlite
40c0: 33 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e  3Utf8Read(zStrin
40d0: 67 2c 26 7a 53 74 72 69 6e 67 29 29 21 3d 30 20  g,&zString))!=0 
40e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
40f0: 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  oCase ){.       
4100: 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f     GlogUpperToLo
4110: 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20 20 20  wer(c2);.       
4120: 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f     GlogUpperToLo
4130: 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20 20 20  wer(c);.        
4140: 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30    while( c2 != 0
4150: 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b 0a 20   && c2 != c ){. 
4160: 20 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20             c2 = 
4170: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
4180: 7a 53 74 72 69 6e 67 2c 20 26 7a 53 74 72 69 6e  zString, &zStrin
4190: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
41a0: 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72  GlogUpperToLower
41b0: 28 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (c2);.          
41c0: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
41d0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
41e0: 28 20 63 32 20 21 3d 20 30 20 26 26 20 63 32 20  ( c2 != 0 && c2 
41f0: 21 3d 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  != c ){.        
4200: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
4210: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
4220: 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  , &zString);.   
4230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4240: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
4250: 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  2==0 ) return 0;
4260: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 61 74  .        if( pat
4270: 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 50 61 74  ternCompare(zPat
4280: 74 65 72 6e 2c 7a 53 74 72 69 6e 67 2c 70 49 6e  tern,zString,pIn
4290: 66 6f 2c 65 73 63 29 20 29 20 72 65 74 75 72 6e  fo,esc) ) return
42a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
42b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
42c0: 7d 65 6c 73 65 20 69 66 28 20 21 70 72 65 76 45  }else if( !prevE
42d0: 73 63 61 70 65 20 26 26 20 63 3d 3d 6d 61 74 63  scape && c==matc
42e0: 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 69 66  hOne ){.      if
42f0: 28 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  ( sqlite3Utf8Rea
4300: 64 28 7a 53 74 72 69 6e 67 2c 20 26 7a 53 74 72  d(zString, &zStr
4310: 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ing)==0 ){.     
4320: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
4330: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
4340: 66 28 20 63 3d 3d 6d 61 74 63 68 53 65 74 20 29  f( c==matchSet )
4350: 7b 0a 20 20 20 20 20 20 75 33 32 20 70 72 69 6f  {.      u32 prio
4360: 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  r_c = 0;.      a
4370: 73 73 65 72 74 28 20 65 73 63 3d 3d 30 20 29 3b  ssert( esc==0 );
4380: 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79      /* This only
4390: 20 6f 63 63 75 72 73 20 66 6f 72 20 47 4c 4f 42   occurs for GLOB
43a0: 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20  , not LIKE */.  
43b0: 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20      seen = 0;.  
43c0: 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a      invert = 0;.
43d0: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
43e0: 33 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e  3Utf8Read(zStrin
43f0: 67 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20  g, &zString);.  
4400: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
4410: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63  eturn 0;.      c
4420: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
4430: 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 26 7a  ead(zPattern, &z
4440: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
4450: 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20  if( c2=='^' ){. 
4460: 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20         invert = 
4470: 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  1;.        c2 = 
4480: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
4490: 7a 50 61 74 74 65 72 6e 2c 20 26 7a 50 61 74 74  zPattern, &zPatt
44a0: 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ern);.      }.  
44b0: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20      if( c2==']' 
44c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
44d0: 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31  ==']' ) seen = 1
44e0: 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 73  ;.        c2 = s
44f0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
4500: 50 61 74 74 65 72 6e 2c 20 26 7a 50 61 74 74 65  Pattern, &zPatte
4510: 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rn);.      }.   
4520: 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26 20     while( c2 && 
4530: 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2!=']' ){.     
4540: 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26     if( c2=='-' &
4550: 26 20 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d 27  & zPattern[0]!='
4560: 5d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 30  ]' && zPattern[0
4570: 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e  ]!=0 && prior_c>
4580: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
4590: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
45a0: 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 26 7a  ead(zPattern, &z
45b0: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
45c0: 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72      if( c>=prior
45d0: 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65  _c && c<=c2 ) se
45e0: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
45f0: 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
4600: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4610: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
4620: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
4630: 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
4640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4650: 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20   prior_c = c2;. 
4660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4670: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
4680: 38 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20  8Read(zPattern, 
4690: 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  &zPattern);.    
46a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
46b0: 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69  ==0 || (seen ^ i
46c0: 6e 76 65 72 74 29 3d 3d 30 20 29 7b 0a 20 20 20  nvert)==0 ){.   
46d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
46e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
46f0: 20 69 66 28 20 65 73 63 3d 3d 63 20 26 26 20 21   if( esc==c && !
4700: 70 72 65 76 45 73 63 61 70 65 20 29 7b 0a 20 20  prevEscape ){.  
4710: 20 20 20 20 70 72 65 76 45 73 63 61 70 65 20 3d      prevEscape =
4720: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
4730: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
4740: 33 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e  3Utf8Read(zStrin
4750: 67 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20  g, &zString);.  
4760: 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29      if( noCase )
4770: 7b 0a 20 20 20 20 20 20 20 20 47 6c 6f 67 55 70  {.        GlogUp
4780: 70 65 72 54 6f 4c 6f 77 65 72 28 63 29 3b 0a 20  perToLower(c);. 
4790: 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72         GlogUpper
47a0: 54 6f 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20 20  ToLower(c2);.   
47b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
47c0: 21 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=c2 ){.        
47d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
47e0: 7d 0a 20 20 20 20 20 20 70 72 65 76 45 73 63 61  }.      prevEsca
47f0: 70 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  pe = 0;.    }.  
4800: 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72  }.  return *zStr
4810: 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ing==0;.}../*.**
4820: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
4830: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
4840: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
4850: 72 20 28 6f 72 20 47 4c 4f 42 20 77 68 69 63 68  r (or GLOB which
4860: 20 69 73 0a 2a 2a 20 6a 75 73 74 20 61 20 76 61   is.** just a va
4870: 72 69 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 29  riation of LIKE)
4880: 20 67 65 74 73 20 63 61 6c 6c 65 64 2e 20 20 54   gets called.  T
4890: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
48a0: 74 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e  testing.** only.
48b0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
48c0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
48d0: 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d 20  e3_like_count = 
48e0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0;.#endif.../*.*
48f0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
4900: 20 6f 66 20 74 68 65 20 6c 69 6b 65 28 29 20 53   of the like() S
4910: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
4920: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  is function impl
4930: 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75  ements.** the bu
4940: 69 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72  ild-in LIKE oper
4950: 61 74 6f 72 2e 20 20 54 68 65 20 66 69 72 73 74  ator.  The first
4960: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
4970: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
4980: 0a 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e 64 20  .** pattern and 
4990: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
49a0: 65 6e 74 20 69 73 20 74 68 65 20 73 74 72 69 6e  ent is the strin
49b0: 67 2e 20 20 53 6f 2c 20 74 68 65 20 53 51 4c 20  g.  So, the SQL 
49c0: 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  statements:.**.*
49d0: 2a 20 20 20 20 20 20 20 41 20 4c 49 4b 45 20 42  *       A LIKE B
49e0: 0a 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d  .**.** is implem
49f0: 65 6e 74 65 64 20 61 73 20 6c 69 6b 65 28 42 2c  ented as like(B,
4a00: 41 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  A)..**.** This s
4a10: 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20 28 77 69  ame function (wi
4a20: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  th a different c
4a30: 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75 63  ompareInfo struc
4a40: 74 75 72 65 29 20 63 6f 6d 70 75 74 65 73 0a 2a  ture) computes.*
4a50: 2a 20 74 68 65 20 47 4c 4f 42 20 6f 70 65 72 61  * the GLOB opera
4a60: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
4a70: 6f 69 64 20 6c 69 6b 65 46 75 6e 63 28 0a 20 20  oid likeFunc(.  
4a80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4a90: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
4aa0: 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65   argc, .  sqlite
4ab0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
4ac0: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
4ad0: 65 64 20 63 68 61 72 20 2a 7a 41 2c 20 2a 7a 42  ed char *zA, *zB
4ae0: 3b 0a 20 20 75 33 32 20 65 73 63 61 70 65 20 3d  ;.  u32 escape =
4af0: 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 3b 0a   0;.  int nPat;.
4b00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4b10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
4b20: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
4b30: 74 29 3b 0a 0a 20 20 7a 42 20 3d 20 73 71 6c 69  t);..  zB = sqli
4b40: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
4b50: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20  rgv[0]);.  zA = 
4b60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
4b70: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20  xt(argv[1]);..  
4b80: 2f 2a 20 4c 69 6d 69 74 20 74 68 65 20 6c 65 6e  /* Limit the len
4b90: 67 74 68 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  gth of the LIKE 
4ba0: 6f 72 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20  or GLOB pattern 
4bb0: 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
4bc0: 73 0a 20 20 2a 2a 20 6f 66 20 64 65 65 70 20 72  s.  ** of deep r
4bd0: 65 63 75 72 73 69 6f 6e 20 61 6e 64 20 4e 2a 4e  ecursion and N*N
4be0: 20 62 65 68 61 76 69 6f 72 20 69 6e 20 70 61 74   behavior in pat
4bf0: 74 65 72 6e 43 6f 6d 70 61 72 65 28 29 2e 0a 20  ternCompare().. 
4c00: 20 2a 2f 0a 20 20 6e 50 61 74 20 3d 20 73 71 6c   */.  nPat = sql
4c10: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
4c20: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74 65 73  (argv[0]);.  tes
4c30: 74 63 61 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d  tcase( nPat==db-
4c40: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4c50: 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
4c60: 4e 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74  N_LENGTH] );.  t
4c70: 65 73 74 63 61 73 65 28 20 6e 50 61 74 3d 3d 64  estcase( nPat==d
4c80: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4c90: 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
4ca0: 45 52 4e 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b  ERN_LENGTH]+1 );
4cb0: 0a 20 20 69 66 28 20 6e 50 61 74 20 3e 20 64 62  .  if( nPat > db
4cc0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
4cd0: 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
4ce0: 52 4e 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  RN_LENGTH] ){.  
4cf0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4d00: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
4d10: 22 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61  "LIKE or GLOB pa
4d20: 74 74 65 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c 65  ttern too comple
4d30: 78 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  x", -1);.    ret
4d40: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
4d50: 74 28 20 7a 42 3d 3d 73 71 6c 69 74 65 33 5f 76  t( zB==sqlite3_v
4d60: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
4d70: 5d 29 20 29 3b 20 20 2f 2a 20 45 6e 63 6f 64 69  ]) );  /* Encodi
4d80: 6e 67 20 64 69 64 20 6e 6f 74 20 63 68 61 6e 67  ng did not chang
4d90: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 61 72 67 63  e */..  if( argc
4da0: 3d 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==3 ){.    /* Th
4db0: 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74  e escape charact
4dc0: 65 72 20 73 74 72 69 6e 67 20 6d 75 73 74 20 63  er string must c
4dd0: 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69 6e 67  onsist of a sing
4de0: 6c 65 20 55 54 46 2d 38 20 63 68 61 72 61 63 74  le UTF-8 charact
4df0: 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  er..    ** Other
4e00: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
4e10: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
4e20: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
4e30: 20 63 68 61 72 20 2a 7a 45 73 63 20 3d 20 73 71   char *zEsc = sq
4e40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
4e50: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69  (argv[2]);.    i
4e60: 66 28 20 7a 45 73 63 3d 3d 30 20 29 20 72 65 74  f( zEsc==0 ) ret
4e70: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  urn;.    if( sql
4e80: 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
4e90: 28 63 68 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29  (char*)zEsc, -1)
4ea0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
4eb0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
4ec0: 72 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20  r(context, .    
4ed0: 20 20 20 20 20 20 22 45 53 43 41 50 45 20 65 78        "ESCAPE ex
4ee0: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
4ef0: 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   a single charac
4f00: 74 65 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ter", -1);.     
4f10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
4f20: 20 20 20 65 73 63 61 70 65 20 3d 20 73 71 6c 69     escape = sqli
4f30: 74 65 33 55 74 66 38 52 65 61 64 28 7a 45 73 63  te3Utf8Read(zEsc
4f40: 2c 20 26 7a 45 73 63 29 3b 0a 20 20 7d 0a 20 20  , &zEsc);.  }.  
4f50: 69 66 28 20 7a 41 20 26 26 20 7a 42 20 29 7b 0a  if( zA && zB ){.
4f60: 20 20 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61      struct compa
4f70: 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  reInfo *pInfo = 
4f80: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
4f90: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 23 69 66 64  a(context);.#ifd
4fa0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
4fb0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f     sqlite3_like_
4fc0: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
4fd0: 20 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33      .    sqlite3
4fe0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
4ff0: 65 78 74 2c 20 70 61 74 74 65 72 6e 43 6f 6d 70  ext, patternComp
5000: 61 72 65 28 7a 42 2c 20 7a 41 2c 20 70 49 6e 66  are(zB, zA, pInf
5010: 6f 2c 20 65 73 63 61 70 65 29 29 3b 0a 20 20 7d  o, escape));.  }
5020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
5030: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
5040: 4e 55 4c 4c 49 46 28 78 2c 79 29 20 66 75 6e 63  NULLIF(x,y) func
5050: 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c  tion.  The resul
5060: 74 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  t is the first.*
5070: 2a 20 61 72 67 75 6d 65 6e 74 20 69 66 20 74 68  * argument if th
5080: 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  e arguments are 
5090: 64 69 66 66 65 72 65 6e 74 2e 20 20 54 68 65 20  different.  The 
50a0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69  result is NULL i
50b0: 66 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  f the.** argumen
50c0: 74 73 20 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ts are equal to 
50d0: 65 61 63 68 20 6f 74 68 65 72 2e 0a 2a 2f 0a 73  each other..*/.s
50e0: 74 61 74 69 63 20 76 6f 69 64 20 6e 75 6c 6c 69  tatic void nulli
50f0: 66 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  fFunc(.  sqlite3
5100: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5110: 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64  t,.  int NotUsed
5120: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5130: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 43 6f  e **argv.){.  Co
5140: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
5150: 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c  qlite3GetFuncCol
5160: 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20  lSeq(context);. 
5170: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
5180: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  R(NotUsed);.  if
5190: 28 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  ( sqlite3MemComp
51a0: 61 72 65 28 61 72 67 76 5b 30 5d 2c 20 61 72 67  are(argv[0], arg
51b0: 76 5b 31 5d 2c 20 70 43 6f 6c 6c 29 21 3d 30 20  v[1], pColl)!=0 
51c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
51d0: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
51e0: 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20  ext, argv[0]);. 
51f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
5200: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
5210: 65 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e  e sqlite_version
5220: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  () function.  Th
5230: 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
5240: 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  version.** of th
5250: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
5260: 20 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67   that is running
5270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5280: 20 76 65 72 73 69 6f 6e 46 75 6e 63 28 0a 20 20   versionFunc(.  
5290: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
52a0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
52b0: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
52c0: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
52d0: 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ed2.){.  UNUSED_
52e0: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
52f0: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
5300: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 36 39 39   /* IMP: R-48699
5310: 2d 34 38 36 31 37 20 54 68 69 73 20 66 75 6e 63  -48617 This func
5320: 74 69 6f 6e 20 69 73 20 61 6e 20 53 51 4c 20 77  tion is an SQL w
5330: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68  rapper around th
5340: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6c  e.  ** sqlite3_l
5350: 69 62 76 65 72 73 69 6f 6e 28 29 20 43 2d 69 6e  ibversion() C-in
5360: 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71  terface. */.  sq
5370: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
5380: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
5390: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c  e3_libversion(),
53a0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
53b0: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  IC);.}../*.** Im
53c0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
53d0: 74 68 65 20 73 71 6c 69 74 65 5f 73 6f 75 72 63  the sqlite_sourc
53e0: 65 5f 69 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e  e_id() function.
53f0: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
5400: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
5410: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70  identifies the p
5420: 61 72 74 69 63 75 6c 61 72 20 76 65 72 73 69 6f  articular versio
5430: 6e 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20  n of the source 
5440: 63 6f 64 65 20 75 73 65 64 20 74 6f 20 62 75 69  code used to bui
5450: 6c 64 0a 2a 2a 20 53 51 4c 69 74 65 2e 0a 2a 2f  ld.** SQLite..*/
5460: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75  .static void sou
5470: 72 63 65 69 64 46 75 6e 63 28 0a 20 20 73 71 6c  rceidFunc(.  sql
5480: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
5490: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74  ntext,.  int Not
54a0: 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f  Used,.  sqlite3_
54b0: 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32  value **NotUsed2
54c0: 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
54d0: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
54e0: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a   NotUsed2);.  /*
54f0: 20 49 4d 50 3a 20 52 2d 32 34 34 37 30 2d 33 31   IMP: R-24470-31
5500: 31 33 36 20 54 68 69 73 20 66 75 6e 63 74 69 6f  136 This functio
5510: 6e 20 69 73 20 61 6e 20 53 51 4c 20 77 72 61 70  n is an SQL wrap
5520: 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a 20  per around the. 
5530: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 75 72   ** sqlite3_sour
5540: 63 65 69 64 28 29 20 43 20 69 6e 74 65 72 66 61  ceid() C interfa
5550: 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ce. */.  sqlite3
5560: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
5570: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 73 6f  text, sqlite3_so
5580: 75 72 63 65 69 64 28 29 2c 20 2d 31 2c 20 53 51  urceid(), -1, SQ
5590: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a  LITE_STATIC);.}.
55a0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
55b0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c  ation of the sql
55c0: 69 74 65 5f 6c 6f 67 28 29 20 66 75 6e 63 74 69  ite_log() functi
55d0: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 61 20 77  on.  This is a w
55e0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a  rapper around.**
55f0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 2e 20   sqlite3_log(). 
5600: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
5610: 65 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20  e is NULL.  The 
5620: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20  function exists 
5630: 70 75 72 65 6c 79 20 66 6f 72 0a 2a 2a 20 69 74  purely for.** it
5640: 73 20 73 69 64 65 2d 65 66 66 65 63 74 73 2e 0a  s side-effects..
5650: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5660: 72 72 6c 6f 67 46 75 6e 63 28 0a 20 20 73 71 6c  rrlogFunc(.  sql
5670: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
5680: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
5690: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
56a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 55  ue **argv.){.  U
56b0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
56c0: 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argc);.  UNUSED_
56d0: 50 41 52 41 4d 45 54 45 52 28 63 6f 6e 74 65 78  PARAMETER(contex
56e0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f  t);.  sqlite3_lo
56f0: 67 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  g(sqlite3_value_
5700: 69 6e 74 28 61 72 67 76 5b 30 5d 29 2c 20 22 25  int(argv[0]), "%
5710: 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s", sqlite3_valu
5720: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 29  e_text(argv[1]))
5730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
5740: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
5750: 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f   sqlite_compileo
5760: 70 74 69 6f 6e 5f 75 73 65 64 28 29 20 66 75 6e  ption_used() fun
5770: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65  ction..** The re
5780: 73 75 6c 74 20 69 73 20 61 6e 20 69 6e 74 65 67  sult is an integ
5790: 65 72 20 74 68 61 74 20 69 64 65 6e 74 69 66 69  er that identifi
57a0: 65 73 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c  es if the compil
57b0: 65 72 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73  er option.** was
57c0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 53   used to build S
57d0: 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  QLite..*/.#ifnde
57e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
57f0: 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
5800: 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  S.static void co
5810: 6d 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46  mpileoptionusedF
5820: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
5830: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5840: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5850: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5860: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
5870: 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20  har *zOptName;. 
5880: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
5890: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
58a0: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
58b0: 2f 2a 20 49 4d 50 3a 20 52 2d 33 39 35 36 34 2d  /* IMP: R-39564-
58c0: 33 36 33 30 35 20 54 68 65 20 73 71 6c 69 74 65  36305 The sqlite
58d0: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
58e0: 73 65 64 28 29 20 53 51 4c 0a 20 20 2a 2a 20 66  sed() SQL.  ** f
58f0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
5900: 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20  pper around the 
5910: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
5920: 70 74 69 6f 6e 5f 75 73 65 64 28 29 20 43 2f 43  ption_used() C/C
5930: 2b 2b 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ++.  ** function
5940: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 7a 4f  ..  */.  if( (zO
5950: 70 74 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  ptName = (const 
5960: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5970: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5980: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
5990: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
59a0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
59b0: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
59c0: 73 65 64 28 7a 4f 70 74 4e 61 6d 65 29 29 3b 0a  sed(zOptName));.
59d0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
59e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
59f0: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20  ILEOPTION_DIAGS 
5a00: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  */../*.** Implem
5a10: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
5a20: 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70  sqlite_compileop
5a30: 74 69 6f 6e 5f 67 65 74 28 29 20 66 75 6e 63 74  tion_get() funct
5a40: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 72 65 73  ion. .** The res
5a50: 75 6c 74 20 69 73 20 61 20 73 74 72 69 6e 67 20  ult is a string 
5a60: 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 73 20  that identifies 
5a70: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  the compiler opt
5a80: 69 6f 6e 73 20 0a 2a 2a 20 75 73 65 64 20 74 6f  ions .** used to
5a90: 20 62 75 69 6c 64 20 53 51 4c 69 74 65 2e 0a 2a   build SQLite..*
5aa0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
5ab0: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
5ac0: 49 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74 69 63  ION_DIAGS.static
5ad0: 20 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f 70 74   void compileopt
5ae0: 69 6f 6e 67 65 74 46 75 6e 63 28 0a 20 20 73 71  iongetFunc(.  sq
5af0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5b00: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
5b10: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
5b20: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5b30: 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  int n;.  assert(
5b40: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
5b50: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
5b60: 72 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20  rgc);.  /* IMP: 
5b70: 52 2d 30 34 39 32 32 2d 32 34 30 37 36 20 54 68  R-04922-24076 Th
5b80: 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65  e sqlite_compile
5b90: 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20 53 51 4c  option_get() SQL
5ba0: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
5bb0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
5bc0: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  nd the sqlite3_c
5bd0: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74  ompileoption_get
5be0: 28 29 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69 6f  () C/C++ functio
5bf0: 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71  n..  */.  n = sq
5c00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
5c10: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69  argv[0]);.  sqli
5c20: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5c30: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
5c40: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67  _compileoption_g
5c50: 65 74 28 6e 29 2c 20 2d 31 2c 20 53 51 4c 49 54  et(n), -1, SQLIT
5c60: 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 23 65 6e  E_STATIC);.}.#en
5c70: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5c80: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
5c90: 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a 20 41 72  _DIAGS */../* Ar
5ca0: 72 61 79 20 66 6f 72 20 63 6f 6e 76 65 72 74 69  ray for converti
5cb0: 6e 67 20 66 72 6f 6d 20 68 61 6c 66 2d 62 79 74  ng from half-byt
5cc0: 65 73 20 28 6e 79 62 62 6c 65 73 29 20 69 6e 74  es (nybbles) int
5cd0: 6f 20 41 53 43 49 49 20 68 65 78 0a 2a 2a 20 64  o ASCII hex.** d
5ce0: 69 67 69 74 73 2e 20 2a 2f 0a 73 74 61 74 69 63  igits. */.static
5cf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 68 65 78 64   const char hexd
5d00: 69 67 69 74 73 5b 5d 20 3d 20 7b 0a 20 20 27 30  igits[] = {.  '0
5d10: 27 2c 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27  ', '1', '2', '3'
5d20: 2c 20 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c  , '4', '5', '6',
5d30: 20 27 37 27 2c 0a 20 20 27 38 27 2c 20 27 39 27   '7',.  '8', '9'
5d40: 2c 20 27 41 27 2c 20 27 42 27 2c 20 27 43 27 2c  , 'A', 'B', 'C',
5d50: 20 27 44 27 2c 20 27 45 27 2c 20 27 46 27 20 0a   'D', 'E', 'F' .
5d60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 58 50 45 52 49  };../*.** EXPERI
5d70: 4d 45 4e 54 41 4c 20 2d 20 54 68 69 73 20 69 73  MENTAL - This is
5d80: 20 6e 6f 74 20 61 6e 20 6f 66 66 69 63 69 61 6c   not an official
5d90: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
5da0: 69 6e 74 65 72 66 61 63 65 20 6d 61 79 0a 2a 2a  interface may.**
5db0: 20 63 68 61 6e 67 65 2e 20 20 54 68 69 73 20 66   change.  This f
5dc0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 69 73 61  unction may disa
5dd0: 70 70 65 61 72 2e 20 20 44 6f 20 6e 6f 74 20 77  ppear.  Do not w
5de0: 72 69 74 65 20 63 6f 64 65 20 74 68 61 74 20 64  rite code that d
5df0: 65 70 65 6e 64 73 0a 2a 2a 20 6f 6e 20 74 68 69  epends.** on thi
5e00: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
5e10: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
5e20: 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28 29 20   of the QUOTE() 
5e30: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
5e40: 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61  function takes a
5e50: 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67 75 6d   single.** argum
5e60: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67  ent.  If the arg
5e70: 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72 69 63  ument is numeric
5e80: 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  , the return val
5e90: 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ue is the same a
5ea0: 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e  s.** the argumen
5eb0: 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d  t.  If the argum
5ec0: 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
5ed0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
5ee0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
5ef0: 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77 69 73  NULL".  Otherwis
5f00: 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  e, the argument 
5f10: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 73  is enclosed in s
5f20: 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77 69 74  ingle quotes wit
5f30: 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75 6f 74  h.** single-quot
5f40: 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a 73 74  e escapes..*/.st
5f50: 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74 65 46  atic void quoteF
5f60: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
5f70: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
5f80: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
5f90: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
5fa0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
5fb0: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
5fc0: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
5fd0: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
5fe0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
5ff0: 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  0]) ){.    case 
6000: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a  SQLITE_INTEGER:.
6010: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6020: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  FLOAT: {.      s
6030: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
6040: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  lue(context, arg
6050: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  v[0]);.      bre
6060: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6070: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
6080: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
6090: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ext = 0;.      c
60a0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62  har const *zBlob
60b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
60c0: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
60d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
60e0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
60f0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
6100: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 42        assert( zB
6110: 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  lob==sqlite3_val
6120: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
6130: 20 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69   ); /* No encodi
6140: 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20  ng change */.   
6150: 20 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61 72     zText = (char
6160: 20 2a 29 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   *)contextMalloc
6170: 28 63 6f 6e 74 65 78 74 2c 20 28 32 2a 28 69 36  (context, (2*(i6
6180: 34 29 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20 20  4)nBlob)+4); .  
6190: 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b      if( zText ){
61a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
61b0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
61c0: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a   i<nBlob; i++){.
61d0: 20 20 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b            zText[
61e0: 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64 69  (i*2)+2] = hexdi
61f0: 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e  gits[(zBlob[i]>>
6200: 34 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20 20  4)&0x0F];.      
6210: 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b      zText[(i*2)+
6220: 33 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  3] = hexdigits[(
6230: 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d 3b  zBlob[i])&0x0F];
6240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6250: 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a     zText[(nBlob*
6260: 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  2)+2] = '\'';.  
6270: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c        zText[(nBl
6280: 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27 3b  ob*2)+3] = '\0';
6290: 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 30  .        zText[0
62a0: 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20 20 20 20  ] = 'X';.       
62b0: 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27 27   zText[1] = '\''
62c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
62d0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
62e0: 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31  ntext, zText, -1
62f0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
6300: 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  NT);.        sql
6310: 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29  ite3_free(zText)
6320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6330: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6340: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
6350: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  T: {.      int i
6360: 2c 6a 3b 0a 20 20 20 20 20 20 75 36 34 20 6e 3b  ,j;.      u64 n;
6370: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
6380: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67  igned char *zArg
6390: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
63a0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
63b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a        char *z;..
63c0: 20 20 20 20 20 20 69 66 28 20 7a 41 72 67 3d 3d        if( zArg==
63d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
63e0: 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b 20    for(i=0, n=0; 
63f0: 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69  zArg[i]; i++){ i
6400: 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27  f( zArg[i]=='\''
6410: 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20   ) n++; }.      
6420: 7a 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  z = contextMallo
6430: 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34  c(context, ((i64
6440: 29 69 29 2b 28 28 69 36 34 29 6e 29 2b 33 29 3b  )i)+((i64)n)+3);
6450: 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  .      if( z ){.
6460: 20 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20 27          z[0] = '
6470: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  \'';.        for
6480: 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b  (i=0, j=1; zArg[
6490: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
64a0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72      z[j++] = zAr
64b0: 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g[i];.          
64c0: 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27  if( zArg[i]=='\'
64d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
64e0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[j++] = '\'';.
64f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6500: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
6510: 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20  j++] = '\'';.   
6520: 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20       z[j] = 0;. 
6530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
6540: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
6550: 78 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74 65  xt, z, j, sqlite
6560: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d  3_free);.      }
6570: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6580: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
6590: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
65a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
65b0: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
65c0: 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  LITE_NULL );.   
65d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
65e0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
65f0: 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51 4c 49 54  "NULL", 4, SQLIT
6600: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
6610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6620: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68  }.}../*.** The h
6630: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ex() function.  
6640: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 61 72  Interpret the ar
6650: 67 75 6d 65 6e 74 20 61 73 20 61 20 62 6c 6f 62  gument as a blob
6660: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 68  .  Return.** a h
6670: 65 78 61 64 65 63 69 6d 61 6c 20 72 65 6e 64 65  exadecimal rende
6680: 72 69 6e 67 20 61 73 20 74 65 78 74 2e 0a 2a 2f  ring as text..*/
6690: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78  .static void hex
66a0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
66b0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
66c0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
66d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
66e0: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  argv.){.  int i,
66f0: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   n;.  const unsi
6700: 67 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f 62  gned char *pBlob
6710: 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 2c 20  ;.  char *zHex, 
6720: 2a 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  *z;.  assert( ar
6730: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
6740: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
6750: 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c  );.  pBlob = sql
6760: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
6770: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20  argv[0]);.  n = 
6780: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6790: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
67a0: 61 73 73 65 72 74 28 20 70 42 6c 6f 62 3d 3d 73  assert( pBlob==s
67b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
67c0: 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f  b(argv[0]) );  /
67d0: 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68  * No encoding ch
67e0: 61 6e 67 65 20 2a 2f 0a 20 20 7a 20 3d 20 7a 48  ange */.  z = zH
67f0: 65 78 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c  ex = contextMall
6800: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36  oc(context, ((i6
6810: 34 29 6e 29 2a 32 20 2b 20 31 29 3b 0a 20 20 69  4)n)*2 + 1);.  i
6820: 66 28 20 7a 48 65 78 20 29 7b 0a 20 20 20 20 66  f( zHex ){.    f
6830: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
6840: 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a 20 20 20 20  , pBlob++){.    
6850: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6860: 63 20 3d 20 2a 70 42 6c 6f 62 3b 0a 20 20 20 20  c = *pBlob;.    
6870: 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69    *(z++) = hexdi
6880: 67 69 74 73 5b 28 63 3e 3e 34 29 26 30 78 66 5d  gits[(c>>4)&0xf]
6890: 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d  ;.      *(z++) =
68a0: 20 68 65 78 64 69 67 69 74 73 5b 63 26 30 78 66   hexdigits[c&0xf
68b0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 20  ];.    }.    *z 
68c0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
68d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
68e0: 74 65 78 74 2c 20 7a 48 65 78 2c 20 6e 2a 32 2c  text, zHex, n*2,
68f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
6900: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
6910: 20 7a 65 72 6f 62 6c 6f 62 28 4e 29 20 66 75 6e   zeroblob(N) fun
6920: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
6930: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 62 6c 6f 62  zero-filled blob
6940: 20 6f 66 20 73 69 7a 65 20 4e 20 62 79 74 65 73   of size N bytes
6950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6960: 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 28 0a 20   zeroblobFunc(. 
6970: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6980: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6990: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
69a0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
69b0: 0a 20 20 69 36 34 20 6e 3b 0a 20 20 73 71 6c 69  .  i64 n;.  sqli
69c0: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
69d0: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
69e0: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
69f0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
6a00: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
6a10: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e  METER(argc);.  n
6a20: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6a30: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
6a40: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
6a50: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
6a60: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
6a70: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
6a80: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
6a90: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
6aa0: 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 64  ]+1 );.  if( n>d
6ab0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
6ac0: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
6ad0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
6ae0: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
6af0: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  g(context);.  }e
6b00: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
6b10: 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62  _result_zeroblob
6b20: 28 63 6f 6e 74 65 78 74 2c 20 28 69 6e 74 29 6e  (context, (int)n
6b30: 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 30 32  ); /* IMP: R-002
6b40: 39 33 2d 36 34 39 39 34 20 2a 2f 0a 20 20 7d 0a  93-64994 */.  }.
6b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 70  }../*.** The rep
6b60: 6c 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lace() function.
6b70: 20 20 54 68 72 65 65 20 61 72 67 75 6d 65 6e 74    Three argument
6b80: 73 20 61 72 65 20 61 6c 6c 20 73 74 72 69 6e 67  s are all string
6b90: 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 6d 20  s: call.** them 
6ba0: 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20 54 68 65  A, B, and C. The
6bb0: 20 72 65 73 75 6c 74 20 69 73 20 61 6c 73 6f 20   result is also 
6bc0: 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69  a string which i
6bd0: 73 20 64 65 72 69 76 65 64 0a 2a 2a 20 66 72 6f  s derived.** fro
6be0: 6d 20 41 20 62 79 20 72 65 70 6c 61 63 69 6e 67  m A by replacing
6bf0: 20 65 76 65 72 79 20 6f 63 63 75 72 61 6e 63 65   every occurance
6c00: 20 6f 66 20 42 20 77 69 74 68 20 43 2e 20 20 54   of B with C.  T
6c10: 68 65 20 6d 61 74 63 68 0a 2a 2a 20 6d 75 73 74  he match.** must
6c20: 20 62 65 20 65 78 61 63 74 2e 20 20 43 6f 6c 6c   be exact.  Coll
6c30: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
6c40: 61 72 65 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2f  are not used..*/
6c50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 70  .static void rep
6c60: 6c 61 63 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  laceFunc(.  sqli
6c70: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6c80: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
6c90: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
6ca0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
6cb0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
6cc0: 72 20 2a 7a 53 74 72 3b 20 20 20 20 20 20 20 20  r *zStr;        
6cd0: 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 73 74 72  /* The input str
6ce0: 69 6e 67 20 41 20 2a 2f 0a 20 20 63 6f 6e 73 74  ing A */.  const
6cf0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6d00: 7a 50 61 74 74 65 72 6e 3b 20 20 20 20 2f 2a 20  zPattern;    /* 
6d10: 54 68 65 20 70 61 74 74 65 72 6e 20 73 74 72 69  The pattern stri
6d20: 6e 67 20 42 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ng B */.  const 
6d30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
6d40: 52 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Rep;        /* T
6d50: 68 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 73  he replacement s
6d60: 74 72 69 6e 67 20 43 20 2a 2f 0a 20 20 75 6e 73  tring C */.  uns
6d70: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74  igned char *zOut
6d80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6d90: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  * The output */.
6da0: 20 20 69 6e 74 20 6e 53 74 72 3b 20 20 20 20 20    int nStr;     
6db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
6dc0: 7a 65 20 6f 66 20 7a 53 74 72 20 2a 2f 0a 20 20  ze of zStr */.  
6dd0: 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20 20 20  int nPattern;   
6de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
6df0: 20 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a   of zPattern */.
6e00: 20 20 69 6e 74 20 6e 52 65 70 3b 20 20 20 20 20    int nRep;     
6e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
6e20: 7a 65 20 6f 66 20 7a 52 65 70 20 2a 2f 0a 20 20  ze of zRep */.  
6e30: 69 36 34 20 6e 4f 75 74 3b 20 20 20 20 20 20 20  i64 nOut;       
6e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
6e50: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 7a 4f 75 74  mum size of zOut
6e60: 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f 70 4c 69   */.  int loopLi
6e70: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  mit;           /
6e80: 2a 20 4c 61 73 74 20 7a 53 74 72 5b 5d 20 74 68  * Last zStr[] th
6e90: 61 74 20 6d 69 67 68 74 20 6d 61 74 63 68 20 7a  at might match z
6ea0: 50 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a 20 20 69  Pattern[] */.  i
6eb0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
6ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6ed0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a 20 20 61  counters */..  a
6ee0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29  ssert( argc==3 )
6ef0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
6f00: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 7a 53  ETER(argc);.  zS
6f10: 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  tr = sqlite3_val
6f20: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
6f30: 3b 0a 20 20 69 66 28 20 7a 53 74 72 3d 3d 30 20  ;.  if( zStr==0 
6f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 53 74 72  ) return;.  nStr
6f50: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6f60: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
6f70: 0a 20 20 61 73 73 65 72 74 28 20 7a 53 74 72 3d  .  assert( zStr=
6f80: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
6f90: 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  ext(argv[0]) ); 
6fa0: 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20   /* No encoding 
6fb0: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 50 61 74  change */.  zPat
6fc0: 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  tern = sqlite3_v
6fd0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
6fe0: 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65  ]);.  if( zPatte
6ff0: 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  rn==0 ){.    ass
7000: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  ert( sqlite3_val
7010: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29  ue_type(argv[1])
7020: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20  ==SQLITE_NULL.  
7030: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
7040: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
7050: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 2d  handle(context)-
7060: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
7070: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7080: 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 5b  .  if( zPattern[
7090: 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  0]==0 ){.    ass
70a0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  ert( sqlite3_val
70b0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29  ue_type(argv[1])
70c0: 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b  !=SQLITE_NULL );
70d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
70e0: 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78  ult_value(contex
70f0: 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t, argv[0]);.   
7100: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e   return;.  }.  n
7110: 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65  Pattern = sqlite
7120: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
7130: 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[1]);.  assert
7140: 28 20 7a 50 61 74 74 65 72 6e 3d 3d 73 71 6c 69  ( zPattern==sqli
7150: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
7160: 72 67 76 5b 31 5d 29 20 29 3b 20 20 2f 2a 20 4e  rgv[1]) );  /* N
7170: 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67  o encoding chang
7180: 65 20 2a 2f 0a 20 20 7a 52 65 70 20 3d 20 73 71  e */.  zRep = sq
7190: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
71a0: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (argv[2]);.  if(
71b0: 20 7a 52 65 70 3d 3d 30 20 29 20 72 65 74 75 72   zRep==0 ) retur
71c0: 6e 3b 0a 20 20 6e 52 65 70 20 3d 20 73 71 6c 69  n;.  nRep = sqli
71d0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
71e0: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 61 73 73 65  argv[2]);.  asse
71f0: 72 74 28 20 7a 52 65 70 3d 3d 73 71 6c 69 74 65  rt( zRep==sqlite
7200: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7210: 76 5b 32 5d 29 20 29 3b 0a 20 20 6e 4f 75 74 20  v[2]) );.  nOut 
7220: 3d 20 6e 53 74 72 20 2b 20 31 3b 0a 20 20 61 73  = nStr + 1;.  as
7230: 73 65 72 74 28 20 6e 4f 75 74 3c 53 51 4c 49 54  sert( nOut<SQLIT
7240: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a  E_MAX_LENGTH );.
7250: 20 20 7a 4f 75 74 20 3d 20 63 6f 6e 74 65 78 74    zOut = context
7260: 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20  Malloc(context, 
7270: 28 69 36 34 29 6e 4f 75 74 29 3b 0a 20 20 69 66  (i64)nOut);.  if
7280: 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  ( zOut==0 ){.   
7290: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c   return;.  }.  l
72a0: 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e 53 74 72 20  oopLimit = nStr 
72b0: 2d 20 6e 50 61 74 74 65 72 6e 3b 20 20 0a 20 20  - nPattern;  .  
72c0: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 3d 6c 6f  for(i=j=0; i<=lo
72d0: 6f 70 4c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20  opLimit; i++){. 
72e0: 20 20 20 69 66 28 20 7a 53 74 72 5b 69 5d 21 3d     if( zStr[i]!=
72f0: 7a 50 61 74 74 65 72 6e 5b 30 5d 20 7c 7c 20 6d  zPattern[0] || m
7300: 65 6d 63 6d 70 28 26 7a 53 74 72 5b 69 5d 2c 20  emcmp(&zStr[i], 
7310: 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61 74 74 65  zPattern, nPatte
7320: 72 6e 29 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75  rn) ){.      zOu
7330: 74 5b 6a 2b 2b 5d 20 3d 20 7a 53 74 72 5b 69 5d  t[j++] = zStr[i]
7340: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7350: 20 20 20 75 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20     u8 *zOld;.   
7360: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
7370: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7380: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
7390: 78 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20  xt);.      nOut 
73a0: 2b 3d 20 6e 52 65 70 20 2d 20 6e 50 61 74 74 65  += nRep - nPatte
73b0: 72 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  rn;.      testca
73c0: 73 65 28 20 6e 4f 75 74 2d 31 3d 3d 64 62 2d 3e  se( nOut-1==db->
73d0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
73e0: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20  MIT_LENGTH] );. 
73f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
7400: 4f 75 74 2d 32 3d 3d 64 62 2d 3e 61 4c 69 6d 69  Out-2==db->aLimi
7410: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
7420: 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20 20  ENGTH] );.      
7430: 69 66 28 20 6e 4f 75 74 2d 31 3e 64 62 2d 3e 61  if( nOut-1>db->a
7440: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
7450: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
7460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7470: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
7480: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  g(context);.    
7490: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
74a0: 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (zOut);.        
74b0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
74c0: 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 7a 4f 75        zOld = zOu
74d0: 74 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20  t;.      zOut = 
74e0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
74f0: 7a 4f 75 74 2c 20 28 69 6e 74 29 6e 4f 75 74 29  zOut, (int)nOut)
7500: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74  ;.      if( zOut
7510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
7520: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
7530: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
7540: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
7550: 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a  te3_free(zOld);.
7560: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
7570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
7580: 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a  mcpy(&zOut[j], z
7590: 52 65 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20  Rep, nRep);.    
75a0: 20 20 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20    j += nRep;.   
75b0: 20 20 20 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e     i += nPattern
75c0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
75d0: 61 73 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69  assert( j+nStr-i
75e0: 2b 31 3d 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65  +1==nOut );.  me
75f0: 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26  mcpy(&zOut[j], &
7600: 7a 53 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29  zStr[i], nStr-i)
7610: 3b 0a 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20  ;.  j += nStr - 
7620: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 3d  i;.  assert( j<=
7630: 6e 4f 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a  nOut );.  zOut[j
7640: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
7650: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
7660: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75  text, (char*)zOu
7670: 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  t, j, sqlite3_fr
7680: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  ee);.}../*.** Im
7690: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
76a0: 74 68 65 20 54 52 49 4d 28 29 2c 20 4c 54 52 49  the TRIM(), LTRI
76b0: 4d 28 29 2c 20 61 6e 64 20 52 54 52 49 4d 28 29  M(), and RTRIM()
76c0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54   functions..** T
76d0: 68 65 20 75 73 65 72 64 61 74 61 20 69 73 20 30  he userdata is 0
76e0: 78 31 20 66 6f 72 20 6c 65 66 74 20 74 72 69 6d  x1 for left trim
76f0: 2c 20 30 78 32 20 66 6f 72 20 72 69 67 68 74 20  , 0x2 for right 
7700: 74 72 69 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f  trim, 0x3 for bo
7710: 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  th..*/.static vo
7720: 69 64 20 74 72 69 6d 46 75 6e 63 28 0a 20 20 73  id trimFunc(.  s
7730: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7740: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
7750: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
7760: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
7770: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7780: 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20  char *zIn;      
7790: 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69     /* Input stri
77a0: 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e  ng */.  const un
77b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 43 68  signed char *zCh
77c0: 61 72 53 65 74 3b 20 20 20 20 2f 2a 20 53 65 74  arSet;    /* Set
77d0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74   of characters t
77e0: 6f 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20  o trim */.  int 
77f0: 6e 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  nIn;            
7800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7810: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7820: 20 69 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69   in input */.  i
7830: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 2f 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74 20   /* 1: trimleft 
7860: 20 32 3a 20 74 72 69 6d 72 69 67 68 74 20 20 33   2: trimright  3
7870: 3a 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20  : trim */.  int 
7880: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78a0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
78b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
78c0: 20 2a 61 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20   *aLen = 0;     
78d0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
78e0: 66 20 65 61 63 68 20 63 68 61 72 61 63 74 65 72  f each character
78f0: 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a   in zCharSet */.
7900: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7910: 2a 2a 61 7a 43 68 61 72 20 3d 20 30 3b 20 20 20  **azChar = 0;   
7920: 20 20 20 20 2f 2a 20 49 6e 64 69 76 69 64 75 61      /* Individua
7930: 6c 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  l characters in 
7940: 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e  zCharSet */.  in
7950: 74 20 6e 43 68 61 72 3b 20 20 20 20 20 20 20 20  t nChar;        
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
7980: 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72  racters in zChar
7990: 53 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71  Set */..  if( sq
79a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
79b0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
79c0: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_NULL ){.    re
79d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20  turn;.  }.  zIn 
79e0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
79f0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
7a00: 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65   if( zIn==0 ) re
7a10: 74 75 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71  turn;.  nIn = sq
7a20: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
7a30: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73  s(argv[0]);.  as
7a40: 73 65 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74  sert( zIn==sqlit
7a50: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7a60: 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  gv[0]) );.  if( 
7a70: 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73  argc==1 ){.    s
7a80: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
7a90: 67 6e 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65  gned char lenOne
7aa0: 5b 5d 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20  [] = { 1 };.    
7ab0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
7ac0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f  char * const azO
7ad0: 6e 65 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20  ne[] = { (u8*)" 
7ae0: 22 20 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d  " };.    nChar =
7af0: 20 31 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28   1;.    aLen = (
7b00: 75 38 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20  u8*)lenOne;.    
7b10: 61 7a 43 68 61 72 20 3d 20 28 75 6e 73 69 67 6e  azChar = (unsign
7b20: 65 64 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65  ed char **)azOne
7b30: 3b 0a 20 20 20 20 7a 43 68 61 72 53 65 74 20 3d  ;.    zCharSet =
7b40: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
7b50: 28 7a 43 68 61 72 53 65 74 20 3d 20 73 71 6c 69  (zCharSet = sqli
7b60: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
7b70: 72 67 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20  rgv[1]))==0 ){. 
7b80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
7b90: 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  se{.    const un
7ba0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
7bb0: 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53      for(z=zCharS
7bc0: 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b  et, nChar=0; *z;
7bd0: 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20   nChar++){.     
7be0: 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46   SQLITE_SKIP_UTF
7bf0: 38 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  8(z);.    }.    
7c00: 69 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20  if( nChar>0 ){. 
7c10: 20 20 20 20 20 61 7a 43 68 61 72 20 3d 20 63 6f       azChar = co
7c20: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
7c30: 65 78 74 2c 20 28 28 69 36 34 29 6e 43 68 61 72  ext, ((i64)nChar
7c40: 29 2a 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  )*(sizeof(char*)
7c50: 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +1));.      if( 
7c60: 61 7a 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20  azChar==0 ){.   
7c70: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7c80: 20 20 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20     }.      aLen 
7c90: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
7ca0: 2a 29 26 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d  *)&azChar[nChar]
7cb0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43  ;.      for(z=zC
7cc0: 68 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b  harSet, nChar=0;
7cd0: 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20   *z; nChar++){. 
7ce0: 20 20 20 20 20 20 20 61 7a 43 68 61 72 5b 6e 43         azChar[nC
7cf0: 68 61 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64  har] = (unsigned
7d00: 20 63 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20   char *)z;.     
7d10: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
7d20: 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  TF8(z);.        
7d30: 61 4c 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75  aLen[nChar] = (u
7d40: 38 29 28 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43  8)(z - azChar[nC
7d50: 68 61 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  har]);.      }. 
7d60: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
7d70: 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c  Char>0 ){.    fl
7d80: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  ags = SQLITE_PTR
7d90: 5f 54 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f  _TO_INT(sqlite3_
7da0: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
7db0: 74 29 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  t));.    if( fla
7dc0: 67 73 20 26 20 31 20 29 7b 0a 20 20 20 20 20 20  gs & 1 ){.      
7dd0: 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a  while( nIn>0 ){.
7de0: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
7df0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
7e00: 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69  (i=0; i<nChar; i
7e10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  ++){.          l
7e20: 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20  en = aLen[i];.  
7e30: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c          if( len<
7e40: 3d 6e 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a  =nIn && memcmp(z
7e50: 49 6e 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c  In, azChar[i], l
7e60: 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  en)==0 ) break;.
7e70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7e80: 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29    if( i>=nChar )
7e90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7ea0: 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20  zIn += len;.    
7eb0: 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a      nIn -= len;.
7ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7ed0: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 32 20    if( flags & 2 
7ee0: 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
7ef0: 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  nIn>0 ){.       
7f00: 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20   int len = 0;.  
7f10: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7f20: 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nChar; i++){.  
7f30: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c          len = aL
7f40: 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  en[i];.         
7f50: 20 69 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26   if( len<=nIn &&
7f60: 20 6d 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e   memcmp(&zIn[nIn
7f70: 2d 6c 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c  -len],azChar[i],
7f80: 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  len)==0 ) break;
7f90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7fa0: 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20     if( i>=nChar 
7fb0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
7fc0: 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20   nIn -= len;.   
7fd0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
7fe0: 66 28 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20  f( zCharSet ){. 
7ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8000: 65 28 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d  e(azChar);.    }
8010: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
8020: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
8030: 78 74 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20  xt, (char*)zIn, 
8040: 6e 49 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  nIn, SQLITE_TRAN
8050: 53 49 45 4e 54 29 3b 0a 7d 0a 0a 0a 2f 2a 20 49  SIENT);.}.../* I
8060: 4d 50 3a 20 52 2d 32 35 33 36 31 2d 31 36 31 35  MP: R-25361-1615
8070: 30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  0 This function 
8080: 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
8090: 53 51 4c 69 74 65 20 62 79 20 64 65 66 61 75 6c  SQLite by defaul
80a0: 74 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79  t. It.** is only
80b0: 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 74 68   available if th
80c0: 65 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58  e SQLITE_SOUNDEX
80d0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
80e0: 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 2a 2a 20  tion is used.** 
80f0: 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 62  when SQLite is b
8100: 75 69 6c 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  uilt..*/.#ifdef 
8110: 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 2f  SQLITE_SOUNDEX./
8120: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
8130: 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e   soundex encodin
8140: 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2a 0a  g of a word..**.
8150: 2a 2a 20 49 4d 50 3a 20 52 2d 35 39 37 38 32 2d  ** IMP: R-59782-
8160: 30 30 30 37 32 20 54 68 65 20 73 6f 75 6e 64 65  00072 The sounde
8170: 78 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  x(X) function re
8180: 74 75 72 6e 73 20 61 20 73 74 72 69 6e 67 20 74  turns a string t
8190: 68 61 74 20 69 73 20 74 68 65 0a 2a 2a 20 73 6f  hat is the.** so
81a0: 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f  undex encoding o
81b0: 66 20 74 68 65 20 73 74 72 69 6e 67 20 58 2e 20  f the string X. 
81c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
81d0: 73 6f 75 6e 64 65 78 46 75 6e 63 28 0a 20 20 73  soundexFunc(.  s
81e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
81f0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
8200: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
8210: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
8220: 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 38 5d   char zResult[8]
8230: 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49  ;.  const u8 *zI
8240: 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  n;.  int i, j;. 
8250: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
8260: 73 69 67 6e 65 64 20 63 68 61 72 20 69 43 6f 64  signed char iCod
8270: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30  e[] = {.    0, 0
8280: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8290: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
82a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
82b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
82c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
82d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
82e0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
82f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8300: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8310: 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,.    0, 0, 0,
8320: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8330: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8340: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30  , 0, 0,.    0, 0
8350: 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c  , 1, 2, 3, 0, 1,
8360: 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20   2, 0, 0, 2, 2, 
8370: 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20  4, 5, 5, 0,.    
8380: 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30  1, 2, 6, 2, 3, 0
8390: 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c  , 1, 0, 2, 0, 2,
83a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
83b0: 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20      0, 0, 1, 2, 
83c0: 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30  3, 0, 1, 2, 0, 0
83d0: 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c  , 2, 2, 4, 5, 5,
83e0: 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c   0,.    1, 2, 6,
83f0: 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20   2, 3, 0, 1, 0, 
8400: 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30  2, 0, 2, 0, 0, 0
8410: 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 61  , 0, 0,.  };.  a
8420: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
8430: 3b 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29 73  ;.  zIn = (u8*)s
8440: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8450: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
8460: 28 20 7a 49 6e 3d 3d 30 20 29 20 7a 49 6e 20 3d  ( zIn==0 ) zIn =
8470: 20 28 75 38 2a 29 22 22 3b 0a 20 20 66 6f 72 28   (u8*)"";.  for(
8480: 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26 20 21  i=0; zIn[i] && !
8490: 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
84a0: 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  In[i]); i++){}. 
84b0: 20 69 66 28 20 7a 49 6e 5b 69 5d 20 29 7b 0a 20   if( zIn[i] ){. 
84c0: 20 20 20 75 38 20 70 72 65 76 63 6f 64 65 20 3d     u8 prevcode =
84d0: 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78   iCode[zIn[i]&0x
84e0: 37 66 5d 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  7f];.    zResult
84f0: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 75  [0] = sqlite3Tou
8500: 70 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20  pper(zIn[i]);.  
8510: 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20 26    for(j=1; j<4 &
8520: 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  & zIn[i]; i++){.
8530: 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d        int code =
8540: 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78   iCode[zIn[i]&0x
8550: 37 66 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63  7f];.      if( c
8560: 6f 64 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ode>0 ){.       
8570: 20 69 66 28 20 63 6f 64 65 21 3d 70 72 65 76 63   if( code!=prevc
8580: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
8590: 20 70 72 65 76 63 6f 64 65 20 3d 20 63 6f 64 65   prevcode = code
85a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 73  ;.          zRes
85b0: 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20  ult[j++] = code 
85c0: 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 7d  + '0';.        }
85d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
85e0: 20 20 20 20 20 20 70 72 65 76 63 6f 64 65 20 3d        prevcode =
85f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8600: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 34  }.    while( j<4
8610: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c   ){.      zResul
8620: 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20  t[j++] = '0';.  
8630: 20 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b    }.    zResult[
8640: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
8650: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
8660: 63 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c 74  context, zResult
8670: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , 4, SQLITE_TRAN
8680: 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b  SIENT);.  }else{
8690: 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36  .    /* IMP: R-6
86a0: 34 38 39 34 2d 35 30 33 32 31 20 54 68 65 20 73  4894-50321 The s
86b0: 74 72 69 6e 67 20 22 3f 30 30 30 22 20 69 73 20  tring "?000" is 
86c0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
86d0: 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  argument.    ** 
86e0: 69 73 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 74 61  is NULL or conta
86f0: 69 6e 73 20 6e 6f 20 41 53 43 49 49 20 61 6c 70  ins no ASCII alp
8700: 68 61 62 65 74 69 63 20 63 68 61 72 61 63 74 65  habetic characte
8710: 72 73 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  rs. */.    sqlit
8720: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
8730: 6f 6e 74 65 78 74 2c 20 22 3f 30 30 30 22 2c 20  ontext, "?000", 
8740: 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  4, SQLITE_STATIC
8750: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
8760: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45  /* SQLITE_SOUNDE
8770: 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  X */..#ifndef SQ
8780: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
8790: 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41  XTENSION./*.** A
87a0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c   function that l
87b0: 6f 61 64 73 20 61 20 73 68 61 72 65 64 2d 6c 69  oads a shared-li
87c0: 62 72 61 72 79 20 65 78 74 65 6e 73 69 6f 6e 20  brary extension 
87d0: 74 68 65 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c  then returns NUL
87e0: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  L..*/.static voi
87f0: 64 20 6c 6f 61 64 45 78 74 28 73 71 6c 69 74 65  d loadExt(sqlite
8800: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
8810: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
8820: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
8830: 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  gv){.  const cha
8840: 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63 6f 6e 73  r *zFile = (cons
8850: 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
8860: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8870: 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  [0]);.  const ch
8880: 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20 73 71 6c  ar *zProc;.  sql
8890: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
88a0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
88b0: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
88c0: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
88d0: 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d   0;..  if( argc=
88e0: 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20  =2 ){.    zProc 
88f0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
8900: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8910: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d  xt(argv[1]);.  }
8920: 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 63 20  else{.    zProc 
8930: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 0;.  }.  if( z
8940: 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33 5f  File && sqlite3_
8950: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
8960: 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
8970: 20 26 7a 45 72 72 4d 73 67 29 20 29 7b 0a 20 20   &zErrMsg) ){.  
8980: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8990: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
89a0: 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20 20  zErrMsg, -1);.  
89b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
89c0: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23  ErrMsg);.  }.}.#
89d0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  endif.../*.** An
89e0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
89f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
8a00: 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20 63  ture holds the c
8a10: 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20 73  ontext of a.** s
8a20: 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61 67  um() or avg() ag
8a30: 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61 74  gregate computat
8a40: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
8a50: 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53 75  struct SumCtx Su
8a60: 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75 6d  mCtx;.struct Sum
8a70: 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Ctx {.  double r
8a80: 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46 6c 6f  Sum;      /* Flo
8a90: 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75 6d 20  ating point sum 
8aa0: 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b 20 20  */.  i64 iSum;  
8ab0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
8ac0: 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20 69 36  r sum */   .  i6
8ad0: 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  4 cnt;          
8ae0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
8af0: 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f 0a  ments summed */.
8b00: 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b 20 20    u8 overflow;  
8b10: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
8b20: 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
8b30: 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61 70 70  seen */.  u8 app
8b40: 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  rox;        /* T
8b50: 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74 65 67  rue if non-integ
8b60: 65 72 20 76 61 6c 75 65 20 77 61 73 20 69 6e 70  er value was inp
8b70: 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20 2a 2f  ut to the sum */
8b80: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
8b90: 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  nes used to comp
8ba0: 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61 76 65  ute the sum, ave
8bb0: 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61 6c 2e  rage, and total.
8bc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d 28 29  .**.** The SUM()
8bd0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f 77   function follow
8be0: 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29 20 53  s the (broken) S
8bf0: 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68 69 63  QL standard whic
8c00: 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  h means.** that 
8c10: 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  it returns NULL 
8c20: 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65 72 20  if it sums over 
8c30: 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f 54 41  no inputs.  TOTA
8c40: 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 2e 30  L returns.** 0.0
8c50: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 20   in that case.  
8c60: 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54 4f 54  In addition, TOT
8c70: 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  AL always return
8c80: 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72 65 0a  s a float where.
8c90: 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72 65 74  ** SUM might ret
8ca0: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 69  urn an integer i
8cb0: 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63 6f 75  f it never encou
8cc0: 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69 6e 67  nters a floating
8cd0: 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 2e   point.** value.
8ce0: 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20 66 61    TOTAL never fa
8cf0: 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d 69 67  ils, but SUM mig
8d00: 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20 65 78  ht through an ex
8d10: 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20 69 74  ception if.** it
8d20: 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20 69 6e   overflows an in
8d30: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
8d40: 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73 71   void sumStep(sq
8d50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
8d60: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
8d70: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
8d80: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43 74  **argv){.  SumCt
8d90: 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70 65  x *p;.  int type
8da0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
8db0: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
8dc0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
8dd0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
8de0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
8df0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
8e00: 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  (*p));.  type = 
8e10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75  sqlite3_value_nu
8e20: 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76 5b  meric_type(argv[
8e30: 30 5d 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0]);.  if( p && 
8e40: 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  type!=SQLITE_NUL
8e50: 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e 74 2b  L ){.    p->cnt+
8e60: 2b 3b 0a 20 20 20 20 69 66 28 20 74 79 70 65 3d  +;.    if( type=
8e70: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
8e80: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 20 3d  ){.      i64 v =
8e90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
8ea0: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
8eb0: 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20       p->rSum += 
8ec0: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d  v;.      if( (p-
8ed0: 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76 65 72 66  >approx|p->overf
8ee0: 6c 6f 77 29 3d 3d 30 20 26 26 20 73 71 6c 69 74  low)==0 && sqlit
8ef0: 65 33 41 64 64 49 6e 74 36 34 28 26 70 2d 3e 69  e3AddInt64(&p->i
8f00: 53 75 6d 2c 20 76 29 20 29 7b 0a 20 20 20 20 20  Sum, v) ){.     
8f10: 20 20 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 3d     p->overflow =
8f20: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
8f30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
8f40: 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  rSum += sqlite3_
8f50: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
8f60: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  v[0]);.      p->
8f70: 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20 20  approx = 1;.    
8f80: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
8f90: 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65 28  oid sumFinalize(
8fa0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8fb0: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d  *context){.  Sum
8fc0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
8fd0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
8fe0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
8ff0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
9000: 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20  p->cnt>0 ){.    
9010: 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20  if( p->overflow 
9020: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9030: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
9040: 6e 74 65 78 74 2c 22 69 6e 74 65 67 65 72 20 6f  ntext,"integer o
9050: 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20 20  verflow",-1);.  
9060: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 61    }else if( p->a
9070: 70 70 72 6f 78 20 29 7b 0a 20 20 20 20 20 20 73  pprox ){.      s
9080: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
9090: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d  uble(context, p-
90a0: 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  >rSum);.    }els
90b0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
90c0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
90d0: 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29 3b  ntext, p->iSum);
90e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
90f0: 74 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e 61  tic void avgFina
9100: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
9110: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
9120: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
9130: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
9140: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
9150: 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  text, 0);.  if( 
9160: 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b  p && p->cnt>0 ){
9170: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9180: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
9190: 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f 75  xt, p->rSum/(dou
91a0: 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d  ble)p->cnt);.  }
91b0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
91c0: 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71 6c  otalFinalize(sql
91d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
91e0: 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78  ntext){.  SumCtx
91f0: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
9200: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
9210: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
9220: 3b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30  ;.  /* (double)0
9230: 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
9240: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
9250: 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 73  _POINT... */.  s
9260: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
9270: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 20  uble(context, p 
9280: 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 28 64 6f 75  ? p->rSum : (dou
9290: 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ble)0);.}../*.**
92a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
92b0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
92c0: 72 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69 6e  rack of state in
92d0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
92e0: 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67 67  e.** count() agg
92f0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
9300: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
9310: 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e  ct CountCtx Coun
9320: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75  tCtx;.struct Cou
9330: 6e 74 43 74 78 20 7b 0a 20 20 69 36 34 20 6e 3b  ntCtx {.  i64 n;
9340: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
9350: 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  nes to implement
9360: 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67 67   the count() agg
9370: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
9380: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9390: 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65  countStep(sqlite
93a0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
93b0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
93c0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
93d0: 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  gv){.  CountCtx 
93e0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
93f0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
9400: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
9410: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
9420: 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49  (argc==0 || SQLI
9430: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
9440: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
9450: 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20 20  [0])) && p ){.  
9460: 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 0a 23    p->n++;.  }..#
9470: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9480: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
9490: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 61  /* The sqlite3_a
94a0: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29  ggregate_count()
94b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 70   function is dep
94c0: 72 65 63 61 74 65 64 2e 20 20 42 75 74 20 6a 75  recated.  But ju
94d0: 73 74 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  st to make.  ** 
94e0: 73 75 72 65 20 69 74 20 73 74 69 6c 6c 20 6f 70  sure it still op
94f0: 65 72 61 74 65 73 20 63 6f 72 72 65 63 74 6c 79  erates correctly
9500: 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 69 74  , verify that it
9510: 73 20 63 6f 75 6e 74 20 61 67 72 65 65 73 20 77  s count agrees w
9520: 69 74 68 20 6f 75 72 20 0a 20 20 2a 2a 20 69 6e  ith our .  ** in
9530: 74 65 72 6e 61 6c 20 63 6f 75 6e 74 20 77 68 65  ternal count whe
9540: 6e 20 75 73 69 6e 67 20 63 6f 75 6e 74 28 2a 29  n using count(*)
9550: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 74 6f   and when the to
9560: 74 61 6c 20 63 6f 75 6e 74 20 63 61 6e 20 62 65  tal count can be
9570: 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 65 64 20  .  ** expressed 
9580: 61 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  as a 32-bit inte
9590: 67 65 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ger. */.  assert
95a0: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 70 3d 3d  ( argc==1 || p==
95b0: 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78 37 66 66 66  0 || p->n>0x7fff
95c0: 66 66 66 66 0a 20 20 20 20 20 20 20 20 20 20 7c  ffff.          |
95d0: 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69 74 65 33 5f  | p->n==sqlite3_
95e0: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
95f0: 63 6f 6e 74 65 78 74 29 20 29 3b 0a 23 65 6e 64  context) );.#end
9600: 69 66 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76  if.}   .static v
9610: 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a  oid countFinaliz
9620: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
9630: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43  t *context){.  C
9640: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
9650: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
9660: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
9670: 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ext, 0);.  sqlit
9680: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
9690: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
96a0: 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n : 0);.}../*.**
96b0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70   Routines to imp
96c0: 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64  lement min() and
96d0: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
96e0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
96f0: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61  tatic void minma
9700: 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  xStep(.  sqlite3
9710: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
9720: 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  t, .  int NotUse
9730: 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  d, .  sqlite3_va
9740: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
9750: 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d 65  Mem *pArg  = (Me
9760: 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20 4d  m *)argv[0];.  M
9770: 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20 55 4e 55  em *pBest;.  UNU
9780: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
9790: 74 55 73 65 64 29 3b 0a 0a 20 20 69 66 28 20 73  tUsed);..  if( s
97a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
97b0: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
97c0: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
97d0: 3b 0a 20 20 70 42 65 73 74 20 3d 20 28 4d 65 6d  ;.  pBest = (Mem
97e0: 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65   *)sqlite3_aggre
97f0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
9800: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42  text, sizeof(*pB
9810: 65 73 74 29 29 3b 0a 20 20 69 66 28 20 21 70 42  est));.  if( !pB
9820: 65 73 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  est ) return;.. 
9830: 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67   if( pBest->flag
9840: 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78  s ){.    int max
9850: 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20  ;.    int cmp;. 
9860: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
9870: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75  l = sqlite3GetFu
9880: 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78  ncCollSeq(contex
9890: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  t);.    /* This 
98a0: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73  step function is
98b0: 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
98c0: 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  he min() and max
98d0: 28 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20  () aggregates,. 
98e0: 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64     ** the only d
98f0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
9900: 6e 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20  n the two being 
9910: 74 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f  that the sense o
9920: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  f the.    ** com
9930: 70 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72  parison is inver
9940: 74 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78  ted. For the max
9950: 28 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  () aggregate, th
9960: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
9970: 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e  _user_data() fun
9980: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76  ction returns (v
9990: 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69  oid *)-1. For mi
99a0: 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65  n() it.    ** re
99b0: 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62  turns (void *)db
99c0: 2c 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68  , where db is th
99d0: 65 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62  e sqlite3* datab
99e0: 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20  ase pointer..   
99f0: 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68   ** Therefore th
9a00: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
9a10: 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27   sets variable '
9a20: 6d 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68  max' to 1 for th
9a30: 65 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61  e max().    ** a
9a40: 67 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66  ggregate, or 0 f
9a50: 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  or min()..    */
9a60: 0a 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74  .    max = sqlit
9a70: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
9a80: 74 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d  text)!=0;.    cm
9a90: 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  p = sqlite3MemCo
9aa0: 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70 41 72  mpare(pBest, pAr
9ab0: 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  g, pColl);.    i
9ac0: 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30  f( (max && cmp<0
9ad0: 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d  ) || (!max && cm
9ae0: 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  p>0) ){.      sq
9af0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
9b00: 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20  (pBest, pArg);. 
9b10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
9b20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
9b30: 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72 67  Copy(pBest, pArg
9b40: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9b50: 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c  void minMaxFinal
9b60: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
9b70: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
9b80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9b90: 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d 20 28  pRes;.  pRes = (
9ba0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 29  sqlite3_value *)
9bb0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
9bc0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
9bd0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 52 65  t, 0);.  if( pRe
9be0: 73 20 29 7b 0a 20 20 20 20 69 66 28 20 41 4c 57  s ){.    if( ALW
9bf0: 41 59 53 28 70 52 65 73 2d 3e 66 6c 61 67 73 29  AYS(pRes->flags)
9c00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9c10: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
9c20: 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b 0a 20  ontext, pRes);. 
9c30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9c40: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
9c50: 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Res);.  }.}../*.
9c60: 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  ** group_concat(
9c70: 45 58 50 52 2c 20 3f 53 45 50 41 52 41 54 4f 52  EXPR, ?SEPARATOR
9c80: 3f 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ?).*/.static voi
9c90: 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65  d groupConcatSte
9ca0: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
9cb0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
9cc0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
9cd0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
9ce0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
9cf0: 72 20 2a 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63  r *zVal;.  StrAc
9d00: 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63  cum *pAccum;.  c
9d10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
9d20: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65  .  int nVal, nSe
9d30: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  p;.  assert( arg
9d40: 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20  c==1 || argc==2 
9d50: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
9d60: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
9d70: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
9d80: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 41  L ) return;.  pA
9d90: 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63 75 6d  ccum = (StrAccum
9da0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
9db0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
9dc0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63  ext, sizeof(*pAc
9dd0: 63 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20 70 41  cum));..  if( pA
9de0: 63 63 75 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  ccum ){.    sqli
9df0: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
9e00: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
9e10: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
9e20: 20 20 69 6e 74 20 66 69 72 73 74 54 65 72 6d 20    int firstTerm 
9e30: 3d 20 70 41 63 63 75 6d 2d 3e 75 73 65 4d 61 6c  = pAccum->useMal
9e40: 6c 6f 63 3d 3d 30 3b 0a 20 20 20 20 70 41 63 63  loc==0;.    pAcc
9e50: 75 6d 2d 3e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20  um->useMalloc = 
9e60: 32 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 6d  2;.    pAccum->m
9e70: 78 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c 69  xAlloc = db->aLi
9e80: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
9e90: 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 69 66  _LENGTH];.    if
9ea0: 28 20 21 66 69 72 73 74 54 65 72 6d 20 29 7b 0a  ( !firstTerm ){.
9eb0: 20 20 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d        if( argc==
9ec0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  2 ){.        zSe
9ed0: 70 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  p = (char*)sqlit
9ee0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
9ef0: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  gv[1]);.        
9f00: 6e 53 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76  nSep = sqlite3_v
9f10: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
9f20: 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1]);.      }else
9f30: 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  {.        zSep =
9f40: 20 22 2c 22 3b 0a 20 20 20 20 20 20 20 20 6e 53   ",";.        nS
9f50: 65 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ep = 1;.      }.
9f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
9f70: 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63  AccumAppend(pAcc
9f80: 75 6d 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b  um, zSep, nSep);
9f90: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20  .    }.    zVal 
9fa0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
9fb0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9fc0: 5b 30 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d  [0]);.    nVal =
9fd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
9fe0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
9ff0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
a000: 75 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c  umAppend(pAccum,
a010: 20 7a 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20   zVal, nVal);.  
a020: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
a030: 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c  groupConcatFinal
a040: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
a050: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
a060: 20 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75   StrAccum *pAccu
a070: 6d 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20 73 71  m;.  pAccum = sq
a080: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
a090: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
a0a0: 20 30 29 3b 0a 20 20 69 66 28 20 70 41 63 63 75   0);.  if( pAccu
a0b0: 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 63  m ){.    if( pAc
a0c0: 63 75 6d 2d 3e 74 6f 6f 42 69 67 20 29 7b 0a 20  cum->tooBig ){. 
a0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
a0e0: 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67  ult_error_toobig
a0f0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  (context);.    }
a100: 65 6c 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d  else if( pAccum-
a110: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a120: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
a130: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
a140: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
a150: 7d 65 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20  }else{    .     
a160: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a170: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  text(context, sq
a180: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
a190: 69 73 68 28 70 41 63 63 75 6d 29 2c 20 2d 31 2c  ish(pAccum), -1,
a1a0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a1c0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d  te3_free);.    }
a1d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
a1e0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
a1f0: 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  per-connection f
a200: 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 72 61  unction registra
a210: 74 69 6f 6e 2e 20 20 4d 6f 73 74 0a 2a 2a 20 6f  tion.  Most.** o
a220: 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66  f the built-in f
a230: 75 6e 63 74 69 6f 6e 73 20 61 62 6f 76 65 20 61  unctions above a
a240: 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 67  re part of the g
a250: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73  lobal function s
a260: 65 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  et..** This rout
a270: 69 6e 65 20 6f 6e 6c 79 20 64 65 61 6c 73 20 77  ine only deals w
a280: 69 74 68 20 74 68 6f 73 65 20 74 68 61 74 20 61  ith those that a
a290: 72 65 20 6e 6f 74 20 67 6c 6f 62 61 6c 2e 0a 2a  re not global..*
a2a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
a2b0: 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
a2c0: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
a2d0: 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  db){.  int rc = 
a2e0: 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64  sqlite3_overload
a2f0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 4d  _function(db, "M
a300: 41 54 43 48 22 2c 20 32 29 3b 0a 20 20 61 73 73  ATCH", 2);.  ass
a310: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
a320: 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c  NOMEM || rc==SQL
a330: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
a340: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
a350: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
a360: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
a370: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
a380: 68 65 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67 20  he LIKEOPT flag 
a390: 6f 6e 20 74 68 65 20 32 2d 61 72 67 75 6d 65 6e  on the 2-argumen
a3a0: 74 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  t function with 
a3b0: 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a  the given name..
a3c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
a3d0: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73 71  etLikeOptFlag(sq
a3e0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
a3f0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 75 38   char *zName, u8
a400: 20 66 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75 6e   flagVal){.  Fun
a410: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 70 44  cDef *pDef;.  pD
a420: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
a430: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
a440: 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  me, sqlite3Strle
a450: 6e 33 30 28 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  n30(zName),.    
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a470: 20 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49           2, SQLI
a480: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69  TE_UTF8, 0);.  i
a490: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
a4a0: 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 6c 61  ){.    pDef->fla
a4b0: 67 73 20 3d 20 66 6c 61 67 56 61 6c 3b 0a 20 20  gs = flagVal;.  
a4c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  }.}../*.** Regis
a4d0: 74 65 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  ter the built-in
a4e0: 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66   LIKE and GLOB f
a4f0: 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 63  unctions.  The c
a500: 61 73 65 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20  aseSensitive.** 
a510: 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
a520: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
a530: 6e 6f 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  not the LIKE ope
a540: 72 61 74 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a  rator is case.**
a550: 20 73 65 6e 73 69 74 69 76 65 2e 20 20 47 4c 4f   sensitive.  GLO
a560: 42 20 69 73 20 61 6c 77 61 79 73 20 63 61 73 65  B is always case
a570: 20 73 65 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76   sensitive..*/.v
a580: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73  oid sqlite3Regis
a590: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
a5a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
a5b0: 74 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 29  t caseSensitive)
a5c0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61  {.  struct compa
a5d0: 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  reInfo *pInfo;. 
a5e0: 20 69 66 28 20 63 61 73 65 53 65 6e 73 69 74 69   if( caseSensiti
a5f0: 76 65 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20  ve ){.    pInfo 
a600: 3d 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72  = (struct compar
a610: 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f  eInfo*)&likeInfo
a620: 41 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Alt;.  }else{.  
a630: 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63    pInfo = (struc
a640: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26  t compareInfo*)&
a650: 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20  likeInfoNorm;.  
a660: 7d 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74  }.  sqlite3Creat
a670: 65 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22  eFunc(db, "like"
a680: 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
a690: 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e  , pInfo, likeFun
a6a0: 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  c, 0, 0, 0);.  s
a6b0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
a6c0: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 33 2c 20  (db, "like", 3, 
a6d0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e  SQLITE_UTF8, pIn
a6e0: 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c  fo, likeFunc, 0,
a6f0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
a700: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
a710: 22 67 6c 6f 62 22 2c 20 32 2c 20 53 51 4c 49 54  "glob", 2, SQLIT
a720: 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28  E_UTF8, .      (
a730: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
a740: 66 6f 2a 29 26 67 6c 6f 62 49 6e 66 6f 2c 20 6c  fo*)&globInfo, l
a750: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30  ikeFunc, 0, 0, 0
a760: 29 3b 0a 20 20 73 65 74 4c 69 6b 65 4f 70 74 46  );.  setLikeOptF
a770: 6c 61 67 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20  lag(db, "glob", 
a780: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
a790: 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   | SQLITE_FUNC_C
a7a0: 41 53 45 29 3b 0a 20 20 73 65 74 4c 69 6b 65 4f  ASE);.  setLikeO
a7b0: 70 74 46 6c 61 67 28 64 62 2c 20 22 6c 69 6b 65  ptFlag(db, "like
a7c0: 22 2c 20 0a 20 20 20 20 20 20 63 61 73 65 53 65  ", .      caseSe
a7d0: 6e 73 69 74 69 76 65 20 3f 20 28 53 51 4c 49 54  nsitive ? (SQLIT
a7e0: 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51  E_FUNC_LIKE | SQ
a7f0: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 20  LITE_FUNC_CASE) 
a800: 3a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  : SQLITE_FUNC_LI
a810: 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  KE);.}../*.** pE
a820: 78 70 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  xpr points to an
a830: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63   expression whic
a840: 68 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 66  h implements a f
a850: 75 6e 63 74 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20  unction.  If.** 
a860: 69 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  it is appropriat
a870: 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 4c  e to apply the L
a880: 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
a890: 20 74 6f 20 74 68 61 74 20 66 75 6e 63 74 69 6f   to that functio
a8a0: 6e 0a 2a 2a 20 74 68 65 6e 20 73 65 74 20 61 57  n.** then set aW
a8b0: 63 5b 30 5d 20 74 68 72 6f 75 67 68 20 61 57 63  c[0] through aWc
a8c0: 5b 32 5d 20 74 6f 20 74 68 65 20 77 69 6c 64 63  [2] to the wildc
a8d0: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 61  ard characters a
a8e0: 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 54 52 55  nd.** return TRU
a8f0: 45 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74  E.  If the funct
a900: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 4c 49 4b  ion is not a LIK
a910: 45 2d 73 74 79 6c 65 20 66 75 6e 63 74 69 6f 6e  E-style function
a920: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
a930: 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  FALSE..*/.int sq
a940: 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74  lite3IsLikeFunct
a950: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
a960: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
a970: 74 20 2a 70 49 73 4e 6f 63 61 73 65 2c 20 63 68  t *pIsNocase, ch
a980: 61 72 20 2a 61 57 63 29 7b 0a 20 20 46 75 6e 63  ar *aWc){.  Func
a990: 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 69 66 28  Def *pDef;.  if(
a9a0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46   pExpr->op!=TK_F
a9b0: 55 4e 43 54 49 4f 4e 20 0a 20 20 20 7c 7c 20 21  UNCTION .   || !
a9c0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 0a  pExpr->x.pList .
a9d0: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 78 2e 70     || pExpr->x.p
a9e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 0a 20  List->nExpr!=2. 
a9f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
aa00: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
aa10: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
aa20: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
aa30: 6c 65 63 74 29 20 29 3b 0a 20 20 70 44 65 66 20  lect) );.  pDef 
aa40: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
aa50: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2d  ction(db, pExpr-
aa60: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20  >u.zToken, .    
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
aa90: 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
aaa0: 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20  u.zToken),.     
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54          2, SQLIT
aad0: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66  E_UTF8, 0);.  if
aae0: 28 20 4e 45 56 45 52 28 70 44 65 66 3d 3d 30 29  ( NEVER(pDef==0)
aaf0: 20 7c 7c 20 28 70 44 65 66 2d 3e 66 6c 61 67 73   || (pDef->flags
ab00: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c   & SQLITE_FUNC_L
ab10: 49 4b 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  IKE)==0 ){.    r
ab20: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
ab30: 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20  /* The memcpy() 
ab40: 73 74 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65  statement assume
ab50: 73 20 74 68 61 74 20 74 68 65 20 77 69 6c 64 63  s that the wildc
ab60: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 61  ard characters a
ab70: 72 65 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  re.  ** the firs
ab80: 74 20 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e  t three statemen
ab90: 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72  ts in the compar
aba0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  eInfo structure.
abb0: 20 20 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72    The.  ** asser
abc0: 74 73 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ts() that follow
abd0: 20 76 65 72 69 66 79 20 74 68 61 74 20 61 73 73   verify that ass
abe0: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d  umption.  */.  m
abf0: 65 6d 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d  emcpy(aWc, pDef-
ac00: 3e 70 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a  >pUserData, 3);.
ac10: 20 20 61 73 73 65 72 74 28 20 28 63 68 61 72 2a    assert( (char*
ac20: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d  )&likeInfoAlt ==
ac30: 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66   (char*)&likeInf
ac40: 6f 41 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b  oAlt.matchAll );
ac50: 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68  .  assert( &((ch
ac60: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
ac70: 29 5b 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26  )[1] == (char*)&
ac80: 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63  likeInfoAlt.matc
ac90: 68 4f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  hOne );.  assert
aca0: 28 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65  ( &((char*)&like
acb0: 49 6e 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28  InfoAlt)[2] == (
acc0: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
acd0: 6c 74 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20  lt.matchSet );. 
ace0: 20 2a 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70   *pIsNocase = (p
acf0: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
ad00: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d  ITE_FUNC_CASE)==
ad10: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
ad20: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 61 6c 6c 20  ../*.** All all 
ad30: 6f 66 20 74 68 65 20 46 75 6e 63 44 65 66 20 73  of the FuncDef s
ad40: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
ad50: 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20   aBuiltinFunc[] 
ad60: 61 72 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74  array above.** t
ad70: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  o the global fun
ad80: 63 74 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65  ction hash table
ad90: 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 20 61  .  This occurs a
ada0: 74 20 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73  t start-time (as
adb0: 0a 2a 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63  .** a consequenc
adc0: 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c  e of calling sql
add0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
ade0: 29 29 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ))..**.** After 
adf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
ae00: 73 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  s.*/.void sqlite
ae10: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
ae20: 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a  unctions(void){.
ae30: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    /*.  ** The fo
ae40: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f  llowing array ho
ae50: 6c 64 73 20 46 75 6e 63 44 65 66 20 73 74 72 75  lds FuncDef stru
ae60: 63 74 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f  ctures for all o
ae70: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a  f the functions.
ae80: 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20    ** defined in 
ae90: 74 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a  this file..  **.
aea0: 20 20 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63    ** The array c
aeb0: 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e  annot be constan
aec0: 74 20 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20  t since changes 
aed0: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a  are made to the.
aee0: 20 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61    ** FuncDef.pHa
aef0: 73 68 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73  sh elements at s
af00: 74 61 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20  tart-time.  The 
af10: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73  elements of this
af20: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20   array.  ** are 
af30: 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
af40: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69  initialization i
af50: 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2f  s complete..  */
af60: 0a 20 20 73 74 61 74 69 63 20 53 51 4c 49 54 45  .  static SQLITE
af70: 5f 57 53 44 20 46 75 6e 63 44 65 66 20 61 42 75  _WSD FuncDef aBu
af80: 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a  iltinFunc[] = {.
af90: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72      FUNCTION(ltr
afa0: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
afb0: 20 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75   1, 1, 0, trimFu
afc0: 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  nc         ),.  
afd0: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d    FUNCTION(ltrim
afe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ,              2
aff0: 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 1, 0, trimFunc
b000: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
b010: 46 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20  FUNCTION(rtrim, 
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
b030: 32 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  2, 0, trimFunc  
b040: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
b050: 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20  NCTION(rtrim,   
b060: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 32 2c             2, 2,
b070: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
b080: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
b090: 54 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20  TION(trim,      
b0a0: 20 20 20 20 20 20 20 20 20 31 2c 20 33 2c 20 30           1, 3, 0
b0b0: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
b0c0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
b0d0: 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20  ON(trim,        
b0e0: 20 20 20 20 20 20 20 32 2c 20 33 2c 20 30 2c 20         2, 3, 0, 
b0f0: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
b100: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
b110: 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  (min,           
b120: 20 20 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69      -1, 0, 1, mi
b130: 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20 29  nmaxFunc       )
b140: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d  ,.    FUNCTION(m
b150: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
b160: 20 20 20 30 2c 20 30 2c 20 31 2c 20 30 20 20 20     0, 0, 1, 0   
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a               ),.
b180: 20 20 20 20 41 47 47 52 45 47 41 54 45 28 6d 69      AGGREGATE(mi
b190: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
b1a0: 20 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78   1, 0, 1, minmax
b1b0: 53 74 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61  Step,      minMa
b1c0: 78 46 69 6e 61 6c 69 7a 65 20 29 2c 0a 20 20 20  xFinalize ),.   
b1d0: 20 46 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20   FUNCTION(max,  
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
b1f0: 20 31 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e   1, 1, minmaxFun
b200: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
b210: 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20  UNCTION(max,    
b220: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 31              0, 1
b230: 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20  , 1, 0          
b240: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47        ),.    AGG
b250: 52 45 47 41 54 45 28 6d 61 78 2c 20 20 20 20 20  REGATE(max,     
b260: 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20            1, 1, 
b270: 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20  1, minmaxStep,  
b280: 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69      minMaxFinali
b290: 7a 65 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  ze ),.    FUNCTI
b2a0: 4f 4e 28 74 79 70 65 6f 66 2c 20 20 20 20 20 20  ON(typeof,      
b2b0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
b2c0: 74 79 70 65 6f 66 46 75 6e 63 20 20 20 20 20 20  typeofFunc      
b2d0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
b2e0: 28 6c 65 6e 67 74 68 2c 20 20 20 20 20 20 20 20  (length,        
b2f0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 65       1, 0, 0, le
b300: 6e 67 74 68 46 75 6e 63 20 20 20 20 20 20 20 29  ngthFunc       )
b310: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  ,.    FUNCTION(s
b320: 75 62 73 74 72 2c 20 20 20 20 20 20 20 20 20 20  ubstr,          
b330: 20 20 20 32 2c 20 30 2c 20 30 2c 20 73 75 62 73     2, 0, 0, subs
b340: 74 72 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  trFunc       ),.
b350: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62      FUNCTION(sub
b360: 73 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  str,            
b370: 20 33 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72   3, 0, 0, substr
b380: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
b390: 20 20 46 55 4e 43 54 49 4f 4e 28 61 62 73 2c 20    FUNCTION(abs, 
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
b3b0: 2c 20 30 2c 20 30 2c 20 61 62 73 46 75 6e 63 20  , 0, 0, absFunc 
b3c0: 20 20 20 20 20 20 20 20 20 29 2c 0a 23 69 66 6e           ),.#ifn
b3d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b3e0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
b3f0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e     FUNCTION(roun
b400: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
b410: 31 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75  1, 0, 0, roundFu
b420: 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  nc        ),.   
b430: 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c   FUNCTION(round,
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
b450: 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63   0, 0, roundFunc
b460: 20 20 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69          ),.#endi
b470: 66 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75  f.    FUNCTION(u
b480: 70 70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  pper,           
b490: 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 70 70 65     1, 0, 0, uppe
b4a0: 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a  rFunc        ),.
b4b0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77      FUNCTION(low
b4c0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
b4d0: 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46   1, 0, 0, lowerF
b4e0: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20  unc        ),.  
b4f0: 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65    FUNCTION(coale
b500: 73 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 31  sce,           1
b510: 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20  , 0, 0, 0       
b520: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
b530: 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63  FUNCTION(coalesc
b540: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  e,           0, 
b550: 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20 20  0, 0, 0         
b560: 20 20 20 20 20 20 20 29 2c 0a 2f 2a 20 20 46 55         ),./*  FU
b570: 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c  NCTION(coalesce,
b580: 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c            -1, 0,
b590: 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20 20   0, ifnullFunc  
b5a0: 20 20 20 20 20 29 2c 20 2a 2f 0a 20 20 20 20 7b       ), */.    {
b5b0: 2d 31 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53  -1,SQLITE_UTF8,S
b5c0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
b5d0: 53 43 45 2c 30 2c 30 2c 69 66 6e 75 6c 6c 46 75  SCE,0,0,ifnullFu
b5e0: 6e 63 2c 30 2c 30 2c 22 63 6f 61 6c 65 73 63 65  nc,0,0,"coalesce
b5f0: 22 2c 30 2c 30 7d 2c 0a 20 20 20 20 46 55 4e 43  ",0,0},.    FUNC
b600: 54 49 4f 4e 28 68 65 78 2c 20 20 20 20 20 20 20  TION(hex,       
b610: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
b620: 2c 20 68 65 78 46 75 6e 63 20 20 20 20 20 20 20  , hexFunc       
b630: 20 20 20 29 2c 0a 2f 2a 20 20 46 55 4e 43 54 49     ),./*  FUNCTI
b640: 4f 4e 28 69 66 6e 75 6c 6c 2c 20 20 20 20 20 20  ON(ifnull,      
b650: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
b660: 69 66 6e 75 6c 6c 46 75 6e 63 20 20 20 20 20 20  ifnullFunc      
b670: 20 29 2c 20 2a 2f 0a 20 20 20 20 7b 32 2c 53 51   ), */.    {2,SQ
b680: 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45  LITE_UTF8,SQLITE
b690: 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 2c 30  _FUNC_COALESCE,0
b6a0: 2c 30 2c 69 66 6e 75 6c 6c 46 75 6e 63 2c 30 2c  ,0,ifnullFunc,0,
b6b0: 30 2c 22 69 66 6e 75 6c 6c 22 2c 30 2c 30 7d 2c  0,"ifnull",0,0},
b6c0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 61  .    FUNCTION(ra
b6d0: 6e 64 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  ndom,           
b6e0: 20 20 30 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f    0, 0, 0, rando
b6f0: 6d 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  mFunc       ),. 
b700: 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64     FUNCTION(rand
b710: 6f 6d 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 20  omblob,         
b720: 31 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 42  1, 0, 0, randomB
b730: 6c 6f 62 20 20 20 20 20 20 20 29 2c 0a 20 20 20  lob       ),.   
b740: 20 46 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c 69 66   FUNCTION(nullif
b750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  ,             2,
b760: 20 30 2c 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e   0, 1, nullifFun
b770: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
b780: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 76  UNCTION(sqlite_v
b790: 65 72 73 69 6f 6e 2c 20 20 20 20 20 30 2c 20 30  ersion,     0, 0
b7a0: 2c 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63  , 0, versionFunc
b7b0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
b7c0: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 73 6f 75  CTION(sqlite_sou
b7d0: 72 63 65 5f 69 64 2c 20 20 20 30 2c 20 30 2c 20  rce_id,   0, 0, 
b7e0: 30 2c 20 73 6f 75 72 63 65 69 64 46 75 6e 63 20  0, sourceidFunc 
b7f0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
b800: 49 4f 4e 28 73 71 6c 69 74 65 5f 6c 6f 67 2c 20  ION(sqlite_log, 
b810: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c          2, 0, 0,
b820: 20 65 72 72 6c 6f 67 46 75 6e 63 20 20 20 20 20   errlogFunc     
b830: 20 20 29 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c    ),.#ifndef SQL
b840: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
b850: 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20 20  OPTION_DIAGS.   
b860: 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65   FUNCTION(sqlite
b870: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
b880: 73 65 64 2c 31 2c 20 30 2c 20 30 2c 20 63 6f 6d  sed,1, 0, 0, com
b890: 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46 75  pileoptionusedFu
b8a0: 6e 63 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54  nc  ),.    FUNCT
b8b0: 49 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70 69  ION(sqlite_compi
b8c0: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 2c 20 31 2c  leoption_get, 1,
b8d0: 20 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f 70   0, 0, compileop
b8e0: 74 69 6f 6e 67 65 74 46 75 6e 63 20 20 29 2c 0a  tiongetFunc  ),.
b8f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b900: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
b910: 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 20 20 20  ION_DIAGS */.   
b920: 20 46 55 4e 43 54 49 4f 4e 28 71 75 6f 74 65 2c   FUNCTION(quote,
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
b940: 20 30 2c 20 30 2c 20 71 75 6f 74 65 46 75 6e 63   0, 0, quoteFunc
b950: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
b960: 55 4e 43 54 49 4f 4e 28 6c 61 73 74 5f 69 6e 73  UNCTION(last_ins
b970: 65 72 74 5f 72 6f 77 69 64 2c 20 20 30 2c 20 30  ert_rowid,  0, 0
b980: 2c 20 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74  , 0, last_insert
b990: 5f 72 6f 77 69 64 29 2c 0a 20 20 20 20 46 55 4e  _rowid),.    FUN
b9a0: 43 54 49 4f 4e 28 63 68 61 6e 67 65 73 2c 20 20  CTION(changes,  
b9b0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
b9c0: 30 2c 20 63 68 61 6e 67 65 73 20 20 20 20 20 20  0, changes      
b9d0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
b9e0: 49 4f 4e 28 74 6f 74 61 6c 5f 63 68 61 6e 67 65  ION(total_change
b9f0: 73 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  s,      0, 0, 0,
ba00: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20 20   total_changes  
ba10: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
ba20: 4e 28 72 65 70 6c 61 63 65 2c 20 20 20 20 20 20  N(replace,      
ba30: 20 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 72        3, 0, 0, r
ba40: 65 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20  eplaceFunc      
ba50: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
ba60: 7a 65 72 6f 62 6c 6f 62 2c 20 20 20 20 20 20 20  zeroblob,       
ba70: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 7a 65 72      1, 0, 0, zer
ba80: 6f 62 6c 6f 62 46 75 6e 63 20 20 20 20 20 29 2c  oblobFunc     ),
ba90: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
baa0: 5f 53 4f 55 4e 44 45 58 0a 20 20 20 20 46 55 4e  _SOUNDEX.    FUN
bab0: 43 54 49 4f 4e 28 73 6f 75 6e 64 65 78 2c 20 20  CTION(soundex,  
bac0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
bad0: 30 2c 20 73 6f 75 6e 64 65 78 46 75 6e 63 20 20  0, soundexFunc  
bae0: 20 20 20 20 29 2c 0a 20 20 23 65 6e 64 69 66 0a      ),.  #endif.
baf0: 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45    #ifndef SQLITE
bb00: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
bb10: 53 49 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f  SION.    FUNCTIO
bb20: 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  N(load_extension
bb30: 2c 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c  ,     1, 0, 0, l
bb40: 6f 61 64 45 78 74 20 20 20 20 20 20 20 20 20 20  oadExt          
bb50: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
bb60: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20  load_extension, 
bb70: 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 6c 6f 61      2, 0, 0, loa
bb80: 64 45 78 74 20 20 20 20 20 20 20 20 20 20 29 2c  dExt          ),
bb90: 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 41 47  .  #endif.    AG
bba0: 47 52 45 47 41 54 45 28 73 75 6d 2c 20 20 20 20  GREGATE(sum,    
bbb0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
bbc0: 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20   0, sumStep,    
bbd0: 20 20 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a 65       sumFinalize
bbe0: 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45      ),.    AGGRE
bbf0: 47 41 54 45 28 74 6f 74 61 6c 2c 20 20 20 20 20  GATE(total,     
bc00: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
bc10: 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20   sumStep,       
bc20: 20 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 20    totalFinalize 
bc30: 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47     ),.    AGGREG
bc40: 41 54 45 28 61 76 67 2c 20 20 20 20 20 20 20 20  ATE(avg,        
bc50: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
bc60: 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20  sumStep,        
bc70: 20 61 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20   avgFinalize    
bc80: 29 2c 0a 20 2f 2a 20 41 47 47 52 45 47 41 54 45  ),. /* AGGREGATE
bc90: 28 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  (count,         
bca0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f 75      0, 0, 0, cou
bcb0: 6e 74 53 74 65 70 2c 20 20 20 20 20 20 20 63 6f  ntStep,       co
bcc0: 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20 29 2c 20  untFinalize  ), 
bcd0: 2a 2f 0a 20 20 20 20 7b 30 2c 53 51 4c 49 54 45  */.    {0,SQLITE
bce0: 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 46 55 4e  _UTF8,SQLITE_FUN
bcf0: 43 5f 43 4f 55 4e 54 2c 30 2c 30 2c 30 2c 63 6f  C_COUNT,0,0,0,co
bd00: 75 6e 74 53 74 65 70 2c 63 6f 75 6e 74 46 69 6e  untStep,countFin
bd10: 61 6c 69 7a 65 2c 22 63 6f 75 6e 74 22 2c 30 2c  alize,"count",0,
bd20: 30 7d 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54  0},.    AGGREGAT
bd30: 45 28 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  E(count,        
bd40: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 63 6f       1, 0, 0, co
bd50: 75 6e 74 53 74 65 70 2c 20 20 20 20 20 20 20 63  untStep,       c
bd60: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20 29 2c  ountFinalize  ),
bd70: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 67  .    AGGREGATE(g
bd80: 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20 20 20 20  roup_concat,    
bd90: 20 20 31 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70    1, 0, 0, group
bda0: 43 6f 6e 63 61 74 53 74 65 70 2c 20 67 72 6f 75  ConcatStep, grou
bdb0: 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 29  pConcatFinalize)
bdc0: 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28  ,.    AGGREGATE(
bdd0: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20 20 20  group_concat,   
bde0: 20 20 20 32 2c 20 30 2c 20 30 2c 20 67 72 6f 75     2, 0, 0, grou
bdf0: 70 43 6f 6e 63 61 74 53 74 65 70 2c 20 67 72 6f  pConcatStep, gro
be00: 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65  upConcatFinalize
be10: 29 2c 0a 20 20 0a 20 20 20 20 4c 49 4b 45 46 55  ),.  .    LIKEFU
be20: 4e 43 28 67 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f  NC(glob, 2, &glo
be30: 62 49 6e 66 6f 2c 20 53 51 4c 49 54 45 5f 46 55  bInfo, SQLITE_FU
be40: 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46  NC_LIKE|SQLITE_F
be50: 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20 23 69 66  UNC_CASE),.  #if
be60: 64 65 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f  def SQLITE_CASE_
be70: 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 0a 20  SENSITIVE_LIKE. 
be80: 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65     LIKEFUNC(like
be90: 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c  , 2, &likeInfoAl
bea0: 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  t, SQLITE_FUNC_L
beb0: 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  IKE|SQLITE_FUNC_
bec0: 43 41 53 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46  CASE),.    LIKEF
bed0: 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69  UNC(like, 3, &li
bee0: 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54  keInfoAlt, SQLIT
bef0: 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49  E_FUNC_LIKE|SQLI
bf00: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20  TE_FUNC_CASE),. 
bf10: 20 23 65 6c 73 65 0a 20 20 20 20 4c 49 4b 45 46   #else.    LIKEF
bf20: 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69  UNC(like, 2, &li
bf30: 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49  keInfoNorm, SQLI
bf40: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20  TE_FUNC_LIKE),. 
bf50: 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65     LIKEFUNC(like
bf60: 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f  , 3, &likeInfoNo
bf70: 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rm, SQLITE_FUNC_
bf80: 4c 49 4b 45 29 2c 0a 20 20 23 65 6e 64 69 66 0a  LIKE),.  #endif.
bf90: 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 69 3b 0a 20    };..  int i;. 
bfa0: 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48   FuncDefHash *pH
bfb0: 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75  ash = &GLOBAL(Fu
bfc0: 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74  ncDefHash, sqlit
bfd0: 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e  e3GlobalFunction
bfe0: 73 29 3b 0a 20 20 46 75 6e 63 44 65 66 20 2a 61  s);.  FuncDef *a
bff0: 46 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66 2a  Func = (FuncDef*
c000: 29 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66  )&GLOBAL(FuncDef
c010: 2c 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 3b  , aBuiltinFunc);
c020: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ..  for(i=0; i<A
c030: 72 72 61 79 53 69 7a 65 28 61 42 75 69 6c 74 69  rraySize(aBuilti
c040: 6e 46 75 6e 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  nFunc); i++){.  
c050: 20 20 73 71 6c 69 74 65 33 46 75 6e 63 44 65 66    sqlite3FuncDef
c060: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 26 61  Insert(pHash, &a
c070: 46 75 6e 63 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  Func[i]);.  }.  
c080: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 44  sqlite3RegisterD
c090: 61 74 65 54 69 6d 65 46 75 6e 63 74 69 6f 6e 73  ateTimeFunctions
c0a0: 28 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ();.#ifndef SQLI
c0b0: 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
c0c0: 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65  LE.  sqlite3Alte
c0d0: 72 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 65  rFunctions();.#e
c0e0: 6e 64 69 66 0a 7d 0a                             ndif.}.