/ Hex Artifact Content
Login

Artifact 6cf832abbc2815fdb46fee654df32a66ab77deb47bf4cff04a5774dafecd497a:


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 2d 6c 61 6e 67 75 61 67 65 20 69 6d 70 6c 65  C-language imple
01a0: 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 6d  mentations for m
01b0: 61 6e 79 20 6f 66 20 74 68 65 20 53 51 4c 0a 2a  any of the SQL.*
01c0: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6f 66 20 53  * functions of S
01d0: 51 4c 69 74 65 2e 20 20 28 53 6f 6d 65 20 66 75  QLite.  (Some fu
01e0: 6e 63 74 69 6f 6e 2c 20 61 6e 64 20 69 6e 20 70  nction, and in p
01f0: 61 72 74 69 63 75 6c 61 72 20 74 68 65 20 64 61  articular the da
0200: 74 65 20 61 6e 64 0a 2a 2a 20 74 69 6d 65 20 66  te and.** time f
0210: 75 6e 63 74 69 6f 6e 73 2c 20 61 72 65 20 69 6d  unctions, are im
0220: 70 6c 65 6d 65 6e 74 65 64 20 73 65 70 61 72 61  plemented separa
0230: 74 65 6c 79 2e 29 0a 2a 2f 0a 23 69 6e 63 6c 75  tely.).*/.#inclu
0240: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0250: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
0260: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  b.h>.#include <a
0270: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0280: 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 2f  e "vdbeInt.h"../
0290: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
02a0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
02b0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
02c0: 74 68 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  th a function..*
02d0: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
02e0: 20 2a 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63   *sqlite3GetFunc
02f0: 43 6f 6c 6c 53 65 71 28 73 71 6c 69 74 65 33 5f  CollSeq(sqlite3_
0300: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0310: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
0320: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 6e 74  ;.  assert( cont
0330: 65 78 74 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  ext->pVdbe!=0 );
0340: 0a 20 20 70 4f 70 20 3d 20 26 63 6f 6e 74 65 78  .  pOp = &contex
0350: 74 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 63 6f  t->pVdbe->aOp[co
0360: 6e 74 65 78 74 2d 3e 69 4f 70 2d 31 5d 3b 0a 20  ntext->iOp-1];. 
0370: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
0380: 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71  code==OP_CollSeq
0390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
03a0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f  p->p4type==P4_CO
03b0: 4c 4c 53 45 51 20 29 3b 0a 20 20 72 65 74 75 72  LLSEQ );.  retur
03c0: 6e 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  n pOp->p4.pColl;
03d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
03e0: 74 65 20 74 68 61 74 20 74 68 65 20 61 63 63 75  te that the accu
03f0: 6d 75 6c 61 74 6f 72 20 6c 6f 61 64 20 73 68 6f  mulator load sho
0400: 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20 6f  uld be skipped o
0410: 6e 20 74 68 69 73 0a 2a 2a 20 69 74 65 72 61 74  n this.** iterat
0420: 69 6f 6e 20 6f 66 20 74 68 65 20 61 67 67 72 65  ion of the aggre
0430: 67 61 74 65 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74  gate loop..*/.st
0440: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
0450: 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74 6f 72  3SkipAccumulator
0460: 4c 6f 61 64 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Load(sqlite3_con
0470: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
0480: 20 20 61 73 73 65 72 74 28 20 63 6f 6e 74 65 78    assert( contex
0490: 74 2d 3e 69 73 45 72 72 6f 72 3c 3d 30 20 29 3b  t->isError<=0 );
04a0: 0a 20 20 63 6f 6e 74 65 78 74 2d 3e 69 73 45 72  .  context->isEr
04b0: 72 6f 72 20 3d 20 2d 31 3b 0a 20 20 63 6f 6e 74  ror = -1;.  cont
04c0: 65 78 74 2d 3e 73 6b 69 70 46 6c 61 67 20 3d 20  ext->skipFlag = 
04d0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  1;.}../*.** Impl
04e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
04f0: 65 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  e non-aggregate 
0500: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20  min() and max() 
0510: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61  functions.*/.sta
0520: 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78 46  tic void minmaxF
0530: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
0540: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
0550: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
0560: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
0570: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
0580: 20 20 69 6e 74 20 6d 61 73 6b 3b 20 20 20 20 2f    int mask;    /
0590: 2a 20 30 20 66 6f 72 20 6d 69 6e 28 29 20 6f 72  * 0 for min() or
05a0: 20 30 78 66 66 66 66 66 66 66 66 20 66 6f 72 20   0xffffffff for 
05b0: 6d 61 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69  max() */.  int i
05c0: 42 65 73 74 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  Best;.  CollSeq 
05d0: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 61 73 73 65 72  *pColl;..  asser
05e0: 74 28 20 61 72 67 63 3e 31 20 29 3b 0a 20 20 6d  t( argc>1 );.  m
05f0: 61 73 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  ask = sqlite3_us
0600: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
0610: 3d 3d 30 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20  ==0 ? 0 : -1;.  
0620: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
0630: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f  etFuncCollSeq(co
0640: 6e 74 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74  ntext);.  assert
0650: 28 20 70 43 6f 6c 6c 20 29 3b 0a 20 20 61 73 73  ( pColl );.  ass
0660: 65 72 74 28 20 6d 61 73 6b 3d 3d 2d 31 20 7c 7c  ert( mask==-1 ||
0670: 20 6d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 69 42   mask==0 );.  iB
0680: 65 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  est = 0;.  if( s
0690: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
06a0: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
06b0: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
06c0: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61  ;.  for(i=1; i<a
06d0: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rgc; i++){.    i
06e0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
06f0: 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 3d 3d  _type(argv[i])==
0700: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
0710: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 28 73  turn;.    if( (s
0720: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
0730: 28 61 72 67 76 5b 69 42 65 73 74 5d 2c 20 61 72  (argv[iBest], ar
0740: 67 76 5b 69 5d 2c 20 70 43 6f 6c 6c 29 5e 6d 61  gv[i], pColl)^ma
0750: 73 6b 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)>=0 ){.      
0760: 74 65 73 74 63 61 73 65 28 20 6d 61 73 6b 3d 3d  testcase( mask==
0770: 30 20 29 3b 0a 20 20 20 20 20 20 69 42 65 73 74  0 );.      iBest
0780: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
0790: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
07a0: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
07b0: 61 72 67 76 5b 69 42 65 73 74 5d 29 3b 0a 7d 0a  argv[iBest]);.}.
07c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
07d0: 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  e type of the ar
07e0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
07f0: 63 20 76 6f 69 64 20 74 79 70 65 6f 66 46 75 6e  c void typeofFun
0800: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
0810: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
0820: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20   int NotUsed,.  
0830: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0840: 61 72 67 76 0a 29 7b 0a 20 20 73 74 61 74 69 63  argv.){.  static
0850: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 54   const char *azT
0860: 79 70 65 5b 5d 20 3d 20 7b 20 22 69 6e 74 65 67  ype[] = { "integ
0870: 65 72 22 2c 20 22 72 65 61 6c 22 2c 20 22 74 65  er", "real", "te
0880: 78 74 22 2c 20 22 62 6c 6f 62 22 2c 20 22 6e 75  xt", "blob", "nu
0890: 6c 6c 22 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d  ll" };.  int i =
08a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
08b0: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 2d 20 31  ype(argv[0]) - 1
08c0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
08d0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
08e0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
08f0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 54   i<ArraySize(azT
0900: 79 70 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ype) );.  assert
0910: 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ( SQLITE_INTEGER
0920: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
0930: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3d 3d 32   SQLITE_FLOAT==2
0940: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
0950: 4c 49 54 45 5f 54 45 58 54 3d 3d 33 20 29 3b 0a  LITE_TEXT==3 );.
0960: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
0970: 5f 42 4c 4f 42 3d 3d 34 20 29 3b 0a 20 20 61 73  _BLOB==4 );.  as
0980: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4e 55 4c  sert( SQLITE_NUL
0990: 4c 3d 3d 35 20 29 3b 0a 20 20 2f 2a 20 45 56 49  L==5 );.  /* EVI
09a0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 34 37  DENCE-OF: R-0147
09b0: 30 2d 36 30 34 38 32 20 54 68 65 20 73 71 6c 69  0-60482 The sqli
09c0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 56  te3_value_type(V
09d0: 29 20 69 6e 74 65 72 66 61 63 65 20 72 65 74 75  ) interface retu
09e0: 72 6e 73 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  rns.  ** the dat
09f0: 61 74 79 70 65 20 63 6f 64 65 20 66 6f 72 20 74  atype code for t
0a00: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 74  he initial datat
0a10: 79 70 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ype of the sqlit
0a20: 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 0a  e3_value object.
0a30: 20 20 2a 2a 20 56 2e 20 54 68 65 20 72 65 74 75    ** V. The retu
0a40: 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6f 6e  rned value is on
0a50: 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45  e of SQLITE_INTE
0a60: 47 45 52 2c 20 53 51 4c 49 54 45 5f 46 4c 4f 41  GER, SQLITE_FLOA
0a70: 54 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54  T,.  ** SQLITE_T
0a80: 45 58 54 2c 20 53 51 4c 49 54 45 5f 42 4c 4f 42  EXT, SQLITE_BLOB
0a90: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  , or SQLITE_NULL
0aa0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  . */.  sqlite3_r
0ab0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
0ac0: 78 74 2c 20 61 7a 54 79 70 65 5b 69 5d 2c 20 2d  xt, azType[i], -
0ad0: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
0ae0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  );.}.../*.** Imp
0af0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0b00: 68 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e 63  he length() func
0b10: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
0b20: 6f 69 64 20 6c 65 6e 67 74 68 46 75 6e 63 28 0a  oid lengthFunc(.
0b30: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0b40: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
0b50: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
0b60: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
0b70: 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  {.  assert( argc
0b80: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
0b90: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
0ba0: 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74  .  switch( sqlit
0bb0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
0bc0: 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61  gv[0]) ){.    ca
0bd0: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a  se SQLITE_BLOB:.
0be0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0bf0: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
0c00: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
0c10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
0c20: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
0c30: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
0c40: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
0c50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0c60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
0c70: 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
0c80: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
0c90: 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  ed char *z = sql
0ca0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
0cb0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
0cc0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
0cd0: 68 61 72 20 2a 7a 30 3b 0a 20 20 20 20 20 20 75  har *z0;.      u
0ce0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 3b 0a  nsigned char c;.
0cf0: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
0d00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7a   return;.      z
0d10: 30 20 3d 20 7a 3b 0a 20 20 20 20 20 20 77 68 69  0 = z;.      whi
0d20: 6c 65 28 20 28 63 20 3d 20 2a 7a 29 21 3d 30 20  le( (c = *z)!=0 
0d30: 29 7b 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a  ){.        z++;.
0d40: 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30          if( c>=0
0d50: 78 63 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xc0 ){.         
0d60: 20 77 68 69 6c 65 28 20 28 2a 7a 20 26 20 30 78   while( (*z & 0x
0d70: 63 30 29 3d 3d 30 78 38 30 20 29 7b 20 7a 2b 2b  c0)==0x80 ){ z++
0d80: 3b 20 7a 30 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ; z0++; }.      
0d90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
0da0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0db0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 28 69  _int(context, (i
0dc0: 6e 74 29 28 7a 2d 7a 30 29 29 3b 0a 20 20 20 20  nt)(z-z0));.    
0dd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0de0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
0df0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0e00: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
0e10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0e20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0e30: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
0e40: 20 6f 66 20 74 68 65 20 61 62 73 28 29 20 66 75   of the abs() fu
0e50: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d  nction..**.** IM
0e60: 50 3a 20 52 2d 32 33 39 37 39 2d 32 36 38 35 35  P: R-23979-26855
0e70: 20 54 68 65 20 61 62 73 28 58 29 20 66 75 6e 63   The abs(X) func
0e80: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
0e90: 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20   absolute value 
0ea0: 6f 66 0a 2a 2a 20 74 68 65 20 6e 75 6d 65 72 69  of.** the numeri
0eb0: 63 20 61 72 67 75 6d 65 6e 74 20 58 2e 20 0a 2a  c argument X. .*
0ec0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 62  /.static void ab
0ed0: 73 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  sFunc(sqlite3_co
0ee0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
0ef0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
0f00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
0f10: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
0f20: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
0f30: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
0f40: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
0f50: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
0f60: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
0f70: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
0f80: 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56  : {.      i64 iV
0f90: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
0fa0: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
0fb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 56 61  );.      if( iVa
0fc0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  l<0 ){.        i
0fd0: 66 28 20 69 56 61 6c 3d 3d 53 4d 41 4c 4c 45 53  f( iVal==SMALLES
0fe0: 54 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20 20 20  T_INT64 ){.     
0ff0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
1000: 31 36 37 36 2d 34 35 35 30 39 20 49 66 20 58 20  1676-45509 If X 
1010: 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 2d  is the integer -
1020: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1030: 38 30 38 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  808.          **
1040: 20 74 68 65 6e 20 61 62 73 28 58 29 20 74 68 72   then abs(X) thr
1050: 6f 77 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  ows an integer o
1060: 76 65 72 66 6c 6f 77 20 65 72 72 6f 72 20 73 69  verflow error si
1070: 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 0a  nce there is no.
1080: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75            ** equ
1090: 69 76 61 6c 65 6e 74 20 70 6f 73 69 74 69 76 65  ivalent positive
10a0: 20 36 34 2d 62 69 74 20 74 77 6f 20 63 6f 6d 70   64-bit two comp
10b0: 6c 65 6d 65 6e 74 20 76 61 6c 75 65 2e 20 2a 2f  lement value. */
10c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
10e0: 63 6f 6e 74 65 78 74 2c 20 22 69 6e 74 65 67 65  context, "intege
10f0: 72 20 6f 76 65 72 66 6c 6f 77 22 2c 20 2d 31 29  r overflow", -1)
1100: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1110: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
1120: 20 20 20 20 20 20 69 56 61 6c 20 3d 20 2d 69 56        iVal = -iV
1130: 61 6c 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 20  al;.      } .   
1140: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1150: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
1160: 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 62 72   iVal);.      br
1170: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1180: 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
1190: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a   {.      /* IMP:
11a0: 20 52 2d 33 37 34 33 34 2d 31 39 39 32 39 20 41   R-37434-19929 A
11b0: 62 73 28 58 29 20 72 65 74 75 72 6e 73 20 4e 55  bs(X) returns NU
11c0: 4c 4c 20 69 66 20 58 20 69 73 20 4e 55 4c 4c 2e  LL if X is NULL.
11d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
11e0: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f  3_result_null(co
11f0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 62 72  ntext);.      br
1200: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
1210: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1220: 2f 2a 20 42 65 63 61 75 73 65 20 73 71 6c 69 74  /* Because sqlit
1230: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
1240: 29 20 72 65 74 75 72 6e 73 20 30 2e 30 20 69 66  ) returns 0.0 if
1250: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
1260: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 73 6f   not.      ** so
1270: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 61 6e  mething that can
1280: 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
1290: 74 6f 20 61 20 6e 75 6d 62 65 72 2c 20 77 65 20  to a number, we 
12a0: 68 61 76 65 3a 0a 20 20 20 20 20 20 2a 2a 20 49  have:.      ** I
12b0: 4d 50 3a 20 52 2d 30 31 39 39 32 2d 30 30 35 31  MP: R-01992-0051
12c0: 39 20 41 62 73 28 58 29 20 72 65 74 75 72 6e 73  9 Abs(X) returns
12d0: 20 30 2e 30 20 69 66 20 58 20 69 73 20 61 20 73   0.0 if X is a s
12e0: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 0a 20 20  tring or blob.  
12f0: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6e 6e      ** that cann
1300: 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ot be converted 
1310: 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c  to a numeric val
1320: 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ue..      */.   
1330: 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 20 3d     double rVal =
1340: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
1350: 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a  ouble(argv[0]);.
1360: 20 20 20 20 20 20 69 66 28 20 72 56 61 6c 3c 30        if( rVal<0
1370: 20 29 20 72 56 61 6c 20 3d 20 2d 72 56 61 6c 3b   ) rVal = -rVal;
1380: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
1390: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
13a0: 74 65 78 74 2c 20 72 56 61 6c 29 3b 0a 20 20 20  text, rVal);.   
13b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70    }.}../*.** Imp
13d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
13e0: 68 65 20 69 6e 73 74 72 28 29 20 66 75 6e 63 74  he instr() funct
13f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 72  ion..**.** instr
1400: 28 68 61 79 73 74 61 63 6b 2c 6e 65 65 64 6c 65  (haystack,needle
1410: 29 20 66 69 6e 64 73 20 74 68 65 20 66 69 72 73  ) finds the firs
1420: 74 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20  t occurrence of 
1430: 6e 65 65 64 6c 65 0a 2a 2a 20 69 6e 20 68 61 79  needle.** in hay
1440: 73 74 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e  stack and return
1450: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1460: 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
1470: 65 72 73 20 70 6c 75 73 20 31 2c 0a 2a 2a 20 6f  ers plus 1,.** o
1480: 72 20 30 20 69 66 20 6e 65 65 64 6c 65 20 64 6f  r 0 if needle do
1490: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 77 69 74  es not occur wit
14a0: 68 69 6e 20 68 61 79 73 74 61 63 6b 2e 0a 2a 2a  hin haystack..**
14b0: 0a 2a 2a 20 49 66 20 62 6f 74 68 20 68 61 79 73  .** If both hays
14c0: 74 61 63 6b 20 61 6e 64 20 6e 65 65 64 6c 65 20  tack and needle 
14d0: 61 72 65 20 42 4c 4f 42 73 2c 20 74 68 65 6e 20  are BLOBs, then 
14e0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6f 6e  the result is on
14f0: 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
1500: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1510: 65 73 20 69 6e 20 68 61 79 73 74 61 63 6b 20 70  es in haystack p
1520: 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rior to the firs
1530: 74 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20  t occurrence of 
1540: 6e 65 65 64 6c 65 2c 0a 2a 2a 20 6f 72 20 30 20  needle,.** or 0 
1550: 69 66 20 6e 65 65 64 6c 65 20 6e 65 76 65 72 20  if needle never 
1560: 6f 63 63 75 72 73 20 69 6e 20 68 61 79 73 74 61  occurs in haysta
1570: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
1580: 69 64 20 69 6e 73 74 72 46 75 6e 63 28 0a 20 20  id instrFunc(.  
1590: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
15a0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
15b0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
15c0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
15d0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
15e0: 20 63 68 61 72 20 2a 7a 48 61 79 73 74 61 63 6b   char *zHaystack
15f0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1600: 65 64 20 63 68 61 72 20 2a 7a 4e 65 65 64 6c 65  ed char *zNeedle
1610: 3b 0a 20 20 69 6e 74 20 6e 48 61 79 73 74 61 63  ;.  int nHaystac
1620: 6b 3b 0a 20 20 69 6e 74 20 6e 4e 65 65 64 6c 65  k;.  int nNeedle
1630: 3b 0a 20 20 69 6e 74 20 74 79 70 65 48 61 79 73  ;.  int typeHays
1640: 74 61 63 6b 2c 20 74 79 70 65 4e 65 65 64 6c 65  tack, typeNeedle
1650: 3b 0a 20 20 69 6e 74 20 4e 20 3d 20 31 3b 0a 20  ;.  int N = 1;. 
1660: 20 69 6e 74 20 69 73 54 65 78 74 3b 0a 20 20 75   int isText;.  u
1670: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69 72  nsigned char fir
1680: 73 74 43 68 61 72 3b 0a 0a 20 20 55 4e 55 53 45  stChar;..  UNUSE
1690: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
16a0: 29 3b 0a 20 20 74 79 70 65 48 61 79 73 74 61 63  );.  typeHaystac
16b0: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  k = sqlite3_valu
16c0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3b  e_type(argv[0]);
16d0: 0a 20 20 74 79 70 65 4e 65 65 64 6c 65 20 3d 20  .  typeNeedle = 
16e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
16f0: 70 65 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  pe(argv[1]);.  i
1700: 66 28 20 74 79 70 65 48 61 79 73 74 61 63 6b 3d  f( typeHaystack=
1710: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20  =SQLITE_NULL || 
1720: 74 79 70 65 4e 65 65 64 6c 65 3d 3d 53 51 4c 49  typeNeedle==SQLI
1730: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
1740: 3b 0a 20 20 6e 48 61 79 73 74 61 63 6b 20 3d 20  ;.  nHaystack = 
1750: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
1760: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
1770: 6e 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69 74 65  nNeedle = sqlite
1780: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
1790: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 6e 4e  gv[1]);.  if( nN
17a0: 65 65 64 6c 65 3e 30 20 29 7b 0a 20 20 20 20 69  eedle>0 ){.    i
17b0: 66 28 20 74 79 70 65 48 61 79 73 74 61 63 6b 3d  f( typeHaystack=
17c0: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
17d0: 74 79 70 65 4e 65 65 64 6c 65 3d 3d 53 51 4c 49  typeNeedle==SQLI
17e0: 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  TE_BLOB ){.     
17f0: 20 7a 48 61 79 73 74 61 63 6b 20 3d 20 73 71 6c   zHaystack = sql
1800: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
1810: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
1820: 7a 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69 74 65  zNeedle = sqlite
1830: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
1840: 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 73 54  v[1]);.      isT
1850: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ext = 0;.    }el
1860: 73 65 7b 0a 20 20 20 20 20 20 7a 48 61 79 73 74  se{.      zHayst
1870: 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ack = sqlite3_va
1880: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
1890: 29 3b 0a 20 20 20 20 20 20 7a 4e 65 65 64 6c 65  );.      zNeedle
18a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
18b0: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
18c0: 20 20 20 20 20 20 69 73 54 65 78 74 20 3d 20 31        isText = 1
18d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18e0: 7a 4e 65 65 64 6c 65 3d 3d 30 20 7c 7c 20 28 6e  zNeedle==0 || (n
18f0: 48 61 79 73 74 61 63 6b 20 26 26 20 7a 48 61 79  Haystack && zHay
1900: 73 74 61 63 6b 3d 3d 30 29 20 29 20 72 65 74 75  stack==0) ) retu
1910: 72 6e 3b 0a 20 20 20 20 66 69 72 73 74 43 68 61  rn;.    firstCha
1920: 72 20 3d 20 7a 4e 65 65 64 6c 65 5b 30 5d 3b 0a  r = zNeedle[0];.
1930: 20 20 20 20 77 68 69 6c 65 28 20 6e 4e 65 65 64      while( nNeed
1940: 6c 65 3c 3d 6e 48 61 79 73 74 61 63 6b 0a 20 20  le<=nHaystack.  
1950: 20 20 20 20 20 26 26 20 28 7a 48 61 79 73 74 61       && (zHaysta
1960: 63 6b 5b 30 5d 21 3d 66 69 72 73 74 43 68 61 72  ck[0]!=firstChar
1970: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 48 61 79 73   || memcmp(zHays
1980: 74 61 63 6b 2c 20 7a 4e 65 65 64 6c 65 2c 20 6e  tack, zNeedle, n
1990: 4e 65 65 64 6c 65 29 21 3d 30 29 0a 20 20 20 20  Needle)!=0).    
19a0: 29 7b 0a 20 20 20 20 20 20 4e 2b 2b 3b 0a 20 20  ){.      N++;.  
19b0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
19c0: 6e 48 61 79 73 74 61 63 6b 2d 2d 3b 0a 20 20 20  nHaystack--;.   
19d0: 20 20 20 20 20 7a 48 61 79 73 74 61 63 6b 2b 2b       zHaystack++
19e0: 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
19f0: 69 73 54 65 78 74 20 26 26 20 28 7a 48 61 79 73  isText && (zHays
1a00: 74 61 63 6b 5b 30 5d 26 30 78 63 30 29 3d 3d 30  tack[0]&0xc0)==0
1a10: 78 38 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  x80 );.    }.   
1a20: 20 69 66 28 20 6e 4e 65 65 64 6c 65 3e 6e 48 61   if( nNeedle>nHa
1a30: 79 73 74 61 63 6b 20 29 20 4e 20 3d 20 30 3b 0a  ystack ) N = 0;.
1a40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
1a50: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
1a60: 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , N);.}../*.** I
1a70: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1a80: 20 74 68 65 20 70 72 69 6e 74 66 28 29 20 66 75   the printf() fu
1a90: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
1aa0: 63 20 76 6f 69 64 20 70 72 69 6e 74 66 46 75 6e  c void printfFun
1ab0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
1ac0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
1ad0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
1ae0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
1af0: 76 0a 29 7b 0a 20 20 50 72 69 6e 74 66 41 72 67  v.){.  PrintfArg
1b00: 75 6d 65 6e 74 73 20 78 3b 0a 20 20 53 74 72 41  uments x;.  StrA
1b10: 63 63 75 6d 20 73 74 72 3b 0a 20 20 63 6f 6e 73  ccum str;.  cons
1b20: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 3b  t char *zFormat;
1b30: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
1b40: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
1b50: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
1b60: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20  dle(context);.. 
1b70: 20 69 66 28 20 61 72 67 63 3e 3d 31 20 26 26 20   if( argc>=1 && 
1b80: 28 7a 46 6f 72 6d 61 74 20 3d 20 28 63 6f 6e 73  (zFormat = (cons
1b90: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1ba0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1bb0: 30 5d 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 78  0]))!=0 ){.    x
1bc0: 2e 6e 41 72 67 20 3d 20 61 72 67 63 2d 31 3b 0a  .nArg = argc-1;.
1bd0: 20 20 20 20 78 2e 6e 55 73 65 64 20 3d 20 30 3b      x.nUsed = 0;
1be0: 0a 20 20 20 20 78 2e 61 70 41 72 67 20 3d 20 61  .    x.apArg = a
1bf0: 72 67 76 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74  rgv+1;.    sqlit
1c00: 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
1c10: 73 74 72 2c 20 64 62 2c 20 30 2c 20 30 2c 20 64  str, db, 0, 0, d
1c20: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
1c30: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 29 3b  _LIMIT_LENGTH]);
1c40: 0a 20 20 20 20 73 74 72 2e 70 72 69 6e 74 66 46  .    str.printfF
1c50: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 50 52  lags = SQLITE_PR
1c60: 49 4e 54 46 5f 53 51 4c 46 55 4e 43 3b 0a 20 20  INTF_SQLFUNC;.  
1c70: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
1c80: 70 65 6e 64 66 28 26 73 74 72 2c 20 7a 46 6f 72  pendf(&str, zFor
1c90: 6d 61 74 2c 20 26 78 29 3b 0a 20 20 20 20 6e 20  mat, &x);.    n 
1ca0: 3d 20 73 74 72 2e 6e 43 68 61 72 3b 0a 20 20 20  = str.nChar;.   
1cb0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1cc0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  text(context, sq
1cd0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
1ce0: 69 73 68 28 26 73 74 72 29 2c 20 6e 2c 0a 20 20  ish(&str), n,.  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 59 4e        SQLITE_DYN
1d10: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
1d20: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1d30: 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  on of the substr
1d40: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
1d50: 2a 2a 20 73 75 62 73 74 72 28 78 2c 70 31 2c 70  ** substr(x,p1,p
1d60: 32 29 20 20 72 65 74 75 72 6e 73 20 70 32 20 63  2)  returns p2 c
1d70: 68 61 72 61 63 74 65 72 73 20 6f 66 20 78 5b 5d  haracters of x[]
1d80: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
1d90: 70 31 2e 0a 2a 2a 20 70 31 20 69 73 20 31 2d 69  p1..** p1 is 1-i
1da0: 6e 64 65 78 65 64 2e 20 20 53 6f 20 73 75 62 73  ndexed.  So subs
1db0: 74 72 28 78 2c 31 2c 31 29 20 72 65 74 75 72 6e  tr(x,1,1) return
1dc0: 73 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  s the first char
1dd0: 61 63 74 65 72 0a 2a 2a 20 6f 66 20 78 2e 20 20  acter.** of x.  
1de0: 49 66 20 78 20 69 73 20 74 65 78 74 2c 20 74 68  If x is text, th
1df0: 65 6e 20 77 65 20 61 63 74 75 61 6c 6c 79 20 63  en we actually c
1e00: 6f 75 6e 74 20 55 54 46 2d 38 20 63 68 61 72 61  ount UTF-8 chara
1e10: 63 74 65 72 73 2e 0a 2a 2a 20 49 66 20 78 20 69  cters..** If x i
1e20: 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 6e 20 77  s a blob, then w
1e30: 65 20 63 6f 75 6e 74 20 62 79 74 65 73 2e 0a 2a  e count bytes..*
1e40: 2a 0a 2a 2a 20 49 66 20 70 31 20 69 73 20 6e 65  *.** If p1 is ne
1e50: 67 61 74 69 76 65 2c 20 74 68 65 6e 20 77 65 20  gative, then we 
1e60: 62 65 67 69 6e 20 61 62 73 28 70 31 29 20 66 72  begin abs(p1) fr
1e70: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 78 5b  om the end of x[
1e80: 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 32 20 69  ]..**.** If p2 i
1e90: 73 20 6e 65 67 61 74 69 76 65 2c 20 72 65 74 75  s negative, retu
1ea0: 72 6e 20 74 68 65 20 70 32 20 63 68 61 72 61 63  rn the p2 charac
1eb0: 74 65 72 73 20 70 72 65 63 65 64 69 6e 67 20 70  ters preceding p
1ec0: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  1..*/.static voi
1ed0: 64 20 73 75 62 73 74 72 46 75 6e 63 28 0a 20 20  d substrFunc(.  
1ee0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1ef0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
1f00: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
1f10: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
1f20: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1f30: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73   char *z;.  cons
1f40: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1f50: 2a 7a 32 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  *z2;.  int len;.
1f60: 20 20 69 6e 74 20 70 30 74 79 70 65 3b 0a 20 20    int p0type;.  
1f70: 69 36 34 20 70 31 2c 20 70 32 3b 0a 20 20 69 6e  i64 p1, p2;.  in
1f80: 74 20 6e 65 67 50 32 20 3d 20 30 3b 0a 0a 20 20  t negP2 = 0;..  
1f90: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20  assert( argc==3 
1fa0: 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20  || argc==2 );.  
1fb0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
1fc0: 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 3d  e_type(argv[1])=
1fd0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20  =SQLITE_NULL.   
1fe0: 7c 7c 20 28 61 72 67 63 3d 3d 33 20 26 26 20 73  || (argc==3 && s
1ff0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2000: 65 28 61 72 67 76 5b 32 5d 29 3d 3d 53 51 4c 49  e(argv[2])==SQLI
2010: 54 45 5f 4e 55 4c 4c 29 0a 20 20 29 7b 0a 20 20  TE_NULL).  ){.  
2020: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2030: 70 30 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  p0type = sqlite3
2040: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
2050: 5b 30 5d 29 3b 0a 20 20 70 31 20 3d 20 73 71 6c  [0]);.  p1 = sql
2060: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
2070: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 70  rgv[1]);.  if( p
2080: 30 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  0type==SQLITE_BL
2090: 4f 42 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  OB ){.    len = 
20a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
20b0: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
20c0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
20d0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
20e0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
20f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73  ) return;.    as
2100: 73 65 72 74 28 20 6c 65 6e 3d 3d 73 71 6c 69 74  sert( len==sqlit
2110: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
2120: 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 7d 65 6c  rgv[0]) );.  }el
2130: 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  se{.    z = sqli
2140: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
2150: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
2160: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
2170: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20      len = 0;.   
2180: 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20   if( p1<0 ){.   
2190: 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32     for(z2=z; *z2
21a0: 3b 20 6c 65 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ; len++){.      
21b0: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
21c0: 46 38 28 7a 32 29 3b 0a 20 20 20 20 20 20 7d 0a  F8(z2);.      }.
21d0: 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
21e0: 20 53 51 4c 49 54 45 5f 53 55 42 53 54 52 5f 43   SQLITE_SUBSTR_C
21f0: 4f 4d 50 41 54 49 42 49 4c 49 54 59 0a 20 20 2f  OMPATIBILITY.  /
2200: 2a 20 49 66 20 53 55 42 53 54 52 5f 43 4f 4d 50  * If SUBSTR_COMP
2210: 41 54 49 42 49 4c 49 54 59 20 69 73 20 64 65 66  ATIBILITY is def
2220: 69 6e 65 64 20 74 68 65 6e 20 73 75 62 73 74 72  ined then substr
2230: 28 58 2c 30 2c 4e 29 20 77 6f 72 6b 20 74 68 65  (X,0,N) work the
2240: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 61 73   same as.  ** as
2250: 20 73 75 62 73 74 72 28 58 2c 31 2c 4e 29 20 2d   substr(X,1,N) -
2260: 20 69 74 20 72 65 74 75 72 6e 73 20 74 68 65 20   it returns the 
2270: 66 69 72 73 74 20 4e 20 63 68 61 72 61 63 74 65  first N characte
2280: 72 73 20 6f 66 20 58 2e 20 20 54 68 69 73 0a 20  rs of X.  This. 
2290: 20 2a 2a 20 69 73 20 65 73 73 65 6e 74 69 61 6c   ** is essential
22a0: 6c 79 20 61 20 62 61 63 6b 2d 6f 75 74 20 6f 66  ly a back-out of
22b0: 20 74 68 65 20 62 75 67 2d 66 69 78 20 69 6e 20   the bug-fix in 
22c0: 63 68 65 63 6b 2d 69 6e 20 5b 35 66 63 31 32 35  check-in [5fc125
22d0: 64 33 36 32 64 66 34 62 38 5d 0a 20 20 2a 2a 20  d362df4b8].  ** 
22e0: 66 72 6f 6d 20 32 30 30 39 2d 30 32 2d 30 32 20  from 2009-02-02 
22f0: 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  for compatibilit
2300: 79 20 6f 66 20 61 70 70 6c 69 63 61 74 69 6f 6e  y of application
2310: 73 20 74 68 61 74 20 65 78 70 6c 6f 69 74 65 64  s that exploited
2320: 20 74 68 65 0a 20 20 2a 2a 20 6f 6c 64 20 62 75   the.  ** old bu
2330: 67 67 79 20 62 65 68 61 76 69 6f 72 2e 20 2a 2f  ggy behavior. */
2340: 0a 20 20 69 66 28 20 70 31 3d 3d 30 20 29 20 70  .  if( p1==0 ) p
2350: 31 20 3d 20 31 3b 20 2f 2a 20 3c 72 64 61 72 3a  1 = 1; /* <rdar:
2360: 2f 2f 70 72 6f 62 6c 65 6d 2f 36 37 37 38 33 33  //problem/677833
2370: 39 3e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  9> */.#endif.  i
2380: 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20  f( argc==3 ){.  
2390: 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 76    p2 = sqlite3_v
23a0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d  alue_int(argv[2]
23b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 32 3c 30 20  );.    if( p2<0 
23c0: 29 7b 0a 20 20 20 20 20 20 70 32 20 3d 20 2d 70  ){.      p2 = -p
23d0: 32 3b 0a 20 20 20 20 20 20 6e 65 67 50 32 20 3d  2;.      negP2 =
23e0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
23f0: 65 7b 0a 20 20 20 20 70 32 20 3d 20 73 71 6c 69  e{.    p2 = sqli
2400: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
2410: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e  andle(context)->
2420: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2430: 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 7d  MIT_LENGTH];.  }
2440: 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20  .  if( p1<0 ){. 
2450: 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20 20     p1 += len;.  
2460: 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20    if( p1<0 ){.  
2470: 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20      p2 += p1;.  
2480: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 20 70      if( p2<0 ) p
2490: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 31 20  2 = 0;.      p1 
24a0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
24b0: 73 65 20 69 66 28 20 70 31 3e 30 20 29 7b 0a 20  se if( p1>0 ){. 
24c0: 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 65 6c 73 65     p1--;.  }else
24d0: 20 69 66 28 20 70 32 3e 30 20 29 7b 0a 20 20 20   if( p2>0 ){.   
24e0: 20 70 32 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28   p2--;.  }.  if(
24f0: 20 6e 65 67 50 32 20 29 7b 0a 20 20 20 20 70 31   negP2 ){.    p1
2500: 20 2d 3d 20 70 32 3b 0a 20 20 20 20 69 66 28 20   -= p2;.    if( 
2510: 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32  p1<0 ){.      p2
2520: 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 70 31   += p1;.      p1
2530: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2540: 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20    assert( p1>=0 
2550: 26 26 20 70 32 3e 3d 30 20 29 3b 0a 20 20 69 66  && p2>=0 );.  if
2560: 28 20 70 30 74 79 70 65 21 3d 53 51 4c 49 54 45  ( p0type!=SQLITE
2570: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 77 68 69  _BLOB ){.    whi
2580: 6c 65 28 20 2a 7a 20 26 26 20 70 31 20 29 7b 0a  le( *z && p1 ){.
2590: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
25a0: 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 20  P_UTF8(z);.     
25b0: 20 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20   p1--;.    }.   
25c0: 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 20 26   for(z2=z; *z2 &
25d0: 26 20 70 32 3b 20 70 32 2d 2d 29 7b 0a 20 20 20  & p2; p2--){.   
25e0: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
25f0: 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 7d 0a 20  TF8(z2);.    }. 
2600: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2610: 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78 74  t_text64(context
2620: 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a 32 2d 7a  , (char*)z, z2-z
2630: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
2640: 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT,.            
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2660: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 7d 65  LITE_UTF8);.  }e
2670: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 31 2b  lse{.    if( p1+
2680: 70 32 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20  p2>len ){.      
2690: 70 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a 20 20 20  p2 = len-p1;.   
26a0: 20 20 20 69 66 28 20 70 32 3c 30 20 29 20 70 32     if( p2<0 ) p2
26b0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
26c0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
26d0: 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 28  lob64(context, (
26e0: 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20 28 75  char*)&z[p1], (u
26f0: 36 34 29 70 32 2c 20 53 51 4c 49 54 45 5f 54 52  64)p2, SQLITE_TR
2700: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
2710: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2720: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 75  ation of the rou
2730: 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f  nd() function.*/
2740: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2750: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
2760: 49 4e 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20  INT.static void 
2770: 72 6f 75 6e 64 46 75 6e 63 28 73 71 6c 69 74 65  roundFunc(sqlite
2780: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
2790: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
27a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
27b0: 67 76 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  gv){.  int n = 0
27c0: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20  ;.  double r;.  
27d0: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 61 73  char *zBuf;.  as
27e0: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c  sert( argc==1 ||
27f0: 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66   argc==2 );.  if
2800: 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20  ( argc==2 ){.   
2810: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   if( SQLITE_NULL
2820: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
2830: 74 79 70 65 28 61 72 67 76 5b 31 5d 29 20 29 20  type(argv[1]) ) 
2840: 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20  return;.    n = 
2850: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2860: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
2870: 69 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d 20 33  if( n>30 ) n = 3
2880: 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29  0;.    if( n<0 )
2890: 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66   n = 0;.  }.  if
28a0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
28b0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53  type(argv[0])==S
28c0: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74  QLITE_NULL ) ret
28d0: 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71 6c 69 74  urn;.  r = sqlit
28e0: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
28f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20 49  argv[0]);.  /* I
2900: 66 20 59 3d 3d 30 20 61 6e 64 20 58 20 77 69 6c  f Y==0 and X wil
2910: 6c 20 66 69 74 20 69 6e 20 61 20 36 34 2d 62 69  l fit in a 64-bi
2920: 74 20 69 6e 74 2c 0a 20 20 2a 2a 20 68 61 6e 64  t int,.  ** hand
2930: 6c 65 20 74 68 65 20 72 6f 75 6e 64 69 6e 67 20  le the rounding 
2940: 64 69 72 65 63 74 6c 79 2c 0a 20 20 2a 2a 20 6f  directly,.  ** o
2950: 74 68 65 72 77 69 73 65 20 75 73 65 20 70 72 69  therwise use pri
2960: 6e 74 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ntf..  */.  if( 
2970: 6e 3d 3d 30 20 26 26 20 72 3e 3d 30 20 26 26 20  n==0 && r>=0 && 
2980: 72 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2d  r<LARGEST_INT64-
2990: 31 20 29 7b 0a 20 20 20 20 72 20 3d 20 28 64 6f  1 ){.    r = (do
29a0: 75 62 6c 65 29 28 28 73 71 6c 69 74 65 5f 69 6e  uble)((sqlite_in
29b0: 74 36 34 29 28 72 2b 30 2e 35 29 29 3b 0a 20 20  t64)(r+0.5));.  
29c0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20 26  }else if( n==0 &
29d0: 26 20 72 3c 30 20 26 26 20 28 2d 72 29 3c 4c 41  & r<0 && (-r)<LA
29e0: 52 47 45 53 54 5f 49 4e 54 36 34 2d 31 20 29 7b  RGEST_INT64-1 ){
29f0: 0a 20 20 20 20 72 20 3d 20 2d 28 64 6f 75 62 6c  .    r = -(doubl
2a00: 65 29 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34  e)((sqlite_int64
2a10: 29 28 28 2d 72 29 2b 30 2e 35 29 29 3b 0a 20 20  )((-r)+0.5));.  
2a20: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 42 75 66 20  }else{.    zBuf 
2a30: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2a40: 66 28 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a 20  f("%.*f",n,r);. 
2a50: 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29     if( zBuf==0 )
2a60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2a70: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
2a80: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
2a90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2aa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
2ab0: 28 7a 42 75 66 2c 20 26 72 2c 20 73 71 6c 69 74  (zBuf, &r, sqlit
2ac0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
2ad0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
2ae0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2af0: 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71  (zBuf);.  }.  sq
2b00: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
2b10: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  ble(context, r);
2b20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2b30: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
2b40: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 75  bytes of space u
2b50: 73 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  sing sqlite3Mall
2b60: 6f 63 28 29 2e 20 49 66 20 74 68 65 0a 2a 2a 20  oc(). If the.** 
2b70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2b80: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 72  , call sqlite3_r
2b90: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
2ba0: 6d 28 29 20 74 6f 20 6e 6f 74 69 66 79 0a 2a 2a  m() to notify.**
2bb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
2bc0: 6e 64 6c 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63  ndle that malloc
2bd0: 28 29 20 68 61 73 20 66 61 69 6c 65 64 20 61 6e  () has failed an
2be0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
2bf0: 2a 20 49 66 20 6e 42 79 74 65 20 69 73 20 6c 61  * If nByte is la
2c00: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  rger than the ma
2c10: 78 69 6d 75 6d 20 73 74 72 69 6e 67 20 6f 72 20  ximum string or 
2c20: 62 6c 6f 62 20 6c 65 6e 67 74 68 2c 20 74 68 65  blob length, the
2c30: 6e 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53 51  n.** raise an SQ
2c40: 4c 49 54 45 5f 54 4f 4f 42 49 47 20 65 78 63 65  LITE_TOOBIG exce
2c50: 70 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e  ption and return
2c60: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
2c70: 20 76 6f 69 64 20 2a 63 6f 6e 74 65 78 74 4d 61   void *contextMa
2c80: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lloc(sqlite3_con
2c90: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
2ca0: 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 63 68 61  64 nByte){.  cha
2cb0: 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33 20  r *z;.  sqlite3 
2cc0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
2cd0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
2ce0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61 73 73 65  context);.  asse
2cf0: 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20  rt( nByte>0 );. 
2d00: 20 74 65 73 74 63 61 73 65 28 20 6e 42 79 74 65   testcase( nByte
2d10: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
2d20: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
2d30: 5d 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ] );.  testcase(
2d40: 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d   nByte==db->aLim
2d50: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
2d60: 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69  LENGTH]+1 );.  i
2d70: 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69  f( nByte>db->aLi
2d80: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
2d90: 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
2da0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2db0: 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74  rror_toobig(cont
2dc0: 65 78 74 29 3b 0a 20 20 20 20 7a 20 3d 20 30 3b  ext);.    z = 0;
2dd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
2de0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2df0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
2e00: 21 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  !z ){.      sqli
2e10: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2e20: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
2e30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2e40: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
2e50: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2e60: 66 20 74 68 65 20 75 70 70 65 72 28 29 20 61 6e  f the upper() an
2e70: 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20 66 75  d lower() SQL fu
2e80: 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  nctions..*/.stat
2e90: 69 63 20 76 6f 69 64 20 75 70 70 65 72 46 75 6e  ic void upperFun
2ea0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
2eb0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
2ec0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
2ed0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  lue **argv){.  c
2ee0: 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74  har *z1;.  const
2ef0: 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74   char *z2;.  int
2f00: 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f   i, n;.  UNUSED_
2f10: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
2f20: 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a 29 73  .  z2 = (char*)s
2f30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2f40: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20  t(argv[0]);.  n 
2f50: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2f60: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
2f70: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
2f80: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62 79   the call to _by
2f90: 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74 20 69  tes() does not i
2fa0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 5f 74  nvalidate the _t
2fb0: 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20 2a 2f  ext() pointer */
2fc0: 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d 3d 28  .  assert( z2==(
2fd0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
2fe0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
2ff0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b  ) );.  if( z2 ){
3000: 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65 78  .    z1 = contex
3010: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
3020: 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a 20 20   ((i64)n)+1);.  
3030: 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20 20 20    if( z1 ){.    
3040: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
3050: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31  i++){.        z1
3060: 5b 69 5d 20 3d 20 28 63 68 61 72 29 73 71 6c 69  [i] = (char)sqli
3070: 74 65 33 54 6f 75 70 70 65 72 28 7a 32 5b 69 5d  te3Toupper(z2[i]
3080: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3090: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
30a0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31  text(context, z1
30b0: 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  , n, sqlite3_fre
30c0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
30d0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 77 65  static void lowe
30e0: 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  rFunc(sqlite3_co
30f0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
3100: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
3110: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
3120: 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63  .  char *z1;.  c
3130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20  onst char *z2;. 
3140: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55   int i, n;.  UNU
3150: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
3160: 67 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61  gc);.  z2 = (cha
3170: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
3180: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
3190: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
31a0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
31b0: 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  ]);.  /* Verify 
31c0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
31d0: 20 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e   _bytes() does n
31e0: 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  ot invalidate th
31f0: 65 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65  e _text() pointe
3200: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  r */.  assert( z
3210: 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65  2==(char*)sqlite
3220: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
3230: 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  v[0]) );.  if( z
3240: 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f  2 ){.    z1 = co
3250: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
3260: 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29  ext, ((i64)n)+1)
3270: 3b 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a  ;.    if( z1 ){.
3280: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3290: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
32a0: 20 20 7a 31 5b 69 5d 20 3d 20 73 71 6c 69 74 65    z1[i] = sqlite
32b0: 33 54 6f 6c 6f 77 65 72 28 7a 32 5b 69 5d 29 3b  3Tolower(z2[i]);
32c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
32d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
32e0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20  xt(context, z1, 
32f0: 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  n, sqlite3_free)
3300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
3310: 2a 0a 2a 2a 20 53 6f 6d 65 20 66 75 6e 63 74 69  *.** Some functi
3320: 6f 6e 73 20 6c 69 6b 65 20 43 4f 41 4c 45 53 43  ons like COALESC
3330: 45 28 29 20 61 6e 64 20 49 46 4e 55 4c 4c 28 29  E() and IFNULL()
3340: 20 61 6e 64 20 55 4e 4c 49 4b 45 4c 59 28 29 20   and UNLIKELY() 
3350: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  are implemented.
3360: 2a 2a 20 61 73 20 56 44 42 45 20 63 6f 64 65 20  ** as VDBE code 
3370: 73 6f 20 74 68 61 74 20 75 6e 75 73 65 64 20 61  so that unused a
3380: 72 67 75 6d 65 6e 74 20 76 61 6c 75 65 73 20 64  rgument values d
3390: 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 62 65  o not have to be
33a0: 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2a 20 48 6f   computed..** Ho
33b0: 77 65 76 65 72 2c 20 77 65 20 73 74 69 6c 6c 20  wever, we still 
33c0: 6e 65 65 64 20 73 6f 6d 65 20 6b 69 6e 64 20 6f  need some kind o
33d0: 66 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  f function imple
33e0: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68  mentation for th
33f0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69  is.** routines i
3400: 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  n the function t
3410: 61 62 6c 65 2e 20 20 54 68 65 20 6e 6f 6f 70 46  able.  The noopF
3420: 75 6e 63 20 6d 61 63 72 6f 20 70 72 6f 76 69 64  unc macro provid
3430: 65 73 20 74 68 69 73 2e 0a 2a 2a 20 6e 6f 6f 70  es this..** noop
3440: 46 75 6e 63 20 77 69 6c 6c 20 6e 65 76 65 72 20  Func will never 
3450: 62 65 20 63 61 6c 6c 65 64 20 73 6f 20 69 74 20  be called so it 
3460: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 77  doesn't matter w
3470: 68 61 74 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  hat the implemen
3480: 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 2e 20 20 57  tation.** is.  W
3490: 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20  e might as well 
34a0: 75 73 65 20 74 68 65 20 22 76 65 72 73 69 6f 6e  use the "version
34b0: 28 29 22 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  ()" function as 
34c0: 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f  a substitute..*/
34d0: 0a 23 64 65 66 69 6e 65 20 6e 6f 6f 70 46 75 6e  .#define noopFun
34e0: 63 20 76 65 72 73 69 6f 6e 46 75 6e 63 20 20 20  c versionFunc   
34f0: 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 66 75  /* Substitute fu
3500: 6e 63 74 69 6f 6e 20 2d 20 6e 65 76 65 72 20 63  nction - never c
3510: 61 6c 6c 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  alled */../*.** 
3520: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
3530: 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20 52 65 74  f random().  Ret
3540: 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 69 6e 74  urn a random int
3550: 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  eger.  .*/.stati
3560: 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46 75 6e  c void randomFun
3570: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
3580: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
3590: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20   int NotUsed,.  
35a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
35b0: 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71  NotUsed2.){.  sq
35c0: 6c 69 74 65 5f 69 6e 74 36 34 20 72 3b 0a 20 20  lite_int64 r;.  
35d0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
35e0: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
35f0: 65 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ed2);.  sqlite3_
3600: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
3610: 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 69 66 28  f(r), &r);.  if(
3620: 20 72 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57   r<0 ){.    /* W
3630: 65 20 6e 65 65 64 20 74 6f 20 70 72 65 76 65 6e  e need to preven
3640: 74 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  t a random numbe
3650: 72 20 6f 66 20 30 78 38 30 30 30 30 30 30 30 30  r of 0x800000000
3660: 30 30 30 30 30 30 30 20 0a 20 20 20 20 2a 2a 20  0000000 .    ** 
3670: 28 6f 72 20 2d 39 32 32 33 33 37 32 30 33 36 38  (or -92233720368
3680: 35 34 37 37 35 38 30 38 29 20 73 69 6e 63 65 20  54775808) since 
3690: 77 68 65 6e 20 79 6f 75 20 64 6f 20 61 62 73 28  when you do abs(
36a0: 29 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a  ) of that.    **
36b0: 20 6e 75 6d 62 65 72 20 6f 66 20 79 6f 75 20 67   number of you g
36c0: 65 74 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  et the same valu
36d0: 65 20 62 61 63 6b 20 61 67 61 69 6e 2e 20 20 54  e back again.  T
36e0: 6f 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  o do this.    **
36f0: 20 69 6e 20 61 20 77 61 79 20 74 68 61 74 20 69   in a way that i
3700: 73 20 74 65 73 74 61 62 6c 65 2c 20 6d 61 73 6b  s testable, mask
3710: 20 74 68 65 20 73 69 67 6e 20 62 69 74 20 6f 66   the sign bit of
3720: 66 20 6f 66 20 6e 65 67 61 74 69 76 65 0a 20 20  f of negative.  
3730: 20 20 2a 2a 20 76 61 6c 75 65 73 2c 20 72 65 73    ** values, res
3740: 75 6c 74 69 6e 67 20 69 6e 20 61 20 70 6f 73 69  ulting in a posi
3750: 74 69 76 65 20 76 61 6c 75 65 2e 20 20 54 68 65  tive value.  The
3760: 6e 20 74 61 6b 65 20 74 68 65 20 0a 20 20 20 20  n take the .    
3770: 2a 2a 20 32 73 20 63 6f 6d 70 6c 65 6d 65 6e 74  ** 2s complement
3780: 20 6f 66 20 74 68 61 74 20 70 6f 73 69 74 69 76   of that positiv
3790: 65 20 76 61 6c 75 65 2e 20 20 54 68 65 20 65 6e  e value.  The en
37a0: 64 20 72 65 73 75 6c 74 20 63 61 6e 0a 20 20 20  d result can.   
37b0: 20 2a 2a 20 74 68 65 72 65 66 6f 72 65 20 62 65   ** therefore be
37c0: 20 6e 6f 20 6c 65 73 73 20 74 68 61 6e 20 2d 39   no less than -9
37d0: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
37e0: 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  07..    */.    r
37f0: 20 3d 20 2d 28 72 20 26 20 4c 41 52 47 45 53 54   = -(r & LARGEST
3800: 5f 49 4e 54 36 34 29 3b 0a 20 20 7d 0a 20 20 73  _INT64);.  }.  s
3810: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
3820: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  t64(context, r);
3830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
3840: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64  entation of rand
3850: 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52 65 74 75  omblob(N).  Retu
3860: 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62 6c 6f 62  rn a random blob
3870: 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e 20 62 79  .** that is N by
3880: 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  tes long..*/.sta
3890: 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 42  tic void randomB
38a0: 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  lob(.  sqlite3_c
38b0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
38c0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
38d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
38e0: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  rgv.){.  int n;.
38f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3900: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  *p;.  assert( ar
3910: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
3920: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
3930: 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
3940: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
3950: 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 29  0]);.  if( n<1 )
3960: 7b 0a 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 7d  {.    n = 1;.  }
3970: 0a 20 20 70 20 3d 20 63 6f 6e 74 65 78 74 4d 61  .  p = contextMa
3980: 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 6e 29  lloc(context, n)
3990: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
39a0: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
39b0: 65 73 73 28 6e 2c 20 70 29 3b 0a 20 20 20 20 73  ess(n, p);.    s
39c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
39d0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  ob(context, (cha
39e0: 72 2a 29 70 2c 20 6e 2c 20 73 71 6c 69 74 65 33  r*)p, n, sqlite3
39f0: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _free);.  }.}../
3a00: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
3a10: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 73 74 5f  ion of the last_
3a20: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 53  insert_rowid() S
3a30: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
3a40: 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75  e return.** valu
3a50: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
3a60: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73   the sqlite3_las
3a70: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
3a80: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
3a90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  /.static void la
3aa0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
3ab0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
3ac0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20  xt *context, .  
3ad0: 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 0a 20 20  int NotUsed, .  
3ae0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3af0: 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71  NotUsed2.){.  sq
3b00: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
3b10: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
3b20: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
3b30: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3b40: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
3b50: 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50  Used2);.  /* IMP
3b60: 3a 20 52 2d 35 31 35 31 33 2d 31 32 30 32 36 20  : R-51513-12026 
3b70: 54 68 65 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  The last_insert_
3b80: 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75 6e 63  rowid() SQL func
3b90: 74 69 6f 6e 20 69 73 20 61 0a 20 20 2a 2a 20 77  tion is a.  ** w
3ba0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68  rapper around th
3bb0: 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  e sqlite3_last_i
3bc0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 43 2f  nsert_rowid() C/
3bd0: 43 2b 2b 20 69 6e 74 65 72 66 61 63 65 0a 20 20  C++ interface.  
3be0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  ** function. */.
3bf0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3c00: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
3c10: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
3c20: 65 72 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a  ert_rowid(db));.
3c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
3c40: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ntation of the c
3c50: 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e  hanges() SQL fun
3c60: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50  ction..**.** IMP
3c70: 3a 20 52 2d 36 32 30 37 33 2d 31 31 32 30 39 20  : R-62073-11209 
3c80: 54 68 65 20 63 68 61 6e 67 65 73 28 29 20 53 51  The changes() SQ
3c90: 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  L function is a 
3ca0: 77 72 61 70 70 65 72 0a 2a 2a 20 61 72 6f 75 6e  wrapper.** aroun
3cb0: 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 68  d the sqlite3_ch
3cc0: 61 6e 67 65 73 28 29 20 43 2f 43 2b 2b 20 66 75  anges() C/C++ fu
3cd0: 6e 63 74 69 6f 6e 20 61 6e 64 20 68 65 6e 63 65  nction and hence
3ce0: 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 73 61 6d   follows the sam
3cf0: 65 0a 2a 2a 20 72 75 6c 65 73 20 66 6f 72 20 63  e.** rules for c
3d00: 6f 75 6e 74 69 6e 67 20 63 68 61 6e 67 65 73 2e  ounting changes.
3d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3d20: 63 68 61 6e 67 65 73 28 0a 20 20 73 71 6c 69 74  changes(.  sqlit
3d30: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3d40: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
3d50: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
3d60: 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29  lue **NotUsed2.)
3d70: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
3d80: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
3d90: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
3da0: 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ext);.  UNUSED_P
3db0: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
3dc0: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
3dd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3de0: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  nt(context, sqli
3df0: 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29  te3_changes(db))
3e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
3e10: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
3e20: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29   total_changes()
3e30: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
3e40: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
3e50: 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20   is.** the same 
3e60: 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  as the sqlite3_t
3e70: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 41  otal_changes() A
3e80: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
3e90: 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 74 61  static void tota
3ea0: 6c 5f 63 68 61 6e 67 65 73 28 0a 20 20 73 71 6c  l_changes(.  sql
3eb0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3ec0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74  ntext,.  int Not
3ed0: 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f  Used,.  sqlite3_
3ee0: 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32  value **NotUsed2
3ef0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
3f00: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
3f10: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
3f20: 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44  ntext);.  UNUSED
3f30: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
3f40: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
3f50: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 37 35    /* IMP: R-5275
3f60: 36 2d 34 31 39 39 33 20 54 68 69 73 20 66 75 6e  6-41993 This fun
3f70: 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
3f80: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20  er around the.  
3f90: 2a 2a 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  ** sqlite3_total
3fa0: 5f 63 68 61 6e 67 65 73 28 29 20 43 2f 43 2b 2b  _changes() C/C++
3fb0: 20 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20   interface. */. 
3fc0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3fd0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
3fe0: 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
3ff0: 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  es(db));.}../*.*
4000: 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 64 65  * A structure de
4010: 66 69 6e 69 6e 67 20 68 6f 77 20 74 6f 20 64 6f  fining how to do
4020: 20 47 4c 4f 42 2d 73 74 79 6c 65 20 63 6f 6d 70   GLOB-style comp
4030: 61 72 69 73 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75  arisons..*/.stru
4040: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 7b  ct compareInfo {
4050: 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c 3b 20  .  u8 matchAll; 
4060: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 2a 22 20           /* "*" 
4070: 6f 72 20 22 25 22 20 2a 2f 0a 20 20 75 38 20 6d  or "%" */.  u8 m
4080: 61 74 63 68 4f 6e 65 3b 20 20 20 20 20 20 20 20  atchOne;        
4090: 20 20 2f 2a 20 22 3f 22 20 6f 72 20 22 5f 22 20    /* "?" or "_" 
40a0: 2a 2f 0a 20 20 75 38 20 6d 61 74 63 68 53 65 74  */.  u8 matchSet
40b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 5b  ;          /* "[
40c0: 22 20 6f 72 20 30 20 2a 2f 0a 20 20 75 38 20 6e  " or 0 */.  u8 n
40d0: 6f 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  oCase;          
40e0: 20 20 2f 2a 20 74 72 75 65 20 74 6f 20 69 67 6e    /* true to ign
40f0: 6f 72 65 20 63 61 73 65 20 64 69 66 66 65 72 65  ore case differe
4100: 6e 63 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nces */.};../*.*
4110: 2a 20 46 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47  * For LIKE and G
4120: 4c 4f 42 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20  LOB matching on 
4130: 45 42 43 44 49 43 20 6d 61 63 68 69 6e 65 73 2c  EBCDIC machines,
4140: 20 61 73 73 75 6d 65 20 74 68 61 74 20 65 76 65   assume that eve
4150: 72 79 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20  ry.** character 
4160: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 62  is exactly one b
4170: 79 74 65 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c  yte in size.  Al
4180: 73 6f 2c 20 70 72 6f 76 64 65 20 74 68 65 20 55  so, provde the U
4190: 74 66 38 52 65 61 64 28 29 0a 2a 2a 20 6d 61 63  tf8Read().** mac
41a0: 72 6f 20 66 6f 72 20 66 61 73 74 20 72 65 61 64  ro for fast read
41b0: 69 6e 67 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ing of the next 
41c0: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
41d0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
41e0: 72 65 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 63  re.** the next c
41f0: 68 61 72 61 63 74 65 72 20 69 73 20 41 53 43 49  haracter is ASCI
4200: 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  I..*/.#if define
4210: 64 28 53 51 4c 49 54 45 5f 45 42 43 44 49 43 29  d(SQLITE_EBCDIC)
4220: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
4230: 33 55 74 66 38 52 65 61 64 28 41 29 20 20 20 20  3Utf8Read(A)    
4240: 20 20 20 20 28 2a 28 28 2a 41 29 2b 2b 29 29 0a      (*((*A)++)).
4250: 23 20 64 65 66 69 6e 65 20 55 74 66 38 52 65 61  # define Utf8Rea
4260: 64 28 41 29 20 20 20 20 20 20 20 20 20 20 20 20  d(A)            
4270: 20 20 20 28 2a 28 41 2b 2b 29 29 0a 23 65 6c 73     (*(A++)).#els
4280: 65 0a 23 20 64 65 66 69 6e 65 20 55 74 66 38 52  e.# define Utf8R
4290: 65 61 64 28 41 29 20 20 20 20 20 20 20 20 20 20  ead(A)          
42a0: 20 20 20 20 20 28 41 5b 30 5d 3c 30 78 38 30 3f       (A[0]<0x80?
42b0: 2a 28 41 2b 2b 29 3a 73 71 6c 69 74 65 33 55 74  *(A++):sqlite3Ut
42c0: 66 38 52 65 61 64 28 26 41 29 29 0a 23 65 6e 64  f8Read(&A)).#end
42d0: 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  if..static const
42e0: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
42f0: 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b  nfo globInfo = {
4300: 20 27 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c 20   '*', '?', '[', 
4310: 30 20 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72 72  0 };./* The corr
4320: 65 63 74 20 53 51 4c 2d 39 32 20 62 65 68 61 76  ect SQL-92 behav
4330: 69 6f 72 20 69 73 20 66 6f 72 20 74 68 65 20 4c  ior is for the L
4340: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  IKE operator to 
4350: 69 67 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e 20  ignore.** case. 
4360: 20 54 68 75 73 20 20 27 61 27 20 4c 49 4b 45 20   Thus  'a' LIKE 
4370: 27 41 27 20 77 6f 75 6c 64 20 62 65 20 74 72 75  'A' would be tru
4380: 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e. */.static con
4390: 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  st struct compar
43a0: 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f  eInfo likeInfoNo
43b0: 72 6d 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c  rm = { '%', '_',
43c0: 20 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66     0, 1 };./* If
43d0: 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e   SQLITE_CASE_SEN
43e0: 53 49 54 49 56 45 5f 4c 49 4b 45 20 69 73 20 64  SITIVE_LIKE is d
43f0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
4400: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a 2a   LIKE operator.*
4410: 2a 20 69 73 20 63 61 73 65 20 73 65 6e 73 69 74  * is case sensit
4420: 69 76 65 20 63 61 75 73 69 6e 67 20 27 61 27 20  ive causing 'a' 
4430: 4c 49 4b 45 20 27 41 27 20 74 6f 20 62 65 20 66  LIKE 'A' to be f
4440: 61 6c 73 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  alse */.static c
4450: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
4460: 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f  areInfo likeInfo
4470: 41 6c 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27  Alt = { '%', '_'
4480: 2c 20 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a  ,   0, 0 };../*.
4490: 2a 2a 20 50 6f 73 73 69 62 6c 65 20 65 72 72 6f  ** Possible erro
44a0: 72 20 72 65 74 75 72 6e 73 20 66 72 6f 6d 20 70  r returns from p
44b0: 61 74 74 65 72 6e 4d 61 74 63 68 28 29 0a 2a 2f  atternMatch().*/
44c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
44d0: 4d 41 54 43 48 20 20 20 20 20 20 20 20 20 20 20  MATCH           
44e0: 20 20 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 49    0.#define SQLI
44f0: 54 45 5f 4e 4f 4d 41 54 43 48 20 20 20 20 20 20  TE_NOMATCH      
4500: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53       1.#define S
4510: 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44  QLITE_NOWILDCARD
4520: 4d 41 54 43 48 20 20 20 32 0a 0a 2f 2a 0a 2a 2a  MATCH   2../*.**
4530: 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46   Compare two UTF
4540: 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65  -8 strings for e
4550: 71 75 61 6c 69 74 79 20 77 68 65 72 65 20 74 68  quality where th
4560: 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 69  e first string i
4570: 73 0a 2a 2a 20 61 20 47 4c 4f 42 20 6f 72 20 4c  s.** a GLOB or L
4580: 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  IKE expression. 
4590: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a   Return values:.
45a0: 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  **.**    SQLITE_
45b0: 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20  MATCH:          
45c0: 20 20 4d 61 74 63 68 0a 2a 2a 20 20 20 20 53 51    Match.**    SQ
45d0: 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3a 20 20 20  LITE_NOMATCH:   
45e0: 20 20 20 20 20 20 20 4e 6f 20 6d 61 74 63 68 0a         No match.
45f0: 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 57  **    SQLITE_NOW
4600: 49 4c 44 43 41 52 44 4d 41 54 43 48 3a 20 20 4e  ILDCARDMATCH:  N
4610: 6f 20 6d 61 74 63 68 20 69 6e 20 73 70 69 74 65  o match in spite
4620: 20 6f 66 20 68 61 76 69 6e 67 20 2a 20 6f 72 20   of having * or 
4630: 25 20 77 69 6c 64 63 61 72 64 73 2e 0a 2a 2a 0a  % wildcards..**.
4640: 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65  ** Globbing rule
4650: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a  s:.**.**      '*
4660: 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
4670: 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20  any sequence of 
4680: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61  zero or more cha
4690: 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
46a0: 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d 61      '?'       Ma
46b0: 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f 6e  tches exactly on
46c0: 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a  e character..**.
46d0: 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20  **     [...]    
46e0: 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68    Matches one ch
46f0: 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65  aracter from the
4700: 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f   enclosed list o
4710: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  f.**            
4720: 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e 0a      characters..
4730: 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d  **.**     [^...]
4740: 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65       Matches one
4750: 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69   character not i
4760: 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c  n the enclosed l
4770: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  ist..**.** With 
4780: 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e 64 20 5b 5e  the [...] and [^
4790: 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e 67 2c 20 61  ...] matching, a
47a0: 20 27 5d 27 20 63 68 61 72 61 63 74 65 72 20 63   ']' character c
47b0: 61 6e 20 62 65 20 69 6e 63 6c 75 64 65 64 0a 2a  an be included.*
47c0: 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 20 62 79  * in the list by
47d0: 20 6d 61 6b 69 6e 67 20 69 74 20 74 68 65 20 66   making it the f
47e0: 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 61  irst character a
47f0: 66 74 65 72 20 27 5b 27 20 6f 72 20 27 5e 27 2e  fter '[' or '^'.
4800: 20 20 41 0a 2a 2a 20 72 61 6e 67 65 20 6f 66 20    A.** range of 
4810: 63 68 61 72 61 63 74 65 72 73 20 63 61 6e 20 62  characters can b
4820: 65 20 73 70 65 63 69 66 69 65 64 20 75 73 69 6e  e specified usin
4830: 67 20 27 2d 27 2e 20 20 45 78 61 6d 70 6c 65 3a  g '-'.  Example:
4840: 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20 6d 61 74 63  .** "[a-z]" matc
4850: 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65 20 6c  hes any single l
4860: 6f 77 65 72 2d 63 61 73 65 20 6c 65 74 74 65 72  ower-case letter
4870: 2e 20 20 54 6f 20 6d 61 74 63 68 20 61 20 27 2d  .  To match a '-
4880: 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68  ', make.** it th
4890: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
48a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   in the list..**
48b0: 0a 2a 2a 20 4c 69 6b 65 20 6d 61 74 63 68 69 6e  .** Like matchin
48c0: 67 20 72 75 6c 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  g rules:.** .** 
48d0: 20 20 20 20 20 27 25 27 20 20 20 20 20 20 20 4d       '%'       M
48e0: 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
48f0: 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  nce of zero or m
4900: 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 0a 2a  ore characters.*
4910: 2a 0a 2a 2a 2a 20 20 20 20 20 27 5f 27 20 20 20  *.***     '_'   
4920: 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
4930: 6f 6e 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  one character.**
4940: 0a 2a 2a 20 20 20 20 20 20 45 63 20 20 20 20 20  .**      Ec     
4950: 20 20 20 57 68 65 72 65 20 45 20 69 73 20 74 68     Where E is th
4960: 65 20 22 65 73 63 22 20 63 68 61 72 61 63 74 65  e "esc" characte
4970: 72 20 61 6e 64 20 63 20 69 73 20 61 6e 79 20 6f  r and c is any o
4980: 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
4990: 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65 72         character
49a0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 27 25 27 2c  , including '%',
49b0: 20 27 5f 27 2c 20 61 6e 64 20 65 73 63 2c 20 6d   '_', and esc, m
49c0: 61 74 63 68 20 65 78 61 63 74 6c 79 20 63 2e 0a  atch exactly c..
49d0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 65 6e  **.** The commen
49e0: 74 73 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ts within this r
49f0: 6f 75 74 69 6e 65 20 75 73 75 61 6c 6c 79 20 61  outine usually a
4a00: 73 73 75 6d 65 20 67 6c 6f 62 20 6d 61 74 63 68  ssume glob match
4a10: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
4a20: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75 61 6c  routine is usual
4a30: 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20 63 61  ly quick, but ca
4a40: 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65  n be N**2 in the
4a50: 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2f 0a   worst case..*/.
4a60: 73 74 61 74 69 63 20 69 6e 74 20 70 61 74 74 65  static int patte
4a70: 72 6e 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e  rnCompare(.  con
4a80: 73 74 20 75 38 20 2a 7a 50 61 74 74 65 72 6e 2c  st u8 *zPattern,
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4aa0: 20 54 68 65 20 67 6c 6f 62 20 70 61 74 74 65 72   The glob patter
4ab0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
4ac0: 2a 7a 53 74 72 69 6e 67 2c 20 20 20 20 20 20 20  *zString,       
4ad0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
4ae0: 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65  tring to compare
4af0: 20 61 67 61 69 6e 73 74 20 74 68 65 20 67 6c 6f   against the glo
4b00: 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 74 72  b */.  const str
4b10: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
4b20: 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49 6e 66 6f 72  *pInfo, /* Infor
4b30: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 68 6f 77  mation about how
4b40: 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61   to do the compa
4b50: 72 65 20 2a 2f 0a 20 20 75 33 32 20 6d 61 74 63  re */.  u32 matc
4b60: 68 4f 74 68 65 72 20 20 20 20 20 20 20 20 20 20  hOther          
4b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4b80: 65 73 63 61 70 65 20 63 68 61 72 20 28 4c 49 4b  escape char (LIK
4b90: 45 29 20 6f 72 20 27 5b 27 20 28 47 4c 4f 42 29  E) or '[' (GLOB)
4ba0: 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 63 2c 20   */.){.  u32 c, 
4bb0: 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  c2;             
4bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
4bd0: 74 20 70 61 74 74 65 72 6e 20 61 6e 64 20 69 6e  t pattern and in
4be0: 70 75 74 20 73 74 72 69 6e 67 20 63 68 61 72 73  put string chars
4bf0: 20 2a 2f 0a 20 20 75 33 32 20 6d 61 74 63 68 4f   */.  u32 matchO
4c00: 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63  ne = pInfo->matc
4c10: 68 4f 6e 65 3b 20 20 2f 2a 20 22 3f 22 20 6f 72  hOne;  /* "?" or
4c20: 20 22 5f 22 20 2a 2f 0a 20 20 75 33 32 20 6d 61   "_" */.  u32 ma
4c30: 74 63 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d 3e  tchAll = pInfo->
4c40: 6d 61 74 63 68 41 6c 6c 3b 20 20 2f 2a 20 22 2a  matchAll;  /* "*
4c50: 22 20 6f 72 20 22 25 22 20 2a 2f 0a 20 20 75 38  " or "%" */.  u8
4c60: 20 6e 6f 43 61 73 65 20 3d 20 70 49 6e 66 6f 2d   noCase = pInfo-
4c70: 3e 6e 6f 43 61 73 65 3b 20 20 20 20 20 20 20 2f  >noCase;       /
4c80: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
4c90: 61 73 65 3d 3d 6c 6f 77 65 72 63 61 73 65 20 2a  ase==lowercase *
4ca0: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 45  /.  const u8 *zE
4cb0: 73 63 61 70 65 64 20 3d 20 30 3b 20 20 20 20 20  scaped = 0;     
4cc0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 70 61 73 74       /* One past
4cd0: 20 74 68 65 20 6c 61 73 74 20 65 73 63 61 70 65   the last escape
4ce0: 64 20 69 6e 70 75 74 20 63 68 61 72 20 2a 2f 0a  d input char */.
4cf0: 20 20 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d    .  while( (c =
4d00: 20 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65   Utf8Read(zPatte
4d10: 72 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  rn))!=0 ){.    i
4d20: 66 28 20 63 3d 3d 6d 61 74 63 68 41 6c 6c 20 29  f( c==matchAll )
4d30: 7b 20 20 2f 2a 20 4d 61 74 63 68 20 22 2a 22 20  {  /* Match "*" 
4d40: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  */.      /* Skip
4d50: 20 6f 76 65 72 20 6d 75 6c 74 69 70 6c 65 20 22   over multiple "
4d60: 2a 22 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  *" characters in
4d70: 20 74 68 65 20 70 61 74 74 65 72 6e 2e 20 20 49   the pattern.  I
4d80: 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a 2a  f there.      **
4d90: 20 61 72 65 20 61 6c 73 6f 20 22 3f 22 20 63 68   are also "?" ch
4da0: 61 72 61 63 74 65 72 73 2c 20 73 6b 69 70 20 74  aracters, skip t
4db0: 68 6f 73 65 20 61 73 20 77 65 6c 6c 2c 20 62 75  hose as well, bu
4dc0: 74 20 63 6f 6e 73 75 6d 65 20 61 0a 20 20 20 20  t consume a.    
4dd0: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 68 61 72    ** single char
4de0: 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e 70  acter of the inp
4df0: 75 74 20 73 74 72 69 6e 67 20 66 6f 72 20 65 61  ut string for ea
4e00: 63 68 20 22 3f 22 20 73 6b 69 70 70 65 64 20 2a  ch "?" skipped *
4e10: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  /.      while( (
4e20: 63 3d 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  c=Utf8Read(zPatt
4e30: 65 72 6e 29 29 20 3d 3d 20 6d 61 74 63 68 41 6c  ern)) == matchAl
4e40: 6c 20 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68 4f  l || c == matchO
4e50: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ne ){.        if
4e60: 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26 26  ( c==matchOne &&
4e70: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
4e80: 28 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b  (&zString)==0 ){
4e90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
4ea0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43  n SQLITE_NOWILDC
4eb0: 41 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  ARDMATCH;.      
4ec0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4ed0: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
4ee0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
4ef0: 49 54 45 5f 4d 41 54 43 48 3b 20 20 20 2f 2a 20  ITE_MATCH;   /* 
4f00: 22 2a 22 20 61 74 20 74 68 65 20 65 6e 64 20 6f  "*" at the end o
4f10: 66 20 74 68 65 20 70 61 74 74 65 72 6e 20 6d 61  f the pattern ma
4f20: 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d  tches */.      }
4f30: 65 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63  else if( c==matc
4f40: 68 4f 74 68 65 72 20 29 7b 0a 20 20 20 20 20 20  hOther ){.      
4f50: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6d 61 74    if( pInfo->mat
4f60: 63 68 53 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chSet==0 ){.    
4f70: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
4f80: 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74  3Utf8Read(&zPatt
4f90: 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ern);.          
4fa0: 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72  if( c==0 ) retur
4fb0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43  n SQLITE_NOWILDC
4fc0: 41 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  ARDMATCH;.      
4fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4fe0: 20 20 20 2f 2a 20 22 5b 2e 2e 2e 5d 22 20 69 6d     /* "[...]" im
4ff0: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
5000: 73 20 74 68 65 20 22 2a 22 2e 20 20 57 65 20 68  s the "*".  We h
5010: 61 76 65 20 74 6f 20 64 6f 20 61 20 73 6c 6f 77  ave to do a slow
5020: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65  .          ** re
5030: 63 75 72 73 69 76 65 20 73 65 61 72 63 68 20 69  cursive search i
5040: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 62 75 74  n this case, but
5050: 20 69 74 20 69 73 20 61 6e 20 75 6e 75 73 75 61   it is an unusua
5060: 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20  l case. */.     
5070: 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 74       assert( mat
5080: 63 68 4f 74 68 65 72 3c 30 78 38 30 20 29 3b 20  chOther<0x80 ); 
5090: 20 2f 2a 20 27 5b 27 20 69 73 20 61 20 73 69 6e   /* '[' is a sin
50a0: 67 6c 65 2d 62 79 74 65 20 63 68 61 72 61 63 74  gle-byte charact
50b0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  er */.          
50c0: 77 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20  while( *zString 
50d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
50e0: 6e 74 20 62 4d 61 74 63 68 20 3d 20 70 61 74 74  nt bMatch = patt
50f0: 65 72 6e 43 6f 6d 70 61 72 65 28 26 7a 50 61 74  ernCompare(&zPat
5100: 74 65 72 6e 5b 2d 31 5d 2c 7a 53 74 72 69 6e 67  tern[-1],zString
5110: 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f 74 68 65  ,pInfo,matchOthe
5120: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
5130: 69 66 28 20 62 4d 61 74 63 68 21 3d 53 51 4c 49  if( bMatch!=SQLI
5140: 54 45 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65 74  TE_NOMATCH ) ret
5150: 75 72 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20 20  urn bMatch;.    
5160: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
5170: 4b 49 50 5f 55 54 46 38 28 7a 53 74 72 69 6e 67  KIP_UTF8(zString
5180: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
5190: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
51a0: 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52  SQLITE_NOWILDCAR
51b0: 44 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20  DMATCH;.        
51c0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
51d0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
51e0: 74 20 76 61 72 69 61 62 6c 65 20 63 20 63 6f 6e  t variable c con
51f0: 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20  tains the first 
5200: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
5210: 0a 20 20 20 20 20 20 2a 2a 20 70 61 74 74 65 72  .      ** patter
5220: 6e 20 73 74 72 69 6e 67 20 70 61 73 74 20 74 68  n string past th
5230: 65 20 22 2a 22 2e 20 20 53 65 61 72 63 68 20 69  e "*".  Search i
5240: 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  n the input stri
5250: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20  ng for the.     
5260: 20 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69   ** first matchi
5270: 6e 67 20 63 68 61 72 61 63 74 65 72 20 61 6e 64  ng character and
5280: 20 72 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6e   recursively con
5290: 74 69 6e 75 65 20 74 68 65 20 6d 61 74 63 68 20  tinue the match 
52a0: 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74 68  from.      ** th
52b0: 61 74 20 70 6f 69 6e 74 2e 0a 20 20 20 20 20 20  at point..      
52c0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
52d0: 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  a case-insensiti
52e0: 76 65 20 73 65 61 72 63 68 2c 20 73 65 74 20 76  ve search, set v
52f0: 61 72 69 61 62 6c 65 20 63 78 20 74 6f 20 62 65  ariable cx to be
5300: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 20   the same as.   
5310: 20 20 20 2a 2a 20 63 20 62 75 74 20 69 6e 20 74     ** c but in t
5320: 68 65 20 6f 74 68 65 72 20 63 61 73 65 20 61 6e  he other case an
5330: 64 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 70  d search the inp
5340: 75 74 20 73 74 72 69 6e 67 20 66 6f 72 20 65 69  ut string for ei
5350: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 20  ther.      ** c 
5360: 6f 72 20 63 78 2e 0a 20 20 20 20 20 20 2a 2f 0a  or cx..      */.
5370: 20 20 20 20 20 20 69 66 28 20 63 3c 3d 30 78 38        if( c<=0x8
5380: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
5390: 72 20 7a 53 74 6f 70 5b 33 5d 3b 0a 20 20 20 20  r zStop[3];.    
53a0: 20 20 20 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a      int bMatch;.
53b0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61          if( noCa
53c0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
53d0: 7a 53 74 6f 70 5b 30 5d 20 3d 20 73 71 6c 69 74  zStop[0] = sqlit
53e0: 65 33 54 6f 75 70 70 65 72 28 63 29 3b 0a 20 20  e3Toupper(c);.  
53f0: 20 20 20 20 20 20 20 20 7a 53 74 6f 70 5b 31 5d          zStop[1]
5400: 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65   = sqlite3Tolowe
5410: 72 28 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(c);.          
5420: 7a 53 74 6f 70 5b 32 5d 20 3d 20 30 3b 0a 20 20  zStop[2] = 0;.  
5430: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5440: 20 20 20 20 20 20 20 7a 53 74 6f 70 5b 30 5d 20         zStop[0] 
5450: 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  = c;.          z
5460: 53 74 6f 70 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  Stop[1] = 0;.   
5470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77       }.        w
5480: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 20  hile(1){.       
5490: 20 20 20 7a 53 74 72 69 6e 67 20 2b 3d 20 73 74     zString += st
54a0: 72 63 73 70 6e 28 28 63 6f 6e 73 74 20 63 68 61  rcspn((const cha
54b0: 72 2a 29 7a 53 74 72 69 6e 67 2c 20 7a 53 74 6f  r*)zString, zSto
54c0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
54d0: 28 20 7a 53 74 72 69 6e 67 5b 30 5d 3d 3d 30 20  ( zString[0]==0 
54e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
54f0: 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20 20     zString++;.  
5500: 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d          bMatch =
5510: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
5520: 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72 69 6e 67  zPattern,zString
5530: 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f 74 68 65  ,pInfo,matchOthe
5540: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
5550: 28 20 62 4d 61 74 63 68 21 3d 53 51 4c 49 54 45  ( bMatch!=SQLITE
5560: 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65 74 75 72  _NOMATCH ) retur
5570: 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20 20 20 20  n bMatch;.      
5580: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
5590: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4d 61  .        int bMa
55a0: 74 63 68 3b 0a 20 20 20 20 20 20 20 20 77 68 69  tch;.        whi
55b0: 6c 65 28 20 28 63 32 20 3d 20 55 74 66 38 52 65  le( (c2 = Utf8Re
55c0: 61 64 28 7a 53 74 72 69 6e 67 29 29 21 3d 30 20  ad(zString))!=0 
55d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
55e0: 20 63 32 21 3d 63 20 29 20 63 6f 6e 74 69 6e 75   c2!=c ) continu
55f0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61  e;.          bMa
5600: 74 63 68 20 3d 20 70 61 74 74 65 72 6e 43 6f 6d  tch = patternCom
5610: 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a 53  pare(zPattern,zS
5620: 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 6d 61 74 63  tring,pInfo,matc
5630: 68 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20  hOther);.       
5640: 20 20 20 69 66 28 20 62 4d 61 74 63 68 21 3d 53     if( bMatch!=S
5650: 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 20 29 20  QLITE_NOMATCH ) 
5660: 72 65 74 75 72 6e 20 62 4d 61 74 63 68 3b 0a 20  return bMatch;. 
5670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5680: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
5690: 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d  LITE_NOWILDCARDM
56a0: 41 54 43 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ATCH;.    }.    
56b0: 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 74 68 65  if( c==matchOthe
56c0: 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r ){.      if( p
56d0: 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3d 3d  Info->matchSet==
56e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  0 ){.        c =
56f0: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
5700: 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20  (&zPattern);.   
5710: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
5720: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5730: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20 7a  MATCH;.        z
5740: 45 73 63 61 70 65 64 20 3d 20 7a 50 61 74 74 65  Escaped = zPatte
5750: 72 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rn;.      }else{
5760: 0a 20 20 20 20 20 20 20 20 75 33 32 20 70 72 69  .        u32 pri
5770: 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
5780: 20 20 69 6e 74 20 73 65 65 6e 20 3d 20 30 3b 0a    int seen = 0;.
5790: 20 20 20 20 20 20 20 20 69 6e 74 20 69 6e 76 65          int inve
57a0: 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rt = 0;.        
57b0: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  c = sqlite3Utf8R
57c0: 65 61 64 28 26 7a 53 74 72 69 6e 67 29 3b 0a 20  ead(&zString);. 
57d0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
57e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
57f0: 4e 4f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20  NOMATCH;.       
5800: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
5810: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
5820: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  ;.        if( c2
5830: 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='^' ){.       
5840: 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20     invert = 1;. 
5850: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
5860: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
5870: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
5880: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5890: 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2==']' ){.     
58a0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20       if( c==']' 
58b0: 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ) seen = 1;.    
58c0: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
58d0: 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74  e3Utf8Read(&zPat
58e0: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tern);.        }
58f0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
5900: 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b  c2 && c2!=']' ){
5910: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
5920: 32 3d 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65  2=='-' && zPatte
5930: 72 6e 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 50  rn[0]!=']' && zP
5940: 61 74 74 65 72 6e 5b 30 5d 21 3d 30 20 26 26 20  attern[0]!=0 && 
5950: 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20  prior_c>0 ){.   
5960: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
5970: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
5980: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
5990: 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69        if( c>=pri
59a0: 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20  or_c && c<=c2 ) 
59b0: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
59c0: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
59d0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
59e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
59f0: 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20  if( c==c2 ){.   
5a00: 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20             seen 
5a10: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
5a20: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
5a30: 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20  rior_c = c2;.   
5a40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5a50: 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55     c2 = sqlite3U
5a60: 74 66 38 52 65 61 64 28 26 7a 50 61 74 74 65 72  tf8Read(&zPatter
5a70: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
5a80: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
5a90: 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72  || (seen ^ inver
5aa0: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
5ab0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5ac0: 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  _NOMATCH;.      
5ad0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6f 6e 74    }.        cont
5ae0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
5af0: 20 20 7d 0a 20 20 20 20 63 32 20 3d 20 55 74 66    }.    c2 = Utf
5b00: 38 52 65 61 64 28 7a 53 74 72 69 6e 67 29 3b 0a  8Read(zString);.
5b10: 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 20      if( c==c2 ) 
5b20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5b30: 28 20 6e 6f 43 61 73 65 20 20 26 26 20 73 71 6c  ( noCase  && sql
5b40: 69 74 65 33 54 6f 6c 6f 77 65 72 28 63 29 3d 3d  ite3Tolower(c)==
5b50: 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63  sqlite3Tolower(c
5b60: 32 29 20 26 26 20 63 3c 30 78 38 30 20 26 26 20  2) && c<0x80 && 
5b70: 63 32 3c 30 78 38 30 20 29 7b 0a 20 20 20 20 20  c2<0x80 ){.     
5b80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
5b90: 0a 20 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63  .    if( c==matc
5ba0: 68 4f 6e 65 20 26 26 20 7a 50 61 74 74 65 72 6e  hOne && zPattern
5bb0: 21 3d 7a 45 73 63 61 70 65 64 20 26 26 20 63 32  !=zEscaped && c2
5bc0: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
5bd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5be0: 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 7d 0a 20  E_NOMATCH;.  }. 
5bf0: 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67   return *zString
5c00: 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f 4d 41 54  ==0 ? SQLITE_MAT
5c10: 43 48 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 41  CH : SQLITE_NOMA
5c20: 54 43 48 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  TCH;.}../*.** Th
5c30: 65 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  e sqlite3_strglo
5c40: 62 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20 20  b() interface.  
5c50: 52 65 74 75 72 6e 20 30 20 6f 6e 20 61 20 6d 61  Return 0 on a ma
5c60: 74 63 68 20 28 6c 69 6b 65 20 73 74 72 63 6d 70  tch (like strcmp
5c70: 28 29 29 20 61 6e 64 0a 2a 2a 20 6e 6f 6e 2d 7a  ()) and.** non-z
5c80: 65 72 6f 20 69 66 20 74 68 65 72 65 20 69 73 20  ero if there is 
5c90: 6e 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e 74  no match..*/.int
5ca0: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
5cb0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c  (const char *zGl
5cc0: 6f 62 50 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74  obPattern, const
5cd0: 20 63 68 61 72 20 2a 7a 53 74 72 69 6e 67 29 7b   char *zString){
5ce0: 0a 20 20 72 65 74 75 72 6e 20 70 61 74 74 65 72  .  return patter
5cf0: 6e 43 6f 6d 70 61 72 65 28 28 75 38 2a 29 7a 47  nCompare((u8*)zG
5d00: 6c 6f 62 50 61 74 74 65 72 6e 2c 20 28 75 38 2a  lobPattern, (u8*
5d10: 29 7a 53 74 72 69 6e 67 2c 20 26 67 6c 6f 62 49  )zString, &globI
5d20: 6e 66 6f 2c 20 27 5b 27 29 3b 0a 7d 0a 0a 2f 2a  nfo, '[');.}../*
5d30: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
5d40: 73 74 72 6c 69 6b 65 28 29 20 69 6e 74 65 72 66  strlike() interf
5d50: 61 63 65 2e 20 20 52 65 74 75 72 6e 20 30 20 6f  ace.  Return 0 o
5d60: 6e 20 61 20 6d 61 74 63 68 20 61 6e 64 20 6e 6f  n a match and no
5d70: 6e 2d 7a 65 72 6f 20 66 6f 72 0a 2a 2a 20 61 20  n-zero for.** a 
5d80: 6d 69 73 73 20 2d 20 6c 69 6b 65 20 73 74 72 63  miss - like strc
5d90: 6d 70 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mp()..*/.int sql
5da0: 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 63 6f 6e  ite3_strlike(con
5db0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72  st char *zPatter
5dc0: 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  n, const char *z
5dd0: 53 74 72 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  Str, unsigned in
5de0: 74 20 65 73 63 29 7b 0a 20 20 72 65 74 75 72 6e  t esc){.  return
5df0: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
5e00: 28 75 38 2a 29 7a 50 61 74 74 65 72 6e 2c 20 28  (u8*)zPattern, (
5e10: 75 38 2a 29 7a 53 74 72 2c 20 26 6c 69 6b 65 49  u8*)zStr, &likeI
5e20: 6e 66 6f 4e 6f 72 6d 2c 20 65 73 63 29 3b 0a 7d  nfoNorm, esc);.}
5e30: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
5e40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
5e50: 73 20 74 68 61 74 20 74 68 65 20 4c 49 4b 45 20  s that the LIKE 
5e60: 6f 70 65 72 61 74 6f 72 20 28 6f 72 20 47 4c 4f  operator (or GLO
5e70: 42 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6a 75  B which is.** ju
5e80: 73 74 20 61 20 76 61 72 69 61 74 69 6f 6e 20 6f  st a variation o
5e90: 66 20 4c 49 4b 45 29 20 67 65 74 73 20 63 61 6c  f LIKE) gets cal
5ea0: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 75 73  led.  This is us
5eb0: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
5ec0: 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  * only..*/.#ifde
5ed0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
5ee0: 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  t sqlite3_like_c
5ef0: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
5f00: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  .../*.** Impleme
5f10: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
5f20: 69 6b 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ike() SQL functi
5f30: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
5f40: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  on implements.**
5f50: 20 74 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49   the build-in LI
5f60: 4b 45 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68  KE operator.  Th
5f70: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5f80: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
5f90: 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 74 74 65   is the.** patte
5fa0: 72 6e 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  rn and the secon
5fb0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
5fc0: 65 20 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20 74  e string.  So, t
5fd0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
5fe0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41  s:.**.**       A
5ff0: 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73   LIKE B.**.** is
6000: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
6010: 6c 69 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a  like(B,A)..**.**
6020: 20 54 68 69 73 20 73 61 6d 65 20 66 75 6e 63 74   This same funct
6030: 69 6f 6e 20 28 77 69 74 68 20 61 20 64 69 66 66  ion (with a diff
6040: 65 72 65 6e 74 20 63 6f 6d 70 61 72 65 49 6e 66  erent compareInf
6050: 6f 20 73 74 72 75 63 74 75 72 65 29 20 63 6f 6d  o structure) com
6060: 70 75 74 65 73 0a 2a 2a 20 74 68 65 20 47 4c 4f  putes.** the GLO
6070: 42 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  B operator..*/.s
6080: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46  tatic void likeF
6090: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
60a0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
60b0: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20   .  int argc, . 
60c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
60d0: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
60e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
60f0: 7a 41 2c 20 2a 7a 42 3b 0a 20 20 75 33 32 20 65  zA, *zB;.  u32 e
6100: 73 63 61 70 65 3b 0a 20 20 69 6e 74 20 6e 50 61  scape;.  int nPa
6110: 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
6120: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
6130: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
6140: 74 65 78 74 29 3b 0a 20 20 73 74 72 75 63 74 20  text);.  struct 
6150: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e  compareInfo *pIn
6160: 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  fo = sqlite3_use
6170: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
6180: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6190: 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43  LIKE_DOESNT_MATC
61a0: 48 5f 42 4c 4f 42 53 0a 20 20 69 66 28 20 73 71  H_BLOBS.  if( sq
61b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
61c0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
61d0: 45 5f 42 4c 4f 42 0a 20 20 20 7c 7c 20 73 71 6c  E_BLOB.   || sql
61e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
61f0: 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45  argv[1])==SQLITE
6200: 5f 42 4c 4f 42 0a 20 20 29 7b 0a 23 69 66 64 65  _BLOB.  ){.#ifde
6210: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
6220: 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63    sqlite3_like_c
6230: 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
6240: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6250: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 30  t_int(context, 0
6260: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
6270: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 42 20 3d   }.#endif.  zB =
6280: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6290: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
62a0: 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  zA = sqlite3_val
62b0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
62c0: 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74 68  ;..  /* Limit th
62d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
62e0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74  LIKE or GLOB pat
62f0: 74 65 72 6e 20 74 6f 20 61 76 6f 69 64 20 70 72  tern to avoid pr
6300: 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20 64  oblems.  ** of d
6310: 65 65 70 20 72 65 63 75 72 73 69 6f 6e 20 61 6e  eep recursion an
6320: 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20 69  d N*N behavior i
6330: 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  n patternCompare
6340: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 74 20  ()..  */.  nPat 
6350: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6360: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
6370: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 74    testcase( nPat
6380: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
6390: 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
63a0: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20 29  ATTERN_LENGTH] )
63b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
63c0: 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  at==db->aLimit[S
63d0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
63e0: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
63f0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 74  +1 );.  if( nPat
6400: 20 3e 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   > db->aLimit[SQ
6410: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
6420: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20  PATTERN_LENGTH] 
6430: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
6440: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
6450: 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20 47 4c  ext, "LIKE or GL
6460: 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f 20 63  OB pattern too c
6470: 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a 20 20  omplex", -1);.  
6480: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6490: 61 73 73 65 72 74 28 20 7a 42 3d 3d 73 71 6c 69  assert( zB==sqli
64a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
64b0: 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 45  rgv[0]) );  /* E
64c0: 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e 6f 74 20  ncoding did not 
64d0: 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20 69 66 28  change */..  if(
64e0: 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20   argc==3 ){.    
64f0: 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63 68  /* The escape ch
6500: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 6d  aracter string m
6510: 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 61  ust consist of a
6520: 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63 68   single UTF-8 ch
6530: 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20  aracter..    ** 
6540: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
6550: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
6560: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  */.    const uns
6570: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 73 63  igned char *zEsc
6580: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6590: 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a  _text(argv[2]);.
65a0: 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d 30 20      if( zEsc==0 
65b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
65c0: 28 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  ( sqlite3Utf8Cha
65d0: 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45 73 63  rLen((char*)zEsc
65e0: 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20 20 20  , -1)!=1 ){.    
65f0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6600: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
6610: 0a 20 20 20 20 20 20 20 20 20 20 22 45 53 43 41  .          "ESCA
6620: 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  PE expression mu
6630: 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
6640: 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29 3b 0a  haracter", -1);.
6650: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
6660: 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65 20 3d    }.    escape =
6670: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
6680: 28 26 7a 45 73 63 29 3b 0a 20 20 7d 65 6c 73 65  (&zEsc);.  }else
6690: 7b 0a 20 20 20 20 65 73 63 61 70 65 20 3d 20 70  {.    escape = p
66a0: 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3b 0a  Info->matchSet;.
66b0: 20 20 7d 0a 20 20 69 66 28 20 7a 41 20 26 26 20    }.  if( zA && 
66c0: 7a 42 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  zB ){.#ifdef SQL
66d0: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
66e0: 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b  ite3_like_count+
66f0: 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  +;.#endif.    sq
6700: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
6710: 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  (context,.      
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a  patternCompare(z
6740: 42 2c 20 7a 41 2c 20 70 49 6e 66 6f 2c 20 65 73  B, zA, pInfo, es
6750: 63 61 70 65 29 3d 3d 53 51 4c 49 54 45 5f 4d 41  cape)==SQLITE_MA
6760: 54 43 48 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  TCH);.  }.}../*.
6770: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
6780: 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46 28  n of the NULLIF(
6790: 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  x,y) function.  
67a0: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
67b0: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
67c0: 65 6e 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ent if the argum
67d0: 65 6e 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ents are differe
67e0: 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  nt.  The result 
67f0: 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a 2a  is NULL if the.*
6800: 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  * arguments are 
6810: 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20 6f 74  equal to each ot
6820: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  her..*/.static v
6830: 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28 0a  oid nullifFunc(.
6840: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6850: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
6860: 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c  t NotUsed,.  sql
6870: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6880: 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  v.){.  CollSeq *
6890: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
68a0: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f  etFuncCollSeq(co
68b0: 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44  ntext);.  UNUSED
68c0: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
68d0: 65 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ed);.  if( sqlit
68e0: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72 67  e3MemCompare(arg
68f0: 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20 70  v[0], argv[1], p
6900: 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Coll)!=0 ){.    
6910: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
6920: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
6930: 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  gv[0]);.  }.}../
6940: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
6950: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
6960: 65 5f 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63  e_version() func
6970: 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c  tion.  The resul
6980: 74 20 69 73 20 74 68 65 20 76 65 72 73 69 6f 6e  t is the version
6990: 0a 2a 2a 20 6f 66 20 74 68 65 20 53 51 4c 69 74  .** of the SQLit
69a0: 65 20 6c 69 62 72 61 72 79 20 74 68 61 74 20 69  e library that i
69b0: 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  s running..*/.st
69c0: 61 74 69 63 20 76 6f 69 64 20 76 65 72 73 69 6f  atic void versio
69d0: 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  nFunc(.  sqlite3
69e0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
69f0: 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64  t,.  int NotUsed
6a00: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
6a10: 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a  e **NotUsed2.){.
6a20: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6a30: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
6a40: 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50  Used2);.  /* IMP
6a50: 3a 20 52 2d 34 38 36 39 39 2d 34 38 36 31 37 20  : R-48699-48617 
6a60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6a70: 20 61 6e 20 53 51 4c 20 77 72 61 70 70 65 72 20   an SQL wrapper 
6a80: 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20  around the.  ** 
6a90: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
6aa0: 6f 6e 28 29 20 43 2d 69 6e 74 65 72 66 61 63 65  on() C-interface
6ab0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  . */.  sqlite3_r
6ac0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
6ad0: 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  xt, sqlite3_libv
6ae0: 65 72 73 69 6f 6e 28 29 2c 20 2d 31 2c 20 53 51  ersion(), -1, SQ
6af0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a  LITE_STATIC);.}.
6b00: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
6b10: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c  ation of the sql
6b20: 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 28 29 20  ite_source_id() 
6b30: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 72 65  function. The re
6b40: 73 75 6c 74 20 69 73 20 61 20 73 74 72 69 6e 67  sult is a string
6b50: 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69 66  .** that identif
6b60: 69 65 73 20 74 68 65 20 70 61 72 74 69 63 75 6c  ies the particul
6b70: 61 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ar version of th
6b80: 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 75 73  e source code us
6b90: 65 64 20 74 6f 20 62 75 69 6c 64 0a 2a 2a 20 53  ed to build.** S
6ba0: 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  QLite..*/.static
6bb0: 20 76 6f 69 64 20 73 6f 75 72 63 65 69 64 46 75   void sourceidFu
6bc0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
6bd0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
6be0: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
6bf0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6c00: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 55  *NotUsed2.){.  U
6c10: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
6c20: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
6c30: 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52  d2);.  /* IMP: R
6c40: 2d 32 34 34 37 30 2d 33 31 31 33 36 20 54 68 69  -24470-31136 Thi
6c50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
6c60: 20 53 51 4c 20 77 72 61 70 70 65 72 20 61 72 6f   SQL wrapper aro
6c70: 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  und the.  ** sql
6c80: 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 20  ite3_sourceid() 
6c90: 43 20 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f 0a  C interface. */.
6ca0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6cb0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  _text(context, s
6cc0: 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
6cd0: 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ), -1, SQLITE_ST
6ce0: 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ATIC);.}../*.** 
6cf0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
6d00: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6c 6f 67  f the sqlite_log
6d10: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  () function.  Th
6d20: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
6d30: 61 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  around.** sqlite
6d40: 33 5f 6c 6f 67 28 29 2e 20 20 54 68 65 20 72 65  3_log().  The re
6d50: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 4e 55  turn value is NU
6d60: 4c 4c 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f  LL.  The functio
6d70: 6e 20 65 78 69 73 74 73 20 70 75 72 65 6c 79 20  n exists purely 
6d80: 66 6f 72 0a 2a 2a 20 69 74 73 20 73 69 64 65 2d  for.** its side-
6d90: 65 66 66 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74  effects..*/.stat
6da0: 69 63 20 76 6f 69 64 20 65 72 72 6c 6f 67 46 75  ic void errlogFu
6db0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
6dc0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
6dd0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
6de0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
6df0: 67 76 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  gv.){.  UNUSED_P
6e00: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
6e10: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6e20: 45 52 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73  ER(context);.  s
6e30: 71 6c 69 74 65 33 5f 6c 6f 67 28 73 71 6c 69 74  qlite3_log(sqlit
6e40: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
6e50: 76 5b 30 5d 29 2c 20 22 25 73 22 2c 20 73 71 6c  v[0]), "%s", sql
6e60: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6e70: 61 72 67 76 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f 2a  argv[1]));.}../*
6e80: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
6e90: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
6ea0: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
6eb0: 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sed() function..
6ec0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
6ed0: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74   an integer that
6ee0: 20 69 64 65 6e 74 69 66 69 65 73 20 69 66 20 74   identifies if t
6ef0: 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  he compiler opti
6f00: 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 74  on.** was used t
6f10: 6f 20 62 75 69 6c 64 20 53 51 4c 69 74 65 2e 0a  o build SQLite..
6f20: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
6f30: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
6f40: 54 49 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74 69  TION_DIAGS.stati
6f50: 63 20 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f 70  c void compileop
6f60: 74 69 6f 6e 75 73 65 64 46 75 6e 63 28 0a 20 20  tionusedFunc(.  
6f70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6f80: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
6f90: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
6fa0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
6fb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
6fc0: 70 74 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  ptName;.  assert
6fd0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55  ( argc==1 );.  U
6fe0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6ff0: 61 72 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a  argc);.  /* IMP:
7000: 20 52 2d 33 39 35 36 34 2d 33 36 33 30 35 20 54   R-39564-36305 T
7010: 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c  he sqlite_compil
7020: 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 20 53  eoption_used() S
7030: 51 4c 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  QL.  ** function
7040: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
7050: 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33  ound the sqlite3
7060: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
7070: 73 65 64 28 29 20 43 2f 43 2b 2b 0a 20 20 2a 2a  sed() C/C++.  **
7080: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
7090: 20 20 69 66 28 20 28 7a 4f 70 74 4e 61 6d 65 20    if( (zOptName 
70a0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
70b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
70c0: 74 28 61 72 67 76 5b 30 5d 29 29 21 3d 30 20 29  t(argv[0]))!=0 )
70d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
70e0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
70f0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c  , sqlite3_compil
7100: 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 7a 4f 70  eoption_used(zOp
7110: 74 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 23  tName));.  }.}.#
7120: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7130: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
7140: 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a 0a  ON_DIAGS */../*.
7150: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
7160: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
7170: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
7180: 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  t() function. .*
7190: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
71a0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 64  a string that id
71b0: 65 6e 74 69 66 69 65 73 20 74 68 65 20 63 6f 6d  entifies the com
71c0: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 0a 2a  piler options .*
71d0: 2a 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  * used to build 
71e0: 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64  SQLite..*/.#ifnd
71f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
7200: 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
7210: 47 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  GS.static void c
7220: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74 46  ompileoptiongetF
7230: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
7240: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
7250: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
7260: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7270: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  rgv.){.  int n;.
7280: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
7290: 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
72a0: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
72b0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 39 32 32   /* IMP: R-04922
72c0: 2d 32 34 30 37 36 20 54 68 65 20 73 71 6c 69 74  -24076 The sqlit
72d0: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
72e0: 67 65 74 28 29 20 53 51 4c 20 66 75 6e 63 74 69  get() SQL functi
72f0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 77 72 61  on.  ** is a wra
7300: 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20  pper around the 
7310: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
7320: 70 74 69 6f 6e 5f 67 65 74 28 29 20 43 2f 43 2b  ption_get() C/C+
7330: 2b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  + function..  */
7340: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
7350: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d  alue_int(argv[0]
7360: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
7370: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
7380: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c  , sqlite3_compil
7390: 65 6f 70 74 69 6f 6e 5f 67 65 74 28 6e 29 2c 20  eoption_get(n), 
73a0: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
73b0: 43 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  C);.}.#endif /* 
73c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
73d0: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20  ILEOPTION_DIAGS 
73e0: 2a 2f 0a 0a 2f 2a 20 41 72 72 61 79 20 66 6f 72  */../* Array for
73f0: 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d   converting from
7400: 20 68 61 6c 66 2d 62 79 74 65 73 20 28 6e 79 62   half-bytes (nyb
7410: 62 6c 65 73 29 20 69 6e 74 6f 20 41 53 43 49 49  bles) into ASCII
7420: 20 68 65 78 0a 2a 2a 20 64 69 67 69 74 73 2e 20   hex.** digits. 
7430: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7440: 63 68 61 72 20 68 65 78 64 69 67 69 74 73 5b 5d  char hexdigits[]
7450: 20 3d 20 7b 0a 20 20 27 30 27 2c 20 27 31 27 2c   = {.  '0', '1',
7460: 20 27 32 27 2c 20 27 33 27 2c 20 27 34 27 2c 20   '2', '3', '4', 
7470: 27 35 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a 20  '5', '6', '7',. 
7480: 20 27 38 27 2c 20 27 39 27 2c 20 27 41 27 2c 20   '8', '9', 'A', 
7490: 27 42 27 2c 20 27 43 27 2c 20 27 44 27 2c 20 27  'B', 'C', 'D', '
74a0: 45 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f 2a 0a  E', 'F' .};../*.
74b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
74c0: 6e 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28 29  n of the QUOTE()
74d0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
74e0: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
74f0: 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67 75  a single.** argu
7500: 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72  ment.  If the ar
7510: 67 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72 69  gument is numeri
7520: 63 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  c, the return va
7530: 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  lue is the same 
7540: 61 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65  as.** the argume
7550: 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75  nt.  If the argu
7560: 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
7570: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
7580: 73 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  s the string.** 
7590: 22 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77 69  "NULL".  Otherwi
75a0: 73 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e 74  se, the argument
75b0: 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20   is enclosed in 
75c0: 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77 69  single quotes wi
75d0: 74 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75 6f  th.** single-quo
75e0: 74 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a 73  te escapes..*/.s
75f0: 74 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74 65  tatic void quote
7600: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
7610: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
7620: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
7630: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
7640: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
7650: 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
7660: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
7670: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
7680: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
7690: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65  [0]) ){.    case
76a0: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
76b0: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 31  .      double r1
76c0: 2c 20 72 32 3b 0a 20 20 20 20 20 20 63 68 61 72  , r2;.      char
76d0: 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 20   zBuf[50];.     
76e0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   r1 = sqlite3_va
76f0: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
7700: 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0]);.      sqlit
7710: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
7720: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
7730: 22 25 21 2e 31 35 67 22 2c 20 72 31 29 3b 0a 20  "%!.15g", r1);. 
7740: 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46       sqlite3AtoF
7750: 28 7a 42 75 66 2c 20 26 72 32 2c 20 32 30 2c 20  (zBuf, &r2, 20, 
7760: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
7770: 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
7780: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7790: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
77a0: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
77b0: 25 21 2e 32 30 65 22 2c 20 72 31 29 3b 0a 20 20  %!.20e", r1);.  
77c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
77d0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
77e0: 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d  context, zBuf, -
77f0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
7800: 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ENT);.      brea
7810: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7820: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
7830: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7840: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
7850: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29  ontext, argv[0])
7860: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7870: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
7880: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
7890: 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d     char *zText =
78a0: 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63   0;.      char c
78b0: 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73 71  onst *zBlob = sq
78c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
78d0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
78e0: 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c   int nBlob = sql
78f0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
7900: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
7910: 20 61 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d 3d   assert( zBlob==
7920: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
7930: 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 2f  ob(argv[0]) ); /
7940: 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68  * No encoding ch
7950: 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  ange */.      zT
7960: 65 78 74 20 3d 20 28 63 68 61 72 20 2a 29 63 6f  ext = (char *)co
7970: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
7980: 65 78 74 2c 20 28 32 2a 28 69 36 34 29 6e 42 6c  ext, (2*(i64)nBl
7990: 6f 62 29 2b 34 29 3b 20 0a 20 20 20 20 20 20 69  ob)+4); .      i
79a0: 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20 20  f( zText ){.    
79b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
79c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42     for(i=0; i<nB
79d0: 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lob; i++){.     
79e0: 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29       zText[(i*2)
79f0: 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b  +2] = hexdigits[
7a00: 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30 78  (zBlob[i]>>4)&0x
7a10: 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  0F];.          z
7a20: 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d 20  Text[(i*2)+3] = 
7a30: 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62  hexdigits[(zBlob
7a40: 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20 20  [i])&0x0F];.    
7a50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54      }.        zT
7a60: 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32 5d  ext[(nBlob*2)+2]
7a70: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
7a80: 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29   zText[(nBlob*2)
7a90: 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +3] = '\0';.    
7aa0: 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20 27      zText[0] = '
7ab0: 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78  X';.        zTex
7ac0: 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20  t[1] = '\'';.   
7ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7ae0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
7af0: 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51 4c  , zText, -1, SQL
7b00: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
7b10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7b20: 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20  free(zText);.   
7b30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7b50: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a   SQLITE_TEXT: {.
7b60: 20 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a 20        int i,j;. 
7b70: 20 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20 20       u64 n;.    
7b80: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
7b90: 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73 71   char *zArg = sq
7ba0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7bb0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
7bc0: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20 20   char *z;..     
7bd0: 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20 72   if( zArg==0 ) r
7be0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72  eturn;.      for
7bf0: 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67 5b  (i=0, n=0; zArg[
7c00: 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a 41  i]; i++){ if( zA
7c10: 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b  rg[i]=='\'' ) n+
7c20: 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 63  +; }.      z = c
7c30: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
7c40: 74 65 78 74 2c 20 28 28 69 36 34 29 69 29 2b 28  text, ((i64)i)+(
7c50: 28 69 36 34 29 6e 29 2b 33 29 3b 0a 20 20 20 20  (i64)n)+3);.    
7c60: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
7c70: 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b 0a     z[0] = '\'';.
7c80: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
7c90: 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20 69   j=1; zArg[i]; i
7ca0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ++){.          z
7cb0: 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d 3b  [j++] = zArg[i];
7cc0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
7cd0: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a  Arg[i]=='\'' ){.
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b              z[j+
7cf0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20  +] = '\'';.     
7d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
7d10: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
7d20: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
7d30: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[j] = 0;.      
7d40: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7d50: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
7d60: 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  , j, sqlite3_fre
7d70: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
7d80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7d90: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
7da0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
7db0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
7dc0: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
7dd0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71  NULL );.      sq
7de0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
7df0: 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c  t(context, "NULL
7e00: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41  ", 4, SQLITE_STA
7e10: 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  TIC);.      brea
7e20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
7e30: 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 63 6f 64  /*.** The unicod
7e40: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52  e() function.  R
7e50: 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65  eturn the intege
7e60: 72 20 75 6e 69 63 6f 64 65 20 63 6f 64 65 2d 70  r unicode code-p
7e70: 6f 69 6e 74 20 76 61 6c 75 65 0a 2a 2a 20 66 6f  oint value.** fo
7e80: 72 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  r the first char
7e90: 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e 70  acter of the inp
7ea0: 75 74 20 73 74 72 69 6e 67 2e 20 0a 2a 2f 0a 73  ut string. .*/.s
7eb0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 63 6f  tatic void unico
7ec0: 64 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  deFunc(.  sqlite
7ed0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7ee0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
7ef0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
7f00: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
7f10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
7f20: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  *z = sqlite3_val
7f30: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
7f40: 3b 0a 20 20 28 76 6f 69 64 29 61 72 67 63 3b 0a  ;.  (void)argc;.
7f50: 20 20 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d 20    if( z && z[0] 
7f60: 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ) sqlite3_result
7f70: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
7f80: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
7f90: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ));.}../*.** The
7fa0: 20 63 68 61 72 28 29 20 66 75 6e 63 74 69 6f 6e   char() function
7fb0: 20 74 61 6b 65 73 20 7a 65 72 6f 20 6f 72 20 6d   takes zero or m
7fc0: 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 65  ore arguments, e
7fd0: 61 63 68 20 6f 66 20 77 68 69 63 68 20 69 73 0a  ach of which is.
7fe0: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  ** an integer.  
7ff0: 49 74 20 63 6f 6e 73 74 72 75 63 74 73 20 61 20  It constructs a 
8000: 73 74 72 69 6e 67 20 77 68 65 72 65 20 65 61 63  string where eac
8010: 68 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  h character of t
8020: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  he string.** is 
8030: 74 68 65 20 75 6e 69 63 6f 64 65 20 63 68 61 72  the unicode char
8040: 61 63 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  acter for the co
8050: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 74 65  rresponding inte
8060: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ger argument..*/
8070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61  .static void cha
8080: 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  rFunc(.  sqlite3
8090: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
80a0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
80b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
80c0: 2a 61 72 67 76 0a 29 7b 0a 20 20 75 6e 73 69 67  *argv.){.  unsig
80d0: 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 4f  ned char *z, *zO
80e0: 75 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 7a  ut;.  int i;.  z
80f0: 4f 75 74 20 3d 20 7a 20 3d 20 73 71 6c 69 74 65  Out = z = sqlite
8100: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 61 72 67 63  3_malloc64( argc
8110: 2a 34 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d  *4+1 );.  if( z=
8120: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8130: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
8140: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
8150: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8160: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
8170: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
8180: 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 20  te3_int64 x;.   
8190: 20 75 6e 73 69 67 6e 65 64 20 63 3b 0a 20 20 20   unsigned c;.   
81a0: 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   x = sqlite3_val
81b0: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 69 5d  ue_int64(argv[i]
81c0: 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 30 20 7c  );.    if( x<0 |
81d0: 7c 20 78 3e 30 78 31 30 66 66 66 66 20 29 20 78  | x>0x10ffff ) x
81e0: 20 3d 20 30 78 66 66 66 64 3b 0a 20 20 20 20 63   = 0xfffd;.    c
81f0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 28 78 20   = (unsigned)(x 
8200: 26 20 30 78 31 66 66 66 66 66 29 3b 0a 20 20 20  & 0x1fffff);.   
8210: 20 69 66 28 20 63 3c 30 78 30 30 30 38 30 20 29   if( c<0x00080 )
8220: 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  {.      *zOut++ 
8230: 3d 20 28 75 38 29 28 63 26 30 78 46 46 29 3b 0a  = (u8)(c&0xFF);.
8240: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c      }else if( c<
8250: 30 78 30 30 38 30 30 20 29 7b 0a 20 20 20 20 20  0x00800 ){.     
8260: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 43 30 20   *zOut++ = 0xC0 
8270: 2b 20 28 75 38 29 28 28 63 3e 3e 36 29 26 30 78  + (u8)((c>>6)&0x
8280: 31 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74  1F);.      *zOut
8290: 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29  ++ = 0x80 + (u8)
82a0: 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20  (c & 0x3F);.    
82b0: 7d 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31 30  }else if( c<0x10
82c0: 30 30 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a 4f  000 ){.      *zO
82d0: 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28 75  ut++ = 0xE0 + (u
82e0: 38 29 28 28 63 3e 3e 31 32 29 26 30 78 30 46 29  8)((c>>12)&0x0F)
82f0: 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  ;.      *zOut++ 
8300: 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 28 63  = 0x80 + (u8)((c
8310: 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 0a 20 20  >>6) & 0x3F);.  
8320: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
8330: 38 30 20 2b 20 28 75 38 29 28 63 20 26 20 30 78  80 + (u8)(c & 0x
8340: 33 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  3F);.    }else{.
8350: 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20        *zOut++ = 
8360: 30 78 46 30 20 2b 20 28 75 38 29 28 28 63 3e 3e  0xF0 + (u8)((c>>
8370: 31 38 29 20 26 20 30 78 30 37 29 3b 0a 20 20 20  18) & 0x07);.   
8380: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38     *zOut++ = 0x8
8390: 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 31 32 29  0 + (u8)((c>>12)
83a0: 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20 20   & 0x3F);.      
83b0: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
83c0: 20 28 75 38 29 28 28 63 3e 3e 36 29 20 26 20 30   (u8)((c>>6) & 0
83d0: 78 33 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75  x3F);.      *zOu
83e0: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38  t++ = 0x80 + (u8
83f0: 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20  )(c & 0x3F);.   
8400: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 20 20 20 20 5c 0a 20 20 7d 0a 20 20 73 71        \.  }.  sq
8440: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
8450: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  t64(context, (ch
8460: 61 72 2a 29 7a 2c 20 7a 4f 75 74 2d 7a 2c 20 73  ar*)z, zOut-z, s
8470: 71 6c 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c  qlite3_free, SQL
8480: 49 54 45 5f 55 54 46 38 29 3b 0a 7d 0a 0a 2f 2a  ITE_UTF8);.}../*
8490: 0a 2a 2a 20 54 68 65 20 68 65 78 28 29 20 66 75  .** The hex() fu
84a0: 6e 63 74 69 6f 6e 2e 20 20 49 6e 74 65 72 70 72  nction.  Interpr
84b0: 65 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  et the argument 
84c0: 61 73 20 61 20 62 6c 6f 62 2e 20 20 52 65 74 75  as a blob.  Retu
84d0: 72 6e 0a 2a 2a 20 61 20 68 65 78 61 64 65 63 69  rn.** a hexadeci
84e0: 6d 61 6c 20 72 65 6e 64 65 72 69 6e 67 20 61 73  mal rendering as
84f0: 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   text..*/.static
8500: 20 76 6f 69 64 20 68 65 78 46 75 6e 63 28 0a 20   void hexFunc(. 
8510: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8520: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
8530: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
8540: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
8550: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63  .  int i, n;.  c
8560: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
8570: 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 63 68 61  ar *pBlob;.  cha
8580: 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a 20 20 61  r *zHex, *z;.  a
8590: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
85a0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
85b0: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 70 42  ETER(argc);.  pB
85c0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
85d0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
85e0: 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
85f0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
8600: 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[0]);.  assert(
8610: 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f   pBlob==sqlite3_
8620: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
8630: 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e  0]) );  /* No en
8640: 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f  coding change */
8650: 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20 63 6f  .  z = zHex = co
8660: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
8670: 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2a 32 20  ext, ((i64)n)*2 
8680: 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a 48 65 78  + 1);.  if( zHex
8690: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
86a0: 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42 6c 6f 62   i<n; i++, pBlob
86b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67  ++){.      unsig
86c0: 6e 65 64 20 63 68 61 72 20 63 20 3d 20 2a 70 42  ned char c = *pB
86d0: 6c 6f 62 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b  lob;.      *(z++
86e0: 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28 63  ) = hexdigits[(c
86f0: 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 20  >>4)&0xf];.     
8700: 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67   *(z++) = hexdig
8710: 69 74 73 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20  its[c&0xf];.    
8720: 7d 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20  }.    *z = 0;.  
8730: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8740: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
8750: 48 65 78 2c 20 6e 2a 32 2c 20 73 71 6c 69 74 65  Hex, n*2, sqlite
8760: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
8770: 2f 2a 0a 2a 2a 20 54 68 65 20 7a 65 72 6f 62 6c  /*.** The zerobl
8780: 6f 62 28 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72  ob(N) function r
8790: 65 74 75 72 6e 73 20 61 20 7a 65 72 6f 2d 66 69  eturns a zero-fi
87a0: 6c 6c 65 64 20 62 6c 6f 62 20 6f 66 20 73 69 7a  lled blob of siz
87b0: 65 20 4e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  e N bytes..*/.st
87c0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 62 6c  atic void zerobl
87d0: 6f 62 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  obFunc(.  sqlite
87e0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
87f0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
8800: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8810: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 36 34 20  **argv.){.  i64 
8820: 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  n;.  int rc;.  a
8830: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
8840: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
8850: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e 20  ETER(argc);.  n 
8860: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8870: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
8880: 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20    if( n<0 ) n = 
8890: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
88a0: 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f  3_result_zeroblo
88b0: 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b  b64(context, n);
88c0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 30 32 39 33   /* IMP: R-00293
88d0: 2d 36 34 39 39 34 20 2a 2f 0a 20 20 69 66 28 20  -64994 */.  if( 
88e0: 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
88f0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
8900: 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29  ode(context, rc)
8910: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
8920: 68 65 20 72 65 70 6c 61 63 65 28 29 20 66 75 6e  he replace() fun
8930: 63 74 69 6f 6e 2e 20 20 54 68 72 65 65 20 61 72  ction.  Three ar
8940: 67 75 6d 65 6e 74 73 20 61 72 65 20 61 6c 6c 20  guments are all 
8950: 73 74 72 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a  strings: call.**
8960: 20 74 68 65 6d 20 41 2c 20 42 2c 20 61 6e 64 20   them A, B, and 
8970: 43 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  C. The result is
8980: 20 61 6c 73 6f 20 61 20 73 74 72 69 6e 67 20 77   also a string w
8990: 68 69 63 68 20 69 73 20 64 65 72 69 76 65 64 0a  hich is derived.
89a0: 2a 2a 20 66 72 6f 6d 20 41 20 62 79 20 72 65 70  ** from A by rep
89b0: 6c 61 63 69 6e 67 20 65 76 65 72 79 20 6f 63 63  lacing every occ
89c0: 75 72 72 65 6e 63 65 20 6f 66 20 42 20 77 69 74  urrence of B wit
89d0: 68 20 43 2e 20 20 54 68 65 20 6d 61 74 63 68 0a  h C.  The match.
89e0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  ** must be exact
89f0: 2e 20 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  .  Collating seq
8a00: 75 65 6e 63 65 73 20 61 72 65 20 6e 6f 74 20 75  uences are not u
8a10: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
8a20: 6f 69 64 20 72 65 70 6c 61 63 65 46 75 6e 63 28  oid replaceFunc(
8a30: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
8a40: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
8a50: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
8a60: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
8a70: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
8a80: 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72 3b 20  ned char *zStr; 
8a90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
8aa0: 70 75 74 20 73 74 72 69 6e 67 20 41 20 2a 2f 0a  put string A */.
8ab0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
8ac0: 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b   char *zPattern;
8ad0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74 74 65      /* The patte
8ae0: 72 6e 20 73 74 72 69 6e 67 20 42 20 2a 2f 0a 20  rn string B */. 
8af0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8b00: 63 68 61 72 20 2a 7a 52 65 70 3b 20 20 20 20 20  char *zRep;     
8b10: 20 20 20 2f 2a 20 54 68 65 20 72 65 70 6c 61 63     /* The replac
8b20: 65 6d 65 6e 74 20 73 74 72 69 6e 67 20 43 20 2a  ement string C *
8b30: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8b40: 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20 20  r *zOut;        
8b50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74        /* The out
8b60: 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74  put */.  int nSt
8b70: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
8b80: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 53 74    /* Size of zSt
8b90: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74  r */.  int nPatt
8ba0: 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ern;            
8bb0: 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 50 61 74 74  /* Size of zPatt
8bc0: 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ern */.  int nRe
8bd0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
8be0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 52 65    /* Size of zRe
8bf0: 70 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 75 74 3b  p */.  i64 nOut;
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20  /* Maximum size 
8c20: 6f 66 20 7a 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  of zOut */.  int
8c30: 20 6c 6f 6f 70 4c 69 6d 69 74 3b 20 20 20 20 20   loopLimit;     
8c40: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 7a 53        /* Last zS
8c50: 74 72 5b 5d 20 74 68 61 74 20 6d 69 67 68 74 20  tr[] that might 
8c60: 6d 61 74 63 68 20 7a 50 61 74 74 65 72 6e 5b 5d  match zPattern[]
8c70: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c90: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
8ca0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 6e  */.  unsigned cn
8cb0: 74 45 78 70 61 6e 64 3b 20 20 20 20 20 20 2f 2a  tExpand;      /*
8cc0: 20 4e 75 6d 62 65 72 20 7a 4f 75 74 20 65 78 70   Number zOut exp
8cd0: 61 6e 73 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c  ansions */.  sql
8ce0: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
8cf0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
8d00: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 0a  ndle(context);..
8d10: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
8d20: 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  3 );.  UNUSED_PA
8d30: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
8d40: 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   zStr = sqlite3_
8d50: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8d60: 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 3d  0]);.  if( zStr=
8d70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e  =0 ) return;.  n
8d80: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Str = sqlite3_va
8d90: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
8da0: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53  ]);.  assert( zS
8db0: 74 72 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  tr==sqlite3_valu
8dc0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20  e_text(argv[0]) 
8dd0: 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69  );  /* No encodi
8de0: 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a  ng change */.  z
8df0: 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65  Pattern = sqlite
8e00: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8e10: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61  v[1]);.  if( zPa
8e20: 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ttern==0 ){.    
8e30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8e40: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
8e50: 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])==SQLITE_NULL
8e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
8e70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
8e80: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
8e90: 74 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  t)->mallocFailed
8ea0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
8eb0: 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74 74 65    }.  if( zPatte
8ec0: 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  rn[0]==0 ){.    
8ed0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8ee0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
8ef0: 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])!=SQLITE_NULL
8f00: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
8f10: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
8f20: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  text, argv[0]);.
8f30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8f40: 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73 71 6c    nPattern = sql
8f50: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8f60: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73  (argv[1]);.  ass
8f70: 65 72 74 28 20 7a 50 61 74 74 65 72 6e 3d 3d 73  ert( zPattern==s
8f80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8f90: 74 28 61 72 67 76 5b 31 5d 29 20 29 3b 20 20 2f  t(argv[1]) );  /
8fa0: 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68  * No encoding ch
8fb0: 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65 70 20 3d  ange */.  zRep =
8fc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8fd0: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
8fe0: 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20 72 65  if( zRep==0 ) re
8ff0: 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20 3d 20 73  turn;.  nRep = s
9000: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
9010: 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 61  es(argv[2]);.  a
9020: 73 73 65 72 74 28 20 7a 52 65 70 3d 3d 73 71 6c  ssert( zRep==sql
9030: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
9040: 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20 20 6e 4f  argv[2]) );.  nO
9050: 75 74 20 3d 20 6e 53 74 72 20 2b 20 31 3b 0a 20  ut = nStr + 1;. 
9060: 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3c 53 51   assert( nOut<SQ
9070: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
9080: 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63 6f 6e 74  );.  zOut = cont
9090: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
90a0: 74 2c 20 28 69 36 34 29 6e 4f 75 74 29 3b 0a 20  t, (i64)nOut);. 
90b0: 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a   if( zOut==0 ){.
90c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
90d0: 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e 53    loopLimit = nS
90e0: 74 72 20 2d 20 6e 50 61 74 74 65 72 6e 3b 20 20  tr - nPattern;  
90f0: 0a 20 20 63 6e 74 45 78 70 61 6e 64 20 3d 20 30  .  cntExpand = 0
9100: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
9110: 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b 2b  <=loopLimit; i++
9120: 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 74 72 5b  ){.    if( zStr[
9130: 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30 5d 20  i]!=zPattern[0] 
9140: 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74 72 5b  || memcmp(&zStr[
9150: 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50  i], zPattern, nP
9160: 61 74 74 65 72 6e 29 20 29 7b 0a 20 20 20 20 20  attern) ){.     
9170: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53 74   zOut[j++] = zSt
9180: 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  r[i];.    }else{
9190: 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 70 3e  .      if( nRep>
91a0: 6e 50 61 74 74 65 72 6e 20 29 7b 0a 20 20 20 20  nPattern ){.    
91b0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 6e 52 65 70      nOut += nRep
91c0: 20 2d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20   - nPattern;.   
91d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
91e0: 4f 75 74 2d 31 3d 3d 64 62 2d 3e 61 4c 69 6d 69  Out-1==db->aLimi
91f0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
9200: 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20 20  ENGTH] );.      
9210: 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 75 74    testcase( nOut
9220: 2d 32 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  -2==db->aLimit[S
9230: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
9240: 54 48 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69  TH] );.        i
9250: 66 28 20 6e 4f 75 74 2d 31 3e 64 62 2d 3e 61 4c  f( nOut-1>db->aL
9260: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
9270: 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
9280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
9290: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62  esult_error_toob
92a0: 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ig(context);.   
92b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
92c0: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
92d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
92e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
92f0: 6e 74 45 78 70 61 6e 64 2b 2b 3b 0a 20 20 20 20  ntExpand++;.    
9300: 20 20 20 20 69 66 28 20 28 63 6e 74 45 78 70 61      if( (cntExpa
9310: 6e 64 26 28 63 6e 74 45 78 70 61 6e 64 2d 31 29  nd&(cntExpand-1)
9320: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9330: 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 73 69    /* Grow the si
9340: 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ze of the output
9350: 20 62 75 66 66 65 72 20 6f 6e 6c 79 20 6f 6e 20   buffer only on 
9360: 73 75 62 73 74 69 74 75 74 69 6f 6e 73 0a 20 20  substitutions.  
9370: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 6f 73 65          ** whose
9380: 20 69 6e 64 65 78 20 69 73 20 61 20 70 6f 77 65   index is a powe
9390: 72 20 6f 66 20 74 77 6f 3a 20 31 2c 20 32 2c 20  r of two: 1, 2, 
93a0: 34 2c 20 38 2c 20 31 36 2c 20 33 32 2c 20 2e 2e  4, 8, 16, 32, ..
93b0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75  . */.          u
93c0: 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20 20  8 *zOld;.       
93d0: 20 20 20 7a 4f 6c 64 20 3d 20 7a 4f 75 74 3b 0a     zOld = zOut;.
93e0: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 20 3d            zOut =
93f0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
9400: 36 34 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e 4f  64(zOut, (int)nO
9410: 75 74 20 2b 20 28 6e 4f 75 74 20 2d 20 6e 53 74  ut + (nOut - nSt
9420: 72 20 2d 20 31 29 29 3b 0a 20 20 20 20 20 20 20  r - 1));.       
9430: 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29     if( zOut==0 )
9440: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
9450: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
9460: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
9470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
9480: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64  qlite3_free(zOld
9490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
94a0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
94b0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
94c0: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
94d0: 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65 70  y(&zOut[j], zRep
94e0: 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20 6a  , nRep);.      j
94f0: 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20 20   += nRep;.      
9500: 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31 3b  i += nPattern-1;
9510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
9520: 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31 3c  ert( j+nStr-i+1<
9530: 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63 70  =nOut );.  memcp
9540: 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53 74  y(&zOut[j], &zSt
9550: 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a 20  r[i], nStr-i);. 
9560: 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b 0a   j += nStr - i;.
9570: 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f 75    assert( j<=nOu
9580: 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d  t );.  zOut[j] =
9590: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
95a0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
95b0: 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20  t, (char*)zOut, 
95c0: 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  j, sqlite3_free)
95d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
95e0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
95f0: 20 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28 29   TRIM(), LTRIM()
9600: 2c 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66 75  , and RTRIM() fu
9610: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20  nctions..** The 
9620: 75 73 65 72 64 61 74 61 20 69 73 20 30 78 31 20  userdata is 0x1 
9630: 66 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20 30  for left trim, 0
9640: 78 32 20 66 6f 72 20 72 69 67 68 74 20 74 72 69  x2 for right tri
9650: 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68 2e  m, 0x3 for both.
9660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9670: 74 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69  trimFunc(.  sqli
9680: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
9690: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
96a0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
96b0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
96c0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
96d0: 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20 20  r *zIn;         
96e0: 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20  /* Input string 
96f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  */.  const unsig
9700: 6e 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72 53  ned char *zCharS
9710: 65 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f 66  et;    /* Set of
9720: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 74   characters to t
9730: 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  rim */.  int nIn
9740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9760: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
9770: 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20   input */.  int 
9780: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
97a0: 20 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32 3a   1: trimleft  2:
97b0: 20 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20 74   trimright  3: t
97c0: 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rim */.  int i; 
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
97f0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9800: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
9810: 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Len = 0;        
9820: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 65    /* Length of e
9830: 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e  ach character in
9840: 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 75   zCharSet */.  u
9850: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 61  nsigned char **a
9860: 7a 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20  zChar = 0;      
9870: 20 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20 63   /* Individual c
9880: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68  haracters in zCh
9890: 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  arSet */.  int n
98a0: 43 68 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  Char;           
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98c0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
98d0: 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65 74  ters in zCharSet
98e0: 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
98f0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
9900: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
9910: 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
9920: 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20 73  n;.  }.  zIn = s
9930: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
9940: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
9950: 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72  ( zIn==0 ) retur
9960: 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74  n;.  nIn = sqlit
9970: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
9980: 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[0]);.  asser
9990: 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33 5f  t( zIn==sqlite3_
99a0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
99b0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72 67  0]) );.  if( arg
99c0: 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61 74  c==1 ){.    stat
99d0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
99e0: 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d 20  d char lenOne[] 
99f0: 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74 61  = { 1 };.    sta
9a00: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
9a10: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f 6e 65 5b  r * const azOne[
9a20: 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20 7d  ] = { (u8*)" " }
9a30: 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31 3b  ;.    nChar = 1;
9a40: 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38 2a  .    aLen = (u8*
9a50: 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a 43  )lenOne;.    azC
9a60: 68 61 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  har = (unsigned 
9a70: 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a 20  char **)azOne;. 
9a80: 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20 30 3b     zCharSet = 0;
9a90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 43  .  }else if( (zC
9aa0: 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74 65 33  harSet = sqlite3
9ab0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9ac0: 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  [1]))==0 ){.    
9ad0: 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b  return;.  }else{
9ae0: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
9af0: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  ned char *z;.   
9b00: 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c   for(z=zCharSet,
9b10: 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43   nChar=0; *z; nC
9b20: 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51  har++){.      SQ
9b30: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
9b40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9b50: 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20   nChar>0 ){.    
9b60: 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e 74 65    azChar = conte
9b70: 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74  xtMalloc(context
9b80: 2c 20 28 28 69 36 34 29 6e 43 68 61 72 29 2a 28  , ((i64)nChar)*(
9b90: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31 29  sizeof(char*)+1)
9ba0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43  );.      if( azC
9bb0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  har==0 ){.      
9bc0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
9bd0: 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20 28  }.      aLen = (
9be0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
9bf0: 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a 20  azChar[nChar];. 
9c00: 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72       for(z=zChar
9c10: 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a  Set, nChar=0; *z
9c20: 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; nChar++){.    
9c30: 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61 72      azChar[nChar
9c40: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
9c50: 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20 20 20  ar *)z;.        
9c60: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
9c70: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c 65  (z);.        aLe
9c80: 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75 38 29 28  n[nChar] = (u8)(
9c90: 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61 72  z - azChar[nChar
9ca0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
9cb0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68 61  }.  }.  if( nCha
9cc0: 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  r>0 ){.    flags
9cd0: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
9ce0: 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f 75 73 65  _INT(sqlite3_use
9cf0: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 29  r_data(context))
9d00: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  ;.    if( flags 
9d10: 26 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68 69  & 1 ){.      whi
9d20: 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  le( nIn>0 ){.   
9d30: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30       int len = 0
9d40: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
9d50: 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
9d60: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20  {.          len 
9d70: 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20  = aLen[i];.     
9d80: 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49       if( len<=nI
9d90: 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a 49 6e 2c  n && memcmp(zIn,
9da0: 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e 29   azChar[i], len)
9db0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
9dc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
9dd0: 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62 72  f( i>=nChar ) br
9de0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49 6e  eak;.        zIn
9df0: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20   += len;.       
9e00: 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20   nIn -= len;.   
9e10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9e20: 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b 0a  f( flags & 2 ){.
9e30: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e        while( nIn
9e40: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
9e50: 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  t len = 0;.     
9e60: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
9e70: 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  har; i++){.     
9e80: 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b       len = aLen[
9e90: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
9ea0: 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65  ( len<=nIn && me
9eb0: 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c 65  mcmp(&zIn[nIn-le
9ec0: 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65 6e  n],azChar[i],len
9ed0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
9ee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9ef0: 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62  if( i>=nChar ) b
9f00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e 49  reak;.        nI
9f10: 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  n -= len;.      
9f20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9f30: 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20 20  zCharSet ){.    
9f40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
9f50: 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  zChar);.    }.  
9f60: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
9f70: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
9f80: 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49 6e   (char*)zIn, nIn
9f90: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
9fa0: 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  NT);.}...#ifdef 
9fb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
9fc0: 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49  KNOWN_SQL_FUNCTI
9fd0: 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 75 6e  ON./*.** The "un
9fe0: 6b 6e 6f 77 6e 22 20 66 75 6e 63 74 69 6f 6e 20  known" function 
9ff0: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
a000: 20 73 75 62 73 74 69 74 75 74 65 64 20 69 6e 20   substituted in 
a010: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 6e 79 20  place of.** any 
a020: 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 66 75 6e  unrecognized fun
a030: 63 74 69 6f 6e 20 6e 61 6d 65 20 77 68 65 6e 20  ction name when 
a040: 64 6f 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e  doing an EXPLAIN
a050: 20 6f 72 20 45 58 50 4c 41 49 4e 20 51 55 45 52   or EXPLAIN QUER
a060: 59 20 50 4c 41 4e 0a 2a 2a 20 77 68 65 6e 20 74  Y PLAN.** when t
a070: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
a080: 5f 55 4e 4b 4e 4f 57 4e 5f 46 55 4e 43 54 49 4f  _UNKNOWN_FUNCTIO
a090: 4e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  N compile-time o
a0a0: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
a0b0: 2a 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69  * When the "sqli
a0c0: 74 65 33 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  te3" command-lin
a0d0: 65 20 73 68 65 6c 6c 20 69 73 20 62 75 69 6c 74  e shell is built
a0e0: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
a0f0: 74 69 6f 6e 61 6c 69 74 79 2c 0a 2a 2a 20 74 68  tionality,.** th
a100: 61 74 20 61 6c 6c 6f 77 73 20 61 6e 20 45 58 50  at allows an EXP
a110: 4c 41 49 4e 20 6f 72 20 45 58 50 4c 41 49 4e 20  LAIN or EXPLAIN 
a120: 51 55 45 52 59 20 50 4c 41 4e 20 66 6f 72 20 63  QUERY PLAN for c
a130: 6f 6d 70 6c 65 78 20 71 75 65 72 69 65 73 0a 2a  omplex queries.*
a140: 2a 20 69 6e 76 6f 6c 76 69 6e 67 20 61 70 70 6c  * involving appl
a150: 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  ication-defined 
a160: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
a170: 65 78 61 6d 69 6e 65 64 20 69 6e 20 61 20 67 65  examined in a ge
a180: 6e 65 72 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  neric.** sqlite3
a190: 20 73 68 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69   shell..*/.stati
a1a0: 63 20 76 6f 69 64 20 75 6e 6b 6e 6f 77 6e 46 75  c void unknownFu
a1b0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
a1c0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
a1d0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
a1e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
a1f0: 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  gv.){.  /* no-op
a200: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 53   */.}.#endif /*S
a210: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b  QLITE_ENABLE_UNK
a220: 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f  NOWN_SQL_FUNCTIO
a230: 4e 2a 2f 0a 0a 0a 2f 2a 20 49 4d 50 3a 20 52 2d  N*/.../* IMP: R-
a240: 32 35 33 36 31 2d 31 36 31 35 30 20 54 68 69 73  25361-16150 This
a250: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6d 69   function is omi
a260: 74 74 65 64 20 66 72 6f 6d 20 53 51 4c 69 74 65  tted from SQLite
a270: 20 62 79 20 64 65 66 61 75 6c 74 2e 20 49 74 0a   by default. It.
a280: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ** is only avail
a290: 61 62 6c 65 20 69 66 20 74 68 65 20 53 51 4c 49  able if the SQLI
a2a0: 54 45 5f 53 4f 55 4e 44 45 58 20 63 6f 6d 70 69  TE_SOUNDEX compi
a2b0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
a2c0: 73 20 75 73 65 64 0a 2a 2a 20 77 68 65 6e 20 53  s used.** when S
a2d0: 51 4c 69 74 65 20 69 73 20 62 75 69 6c 74 2e 0a  QLite is built..
a2e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
a2f0: 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 43  _SOUNDEX./*.** C
a300: 6f 6d 70 75 74 65 20 74 68 65 20 73 6f 75 6e 64  ompute the sound
a310: 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  ex encoding of a
a320: 20 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50   word..**.** IMP
a330: 3a 20 52 2d 35 39 37 38 32 2d 30 30 30 37 32 20  : R-59782-00072 
a340: 54 68 65 20 73 6f 75 6e 64 65 78 28 58 29 20 66  The soundex(X) f
a350: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
a360: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
a370: 20 74 68 65 0a 2a 2a 20 73 6f 75 6e 64 65 78 20   the.** soundex 
a380: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  encoding of the 
a390: 73 74 72 69 6e 67 20 58 2e 20 0a 2a 2f 0a 73 74  string X. .*/.st
a3a0: 61 74 69 63 20 76 6f 69 64 20 73 6f 75 6e 64 65  atic void sounde
a3b0: 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  xFunc(.  sqlite3
a3c0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
a3d0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
a3e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
a3f0: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20  *argv.){.  char 
a400: 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20 63 6f  zResult[8];.  co
a410: 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20 20 69  nst u8 *zIn;.  i
a420: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74 69  nt i, j;.  stati
a430: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
a440: 20 63 68 61 72 20 69 43 6f 64 65 5b 5d 20 3d 20   char iCode[] = 
a450: 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  {.    0, 0, 0, 0
a460: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a470: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a480: 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20  0, 0,.    0, 0, 
a490: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a4a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a4b0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c   0, 0, 0,.    0,
a4c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a4d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a4e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
a4f0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a500: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a510: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a520: 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32  ,.    0, 0, 1, 2
a530: 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c  , 3, 0, 1, 2, 0,
a540: 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20   0, 2, 2, 4, 5, 
a550: 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20  5, 0,.    1, 2, 
a560: 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30  6, 2, 3, 0, 1, 0
a570: 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c  , 2, 0, 2, 0, 0,
a580: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c   0, 0, 0,.    0,
a590: 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20   0, 1, 2, 3, 0, 
a5a0: 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32  1, 2, 0, 0, 2, 2
a5b0: 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20  , 4, 5, 5, 0,.  
a5c0: 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c    1, 2, 6, 2, 3,
a5d0: 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20   0, 1, 0, 2, 0, 
a5e0: 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  2, 0, 0, 0, 0, 0
a5f0: 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74 28  ,.  };.  assert(
a600: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a 49   argc==1 );.  zI
a610: 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  n = (u8*)sqlite3
a620: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
a630: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 3d  [0]);.  if( zIn=
a640: 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75 38 2a 29  =0 ) zIn = (u8*)
a650: 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a  "";.  for(i=0; z
a660: 49 6e 5b 69 5d 20 26 26 20 21 73 71 6c 69 74 65  In[i] && !sqlite
a670: 33 49 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d 29  3Isalpha(zIn[i])
a680: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a  ; i++){}.  if( z
a690: 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75 38 20  In[i] ){.    u8 
a6a0: 70 72 65 76 63 6f 64 65 20 3d 20 69 43 6f 64 65  prevcode = iCode
a6b0: 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a 20  [zIn[i]&0x7f];. 
a6c0: 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20 3d 20     zResult[0] = 
a6d0: 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 7a  sqlite3Toupper(z
a6e0: 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f 72 28  In[i]);.    for(
a6f0: 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49 6e 5b  j=1; j<4 && zIn[
a700: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
a710: 69 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f 64 65  int code = iCode
a720: 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a 20  [zIn[i]&0x7f];. 
a730: 20 20 20 20 20 69 66 28 20 63 6f 64 65 3e 30 20       if( code>0 
a740: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
a750: 6f 64 65 21 3d 70 72 65 76 63 6f 64 65 20 29 7b  ode!=prevcode ){
a760: 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63  .          prevc
a770: 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20 20 20  ode = code;.    
a780: 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b        zResult[j+
a790: 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30 27 3b  +] = code + '0';
a7a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a7b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a7c0: 70 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a 20 20  prevcode = 0;.  
a7d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a7e0: 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a 20 20  while( j<4 ){.  
a7f0: 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d      zResult[j++]
a800: 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a 20 20   = '0';.    }.  
a810: 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d 20 30    zResult[j] = 0
a820: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
a830: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
a840: 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c 20 53  t, zResult, 4, S
a850: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
a860: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
a870: 2a 20 49 4d 50 3a 20 52 2d 36 34 38 39 34 2d 35  * IMP: R-64894-5
a880: 30 33 32 31 20 54 68 65 20 73 74 72 69 6e 67 20  0321 The string 
a890: 22 3f 30 30 30 22 20 69 73 20 72 65 74 75 72 6e  "?000" is return
a8a0: 65 64 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  ed if the argume
a8b0: 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c  nt.    ** is NUL
a8c0: 4c 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  L or contains no
a8d0: 20 41 53 43 49 49 20 61 6c 70 68 61 62 65 74 69   ASCII alphabeti
a8e0: 63 20 63 68 61 72 61 63 74 65 72 73 2e 20 2a 2f  c characters. */
a8f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
a900: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
a910: 2c 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51 4c  , "?000", 4, SQL
a920: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
a930: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
a940: 49 54 45 5f 53 4f 55 4e 44 45 58 20 2a 2f 0a 0a  ITE_SOUNDEX */..
a950: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a960: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
a970: 4f 4e 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63 74  ON./*.** A funct
a980: 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 73 20 61  ion that loads a
a990: 20 73 68 61 72 65 64 2d 6c 69 62 72 61 72 79 20   shared-library 
a9a0: 65 78 74 65 6e 73 69 6f 6e 20 74 68 65 6e 20 72  extension then r
a9b0: 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  eturns NULL..*/.
a9c0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61 64  static void load
a9d0: 45 78 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  Ext(sqlite3_cont
a9e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
a9f0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
aa00: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
aa10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
aa20: 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
aa30: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
aa40: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
aa50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
aa60: 72 6f 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  roc;.  sqlite3 *
aa70: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
aa80: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
aa90: 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72 20  ontext);.  char 
aaa0: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  *zErrMsg = 0;.. 
aab0: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74 68 65   /* Disallow the
aac0: 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28   load_extension(
aad0: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 75  ) SQL function u
aae0: 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 49 54 45  nless the SQLITE
aaf0: 5f 4c 6f 61 64 45 78 74 46 75 6e 63 0a 20 20 2a  _LoadExtFunc.  *
ab00: 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20  * flag is set.  
ab10: 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  See the sqlite3_
ab20: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
ab30: 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a  nsion() API..  *
ab40: 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  /.  if( (db->fla
ab50: 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 6f 61 64  gs & SQLITE_Load
ab60: 45 78 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a 20  ExtFunc)==0 ){. 
ab70: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
ab80: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
ab90: 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64   "not authorized
aba0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  ", -1);.    retu
abb0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61  rn;.  }..  if( a
abc0: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50  rgc==2 ){.    zP
abd0: 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  roc = (const cha
abe0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
abf0: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
ac00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50  .  }else{.    zP
ac10: 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  roc = 0;.  }.  i
ac20: 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c 69  f( zFile && sqli
ac30: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
ac40: 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  on(db, zFile, zP
ac50: 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20 29  roc, &zErrMsg) )
ac60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
ac70: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
ac80: 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29  xt, zErrMsg, -1)
ac90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
aca0: 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  ee(zErrMsg);.  }
acb0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
acc0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
acd0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
ace0: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74  tructure holds t
acf0: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a  he context of a.
ad00: 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28  ** sum() or avg(
ad10: 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70  ) aggregate comp
ad20: 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  utation..*/.type
ad30: 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43 74  def struct SumCt
ad40: 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74  x SumCtx;.struct
ad50: 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62   SumCtx {.  doub
ad60: 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a  le rSum;      /*
ad70: 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   Floating point 
ad80: 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 75  sum */.  i64 iSu
ad90: 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  m;         /* In
ada0: 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a  teger sum */   .
adb0: 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20 20    i64 cnt;      
adc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
add0: 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64   elements summed
ade0: 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f   */.  u8 overflo
adf0: 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w;      /* True 
ae00: 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  if integer overf
ae10: 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38  low seen */.  u8
ae20: 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20 20   approx;        
ae30: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69  /* True if non-i
ae40: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 61 73  nteger value was
ae50: 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73 75   input to the su
ae60: 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  m */.};../*.** R
ae70: 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20  outines used to 
ae80: 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d 2c  compute the sum,
ae90: 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74 6f   average, and to
aea0: 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  tal..**.** The S
aeb0: 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  UM() function fo
aec0: 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b 65  llows the (broke
aed0: 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64 20  n) SQL standard 
aee0: 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74  which means.** t
aef0: 68 61 74 20 69 74 20 72 65 74 75 72 6e 73 20 4e  hat it returns N
af00: 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20 6f  ULL if it sums o
af10: 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20  ver no inputs.  
af20: 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a  TOTAL returns.**
af30: 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61 73   0.0 in that cas
af40: 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c  e.  In addition,
af50: 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72 65   TOTAL always re
af60: 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77 68  turns a float wh
af70: 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74  ere.** SUM might
af80: 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   return an integ
af90: 65 72 20 69 66 20 69 74 20 6e 65 76 65 72 20 65  er if it never e
afa0: 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f 61  ncounters a floa
afb0: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
afc0: 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65  lue.  TOTAL neve
afd0: 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55 4d  r fails, but SUM
afe0: 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20 61   might through a
aff0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a  n exception if.*
b000: 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20 61  * it overflows a
b010: 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  n integer..*/.st
b020: 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74 65  atic void sumSte
b030: 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  p(sqlite3_contex
b040: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
b050: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
b060: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53  lue **argv){.  S
b070: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20  umCtx *p;.  int 
b080: 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28 20  type;.  assert( 
b090: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
b0a0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
b0b0: 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  gc);.  p = sqlit
b0c0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
b0d0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
b0e0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79 70  zeof(*p));.  typ
b0f0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
b100: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
b110: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70  rgv[0]);.  if( p
b120: 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54 45   && type!=SQLITE
b130: 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e  _NULL ){.    p->
b140: 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74  cnt++;.    if( t
b150: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
b160: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36 34  GER ){.      i64
b170: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
b180: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
b190: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d  );.      p->rSum
b1a0: 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66 28   += v;.      if(
b1b0: 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f   (p->approx|p->o
b1c0: 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20 73  verflow)==0 && s
b1d0: 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26  qlite3AddInt64(&
b1e0: 70 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b 0a 20  p->iSum, v) ){. 
b1f0: 20 20 20 20 20 20 20 70 2d 3e 61 70 70 72 6f 78         p->approx
b200: 20 3d 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 3d   = p->overflow =
b210: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
b220: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
b230: 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  rSum += sqlite3_
b240: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
b250: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  v[0]);.      p->
b260: 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20 20  approx = 1;.    
b270: 7d 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64 65 66 20  }.  }.}.#ifndef 
b280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
b290: 4f 57 46 55 4e 43 0a 73 74 61 74 69 63 20 76 6f  OWFUNC.static vo
b2a0: 69 64 20 73 75 6d 49 6e 76 65 72 73 65 28 73 71  id sumInverse(sq
b2b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
b2c0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
b2d0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
b2e0: 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43 74 78  *argv){.  SumCtx
b2f0: 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70 65 3b   *p;.  int type;
b300: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
b310: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
b320: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
b330: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
b340: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
b350: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
b360: 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 73  *p));.  type = s
b370: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
b380: 65 72 69 63 5f 74 79 70 65 28 61 72 67 76 5b 30  eric_type(argv[0
b390: 5d 29 3b 0a 20 20 2f 2a 20 70 20 69 73 20 61 6c  ]);.  /* p is al
b3a0: 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 65  ways non-NULL be
b3b0: 63 61 75 73 65 20 73 75 6d 53 74 65 70 28 29 20  cause sumStep() 
b3c0: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63  will have been c
b3d0: 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 20 2a 2a  alled first.  **
b3e0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 69   to initialize i
b3f0: 74 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  t */.  if( ALWAY
b400: 53 28 70 29 20 26 26 20 74 79 70 65 21 3d 53 51  S(p) && type!=SQ
b410: 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
b420: 20 61 73 73 65 72 74 28 20 70 2d 3e 63 6e 74 3e   assert( p->cnt>
b430: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 63 6e 74 2d  0 );.    p->cnt-
b440: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74  -;.    assert( t
b450: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
b460: 47 45 52 20 7c 7c 20 70 2d 3e 61 70 70 72 6f 78  GER || p->approx
b470: 20 29 3b 0a 20 20 20 20 69 66 28 20 74 79 70 65   );.    if( type
b480: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
b490: 20 26 26 20 70 2d 3e 61 70 70 72 6f 78 3d 3d 30   && p->approx==0
b4a0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 20   ){.      i64 v 
b4b0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
b4c0: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
b4d0: 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2d 3d        p->rSum -=
b4e0: 20 76 3b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75   v;.      p->iSu
b4f0: 6d 20 2d 3d 20 76 3b 0a 20 20 20 20 7d 65 6c 73  m -= v;.    }els
b500: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d  e{.      p->rSum
b510: 20 2d 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   -= sqlite3_valu
b520: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d  e_double(argv[0]
b530: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
b540: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 75  else.# define su
b550: 6d 49 6e 76 65 72 73 65 20 30 0a 23 65 6e 64 69  mInverse 0.#endi
b560: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b570: 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 73  _WINDOWFUNC */.s
b580: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69  tatic void sumFi
b590: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
b5a0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
b5b0: 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20  {.  SumCtx *p;. 
b5c0: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
b5d0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
b5e0: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66  ontext, 0);.  if
b5f0: 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20  ( p && p->cnt>0 
b600: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 76  ){.    if( p->ov
b610: 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
b620: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
b630: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69 6e  rror(context,"in
b640: 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c  teger overflow",
b650: 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  -1);.    }else i
b660: 66 28 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b 0a  f( p->approx ){.
b670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
b680: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
b690: 65 78 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a 20  ext, p->rSum);. 
b6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b6b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
b6c0: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d  nt64(context, p-
b6d0: 3e 69 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  >iSum);.    }.  
b6e0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
b6f0: 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  avgFinalize(sqli
b700: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
b710: 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20  text){.  SumCtx 
b720: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
b730: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
b740: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
b750: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63  .  if( p && p->c
b760: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  nt>0 ){.    sqli
b770: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
b780: 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53  e(context, p->rS
b790: 75 6d 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e  um/(double)p->cn
b7a0: 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
b7b0: 20 76 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61 6c   void totalFinal
b7c0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
b7d0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
b7e0: 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20   SumCtx *p;.  p 
b7f0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
b800: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
b810: 65 78 74 2c 20 30 29 3b 0a 20 20 2f 2a 20 28 64  ext, 0);.  /* (d
b820: 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20  ouble)0 In case 
b830: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
b840: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
b850: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   */.  sqlite3_re
b860: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
b870: 65 78 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75 6d  ext, p ? p->rSum
b880: 20 3a 20 28 64 6f 75 62 6c 65 29 30 29 3b 0a 7d   : (double)0);.}
b890: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b8a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
b8b0: 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73  keeps track of s
b8c0: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
b8d0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e   for the.** coun
b8e0: 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  t() aggregate fu
b8f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
b900: 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43  ef struct CountC
b910: 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72  tx CountCtx;.str
b920: 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20  uct CountCtx {. 
b930: 20 69 36 34 20 6e 3b 0a 23 69 66 64 65 66 20 53   i64 n;.#ifdef S
b940: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
b950: 74 20 62 49 6e 76 65 72 73 65 3b 20 20 20 20 20  t bInverse;     
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b970: 20 54 72 75 65 20 69 66 20 78 49 6e 76 65 72 73   True if xInvers
b980: 65 28 29 20 65 76 65 72 20 63 61 6c 6c 65 64 20  e() ever called 
b990: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
b9a0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
b9b0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
b9c0: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
b9d0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
b9e0: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74  tic void countSt
b9f0: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
ba00: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
ba10: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
ba20: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
ba30: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
ba40: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
ba50: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
ba60: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
ba70: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
ba80: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
ba90: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
baa0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29 20 26  type(argv[0])) &
bab0: 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b  & p ){.    p->n+
bac0: 2b 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  +;.  }..#ifndef 
bad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
bae0: 45 43 41 54 45 44 0a 20 20 2f 2a 20 54 68 65 20  ECATED.  /* The 
baf0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
bb00: 65 5f 63 6f 75 6e 74 28 29 20 66 75 6e 63 74 69  e_count() functi
bb10: 6f 6e 20 69 73 20 64 65 70 72 65 63 61 74 65 64  on is deprecated
bb20: 2e 20 20 42 75 74 20 6a 75 73 74 20 74 6f 20 6d  .  But just to m
bb30: 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 69 74  ake.  ** sure it
bb40: 20 73 74 69 6c 6c 20 6f 70 65 72 61 74 65 73 20   still operates 
bb50: 63 6f 72 72 65 63 74 6c 79 2c 20 76 65 72 69 66  correctly, verif
bb60: 79 20 74 68 61 74 20 69 74 73 20 63 6f 75 6e 74  y that its count
bb70: 20 61 67 72 65 65 73 20 77 69 74 68 20 6f 75 72   agrees with our
bb80: 20 0a 20 20 2a 2a 20 69 6e 74 65 72 6e 61 6c 20   .  ** internal 
bb90: 63 6f 75 6e 74 20 77 68 65 6e 20 75 73 69 6e 67  count when using
bba0: 20 63 6f 75 6e 74 28 2a 29 20 61 6e 64 20 77 68   count(*) and wh
bbb0: 65 6e 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 75  en the total cou
bbc0: 6e 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 65  nt can be.  ** e
bbd0: 78 70 72 65 73 73 65 64 20 61 73 20 61 20 33 32  xpressed as a 32
bbe0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  -bit integer. */
bbf0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
bc00: 3d 31 20 7c 7c 20 70 3d 3d 30 20 7c 7c 20 70 2d  =1 || p==0 || p-
bc10: 3e 6e 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  >n>0x7fffffff ||
bc20: 20 70 2d 3e 62 49 6e 76 65 72 73 65 0a 20 20 20   p->bInverse.   
bc30: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6e 3d 3d         || p->n==
bc40: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
bc50: 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29  e_count(context)
bc60: 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 20 20 20 0a   );.#endif.}   .
bc70: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e  static void coun
bc80: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
bc90: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
bca0: 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  xt){.  CountCtx 
bcb0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
bcc0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
bcd0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
bce0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
bcf0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
bd00: 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a   p ? p->n : 0);.
bd10: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
bd20: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
bd30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
bd40: 6e 74 49 6e 76 65 72 73 65 28 73 71 6c 69 74 65  ntInverse(sqlite
bd50: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
bd60: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
bd70: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
bd80: 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a  .  CountCtx *p;.
bd90: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
bda0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
bdb0: 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ctx, sizeof(*p))
bdc0: 3b 0a 20 20 2f 2a 20 70 20 69 73 20 61 6c 77 61  ;.  /* p is alwa
bdd0: 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 73 69 6e 63  ys non-NULL sinc
bde0: 65 20 63 6f 75 6e 74 53 74 65 70 28 29 20 77 69  e countStep() wi
bdf0: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 6c  ll have been cal
be00: 6c 65 64 20 66 69 72 73 74 20 2a 2f 0a 20 20 69  led first */.  i
be10: 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53  f( (argc==0 || S
be20: 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69  QLITE_NULL!=sqli
be30: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
be40: 72 67 76 5b 30 5d 29 29 20 26 26 20 41 4c 57 41  rgv[0])) && ALWA
be50: 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70 2d 3e  YS(p) ){.    p->
be60: 6e 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  n--;.#ifdef SQLI
be70: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e  TE_DEBUG.    p->
be80: 62 49 6e 76 65 72 73 65 20 3d 20 31 3b 0a 23 65  bInverse = 1;.#e
be90: 6e 64 69 66 0a 20 20 7d 0a 7d 20 20 20 0a 23 65  ndif.  }.}   .#e
bea0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6f 75  lse.# define cou
beb0: 6e 74 49 6e 76 65 72 73 65 20 30 0a 23 65 6e 64  ntInverse 0.#end
bec0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bed0: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
bee0: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
bef0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e  to implement min
bf00: 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67  () and max() agg
bf10: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
bf20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bf30: 20 6d 69 6e 6d 61 78 53 74 65 70 28 0a 20 20 73   minmaxStep(.  s
bf40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
bf50: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
bf60: 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69  NotUsed, .  sqli
bf70: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
bf80: 0a 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20  .){.  Mem *pArg 
bf90: 20 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30   = (Mem *)argv[0
bfa0: 5d 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b  ];.  Mem *pBest;
bfb0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
bfc0: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20  TER(NotUsed);.. 
bfd0: 20 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29   pBest = (Mem *)
bfe0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
bff0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
c000: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73 74  t, sizeof(*pBest
c010: 29 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73 74  ));.  if( !pBest
c020: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
c030: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
c040: 74 79 70 65 28 70 41 72 67 29 3d 3d 53 51 4c 49  type(pArg)==SQLI
c050: 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_NULL ){.    i
c060: 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20  f( pBest->flags 
c070: 29 20 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63  ) sqlite3SkipAcc
c080: 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e  umulatorLoad(con
c090: 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  text);.  }else i
c0a0: 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20  f( pBest->flags 
c0b0: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a  ){.    int max;.
c0c0: 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20      int cmp;.   
c0d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
c0e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63  = sqlite3GetFunc
c0f0: 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29  CollSeq(context)
c100: 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74  ;.    /* This st
c110: 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ep function is u
c120: 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
c130: 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29   min() and max()
c140: 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20 20 20   aggregates,.   
c150: 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69 66   ** the only dif
c160: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
c170: 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20 74 68  the two being th
c180: 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20  at the sense of 
c190: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61  the.    ** compa
c1a0: 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72 74 65  rison is inverte
c1b0: 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78 28 29  d. For the max()
c1c0: 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 0a   aggregate, the.
c1d0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75      ** sqlite3_u
c1e0: 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e 63 74  ser_data() funct
c1f0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76 6f 69  ion returns (voi
c200: 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28  d *)-1. For min(
c210: 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) it.    ** retu
c220: 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62 2c 20  rns (void *)db, 
c230: 77 68 65 72 65 20 64 62 20 69 73 20 74 68 65 20  where db is the 
c240: 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73  sqlite3* databas
c250: 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a  e pointer..    *
c260: 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68 65 20  * Therefore the 
c270: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 73  next statement s
c280: 65 74 73 20 76 61 72 69 61 62 6c 65 20 27 6d 61  ets variable 'ma
c290: 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68 65 20  x' to 1 for the 
c2a0: 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61 67 67  max().    ** agg
c2b0: 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66 6f 72  regate, or 0 for
c2c0: 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20   min()..    */. 
c2d0: 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74 65 33     max = sqlite3
c2e0: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
c2f0: 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20  xt)!=0;.    cmp 
c300: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
c310: 61 72 65 28 70 42 65 73 74 2c 20 70 41 72 67 2c  are(pBest, pArg,
c320: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pColl);.    if(
c330: 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30 29 20   (max && cmp<0) 
c340: 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d 70 3e  || (!max && cmp>
c350: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
c360: 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70  te3VdbeMemCopy(p
c370: 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 20  Best, pArg);.   
c380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
c390: 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d 75 6c  lite3SkipAccumul
c3a0: 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78 74  atorLoad(context
c3b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
c3c0: 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 64 62 20  {.    pBest->db 
c3d0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
c3e0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
c3f0: 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
c400: 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65  3VdbeMemCopy(pBe
c410: 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d  st, pArg);.  }.}
c420: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e  .static void min
c430: 4d 61 78 56 61 6c 75 65 46 69 6e 61 6c 69 7a 65  MaxValueFinalize
c440: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c450: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 62   *context, int b
c460: 56 61 6c 75 65 29 7b 0a 20 20 73 71 6c 69 74 65  Value){.  sqlite
c470: 33 5f 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a 20  3_value *pRes;. 
c480: 20 70 52 65 73 20 3d 20 28 73 71 6c 69 74 65 33   pRes = (sqlite3
c490: 5f 76 61 6c 75 65 20 2a 29 73 71 6c 69 74 65 33  _value *)sqlite3
c4a0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
c4b0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
c4c0: 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20    if( pRes ){.  
c4d0: 20 20 69 66 28 20 70 52 65 73 2d 3e 66 6c 61 67    if( pRes->flag
c4e0: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
c4f0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
c500: 63 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b 0a  context, pRes);.
c510: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 56      }.    if( bV
c520: 61 6c 75 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  alue==0 ) sqlite
c530: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
c540: 70 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 23 69 66  pRes);.  }.}.#if
c550: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c560: 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 73 74 61 74  _WINDOWFUNC.stat
c570: 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 56 61  ic void minMaxVa
c580: 6c 75 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  lue(sqlite3_cont
c590: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
c5a0: 20 6d 69 6e 4d 61 78 56 61 6c 75 65 46 69 6e 61   minMaxValueFina
c5b0: 6c 69 7a 65 28 63 6f 6e 74 65 78 74 2c 20 31 29  lize(context, 1)
c5c0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
c5d0: 6e 65 20 6d 69 6e 4d 61 78 56 61 6c 75 65 20 30  ne minMaxValue 0
c5e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c5f0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
c600: 43 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  C */.static void
c610: 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 28   minMaxFinalize(
c620: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
c630: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 6d 69 6e  *context){.  min
c640: 4d 61 78 56 61 6c 75 65 46 69 6e 61 6c 69 7a 65  MaxValueFinalize
c650: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 7d 0a  (context, 0);.}.
c660: 0a 2f 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e  ./*.** group_con
c670: 63 61 74 28 45 58 50 52 2c 20 3f 53 45 50 41 52  cat(EXPR, ?SEPAR
c680: 41 54 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74 69 63  ATOR?).*/.static
c690: 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61   void groupConca
c6a0: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
c6b0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
c6c0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
c6d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
c6e0: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
c6f0: 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 53   char *zVal;.  S
c700: 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b  trAccum *pAccum;
c710: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c720: 53 65 70 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 2c  Sep;.  int nVal,
c730: 20 6e 53 65 70 3b 0a 20 20 61 73 73 65 72 74 28   nSep;.  assert(
c740: 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63   argc==1 || argc
c750: 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==2 );.  if( sql
c760: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
c770: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
c780: 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a  _NULL ) return;.
c790: 20 20 70 41 63 63 75 6d 20 3d 20 28 53 74 72 41    pAccum = (StrA
c7a0: 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61 67  ccum*)sqlite3_ag
c7b0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
c7c0: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
c7d0: 2a 70 41 63 63 75 6d 29 29 3b 0a 0a 20 20 69 66  *pAccum));..  if
c7e0: 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20  ( pAccum ){.    
c7f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
c800: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
c810: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
c820: 3b 0a 20 20 20 20 69 6e 74 20 66 69 72 73 74 54  ;.    int firstT
c830: 65 72 6d 20 3d 20 70 41 63 63 75 6d 2d 3e 6d 78  erm = pAccum->mx
c840: 41 6c 6c 6f 63 3d 3d 30 3b 0a 20 20 20 20 70 41  Alloc==0;.    pA
c850: 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20  ccum->mxAlloc = 
c860: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
c870: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b  E_LIMIT_LENGTH];
c880: 0a 20 20 20 20 69 66 28 20 21 66 69 72 73 74 54  .    if( !firstT
c890: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  erm ){.      if(
c8a0: 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20   argc==2 ){.    
c8b0: 20 20 20 20 7a 53 65 70 20 3d 20 28 63 68 61 72      zSep = (char
c8c0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
c8d0: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  text(argv[1]);. 
c8e0: 20 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 71         nSep = sq
c8f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
c900: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  s(argv[1]);.    
c910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c920: 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20   zSep = ",";.   
c930: 20 20 20 20 20 6e 53 65 70 20 3d 20 31 3b 0a 20       nSep = 1;. 
c940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c950: 20 7a 53 65 70 20 29 20 73 71 6c 69 74 65 33 5f   zSep ) sqlite3_
c960: 73 74 72 5f 61 70 70 65 6e 64 28 70 41 63 63 75  str_append(pAccu
c970: 6d 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a  m, zSep, nSep);.
c980: 20 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20 3d      }.    zVal =
c990: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
c9a0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
c9b0: 30 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20  0]);.    nVal = 
c9c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
c9d0: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
c9e0: 20 20 69 66 28 20 7a 56 61 6c 20 29 20 73 71 6c    if( zVal ) sql
c9f0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
ca00: 70 41 63 63 75 6d 2c 20 7a 56 61 6c 2c 20 6e 56  pAccum, zVal, nV
ca10: 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64  al);.  }.}.#ifnd
ca20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
ca30: 49 4e 44 4f 57 46 55 4e 43 0a 73 74 61 74 69 63  INDOWFUNC.static
ca40: 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61   void groupConca
ca50: 74 49 6e 76 65 72 73 65 28 0a 20 20 73 71 6c 69  tInverse(.  sqli
ca60: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
ca70: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
ca80: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
ca90: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
caa0: 74 20 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  t n;.  StrAccum 
cab0: 2a 70 41 63 63 75 6d 3b 0a 20 20 61 73 73 65 72  *pAccum;.  asser
cac0: 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72  t( argc==1 || ar
cad0: 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 73  gc==2 );.  if( s
cae0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
caf0: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
cb00: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
cb10: 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20 28 53 74  ;.  pAccum = (St
cb20: 72 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f  rAccum*)sqlite3_
cb30: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
cb40: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
cb50: 66 28 2a 70 41 63 63 75 6d 29 29 3b 0a 20 20 2f  f(*pAccum));.  /
cb60: 2a 20 70 41 63 63 75 6d 20 69 73 20 61 6c 77 61  * pAccum is alwa
cb70: 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 73 69 6e 63  ys non-NULL sinc
cb80: 65 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65  e groupConcatSte
cb90: 70 28 29 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  p() will have al
cba0: 77 61 79 73 0a 20 20 2a 2a 20 72 75 6e 20 66 72  ways.  ** run fr
cbb0: 69 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ist to initializ
cbc0: 65 20 69 74 20 2a 2f 0a 20 20 69 66 28 20 41 4c  e it */.  if( AL
cbd0: 57 41 59 53 28 70 41 63 63 75 6d 29 20 29 7b 0a  WAYS(pAccum) ){.
cbe0: 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f      n = sqlite3_
cbf0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
cc00: 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 61 72  [0]);.    if( ar
cc10: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 6e  gc==2 ){.      n
cc20: 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   += sqlite3_valu
cc30: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29  e_bytes(argv[1])
cc40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cc50: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
cc60: 20 20 69 66 28 20 6e 3e 3d 28 69 6e 74 29 70 41    if( n>=(int)pA
cc70: 63 63 75 6d 2d 3e 6e 43 68 61 72 20 29 7b 0a 20  ccum->nChar ){. 
cc80: 20 20 20 20 20 70 41 63 63 75 6d 2d 3e 6e 43 68       pAccum->nCh
cc90: 61 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ar = 0;.    }els
cca0: 65 7b 0a 20 20 20 20 20 20 70 41 63 63 75 6d 2d  e{.      pAccum-
ccb0: 3e 6e 43 68 61 72 20 2d 3d 20 6e 3b 0a 20 20 20  >nChar -= n;.   
ccc0: 20 20 20 6d 65 6d 6d 6f 76 65 28 70 41 63 63 75     memmove(pAccu
ccd0: 6d 2d 3e 7a 54 65 78 74 2c 20 26 70 41 63 63 75  m->zText, &pAccu
cce0: 6d 2d 3e 7a 54 65 78 74 5b 6e 5d 2c 20 70 41 63  m->zText[n], pAc
ccf0: 63 75 6d 2d 3e 6e 43 68 61 72 29 3b 0a 20 20 20  cum->nChar);.   
cd00: 20 7d 0a 20 20 20 20 69 66 28 20 70 41 63 63 75   }.    if( pAccu
cd10: 6d 2d 3e 6e 43 68 61 72 3d 3d 30 20 29 20 70 41  m->nChar==0 ) pA
cd20: 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20  ccum->mxAlloc = 
cd30: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  0;.  }.}.#else.#
cd40: 20 64 65 66 69 6e 65 20 67 72 6f 75 70 43 6f 6e   define groupCon
cd50: 63 61 74 49 6e 76 65 72 73 65 20 30 0a 23 65 6e  catInverse 0.#en
cd60: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cd70: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
cd80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f  .static void gro
cd90: 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65  upConcatFinalize
cda0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
cdb0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74   *context){.  St
cdc0: 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a  rAccum *pAccum;.
cdd0: 20 20 70 41 63 63 75 6d 20 3d 20 73 71 6c 69 74    pAccum = sqlit
cde0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
cdf0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
ce00: 3b 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20 29  ;.  if( pAccum )
ce10: 7b 0a 20 20 20 20 69 66 28 20 70 41 63 63 75 6d  {.    if( pAccum
ce20: 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53 51 4c 49  ->accError==SQLI
ce30: 54 45 5f 54 4f 4f 42 49 47 20 29 7b 0a 20 20 20  TE_TOOBIG ){.   
ce40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
ce50: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
ce60: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ontext);.    }el
ce70: 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61  se if( pAccum->a
ce80: 63 63 45 72 72 6f 72 3d 3d 53 51 4c 49 54 45 5f  ccError==SQLITE_
ce90: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
cea0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
ceb0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
cec0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20  t);.    }else{  
ced0: 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33    .      sqlite3
cee0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
cef0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53 74 72  text, sqlite3Str
cf00: 41 63 63 75 6d 46 69 6e 69 73 68 28 70 41 63 63  AccumFinish(pAcc
cf10: 75 6d 29 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  um), -1, .      
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
cf40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
cf50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cf60: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 73 74  IT_WINDOWFUNC.st
cf70: 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75 70 43  atic void groupC
cf80: 6f 6e 63 61 74 56 61 6c 75 65 28 73 71 6c 69 74  oncatValue(sqlit
cf90: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
cfa0: 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ext){.  sqlite3_
cfb0: 73 74 72 20 2a 70 41 63 63 75 6d 3b 0a 20 20 70  str *pAccum;.  p
cfc0: 41 63 63 75 6d 20 3d 20 28 73 71 6c 69 74 65 33  Accum = (sqlite3
cfd0: 5f 73 74 72 2a 29 73 71 6c 69 74 65 33 5f 61 67  _str*)sqlite3_ag
cfe0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
cff0: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
d000: 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20  f( pAccum ){.   
d010: 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61 63 63   if( pAccum->acc
d020: 45 72 72 6f 72 3d 3d 53 51 4c 49 54 45 5f 54 4f  Error==SQLITE_TO
d030: 4f 42 49 47 20 29 7b 0a 20 20 20 20 20 20 73 71  OBIG ){.      sq
d040: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
d050: 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78  or_toobig(contex
d060: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
d070: 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72 72  ( pAccum->accErr
d080: 6f 72 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  or==SQLITE_NOMEM
d090: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d0a0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
d0b0: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
d0c0: 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20 20     }else{    .  
d0d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d0e0: 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  zText = sqlite3_
d0f0: 73 74 72 5f 76 61 6c 75 65 28 70 41 63 63 75 6d  str_value(pAccum
d100: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d110: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
d120: 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  text, zText, -1,
d130: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d140: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  T);.    }.  }.}.
d150: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 67  #else.# define g
d160: 72 6f 75 70 43 6f 6e 63 61 74 56 61 6c 75 65 20  roupConcatValue 
d170: 30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  0.#endif /* SQLI
d180: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
d190: 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  NC */../*.** Thi
d1a0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 70  s routine does p
d1b0: 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 75  er-connection fu
d1c0: 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 72 61 74  nction registrat
d1d0: 69 6f 6e 2e 20 20 4d 6f 73 74 0a 2a 2a 20 6f 66  ion.  Most.** of
d1e0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75   the built-in fu
d1f0: 6e 63 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72  nctions above ar
d200: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 67 6c  e part of the gl
d210: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 65  obal function se
d220: 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  t..** This routi
d230: 6e 65 20 6f 6e 6c 79 20 64 65 61 6c 73 20 77 69  ne only deals wi
d240: 74 68 20 74 68 6f 73 65 20 74 68 61 74 20 61 72  th those that ar
d250: 65 20 6e 6f 74 20 67 6c 6f 62 61 6c 2e 0a 2a 2f  e not global..*/
d260: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67  .void sqlite3Reg
d270: 69 73 74 65 72 50 65 72 43 6f 6e 6e 65 63 74 69  isterPerConnecti
d280: 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  onBuiltinFunctio
d290: 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ns(sqlite3 *db){
d2a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
d2b0: 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
d2c0: 63 74 69 6f 6e 28 64 62 2c 20 22 4d 41 54 43 48  ction(db, "MATCH
d2d0: 22 2c 20 32 29 3b 0a 20 20 61 73 73 65 72 74 28  ", 2);.  assert(
d2e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
d2f0: 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  M || rc==SQLITE_
d300: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  OK );.  if( rc==
d310: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
d320: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
d330: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a  ult(db);.  }.}..
d340: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 4c 49  /*.** Set the LI
d350: 4b 45 4f 50 54 20 66 6c 61 67 20 6f 6e 20 74 68  KEOPT flag on th
d360: 65 20 32 2d 61 72 67 75 6d 65 6e 74 20 66 75 6e  e 2-argument fun
d370: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
d380: 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  iven name..*/.st
d390: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4c 69 6b  atic void setLik
d3a0: 65 4f 70 74 46 6c 61 67 28 73 71 6c 69 74 65 33  eOptFlag(sqlite3
d3b0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
d3c0: 20 2a 7a 4e 61 6d 65 2c 20 75 38 20 66 6c 61 67   *zName, u8 flag
d3d0: 56 61 6c 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  Val){.  FuncDef 
d3e0: 2a 70 44 65 66 3b 0a 20 20 70 44 65 66 20 3d 20  *pDef;.  pDef = 
d3f0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
d400: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 32  ion(db, zName, 2
d410: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
d420: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
d430: 70 44 65 66 29 20 29 7b 0a 20 20 20 20 70 44 65  pDef) ){.    pDe
d440: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 7c 3d 20  f->funcFlags |= 
d450: 66 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  flagVal;.  }.}..
d460: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  /*.** Register t
d470: 68 65 20 62 75 69 6c 74 2d 69 6e 20 4c 49 4b 45  he built-in LIKE
d480: 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69   and GLOB functi
d490: 6f 6e 73 2e 20 20 54 68 65 20 63 61 73 65 53 65  ons.  The caseSe
d4a0: 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61 72 61 6d  nsitive.** param
d4b0: 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
d4c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
d4d0: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
d4e0: 20 69 73 20 63 61 73 65 0a 2a 2a 20 73 65 6e 73   is case.** sens
d4f0: 69 74 69 76 65 2e 20 20 47 4c 4f 42 20 69 73 20  itive.  GLOB is 
d500: 61 6c 77 61 79 73 20 63 61 73 65 20 73 65 6e 73  always case sens
d510: 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itive..*/.void s
d520: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c 69  qlite3RegisterLi
d530: 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69  keFunctions(sqli
d540: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 63 61 73  te3 *db, int cas
d550: 65 53 65 6e 73 69 74 69 76 65 29 7b 0a 20 20 73  eSensitive){.  s
d560: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
d570: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69 66 28 20  o *pInfo;.  if( 
d580: 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 29 7b  caseSensitive ){
d590: 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73 74  .    pInfo = (st
d5a0: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
d5b0: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b 0a  *)&likeInfoAlt;.
d5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
d5d0: 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d  fo = (struct com
d5e0: 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49  pareInfo*)&likeI
d5f0: 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a 20 20 73  nfoNorm;.  }.  s
d600: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
d610: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 32 2c 20  (db, "like", 2, 
d620: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e  SQLITE_UTF8, pIn
d630: 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c  fo, likeFunc, 0,
d640: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
d650: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
d660: 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 33 2c  c(db, "like", 3,
d670: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49   SQLITE_UTF8, pI
d680: 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30  nfo, likeFunc, 0
d690: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
d6a0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
d6b0: 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32  nc(db, "glob", 2
d6c0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
d6d0: 20 20 20 20 20 20 28 73 74 72 75 63 74 20 63 6f        (struct co
d6e0: 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62  mpareInfo*)&glob
d6f0: 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20  Info, likeFunc, 
d700: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  0, 0, 0, 0, 0);.
d710: 20 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67    setLikeOptFlag
d720: 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 53 51 4c  (db, "glob", SQL
d730: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20  ITE_FUNC_LIKE | 
d740: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45  SQLITE_FUNC_CASE
d750: 29 3b 0a 20 20 73 65 74 4c 69 6b 65 4f 70 74 46  );.  setLikeOptF
d760: 6c 61 67 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20  lag(db, "like", 
d770: 0a 20 20 20 20 20 20 63 61 73 65 53 65 6e 73 69  .      caseSensi
d780: 74 69 76 65 20 3f 20 28 53 51 4c 49 54 45 5f 46  tive ? (SQLITE_F
d790: 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54  UNC_LIKE | SQLIT
d7a0: 45 5f 46 55 4e 43 5f 43 41 53 45 29 20 3a 20 53  E_FUNC_CASE) : S
d7b0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29  QLITE_FUNC_LIKE)
d7c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
d7d0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 78   points to an ex
d7e0: 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69  pression which i
d7f0: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 66 75 6e 63  mplements a func
d800: 74 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 69 74 20  tion.  If.** it 
d810: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  is appropriate t
d820: 6f 20 61 70 70 6c 79 20 74 68 65 20 4c 49 4b 45  o apply the LIKE
d830: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f   optimization to
d840: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 0a 2a   that function.*
d850: 2a 20 74 68 65 6e 20 73 65 74 20 61 57 63 5b 30  * then set aWc[0
d860: 5d 20 74 68 72 6f 75 67 68 20 61 57 63 5b 32 5d  ] through aWc[2]
d870: 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
d880: 20 63 68 61 72 61 63 74 65 72 73 20 61 6e 64 20   characters and 
d890: 74 68 65 0a 2a 2a 20 65 73 63 61 70 65 20 63 68  the.** escape ch
d8a0: 61 72 61 63 74 65 72 20 61 6e 64 20 74 68 65 6e  aracter and then
d8b0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49   return TRUE.  I
d8c0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  f the function i
d8d0: 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 4c 49 4b 45  s not a .** LIKE
d8e0: 2d 73 74 79 6c 65 20 66 75 6e 63 74 69 6f 6e 20  -style function 
d8f0: 74 68 65 6e 20 72 65 74 75 72 6e 20 46 41 4c 53  then return FALS
d900: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70  E..**.** The exp
d910: 72 65 73 73 69 6f 6e 20 22 61 20 4c 49 4b 45 20  ression "a LIKE 
d920: 62 20 45 53 43 41 50 45 20 63 22 20 69 73 20 6f  b ESCAPE c" is o
d930: 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 61  nly considered a
d940: 20 76 61 6c 69 64 20 4c 49 4b 45 0a 2a 2a 20 6f   valid LIKE.** o
d950: 70 65 72 61 74 6f 72 20 69 66 20 63 20 69 73 20  perator if c is 
d960: 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  a string literal
d970: 20 74 68 61 74 20 69 73 20 65 78 61 63 74 6c 79   that is exactly
d980: 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 6c 65 6e   one byte in len
d990: 67 74 68 2e 0a 2a 2a 20 54 68 61 74 20 6f 6e 65  gth..** That one
d9a0: 20 62 79 74 65 20 69 73 20 73 74 6f 72 65 64 20   byte is stored 
d9b0: 69 6e 20 61 57 63 5b 33 5d 2e 20 20 61 57 63 5b  in aWc[3].  aWc[
d9c0: 33 5d 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  3] is set to zer
d9d0: 6f 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  o if there is.**
d9e0: 20 6e 6f 20 45 53 43 41 50 45 20 63 6c 61 75 73   no ESCAPE claus
d9f0: 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 49 73 4e 6f 63  e..**.** *pIsNoc
da00: 61 73 65 20 69 73 20 73 65 74 20 74 6f 20 74 72  ase is set to tr
da10: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
da20: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 61 72  and lowercase ar
da30: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
da40: 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  .** the function
da50: 20 28 64 65 66 61 75 6c 74 20 66 6f 72 20 4c 49   (default for LI
da60: 4b 45 29 2e 20 20 49 66 20 74 68 65 20 66 75 6e  KE).  If the fun
da70: 63 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ction makes the 
da80: 64 69 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a 20 62  distinction.** b
da90: 65 74 77 65 65 6e 20 75 70 70 65 72 63 61 73 65  etween uppercase
daa0: 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 28   and lowercase (
dab0: 61 73 20 64 6f 65 73 20 47 4c 4f 42 29 20 74 68  as does GLOB) th
dac0: 65 6e 20 2a 70 49 73 4e 6f 63 61 73 65 20 69 73  en *pIsNocase is
dad0: 20 73 65 74 20 74 6f 0a 2a 2a 20 66 61 6c 73 65   set to.** false
dae0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
daf0: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73  IsLikeFunction(s
db00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
db10: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 49   *pExpr, int *pI
db20: 73 4e 6f 63 61 73 65 2c 20 63 68 61 72 20 2a 61  sNocase, char *a
db30: 57 63 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  Wc){.  FuncDef *
db40: 70 44 65 66 3b 0a 20 20 69 6e 74 20 6e 45 78 70  pDef;.  int nExp
db50: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
db60: 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op!=TK_FUNCTION 
db70: 7c 7c 20 21 70 45 78 70 72 2d 3e 78 2e 70 4c 69  || !pExpr->x.pLi
db80: 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
db90: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
dba0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
dbb0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
dbc0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 6e 45 78  Select) );.  nEx
dbd0: 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pr = pExpr->x.pL
dbe0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 44  ist->nExpr;.  pD
dbf0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
dc00: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
dc10: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 45  pr->u.zToken, nE
dc20: 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  xpr, SQLITE_UTF8
dc30: 2c 20 30 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  , 0);.  if( NEVE
dc40: 52 28 70 44 65 66 3d 3d 30 29 20 7c 7c 20 28 70  R(pDef==0) || (p
dc50: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
dc60: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
dc70: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  E)==0 ){.    ret
dc80: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
dc90: 20 6e 45 78 70 72 3c 33 20 29 7b 0a 20 20 20 20   nExpr<3 ){.    
dca0: 61 57 63 5b 33 5d 20 3d 20 30 3b 0a 20 20 7d 65  aWc[3] = 0;.  }e
dcb0: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
dcc0: 45 73 63 61 70 65 20 3d 20 70 45 78 70 72 2d 3e  Escape = pExpr->
dcd0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 32 5d 2e 70 45  x.pList->a[2].pE
dce0: 78 70 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  xpr;.    char *z
dcf0: 45 73 63 61 70 65 3b 0a 20 20 20 20 69 66 28 20  Escape;.    if( 
dd00: 70 45 73 63 61 70 65 2d 3e 6f 70 21 3d 54 4b 5f  pEscape->op!=TK_
dd10: 53 54 52 49 4e 47 20 29 20 72 65 74 75 72 6e 20  STRING ) return 
dd20: 30 3b 0a 20 20 20 20 7a 45 73 63 61 70 65 20 3d  0;.    zEscape =
dd30: 20 70 45 73 63 61 70 65 2d 3e 75 2e 7a 54 6f 6b   pEscape->u.zTok
dd40: 65 6e 3b 0a 20 20 20 20 69 66 28 20 7a 45 73 63  en;.    if( zEsc
dd50: 61 70 65 5b 30 5d 3d 3d 30 20 7c 7c 20 7a 45 73  ape[0]==0 || zEs
dd60: 63 61 70 65 5b 31 5d 21 3d 30 20 29 20 72 65 74  cape[1]!=0 ) ret
dd70: 75 72 6e 20 30 3b 0a 20 20 20 20 61 57 63 5b 33  urn 0;.    aWc[3
dd80: 5d 20 3d 20 7a 45 73 63 61 70 65 5b 30 5d 3b 0a  ] = zEscape[0];.
dd90: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 65    }..  /* The me
dda0: 6d 63 70 79 28 29 20 73 74 61 74 65 6d 65 6e 74  mcpy() statement
ddb0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
ddc0: 65 20 77 69 6c 64 63 61 72 64 20 63 68 61 72 61  e wildcard chara
ddd0: 63 74 65 72 73 20 61 72 65 0a 20 20 2a 2a 20 74  cters are.  ** t
dde0: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 73  he first three s
ddf0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
de00: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74 72   compareInfo str
de10: 75 63 74 75 72 65 2e 20 20 54 68 65 0a 20 20 2a  ucture.  The.  *
de20: 2a 20 61 73 73 65 72 74 73 28 29 20 74 68 61 74  * asserts() that
de30: 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66 79 20 74   follow verify t
de40: 68 61 74 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  hat assumption. 
de50: 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 61 57 63   */.  memcpy(aWc
de60: 2c 20 70 44 65 66 2d 3e 70 55 73 65 72 44 61 74  , pDef->pUserDat
de70: 61 2c 20 33 29 3b 0a 20 20 61 73 73 65 72 74 28  a, 3);.  assert(
de80: 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66   (char*)&likeInf
de90: 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72 2a 29 26  oAlt == (char*)&
dea0: 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63  likeInfoAlt.matc
deb0: 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  hAll );.  assert
dec0: 28 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65  ( &((char*)&like
ded0: 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d 3d 20 28  InfoAlt)[1] == (
dee0: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
def0: 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29 3b 0a 20  lt.matchOne );. 
df00: 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61 72   assert( &((char
df10: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b  *)&likeInfoAlt)[
df20: 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69  2] == (char*)&li
df30: 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 53  keInfoAlt.matchS
df40: 65 74 20 29 3b 0a 20 20 2a 70 49 73 4e 6f 63 61  et );.  *pIsNoca
df50: 73 65 20 3d 20 28 70 44 65 66 2d 3e 66 75 6e 63  se = (pDef->func
df60: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
df70: 55 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20 20  UNC_CASE)==0;.  
df80: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
df90: 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 46 75  ** All of the Fu
dfa0: 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65 73  ncDef structures
dfb0: 20 69 6e 20 74 68 65 20 61 42 75 69 6c 74 69 6e   in the aBuiltin
dfc0: 46 75 6e 63 5b 5d 20 61 72 72 61 79 20 61 62 6f  Func[] array abo
dfd0: 76 65 0a 2a 2a 20 74 6f 20 74 68 65 20 67 6c 6f  ve.** to the glo
dfe0: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  bal function has
dff0: 68 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 6f  h table.  This o
e000: 63 63 75 72 73 20 61 74 20 73 74 61 72 74 2d 74  ccurs at start-t
e010: 69 6d 65 20 28 61 73 0a 2a 2a 20 61 20 63 6f 6e  ime (as.** a con
e020: 73 65 71 75 65 6e 63 65 20 6f 66 20 63 61 6c 6c  sequence of call
e030: 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  ing sqlite3_init
e040: 69 61 6c 69 7a 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  ialize())..**.**
e050: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
e060: 69 6e 65 20 72 75 6e 73 0a 2a 2f 0a 76 6f 69 64  ine runs.*/.void
e070: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
e080: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
e090: 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 0a 20 20 2a  (void){.  /*.  *
e0a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
e0b0: 61 72 72 61 79 20 68 6f 6c 64 73 20 46 75 6e 63  array holds Func
e0c0: 44 65 66 20 73 74 72 75 63 74 75 72 65 73 20 66  Def structures f
e0d0: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 75  or all of the fu
e0e0: 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 64 65 66  nctions.  ** def
e0f0: 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
e100: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
e110: 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65   array cannot be
e120: 20 63 6f 6e 73 74 61 6e 74 20 73 69 6e 63 65 20   constant since 
e130: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
e140: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 75 6e   to the.  ** Fun
e150: 63 44 65 66 2e 70 48 61 73 68 20 65 6c 65 6d 65  cDef.pHash eleme
e160: 6e 74 73 20 61 74 20 73 74 61 72 74 2d 74 69 6d  nts at start-tim
e170: 65 2e 20 20 54 68 65 20 65 6c 65 6d 65 6e 74 73  e.  The elements
e180: 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 0a 20   of this array. 
e190: 20 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c   ** are read-onl
e1a0: 79 20 61 66 74 65 72 20 69 6e 69 74 69 61 6c 69  y after initiali
e1b0: 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  zation is comple
e1c0: 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  te..  **.  ** Fo
e1d0: 72 20 70 65 61 6b 20 65 66 66 69 63 69 65 6e 63  r peak efficienc
e1e0: 79 2c 20 70 75 74 20 74 68 65 20 6d 6f 73 74 20  y, put the most 
e1f0: 66 72 65 71 75 65 6e 74 6c 79 20 75 73 65 64 20  frequently used 
e200: 66 75 6e 63 74 69 6f 6e 20 6c 61 73 74 2e 0a 20  function last.. 
e210: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 46 75 6e   */.  static Fun
e220: 63 44 65 66 20 61 42 75 69 6c 74 69 6e 46 75 6e  cDef aBuiltinFun
e230: 63 5b 5d 20 3d 20 7b 0a 23 69 66 64 65 66 20 53  c[] = {.#ifdef S
e240: 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20 20  QLITE_SOUNDEX.  
e250: 20 20 46 55 4e 43 54 49 4f 4e 28 73 6f 75 6e 64    FUNCTION(sound
e260: 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  ex,            1
e270: 2c 20 30 2c 20 30 2c 20 73 6f 75 6e 64 65 78 46  , 0, 0, soundexF
e280: 75 6e 63 20 20 20 20 20 20 29 2c 0a 23 65 6e 64  unc      ),.#end
e290: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
e2a0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
e2b0: 4e 53 49 4f 4e 0a 20 20 20 20 56 46 55 4e 43 54  NSION.    VFUNCT
e2c0: 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ION(load_extensi
e2d0: 6f 6e 2c 20 20 20 20 31 2c 20 30 2c 20 30 2c 20  on,    1, 0, 0, 
e2e0: 6c 6f 61 64 45 78 74 20 20 20 20 20 20 20 20 20  loadExt         
e2f0: 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f   ),.    VFUNCTIO
e300: 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  N(load_extension
e310: 2c 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 6c 6f  ,    2, 0, 0, lo
e320: 61 64 45 78 74 20 20 20 20 20 20 20 20 20 20 29  adExt          )
e330: 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ,.#endif.#if SQL
e340: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
e350: 49 43 41 54 49 4f 4e 0a 20 20 20 20 46 55 4e 43  ICATION.    FUNC
e360: 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63 72 79 70  TION(sqlite_cryp
e370: 74 2c 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30  t,       2, 0, 0
e380: 2c 20 73 71 6c 69 74 65 33 43 72 79 70 74 46 75  , sqlite3CryptFu
e390: 6e 63 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66  nc ),.#endif.#if
e3a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e3b0: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
e3c0: 49 41 47 53 0a 20 20 20 20 44 46 55 4e 43 54 49  IAGS.    DFUNCTI
e3d0: 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c  ON(sqlite_compil
e3e0: 65 6f 70 74 69 6f 6e 5f 75 73 65 64 2c 31 2c 20  eoption_used,1, 
e3f0: 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f 70 74  0, 0, compileopt
e400: 69 6f 6e 75 73 65 64 46 75 6e 63 20 20 29 2c 0a  ionusedFunc  ),.
e410: 20 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 73 71      DFUNCTION(sq
e420: 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  lite_compileopti
e430: 6f 6e 5f 67 65 74 2c 20 31 2c 20 30 2c 20 30 2c  on_get, 1, 0, 0,
e440: 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65   compileoptionge
e450: 74 46 75 6e 63 20 20 29 2c 0a 23 65 6e 64 69 66  tFunc  ),.#endif
e460: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e470: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
e480: 41 47 53 20 2a 2f 0a 20 20 20 20 46 55 4e 43 54  AGS */.    FUNCT
e490: 49 4f 4e 32 28 75 6e 6c 69 6b 65 6c 79 2c 20 20  ION2(unlikely,  
e4a0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
e4b0: 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49   noopFunc,  SQLI
e4c0: 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59  TE_FUNC_UNLIKELY
e4d0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32  ),.    FUNCTION2
e4e0: 28 6c 69 6b 65 6c 69 68 6f 6f 64 2c 20 20 20 20  (likelihood,    
e4f0: 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 6e 6f 6f      2, 0, 0, noo
e500: 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46  pFunc,  SQLITE_F
e510: 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a 20  UNC_UNLIKELY),. 
e520: 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c 69 6b     FUNCTION2(lik
e530: 65 6c 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  ely,            
e540: 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e  1, 0, 0, noopFun
e550: 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  c,  SQLITE_FUNC_
e560: 55 4e 4c 49 4b 45 4c 59 29 2c 0a 23 69 66 64 65  UNLIKELY),.#ifde
e570: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
e580: 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 61 66 66     FUNCTION2(aff
e590: 69 6e 69 74 79 2c 20 20 20 20 20 20 20 20 20 20  inity,          
e5a0: 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e  1, 0, 0, noopFun
e5b0: 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  c,  SQLITE_FUNC_
e5c0: 41 46 46 49 4e 49 54 59 29 2c 0a 23 65 6e 64 69  AFFINITY),.#endi
e5d0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
e5e0: 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
e5f0: 4c 5f 46 55 4e 43 0a 20 20 20 20 46 55 4e 43 54  L_FUNC.    FUNCT
e600: 49 4f 4e 32 28 73 71 6c 69 74 65 5f 6f 66 66 73  ION2(sqlite_offs
e610: 65 74 2c 20 20 20 20 20 31 2c 20 30 2c 20 30 2c  et,     1, 0, 0,
e620: 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49   noopFunc,  SQLI
e630: 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45 54 7c 0a  TE_FUNC_OFFSET|.
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43       SQLITE_FUNC
e680: 5f 54 59 50 45 4f 46 29 2c 0a 23 65 6e 64 69 66  _TYPEOF),.#endif
e690: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74  .    FUNCTION(lt
e6a0: 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rim,            
e6b0: 20 20 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46    1, 1, 0, trimF
e6c0: 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20  unc         ),. 
e6d0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69     FUNCTION(ltri
e6e0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
e6f0: 32 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e  2, 1, 0, trimFun
e700: 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  c         ),.   
e710: 20 46 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c   FUNCTION(rtrim,
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
e730: 20 32 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20   2, 0, trimFunc 
e740: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
e750: 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20  UNCTION(rtrim,  
e760: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 32              2, 2
e770: 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20  , 0, trimFunc   
e780: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
e790: 43 54 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20  CTION(trim,     
e7a0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 33 2c 20            1, 3, 
e7b0: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
e7c0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
e7d0: 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20  ION(trim,       
e7e0: 20 20 20 20 20 20 20 20 32 2c 20 33 2c 20 30 2c          2, 3, 0,
e7f0: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
e800: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
e810: 4e 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20  N(min,          
e820: 20 20 20 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d       -1, 0, 1, m
e830: 69 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20  inmaxFunc       
e840: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
e850: 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  min,            
e860: 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 30 20 20      0, 0, 1, 0  
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c                ),
e880: 0a 20 20 20 20 57 41 47 47 52 45 47 41 54 45 28  .    WAGGREGATE(
e890: 6d 69 6e 2c 20 31 2c 20 30 2c 20 31 2c 20 6d 69  min, 1, 0, 1, mi
e8a0: 6e 6d 61 78 53 74 65 70 2c 20 6d 69 6e 4d 61 78  nmaxStep, minMax
e8b0: 46 69 6e 61 6c 69 7a 65 2c 20 6d 69 6e 4d 61 78  Finalize, minMax
e8c0: 56 61 6c 75 65 2c 20 30 2c 0a 20 20 20 20 20 20  Value, 0,.      
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f      SQLITE_FUNC_
e900: 4d 49 4e 4d 41 58 20 29 2c 0a 20 20 20 20 46 55  MINMAX ),.    FU
e910: 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20  NCTION(max,     
e920: 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c            -1, 1,
e930: 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 20   1, minmaxFunc  
e940: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
e950: 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20  TION(max,       
e960: 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20 31           0, 1, 1
e970: 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  , 0             
e980: 20 20 20 29 2c 0a 20 20 20 20 57 41 47 47 52 45     ),.    WAGGRE
e990: 47 41 54 45 28 6d 61 78 2c 20 31 2c 20 31 2c 20  GATE(max, 1, 1, 
e9a0: 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 6d  1, minmaxStep, m
e9b0: 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 2c 20 6d  inMaxFinalize, m
e9c0: 69 6e 4d 61 78 56 61 6c 75 65 2c 20 30 2c 0a 20  inMaxValue, 0,. 
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
ea00: 46 55 4e 43 5f 4d 49 4e 4d 41 58 20 29 2c 0a 20  FUNC_MINMAX ),. 
ea10: 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 74 79 70     FUNCTION2(typ
ea20: 65 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  eof,            
ea30: 31 2c 20 30 2c 20 30 2c 20 74 79 70 65 6f 66 46  1, 0, 0, typeofF
ea40: 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e  unc,  SQLITE_FUN
ea50: 43 5f 54 59 50 45 4f 46 29 2c 0a 20 20 20 20 46  C_TYPEOF),.    F
ea60: 55 4e 43 54 49 4f 4e 32 28 6c 65 6e 67 74 68 2c  UNCTION2(length,
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
ea80: 2c 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63 2c  , 0, lengthFunc,
ea90: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45    SQLITE_FUNC_LE
eaa0: 4e 47 54 48 29 2c 0a 20 20 20 20 46 55 4e 43 54  NGTH),.    FUNCT
eab0: 49 4f 4e 28 69 6e 73 74 72 2c 20 20 20 20 20 20  ION(instr,      
eac0: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c          2, 0, 0,
ead0: 20 69 6e 73 74 72 46 75 6e 63 20 20 20 20 20 20   instrFunc      
eae0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
eaf0: 4e 28 70 72 69 6e 74 66 2c 20 20 20 20 20 20 20  N(printf,       
eb00: 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 70       -1, 0, 0, p
eb10: 72 69 6e 74 66 46 75 6e 63 20 20 20 20 20 20 20  rintfFunc       
eb20: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
eb30: 75 6e 69 63 6f 64 65 2c 20 20 20 20 20 20 20 20  unicode,        
eb40: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 6e 69      1, 0, 0, uni
eb50: 63 6f 64 65 46 75 6e 63 20 20 20 20 20 20 29 2c  codeFunc      ),
eb60: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 68  .    FUNCTION(ch
eb70: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
eb80: 20 2d 31 2c 20 30 2c 20 30 2c 20 63 68 61 72 46   -1, 0, 0, charF
eb90: 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20  unc         ),. 
eba0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 61 62 73 2c     FUNCTION(abs,
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebc0: 31 2c 20 30 2c 20 30 2c 20 61 62 73 46 75 6e 63  1, 0, 0, absFunc
ebd0: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 23 69 66            ),.#if
ebe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ebf0: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
ec00: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75      FUNCTION(rou
ec10: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
ec20: 20 31 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46   1, 0, 0, roundF
ec30: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20  unc        ),.  
ec40: 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64    FUNCTION(round
ec50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ,              2
ec60: 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e  , 0, 0, roundFun
ec70: 63 20 20 20 20 20 20 20 20 29 2c 0a 23 65 6e 64  c        ),.#end
ec80: 69 66 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  if.    FUNCTION(
ec90: 75 70 70 65 72 2c 20 20 20 20 20 20 20 20 20 20  upper,          
eca0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 70 70      1, 0, 0, upp
ecb0: 65 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  erFunc        ),
ecc0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f  .    FUNCTION(lo
ecd0: 77 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  wer,            
ece0: 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72    1, 0, 0, lower
ecf0: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
ed00: 20 20 20 46 55 4e 43 54 49 4f 4e 28 68 65 78 2c     FUNCTION(hex,
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed20: 31 2c 20 30 2c 20 30 2c 20 68 65 78 46 75 6e 63  1, 0, 0, hexFunc
ed30: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
ed40: 20 46 55 4e 43 54 49 4f 4e 32 28 69 66 6e 75 6c   FUNCTION2(ifnul
ed50: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  l,            2,
ed60: 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c   0, 0, noopFunc,
ed70: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f    SQLITE_FUNC_CO
ed80: 41 4c 45 53 43 45 29 2c 0a 20 20 20 20 56 46 55  ALESCE),.    VFU
ed90: 4e 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 2c 20 20  NCTION(random,  
eda0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
edb0: 30 2c 20 72 61 6e 64 6f 6d 46 75 6e 63 20 20 20  0, randomFunc   
edc0: 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43      ),.    VFUNC
edd0: 54 49 4f 4e 28 72 61 6e 64 6f 6d 62 6c 6f 62 2c  TION(randomblob,
ede0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
edf0: 20 72 61 6e 64 6f 6d 42 6c 6f 62 20 20 20 20 20   randomBlob     
ee00: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
ee10: 4e 28 6e 75 6c 6c 69 66 2c 20 20 20 20 20 20 20  N(nullif,       
ee20: 20 20 20 20 20 20 32 2c 20 30 2c 20 31 2c 20 6e        2, 0, 1, n
ee30: 75 6c 6c 69 66 46 75 6e 63 20 20 20 20 20 20 20  ullifFunc       
ee40: 29 2c 0a 20 20 20 20 44 46 55 4e 43 54 49 4f 4e  ),.    DFUNCTION
ee50: 28 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 2c  (sqlite_version,
ee60: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 76 65 72      0, 0, 0, ver
ee70: 73 69 6f 6e 46 75 6e 63 20 20 20 20 20 20 29 2c  sionFunc      ),
ee80: 0a 20 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 73  .    DFUNCTION(s
ee90: 71 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 2c  qlite_source_id,
eea0: 20 20 30 2c 20 30 2c 20 30 2c 20 73 6f 75 72 63    0, 0, 0, sourc
eeb0: 65 69 64 46 75 6e 63 20 20 20 20 20 29 2c 0a 20  eidFunc     ),. 
eec0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69     FUNCTION(sqli
eed0: 74 65 5f 6c 6f 67 2c 20 20 20 20 20 20 20 20 20  te_log,         
eee0: 32 2c 20 30 2c 20 30 2c 20 65 72 72 6c 6f 67 46  2, 0, 0, errlogF
eef0: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
ef00: 20 46 55 4e 43 54 49 4f 4e 28 71 75 6f 74 65 2c   FUNCTION(quote,
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
ef20: 20 30 2c 20 30 2c 20 71 75 6f 74 65 46 75 6e 63   0, 0, quoteFunc
ef30: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56          ),.    V
ef40: 46 55 4e 43 54 49 4f 4e 28 6c 61 73 74 5f 69 6e  FUNCTION(last_in
ef50: 73 65 72 74 5f 72 6f 77 69 64 2c 20 30 2c 20 30  sert_rowid, 0, 0
ef60: 2c 20 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74  , 0, last_insert
ef70: 5f 72 6f 77 69 64 29 2c 0a 20 20 20 20 56 46 55  _rowid),.    VFU
ef80: 4e 43 54 49 4f 4e 28 63 68 61 6e 67 65 73 2c 20  NCTION(changes, 
ef90: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
efa0: 30 2c 20 63 68 61 6e 67 65 73 20 20 20 20 20 20  0, changes      
efb0: 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43      ),.    VFUNC
efc0: 54 49 4f 4e 28 74 6f 74 61 6c 5f 63 68 61 6e 67  TION(total_chang
efd0: 65 73 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  es,     0, 0, 0,
efe0: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20 20   total_changes  
eff0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
f000: 4e 28 72 65 70 6c 61 63 65 2c 20 20 20 20 20 20  N(replace,      
f010: 20 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 72        3, 0, 0, r
f020: 65 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20  eplaceFunc      
f030: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
f040: 7a 65 72 6f 62 6c 6f 62 2c 20 20 20 20 20 20 20  zeroblob,       
f050: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 7a 65 72      1, 0, 0, zer
f060: 6f 62 6c 6f 62 46 75 6e 63 20 20 20 20 20 29 2c  oblobFunc     ),
f070: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75  .    FUNCTION(su
f080: 62 73 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  bstr,           
f090: 20 20 32 2c 20 30 2c 20 30 2c 20 73 75 62 73 74    2, 0, 0, subst
f0a0: 72 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  rFunc       ),. 
f0b0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62 73     FUNCTION(subs
f0c0: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
f0d0: 33 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72 46  3, 0, 0, substrF
f0e0: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
f0f0: 20 57 41 47 47 52 45 47 41 54 45 28 73 75 6d 2c   WAGGREGATE(sum,
f100: 20 20 20 31 2c 30 2c 30 2c 20 73 75 6d 53 74 65     1,0,0, sumSte
f110: 70 2c 20 73 75 6d 46 69 6e 61 6c 69 7a 65 2c 20  p, sumFinalize, 
f120: 73 75 6d 46 69 6e 61 6c 69 7a 65 2c 20 73 75 6d  sumFinalize, sum
f130: 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20 20 20  Inverse, 0),.   
f140: 20 57 41 47 47 52 45 47 41 54 45 28 74 6f 74 61   WAGGREGATE(tota
f150: 6c 2c 20 31 2c 30 2c 30 2c 20 73 75 6d 53 74 65  l, 1,0,0, sumSte
f160: 70 2c 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 2c  p,totalFinalize,
f170: 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 2c 73 75  totalFinalize,su
f180: 6d 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20 20  mInverse, 0),.  
f190: 20 20 57 41 47 47 52 45 47 41 54 45 28 61 76 67    WAGGREGATE(avg
f1a0: 2c 20 20 20 31 2c 30 2c 30 2c 20 73 75 6d 53 74  ,   1,0,0, sumSt
f1b0: 65 70 2c 20 61 76 67 46 69 6e 61 6c 69 7a 65 2c  ep, avgFinalize,
f1c0: 20 61 76 67 46 69 6e 61 6c 69 7a 65 2c 20 73 75   avgFinalize, su
f1d0: 6d 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20 20  mInverse, 0),.  
f1e0: 20 20 57 41 47 47 52 45 47 41 54 45 28 63 6f 75    WAGGREGATE(cou
f1f0: 6e 74 2c 20 30 2c 30 2c 30 2c 20 63 6f 75 6e 74  nt, 0,0,0, count
f200: 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 63  Step, .        c
f210: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 20 63 6f  ountFinalize, co
f220: 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 20 63 6f 75  untFinalize, cou
f230: 6e 74 49 6e 76 65 72 73 65 2c 20 53 51 4c 49 54  ntInverse, SQLIT
f240: 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 20 20 29 2c  E_FUNC_COUNT  ),
f250: 0a 20 20 20 20 57 41 47 47 52 45 47 41 54 45 28  .    WAGGREGATE(
f260: 63 6f 75 6e 74 2c 20 31 2c 30 2c 30 2c 20 63 6f  count, 1,0,0, co
f270: 75 6e 74 53 74 65 70 2c 20 0a 20 20 20 20 20 20  untStep, .      
f280: 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c    countFinalize,
f290: 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 20   countFinalize, 
f2a0: 63 6f 75 6e 74 49 6e 76 65 72 73 65 2c 20 30 20  countInverse, 0 
f2b0: 20 29 2c 0a 20 20 20 20 57 41 47 47 52 45 47 41   ),.    WAGGREGA
f2c0: 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c  TE(group_concat,
f2d0: 20 31 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43   1, 0, 0, groupC
f2e0: 6f 6e 63 61 74 53 74 65 70 2c 20 0a 20 20 20 20  oncatStep, .    
f2f0: 20 20 20 20 67 72 6f 75 70 43 6f 6e 63 61 74 46      groupConcatF
f300: 69 6e 61 6c 69 7a 65 2c 20 67 72 6f 75 70 43 6f  inalize, groupCo
f310: 6e 63 61 74 56 61 6c 75 65 2c 20 67 72 6f 75 70  ncatValue, group
f320: 43 6f 6e 63 61 74 49 6e 76 65 72 73 65 2c 20 30  ConcatInverse, 0
f330: 29 2c 0a 20 20 20 20 57 41 47 47 52 45 47 41 54  ),.    WAGGREGAT
f340: 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20  E(group_concat, 
f350: 32 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f  2, 0, 0, groupCo
f360: 6e 63 61 74 53 74 65 70 2c 20 0a 20 20 20 20 20  ncatStep, .     
f370: 20 20 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69     groupConcatFi
f380: 6e 61 6c 69 7a 65 2c 20 67 72 6f 75 70 43 6f 6e  nalize, groupCon
f390: 63 61 74 56 61 6c 75 65 2c 20 67 72 6f 75 70 43  catValue, groupC
f3a0: 6f 6e 63 61 74 49 6e 76 65 72 73 65 2c 20 30 29  oncatInverse, 0)
f3b0: 2c 0a 20 20 0a 20 20 20 20 4c 49 4b 45 46 55 4e  ,.  .    LIKEFUN
f3c0: 43 28 67 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f 62  C(glob, 2, &glob
f3d0: 49 6e 66 6f 2c 20 53 51 4c 49 54 45 5f 46 55 4e  Info, SQLITE_FUN
f3e0: 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55  C_LIKE|SQLITE_FU
f3f0: 4e 43 5f 43 41 53 45 29 2c 0a 23 69 66 64 65 66  NC_CASE),.#ifdef
f400: 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e   SQLITE_CASE_SEN
f410: 53 49 54 49 56 45 5f 4c 49 4b 45 0a 20 20 20 20  SITIVE_LIKE.    
f420: 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32  LIKEFUNC(like, 2
f430: 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20  , &likeInfoAlt, 
f440: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
f450: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53  |SQLITE_FUNC_CAS
f460: 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43  E),.    LIKEFUNC
f470: 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49  (like, 3, &likeI
f480: 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46  nfoAlt, SQLITE_F
f490: 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f  UNC_LIKE|SQLITE_
f4a0: 46 55 4e 43 5f 43 41 53 45 29 2c 0a 23 65 6c 73  FUNC_CASE),.#els
f4b0: 65 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c  e.    LIKEFUNC(l
f4c0: 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66  ike, 2, &likeInf
f4d0: 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55  oNorm, SQLITE_FU
f4e0: 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c 49  NC_LIKE),.    LI
f4f0: 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20  KEFUNC(like, 3, 
f500: 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53  &likeInfoNorm, S
f510: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29  QLITE_FUNC_LIKE)
f520: 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ,.#endif.#ifdef 
f530: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
f540: 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49  KNOWN_SQL_FUNCTI
f550: 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ON.    FUNCTION(
f560: 75 6e 6b 6e 6f 77 6e 2c 20 20 20 20 20 20 20 20  unknown,        
f570: 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 75 6e 6b     -1, 0, 0, unk
f580: 6e 6f 77 6e 46 75 6e 63 20 20 20 20 20 20 29 2c  nownFunc      ),
f590: 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 55 4e 43  .#endif.    FUNC
f5a0: 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20  TION(coalesce,  
f5b0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
f5c0: 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  , 0             
f5d0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
f5e0: 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20  ON(coalesce,    
f5f0: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
f600: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
f610: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
f620: 32 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20  2(coalesce,     
f630: 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 6e 6f      -1, 0, 0, no
f640: 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  opFunc,  SQLITE_
f650: 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a  FUNC_COALESCE),.
f660: 20 20 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c    };.#ifndef SQL
f670: 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
f680: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c 74  BLE.  sqlite3Alt
f690: 65 72 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23  erFunctions();.#
f6a0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57  endif.  sqlite3W
f6b0: 69 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73 28 29  indowFunctions()
f6c0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
f6d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
f6e0: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
f6f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
f700: 34 29 0a 20 20 73 71 6c 69 74 65 33 41 6e 61 6c  4).  sqlite3Anal
f710: 79 7a 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  yzeFunctions();.
f720: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f730: 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d 65  RegisterDateTime
f740: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 73  Functions();.  s
f750: 71 6c 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c  qlite3InsertBuil
f760: 74 69 6e 46 75 6e 63 73 28 61 42 75 69 6c 74 69  tinFuncs(aBuilti
f770: 6e 46 75 6e 63 2c 20 41 72 72 61 79 53 69 7a 65  nFunc, ArraySize
f780: 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 29 3b  (aBuiltinFunc));
f790: 0a 0a 23 69 66 20 30 20 20 2f 2a 20 45 6e 61 62  ..#if 0  /* Enab
f7a0: 6c 65 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  le to print out 
f7b0: 68 6f 77 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  how the built-in
f7c0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 68   functions are h
f7d0: 61 73 68 65 64 20 2a 2f 0a 20 20 7b 0a 20 20 20  ashed */.  {.   
f7e0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 75 6e 63   int i;.    Func
f7f0: 44 65 66 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Def *p;.    for(
f800: 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55  i=0; i<SQLITE_FU
f810: 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29  NC_HASH_SZ; i++)
f820: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
f830: 46 55 4e 43 2d 48 41 53 48 20 25 30 32 64 3a 22  FUNC-HASH %02d:"
f840: 2c 20 69 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , i);.      for(
f850: 70 3d 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  p=sqlite3Builtin
f860: 46 75 6e 63 74 69 6f 6e 73 2e 61 5b 69 5d 3b 20  Functions.a[i]; 
f870: 70 3b 20 70 3d 70 2d 3e 75 2e 70 48 61 73 68 29  p; p=p->u.pHash)
f880: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
f890: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
f8a0: 30 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  0(p->zName);.   
f8b0: 20 20 20 20 20 69 6e 74 20 68 20 3d 20 70 2d 3e       int h = p->
f8c0: 7a 4e 61 6d 65 5b 30 5d 20 2b 20 6e 3b 0a 20 20  zName[0] + n;.  
f8d0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25        printf(" %
f8e0: 73 28 25 64 29 22 2c 20 70 2d 3e 7a 4e 61 6d 65  s(%d)", p->zName
f8f0: 2c 20 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , h);.      }.  
f900: 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
f910: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
f920: 69 66 0a 7d 0a                                   if.}.