/ Hex Artifact Content
Login

Artifact 2ccf4ae12430b1ae7096be5f0675887e1bd0732828af0ac0f7496339b7c6edee:


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 73 71 6c 69 74 65 33  rgv.){.  sqlite3
38f0: 5f 69 6e 74 36 34 20 6e 3b 0a 20 20 75 6e 73 69  _int64 n;.  unsi
3900: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20  gned char *p;.  
3910: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
3920: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
3930: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e  METER(argc);.  n
3940: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3950: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
3960: 0a 20 20 69 66 28 20 6e 3c 31 20 29 7b 0a 20 20  .  if( n<1 ){.  
3970: 20 20 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70    n = 1;.  }.  p
3980: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
3990: 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20  (context, n);.  
39a0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
39b0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
39c0: 6e 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, p);.    sqlit
39d0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
39e0: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 70  ontext, (char*)p
39f0: 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  , n, sqlite3_fre
3a00: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
3a10: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
3a20: 6f 66 20 74 68 65 20 6c 61 73 74 5f 69 6e 73 65  of the last_inse
3a30: 72 74 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66  rt_rowid() SQL f
3a40: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65  unction.  The re
3a50: 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 69 73  turn.** value is
3a60: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
3a70: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
3a80: 73 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49  sert_rowid() API
3a90: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
3aa0: 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 69  atic void last_i
3ab0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 0a 20 20 73  nsert_rowid(.  s
3ac0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3ad0: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
3ae0: 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69  NotUsed, .  sqli
3af0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55  te3_value **NotU
3b00: 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65  sed2.){.  sqlite
3b10: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
3b20: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
3b30: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e  e(context);.  UN
3b40: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
3b50: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
3b60: 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  2);.  /* IMP: R-
3b70: 35 31 35 31 33 2d 31 32 30 32 36 20 54 68 65 20  51513-12026 The 
3b80: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
3b90: 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  d() SQL function
3ba0: 20 69 73 20 61 0a 20 20 2a 2a 20 77 72 61 70 70   is a.  ** wrapp
3bb0: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71  er around the sq
3bc0: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
3bd0: 74 5f 72 6f 77 69 64 28 29 20 43 2f 43 2b 2b 20  t_rowid() C/C++ 
3be0: 69 6e 74 65 72 66 61 63 65 0a 20 20 2a 2a 20 66  interface.  ** f
3bf0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71  unction. */.  sq
3c00: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
3c10: 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  64(context, sqli
3c20: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
3c30: 72 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f  rowid(db));.}../
3c40: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
3c50: 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67  ion of the chang
3c60: 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  es() SQL functio
3c70: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d  n..**.** IMP: R-
3c80: 36 32 30 37 33 2d 31 31 32 30 39 20 54 68 65 20  62073-11209 The 
3c90: 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75  changes() SQL fu
3ca0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
3cb0: 70 65 72 0a 2a 2a 20 61 72 6f 75 6e 64 20 74 68  per.** around th
3cc0: 65 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  e sqlite3_change
3cd0: 73 28 29 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69  s() C/C++ functi
3ce0: 6f 6e 20 61 6e 64 20 68 65 6e 63 65 20 66 6f 6c  on and hence fol
3cf0: 6c 6f 77 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a  lows the same.**
3d00: 20 72 75 6c 65 73 20 66 6f 72 20 63 6f 75 6e 74   rules for count
3d10: 69 6e 67 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a  ing changes..*/.
3d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
3d30: 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ges(.  sqlite3_c
3d40: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3d50: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
3d60: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3d70: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
3d80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
3d90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
3da0: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
3db0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
3dc0: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
3dd0: 6f 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69  otUsed2);.  sqli
3de0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
3df0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
3e00: 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a  changes(db));.}.
3e10: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
3e20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74  ation of the tot
3e30: 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 53 51 4c  al_changes() SQL
3e40: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
3e50: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 0a  return value is.
3e60: 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  ** the same as t
3e70: 68 65 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  he sqlite3_total
3e80: 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49 20 66  _changes() API f
3e90: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
3ea0: 69 63 20 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68  ic void total_ch
3eb0: 61 6e 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33  anges(.  sqlite3
3ec0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
3ed0: 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64  t,.  int NotUsed
3ee0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
3ef0: 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a  e **NotUsed2.){.
3f00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3f10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
3f20: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
3f30: 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t);.  UNUSED_PAR
3f40: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
3f50: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a   NotUsed2);.  /*
3f60: 20 49 4d 50 3a 20 52 2d 35 32 37 35 36 2d 34 31   IMP: R-52756-41
3f70: 39 39 33 20 54 68 69 73 20 66 75 6e 63 74 69 6f  993 This functio
3f80: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
3f90: 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73  round the.  ** s
3fa0: 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
3fb0: 6e 67 65 73 28 29 20 43 2f 43 2b 2b 20 69 6e 74  nges() C/C++ int
3fc0: 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c  erface. */.  sql
3fd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
3fe0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
3ff0: 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 64  _total_changes(d
4000: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  b));.}../*.** A 
4010: 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 69  structure defini
4020: 6e 67 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f  ng how to do GLO
4030: 42 2d 73 74 79 6c 65 20 63 6f 6d 70 61 72 69 73  B-style comparis
4040: 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63  ons..*/.struct c
4050: 6f 6d 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75  ompareInfo {.  u
4060: 38 20 6d 61 74 63 68 41 6c 6c 3b 20 20 20 20 20  8 matchAll;     
4070: 20 20 20 20 20 2f 2a 20 22 2a 22 20 6f 72 20 22       /* "*" or "
4080: 25 22 20 2a 2f 0a 20 20 75 38 20 6d 61 74 63 68  %" */.  u8 match
4090: 4f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  One;          /*
40a0: 20 22 3f 22 20 6f 72 20 22 5f 22 20 2a 2f 0a 20   "?" or "_" */. 
40b0: 20 75 38 20 6d 61 74 63 68 53 65 74 3b 20 20 20   u8 matchSet;   
40c0: 20 20 20 20 20 20 20 2f 2a 20 22 5b 22 20 6f 72         /* "[" or
40d0: 20 30 20 2a 2f 0a 20 20 75 38 20 6e 6f 43 61 73   0 */.  u8 noCas
40e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
40f0: 20 74 72 75 65 20 74 6f 20 69 67 6e 6f 72 65 20   true to ignore 
4100: 63 61 73 65 20 64 69 66 66 65 72 65 6e 63 65 73  case differences
4110: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
4120: 72 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20  r LIKE and GLOB 
4130: 6d 61 74 63 68 69 6e 67 20 6f 6e 20 45 42 43 44  matching on EBCD
4140: 49 43 20 6d 61 63 68 69 6e 65 73 2c 20 61 73 73  IC machines, ass
4150: 75 6d 65 20 74 68 61 74 20 65 76 65 72 79 0a 2a  ume that every.*
4160: 2a 20 63 68 61 72 61 63 74 65 72 20 69 73 20 65  * character is e
4170: 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74 65 20  xactly one byte 
4180: 69 6e 20 73 69 7a 65 2e 20 20 41 6c 73 6f 2c 20  in size.  Also, 
4190: 70 72 6f 76 64 65 20 74 68 65 20 55 74 66 38 52  provde the Utf8R
41a0: 65 61 64 28 29 0a 2a 2a 20 6d 61 63 72 6f 20 66  ead().** macro f
41b0: 6f 72 20 66 61 73 74 20 72 65 61 64 69 6e 67 20  or fast reading 
41c0: 6f 66 20 74 68 65 20 6e 65 78 74 20 63 68 61 72  of the next char
41d0: 61 63 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  acter in the com
41e0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 0a 2a  mon case where.*
41f0: 2a 20 74 68 65 20 6e 65 78 74 20 63 68 61 72 61  * the next chara
4200: 63 74 65 72 20 69 73 20 41 53 43 49 49 2e 0a 2a  cter is ASCII..*
4210: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
4220: 4c 49 54 45 5f 45 42 43 44 49 43 29 0a 23 20 64  LITE_EBCDIC).# d
4230: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 55 74 66  efine sqlite3Utf
4240: 38 52 65 61 64 28 41 29 20 20 20 20 20 20 20 20  8Read(A)        
4250: 28 2a 28 28 2a 41 29 2b 2b 29 29 0a 23 20 64 65  (*((*A)++)).# de
4260: 66 69 6e 65 20 55 74 66 38 52 65 61 64 28 41 29  fine Utf8Read(A)
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4280: 2a 28 41 2b 2b 29 29 0a 23 65 6c 73 65 0a 23 20  *(A++)).#else.# 
4290: 64 65 66 69 6e 65 20 55 74 66 38 52 65 61 64 28  define Utf8Read(
42a0: 41 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A)              
42b0: 20 28 41 5b 30 5d 3c 30 78 38 30 3f 2a 28 41 2b   (A[0]<0x80?*(A+
42c0: 2b 29 3a 73 71 6c 69 74 65 33 55 74 66 38 52 65  +):sqlite3Utf8Re
42d0: 61 64 28 26 41 29 29 0a 23 65 6e 64 69 66 0a 0a  ad(&A)).#endif..
42e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
42f0: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
4300: 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20 27 2a 27  globInfo = { '*'
4310: 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30 20 7d 3b  , '?', '[', 0 };
4320: 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20  ./* The correct 
4330: 53 51 4c 2d 39 32 20 62 65 68 61 76 69 6f 72 20  SQL-92 behavior 
4340: 69 73 20 66 6f 72 20 74 68 65 20 4c 49 4b 45 20  is for the LIKE 
4350: 6f 70 65 72 61 74 6f 72 20 74 6f 20 69 67 6e 6f  operator to igno
4360: 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20 54 68 75  re.** case.  Thu
4370: 73 20 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  s  'a' LIKE 'A' 
4380: 77 6f 75 6c 64 20 62 65 20 74 72 75 65 2e 20 2a  would be true. *
4390: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
43a0: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
43b0: 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 20 3d  o likeInfoNorm =
43c0: 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20 30   { '%', '_',   0
43d0: 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20 53 51 4c  , 1 };./* If SQL
43e0: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
43f0: 56 45 5f 4c 49 4b 45 20 69 73 20 64 65 66 69 6e  VE_LIKE is defin
4400: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 4c 49 4b  ed, then the LIK
4410: 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  E operator.** is
4420: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 20   case sensitive 
4430: 63 61 75 73 69 6e 67 20 27 61 27 20 4c 49 4b 45  causing 'a' LIKE
4440: 20 27 41 27 20 74 6f 20 62 65 20 66 61 6c 73 65   'A' to be false
4450: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
4460: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
4470: 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41 6c 74 20  nfo likeInfoAlt 
4480: 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20  = { '%', '_',   
4490: 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50  0, 0 };../*.** P
44a0: 6f 73 73 69 62 6c 65 20 65 72 72 6f 72 20 72 65  ossible error re
44b0: 74 75 72 6e 73 20 66 72 6f 6d 20 70 61 74 74 65  turns from patte
44c0: 72 6e 4d 61 74 63 68 28 29 0a 2a 2f 0a 23 64 65  rnMatch().*/.#de
44d0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 54 43  fine SQLITE_MATC
44e0: 48 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a  H             0.
44f0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4e  #define SQLITE_N
4500: 4f 4d 41 54 43 48 20 20 20 20 20 20 20 20 20 20  OMATCH          
4510: 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54   1.#define SQLIT
4520: 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d 41 54 43  E_NOWILDCARDMATC
4530: 48 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  H   2../*.** Com
4540: 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38 20 73  pare two UTF-8 s
4550: 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75 61 6c  trings for equal
4560: 69 74 79 20 77 68 65 72 65 20 74 68 65 20 66 69  ity where the fi
4570: 72 73 74 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a  rst string is.**
4580: 20 61 20 47 4c 4f 42 20 6f 72 20 4c 49 4b 45 20   a GLOB or LIKE 
4590: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 52 65 74  expression.  Ret
45a0: 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  urn values:.**.*
45b0: 2a 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 54 43  *    SQLITE_MATC
45c0: 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 4d 61  H:            Ma
45d0: 74 63 68 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  tch.**    SQLITE
45e0: 5f 4e 4f 4d 41 54 43 48 3a 20 20 20 20 20 20 20  _NOMATCH:       
45f0: 20 20 20 4e 6f 20 6d 61 74 63 68 0a 2a 2a 20 20     No match.**  
4600: 20 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43    SQLITE_NOWILDC
4610: 41 52 44 4d 41 54 43 48 3a 20 20 4e 6f 20 6d 61  ARDMATCH:  No ma
4620: 74 63 68 20 69 6e 20 73 70 69 74 65 20 6f 66 20  tch in spite of 
4630: 68 61 76 69 6e 67 20 2a 20 6f 72 20 25 20 77 69  having * or % wi
4640: 6c 64 63 61 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 47  ldcards..**.** G
4650: 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  lobbing rules:.*
4660: 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20  *.**      '*'   
4670: 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
4680: 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f  sequence of zero
4690: 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74   or more charact
46a0: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ers..**.**      
46b0: 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '?'       Matche
46c0: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68  s exactly one ch
46d0: 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  aracter..**.**  
46e0: 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61     [...]      Ma
46f0: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
4700: 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63  ter from the enc
4710: 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a  losed list of.**
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
4740: 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20  *     [^...]    
4750: 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
4760: 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68  racter not in th
4770: 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e  e enclosed list.
4780: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20  .**.** With the 
4790: 5b 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d  [...] and [^...]
47a0: 20 6d 61 74 63 68 69 6e 67 2c 20 61 20 27 5d 27   matching, a ']'
47b0: 20 63 68 61 72 61 63 74 65 72 20 63 61 6e 20 62   character can b
47c0: 65 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e  e included.** in
47d0: 20 74 68 65 20 6c 69 73 74 20 62 79 20 6d 61 6b   the list by mak
47e0: 69 6e 67 20 69 74 20 74 68 65 20 66 69 72 73 74  ing it the first
47f0: 20 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72   character after
4800: 20 27 5b 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a   '[' or '^'.  A.
4810: 2a 2a 20 72 61 6e 67 65 20 6f 66 20 63 68 61 72  ** range of char
4820: 61 63 74 65 72 73 20 63 61 6e 20 62 65 20 73 70  acters can be sp
4830: 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 27 2d  ecified using '-
4840: 27 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20  '.  Example:.** 
4850: 22 5b 61 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20  "[a-z]" matches 
4860: 61 6e 79 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72  any single lower
4870: 2d 63 61 73 65 20 6c 65 74 74 65 72 2e 20 20 54  -case letter.  T
4880: 6f 20 6d 61 74 63 68 20 61 20 27 2d 27 2c 20 6d  o match a '-', m
4890: 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61  ake.** it the la
48a0: 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  st character in 
48b0: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  the list..**.** 
48c0: 4c 69 6b 65 20 6d 61 74 63 68 69 6e 67 20 72 75  Like matching ru
48d0: 6c 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  les:.** .**     
48e0: 20 27 25 27 20 20 20 20 20 20 20 4d 61 74 63 68   '%'       Match
48f0: 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
4900: 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
4910: 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 0a 2a 2a  characters.**.**
4920: 2a 20 20 20 20 20 27 5f 27 20 20 20 20 20 20 20  *     '_'       
4930: 4d 61 74 63 68 65 73 20 61 6e 79 20 6f 6e 65 20  Matches any one 
4940: 63 68 61 72 61 63 74 65 72 0a 2a 2a 0a 2a 2a 20  character.**.** 
4950: 20 20 20 20 20 45 63 20 20 20 20 20 20 20 20 57       Ec        W
4960: 68 65 72 65 20 45 20 69 73 20 74 68 65 20 22 65  here E is the "e
4970: 73 63 22 20 63 68 61 72 61 63 74 65 72 20 61 6e  sc" character an
4980: 64 20 63 20 69 73 20 61 6e 79 20 6f 74 68 65 72  d c is any other
4990: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
49a0: 20 20 20 63 68 61 72 61 63 74 65 72 2c 20 69 6e     character, in
49b0: 63 6c 75 64 69 6e 67 20 27 25 27 2c 20 27 5f 27  cluding '%', '_'
49c0: 2c 20 61 6e 64 20 65 73 63 2c 20 6d 61 74 63 68  , and esc, match
49d0: 20 65 78 61 63 74 6c 79 20 63 2e 0a 2a 2a 0a 2a   exactly c..**.*
49e0: 2a 20 54 68 65 20 63 6f 6d 6d 65 6e 74 73 20 77  * The comments w
49f0: 69 74 68 69 6e 20 74 68 69 73 20 72 6f 75 74 69  ithin this routi
4a00: 6e 65 20 75 73 75 61 6c 6c 79 20 61 73 73 75 6d  ne usually assum
4a10: 65 20 67 6c 6f 62 20 6d 61 74 63 68 69 6e 67 2e  e glob matching.
4a20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4a30: 69 6e 65 20 69 73 20 75 73 75 61 6c 6c 79 20 71  ine is usually q
4a40: 75 69 63 6b 2c 20 62 75 74 20 63 61 6e 20 62 65  uick, but can be
4a50: 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f 72   N**2 in the wor
4a60: 73 74 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  st case..*/.stat
4a70: 69 63 20 69 6e 74 20 70 61 74 74 65 72 6e 43 6f  ic int patternCo
4a80: 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 75  mpare(.  const u
4a90: 38 20 2a 7a 50 61 74 74 65 72 6e 2c 20 20 20 20  8 *zPattern,    
4aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4ab0: 20 67 6c 6f 62 20 70 61 74 74 65 72 6e 20 2a 2f   glob pattern */
4ac0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 53 74  .  const u8 *zSt
4ad0: 72 69 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20  ring,           
4ae0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e      /* The strin
4af0: 67 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  g to compare aga
4b00: 69 6e 73 74 20 74 68 65 20 67 6c 6f 62 20 2a 2f  inst the glob */
4b10: 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
4b20: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e  compareInfo *pIn
4b30: 66 6f 2c 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  fo, /* Informati
4b40: 6f 6e 20 61 62 6f 75 74 20 68 6f 77 20 74 6f 20  on about how to 
4b50: 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 65 20 2a  do the compare *
4b60: 2f 0a 20 20 75 33 32 20 6d 61 74 63 68 4f 74 68  /.  u32 matchOth
4b70: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
4b80: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61       /* The esca
4b90: 70 65 20 63 68 61 72 20 28 4c 49 4b 45 29 20 6f  pe char (LIKE) o
4ba0: 72 20 27 5b 27 20 28 47 4c 4f 42 29 20 2a 2f 0a  r '[' (GLOB) */.
4bb0: 29 7b 0a 20 20 75 33 32 20 63 2c 20 63 32 3b 20  ){.  u32 c, c2; 
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 70 61        /* Next pa
4be0: 74 74 65 72 6e 20 61 6e 64 20 69 6e 70 75 74 20  ttern and input 
4bf0: 73 74 72 69 6e 67 20 63 68 61 72 73 20 2a 2f 0a  string chars */.
4c00: 20 20 75 33 32 20 6d 61 74 63 68 4f 6e 65 20 3d    u32 matchOne =
4c10: 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65   pInfo->matchOne
4c20: 3b 20 20 2f 2a 20 22 3f 22 20 6f 72 20 22 5f 22  ;  /* "?" or "_"
4c30: 20 2a 2f 0a 20 20 75 33 32 20 6d 61 74 63 68 41   */.  u32 matchA
4c40: 6c 6c 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63  ll = pInfo->matc
4c50: 68 41 6c 6c 3b 20 20 2f 2a 20 22 2a 22 20 6f 72  hAll;  /* "*" or
4c60: 20 22 25 22 20 2a 2f 0a 20 20 75 38 20 6e 6f 43   "%" */.  u8 noC
4c70: 61 73 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43  ase = pInfo->noC
4c80: 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  ase;       /* Tr
4c90: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 3d  ue if uppercase=
4ca0: 3d 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 20 20  =lowercase */.  
4cb0: 63 6f 6e 73 74 20 75 38 20 2a 7a 45 73 63 61 70  const u8 *zEscap
4cc0: 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
4cd0: 20 2f 2a 20 4f 6e 65 20 70 61 73 74 20 74 68 65   /* One past the
4ce0: 20 6c 61 73 74 20 65 73 63 61 70 65 64 20 69 6e   last escaped in
4cf0: 70 75 74 20 63 68 61 72 20 2a 2f 0a 20 20 0a 20  put char */.  . 
4d00: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 55 74 66   while( (c = Utf
4d10: 38 52 65 61 64 28 7a 50 61 74 74 65 72 6e 29 29  8Read(zPattern))
4d20: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63  !=0 ){.    if( c
4d30: 3d 3d 6d 61 74 63 68 41 6c 6c 20 29 7b 20 20 2f  ==matchAll ){  /
4d40: 2a 20 4d 61 74 63 68 20 22 2a 22 20 2a 2f 0a 20  * Match "*" */. 
4d50: 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65       /* Skip ove
4d60: 72 20 6d 75 6c 74 69 70 6c 65 20 22 2a 22 20 63  r multiple "*" c
4d70: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
4d80: 20 70 61 74 74 65 72 6e 2e 20 20 49 66 20 74 68   pattern.  If th
4d90: 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 65  ere.      ** are
4da0: 20 61 6c 73 6f 20 22 3f 22 20 63 68 61 72 61 63   also "?" charac
4db0: 74 65 72 73 2c 20 73 6b 69 70 20 74 68 6f 73 65  ters, skip those
4dc0: 20 61 73 20 77 65 6c 6c 2c 20 62 75 74 20 63 6f   as well, but co
4dd0: 6e 73 75 6d 65 20 61 0a 20 20 20 20 20 20 2a 2a  nsume a.      **
4de0: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
4df0: 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73  r of the input s
4e00: 74 72 69 6e 67 20 66 6f 72 20 65 61 63 68 20 22  tring for each "
4e10: 3f 22 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20  ?" skipped */.  
4e20: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 55 74      while( (c=Ut
4e30: 66 38 52 65 61 64 28 7a 50 61 74 74 65 72 6e 29  f8Read(zPattern)
4e40: 29 20 3d 3d 20 6d 61 74 63 68 41 6c 6c 20 7c 7c  ) == matchAll ||
4e50: 20 63 20 3d 3d 20 6d 61 74 63 68 4f 6e 65 20 29   c == matchOne )
4e60: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
4e70: 3d 6d 61 74 63 68 4f 6e 65 20 26 26 20 73 71 6c  =matchOne && sql
4e80: 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 53  ite3Utf8Read(&zS
4e90: 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20  tring)==0 ){.   
4ea0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
4eb0: 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d  LITE_NOWILDCARDM
4ec0: 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ATCH;.        }.
4ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4ee0: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
4ef0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4f00: 4d 41 54 43 48 3b 20 20 20 2f 2a 20 22 2a 22 20  MATCH;   /* "*" 
4f10: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
4f20: 65 20 70 61 74 74 65 72 6e 20 6d 61 74 63 68 65  e pattern matche
4f30: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  s */.      }else
4f40: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 74 68   if( c==matchOth
4f50: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  er ){.        if
4f60: 28 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65  ( pInfo->matchSe
4f70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
4f80: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66    c = sqlite3Utf
4f90: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
4fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4fb0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  c==0 ) return SQ
4fc0: 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d  LITE_NOWILDCARDM
4fd0: 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20 7d 65  ATCH;.        }e
4fe0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
4ff0: 2a 20 22 5b 2e 2e 2e 5d 22 20 69 6d 6d 65 64 69  * "[...]" immedi
5000: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
5010: 65 20 22 2a 22 2e 20 20 57 65 20 68 61 76 65 20  e "*".  We have 
5020: 74 6f 20 64 6f 20 61 20 73 6c 6f 77 0a 20 20 20  to do a slow.   
5030: 20 20 20 20 20 20 20 2a 2a 20 72 65 63 75 72 73         ** recurs
5040: 69 76 65 20 73 65 61 72 63 68 20 69 6e 20 74 68  ive search in th
5050: 69 73 20 63 61 73 65 2c 20 62 75 74 20 69 74 20  is case, but it 
5060: 69 73 20 61 6e 20 75 6e 75 73 75 61 6c 20 63 61  is an unusual ca
5070: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
5080: 20 61 73 73 65 72 74 28 20 6d 61 74 63 68 4f 74   assert( matchOt
5090: 68 65 72 3c 30 78 38 30 20 29 3b 20 20 2f 2a 20  her<0x80 );  /* 
50a0: 27 5b 27 20 69 73 20 61 20 73 69 6e 67 6c 65 2d  '[' is a single-
50b0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 2a  byte character *
50c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  /.          whil
50d0: 65 28 20 2a 7a 53 74 72 69 6e 67 20 29 7b 0a 20  e( *zString ){. 
50e0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62             int b
50f0: 4d 61 74 63 68 20 3d 20 70 61 74 74 65 72 6e 43  Match = patternC
5100: 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e  ompare(&zPattern
5110: 5b 2d 31 5d 2c 7a 53 74 72 69 6e 67 2c 70 49 6e  [-1],zString,pIn
5120: 66 6f 2c 6d 61 74 63 68 4f 74 68 65 72 29 3b 0a  fo,matchOther);.
5130: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
5140: 62 4d 61 74 63 68 21 3d 53 51 4c 49 54 45 5f 4e  bMatch!=SQLITE_N
5150: 4f 4d 41 54 43 48 20 29 20 72 65 74 75 72 6e 20  OMATCH ) return 
5160: 62 4d 61 74 63 68 3b 0a 20 20 20 20 20 20 20 20  bMatch;.        
5170: 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f      SQLITE_SKIP_
5180: 55 54 46 38 28 7a 53 74 72 69 6e 67 29 3b 0a 20  UTF8(zString);. 
5190: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
51a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
51b0: 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d 41 54  TE_NOWILDCARDMAT
51c0: 43 48 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  CH;.        }.  
51d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
51e0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61  At this point va
51f0: 72 69 61 62 6c 65 20 63 20 63 6f 6e 74 61 69 6e  riable c contain
5200: 73 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  s the first char
5210: 61 63 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20  acter of the.   
5220: 20 20 20 2a 2a 20 70 61 74 74 65 72 6e 20 73 74     ** pattern st
5230: 72 69 6e 67 20 70 61 73 74 20 74 68 65 20 22 2a  ring past the "*
5240: 22 2e 20 20 53 65 61 72 63 68 20 69 6e 20 74 68  ".  Search in th
5250: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 66  e input string f
5260: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
5270: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 63  first matching c
5280: 68 61 72 61 63 74 65 72 20 61 6e 64 20 72 65 63  haracter and rec
5290: 75 72 73 69 76 65 6c 79 20 63 6f 6e 74 69 6e 75  ursively continu
52a0: 65 20 74 68 65 20 6d 61 74 63 68 20 66 72 6f 6d  e the match from
52b0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 70  .      ** that p
52c0: 6f 69 6e 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  oint..      **. 
52d0: 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 63 61       ** For a ca
52e0: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 73  se-insensitive s
52f0: 65 61 72 63 68 2c 20 73 65 74 20 76 61 72 69 61  earch, set varia
5300: 62 6c 65 20 63 78 20 74 6f 20 62 65 20 74 68 65  ble cx to be the
5310: 20 73 61 6d 65 20 61 73 0a 20 20 20 20 20 20 2a   same as.      *
5320: 2a 20 63 20 62 75 74 20 69 6e 20 74 68 65 20 6f  * c but in the o
5330: 74 68 65 72 20 63 61 73 65 20 61 6e 64 20 73 65  ther case and se
5340: 61 72 63 68 20 74 68 65 20 69 6e 70 75 74 20 73  arch the input s
5350: 74 72 69 6e 67 20 66 6f 72 20 65 69 74 68 65 72  tring for either
5360: 0a 20 20 20 20 20 20 2a 2a 20 63 20 6f 72 20 63  .      ** c or c
5370: 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  x..      */.    
5380: 20 20 69 66 28 20 63 3c 3d 30 78 38 30 20 29 7b    if( c<=0x80 ){
5390: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 53  .        char zS
53a0: 74 6f 70 5b 33 5d 3b 0a 20 20 20 20 20 20 20 20  top[3];.        
53b0: 69 6e 74 20 62 4d 61 74 63 68 3b 0a 20 20 20 20  int bMatch;.    
53c0: 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29      if( noCase )
53d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 6f  {.          zSto
53e0: 70 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f  p[0] = sqlite3To
53f0: 75 70 70 65 72 28 63 29 3b 0a 20 20 20 20 20 20  upper(c);.      
5400: 20 20 20 20 7a 53 74 6f 70 5b 31 5d 20 3d 20 73      zStop[1] = s
5410: 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63 29  qlite3Tolower(c)
5420: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 6f  ;.          zSto
5430: 70 5b 32 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[2] = 0;.      
5440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5450: 20 20 20 7a 53 74 6f 70 5b 30 5d 20 3d 20 63 3b     zStop[0] = c;
5460: 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 6f 70  .          zStop
5470: 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
5480: 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   }.        while
5490: 28 31 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  (1){.          z
54a0: 53 74 72 69 6e 67 20 2b 3d 20 73 74 72 63 73 70  String += strcsp
54b0: 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  n((const char*)z
54c0: 53 74 72 69 6e 67 2c 20 7a 53 74 6f 70 29 3b 0a  String, zStop);.
54d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
54e0: 74 72 69 6e 67 5b 30 5d 3d 3d 30 20 29 20 62 72  tring[0]==0 ) br
54f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  eak;.          z
5500: 53 74 72 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20  String++;.      
5510: 20 20 20 20 62 4d 61 74 63 68 20 3d 20 70 61 74      bMatch = pat
5520: 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 50 61 74  ternCompare(zPat
5530: 74 65 72 6e 2c 7a 53 74 72 69 6e 67 2c 70 49 6e  tern,zString,pIn
5540: 66 6f 2c 6d 61 74 63 68 4f 74 68 65 72 29 3b 0a  fo,matchOther);.
5550: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 4d            if( bM
5560: 61 74 63 68 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  atch!=SQLITE_NOM
5570: 41 54 43 48 20 29 20 72 65 74 75 72 6e 20 62 4d  ATCH ) return bM
5580: 61 74 63 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  atch;.        }.
5590: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
55a0: 20 20 20 20 20 69 6e 74 20 62 4d 61 74 63 68 3b       int bMatch;
55b0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
55c0: 28 63 32 20 3d 20 55 74 66 38 52 65 61 64 28 7a  (c2 = Utf8Read(z
55d0: 53 74 72 69 6e 67 29 29 21 3d 30 20 29 7b 0a 20  String))!=0 ){. 
55e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 32 21           if( c2!
55f0: 3d 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =c ) continue;. 
5600: 20 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20           bMatch 
5610: 3d 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  = patternCompare
5620: 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72 69 6e  (zPattern,zStrin
5630: 67 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f 74 68  g,pInfo,matchOth
5640: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
5650: 66 28 20 62 4d 61 74 63 68 21 3d 53 51 4c 49 54  f( bMatch!=SQLIT
5660: 45 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65 74 75  E_NOMATCH ) retu
5670: 72 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20 20 20  rn bMatch;.     
5680: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
56a0: 5f 4e 4f 57 49 4c 44 43 41 52 44 4d 41 54 43 48  _NOWILDCARDMATCH
56b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
56c0: 63 3d 3d 6d 61 74 63 68 4f 74 68 65 72 20 29 7b  c==matchOther ){
56d0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
56e0: 2d 3e 6d 61 74 63 68 53 65 74 3d 3d 30 20 29 7b  ->matchSet==0 ){
56f0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
5700: 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50  ite3Utf8Read(&zP
5710: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20  attern);.       
5720: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
5730: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43  rn SQLITE_NOMATC
5740: 48 3b 0a 20 20 20 20 20 20 20 20 7a 45 73 63 61  H;.        zEsca
5750: 70 65 64 20 3d 20 7a 50 61 74 74 65 72 6e 3b 0a  ped = zPattern;.
5760: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5770: 20 20 20 20 20 75 33 32 20 70 72 69 6f 72 5f 63       u32 prior_c
5780: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
5790: 74 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20  t seen = 0;.    
57a0: 20 20 20 20 69 6e 74 20 69 6e 76 65 72 74 20 3d      int invert =
57b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   0;.        c = 
57c0: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
57d0: 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  &zString);.     
57e0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65     if( c==0 ) re
57f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 41  turn SQLITE_NOMA
5800: 54 43 48 3b 0a 20 20 20 20 20 20 20 20 63 32 20  TCH;.        c2 
5810: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
5820: 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  d(&zPattern);.  
5830: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e        if( c2=='^
5840: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
5850: 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  nvert = 1;.     
5860: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
5870: 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74  3Utf8Read(&zPatt
5880: 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ern);.        }.
5890: 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
58a0: 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ']' ){.         
58b0: 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65   if( c==']' ) se
58c0: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
58d0: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74    c2 = sqlite3Ut
58e0: 66 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e  f8Read(&zPattern
58f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5900: 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 26       while( c2 &
5910: 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20  & c2!=']' ){.   
5920: 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27         if( c2=='
5930: 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 30  -' && zPattern[0
5940: 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74 74 65  ]!=']' && zPatte
5950: 72 6e 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f  rn[0]!=0 && prio
5960: 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  r_c>0 ){.       
5970: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
5980: 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74  3Utf8Read(&zPatt
5990: 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ern);.          
59a0: 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63    if( c>=prior_c
59b0: 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e   && c<=c2 ) seen
59c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
59d0: 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
59e0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
5a00: 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20  c==c2 ){.       
5a10: 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b         seen = 1;
5a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
5a30: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72             prior
5a40: 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20  _c = c2;.       
5a50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
5a60: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
5a70: 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a  ead(&zPattern);.
5a80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5a90: 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28    if( c2==0 || (
5aa0: 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d  seen ^ invert)==
5ab0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
5ac0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5ad0: 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ATCH;.        }.
5ae0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
5af0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5b00: 20 20 20 20 63 32 20 3d 20 55 74 66 38 52 65 61      c2 = Utf8Rea
5b10: 64 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  d(zString);.    
5b20: 69 66 28 20 63 3d 3d 63 32 20 29 20 63 6f 6e 74  if( c==c2 ) cont
5b30: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6e 6f  inue;.    if( no
5b40: 43 61 73 65 20 20 26 26 20 73 71 6c 69 74 65 33  Case  && sqlite3
5b50: 54 6f 6c 6f 77 65 72 28 63 29 3d 3d 73 71 6c 69  Tolower(c)==sqli
5b60: 74 65 33 54 6f 6c 6f 77 65 72 28 63 32 29 20 26  te3Tolower(c2) &
5b70: 26 20 63 3c 30 78 38 30 20 26 26 20 63 32 3c 30  & c<0x80 && c2<0
5b80: 78 38 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  x80 ){.      con
5b90: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
5ba0: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65   if( c==matchOne
5bb0: 20 26 26 20 7a 50 61 74 74 65 72 6e 21 3d 7a 45   && zPattern!=zE
5bc0: 73 63 61 70 65 64 20 26 26 20 63 32 21 3d 30 20  scaped && c2!=0 
5bd0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5be0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5bf0: 4d 41 54 43 48 3b 0a 20 20 7d 0a 20 20 72 65 74  MATCH;.  }.  ret
5c00: 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20  urn *zString==0 
5c10: 3f 20 53 51 4c 49 54 45 5f 4d 41 54 43 48 20 3a  ? SQLITE_MATCH :
5c20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3b   SQLITE_NOMATCH;
5c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  .}../*.** The sq
5c40: 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29 20  lite3_strglob() 
5c50: 69 6e 74 65 72 66 61 63 65 2e 20 20 52 65 74 75  interface.  Retu
5c60: 72 6e 20 30 20 6f 6e 20 61 20 6d 61 74 63 68 20  rn 0 on a match 
5c70: 28 6c 69 6b 65 20 73 74 72 63 6d 70 28 29 29 20  (like strcmp()) 
5c80: 61 6e 64 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  and.** non-zero 
5c90: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
5ca0: 61 74 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  atch..*/.int sql
5cb0: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 63 6f 6e  ite3_strglob(con
5cc0: 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 50 61  st char *zGlobPa
5cd0: 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61  ttern, const cha
5ce0: 72 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20 20 72  r *zString){.  r
5cf0: 65 74 75 72 6e 20 70 61 74 74 65 72 6e 43 6f 6d  eturn patternCom
5d00: 70 61 72 65 28 28 75 38 2a 29 7a 47 6c 6f 62 50  pare((u8*)zGlobP
5d10: 61 74 74 65 72 6e 2c 20 28 75 38 2a 29 7a 53 74  attern, (u8*)zSt
5d20: 72 69 6e 67 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c  ring, &globInfo,
5d30: 20 27 5b 27 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   '[');.}../*.** 
5d40: 54 68 65 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  The sqlite3_strl
5d50: 69 6b 65 28 29 20 69 6e 74 65 72 66 61 63 65 2e  ike() interface.
5d60: 20 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 61 20    Return 0 on a 
5d70: 6d 61 74 63 68 20 61 6e 64 20 6e 6f 6e 2d 7a 65  match and non-ze
5d80: 72 6f 20 66 6f 72 0a 2a 2a 20 61 20 6d 69 73 73  ro for.** a miss
5d90: 20 2d 20 6c 69 6b 65 20 73 74 72 63 6d 70 28 29   - like strcmp()
5da0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5db0: 5f 73 74 72 6c 69 6b 65 28 63 6f 6e 73 74 20 63  _strlike(const c
5dc0: 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c 20 63  har *zPattern, c
5dd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c  onst char *zStr,
5de0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 65 73   unsigned int es
5df0: 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 74  c){.  return pat
5e00: 74 65 72 6e 43 6f 6d 70 61 72 65 28 28 75 38 2a  ternCompare((u8*
5e10: 29 7a 50 61 74 74 65 72 6e 2c 20 28 75 38 2a 29  )zPattern, (u8*)
5e20: 7a 53 74 72 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e  zStr, &likeInfoN
5e30: 6f 72 6d 2c 20 65 73 63 29 3b 0a 7d 0a 0a 2f 2a  orm, esc);.}../*
5e40: 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
5e50: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
5e60: 61 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  at the LIKE oper
5e70: 61 74 6f 72 20 28 6f 72 20 47 4c 4f 42 20 77 68  ator (or GLOB wh
5e80: 69 63 68 20 69 73 0a 2a 2a 20 6a 75 73 74 20 61  ich is.** just a
5e90: 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 4c 49   variation of LI
5ea0: 4b 45 29 20 67 65 74 73 20 63 61 6c 6c 65 64 2e  KE) gets called.
5eb0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
5ec0: 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e  or testing.** on
5ed0: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
5ee0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
5ef0: 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
5f00: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f   = 0;.#endif.../
5f10: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5f20: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6b 65 28  ion of the like(
5f30: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
5f40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
5f50: 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65  mplements.** the
5f60: 20 62 75 69 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f   build-in LIKE o
5f70: 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20 66 69  perator.  The fi
5f80: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
5f90: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
5fa0: 74 68 65 0a 2a 2a 20 70 61 74 74 65 72 6e 20 61  the.** pattern a
5fb0: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  nd the second ar
5fc0: 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 73 74  gument is the st
5fd0: 72 69 6e 67 2e 20 20 53 6f 2c 20 74 68 65 20 53  ring.  So, the S
5fe0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a  QL statements:.*
5ff0: 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20 4c 49 4b  *.**       A LIK
6000: 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70  E B.**.** is imp
6010: 6c 65 6d 65 6e 74 65 64 20 61 73 20 6c 69 6b 65  lemented as like
6020: 28 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  (B,A)..**.** Thi
6030: 73 20 73 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20  s same function 
6040: 28 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e  (with a differen
6050: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74  t compareInfo st
6060: 72 75 63 74 75 72 65 29 20 63 6f 6d 70 75 74 65  ructure) compute
6070: 73 0a 2a 2a 20 74 68 65 20 47 4c 4f 42 20 6f 70  s.** the GLOB op
6080: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
6090: 63 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e 63 28  c void likeFunc(
60a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
60b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20  xt *context, .  
60c0: 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c  int argc, .  sql
60d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
60e0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  v.){.  const uns
60f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 2c 20  igned char *zA, 
6100: 2a 7a 42 3b 0a 20 20 75 33 32 20 65 73 63 61 70  *zB;.  u32 escap
6110: 65 3b 0a 20 20 69 6e 74 20 6e 50 61 74 3b 0a 20  e;.  int nPat;. 
6120: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
6130: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
6140: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
6150: 29 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6d 70  );.  struct comp
6160: 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  areInfo *pInfo =
6170: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
6180: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 23 69  ta(context);..#i
6190: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45  fdef SQLITE_LIKE
61a0: 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c  _DOESNT_MATCH_BL
61b0: 4f 42 53 0a 20 20 69 66 28 20 73 71 6c 69 74 65  OBS.  if( sqlite
61c0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
61d0: 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 42 4c  v[0])==SQLITE_BL
61e0: 4f 42 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  OB.   || sqlite3
61f0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
6200: 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  [1])==SQLITE_BLO
6210: 42 0a 20 20 29 7b 0a 23 69 66 64 65 66 20 53 51  B.  ){.#ifdef SQ
6220: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
6230: 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
6240: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  ++;.#endif.    s
6250: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6260: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
6270: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
6280: 65 6e 64 69 66 0a 20 20 7a 42 20 3d 20 73 71 6c  endif.  zB = sql
6290: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
62a0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d  argv[0]);.  zA =
62b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
62c0: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20  ext(argv[1]);.. 
62d0: 20 2f 2a 20 4c 69 6d 69 74 20 74 68 65 20 6c 65   /* Limit the le
62e0: 6e 67 74 68 20 6f 66 20 74 68 65 20 4c 49 4b 45  ngth of the LIKE
62f0: 20 6f 72 20 47 4c 4f 42 20 70 61 74 74 65 72 6e   or GLOB pattern
6300: 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
6310: 6d 73 0a 20 20 2a 2a 20 6f 66 20 64 65 65 70 20  ms.  ** of deep 
6320: 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20 4e 2a  recursion and N*
6330: 4e 20 62 65 68 61 76 69 6f 72 20 69 6e 20 70 61  N behavior in pa
6340: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 29 2e 0a  tternCompare()..
6350: 20 20 2a 2f 0a 20 20 6e 50 61 74 20 3d 20 73 71    */.  nPat = sq
6360: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6370: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74 65  s(argv[0]);.  te
6380: 73 74 63 61 73 65 28 20 6e 50 61 74 3d 3d 64 62  stcase( nPat==db
6390: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
63a0: 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
63b0: 52 4e 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20  RN_LENGTH] );.  
63c0: 74 65 73 74 63 61 73 65 28 20 6e 50 61 74 3d 3d  testcase( nPat==
63d0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
63e0: 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
63f0: 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 2b 31 20 29  TERN_LENGTH]+1 )
6400: 3b 0a 20 20 69 66 28 20 6e 50 61 74 20 3e 20 64  ;.  if( nPat > d
6410: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
6420: 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
6430: 45 52 4e 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  ERN_LENGTH] ){. 
6440: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6450: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
6460: 20 22 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70   "LIKE or GLOB p
6470: 61 74 74 65 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c  attern too compl
6480: 65 78 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ex", -1);.    re
6490: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
64a0: 72 74 28 20 7a 42 3d 3d 73 71 6c 69 74 65 33 5f  rt( zB==sqlite3_
64b0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
64c0: 30 5d 29 20 29 3b 20 20 2f 2a 20 45 6e 63 6f 64  0]) );  /* Encod
64d0: 69 6e 67 20 64 69 64 20 6e 6f 74 20 63 68 61 6e  ing did not chan
64e0: 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20 61 72 67  ge */..  if( arg
64f0: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54  c==3 ){.    /* T
6500: 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63  he escape charac
6510: 74 65 72 20 73 74 72 69 6e 67 20 6d 75 73 74 20  ter string must 
6520: 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69 6e  consist of a sin
6530: 67 6c 65 20 55 54 46 2d 38 20 63 68 61 72 61 63  gle UTF-8 charac
6540: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65  ter..    ** Othe
6550: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
6560: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
6570: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
6580: 64 20 63 68 61 72 20 2a 7a 45 73 63 20 3d 20 73  d char *zEsc = s
6590: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
65a0: 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20  t(argv[2]);.    
65b0: 69 66 28 20 7a 45 73 63 3d 3d 30 20 29 20 72 65  if( zEsc==0 ) re
65c0: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 73 71  turn;.    if( sq
65d0: 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
65e0: 28 28 63 68 61 72 2a 29 7a 45 73 63 2c 20 2d 31  ((char*)zEsc, -1
65f0: 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=1 ){.      sq
6600: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
6610: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20  or(context, .   
6620: 20 20 20 20 20 20 20 22 45 53 43 41 50 45 20 65         "ESCAPE e
6630: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
6640: 65 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61  e a single chara
6650: 63 74 65 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20  cter", -1);.    
6660: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
6670: 20 20 20 20 65 73 63 61 70 65 20 3d 20 73 71 6c      escape = sql
6680: 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 45  ite3Utf8Read(&zE
6690: 73 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  sc);.  }else{.  
66a0: 20 20 65 73 63 61 70 65 20 3d 20 70 49 6e 66 6f    escape = pInfo
66b0: 2d 3e 6d 61 74 63 68 53 65 74 3b 0a 20 20 7d 0a  ->matchSet;.  }.
66c0: 20 20 69 66 28 20 7a 41 20 26 26 20 7a 42 20 29    if( zA && zB )
66d0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
66e0: 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
66f0: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _like_count++;.#
6700: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
6710: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
6720: 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20  text,.          
6730: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 74              patt
6740: 65 72 6e 43 6f 6d 70 61 72 65 28 7a 42 2c 20 7a  ernCompare(zB, z
6750: 41 2c 20 70 49 6e 66 6f 2c 20 65 73 63 61 70 65  A, pInfo, escape
6760: 29 3d 3d 53 51 4c 49 54 45 5f 4d 41 54 43 48 29  )==SQLITE_MATCH)
6770: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
6780: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
6790: 20 74 68 65 20 4e 55 4c 4c 49 46 28 78 2c 79 29   the NULLIF(x,y)
67a0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
67b0: 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69  result is the fi
67c0: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
67d0: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  if the arguments
67e0: 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
67f0: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   The result is N
6800: 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20 61 72  ULL if the.** ar
6810: 67 75 6d 65 6e 74 73 20 61 72 65 20 65 71 75 61  guments are equa
6820: 6c 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 2e  l to each other.
6830: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6840: 6e 75 6c 6c 69 66 46 75 6e 63 28 0a 20 20 73 71  nullifFunc(.  sq
6850: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6860: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
6870: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
6880: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6890: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
68a0: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75  l = sqlite3GetFu
68b0: 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78  ncCollSeq(contex
68c0: 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t);.  UNUSED_PAR
68d0: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
68e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 65  .  if( sqlite3Me
68f0: 6d 43 6f 6d 70 61 72 65 28 61 72 67 76 5b 30 5d  mCompare(argv[0]
6900: 2c 20 61 72 67 76 5b 31 5d 2c 20 70 43 6f 6c 6c  , argv[1], pColl
6910: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
6920: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
6930: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30  (context, argv[0
6940: 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ]);.  }.}../*.**
6950: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
6960: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 76 65  of the sqlite_ve
6970: 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e  rsion() function
6980: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
6990: 20 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20   the version.** 
69a0: 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  of the SQLite li
69b0: 62 72 61 72 79 20 74 68 61 74 20 69 73 20 72 75  brary that is ru
69c0: 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  nning..*/.static
69d0: 20 76 6f 69 64 20 76 65 72 73 69 6f 6e 46 75 6e   void versionFun
69e0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
69f0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6a00: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20   int NotUsed,.  
6a10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6a20: 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e  NotUsed2.){.  UN
6a30: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
6a40: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
6a50: 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  2);.  /* IMP: R-
6a60: 34 38 36 39 39 2d 34 38 36 31 37 20 54 68 69 73  48699-48617 This
6a70: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
6a80: 53 51 4c 20 77 72 61 70 70 65 72 20 61 72 6f 75  SQL wrapper arou
6a90: 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  nd the.  ** sqli
6aa0: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
6ab0: 20 43 2d 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f   C-interface. */
6ac0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6ad0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6ae0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
6af0: 6f 6e 28 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45  on(), -1, SQLITE
6b00: 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a  _STATIC);.}../*.
6b10: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
6b20: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
6b30: 73 6f 75 72 63 65 5f 69 64 28 29 20 66 75 6e 63  source_id() func
6b40: 74 69 6f 6e 2e 20 54 68 65 20 72 65 73 75 6c 74  tion. The result
6b50: 20 69 73 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20   is a string.** 
6b60: 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 73 20  that identifies 
6b70: 74 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 76  the particular v
6b80: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 6f  ersion of the so
6b90: 75 72 63 65 20 63 6f 64 65 20 75 73 65 64 20 74  urce code used t
6ba0: 6f 20 62 75 69 6c 64 0a 2a 2a 20 53 51 4c 69 74  o build.** SQLit
6bb0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6bc0: 64 20 73 6f 75 72 63 65 69 64 46 75 6e 63 28 0a  d sourceidFunc(.
6bd0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6be0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
6bf0: 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c  t NotUsed,.  sql
6c00: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74  ite3_value **Not
6c10: 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45  Used2.){.  UNUSE
6c20: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
6c30: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
6c40: 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 34  .  /* IMP: R-244
6c50: 37 30 2d 33 31 31 33 36 20 54 68 69 73 20 66 75  70-31136 This fu
6c60: 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 53 51 4c  nction is an SQL
6c70: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
6c80: 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
6c90: 5f 73 6f 75 72 63 65 69 64 28 29 20 43 20 69 6e  _sourceid() C in
6ca0: 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71  terface. */.  sq
6cb0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
6cc0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
6cd0: 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c 20 2d  e3_sourceid(), -
6ce0: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
6cf0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
6d00: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
6d10: 65 20 73 71 6c 69 74 65 5f 6c 6f 67 28 29 20 66  e sqlite_log() f
6d20: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
6d30: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
6d40: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 6f  nd.** sqlite3_lo
6d50: 67 28 29 2e 20 20 54 68 65 20 72 65 74 75 72 6e  g().  The return
6d60: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20   value is NULL. 
6d70: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 65 78   The function ex
6d80: 69 73 74 73 20 70 75 72 65 6c 79 20 66 6f 72 0a  ists purely for.
6d90: 2a 2a 20 69 74 73 20 73 69 64 65 2d 65 66 66 65  ** its side-effe
6da0: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cts..*/.static v
6db0: 6f 69 64 20 65 72 72 6c 6f 67 46 75 6e 63 28 0a  oid errlogFunc(.
6dc0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6dd0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
6de0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
6df0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6e00: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
6e10: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55 4e  ETER(argc);.  UN
6e20: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 63  USED_PARAMETER(c
6e30: 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74  ontext);.  sqlit
6e40: 65 33 5f 6c 6f 67 28 73 71 6c 69 74 65 33 5f 76  e3_log(sqlite3_v
6e50: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d  alue_int(argv[0]
6e60: 29 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  ), "%s", sqlite3
6e70: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6e80: 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  [1]));.}../*.** 
6e90: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
6ea0: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d  f the sqlite_com
6eb0: 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28  pileoption_used(
6ec0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ) function..** T
6ed0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6e 20  he result is an 
6ee0: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 64 65  integer that ide
6ef0: 6e 74 69 66 69 65 73 20 69 66 20 74 68 65 20 63  ntifies if the c
6f00: 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 0a 2a  ompiler option.*
6f10: 2a 20 77 61 73 20 75 73 65 64 20 74 6f 20 62 75  * was used to bu
6f20: 69 6c 64 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23  ild SQLite..*/.#
6f30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6f40: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
6f50: 5f 44 49 41 47 53 0a 73 74 61 74 69 63 20 76 6f  _DIAGS.static vo
6f60: 69 64 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  id compileoption
6f70: 75 73 65 64 46 75 6e 63 28 0a 20 20 73 71 6c 69  usedFunc(.  sqli
6f80: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6f90: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
6fa0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
6fb0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
6fc0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61  nst char *zOptNa
6fd0: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  me;.  assert( ar
6fe0: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
6ff0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
7000: 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  );.  /* IMP: R-3
7010: 39 35 36 34 2d 33 36 33 30 35 20 54 68 65 20 73  9564-36305 The s
7020: 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74  qlite_compileopt
7030: 69 6f 6e 5f 75 73 65 64 28 29 20 53 51 4c 0a 20  ion_used() SQL. 
7040: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20   ** function is 
7050: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
7060: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6d   the sqlite3_com
7070: 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28  pileoption_used(
7080: 29 20 43 2f 43 2b 2b 0a 20 20 2a 2a 20 66 75 6e  ) C/C++.  ** fun
7090: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ction..  */.  if
70a0: 28 20 28 7a 4f 70 74 4e 61 6d 65 20 3d 20 28 63  ( (zOptName = (c
70b0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
70c0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
70d0: 67 76 5b 30 5d 29 29 21 3d 30 20 29 7b 0a 20 20  gv[0]))!=0 ){.  
70e0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
70f0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
7100: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
7110: 69 6f 6e 5f 75 73 65 64 28 7a 4f 70 74 4e 61 6d  ion_used(zOptNam
7120: 65 29 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  e));.  }.}.#endi
7130: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7140: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
7150: 49 41 47 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  IAGS */../*.** I
7160: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
7170: 20 74 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70   the sqlite_comp
7180: 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20  ileoption_get() 
7190: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68  function. .** Th
71a0: 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 74  e result is a st
71b0: 72 69 6e 67 20 74 68 61 74 20 69 64 65 6e 74 69  ring that identi
71c0: 66 69 65 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  fies the compile
71d0: 72 20 6f 70 74 69 6f 6e 73 20 0a 2a 2a 20 75 73  r options .** us
71e0: 65 64 20 74 6f 20 62 75 69 6c 64 20 53 51 4c 69  ed to build SQLi
71f0: 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  te..*/.#ifndef S
7200: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49  QLITE_OMIT_COMPI
7210: 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 73  LEOPTION_DIAGS.s
7220: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 69  tatic void compi
7230: 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75 6e 63 28  leoptiongetFunc(
7240: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7250: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7260: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7270: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7280: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73  ){.  int n;.  as
7290: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
72a0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
72b0: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 2f 2a 20  TER(argc);.  /* 
72c0: 49 4d 50 3a 20 52 2d 30 34 39 32 32 2d 32 34 30  IMP: R-04922-240
72d0: 37 36 20 54 68 65 20 73 71 6c 69 74 65 5f 63 6f  76 The sqlite_co
72e0: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28  mpileoption_get(
72f0: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 20  ) SQL function. 
7300: 20 2a 2a 20 69 73 20 61 20 77 72 61 70 70 65 72   ** is a wrapper
7310: 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69   around the sqli
7320: 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  te3_compileoptio
7330: 6e 5f 67 65 74 28 29 20 43 2f 43 2b 2b 20 66 75  n_get() C/C++ fu
7340: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 6e  nction..  */.  n
7350: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7360: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  _int(argv[0]);. 
7370: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7380: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  text(context, sq
7390: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
73a0: 69 6f 6e 5f 67 65 74 28 6e 29 2c 20 2d 31 2c 20  ion_get(n), -1, 
73b0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
73c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
73d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
73e0: 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a  PTION_DIAGS */..
73f0: 2f 2a 20 41 72 72 61 79 20 66 6f 72 20 63 6f 6e  /* Array for con
7400: 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 68 61 6c  verting from hal
7410: 66 2d 62 79 74 65 73 20 28 6e 79 62 62 6c 65 73  f-bytes (nybbles
7420: 29 20 69 6e 74 6f 20 41 53 43 49 49 20 68 65 78  ) into ASCII hex
7430: 0a 2a 2a 20 64 69 67 69 74 73 2e 20 2a 2f 0a 73  .** digits. */.s
7440: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7450: 20 68 65 78 64 69 67 69 74 73 5b 5d 20 3d 20 7b   hexdigits[] = {
7460: 0a 20 20 27 30 27 2c 20 27 31 27 2c 20 27 32 27  .  '0', '1', '2'
7470: 2c 20 27 33 27 2c 20 27 34 27 2c 20 27 35 27 2c  , '3', '4', '5',
7480: 20 27 36 27 2c 20 27 37 27 2c 0a 20 20 27 38 27   '6', '7',.  '8'
7490: 2c 20 27 39 27 2c 20 27 41 27 2c 20 27 42 27 2c  , '9', 'A', 'B',
74a0: 20 27 43 27 2c 20 27 44 27 2c 20 27 45 27 2c 20   'C', 'D', 'E', 
74b0: 27 46 27 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  'F' .};../*.** I
74c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
74d0: 20 74 68 65 20 51 55 4f 54 45 28 29 20 66 75 6e   the QUOTE() fun
74e0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
74f0: 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69  ction takes a si
7500: 6e 67 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  ngle.** argument
7510: 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  .  If the argume
7520: 6e 74 20 69 73 20 6e 75 6d 65 72 69 63 2c 20 74  nt is numeric, t
7530: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
7540: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 0a 2a  is the same as.*
7550: 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20  * the argument. 
7560: 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   If the argument
7570: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
7580: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
7590: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 4e 55 4c  e string.** "NUL
75a0: 4c 22 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  L".  Otherwise, 
75b0: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
75c0: 65 6e 63 6c 6f 73 65 64 20 69 6e 20 73 69 6e 67  enclosed in sing
75d0: 6c 65 20 71 75 6f 74 65 73 20 77 69 74 68 0a 2a  le quotes with.*
75e0: 2a 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 20 65  * single-quote e
75f0: 73 63 61 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  scapes..*/.stati
7600: 63 20 76 6f 69 64 20 71 75 6f 74 65 46 75 6e 63  c void quoteFunc
7610: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7620: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
7630: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
7640: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 61 73  ue **argv){.  as
7650: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
7660: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7670: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 73 77 69  TER(argc);.  swi
7680: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  tch( sqlite3_val
7690: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
76a0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
76b0: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
76c0: 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72 32     double r1, r2
76d0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  ;.      char zBu
76e0: 66 5b 35 30 5d 3b 0a 20 20 20 20 20 20 72 31 20  f[50];.      r1 
76f0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
7700: 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b  double(argv[0]);
7710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7720: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
7730: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 21 2e  Buf), zBuf, "%!.
7740: 31 35 67 22 2c 20 72 31 29 3b 0a 20 20 20 20 20  15g", r1);.     
7750: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 42 75   sqlite3AtoF(zBu
7760: 66 2c 20 26 72 32 2c 20 32 30 2c 20 53 51 4c 49  f, &r2, 20, SQLI
7770: 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
7780: 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
7790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
77a0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
77b0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 21 2e 32  uf), zBuf, "%!.2
77c0: 30 65 22 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  0e", r1);.      
77d0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
77e0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
77f0: 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53  ext, zBuf, -1, S
7800: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
7810: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7820: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
7830: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
7840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7850: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
7860: 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt, argv[0]);.  
7870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7880: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7890: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 63  _BLOB: {.      c
78a0: 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 30 3b 0a  har *zText = 0;.
78b0: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
78c0: 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *zBlob = sqlite
78d0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
78e0: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  v[0]);.      int
78f0: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
7900: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
7910: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  v[0]);.      ass
7920: 65 72 74 28 20 7a 42 6c 6f 62 3d 3d 73 71 6c 69  ert( zBlob==sqli
7930: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
7940: 72 67 76 5b 30 5d 29 20 29 3b 20 2f 2a 20 4e 6f  rgv[0]) ); /* No
7950: 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65   encoding change
7960: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 65 78 74 20   */.      zText 
7970: 3d 20 28 63 68 61 72 20 2a 29 63 6f 6e 74 65 78  = (char *)contex
7980: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
7990: 20 28 32 2a 28 69 36 34 29 6e 42 6c 6f 62 29 2b   (2*(i64)nBlob)+
79a0: 34 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 7a  4); .      if( z
79b0: 54 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Text ){.        
79c0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
79d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b  or(i=0; i<nBlob;
79e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
79f0: 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b 32 5d 20   zText[(i*2)+2] 
7a00: 3d 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c  = hexdigits[(zBl
7a10: 6f 62 5b 69 5d 3e 3e 34 29 26 30 78 30 46 5d 3b  ob[i]>>4)&0x0F];
7a20: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 78 74  .          zText
7a30: 5b 28 69 2a 32 29 2b 33 5d 20 3d 20 68 65 78 64  [(i*2)+3] = hexd
7a40: 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 29  igits[(zBlob[i])
7a50: 26 30 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20  &0x0F];.        
7a60: 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b  }.        zText[
7a70: 28 6e 42 6c 6f 62 2a 32 29 2b 32 5d 20 3d 20 27  (nBlob*2)+2] = '
7a80: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  \'';.        zTe
7a90: 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 33 5d 20  xt[(nBlob*2)+3] 
7aa0: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
7ab0: 7a 54 65 78 74 5b 30 5d 20 3d 20 27 58 27 3b 0a  zText[0] = 'X';.
7ac0: 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 31 5d          zText[1]
7ad0: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
7ae0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7af0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 54  text(context, zT
7b00: 65 78 74 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ext, -1, SQLITE_
7b10: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
7b20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7b30: 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  (zText);.      }
7b40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7b50: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
7b60: 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20  ITE_TEXT: {.    
7b70: 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 20 20 20    int i,j;.     
7b80: 20 75 36 34 20 6e 3b 0a 20 20 20 20 20 20 63 6f   u64 n;.      co
7b90: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
7ba0: 72 20 2a 7a 41 72 67 20 3d 20 73 71 6c 69 74 65  r *zArg = sqlite
7bb0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7bc0: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 63 68 61  v[0]);.      cha
7bd0: 72 20 2a 7a 3b 0a 0a 20 20 20 20 20 20 69 66 28  r *z;..      if(
7be0: 20 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72   zArg==0 ) retur
7bf0: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  n;.      for(i=0
7c00: 2c 20 6e 3d 30 3b 20 7a 41 72 67 5b 69 5d 3b 20  , n=0; zArg[i]; 
7c10: 69 2b 2b 29 7b 20 69 66 28 20 7a 41 72 67 5b 69  i++){ if( zArg[i
7c20: 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b 2b 3b 20 7d  ]=='\'' ) n++; }
7c30: 0a 20 20 20 20 20 20 7a 20 3d 20 63 6f 6e 74 65  .      z = conte
7c40: 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74  xtMalloc(context
7c50: 2c 20 28 28 69 36 34 29 69 29 2b 28 28 69 36 34  , ((i64)i)+((i64
7c60: 29 6e 29 2b 33 29 3b 0a 20 20 20 20 20 20 69 66  )n)+3);.      if
7c70: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ( z ){.        z
7c80: 5b 30 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  [0] = '\'';.    
7c90: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 31      for(i=0, j=1
7ca0: 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b  ; zArg[i]; i++){
7cb0: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
7cc0: 5d 20 3d 20 7a 41 72 67 5b 69 5d 3b 0a 20 20 20  ] = zArg[i];.   
7cd0: 20 20 20 20 20 20 20 69 66 28 20 7a 41 72 67 5b         if( zArg[
7ce0: 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  i]=='\'' ){.    
7cf0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
7d00: 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 20   '\'';.         
7d10: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7d20: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c       z[j++] = '\
7d30: 27 27 3b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d  '';.        z[j]
7d40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
7d50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
7d60: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 6a 2c  t(context, z, j,
7d70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
7d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7d90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
7da0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
7db0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7dc0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
7dd0: 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
7de0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
7df0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
7e00: 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 22 2c 20 34  ntext, "NULL", 4
7e10: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7e20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7e30: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
7e40: 2a 20 54 68 65 20 75 6e 69 63 6f 64 65 28 29 20  * The unicode() 
7e50: 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75 72  function.  Retur
7e60: 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 75 6e  n the integer un
7e70: 69 63 6f 64 65 20 63 6f 64 65 2d 70 6f 69 6e 74  icode code-point
7e80: 20 76 61 6c 75 65 0a 2a 2a 20 66 6f 72 20 74 68   value.** for th
7e90: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
7ea0: 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73  r of the input s
7eb0: 74 72 69 6e 67 2e 20 0a 2a 2f 0a 73 74 61 74 69  tring. .*/.stati
7ec0: 63 20 76 6f 69 64 20 75 6e 69 63 6f 64 65 46 75  c void unicodeFu
7ed0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
7ee0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
7ef0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
7f00: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7f10: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  gv.){.  const un
7f20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d  signed char *z =
7f30: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
7f40: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
7f50: 28 76 6f 69 64 29 61 72 67 63 3b 0a 20 20 69 66  (void)argc;.  if
7f60: 28 20 7a 20 26 26 20 7a 5b 30 5d 20 29 20 73 71  ( z && z[0] ) sq
7f70: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
7f80: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
7f90: 33 55 74 66 38 52 65 61 64 28 26 7a 29 29 3b 0a  3Utf8Read(&z));.
7fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 68 61  }../*.** The cha
7fb0: 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  r() function tak
7fc0: 65 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  es zero or more 
7fd0: 61 72 67 75 6d 65 6e 74 73 2c 20 65 61 63 68 20  arguments, each 
7fe0: 6f 66 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 61  of which is.** a
7ff0: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 74 20 63  n integer.  It c
8000: 6f 6e 73 74 72 75 63 74 73 20 61 20 73 74 72 69  onstructs a stri
8010: 6e 67 20 77 68 65 72 65 20 65 61 63 68 20 63 68  ng where each ch
8020: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 73  aracter of the s
8030: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 74 68 65 20  tring.** is the 
8040: 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
8050: 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  r for the corres
8060: 70 6f 6e 64 69 6e 67 20 69 6e 74 65 67 65 72 20  ponding integer 
8070: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
8080: 74 69 63 20 76 6f 69 64 20 63 68 61 72 46 75 6e  tic void charFun
8090: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
80a0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
80b0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
80c0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
80d0: 76 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  v.){.  unsigned 
80e0: 63 68 61 72 20 2a 7a 2c 20 2a 7a 4f 75 74 3b 0a  char *z, *zOut;.
80f0: 20 20 69 6e 74 20 69 3b 0a 20 20 7a 4f 75 74 20    int i;.  zOut 
8100: 3d 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  = z = sqlite3_ma
8110: 6c 6c 6f 63 36 34 28 20 61 72 67 63 2a 34 2b 31  lloc64( argc*4+1
8120: 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   );.  if( z==0 )
8130: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8140: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
8150: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  (context);.    r
8160: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
8170: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
8180: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
8190: 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 75 6e 73  int64 x;.    uns
81a0: 69 67 6e 65 64 20 63 3b 0a 20 20 20 20 78 20 3d  igned c;.    x =
81b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
81c0: 6e 74 36 34 28 61 72 67 76 5b 69 5d 29 3b 0a 20  nt64(argv[i]);. 
81d0: 20 20 20 69 66 28 20 78 3c 30 20 7c 7c 20 78 3e     if( x<0 || x>
81e0: 30 78 31 30 66 66 66 66 20 29 20 78 20 3d 20 30  0x10ffff ) x = 0
81f0: 78 66 66 66 64 3b 0a 20 20 20 20 63 20 3d 20 28  xfffd;.    c = (
8200: 75 6e 73 69 67 6e 65 64 29 28 78 20 26 20 30 78  unsigned)(x & 0x
8210: 31 66 66 66 66 66 29 3b 0a 20 20 20 20 69 66 28  1fffff);.    if(
8220: 20 63 3c 30 78 30 30 30 38 30 20 29 7b 0a 20 20   c<0x00080 ){.  
8230: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75      *zOut++ = (u
8240: 38 29 28 63 26 30 78 46 46 29 3b 0a 20 20 20 20  8)(c&0xFF);.    
8250: 7d 65 6c 73 65 20 69 66 28 20 63 3c 30 78 30 30  }else if( c<0x00
8260: 38 30 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a 4f  800 ){.      *zO
8270: 75 74 2b 2b 20 3d 20 30 78 43 30 20 2b 20 28 75  ut++ = 0xC0 + (u
8280: 38 29 28 28 63 3e 3e 36 29 26 30 78 31 46 29 3b  8)((c>>6)&0x1F);
8290: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
82a0: 20 30 78 38 30 20 2b 20 28 75 38 29 28 63 20 26   0x80 + (u8)(c &
82b0: 20 30 78 33 46 29 3b 0a 20 20 20 20 7d 65 6c 73   0x3F);.    }els
82c0: 65 20 69 66 28 20 63 3c 30 78 31 30 30 30 30 20  e if( c<0x10000 
82d0: 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  ){.      *zOut++
82e0: 20 3d 20 30 78 45 30 20 2b 20 28 75 38 29 28 28   = 0xE0 + (u8)((
82f0: 63 3e 3e 31 32 29 26 30 78 30 46 29 3b 0a 20 20  c>>12)&0x0F);.  
8300: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
8310: 38 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 36 29  80 + (u8)((c>>6)
8320: 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20 20   & 0x3F);.      
8330: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
8340: 20 28 75 38 29 28 63 20 26 20 30 78 33 46 29 3b   (u8)(c & 0x3F);
8350: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8360: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 46 30    *zOut++ = 0xF0
8370: 20 2b 20 28 75 38 29 28 28 63 3e 3e 31 38 29 20   + (u8)((c>>18) 
8380: 26 20 30 78 30 37 29 3b 0a 20 20 20 20 20 20 2a  & 0x07);.      *
8390: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
83a0: 28 75 38 29 28 28 63 3e 3e 31 32 29 20 26 20 30  (u8)((c>>12) & 0
83b0: 78 33 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75  x3F);.      *zOu
83c0: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38  t++ = 0x80 + (u8
83d0: 29 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29  )((c>>6) & 0x3F)
83e0: 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  ;.      *zOut++ 
83f0: 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 63 20  = 0x80 + (u8)(c 
8400: 26 20 30 78 33 46 29 3b 0a 20 20 20 20 7d 20 20  & 0x3F);.    }  
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 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 5c 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    \.  }.  sqlite
8450: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28  3_result_text64(
8460: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
8470: 7a 2c 20 7a 4f 75 74 2d 7a 2c 20 73 71 6c 69 74  z, zOut-z, sqlit
8480: 65 33 5f 66 72 65 65 2c 20 53 51 4c 49 54 45 5f  e3_free, SQLITE_
8490: 55 54 46 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  UTF8);.}../*.** 
84a0: 54 68 65 20 68 65 78 28 29 20 66 75 6e 63 74 69  The hex() functi
84b0: 6f 6e 2e 20 20 49 6e 74 65 72 70 72 65 74 20 74  on.  Interpret t
84c0: 68 65 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61  he argument as a
84d0: 20 62 6c 6f 62 2e 20 20 52 65 74 75 72 6e 0a 2a   blob.  Return.*
84e0: 2a 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20  * a hexadecimal 
84f0: 72 65 6e 64 65 72 69 6e 67 20 61 73 20 74 65 78  rendering as tex
8500: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
8510: 64 20 68 65 78 46 75 6e 63 28 0a 20 20 73 71 6c  d hexFunc(.  sql
8520: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
8530: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
8540: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
8550: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
8560: 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74  nt i, n;.  const
8570: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8580: 70 42 6c 6f 62 3b 0a 20 20 63 68 61 72 20 2a 7a  pBlob;.  char *z
8590: 48 65 78 2c 20 2a 7a 3b 0a 20 20 61 73 73 65 72  Hex, *z;.  asser
85a0: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
85b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
85c0: 28 61 72 67 63 29 3b 0a 20 20 70 42 6c 6f 62 20  (argc);.  pBlob 
85d0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
85e0: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
85f0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
8600: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
8610: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 6c  );.  assert( pBl
8620: 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ob==sqlite3_valu
8630: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20  e_blob(argv[0]) 
8640: 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69  );  /* No encodi
8650: 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a  ng change */.  z
8660: 20 3d 20 7a 48 65 78 20 3d 20 63 6f 6e 74 65 78   = zHex = contex
8670: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
8680: 20 28 28 69 36 34 29 6e 29 2a 32 20 2b 20 31 29   ((i64)n)*2 + 1)
8690: 3b 0a 20 20 69 66 28 20 7a 48 65 78 20 29 7b 0a  ;.  if( zHex ){.
86a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
86b0: 3b 20 69 2b 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b  ; i++, pBlob++){
86c0: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
86d0: 63 68 61 72 20 63 20 3d 20 2a 70 42 6c 6f 62 3b  char c = *pBlob;
86e0: 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20  .      *(z++) = 
86f0: 68 65 78 64 69 67 69 74 73 5b 28 63 3e 3e 34 29  hexdigits[(c>>4)
8700: 26 30 78 66 5d 3b 0a 20 20 20 20 20 20 2a 28 7a  &0xf];.      *(z
8710: 2b 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b  ++) = hexdigits[
8720: 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d 0a 20 20  c&0xf];.    }.  
8730: 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 73 71    *z = 0;.    sq
8740: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
8750: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 48 65 78 2c  t(context, zHex,
8760: 20 6e 2a 32 2c 20 73 71 6c 69 74 65 33 5f 66 72   n*2, sqlite3_fr
8770: 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ee);.  }.}../*.*
8780: 2a 20 54 68 65 20 7a 65 72 6f 62 6c 6f 62 28 4e  * The zeroblob(N
8790: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
87a0: 6e 73 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  ns a zero-filled
87b0: 20 62 6c 6f 62 20 6f 66 20 73 69 7a 65 20 4e 20   blob of size N 
87c0: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
87d0: 20 76 6f 69 64 20 7a 65 72 6f 62 6c 6f 62 46 75   void zeroblobFu
87e0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
87f0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
8800: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
8810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
8820: 67 76 0a 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  gv.){.  i64 n;. 
8830: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
8840: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
8850: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8860: 28 61 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71  (argc);.  n = sq
8870: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
8880: 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  4(argv[0]);.  if
8890: 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a 20  ( n<0 ) n = 0;. 
88a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
88b0: 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62 36 34 28  sult_zeroblob64(
88c0: 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 20 2f 2a 20  context, n); /* 
88d0: 49 4d 50 3a 20 52 2d 30 30 32 39 33 2d 36 34 39  IMP: R-00293-649
88e0: 39 34 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29  94 */.  if( rc )
88f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8900: 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
8910: 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20 20  context, rc);.  
8920: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  }.}../*.** The r
8930: 65 70 6c 61 63 65 28 29 20 66 75 6e 63 74 69 6f  eplace() functio
8940: 6e 2e 20 20 54 68 72 65 65 20 61 72 67 75 6d 65  n.  Three argume
8950: 6e 74 73 20 61 72 65 20 61 6c 6c 20 73 74 72 69  nts are all stri
8960: 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68 65  ngs: call.** the
8970: 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20 54  m A, B, and C. T
8980: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 73  he result is als
8990: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
89a0: 20 69 73 20 64 65 72 69 76 65 64 0a 2a 2a 20 66   is derived.** f
89b0: 72 6f 6d 20 41 20 62 79 20 72 65 70 6c 61 63 69  rom A by replaci
89c0: 6e 67 20 65 76 65 72 79 20 6f 63 63 75 72 72 65  ng every occurre
89d0: 6e 63 65 20 6f 66 20 42 20 77 69 74 68 20 43 2e  nce of B with C.
89e0: 20 20 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20 6d    The match.** m
89f0: 75 73 74 20 62 65 20 65 78 61 63 74 2e 20 20 43  ust be exact.  C
8a00: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8a10: 65 73 20 61 72 65 20 6e 6f 74 20 75 73 65 64 2e  es are not used.
8a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8a30: 72 65 70 6c 61 63 65 46 75 6e 63 28 0a 20 20 73  replaceFunc(.  s
8a40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8a50: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
8a60: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
8a70: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
8a80: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8a90: 63 68 61 72 20 2a 7a 53 74 72 3b 20 20 20 20 20  char *zStr;     
8aa0: 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
8ab0: 73 74 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63 6f  string A */.  co
8ac0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8ad0: 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20  r *zPattern;    
8ae0: 2f 2a 20 54 68 65 20 70 61 74 74 65 72 6e 20 73  /* The pattern s
8af0: 74 72 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f 6e  tring B */.  con
8b00: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
8b10: 20 2a 7a 52 65 70 3b 20 20 20 20 20 20 20 20 2f   *zRep;        /
8b20: 2a 20 54 68 65 20 72 65 70 6c 61 63 65 6d 65 6e  * The replacemen
8b30: 74 20 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20 20  t string C */.  
8b40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
8b50: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
8b60: 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
8b70: 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20 20  */.  int nStr;  
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b90: 20 53 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a 2f   Size of zStr */
8ba0: 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b  .  int nPattern;
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8bc0: 69 7a 65 20 6f 66 20 7a 50 61 74 74 65 72 6e 20  ize of zPattern 
8bd0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20 20  */.  int nRep;  
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8bf0: 20 53 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a 2f   Size of zRep */
8c00: 0a 20 20 69 36 34 20 6e 4f 75 74 3b 20 20 20 20  .  i64 nOut;    
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8c20: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 7a  aximum size of z
8c30: 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f  Out */.  int loo
8c40: 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
8c50: 20 20 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b 5d    /* Last zStr[]
8c60: 20 74 68 61 74 20 6d 69 67 68 74 20 6d 61 74 63   that might matc
8c70: 68 20 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a  h zPattern[] */.
8c80: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
8c90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8ca0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
8cb0: 20 75 6e 73 69 67 6e 65 64 20 63 6e 74 45 78 70   unsigned cntExp
8cc0: 61 6e 64 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  and;      /* Num
8cd0: 62 65 72 20 7a 4f 75 74 20 65 78 70 61 6e 73 69  ber zOut expansi
8ce0: 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ons */.  sqlite3
8cf0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
8d00: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
8d10: 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 61 73  (context);..  as
8d20: 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b  sert( argc==3 );
8d30: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8d40: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 7a 53 74  TER(argc);.  zSt
8d50: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
8d60: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
8d70: 0a 20 20 69 66 28 20 7a 53 74 72 3d 3d 30 20 29  .  if( zStr==0 )
8d80: 20 72 65 74 75 72 6e 3b 0a 20 20 6e 53 74 72 20   return;.  nStr 
8d90: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8da0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
8db0: 20 20 61 73 73 65 72 74 28 20 7a 53 74 72 3d 3d    assert( zStr==
8dc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8dd0: 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20  xt(argv[0]) );  
8de0: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
8df0: 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 50 61 74 74  hange */.  zPatt
8e00: 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ern = sqlite3_va
8e10: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
8e20: 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72  );.  if( zPatter
8e30: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  n==0 ){.    asse
8e40: 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rt( sqlite3_valu
8e50: 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 3d  e_type(argv[1])=
8e60: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20  =SQLITE_NULL.   
8e70: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
8e80: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
8e90: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e  andle(context)->
8ea0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
8eb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8ec0: 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 5b 30    if( zPattern[0
8ed0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  ]==0 ){.    asse
8ee0: 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rt( sqlite3_valu
8ef0: 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 21  e_type(argv[1])!
8f00: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a  =SQLITE_NULL );.
8f10: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8f20: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
8f30: 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  , argv[0]);.    
8f40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 50  return;.  }.  nP
8f50: 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33  attern = sqlite3
8f60: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
8f70: 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[1]);.  assert(
8f80: 20 7a 50 61 74 74 65 72 6e 3d 3d 73 71 6c 69 74   zPattern==sqlit
8f90: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8fa0: 67 76 5b 31 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f  gv[1]) );  /* No
8fb0: 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65   encoding change
8fc0: 20 2a 2f 0a 20 20 7a 52 65 70 20 3d 20 73 71 6c   */.  zRep = sql
8fd0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8fe0: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  argv[2]);.  if( 
8ff0: 7a 52 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  zRep==0 ) return
9000: 3b 0a 20 20 6e 52 65 70 20 3d 20 73 71 6c 69 74  ;.  nRep = sqlit
9010: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
9020: 72 67 76 5b 32 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[2]);.  asser
9030: 74 28 20 7a 52 65 70 3d 3d 73 71 6c 69 74 65 33  t( zRep==sqlite3
9040: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9050: 5b 32 5d 29 20 29 3b 0a 20 20 6e 4f 75 74 20 3d  [2]) );.  nOut =
9060: 20 6e 53 74 72 20 2b 20 31 3b 0a 20 20 61 73 73   nStr + 1;.  ass
9070: 65 72 74 28 20 6e 4f 75 74 3c 53 51 4c 49 54 45  ert( nOut<SQLITE
9080: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
9090: 20 7a 4f 75 74 20 3d 20 63 6f 6e 74 65 78 74 4d   zOut = contextM
90a0: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28  alloc(context, (
90b0: 69 36 34 29 6e 4f 75 74 29 3b 0a 20 20 69 66 28  i64)nOut);.  if(
90c0: 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zOut==0 ){.    
90d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 6f  return;.  }.  lo
90e0: 6f 70 4c 69 6d 69 74 20 3d 20 6e 53 74 72 20 2d  opLimit = nStr -
90f0: 20 6e 50 61 74 74 65 72 6e 3b 20 20 0a 20 20 63   nPattern;  .  c
9100: 6e 74 45 78 70 61 6e 64 20 3d 20 30 3b 0a 20 20  ntExpand = 0;.  
9110: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 3d 6c 6f  for(i=j=0; i<=lo
9120: 6f 70 4c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20  opLimit; i++){. 
9130: 20 20 20 69 66 28 20 7a 53 74 72 5b 69 5d 21 3d     if( zStr[i]!=
9140: 7a 50 61 74 74 65 72 6e 5b 30 5d 20 7c 7c 20 6d  zPattern[0] || m
9150: 65 6d 63 6d 70 28 26 7a 53 74 72 5b 69 5d 2c 20  emcmp(&zStr[i], 
9160: 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61 74 74 65  zPattern, nPatte
9170: 72 6e 29 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75  rn) ){.      zOu
9180: 74 5b 6a 2b 2b 5d 20 3d 20 7a 53 74 72 5b 69 5d  t[j++] = zStr[i]
9190: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
91a0: 20 20 20 69 66 28 20 6e 52 65 70 3e 6e 50 61 74     if( nRep>nPat
91b0: 74 65 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tern ){.        
91c0: 6e 4f 75 74 20 2b 3d 20 6e 52 65 70 20 2d 20 6e  nOut += nRep - n
91d0: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 20  Pattern;.       
91e0: 20 74 65 73 74 63 61 73 65 28 20 6e 4f 75 74 2d   testcase( nOut-
91f0: 31 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  1==db->aLimit[SQ
9200: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
9210: 48 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  H] );.        te
9220: 73 74 63 61 73 65 28 20 6e 4f 75 74 2d 32 3d 3d  stcase( nOut-2==
9230: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
9240: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
9250: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
9260: 4f 75 74 2d 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  Out-1>db->aLimit
9270: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
9280: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 20  NGTH] ){.       
9290: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
92a0: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
92b0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
92c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
92d0: 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  zOut);.         
92e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
92f0: 20 7d 0a 20 20 20 20 20 20 20 20 63 6e 74 45 78   }.        cntEx
9300: 70 61 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  pand++;.        
9310: 69 66 28 20 28 63 6e 74 45 78 70 61 6e 64 26 28  if( (cntExpand&(
9320: 63 6e 74 45 78 70 61 6e 64 2d 31 29 29 3d 3d 30  cntExpand-1))==0
9330: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9340: 20 47 72 6f 77 20 74 68 65 20 73 69 7a 65 20 6f   Grow the size o
9350: 66 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  f the output buf
9360: 66 65 72 20 6f 6e 6c 79 20 6f 6e 20 73 75 62 73  fer only on subs
9370: 74 69 74 75 74 69 6f 6e 73 0a 20 20 20 20 20 20  titutions.      
9380: 20 20 20 20 2a 2a 20 77 68 6f 73 65 20 69 6e 64      ** whose ind
9390: 65 78 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ex is a power of
93a0: 20 74 77 6f 3a 20 31 2c 20 32 2c 20 34 2c 20 38   two: 1, 2, 4, 8
93b0: 2c 20 31 36 2c 20 33 32 2c 20 2e 2e 2e 20 2a 2f  , 16, 32, ... */
93c0: 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 7a  .          u8 *z
93d0: 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  Old;.          z
93e0: 4f 6c 64 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20  Old = zOut;.    
93f0: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c        zOut = sql
9400: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 7a  ite3_realloc64(z
9410: 4f 75 74 2c 20 28 69 6e 74 29 6e 4f 75 74 20 2b  Out, (int)nOut +
9420: 20 28 6e 4f 75 74 20 2d 20 6e 53 74 72 20 2d 20   (nOut - nStr - 
9430: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
9440: 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  f( zOut==0 ){.  
9450: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9460: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
9470: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
9480: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9490: 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20  e3_free(zOld);. 
94a0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
94b0: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
94c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
94d0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  .      memcpy(&z
94e0: 4f 75 74 5b 6a 5d 2c 20 7a 52 65 70 2c 20 6e 52  Out[j], zRep, nR
94f0: 65 70 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d 20  ep);.      j += 
9500: 6e 52 65 70 3b 0a 20 20 20 20 20 20 69 20 2b 3d  nRep;.      i +=
9510: 20 6e 50 61 74 74 65 72 6e 2d 31 3b 0a 20 20 20   nPattern-1;.   
9520: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
9530: 20 6a 2b 6e 53 74 72 2d 69 2b 31 3c 3d 6e 4f 75   j+nStr-i+1<=nOu
9540: 74 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a  t );.  memcpy(&z
9550: 4f 75 74 5b 6a 5d 2c 20 26 7a 53 74 72 5b 69 5d  Out[j], &zStr[i]
9560: 2c 20 6e 53 74 72 2d 69 29 3b 0a 20 20 6a 20 2b  , nStr-i);.  j +
9570: 3d 20 6e 53 74 72 20 2d 20 69 3b 0a 20 20 61 73  = nStr - i;.  as
9580: 73 65 72 74 28 20 6a 3c 3d 6e 4f 75 74 20 29 3b  sert( j<=nOut );
9590: 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a  .  zOut[j] = 0;.
95a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
95b0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
95c0: 63 68 61 72 2a 29 7a 4f 75 74 2c 20 6a 2c 20 73  char*)zOut, j, s
95d0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a  qlite3_free);.}.
95e0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
95f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 52 49  ation of the TRI
9600: 4d 28 29 2c 20 4c 54 52 49 4d 28 29 2c 20 61 6e  M(), LTRIM(), an
9610: 64 20 52 54 52 49 4d 28 29 20 66 75 6e 63 74 69  d RTRIM() functi
9620: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 75 73 65 72  ons..** The user
9630: 64 61 74 61 20 69 73 20 30 78 31 20 66 6f 72 20  data is 0x1 for 
9640: 6c 65 66 74 20 74 72 69 6d 2c 20 30 78 32 20 66  left trim, 0x2 f
9650: 6f 72 20 72 69 67 68 74 20 74 72 69 6d 2c 20 30  or right trim, 0
9660: 78 33 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  x3 for both..*/.
9670: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 69 6d  static void trim
9680: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
9690: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
96a0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
96b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
96c0: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
96d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
96e0: 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  In;         /* I
96f0: 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  nput string */. 
9700: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
9710: 63 68 61 72 20 2a 7a 43 68 61 72 53 65 74 3b 20  char *zCharSet; 
9720: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 63 68 61     /* Set of cha
9730: 72 61 63 74 65 72 73 20 74 6f 20 74 72 69 6d 20  racters to trim 
9740: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 3b 20 20 20  */.  int nIn;   
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9760: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9770: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 69 6e 70   of bytes in inp
9780: 75 74 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ut */.  int flag
9790: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
97a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
97b0: 74 72 69 6d 6c 65 66 74 20 20 32 3a 20 74 72 69  trimleft  2: tri
97c0: 6d 72 69 67 68 74 20 20 33 3a 20 74 72 69 6d 20  mright  3: trim 
97d0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
9800: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
9810: 67 6e 65 64 20 63 68 61 72 20 2a 61 4c 65 6e 20  gned char *aLen 
9820: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
9830: 20 4c 65 6e 67 74 68 20 6f 66 20 65 61 63 68 20   Length of each 
9840: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 43 68  character in zCh
9850: 61 72 53 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  arSet */.  unsig
9860: 6e 65 64 20 63 68 61 72 20 2a 2a 61 7a 43 68 61  ned char **azCha
9870: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
9880: 49 6e 64 69 76 69 64 75 61 6c 20 63 68 61 72 61  Individual chara
9890: 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65  cters in zCharSe
98a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61 72  t */.  int nChar
98b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
98c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
98d0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
98e0: 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a   in zCharSet */.
98f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
9900: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
9910: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
9920: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9930: 20 7d 0a 20 20 7a 49 6e 20 3d 20 73 71 6c 69 74   }.  zIn = sqlit
9940: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
9950: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49  gv[0]);.  if( zI
9960: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
9970: 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76   nIn = sqlite3_v
9980: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
9990: 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0]);.  assert( z
99a0: 49 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  In==sqlite3_valu
99b0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20  e_text(argv[0]) 
99c0: 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31  );.  if( argc==1
99d0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
99e0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
99f0: 61 72 20 6c 65 6e 4f 6e 65 5b 5d 20 3d 20 7b 20  ar lenOne[] = { 
9a00: 31 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20  1 };.    static 
9a10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20  unsigned char * 
9a20: 63 6f 6e 73 74 20 61 7a 4f 6e 65 5b 5d 20 3d 20  const azOne[] = 
9a30: 7b 20 28 75 38 2a 29 22 20 22 20 7d 3b 0a 20 20  { (u8*)" " };.  
9a40: 20 20 6e 43 68 61 72 20 3d 20 31 3b 0a 20 20 20    nChar = 1;.   
9a50: 20 61 4c 65 6e 20 3d 20 28 75 38 2a 29 6c 65 6e   aLen = (u8*)len
9a60: 4f 6e 65 3b 0a 20 20 20 20 61 7a 43 68 61 72 20  One;.    azChar 
9a70: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
9a80: 20 2a 2a 29 61 7a 4f 6e 65 3b 0a 20 20 20 20 7a   **)azOne;.    z
9a90: 43 68 61 72 53 65 74 20 3d 20 30 3b 0a 20 20 7d  CharSet = 0;.  }
9aa0: 65 6c 73 65 20 69 66 28 20 28 7a 43 68 61 72 53  else if( (zCharS
9ab0: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  et = sqlite3_val
9ac0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
9ad0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
9ae0: 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rn;.  }else{.   
9af0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
9b00: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 66 6f 72  char *z;.    for
9b10: 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43 68  (z=zCharSet, nCh
9b20: 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b  ar=0; *z; nChar+
9b30: 2b 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45  +){.      SQLITE
9b40: 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20  _SKIP_UTF8(z);. 
9b50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 68     }.    if( nCh
9b60: 61 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 7a  ar>0 ){.      az
9b70: 43 68 61 72 20 3d 20 63 6f 6e 74 65 78 74 4d 61  Char = contextMa
9b80: 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28  lloc(context, ((
9b90: 69 36 34 29 6e 43 68 61 72 29 2a 28 73 69 7a 65  i64)nChar)*(size
9ba0: 6f 66 28 63 68 61 72 2a 29 2b 31 29 29 3b 0a 20  of(char*)+1));. 
9bb0: 20 20 20 20 20 69 66 28 20 61 7a 43 68 61 72 3d       if( azChar=
9bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
9bd0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
9be0: 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 6e 73 69      aLen = (unsi
9bf0: 67 6e 65 64 20 63 68 61 72 2a 29 26 61 7a 43 68  gned char*)&azCh
9c00: 61 72 5b 6e 43 68 61 72 5d 3b 0a 20 20 20 20 20  ar[nChar];.     
9c10: 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c   for(z=zCharSet,
9c20: 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43   nChar=0; *z; nC
9c30: 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  har++){.        
9c40: 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 20 3d 20  azChar[nChar] = 
9c50: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
9c60: 29 7a 3b 0a 20 20 20 20 20 20 20 20 53 51 4c 49  )z;.        SQLI
9c70: 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b  TE_SKIP_UTF8(z);
9c80: 0a 20 20 20 20 20 20 20 20 61 4c 65 6e 5b 6e 43  .        aLen[nC
9c90: 68 61 72 5d 20 3d 20 28 75 38 29 28 7a 20 2d 20  har] = (u8)(z - 
9ca0: 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 29 3b 0a  azChar[nChar]);.
9cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9cc0: 7d 0a 20 20 69 66 28 20 6e 43 68 61 72 3e 30 20  }.  if( nChar>0 
9cd0: 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 53  ){.    flags = S
9ce0: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
9cf0: 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  (sqlite3_user_da
9d00: 74 61 28 63 6f 6e 74 65 78 74 29 29 3b 0a 20 20  ta(context));.  
9d10: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 31 20    if( flags & 1 
9d20: 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
9d30: 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  nIn>0 ){.       
9d40: 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20   int len = 0;.  
9d50: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9d60: 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nChar; i++){.  
9d70: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c          len = aL
9d80: 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  en[i];.         
9d90: 20 69 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26   if( len<=nIn &&
9da0: 20 6d 65 6d 63 6d 70 28 7a 49 6e 2c 20 61 7a 43   memcmp(zIn, azC
9db0: 68 61 72 5b 69 5d 2c 20 6c 65 6e 29 3d 3d 30 20  har[i], len)==0 
9dc0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
9dd0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
9de0: 3e 3d 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b  >=nChar ) break;
9df0: 0a 20 20 20 20 20 20 20 20 7a 49 6e 20 2b 3d 20  .        zIn += 
9e00: 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e  len;.        nIn
9e10: 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d   -= len;.      }
9e20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
9e30: 6c 61 67 73 20 26 20 32 20 29 7b 0a 20 20 20 20  lags & 2 ){.    
9e40: 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29    while( nIn>0 )
9e50: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
9e60: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
9e70: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b  or(i=0; i<nChar;
9e80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
9e90: 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a   len = aLen[i];.
9ea0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 65            if( le
9eb0: 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65 6d 63 6d 70  n<=nIn && memcmp
9ec0: 28 26 7a 49 6e 5b 6e 49 6e 2d 6c 65 6e 5d 2c 61  (&zIn[nIn-len],a
9ed0: 7a 43 68 61 72 5b 69 5d 2c 6c 65 6e 29 3d 3d 30  zChar[i],len)==0
9ee0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9ef0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
9f00: 69 3e 3d 6e 43 68 61 72 20 29 20 62 72 65 61 6b  i>=nChar ) break
9f10: 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 2d 3d  ;.        nIn -=
9f20: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20   len;.      }.  
9f30: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 43 68 61    }.    if( zCha
9f40: 72 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71  rSet ){.      sq
9f50: 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 68 61  lite3_free(azCha
9f60: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
9f70: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
9f80: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
9f90: 61 72 2a 29 7a 49 6e 2c 20 6e 49 6e 2c 20 53 51  ar*)zIn, nIn, SQ
9fa0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
9fb0: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
9fc0: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57  TE_ENABLE_UNKNOW
9fd0: 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 2f  N_SQL_FUNCTION./
9fe0: 2a 0a 2a 2a 20 54 68 65 20 22 75 6e 6b 6e 6f 77  *.** The "unknow
9ff0: 6e 22 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  n" function is a
a000: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 75 62  utomatically sub
a010: 73 74 69 74 75 74 65 64 20 69 6e 20 70 6c 61 63  stituted in plac
a020: 65 20 6f 66 0a 2a 2a 20 61 6e 79 20 75 6e 72 65  e of.** any unre
a030: 63 6f 67 6e 69 7a 65 64 20 66 75 6e 63 74 69 6f  cognized functio
a040: 6e 20 6e 61 6d 65 20 77 68 65 6e 20 64 6f 69 6e  n name when doin
a050: 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 6f 72 20  g an EXPLAIN or 
a060: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
a070: 41 4e 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 53  AN.** when the S
a080: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b  QLITE_ENABLE_UNK
a090: 4e 4f 57 4e 5f 46 55 4e 43 54 49 4f 4e 20 63 6f  NOWN_FUNCTION co
a0a0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
a0b0: 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2a 20 57 68  n is used..** Wh
a0c0: 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 33 22  en the "sqlite3"
a0d0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 73 68   command-line sh
a0e0: 65 6c 6c 20 69 73 20 62 75 69 6c 74 20 75 73 69  ell is built usi
a0f0: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
a100: 61 6c 69 74 79 2c 0a 2a 2a 20 74 68 61 74 20 61  ality,.** that a
a110: 6c 6c 6f 77 73 20 61 6e 20 45 58 50 4c 41 49 4e  llows an EXPLAIN
a120: 20 6f 72 20 45 58 50 4c 41 49 4e 20 51 55 45 52   or EXPLAIN QUER
a130: 59 20 50 4c 41 4e 20 66 6f 72 20 63 6f 6d 70 6c  Y PLAN for compl
a140: 65 78 20 71 75 65 72 69 65 73 0a 2a 2a 20 69 6e  ex queries.** in
a150: 76 6f 6c 76 69 6e 67 20 61 70 70 6c 69 63 61 74  volving applicat
a160: 69 6f 6e 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ion-defined func
a170: 74 69 6f 6e 73 20 74 6f 20 62 65 20 65 78 61 6d  tions to be exam
a180: 69 6e 65 64 20 69 6e 20 61 20 67 65 6e 65 72 69  ined in a generi
a190: 63 0a 2a 2a 20 73 71 6c 69 74 65 33 20 73 68 65  c.** sqlite3 she
a1a0: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
a1b0: 69 64 20 75 6e 6b 6e 6f 77 6e 46 75 6e 63 28 0a  id unknownFunc(.
a1c0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
a1d0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
a1e0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
a1f0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
a200: 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  {.  /* no-op */.
a210: 7d 0a 23 65 6e 64 69 66 20 2f 2a 53 51 4c 49 54  }.#endif /*SQLIT
a220: 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e  E_ENABLE_UNKNOWN
a230: 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 2a 2f 0a  _SQL_FUNCTION*/.
a240: 0a 0a 2f 2a 20 49 4d 50 3a 20 52 2d 32 35 33 36  ../* IMP: R-2536
a250: 31 2d 31 36 31 35 30 20 54 68 69 73 20 66 75 6e  1-16150 This fun
a260: 63 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64  ction is omitted
a270: 20 66 72 6f 6d 20 53 51 4c 69 74 65 20 62 79 20   from SQLite by 
a280: 64 65 66 61 75 6c 74 2e 20 49 74 0a 2a 2a 20 69  default. It.** i
a290: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
a2a0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   if the SQLITE_S
a2b0: 4f 55 4e 44 45 58 20 63 6f 6d 70 69 6c 65 2d 74  OUNDEX compile-t
a2c0: 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  ime option is us
a2d0: 65 64 0a 2a 2a 20 77 68 65 6e 20 53 51 4c 69 74  ed.** when SQLit
a2e0: 65 20 69 73 20 62 75 69 6c 74 2e 0a 2a 2f 0a 23  e is built..*/.#
a2f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55  ifdef SQLITE_SOU
a300: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  NDEX./*.** Compu
a310: 74 65 20 74 68 65 20 73 6f 75 6e 64 65 78 20 65  te the soundex e
a320: 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 77 6f 72  ncoding of a wor
a330: 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d  d..**.** IMP: R-
a340: 35 39 37 38 32 2d 30 30 30 37 32 20 54 68 65 20  59782-00072 The 
a350: 73 6f 75 6e 64 65 78 28 58 29 20 66 75 6e 63 74  soundex(X) funct
a360: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74  ion returns a st
a370: 72 69 6e 67 20 74 68 61 74 20 69 73 20 74 68 65  ring that is the
a380: 0a 2a 2a 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f  .** soundex enco
a390: 64 69 6e 67 20 6f 66 20 74 68 65 20 73 74 72 69  ding of the stri
a3a0: 6e 67 20 58 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ng X. .*/.static
a3b0: 20 76 6f 69 64 20 73 6f 75 6e 64 65 78 46 75 6e   void soundexFun
a3c0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
a3d0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
a3e0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
a3f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
a400: 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 52 65 73  v.){.  char zRes
a410: 75 6c 74 5b 38 5d 3b 0a 20 20 63 6f 6e 73 74 20  ult[8];.  const 
a420: 75 38 20 2a 7a 49 6e 3b 0a 20 20 69 6e 74 20 69  u8 *zIn;.  int i
a430: 2c 20 6a 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  , j;.  static co
a440: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
a450: 72 20 69 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  r iCode[] = {.  
a460: 20 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 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a490: 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,.    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 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a4c0: 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20  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 20 30 2c  , 0, 0, 0, 0, 0,
a4f0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c   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 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
a530: 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c    0, 0, 1, 2, 3,
a540: 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20   0, 1, 2, 0, 0, 
a550: 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30  2, 2, 4, 5, 5, 0
a560: 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32  ,.    1, 2, 6, 2
a570: 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c  , 3, 0, 1, 0, 2,
a580: 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 2, 0, 0, 0, 
a590: 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20  0, 0,.    0, 0, 
a5a0: 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32  1, 2, 3, 0, 1, 2
a5b0: 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c  , 0, 0, 2, 2, 4,
a5c0: 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c   5, 5, 0,.    1,
a5d0: 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20   2, 6, 2, 3, 0, 
a5e0: 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30  1, 0, 2, 0, 2, 0
a5f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
a600: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  };.  assert( arg
a610: 63 3d 3d 31 20 29 3b 0a 20 20 7a 49 6e 20 3d 20  c==1 );.  zIn = 
a620: 28 75 38 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  (u8*)sqlite3_val
a630: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
a640: 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29  ;.  if( zIn==0 )
a650: 20 7a 49 6e 20 3d 20 28 75 38 2a 29 22 22 3b 0a   zIn = (u8*)"";.
a660: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b 69    for(i=0; zIn[i
a670: 5d 20 26 26 20 21 73 71 6c 69 74 65 33 49 73 61  ] && !sqlite3Isa
a680: 6c 70 68 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b  lpha(zIn[i]); i+
a690: 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69  +){}.  if( zIn[i
a6a0: 5d 20 29 7b 0a 20 20 20 20 75 38 20 70 72 65 76  ] ){.    u8 prev
a6b0: 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e  code = iCode[zIn
a6c0: 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 7a  [i]&0x7f];.    z
a6d0: 52 65 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69  Result[0] = sqli
a6e0: 74 65 33 54 6f 75 70 70 65 72 28 7a 49 6e 5b 69  te3Toupper(zIn[i
a6f0: 5d 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b  ]);.    for(j=1;
a700: 20 6a 3c 34 20 26 26 20 7a 49 6e 5b 69 5d 3b 20   j<4 && zIn[i]; 
a710: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
a720: 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e  code = iCode[zIn
a730: 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 20  [i]&0x7f];.     
a740: 20 69 66 28 20 63 6f 64 65 3e 30 20 29 7b 0a 20   if( code>0 ){. 
a750: 20 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 21         if( code!
a760: 3d 70 72 65 76 63 6f 64 65 20 29 7b 0a 20 20 20  =prevcode ){.   
a770: 20 20 20 20 20 20 20 70 72 65 76 63 6f 64 65 20         prevcode 
a780: 3d 20 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  = code;.        
a790: 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d    zResult[j++] =
a7a0: 20 63 6f 64 65 20 2b 20 27 30 27 3b 0a 20 20 20   code + '0';.   
a7b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
a7c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 72 65 76  se{.        prev
a7d0: 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  code = 0;.      
a7e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  }.    }.    whil
a7f0: 65 28 20 6a 3c 34 20 29 7b 0a 20 20 20 20 20 20  e( j<4 ){.      
a800: 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27  zResult[j++] = '
a810: 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52  0';.    }.    zR
a820: 65 73 75 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  esult[j] = 0;.  
a830: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a840: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
a850: 52 65 73 75 6c 74 2c 20 34 2c 20 53 51 4c 49 54  Result, 4, SQLIT
a860: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
a870: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 4d  }else{.    /* IM
a880: 50 3a 20 52 2d 36 34 38 39 34 2d 35 30 33 32 31  P: R-64894-50321
a890: 20 54 68 65 20 73 74 72 69 6e 67 20 22 3f 30 30   The string "?00
a8a0: 30 22 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  0" is returned i
a8b0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 20  f the argument. 
a8c0: 20 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 20 6f 72     ** is NULL or
a8d0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 41 53 43   contains no ASC
a8e0: 49 49 20 61 6c 70 68 61 62 65 74 69 63 20 63 68  II alphabetic ch
a8f0: 61 72 61 63 74 65 72 73 2e 20 2a 2f 0a 20 20 20  aracters. */.   
a900: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a910: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 3f  text(context, "?
a920: 30 30 30 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  000", 4, SQLITE_
a930: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
a940: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a950: 53 4f 55 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  SOUNDEX */..#ifn
a960: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a970: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
a980: 2a 0a 2a 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20  *.** A function 
a990: 74 68 61 74 20 6c 6f 61 64 73 20 61 20 73 68 61  that loads a sha
a9a0: 72 65 64 2d 6c 69 62 72 61 72 79 20 65 78 74 65  red-library exte
a9b0: 6e 73 69 6f 6e 20 74 68 65 6e 20 72 65 74 75 72  nsion then retur
a9c0: 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  ns NULL..*/.stat
a9d0: 69 63 20 76 6f 69 64 20 6c 6f 61 64 45 78 74 28  ic void loadExt(
a9e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
a9f0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
aa00: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
aa10: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
aa20: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
aa30: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
aa40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
aa50: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f  t(argv[0]);.  co
aa60: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 6f 63 3b  nst char *zProc;
aa70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
aa80: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
aa90: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
aaa0: 78 74 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  xt);.  char *zEr
aab0: 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  rMsg = 0;..  /* 
aac0: 44 69 73 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 61  Disallow the loa
aad0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 53 51  d_extension() SQ
aae0: 4c 20 66 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73  L function unles
aaf0: 73 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 6f 61  s the SQLITE_Loa
ab00: 64 45 78 74 46 75 6e 63 0a 20 20 2a 2a 20 66 6c  dExtFunc.  ** fl
ab10: 61 67 20 69 73 20 73 65 74 2e 20 20 53 65 65 20  ag is set.  See 
ab20: 74 68 65 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  the sqlite3_enab
ab30: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
ab40: 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
ab50: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
ab60: 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 46   SQLITE_LoadExtF
ab70: 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  unc)==0 ){.    s
ab80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
ab90: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 6e 6f  ror(context, "no
aba0: 74 20 61 75 74 68 6f 72 69 7a 65 64 22 2c 20 2d  t authorized", -
abb0: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
abc0: 20 20 7d 0a 0a 20 20 69 66 28 20 61 72 67 63 3d    }..  if( argc=
abd0: 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20  =2 ){.    zProc 
abe0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
abf0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
ac00: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d  xt(argv[1]);.  }
ac10: 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 63 20  else{.    zProc 
ac20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 0;.  }.  if( z
ac30: 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33 5f  File && sqlite3_
ac40: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
ac50: 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
ac60: 20 26 7a 45 72 72 4d 73 67 29 20 29 7b 0a 20 20   &zErrMsg) ){.  
ac70: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
ac80: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
ac90: 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20 20  zErrMsg, -1);.  
aca0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
acb0: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23  ErrMsg);.  }.}.#
acc0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  endif.../*.** An
acd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
ace0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
acf0: 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20 63  ture holds the c
ad00: 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20 73  ontext of a.** s
ad10: 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61 67  um() or avg() ag
ad20: 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61 74  gregate computat
ad30: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
ad40: 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53 75  struct SumCtx Su
ad50: 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75 6d  mCtx;.struct Sum
ad60: 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Ctx {.  double r
ad70: 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46 6c 6f  Sum;      /* Flo
ad80: 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75 6d 20  ating point sum 
ad90: 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b 20 20  */.  i64 iSum;  
ada0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
adb0: 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20 69 36  r sum */   .  i6
adc0: 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  4 cnt;          
add0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
ade0: 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f 0a  ments summed */.
adf0: 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b 20 20    u8 overflow;  
ae00: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
ae10: 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
ae20: 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61 70 70  seen */.  u8 app
ae30: 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  rox;        /* T
ae40: 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74 65 67  rue if non-integ
ae50: 65 72 20 76 61 6c 75 65 20 77 61 73 20 69 6e 70  er value was inp
ae60: 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20 2a 2f  ut to the sum */
ae70: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
ae80: 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  nes used to comp
ae90: 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61 76 65  ute the sum, ave
aea0: 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61 6c 2e  rage, and total.
aeb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d 28 29  .**.** The SUM()
aec0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f 77   function follow
aed0: 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29 20 53  s the (broken) S
aee0: 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68 69 63  QL standard whic
aef0: 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  h means.** that 
af00: 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  it returns NULL 
af10: 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65 72 20  if it sums over 
af20: 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f 54 41  no inputs.  TOTA
af30: 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 2e 30  L returns.** 0.0
af40: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 20   in that case.  
af50: 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54 4f 54  In addition, TOT
af60: 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  AL always return
af70: 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72 65 0a  s a float where.
af80: 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72 65 74  ** SUM might ret
af90: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 69  urn an integer i
afa0: 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63 6f 75  f it never encou
afb0: 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69 6e 67  nters a floating
afc0: 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 2e   point.** value.
afd0: 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20 66 61    TOTAL never fa
afe0: 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d 69 67  ils, but SUM mig
aff0: 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20 65 78  ht through an ex
b000: 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20 69 74  ception if.** it
b010: 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20 69 6e   overflows an in
b020: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
b030: 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73 71   void sumStep(sq
b040: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
b050: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
b060: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
b070: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43 74  **argv){.  SumCt
b080: 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70 65  x *p;.  int type
b090: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
b0a0: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
b0b0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
b0c0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
b0d0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
b0e0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
b0f0: 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  (*p));.  type = 
b100: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75  sqlite3_value_nu
b110: 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76 5b  meric_type(argv[
b120: 30 5d 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0]);.  if( p && 
b130: 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  type!=SQLITE_NUL
b140: 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e 74 2b  L ){.    p->cnt+
b150: 2b 3b 0a 20 20 20 20 69 66 28 20 74 79 70 65 3d  +;.    if( type=
b160: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
b170: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 20 3d  ){.      i64 v =
b180: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
b190: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
b1a0: 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20       p->rSum += 
b1b0: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d  v;.      if( (p-
b1c0: 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76 65 72 66  >approx|p->overf
b1d0: 6c 6f 77 29 3d 3d 30 20 26 26 20 73 71 6c 69 74  low)==0 && sqlit
b1e0: 65 33 41 64 64 49 6e 74 36 34 28 26 70 2d 3e 69  e3AddInt64(&p->i
b1f0: 53 75 6d 2c 20 76 29 20 29 7b 0a 20 20 20 20 20  Sum, v) ){.     
b200: 20 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20 70     p->approx = p
b210: 2d 3e 6f 76 65 72 66 6c 6f 77 20 3d 20 31 3b 0a  ->overflow = 1;.
b220: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
b230: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d  e{.      p->rSum
b240: 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   += sqlite3_valu
b250: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d  e_double(argv[0]
b260: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 70 72  );.      p->appr
b270: 6f 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ox = 1;.    }.  
b280: 7d 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }.}.#ifndef SQLI
b290: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
b2a0: 4e 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  NC.static void s
b2b0: 75 6d 49 6e 76 65 72 73 65 28 73 71 6c 69 74 65  umInverse(sqlite
b2c0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
b2d0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
b2e0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67  lite3_value**arg
b2f0: 76 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b  v){.  SumCtx *p;
b300: 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 61  .  int type;.  a
b310: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
b320: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
b330: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 70 20  ETER(argc);.  p 
b340: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
b350: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
b360: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
b370: 3b 0a 20 20 74 79 70 65 20 3d 20 73 71 6c 69 74  ;.  type = sqlit
b380: 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63  e3_value_numeric
b390: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3b 0a  _type(argv[0]);.
b3a0: 20 20 2f 2a 20 70 20 69 73 20 61 6c 77 61 79 73    /* p is always
b3b0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 65 63 61 75 73   non-NULL becaus
b3c0: 65 20 73 75 6d 53 74 65 70 28 29 20 77 69 6c 6c  e sumStep() will
b3d0: 20 68 61 76 65 20 62 65 65 6e 20 63 61 6c 6c 65   have been calle
b3e0: 64 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 6f 20  d first.  ** to 
b3f0: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 2a 2f  initialize it */
b400: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 29  .  if( ALWAYS(p)
b410: 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54 45   && type!=SQLITE
b420: 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73  _NULL ){.    ass
b430: 65 72 74 28 20 70 2d 3e 63 6e 74 3e 30 20 29 3b  ert( p->cnt>0 );
b440: 0a 20 20 20 20 70 2d 3e 63 6e 74 2d 2d 3b 0a 20  .    p->cnt--;. 
b450: 20 20 20 61 73 73 65 72 74 28 20 74 79 70 65 3d     assert( type=
b460: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
b470: 7c 7c 20 70 2d 3e 61 70 70 72 6f 78 20 29 3b 0a  || p->approx );.
b480: 20 20 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51      if( type==SQ
b490: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 26 26 20  LITE_INTEGER && 
b4a0: 70 2d 3e 61 70 70 72 6f 78 3d 3d 30 20 29 7b 0a  p->approx==0 ){.
b4b0: 20 20 20 20 20 20 69 36 34 20 76 20 3d 20 73 71        i64 v = sq
b4c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
b4d0: 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  4(argv[0]);.    
b4e0: 20 20 70 2d 3e 72 53 75 6d 20 2d 3d 20 76 3b 0a    p->rSum -= v;.
b4f0: 20 20 20 20 20 20 70 2d 3e 69 53 75 6d 20 2d 3d        p->iSum -=
b500: 20 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   v;.    }else{. 
b510: 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2d 3d 20       p->rSum -= 
b520: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
b530: 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  uble(argv[0]);. 
b540: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
b550: 0a 23 20 64 65 66 69 6e 65 20 73 75 6d 49 6e 76  .# define sumInv
b560: 65 72 73 65 20 30 0a 23 65 6e 64 69 66 20 2f 2a  erse 0.#endif /*
b570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
b580: 44 4f 57 46 55 4e 43 20 2a 2f 0a 73 74 61 74 69  DOWFUNC */.stati
b590: 63 20 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69  c void sumFinali
b5a0: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
b5b0: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
b5c0: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  SumCtx *p;.  p =
b5d0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
b5e0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
b5f0: 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  xt, 0);.  if( p 
b600: 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20  && p->cnt>0 ){. 
b610: 20 20 20 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c     if( p->overfl
b620: 6f 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ow ){.      sqli
b630: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
b640: 28 63 6f 6e 74 65 78 74 2c 22 69 6e 74 65 67 65  (context,"intege
b650: 72 20 6f 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b  r overflow",-1);
b660: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
b670: 2d 3e 61 70 70 72 6f 78 20 29 7b 0a 20 20 20 20  ->approx ){.    
b680: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
b690: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
b6a0: 20 70 2d 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d   p->rSum);.    }
b6b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
b6c0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
b6d0: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75  (context, p->iSu
b6e0: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  m);.    }.  }.}.
b6f0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 76 67 46  static void avgF
b700: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
b710: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
b720: 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a  ){.  SumCtx *p;.
b730: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
b740: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
b750: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
b760: 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30  f( p && p->cnt>0
b770: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b780: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
b790: 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28  ntext, p->rSum/(
b7a0: 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a  double)p->cnt);.
b7b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
b7c0: 64 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28  d totalFinalize(
b7d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
b7e0: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d  *context){.  Sum
b7f0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
b800: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
b810: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
b820: 20 30 29 3b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c   0);.  /* (doubl
b830: 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53  e)0 In case of S
b840: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
b850: 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a  ING_POINT... */.
b860: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
b870: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
b880: 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 28   p ? p->rSum : (
b890: 64 6f 75 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a  double)0);.}../*
b8a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
b8b0: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
b8c0: 73 20 74 72 61 63 6b 20 6f 66 20 73 74 61 74 65  s track of state
b8d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
b8e0: 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20   the.** count() 
b8f0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
b900: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
b910: 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 43  truct CountCtx C
b920: 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20  ountCtx;.struct 
b930: 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 36 34  CountCtx {.  i64
b940: 20 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   n;.#ifdef SQLIT
b950: 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 62 49  E_DEBUG.  int bI
b960: 6e 76 65 72 73 65 3b 20 20 20 20 20 20 20 20 20  nverse;         
b970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
b980: 65 20 69 66 20 78 49 6e 76 65 72 73 65 28 29 20  e if xInverse() 
b990: 65 76 65 72 20 63 61 6c 6c 65 64 20 2a 2f 0a 23  ever called */.#
b9a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
b9b0: 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c  Routines to impl
b9c0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 28  ement the count(
b9d0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
b9e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
b9f0: 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73  void countStep(s
ba00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
ba10: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
ba20: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
ba30: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e   **argv){.  Coun
ba40: 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  tCtx *p;.  p = s
ba50: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
ba60: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
ba70: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
ba80: 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c   if( (argc==0 ||
ba90: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
baa0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
bab0: 28 61 72 67 76 5b 30 5d 29 29 20 26 26 20 70 20  (argv[0])) && p 
bac0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
bad0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
bae0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
baf0: 45 44 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69  ED.  /* The sqli
bb00: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
bb10: 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  unt() function i
bb20: 73 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 42  s deprecated.  B
bb30: 75 74 20 6a 75 73 74 20 74 6f 20 6d 61 6b 65 0a  ut just to make.
bb40: 20 20 2a 2a 20 73 75 72 65 20 69 74 20 73 74 69    ** sure it sti
bb50: 6c 6c 20 6f 70 65 72 61 74 65 73 20 63 6f 72 72  ll operates corr
bb60: 65 63 74 6c 79 2c 20 76 65 72 69 66 79 20 74 68  ectly, verify th
bb70: 61 74 20 69 74 73 20 63 6f 75 6e 74 20 61 67 72  at its count agr
bb80: 65 65 73 20 77 69 74 68 20 6f 75 72 20 0a 20 20  ees with our .  
bb90: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 63 6f 75 6e  ** internal coun
bba0: 74 20 77 68 65 6e 20 75 73 69 6e 67 20 63 6f 75  t when using cou
bbb0: 6e 74 28 2a 29 20 61 6e 64 20 77 68 65 6e 20 74  nt(*) and when t
bbc0: 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 63  he total count c
bbd0: 61 6e 20 62 65 0a 20 20 2a 2a 20 65 78 70 72 65  an be.  ** expre
bbe0: 73 73 65 64 20 61 73 20 61 20 33 32 2d 62 69 74  ssed as a 32-bit
bbf0: 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 61   integer. */.  a
bc00: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
bc10: 7c 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30  | p==0 || p->n>0
bc20: 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 2d 3e  x7fffffff || p->
bc30: 62 49 6e 76 65 72 73 65 0a 20 20 20 20 20 20 20  bInverse.       
bc40: 20 20 20 7c 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69     || p->n==sqli
bc50: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
bc60: 75 6e 74 28 63 6f 6e 74 65 78 74 29 20 29 3b 0a  unt(context) );.
bc70: 23 65 6e 64 69 66 0a 7d 20 20 20 0a 73 74 61 74  #endif.}   .stat
bc80: 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e  ic void countFin
bc90: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
bca0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
bcb0: 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a  .  CountCtx *p;.
bcc0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
bcd0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
bce0: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 73  context, 0);.  s
bcf0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
bd00: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  t64(context, p ?
bd10: 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 23 69   p->n : 0);.}.#i
bd20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bd30: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 73 74 61  T_WINDOWFUNC.sta
bd40: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 49 6e  tic void countIn
bd50: 76 65 72 73 65 28 73 71 6c 69 74 65 33 5f 63 6f  verse(sqlite3_co
bd60: 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20  ntext *ctx, int 
bd70: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
bd80: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43  lue **argv){.  C
bd90: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
bda0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
bdb0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c  ate_context(ctx,
bdc0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
bdd0: 2f 2a 20 70 20 69 73 20 61 6c 77 61 79 73 20 6e  /* p is always n
bde0: 6f 6e 2d 4e 55 4c 4c 20 73 69 6e 63 65 20 63 6f  on-NULL since co
bdf0: 75 6e 74 53 74 65 70 28 29 20 77 69 6c 6c 20 68  untStep() will h
be00: 61 76 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ave been called 
be10: 66 69 72 73 74 20 2a 2f 0a 20 20 69 66 28 20 28  first */.  if( (
be20: 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54  argc==0 || SQLIT
be30: 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f  E_NULL!=sqlite3_
be40: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
be50: 30 5d 29 29 20 26 26 20 41 4c 57 41 59 53 28 70  0])) && ALWAYS(p
be60: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2d 2d 3b  ) ){.    p->n--;
be70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
be80: 45 42 55 47 0a 20 20 20 20 70 2d 3e 62 49 6e 76  EBUG.    p->bInv
be90: 65 72 73 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  erse = 1;.#endif
bea0: 0a 20 20 7d 0a 7d 20 20 20 0a 23 65 6c 73 65 0a  .  }.}   .#else.
beb0: 23 20 64 65 66 69 6e 65 20 63 6f 75 6e 74 49 6e  # define countIn
bec0: 76 65 72 73 65 20 30 0a 23 65 6e 64 69 66 20 2f  verse 0.#endif /
bed0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  * SQLITE_OMIT_WI
bee0: 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a  NDOWFUNC */../*.
bef0: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69  ** Routines to i
bf00: 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61  mplement min() a
bf10: 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65 67 61  nd max() aggrega
bf20: 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  te functions..*/
bf30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e  .static void min
bf40: 6d 61 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74  maxStep(.  sqlit
bf50: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
bf60: 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55  ext, .  int NotU
bf70: 73 65 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  sed, .  sqlite3_
bf80: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
bf90: 20 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28    Mem *pArg  = (
bfa0: 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20  Mem *)argv[0];. 
bfb0: 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20 55   Mem *pBest;.  U
bfc0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
bfd0: 4e 6f 74 55 73 65 64 29 3b 0a 0a 20 20 70 42 65  NotUsed);..  pBe
bfe0: 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c 69  st = (Mem *)sqli
bff0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
c000: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
c010: 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 29 3b 0a  izeof(*pBest));.
c020: 20 20 69 66 28 20 21 70 42 65 73 74 20 29 20 72    if( !pBest ) r
c030: 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71  eturn;..  if( sq
c040: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c050: 28 70 41 72 67 29 3d 3d 53 51 4c 49 54 45 5f 4e  (pArg)==SQLITE_N
c060: 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
c070: 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 20 73 71  Best->flags ) sq
c080: 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d 75 6c  lite3SkipAccumul
c090: 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78 74  atorLoad(context
c0a0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
c0b0: 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 7b 0a 20  Best->flags ){. 
c0c0: 20 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20 20 20     int max;.    
c0d0: 69 6e 74 20 63 6d 70 3b 0a 20 20 20 20 43 6f 6c  int cmp;.    Col
c0e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
c0f0: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
c100: 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  Seq(context);.  
c110: 20 20 2f 2a 20 54 68 69 73 20 73 74 65 70 20 66    /* This step f
c120: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
c130: 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6d 69 6e  for both the min
c140: 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67  () and max() agg
c150: 72 65 67 61 74 65 73 2c 0a 20 20 20 20 2a 2a 20  regates,.    ** 
c160: 74 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65  the only differe
c170: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  nce between the 
c180: 74 77 6f 20 62 65 69 6e 67 20 74 68 61 74 20 74  two being that t
c190: 68 65 20 73 65 6e 73 65 20 6f 66 20 74 68 65 0a  he sense of the.
c1a0: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
c1b0: 6e 20 69 73 20 69 6e 76 65 72 74 65 64 2e 20 46  n is inverted. F
c1c0: 6f 72 20 74 68 65 20 6d 61 78 28 29 20 61 67 67  or the max() agg
c1d0: 72 65 67 61 74 65 2c 20 74 68 65 0a 20 20 20 20  regate, the.    
c1e0: 2a 2a 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  ** sqlite3_user_
c1f0: 64 61 74 61 28 29 20 66 75 6e 63 74 69 6f 6e 20  data() function 
c200: 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29  returns (void *)
c210: 2d 31 2e 20 46 6f 72 20 6d 69 6e 28 29 20 69 74  -1. For min() it
c220: 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  .    ** returns 
c230: 28 76 6f 69 64 20 2a 29 64 62 2c 20 77 68 65 72  (void *)db, wher
c240: 65 20 64 62 20 69 73 20 74 68 65 20 73 71 6c 69  e db is the sqli
c250: 74 65 33 2a 20 64 61 74 61 62 61 73 65 20 70 6f  te3* database po
c260: 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a 20 54 68  inter..    ** Th
c270: 65 72 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74  erefore the next
c280: 20 73 74 61 74 65 6d 65 6e 74 20 73 65 74 73 20   statement sets 
c290: 76 61 72 69 61 62 6c 65 20 27 6d 61 78 27 20 74  variable 'max' t
c2a0: 6f 20 31 20 66 6f 72 20 74 68 65 20 6d 61 78 28  o 1 for the max(
c2b0: 29 0a 20 20 20 20 2a 2a 20 61 67 67 72 65 67 61  ).    ** aggrega
c2c0: 74 65 2c 20 6f 72 20 30 20 66 6f 72 20 6d 69 6e  te, or 0 for min
c2d0: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  ()..    */.    m
c2e0: 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  ax = sqlite3_use
c2f0: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 21  r_data(context)!
c300: 3d 30 3b 0a 20 20 20 20 63 6d 70 20 3d 20 73 71  =0;.    cmp = sq
c310: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
c320: 70 42 65 73 74 2c 20 70 41 72 67 2c 20 70 43 6f  pBest, pArg, pCo
c330: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 6d 61  ll);.    if( (ma
c340: 78 20 26 26 20 63 6d 70 3c 30 29 20 7c 7c 20 28  x && cmp<0) || (
c350: 21 6d 61 78 20 26 26 20 63 6d 70 3e 30 29 20 29  !max && cmp>0) )
c360: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
c370: 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74  dbeMemCopy(pBest
c380: 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c  , pArg);.    }el
c390: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c3a0: 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74 6f 72  3SkipAccumulator
c3b0: 4c 6f 61 64 28 63 6f 6e 74 65 78 74 29 3b 0a 20  Load(context);. 
c3c0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
c3d0: 20 20 70 42 65 73 74 2d 3e 64 62 20 3d 20 73 71    pBest->db = sq
c3e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
c3f0: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
c400: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c410: 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20  eMemCopy(pBest, 
c420: 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  pArg);.  }.}.sta
c430: 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 56  tic void minMaxV
c440: 61 6c 75 65 46 69 6e 61 6c 69 7a 65 28 73 71 6c  alueFinalize(sql
c450: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
c460: 6e 74 65 78 74 2c 20 69 6e 74 20 62 56 61 6c 75  ntext, int bValu
c470: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  e){.  sqlite3_va
c480: 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20 70 52 65  lue *pRes;.  pRe
c490: 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c  s = (sqlite3_val
c4a0: 75 65 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  ue *)sqlite3_agg
c4b0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
c4c0: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66  ontext, 0);.  if
c4d0: 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 69 66  ( pRes ){.    if
c4e0: 28 20 70 52 65 73 2d 3e 66 6c 61 67 73 20 29 7b  ( pRes->flags ){
c4f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
c500: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
c510: 65 78 74 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  ext, pRes);.    
c520: 7d 0a 20 20 20 20 69 66 28 20 62 56 61 6c 75 65  }.    if( bValue
c530: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
c540: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65 73  eMemRelease(pRes
c550: 29 3b 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64 65 66  );.  }.}.#ifndef
c560: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
c570: 44 4f 57 46 55 4e 43 0a 73 74 61 74 69 63 20 76  DOWFUNC.static v
c580: 6f 69 64 20 6d 69 6e 4d 61 78 56 61 6c 75 65 28  oid minMaxValue(
c590: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
c5a0: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 6d 69 6e  *context){.  min
c5b0: 4d 61 78 56 61 6c 75 65 46 69 6e 61 6c 69 7a 65  MaxValueFinalize
c5c0: 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 7d 0a  (context, 1);.}.
c5d0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d  #else.# define m
c5e0: 69 6e 4d 61 78 56 61 6c 75 65 20 30 0a 23 65 6e  inMaxValue 0.#en
c5f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c600: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
c610: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e  .static void min
c620: 4d 61 78 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  MaxFinalize(sqli
c630: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
c640: 74 65 78 74 29 7b 0a 20 20 6d 69 6e 4d 61 78 56  text){.  minMaxV
c650: 61 6c 75 65 46 69 6e 61 6c 69 7a 65 28 63 6f 6e  alueFinalize(con
c660: 74 65 78 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  text, 0);.}../*.
c670: 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  ** group_concat(
c680: 45 58 50 52 2c 20 3f 53 45 50 41 52 41 54 4f 52  EXPR, ?SEPARATOR
c690: 3f 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ?).*/.static voi
c6a0: 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65  d groupConcatSte
c6b0: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
c6c0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
c6d0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
c6e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
c6f0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
c700: 72 20 2a 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63  r *zVal;.  StrAc
c710: 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63  cum *pAccum;.  c
c720: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
c730: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65  .  int nVal, nSe
c740: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  p;.  assert( arg
c750: 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20  c==1 || argc==2 
c760: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
c770: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
c780: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
c790: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 41  L ) return;.  pA
c7a0: 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63 75 6d  ccum = (StrAccum
c7b0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
c7c0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
c7d0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63  ext, sizeof(*pAc
c7e0: 63 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20 70 41  cum));..  if( pA
c7f0: 63 63 75 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  ccum ){.    sqli
c800: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
c810: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
c820: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
c830: 20 20 69 6e 74 20 66 69 72 73 74 54 65 72 6d 20    int firstTerm 
c840: 3d 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f  = pAccum->mxAllo
c850: 63 3d 3d 30 3b 0a 20 20 20 20 70 41 63 63 75 6d  c==0;.    pAccum
c860: 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e  ->mxAlloc = db->
c870: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
c880: 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20  MIT_LENGTH];.   
c890: 20 69 66 28 20 21 66 69 72 73 74 54 65 72 6d 20   if( !firstTerm 
c8a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72 67  ){.      if( arg
c8b0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  c==2 ){.        
c8c0: 7a 53 65 70 20 3d 20 28 63 68 61 72 2a 29 73 71  zSep = (char*)sq
c8d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
c8e0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20  (argv[1]);.     
c8f0: 20 20 20 6e 53 65 70 20 3d 20 73 71 6c 69 74 65     nSep = sqlite
c900: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
c910: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65  gv[1]);.      }e
c920: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  lse{.        zSe
c930: 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 20  p = ",";.       
c940: 20 6e 53 65 70 20 3d 20 31 3b 0a 20 20 20 20 20   nSep = 1;.     
c950: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 65   }.      if( zSe
c960: 70 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  p ) sqlite3_str_
c970: 61 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a  append(pAccum, z
c980: 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20 20 20 20  Sep, nSep);.    
c990: 7d 0a 20 20 20 20 7a 56 61 6c 20 3d 20 28 63 68  }.    zVal = (ch
c9a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
c9b0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
c9c0: 0a 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69  .    nVal = sqli
c9d0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
c9e0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
c9f0: 28 20 7a 56 61 6c 20 29 20 73 71 6c 69 74 65 33  ( zVal ) sqlite3
ca00: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 41 63 63  _str_append(pAcc
ca10: 75 6d 2c 20 7a 56 61 6c 2c 20 6e 56 61 6c 29 3b  um, zVal, nVal);
ca20: 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64 65 66 20 53  .  }.}.#ifndef S
ca30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
ca40: 57 46 55 4e 43 0a 73 74 61 74 69 63 20 76 6f 69  WFUNC.static voi
ca50: 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 49 6e 76  d groupConcatInv
ca60: 65 72 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  erse(.  sqlite3_
ca70: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
ca80: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
ca90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
caa0: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  argv.){.  int n;
cab0: 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 41 63  .  StrAccum *pAc
cac0: 63 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 61  cum;.  assert( a
cad0: 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d  rgc==1 || argc==
cae0: 32 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  2 );.  if( sqlit
caf0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
cb00: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
cb10: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
cb20: 70 41 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63  pAccum = (StrAcc
cb30: 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  um*)sqlite3_aggr
cb40: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
cb50: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
cb60: 41 63 63 75 6d 29 29 3b 0a 20 20 2f 2a 20 70 41  Accum));.  /* pA
cb70: 63 63 75 6d 20 69 73 20 61 6c 77 61 79 73 20 6e  ccum is always n
cb80: 6f 6e 2d 4e 55 4c 4c 20 73 69 6e 63 65 20 67 72  on-NULL since gr
cb90: 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 28 29 20  oupConcatStep() 
cba0: 77 69 6c 6c 20 68 61 76 65 20 61 6c 77 61 79 73  will have always
cbb0: 0a 20 20 2a 2a 20 72 75 6e 20 66 72 69 73 74 20  .  ** run frist 
cbc0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  to initialize it
cbd0: 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
cbe0: 28 70 41 63 63 75 6d 29 20 29 7b 0a 20 20 20 20  (pAccum) ){.    
cbf0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
cc00: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
cc10: 3b 0a 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d  ;.    if( argc==
cc20: 32 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  2 ){.      n += 
cc30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
cc40: 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  tes(argv[1]);.  
cc50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
cc60: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
cc70: 28 20 6e 3e 3d 28 69 6e 74 29 70 41 63 63 75 6d  ( n>=(int)pAccum
cc80: 2d 3e 6e 43 68 61 72 20 29 7b 0a 20 20 20 20 20  ->nChar ){.     
cc90: 20 70 41 63 63 75 6d 2d 3e 6e 43 68 61 72 20 3d   pAccum->nChar =
cca0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
ccb0: 20 20 20 20 20 70 41 63 63 75 6d 2d 3e 6e 43 68       pAccum->nCh
ccc0: 61 72 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 6d  ar -= n;.      m
ccd0: 65 6d 6d 6f 76 65 28 70 41 63 63 75 6d 2d 3e 7a  emmove(pAccum->z
cce0: 54 65 78 74 2c 20 26 70 41 63 63 75 6d 2d 3e 7a  Text, &pAccum->z
ccf0: 54 65 78 74 5b 6e 5d 2c 20 70 41 63 63 75 6d 2d  Text[n], pAccum-
cd00: 3e 6e 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20  >nChar);.    }. 
cd10: 20 20 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 6e     if( pAccum->n
cd20: 43 68 61 72 3d 3d 30 20 29 20 70 41 63 63 75 6d  Char==0 ) pAccum
cd30: 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->mxAlloc = 0;. 
cd40: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
cd50: 69 6e 65 20 67 72 6f 75 70 43 6f 6e 63 61 74 49  ine groupConcatI
cd60: 6e 76 65 72 73 65 20 30 0a 23 65 6e 64 69 66 20  nverse 0.#endif 
cd70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
cd80: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 73 74 61  INDOWFUNC */.sta
cd90: 74 69 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f  tic void groupCo
cda0: 6e 63 61 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c  ncatFinalize(sql
cdb0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
cdc0: 6e 74 65 78 74 29 7b 0a 20 20 53 74 72 41 63 63  ntext){.  StrAcc
cdd0: 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 70 41  um *pAccum;.  pA
cde0: 63 63 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 61  ccum = sqlite3_a
cdf0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
ce00: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
ce10: 69 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20  if( pAccum ){.  
ce20: 20 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61 63    if( pAccum->ac
ce30: 63 45 72 72 6f 72 3d 3d 53 51 4c 49 54 45 5f 54  cError==SQLITE_T
ce40: 4f 4f 42 49 47 20 29 7b 0a 20 20 20 20 20 20 73  OOBIG ){.      s
ce50: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
ce60: 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65  ror_toobig(conte
ce70: 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  xt);.    }else i
ce80: 66 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72  f( pAccum->accEr
ce90: 72 6f 72 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  ror==SQLITE_NOME
cea0: 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M ){.      sqlit
ceb0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
cec0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
ced0: 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20      }else{    . 
cee0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
cef0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
cf00: 2c 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  , sqlite3StrAccu
cf10: 6d 46 69 6e 69 73 68 28 70 41 63 63 75 6d 29 2c  mFinish(pAccum),
cf20: 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
cf50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64     }.  }.}.#ifnd
cf60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
cf70: 49 4e 44 4f 57 46 55 4e 43 0a 73 74 61 74 69 63  INDOWFUNC.static
cf80: 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61   void groupConca
cf90: 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33 5f 63  tValue(sqlite3_c
cfa0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
cfb0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 20  {.  sqlite3_str 
cfc0: 2a 70 41 63 63 75 6d 3b 0a 20 20 70 41 63 63 75  *pAccum;.  pAccu
cfd0: 6d 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 72  m = (sqlite3_str
cfe0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
cff0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
d000: 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ext, 0);.  if( p
d010: 41 63 63 75 6d 20 29 7b 0a 20 20 20 20 69 66 28  Accum ){.    if(
d020: 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72 72 6f   pAccum->accErro
d030: 72 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  r==SQLITE_TOOBIG
d040: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d050: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74  3_result_error_t
d060: 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a  oobig(context);.
d070: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
d080: 63 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72 3d 3d  ccum->accError==
d090: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
d0a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
d0b0: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
d0c0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  (context);.    }
d0d0: 65 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20 20  else{    .      
d0e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
d0f0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  t = sqlite3_str_
d100: 76 61 6c 75 65 28 70 41 63 63 75 6d 29 3b 0a 20  value(pAccum);. 
d110: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
d120: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
d130: 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51 4c  , zText, -1, SQL
d140: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d150: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
d160: 65 0a 23 20 64 65 66 69 6e 65 20 67 72 6f 75 70  e.# define group
d170: 43 6f 6e 63 61 74 56 61 6c 75 65 20 30 0a 23 65  ConcatValue 0.#e
d180: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d190: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
d1a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
d1b0: 75 74 69 6e 65 20 64 6f 65 73 20 70 65 72 2d 63  utine does per-c
d1c0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 75 6e 63 74 69  onnection functi
d1d0: 6f 6e 20 72 65 67 69 73 74 72 61 74 69 6f 6e 2e  on registration.
d1e0: 20 20 4d 6f 73 74 0a 2a 2a 20 6f 66 20 74 68 65    Most.** of the
d1f0: 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
d200: 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 70 61  ons above are pa
d210: 72 74 20 6f 66 20 74 68 65 20 67 6c 6f 62 61 6c  rt of the global
d220: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 2e 0a 2a   function set..*
d230: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * This routine o
d240: 6e 6c 79 20 64 65 61 6c 73 20 77 69 74 68 20 74  nly deals with t
d250: 68 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e 6f  hose that are no
d260: 74 20 67 6c 6f 62 61 6c 2e 0a 2a 2f 0a 76 6f 69  t global..*/.voi
d270: 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  d sqlite3Registe
d280: 72 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75  rPerConnectionBu
d290: 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73  iltinFunctions(s
d2a0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
d2b0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
d2c0: 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
d2d0: 6e 28 64 62 2c 20 22 4d 41 54 43 48 22 2c 20 32  n(db, "MATCH", 2
d2e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
d2f0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
d300: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d310: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
d320: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
d330: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
d340: 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  db);.  }.}../*.*
d350: 2a 20 53 65 74 20 74 68 65 20 4c 49 4b 45 4f 50  * Set the LIKEOP
d360: 54 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 32 2d  T flag on the 2-
d370: 61 72 67 75 6d 65 6e 74 20 66 75 6e 63 74 69 6f  argument functio
d380: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
d390: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
d3a0: 20 76 6f 69 64 20 73 65 74 4c 69 6b 65 4f 70 74   void setLikeOpt
d3b0: 46 6c 61 67 28 73 71 6c 69 74 65 33 20 2a 64 62  Flag(sqlite3 *db
d3c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
d3d0: 61 6d 65 2c 20 75 38 20 66 6c 61 67 56 61 6c 29  ame, u8 flagVal)
d3e0: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65  {.  FuncDef *pDe
d3f0: 66 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69  f;.  pDef = sqli
d400: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
d410: 64 62 2c 20 7a 4e 61 6d 65 2c 20 32 2c 20 53 51  db, zName, 2, SQ
d420: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
d430: 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65 66   if( ALWAYS(pDef
d440: 29 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66  ) ){.    pDef->f
d450: 75 6e 63 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67  uncFlags |= flag
d460: 56 61 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 66 20  Val;.  }.  pDef 
d470: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
d480: 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ction(db, zName,
d490: 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   3, SQLITE_UTF8,
d4a0: 20 30 29 3b 0a 20 20 69 66 28 20 70 44 65 66 20   0);.  if( pDef 
d4b0: 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 75 6e  ){.    pDef->fun
d4c0: 63 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67 56 61  cFlags |= flagVa
d4d0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
d4e0: 52 65 67 69 73 74 65 72 20 74 68 65 20 62 75 69  Register the bui
d4f0: 6c 74 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20 47  lt-in LIKE and G
d500: 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  LOB functions.  
d510: 54 68 65 20 63 61 73 65 53 65 6e 73 69 74 69 76  The caseSensitiv
d520: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 64  e.** parameter d
d530: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
d540: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49 4b  r or not the LIK
d550: 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63 61  E operator is ca
d560: 73 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65 2e  se.** sensitive.
d570: 20 20 47 4c 4f 42 20 69 73 20 61 6c 77 61 79 73    GLOB is always
d580: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2e   case sensitive.
d590: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d5a0: 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63  RegisterLikeFunc
d5b0: 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64  tions(sqlite3 *d
d5c0: 62 2c 20 69 6e 74 20 63 61 73 65 53 65 6e 73 69  b, int caseSensi
d5d0: 74 69 76 65 29 7b 0a 20 20 73 74 72 75 63 74 20  tive){.  struct 
d5e0: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e  compareInfo *pIn
d5f0: 66 6f 3b 0a 20 20 69 66 28 20 63 61 73 65 53 65  fo;.  if( caseSe
d600: 6e 73 69 74 69 76 65 20 29 7b 0a 20 20 20 20 70  nsitive ){.    p
d610: 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63  Info = (struct c
d620: 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b  ompareInfo*)&lik
d630: 65 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c 73  eInfoAlt;.  }els
d640: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28  e{.    pInfo = (
d650: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
d660: 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72  fo*)&likeInfoNor
d670: 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  m;.  }.  sqlite3
d680: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22  CreateFunc(db, "
d690: 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54 45  like", 2, SQLITE
d6a0: 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69  _UTF8, pInfo, li
d6b0: 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 2c  keFunc, 0, 0, 0,
d6c0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
d6d0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
d6e0: 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54  "like", 3, SQLIT
d6f0: 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c  E_UTF8, pInfo, l
d700: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30  ikeFunc, 0, 0, 0
d710: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
d720: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
d730: 20 22 67 6c 6f 62 22 2c 20 32 2c 20 53 51 4c 49   "glob", 2, SQLI
d740: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
d750: 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  (struct compareI
d760: 6e 66 6f 2a 29 26 67 6c 6f 62 49 6e 66 6f 2c 20  nfo*)&globInfo, 
d770: 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20  likeFunc, 0, 0, 
d780: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 65 74 4c  0, 0, 0);.  setL
d790: 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22  ikeOptFlag(db, "
d7a0: 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f 46 55  glob", SQLITE_FU
d7b0: 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45  NC_LIKE | SQLITE
d7c0: 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73  _FUNC_CASE);.  s
d7d0: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62  etLikeOptFlag(db
d7e0: 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20  , "like", .     
d7f0: 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 3f   caseSensitive ?
d800: 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49   (SQLITE_FUNC_LI
d810: 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43  KE | SQLITE_FUNC
d820: 5f 43 41 53 45 29 20 3a 20 53 51 4c 49 54 45 5f  _CASE) : SQLITE_
d830: 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f  FUNC_LIKE);.}../
d840: 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e 74  *.** pExpr point
d850: 73 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  s to an expressi
d860: 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c 65 6d 65  on which impleme
d870: 6e 74 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20  nts a function. 
d880: 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 61 70 70   If.** it is app
d890: 72 6f 70 72 69 61 74 65 20 74 6f 20 61 70 70 6c  ropriate to appl
d8a0: 79 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  y the LIKE optim
d8b0: 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61 74 20  ization to that 
d8c0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e  function.** then
d8d0: 20 73 65 74 20 61 57 63 5b 30 5d 20 74 68 72 6f   set aWc[0] thro
d8e0: 75 67 68 20 61 57 63 5b 32 5d 20 74 6f 20 74 68  ugh aWc[2] to th
d8f0: 65 20 77 69 6c 64 63 61 72 64 20 63 68 61 72 61  e wildcard chara
d900: 63 74 65 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a  cters and the.**
d910: 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65   escape characte
d920: 72 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  r and then retur
d930: 6e 20 54 52 55 45 2e 20 20 49 66 20 74 68 65 20  n TRUE.  If the 
d940: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
d950: 61 20 0a 2a 2a 20 4c 49 4b 45 2d 73 74 79 6c 65  a .** LIKE-style
d960: 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 20 72   function then r
d970: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a  eturn FALSE..**.
d980: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
d990: 6e 20 22 61 20 4c 49 4b 45 20 62 20 45 53 43 41  n "a LIKE b ESCA
d9a0: 50 45 20 63 22 20 69 73 20 6f 6e 6c 79 20 63 6f  PE c" is only co
d9b0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 6c 69 64  nsidered a valid
d9c0: 20 4c 49 4b 45 0a 2a 2a 20 6f 70 65 72 61 74 6f   LIKE.** operato
d9d0: 72 20 69 66 20 63 20 69 73 20 61 20 73 74 72 69  r if c is a stri
d9e0: 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ng literal that 
d9f0: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 62  is exactly one b
da00: 79 74 65 20 69 6e 20 6c 65 6e 67 74 68 2e 0a 2a  yte in length..*
da10: 2a 20 54 68 61 74 20 6f 6e 65 20 62 79 74 65 20  * That one byte 
da20: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 57 63  is stored in aWc
da30: 5b 33 5d 2e 20 20 61 57 63 5b 33 5d 20 69 73 20  [3].  aWc[3] is 
da40: 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 66 20 74  set to zero if t
da50: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 45 53  here is.** no ES
da60: 43 41 50 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  CAPE clause..**.
da70: 2a 2a 20 2a 70 49 73 4e 6f 63 61 73 65 20 69 73  ** *pIsNocase is
da80: 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
da90: 75 70 70 65 72 63 61 73 65 20 61 6e 64 20 6c 6f  uppercase and lo
daa0: 77 65 72 63 61 73 65 20 61 72 65 20 65 71 75 69  wercase are equi
dab0: 76 61 6c 65 6e 74 20 66 6f 72 0a 2a 2a 20 74 68  valent for.** th
dac0: 65 20 66 75 6e 63 74 69 6f 6e 20 28 64 65 66 61  e function (defa
dad0: 75 6c 74 20 66 6f 72 20 4c 49 4b 45 29 2e 20 20  ult for LIKE).  
dae0: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
daf0: 6d 61 6b 65 73 20 74 68 65 20 64 69 73 74 69 6e  makes the distin
db00: 63 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e  ction.** between
db10: 20 75 70 70 65 72 63 61 73 65 20 61 6e 64 20 6c   uppercase and l
db20: 6f 77 65 72 63 61 73 65 20 28 61 73 20 64 6f 65  owercase (as doe
db30: 73 20 47 4c 4f 42 29 20 74 68 65 6e 20 2a 70 49  s GLOB) then *pI
db40: 73 4e 6f 63 61 73 65 20 69 73 20 73 65 74 20 74  sNocase is set t
db50: 6f 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69  o.** false..*/.i
db60: 6e 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  nt sqlite3IsLike
db70: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
db80: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70   *db, Expr *pExp
db90: 72 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73  r, int *pIsNocas
dba0: 65 2c 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20  e, char *aWc){. 
dbb0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
dbc0: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 69    int nExpr;.  i
dbd0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
dbe0: 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 21 70 45  _FUNCTION || !pE
dbf0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  xpr->x.pList ){.
dc00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
dc10: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  }.  assert( !Exp
dc20: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
dc30: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
dc40: 29 20 29 3b 0a 20 20 6e 45 78 70 72 20 3d 20 70  ) );.  nExpr = p
dc50: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
dc60: 45 78 70 72 3b 0a 20 20 70 44 65 66 20 3d 20 73  Expr;.  pDef = s
dc70: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
dc80: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e  on(db, pExpr->u.
dc90: 7a 54 6f 6b 65 6e 2c 20 6e 45 78 70 72 2c 20 53  zToken, nExpr, S
dca0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
dcb0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 44 65 66    if( NEVER(pDef
dcc0: 3d 3d 30 29 20 7c 7c 20 28 70 44 65 66 2d 3e 66  ==0) || (pDef->f
dcd0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
dce0: 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d 30 20  E_FUNC_LIKE)==0 
dcf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
dd00: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 45 78 70 72  .  }.  if( nExpr
dd10: 3c 33 20 29 7b 0a 20 20 20 20 61 57 63 5b 33 5d  <3 ){.    aWc[3]
dd20: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
dd30: 20 20 20 45 78 70 72 20 2a 70 45 73 63 61 70 65     Expr *pEscape
dd40: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
dd50: 74 2d 3e 61 5b 32 5d 2e 70 45 78 70 72 3b 0a 20  t->a[2].pExpr;. 
dd60: 20 20 20 63 68 61 72 20 2a 7a 45 73 63 61 70 65     char *zEscape
dd70: 3b 0a 20 20 20 20 69 66 28 20 70 45 73 63 61 70  ;.    if( pEscap
dd80: 65 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  e->op!=TK_STRING
dd90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
dda0: 20 7a 45 73 63 61 70 65 20 3d 20 70 45 73 63 61   zEscape = pEsca
ddb0: 70 65 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pe->u.zToken;.  
ddc0: 20 20 69 66 28 20 7a 45 73 63 61 70 65 5b 30 5d    if( zEscape[0]
ddd0: 3d 3d 30 20 7c 7c 20 7a 45 73 63 61 70 65 5b 31  ==0 || zEscape[1
dde0: 5d 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ]!=0 ) return 0;
ddf0: 0a 20 20 20 20 61 57 63 5b 33 5d 20 3d 20 7a 45  .    aWc[3] = zE
de00: 73 63 61 70 65 5b 30 5d 3b 0a 20 20 7d 0a 0a 20  scape[0];.  }.. 
de10: 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29   /* The memcpy()
de20: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 75 6d   statement assum
de30: 65 73 20 74 68 61 74 20 74 68 65 20 77 69 6c 64  es that the wild
de40: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
de50: 61 72 65 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  are.  ** the fir
de60: 73 74 20 74 68 72 65 65 20 73 74 61 74 65 6d 65  st three stateme
de70: 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 61  nts in the compa
de80: 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
de90: 2e 20 20 54 68 65 0a 20 20 2a 2a 20 61 73 73 65  .  The.  ** asse
dea0: 72 74 73 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f  rts() that follo
deb0: 77 20 76 65 72 69 66 79 20 74 68 61 74 20 61 73  w verify that as
dec0: 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  sumption.  */.  
ded0: 6d 65 6d 63 70 79 28 61 57 63 2c 20 70 44 65 66  memcpy(aWc, pDef
dee0: 2d 3e 70 55 73 65 72 44 61 74 61 2c 20 33 29 3b  ->pUserData, 3);
def0: 0a 20 20 61 73 73 65 72 74 28 20 28 63 68 61 72  .  assert( (char
df00: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d  *)&likeInfoAlt =
df10: 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  = (char*)&likeIn
df20: 66 6f 41 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29  foAlt.matchAll )
df30: 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63  ;.  assert( &((c
df40: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
df50: 74 29 5b 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29  t)[1] == (char*)
df60: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74  &likeInfoAlt.mat
df70: 63 68 4f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  chOne );.  asser
df80: 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b  t( &((char*)&lik
df90: 65 49 6e 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20  eInfoAlt)[2] == 
dfa0: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
dfb0: 41 6c 74 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a  Alt.matchSet );.
dfc0: 20 20 2a 70 49 73 4e 6f 63 61 73 65 20 3d 20 28    *pIsNocase = (
dfd0: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
dfe0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  & SQLITE_FUNC_CA
dff0: 53 45 29 3d 3d 30 3b 0a 20 20 72 65 74 75 72 6e  SE)==0;.  return
e000: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   1;.}../*.** All
e010: 20 6f 66 20 74 68 65 20 46 75 6e 63 44 65 66 20   of the FuncDef 
e020: 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
e030: 65 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d  e aBuiltinFunc[]
e040: 20 61 72 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20   array above.** 
e050: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75  to the global fu
e060: 6e 63 74 69 6f 6e 20 68 61 73 68 20 74 61 62 6c  nction hash tabl
e070: 65 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 20  e.  This occurs 
e080: 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20 28 61  at start-time (a
e090: 73 0a 2a 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e  s.** a consequen
e0a0: 63 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71  ce of calling sq
e0b0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e0c0: 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ())..**.** After
e0d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
e0e0: 6e 73 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ns.*/.void sqlit
e0f0: 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
e100: 6e 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29  nFunctions(void)
e110: 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  {.  /*.  ** The 
e120: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
e130: 68 6f 6c 64 73 20 46 75 6e 63 44 65 66 20 73 74  holds FuncDef st
e140: 72 75 63 74 75 72 65 73 20 66 6f 72 20 61 6c 6c  ructures for all
e150: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
e160: 73 0a 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 69  s.  ** defined i
e170: 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a  n this file..  *
e180: 2a 0a 20 20 2a 2a 20 54 68 65 20 61 72 72 61 79  *.  ** The array
e190: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74   cannot be const
e1a0: 61 6e 74 20 73 69 6e 63 65 20 63 68 61 6e 67 65  ant since change
e1b0: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
e1c0: 65 0a 20 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70  e.  ** FuncDef.p
e1d0: 48 61 73 68 20 65 6c 65 6d 65 6e 74 73 20 61 74  Hash elements at
e1e0: 20 73 74 61 72 74 2d 74 69 6d 65 2e 20 20 54 68   start-time.  Th
e1f0: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
e200: 69 73 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 72  is array.  ** ar
e210: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
e220: 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  r initialization
e230: 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20   is complete..  
e240: 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 70 65 61 6b  **.  ** For peak
e250: 20 65 66 66 69 63 69 65 6e 63 79 2c 20 70 75 74   efficiency, put
e260: 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71 75 65   the most freque
e270: 6e 74 6c 79 20 75 73 65 64 20 66 75 6e 63 74 69  ntly used functi
e280: 6f 6e 20 6c 61 73 74 2e 0a 20 20 2a 2f 0a 20 20  on last..  */.  
e290: 73 74 61 74 69 63 20 46 75 6e 63 44 65 66 20 61  static FuncDef a
e2a0: 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20  BuiltinFunc[] = 
e2b0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e2c0: 53 4f 55 4e 44 45 58 0a 20 20 20 20 46 55 4e 43  SOUNDEX.    FUNC
e2d0: 54 49 4f 4e 28 73 6f 75 6e 64 65 78 2c 20 20 20  TION(soundex,   
e2e0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
e2f0: 2c 20 73 6f 75 6e 64 65 78 46 75 6e 63 20 20 20  , soundexFunc   
e300: 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66     ),.#endif.#if
e310: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e320: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
e330: 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 6c 6f      VFUNCTION(lo
e340: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20  ad_extension,   
e350: 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78   1, 0, 0, loadEx
e360: 74 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  t          ),.  
e370: 20 20 56 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64    VFUNCTION(load
e380: 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 32  _extension,    2
e390: 2c 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20  , 0, 0, loadExt 
e3a0: 20 20 20 20 20 20 20 20 20 29 2c 0a 23 65 6e 64           ),.#end
e3b0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  if.#if SQLITE_US
e3c0: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
e3d0: 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  N.    FUNCTION(s
e3e0: 71 6c 69 74 65 5f 63 72 79 70 74 2c 20 20 20 20  qlite_crypt,    
e3f0: 20 20 20 32 2c 20 30 2c 20 30 2c 20 73 71 6c 69     2, 0, 0, sqli
e400: 74 65 33 43 72 79 70 74 46 75 6e 63 20 29 2c 0a  te3CryptFunc ),.
e410: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
e420: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49  QLITE_OMIT_COMPI
e430: 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20  LEOPTION_DIAGS. 
e440: 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c     DFUNCTION(sql
e450: 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  ite_compileoptio
e460: 6e 5f 75 73 65 64 2c 31 2c 20 30 2c 20 30 2c 20  n_used,1, 0, 0, 
e470: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65  compileoptionuse
e480: 64 46 75 6e 63 20 20 29 2c 0a 20 20 20 20 44 46  dFunc  ),.    DF
e490: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63  UNCTION(sqlite_c
e4a0: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74  ompileoption_get
e4b0: 2c 20 31 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69  , 1, 0, 0, compi
e4c0: 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75 6e 63 20  leoptiongetFunc 
e4d0: 20 29 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   ),.#endif /* SQ
e4e0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
e4f0: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f  EOPTION_DIAGS */
e500: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 75  .    FUNCTION2(u
e510: 6e 6c 69 6b 65 6c 79 2c 20 20 20 20 20 20 20 20  nlikely,        
e520: 20 20 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46    1, 0, 0, noopF
e530: 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e  unc,  SQLITE_FUN
e540: 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20 20  C_UNLIKELY),.   
e550: 20 46 55 4e 43 54 49 4f 4e 32 28 6c 69 6b 65 6c   FUNCTION2(likel
e560: 69 68 6f 6f 64 2c 20 20 20 20 20 20 20 20 32 2c  ihood,        2,
e570: 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c   0, 0, noopFunc,
e580: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e    SQLITE_FUNC_UN
e590: 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e  LIKELY),.    FUN
e5a0: 43 54 49 4f 4e 32 28 6c 69 6b 65 6c 79 2c 20 20  CTION2(likely,  
e5b0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
e5c0: 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51  0, noopFunc,  SQ
e5d0: 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
e5e0: 4c 59 29 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  LY),.#ifdef SQLI
e5f0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 46 55 4e  TE_DEBUG.    FUN
e600: 43 54 49 4f 4e 32 28 61 66 66 69 6e 69 74 79 2c  CTION2(affinity,
e610: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
e620: 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51  0, noopFunc,  SQ
e630: 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49  LITE_FUNC_AFFINI
e640: 54 59 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  TY),.#endif.#ifd
e650: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e660: 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
e670: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 73  .    FUNCTION2(s
e680: 71 6c 69 74 65 5f 6f 66 66 73 65 74 2c 20 20 20  qlite_offset,   
e690: 20 20 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46    1, 0, 0, noopF
e6a0: 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e  unc,  SQLITE_FUN
e6b0: 43 5f 4f 46 46 53 45 54 7c 0a 20 20 20 20 20 20  C_OFFSET|.      
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
e6f0: 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
e700: 46 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 46  F),.#endif.    F
e710: 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20  UNCTION(ltrim,  
e720: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 31              1, 1
e730: 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20  , 0, trimFunc   
e740: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
e750: 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20  CTION(ltrim,    
e760: 20 20 20 20 20 20 20 20 20 20 32 2c 20 31 2c 20            2, 1, 
e770: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
e780: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
e790: 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20  ION(rtrim,      
e7a0: 20 20 20 20 20 20 20 20 31 2c 20 32 2c 20 30 2c          1, 2, 0,
e7b0: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
e7c0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
e7d0: 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20  N(rtrim,        
e7e0: 20 20 20 20 20 20 32 2c 20 32 2c 20 30 2c 20 74        2, 2, 0, t
e7f0: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
e800: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
e810: 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20  trim,           
e820: 20 20 20 20 31 2c 20 33 2c 20 30 2c 20 74 72 69      1, 3, 0, tri
e830: 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c  mFunc         ),
e840: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72  .    FUNCTION(tr
e850: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
e860: 20 20 32 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46    2, 3, 0, trimF
e870: 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20  unc         ),. 
e880: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c     FUNCTION(min,
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
e8a0: 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 46  1, 0, 1, minmaxF
e8b0: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
e8c0: 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20   FUNCTION(min,  
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e8e0: 20 30 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20   0, 1, 0        
e8f0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 57          ),.    W
e900: 41 47 47 52 45 47 41 54 45 28 6d 69 6e 2c 20 31  AGGREGATE(min, 1
e910: 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74  , 0, 1, minmaxSt
e920: 65 70 2c 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69  ep, minMaxFinali
e930: 7a 65 2c 20 6d 69 6e 4d 61 78 56 61 6c 75 65 2c  ze, minMaxValue,
e940: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
e970: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
e980: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e990: 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20 20  (max,           
e9a0: 20 20 20 20 2d 31 2c 20 31 2c 20 31 2c 20 6d 69      -1, 1, 1, mi
e9b0: 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20 29  nmaxFunc       )
e9c0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d  ,.    FUNCTION(m
e9d0: 61 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ax,             
e9e0: 20 20 20 30 2c 20 31 2c 20 31 2c 20 30 20 20 20     0, 1, 1, 0   
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a               ),.
ea00: 20 20 20 20 57 41 47 47 52 45 47 41 54 45 28 6d      WAGGREGATE(m
ea10: 61 78 2c 20 31 2c 20 31 2c 20 31 2c 20 6d 69 6e  ax, 1, 1, 1, min
ea20: 6d 61 78 53 74 65 70 2c 20 6d 69 6e 4d 61 78 46  maxStep, minMaxF
ea30: 69 6e 61 6c 69 7a 65 2c 20 6d 69 6e 4d 61 78 56  inalize, minMaxV
ea40: 61 6c 75 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  alue, 0,.       
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d     SQLITE_FUNC_M
ea80: 49 4e 4d 41 58 20 29 2c 0a 20 20 20 20 46 55 4e  INMAX ),.    FUN
ea90: 43 54 49 4f 4e 32 28 74 79 70 65 6f 66 2c 20 20  CTION2(typeof,  
eaa0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
eab0: 30 2c 20 74 79 70 65 6f 66 46 75 6e 63 2c 20 20  0, typeofFunc,  
eac0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
ead0: 4f 46 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f  OF),.    FUNCTIO
eae0: 4e 32 28 6c 65 6e 67 74 68 2c 20 20 20 20 20 20  N2(length,      
eaf0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c        1, 0, 0, l
eb00: 65 6e 67 74 68 46 75 6e 63 2c 20 20 53 51 4c 49  engthFunc,  SQLI
eb10: 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 29 2c  TE_FUNC_LENGTH),
eb20: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 69 6e  .    FUNCTION(in
eb30: 73 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  str,            
eb40: 20 20 32 2c 20 30 2c 20 30 2c 20 69 6e 73 74 72    2, 0, 0, instr
eb50: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
eb60: 20 20 20 46 55 4e 43 54 49 4f 4e 28 70 72 69 6e     FUNCTION(prin
eb70: 74 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d  tf,            -
eb80: 31 2c 20 30 2c 20 30 2c 20 70 72 69 6e 74 66 46  1, 0, 0, printfF
eb90: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
eba0: 20 46 55 4e 43 54 49 4f 4e 28 75 6e 69 63 6f 64   FUNCTION(unicod
ebb0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  e,            1,
ebc0: 20 30 2c 20 30 2c 20 75 6e 69 63 6f 64 65 46 75   0, 0, unicodeFu
ebd0: 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  nc      ),.    F
ebe0: 55 4e 43 54 49 4f 4e 28 63 68 61 72 2c 20 20 20  UNCTION(char,   
ebf0: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30             -1, 0
ec00: 2c 20 30 2c 20 63 68 61 72 46 75 6e 63 20 20 20  , 0, charFunc   
ec10: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
ec20: 43 54 49 4f 4e 28 61 62 73 2c 20 20 20 20 20 20  CTION(abs,      
ec30: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
ec40: 30 2c 20 61 62 73 46 75 6e 63 20 20 20 20 20 20  0, absFunc      
ec50: 20 20 20 20 29 2c 0a 23 69 66 6e 64 65 66 20 53      ),.#ifndef S
ec60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
ec70: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 46 55  ING_POINT.    FU
ec80: 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20  NCTION(round,   
ec90: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
eca0: 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 20   0, roundFunc   
ecb0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
ecc0: 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20 20 20  TION(round,     
ecd0: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30           2, 0, 0
ece0: 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 20 20 20  , roundFunc     
ecf0: 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20     ),.#endif.   
ed00: 20 46 55 4e 43 54 49 4f 4e 28 75 70 70 65 72 2c   FUNCTION(upper,
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
ed20: 20 30 2c 20 30 2c 20 75 70 70 65 72 46 75 6e 63   0, 0, upperFunc
ed30: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
ed40: 55 4e 43 54 49 4f 4e 28 6c 6f 77 65 72 2c 20 20  UNCTION(lower,  
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
ed60: 2c 20 30 2c 20 6c 6f 77 65 72 46 75 6e 63 20 20  , 0, lowerFunc  
ed70: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
ed80: 43 54 49 4f 4e 28 68 65 78 2c 20 20 20 20 20 20  CTION(hex,      
ed90: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
eda0: 30 2c 20 68 65 78 46 75 6e 63 20 20 20 20 20 20  0, hexFunc      
edb0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
edc0: 49 4f 4e 32 28 69 66 6e 75 6c 6c 2c 20 20 20 20  ION2(ifnull,    
edd0: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c          2, 0, 0,
ede0: 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49   noopFunc,  SQLI
edf0: 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45  TE_FUNC_COALESCE
ee00: 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e  ),.    VFUNCTION
ee10: 28 72 61 6e 64 6f 6d 2c 20 20 20 20 20 20 20 20  (random,        
ee20: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 72 61 6e      0, 0, 0, ran
ee30: 64 6f 6d 46 75 6e 63 20 20 20 20 20 20 20 29 2c  domFunc       ),
ee40: 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 72  .    VFUNCTION(r
ee50: 61 6e 64 6f 6d 62 6c 6f 62 2c 20 20 20 20 20 20  andomblob,      
ee60: 20 20 31 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f    1, 0, 0, rando
ee70: 6d 42 6c 6f 62 20 20 20 20 20 20 20 29 2c 0a 20  mBlob       ),. 
ee80: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c     FUNCTION(null
ee90: 69 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  if,             
eea0: 32 2c 20 30 2c 20 31 2c 20 6e 75 6c 6c 69 66 46  2, 0, 1, nullifF
eeb0: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
eec0: 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74   DFUNCTION(sqlit
eed0: 65 5f 76 65 72 73 69 6f 6e 2c 20 20 20 20 30 2c  e_version,    0,
eee0: 20 30 2c 20 30 2c 20 76 65 72 73 69 6f 6e 46 75   0, 0, versionFu
eef0: 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 44  nc      ),.    D
ef00: 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f  FUNCTION(sqlite_
ef10: 73 6f 75 72 63 65 5f 69 64 2c 20 20 30 2c 20 30  source_id,  0, 0
ef20: 2c 20 30 2c 20 73 6f 75 72 63 65 69 64 46 75 6e  , 0, sourceidFun
ef30: 63 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e  c     ),.    FUN
ef40: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 6c 6f 67  CTION(sqlite_log
ef50: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20  ,         2, 0, 
ef60: 30 2c 20 65 72 72 6c 6f 67 46 75 6e 63 20 20 20  0, errlogFunc   
ef70: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
ef80: 49 4f 4e 28 71 75 6f 74 65 2c 20 20 20 20 20 20  ION(quote,      
ef90: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
efa0: 20 71 75 6f 74 65 46 75 6e 63 20 20 20 20 20 20   quoteFunc      
efb0: 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49    ),.    VFUNCTI
efc0: 4f 4e 28 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  ON(last_insert_r
efd0: 6f 77 69 64 2c 20 30 2c 20 30 2c 20 30 2c 20 6c  owid, 0, 0, 0, l
efe0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
eff0: 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e  ),.    VFUNCTION
f000: 28 63 68 61 6e 67 65 73 2c 20 20 20 20 20 20 20  (changes,       
f010: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 68 61      0, 0, 0, cha
f020: 6e 67 65 73 20 20 20 20 20 20 20 20 20 20 29 2c  nges          ),
f030: 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 74  .    VFUNCTION(t
f040: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 2c 20 20 20  otal_changes,   
f050: 20 20 30 2c 20 30 2c 20 30 2c 20 74 6f 74 61 6c    0, 0, 0, total
f060: 5f 63 68 61 6e 67 65 73 20 20 20 20 29 2c 0a 20  _changes    ),. 
f070: 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 65 70 6c     FUNCTION(repl
f080: 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
f090: 33 2c 20 30 2c 20 30 2c 20 72 65 70 6c 61 63 65  3, 0, 0, replace
f0a0: 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20  Func      ),.   
f0b0: 20 46 55 4e 43 54 49 4f 4e 28 7a 65 72 6f 62 6c   FUNCTION(zerobl
f0c0: 6f 62 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c  ob,           1,
f0d0: 20 30 2c 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46   0, 0, zeroblobF
f0e0: 75 6e 63 20 20 20 20 20 29 2c 0a 20 20 20 20 46  unc     ),.    F
f0f0: 55 4e 43 54 49 4f 4e 28 73 75 62 73 74 72 2c 20  UNCTION(substr, 
f100: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
f110: 2c 20 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20  , 0, substrFunc 
f120: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
f130: 43 54 49 4f 4e 28 73 75 62 73 74 72 2c 20 20 20  CTION(substr,   
f140: 20 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20            3, 0, 
f150: 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20 20 20  0, substrFunc   
f160: 20 20 20 20 29 2c 0a 20 20 20 20 57 41 47 47 52      ),.    WAGGR
f170: 45 47 41 54 45 28 73 75 6d 2c 20 20 20 31 2c 30  EGATE(sum,   1,0
f180: 2c 30 2c 20 73 75 6d 53 74 65 70 2c 20 73 75 6d  ,0, sumStep, sum
f190: 46 69 6e 61 6c 69 7a 65 2c 20 73 75 6d 46 69 6e  Finalize, sumFin
f1a0: 61 6c 69 7a 65 2c 20 73 75 6d 49 6e 76 65 72 73  alize, sumInvers
f1b0: 65 2c 20 30 29 2c 0a 20 20 20 20 57 41 47 47 52  e, 0),.    WAGGR
f1c0: 45 47 41 54 45 28 74 6f 74 61 6c 2c 20 31 2c 30  EGATE(total, 1,0
f1d0: 2c 30 2c 20 73 75 6d 53 74 65 70 2c 74 6f 74 61  ,0, sumStep,tota
f1e0: 6c 46 69 6e 61 6c 69 7a 65 2c 74 6f 74 61 6c 46  lFinalize,totalF
f1f0: 69 6e 61 6c 69 7a 65 2c 73 75 6d 49 6e 76 65 72  inalize,sumInver
f200: 73 65 2c 20 30 29 2c 0a 20 20 20 20 57 41 47 47  se, 0),.    WAGG
f210: 52 45 47 41 54 45 28 61 76 67 2c 20 20 20 31 2c  REGATE(avg,   1,
f220: 30 2c 30 2c 20 73 75 6d 53 74 65 70 2c 20 61 76  0,0, sumStep, av
f230: 67 46 69 6e 61 6c 69 7a 65 2c 20 61 76 67 46 69  gFinalize, avgFi
f240: 6e 61 6c 69 7a 65 2c 20 73 75 6d 49 6e 76 65 72  nalize, sumInver
f250: 73 65 2c 20 30 29 2c 0a 20 20 20 20 57 41 47 47  se, 0),.    WAGG
f260: 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 30 2c  REGATE(count, 0,
f270: 30 2c 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20  0,0, countStep, 
f280: 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 46 69  .        countFi
f290: 6e 61 6c 69 7a 65 2c 20 63 6f 75 6e 74 46 69 6e  nalize, countFin
f2a0: 61 6c 69 7a 65 2c 20 63 6f 75 6e 74 49 6e 76 65  alize, countInve
f2b0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  rse, SQLITE_FUNC
f2c0: 5f 43 4f 55 4e 54 20 20 29 2c 0a 20 20 20 20 57  _COUNT  ),.    W
f2d0: 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e 74 2c  AGGREGATE(count,
f2e0: 20 31 2c 30 2c 30 2c 20 63 6f 75 6e 74 53 74 65   1,0,0, countSte
f2f0: 70 2c 20 0a 20 20 20 20 20 20 20 20 63 6f 75 6e  p, .        coun
f300: 74 46 69 6e 61 6c 69 7a 65 2c 20 63 6f 75 6e 74  tFinalize, count
f310: 46 69 6e 61 6c 69 7a 65 2c 20 63 6f 75 6e 74 49  Finalize, countI
f320: 6e 76 65 72 73 65 2c 20 30 20 20 29 2c 0a 20 20  nverse, 0  ),.  
f330: 20 20 57 41 47 47 52 45 47 41 54 45 28 67 72 6f    WAGGREGATE(gro
f340: 75 70 5f 63 6f 6e 63 61 74 2c 20 31 2c 20 30 2c  up_concat, 1, 0,
f350: 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53   0, groupConcatS
f360: 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 67 72  tep, .        gr
f370: 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a  oupConcatFinaliz
f380: 65 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 56 61  e, groupConcatVa
f390: 6c 75 65 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74  lue, groupConcat
f3a0: 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20 20 20  Inverse, 0),.   
f3b0: 20 57 41 47 47 52 45 47 41 54 45 28 67 72 6f 75   WAGGREGATE(grou
f3c0: 70 5f 63 6f 6e 63 61 74 2c 20 32 2c 20 30 2c 20  p_concat, 2, 0, 
f3d0: 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74  0, groupConcatSt
f3e0: 65 70 2c 20 0a 20 20 20 20 20 20 20 20 67 72 6f  ep, .        gro
f3f0: 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65  upConcatFinalize
f400: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 56 61 6c  , groupConcatVal
f410: 75 65 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 49  ue, groupConcatI
f420: 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20 20 0a 20  nverse, 0),.  . 
f430: 20 20 20 4c 49 4b 45 46 55 4e 43 28 67 6c 6f 62     LIKEFUNC(glob
f440: 2c 20 32 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c 20  , 2, &globInfo, 
f450: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
f460: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53  |SQLITE_FUNC_CAS
f470: 45 29 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  E),.#ifdef SQLIT
f480: 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45  E_CASE_SENSITIVE
f490: 5f 4c 49 4b 45 0a 20 20 20 20 4c 49 4b 45 46 55  _LIKE.    LIKEFU
f4a0: 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b  NC(like, 2, &lik
f4b0: 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45  eInfoAlt, SQLITE
f4c0: 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54  _FUNC_LIKE|SQLIT
f4d0: 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20  E_FUNC_CASE),.  
f4e0: 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c    LIKEFUNC(like,
f4f0: 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74   3, &likeInfoAlt
f500: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  , SQLITE_FUNC_LI
f510: 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  KE|SQLITE_FUNC_C
f520: 41 53 45 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20  ASE),.#else.    
f530: 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32  LIKEFUNC(like, 2
f540: 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c  , &likeInfoNorm,
f550: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
f560: 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43  E),.    LIKEFUNC
f570: 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49  (like, 3, &likeI
f580: 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f  nfoNorm, SQLITE_
f590: 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 23 65 6e 64  FUNC_LIKE),.#end
f5a0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
f5b0: 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
f5c0: 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
f5d0: 20 46 55 4e 43 54 49 4f 4e 28 75 6e 6b 6e 6f 77   FUNCTION(unknow
f5e0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c  n,           -1,
f5f0: 20 30 2c 20 30 2c 20 75 6e 6b 6e 6f 77 6e 46 75   0, 0, unknownFu
f600: 6e 63 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69  nc      ),.#endi
f610: 66 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63  f.    FUNCTION(c
f620: 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20  oalesce,        
f630: 20 20 20 31 2c 20 30 2c 20 30 2c 20 30 20 20 20     1, 0, 0, 0   
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a               ),.
f650: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61      FUNCTION(coa
f660: 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 20  lesce,          
f670: 20 30 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20   0, 0, 0, 0     
f680: 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20             ),.  
f690: 20 20 46 55 4e 43 54 49 4f 4e 32 28 63 6f 61 6c    FUNCTION2(coal
f6a0: 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 2d 31  esce,         -1
f6b0: 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63  , 0, 0, noopFunc
f6c0: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  ,  SQLITE_FUNC_C
f6d0: 4f 41 4c 45 53 43 45 29 2c 0a 20 20 7d 3b 0a 23  OALESCE),.  };.#
f6e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f6f0: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
f700: 73 71 6c 69 74 65 33 41 6c 74 65 72 46 75 6e 63  sqlite3AlterFunc
f710: 74 69 6f 6e 73 28 29 3b 0a 23 65 6e 64 69 66 0a  tions();.#endif.
f720: 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46    sqlite3WindowF
f730: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 69 66 20  unctions();.#if 
f740: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
f750: 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 7c 7c 20  NABLE_STAT3) || 
f760: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
f770: 4e 41 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 73  NABLE_STAT4).  s
f780: 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 46 75 6e  qlite3AnalyzeFun
f790: 63 74 69 6f 6e 73 28 29 3b 0a 23 65 6e 64 69 66  ctions();.#endif
f7a0: 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  .  sqlite3Regist
f7b0: 65 72 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69  erDateTimeFuncti
f7c0: 6f 6e 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ons();.  sqlite3
f7d0: 49 6e 73 65 72 74 42 75 69 6c 74 69 6e 46 75 6e  InsertBuiltinFun
f7e0: 63 73 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 2c  cs(aBuiltinFunc,
f7f0: 20 41 72 72 61 79 53 69 7a 65 28 61 42 75 69 6c   ArraySize(aBuil
f800: 74 69 6e 46 75 6e 63 29 29 3b 0a 0a 23 69 66 20  tinFunc));..#if 
f810: 30 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 6f 20  0  /* Enable to 
f820: 70 72 69 6e 74 20 6f 75 74 20 68 6f 77 20 74 68  print out how th
f830: 65 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  e built-in funct
f840: 69 6f 6e 73 20 61 72 65 20 68 61 73 68 65 64 20  ions are hashed 
f850: 2a 2f 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69  */.  {.    int i
f860: 3b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  ;.    FuncDef *p
f870: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f880: 3c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53  <SQLITE_FUNC_HAS
f890: 48 5f 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  H_SZ; i++){.    
f8a0: 20 20 70 72 69 6e 74 66 28 22 46 55 4e 43 2d 48    printf("FUNC-H
f8b0: 41 53 48 20 25 30 32 64 3a 22 2c 20 69 29 3b 0a  ASH %02d:", i);.
f8c0: 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69        for(p=sqli
f8d0: 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  te3BuiltinFuncti
f8e0: 6f 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20 70 3d 70  ons.a[i]; p; p=p
f8f0: 2d 3e 75 2e 70 48 61 73 68 29 7b 0a 20 20 20 20  ->u.pHash){.    
f900: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
f910: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a  te3Strlen30(p->z
f920: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
f930: 6e 74 20 68 20 3d 20 70 2d 3e 7a 4e 61 6d 65 5b  nt h = p->zName[
f940: 30 5d 20 2b 20 6e 3b 0a 20 20 20 20 20 20 20 20  0] + n;.        
f950: 70 72 69 6e 74 66 28 22 20 25 73 28 25 64 29 22  printf(" %s(%d)"
f960: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 68 29 3b 0a  , p->zName, h);.
f970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
f980: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
f990: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a     }.  }.#endif.}.