/ Hex Artifact Content
Login

Artifact 8a002cd2eb217dcac2e2f3b1f1fc49315081f7c71dff3f0bbbb4c157b5d24b50:


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 0a 20 20   int isText;..  
1670: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1680: 28 61 72 67 63 29 3b 0a 20 20 74 79 70 65 48 61  (argc);.  typeHa
1690: 79 73 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  ystack = sqlite3
16a0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
16b0: 5b 30 5d 29 3b 0a 20 20 74 79 70 65 4e 65 65 64  [0]);.  typeNeed
16c0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
16d0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29  ue_type(argv[1])
16e0: 3b 0a 20 20 69 66 28 20 74 79 70 65 48 61 79 73  ;.  if( typeHays
16f0: 74 61 63 6b 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  tack==SQLITE_NUL
1700: 4c 20 7c 7c 20 74 79 70 65 4e 65 65 64 6c 65 3d  L || typeNeedle=
1710: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72  =SQLITE_NULL ) r
1720: 65 74 75 72 6e 3b 0a 20 20 6e 48 61 79 73 74 61  eturn;.  nHaysta
1730: 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ck = sqlite3_val
1740: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
1750: 29 3b 0a 20 20 6e 4e 65 65 64 6c 65 20 3d 20 73  );.  nNeedle = s
1760: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
1770: 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  es(argv[1]);.  i
1780: 66 28 20 6e 4e 65 65 64 6c 65 3e 30 20 29 7b 0a  f( nNeedle>0 ){.
1790: 20 20 20 20 69 66 28 20 74 79 70 65 48 61 79 73      if( typeHays
17a0: 74 61 63 6b 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  tack==SQLITE_BLO
17b0: 42 20 26 26 20 74 79 70 65 4e 65 65 64 6c 65 3d  B && typeNeedle=
17c0: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a  =SQLITE_BLOB ){.
17d0: 20 20 20 20 20 20 7a 48 61 79 73 74 61 63 6b 20        zHaystack 
17e0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
17f0: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
1800: 20 20 20 20 20 7a 4e 65 65 64 6c 65 20 3d 20 73       zNeedle = s
1810: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
1820: 62 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  b(argv[1]);.    
1830: 20 20 69 73 54 65 78 74 20 3d 20 30 3b 0a 20 20    isText = 0;.  
1840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1850: 48 61 79 73 74 61 63 6b 20 3d 20 73 71 6c 69 74  Haystack = sqlit
1860: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1870: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7a 4e  gv[0]);.      zN
1880: 65 65 64 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  eedle = sqlite3_
1890: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
18a0: 31 5d 29 3b 0a 20 20 20 20 20 20 69 73 54 65 78  1]);.      isTex
18b0: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
18c0: 20 69 66 28 20 7a 4e 65 65 64 6c 65 3d 3d 30 20   if( zNeedle==0 
18d0: 7c 7c 20 28 6e 48 61 79 73 74 61 63 6b 20 26 26  || (nHaystack &&
18e0: 20 7a 48 61 79 73 74 61 63 6b 3d 3d 30 29 20 29   zHaystack==0) )
18f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 77 68 69   return;.    whi
1900: 6c 65 28 20 6e 4e 65 65 64 6c 65 3c 3d 6e 48 61  le( nNeedle<=nHa
1910: 79 73 74 61 63 6b 20 26 26 20 6d 65 6d 63 6d 70  ystack && memcmp
1920: 28 7a 48 61 79 73 74 61 63 6b 2c 20 7a 4e 65 65  (zHaystack, zNee
1930: 64 6c 65 2c 20 6e 4e 65 65 64 6c 65 29 21 3d 30  dle, nNeedle)!=0
1940: 20 29 7b 0a 20 20 20 20 20 20 4e 2b 2b 3b 0a 20   ){.      N++;. 
1950: 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
1960: 20 6e 48 61 79 73 74 61 63 6b 2d 2d 3b 0a 20 20   nHaystack--;.  
1970: 20 20 20 20 20 20 7a 48 61 79 73 74 61 63 6b 2b        zHaystack+
1980: 2b 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  +;.      }while(
1990: 20 69 73 54 65 78 74 20 26 26 20 28 7a 48 61 79   isText && (zHay
19a0: 73 74 61 63 6b 5b 30 5d 26 30 78 63 30 29 3d 3d  stack[0]&0xc0)==
19b0: 30 78 38 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  0x80 );.    }.  
19c0: 20 20 69 66 28 20 6e 4e 65 65 64 6c 65 3e 6e 48    if( nNeedle>nH
19d0: 61 79 73 74 61 63 6b 20 29 20 4e 20 3d 20 30 3b  aystack ) N = 0;
19e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
19f0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
1a00: 74 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t, N);.}../*.** 
1a10: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1a20: 66 20 74 68 65 20 70 72 69 6e 74 66 28 29 20 66  f the printf() f
1a30: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1a40: 69 63 20 76 6f 69 64 20 70 72 69 6e 74 66 46 75  ic void printfFu
1a50: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
1a60: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
1a70: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
1a80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1a90: 67 76 0a 29 7b 0a 20 20 50 72 69 6e 74 66 41 72  gv.){.  PrintfAr
1aa0: 67 75 6d 65 6e 74 73 20 78 3b 0a 20 20 53 74 72  guments x;.  Str
1ab0: 41 63 63 75 6d 20 73 74 72 3b 0a 20 20 63 6f 6e  Accum str;.  con
1ac0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1ad0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
1ae0: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
1af0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
1b00: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 0a  ndle(context);..
1b10: 20 20 69 66 28 20 61 72 67 63 3e 3d 31 20 26 26    if( argc>=1 &&
1b20: 20 28 7a 46 6f 72 6d 61 74 20 3d 20 28 63 6f 6e   (zFormat = (con
1b30: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1b40: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1b50: 5b 30 5d 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  [0]))!=0 ){.    
1b60: 78 2e 6e 41 72 67 20 3d 20 61 72 67 63 2d 31 3b  x.nArg = argc-1;
1b70: 0a 20 20 20 20 78 2e 6e 55 73 65 64 20 3d 20 30  .    x.nUsed = 0
1b80: 3b 0a 20 20 20 20 78 2e 61 70 41 72 67 20 3d 20  ;.    x.apArg = 
1b90: 61 72 67 76 2b 31 3b 0a 20 20 20 20 73 71 6c 69  argv+1;.    sqli
1ba0: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
1bb0: 26 73 74 72 2c 20 64 62 2c 20 30 2c 20 30 2c 20  &str, db, 0, 0, 
1bc0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
1bd0: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 29  E_LIMIT_LENGTH])
1be0: 3b 0a 20 20 20 20 73 74 72 2e 70 72 69 6e 74 66  ;.    str.printf
1bf0: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 50  Flags = SQLITE_P
1c00: 52 49 4e 54 46 5f 53 51 4c 46 55 4e 43 3b 0a 20  RINTF_SQLFUNC;. 
1c10: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
1c20: 70 70 65 6e 64 66 28 26 73 74 72 2c 20 7a 46 6f  ppendf(&str, zFo
1c30: 72 6d 61 74 2c 20 26 78 29 3b 0a 20 20 20 20 6e  rmat, &x);.    n
1c40: 20 3d 20 73 74 72 2e 6e 43 68 61 72 3b 0a 20 20   = str.nChar;.  
1c50: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1c60: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  _text(context, s
1c70: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
1c80: 6e 69 73 68 28 26 73 74 72 29 2c 20 6e 2c 0a 20  nish(&str), n,. 
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 59         SQLITE_DY
1cb0: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
1cc0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1cd0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1ce0: 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  r() function..**
1cf0: 0a 2a 2a 20 73 75 62 73 74 72 28 78 2c 70 31 2c  .** substr(x,p1,
1d00: 70 32 29 20 20 72 65 74 75 72 6e 73 20 70 32 20  p2)  returns p2 
1d10: 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 78 5b  characters of x[
1d20: 5d 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  ] beginning with
1d30: 20 70 31 2e 0a 2a 2a 20 70 31 20 69 73 20 31 2d   p1..** p1 is 1-
1d40: 69 6e 64 65 78 65 64 2e 20 20 53 6f 20 73 75 62  indexed.  So sub
1d50: 73 74 72 28 78 2c 31 2c 31 29 20 72 65 74 75 72  str(x,1,1) retur
1d60: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 68 61  ns the first cha
1d70: 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 78 2e 20  racter.** of x. 
1d80: 20 49 66 20 78 20 69 73 20 74 65 78 74 2c 20 74   If x is text, t
1d90: 68 65 6e 20 77 65 20 61 63 74 75 61 6c 6c 79 20  hen we actually 
1da0: 63 6f 75 6e 74 20 55 54 46 2d 38 20 63 68 61 72  count UTF-8 char
1db0: 61 63 74 65 72 73 2e 0a 2a 2a 20 49 66 20 78 20  acters..** If x 
1dc0: 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 6e 20  is a blob, then 
1dd0: 77 65 20 63 6f 75 6e 74 20 62 79 74 65 73 2e 0a  we count bytes..
1de0: 2a 2a 0a 2a 2a 20 49 66 20 70 31 20 69 73 20 6e  **.** If p1 is n
1df0: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 77 65  egative, then we
1e00: 20 62 65 67 69 6e 20 61 62 73 28 70 31 29 20 66   begin abs(p1) f
1e10: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 78  rom the end of x
1e20: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 32 20  []..**.** If p2 
1e30: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 72 65 74  is negative, ret
1e40: 75 72 6e 20 74 68 65 20 70 32 20 63 68 61 72 61  urn the p2 chara
1e50: 63 74 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  cters preceding 
1e60: 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  p1..*/.static vo
1e70: 69 64 20 73 75 62 73 74 72 46 75 6e 63 28 0a 20  id substrFunc(. 
1e80: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1e90: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
1ea0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
1eb0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
1ec0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1ed0: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e  d char *z;.  con
1ee0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ef0: 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b   *z2;.  int len;
1f00: 0a 20 20 69 6e 74 20 70 30 74 79 70 65 3b 0a 20  .  int p0type;. 
1f10: 20 69 36 34 20 70 31 2c 20 70 32 3b 0a 20 20 69   i64 p1, p2;.  i
1f20: 6e 74 20 6e 65 67 50 32 20 3d 20 30 3b 0a 0a 20  nt negP2 = 0;.. 
1f30: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33   assert( argc==3
1f40: 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20   || argc==2 );. 
1f50: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
1f60: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29  ue_type(argv[1])
1f70: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20  ==SQLITE_NULL.  
1f80: 20 7c 7c 20 28 61 72 67 63 3d 3d 33 20 26 26 20   || (argc==3 && 
1f90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1fa0: 70 65 28 61 72 67 76 5b 32 5d 29 3d 3d 53 51 4c  pe(argv[2])==SQL
1fb0: 49 54 45 5f 4e 55 4c 4c 29 0a 20 20 29 7b 0a 20  ITE_NULL).  ){. 
1fc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1fd0: 20 70 30 74 79 70 65 20 3d 20 73 71 6c 69 74 65   p0type = sqlite
1fe0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
1ff0: 76 5b 30 5d 29 3b 0a 20 20 70 31 20 3d 20 73 71  v[0]);.  p1 = sq
2000: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
2010: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  argv[1]);.  if( 
2020: 70 30 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42  p0type==SQLITE_B
2030: 4c 4f 42 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  LOB ){.    len =
2040: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
2050: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
2060: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
2070: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
2080: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  ]);.    if( z==0
2090: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61   ) return;.    a
20a0: 73 73 65 72 74 28 20 6c 65 6e 3d 3d 73 71 6c 69  ssert( len==sqli
20b0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
20c0: 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 7d 65  argv[0]) );.  }e
20d0: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
20e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
20f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
2100: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
2110: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
2120: 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20    if( p1<0 ){.  
2130: 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a      for(z2=z; *z
2140: 32 3b 20 6c 65 6e 2b 2b 29 7b 0a 20 20 20 20 20  2; len++){.     
2150: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
2160: 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 20 20 7d  TF8(z2);.      }
2170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
2180: 66 20 53 51 4c 49 54 45 5f 53 55 42 53 54 52 5f  f SQLITE_SUBSTR_
2190: 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 0a 20 20  COMPATIBILITY.  
21a0: 2f 2a 20 49 66 20 53 55 42 53 54 52 5f 43 4f 4d  /* If SUBSTR_COM
21b0: 50 41 54 49 42 49 4c 49 54 59 20 69 73 20 64 65  PATIBILITY is de
21c0: 66 69 6e 65 64 20 74 68 65 6e 20 73 75 62 73 74  fined then subst
21d0: 72 28 58 2c 30 2c 4e 29 20 77 6f 72 6b 20 74 68  r(X,0,N) work th
21e0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 61  e same as.  ** a
21f0: 73 20 73 75 62 73 74 72 28 58 2c 31 2c 4e 29 20  s substr(X,1,N) 
2200: 2d 20 69 74 20 72 65 74 75 72 6e 73 20 74 68 65  - it returns the
2210: 20 66 69 72 73 74 20 4e 20 63 68 61 72 61 63 74   first N charact
2220: 65 72 73 20 6f 66 20 58 2e 20 20 54 68 69 73 0a  ers of X.  This.
2230: 20 20 2a 2a 20 69 73 20 65 73 73 65 6e 74 69 61    ** is essentia
2240: 6c 6c 79 20 61 20 62 61 63 6b 2d 6f 75 74 20 6f  lly a back-out o
2250: 66 20 74 68 65 20 62 75 67 2d 66 69 78 20 69 6e  f the bug-fix in
2260: 20 63 68 65 63 6b 2d 69 6e 20 5b 35 66 63 31 32   check-in [5fc12
2270: 35 64 33 36 32 64 66 34 62 38 5d 0a 20 20 2a 2a  5d362df4b8].  **
2280: 20 66 72 6f 6d 20 32 30 30 39 2d 30 32 2d 30 32   from 2009-02-02
2290: 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69   for compatibili
22a0: 74 79 20 6f 66 20 61 70 70 6c 69 63 61 74 69 6f  ty of applicatio
22b0: 6e 73 20 74 68 61 74 20 65 78 70 6c 6f 69 74 65  ns that exploite
22c0: 64 20 74 68 65 0a 20 20 2a 2a 20 6f 6c 64 20 62  d the.  ** old b
22d0: 75 67 67 79 20 62 65 68 61 76 69 6f 72 2e 20 2a  uggy behavior. *
22e0: 2f 0a 20 20 69 66 28 20 70 31 3d 3d 30 20 29 20  /.  if( p1==0 ) 
22f0: 70 31 20 3d 20 31 3b 20 2f 2a 20 3c 72 64 61 72  p1 = 1; /* <rdar
2300: 3a 2f 2f 70 72 6f 62 6c 65 6d 2f 36 37 37 38 33  ://problem/67783
2310: 33 39 3e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  39> */.#endif.  
2320: 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20  if( argc==3 ){. 
2330: 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f     p2 = sqlite3_
2340: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32  value_int(argv[2
2350: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 32 3c 30  ]);.    if( p2<0
2360: 20 29 7b 0a 20 20 20 20 20 20 70 32 20 3d 20 2d   ){.      p2 = -
2370: 70 32 3b 0a 20 20 20 20 20 20 6e 65 67 50 32 20  p2;.      negP2 
2380: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2390: 73 65 7b 0a 20 20 20 20 70 32 20 3d 20 73 71 6c  se{.    p2 = sql
23a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
23b0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 2d  handle(context)-
23c0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
23d0: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20  IMIT_LENGTH];.  
23e0: 7d 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a  }.  if( p1<0 ){.
23f0: 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20      p1 += len;. 
2400: 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20     if( p1<0 ){. 
2410: 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20       p2 += p1;. 
2420: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 20       if( p2<0 ) 
2430: 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 31  p2 = 0;.      p1
2440: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
2450: 6c 73 65 20 69 66 28 20 70 31 3e 30 20 29 7b 0a  lse if( p1>0 ){.
2460: 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 65 6c 73      p1--;.  }els
2470: 65 20 69 66 28 20 70 32 3e 30 20 29 7b 0a 20 20  e if( p2>0 ){.  
2480: 20 20 70 32 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66    p2--;.  }.  if
2490: 28 20 6e 65 67 50 32 20 29 7b 0a 20 20 20 20 70  ( negP2 ){.    p
24a0: 31 20 2d 3d 20 70 32 3b 0a 20 20 20 20 69 66 28  1 -= p2;.    if(
24b0: 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70   p1<0 ){.      p
24c0: 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 70  2 += p1;.      p
24d0: 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 = 0;.    }.  }
24e0: 0a 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30  .  assert( p1>=0
24f0: 20 26 26 20 70 32 3e 3d 30 20 29 3b 0a 20 20 69   && p2>=0 );.  i
2500: 66 28 20 70 30 74 79 70 65 21 3d 53 51 4c 49 54  f( p0type!=SQLIT
2510: 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 77 68  E_BLOB ){.    wh
2520: 69 6c 65 28 20 2a 7a 20 26 26 20 70 31 20 29 7b  ile( *z && p1 ){
2530: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b  .      SQLITE_SK
2540: 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20  IP_UTF8(z);.    
2550: 20 20 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20    p1--;.    }.  
2560: 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 20    for(z2=z; *z2 
2570: 26 26 20 70 32 3b 20 70 32 2d 2d 29 7b 0a 20 20  && p2; p2--){.  
2580: 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f      SQLITE_SKIP_
2590: 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 7d 0a  UTF8(z2);.    }.
25a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
25b0: 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78  lt_text64(contex
25c0: 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a 32 2d  t, (char*)z, z2-
25d0: 7a 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  z, SQLITE_TRANSI
25e0: 45 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ENT,.           
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2600: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 7d  QLITE_UTF8);.  }
2610: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 31  else{.    if( p1
2620: 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 20  +p2>len ){.     
2630: 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a 20 20   p2 = len-p1;.  
2640: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 20 70      if( p2<0 ) p
2650: 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 0;.    }.   
2660: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2670: 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20  blob64(context, 
2680: 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20 28  (char*)&z[p1], (
2690: 75 36 34 29 70 32 2c 20 53 51 4c 49 54 45 5f 54  u64)p2, SQLITE_T
26a0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d  RANSIENT);.  }.}
26b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
26c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  tation of the ro
26d0: 75 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a  und() function.*
26e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
26f0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
2700: 4f 49 4e 54 0a 73 74 61 74 69 63 20 76 6f 69 64  OINT.static void
2710: 20 72 6f 75 6e 64 46 75 6e 63 28 73 71 6c 69 74   roundFunc(sqlit
2720: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
2730: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
2740: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2750: 72 67 76 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  rgv){.  int n = 
2760: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  0;.  double r;. 
2770: 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 61   char *zBuf;.  a
2780: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
2790: 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69  | argc==2 );.  i
27a0: 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20  f( argc==2 ){.  
27b0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
27c0: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
27d0: 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 20 29  _type(argv[1]) )
27e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d   return;.    n =
27f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2800: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  nt(argv[1]);.   
2810: 20 69 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d 20   if( n>30 ) n = 
2820: 33 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20  30;.    if( n<0 
2830: 29 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ) n = 0;.  }.  i
2840: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
2850: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
2860: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
2870: 74 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71 6c 69  turn;.  r = sqli
2880: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
2890: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20  (argv[0]);.  /* 
28a0: 49 66 20 59 3d 3d 30 20 61 6e 64 20 58 20 77 69  If Y==0 and X wi
28b0: 6c 6c 20 66 69 74 20 69 6e 20 61 20 36 34 2d 62  ll fit in a 64-b
28c0: 69 74 20 69 6e 74 2c 0a 20 20 2a 2a 20 68 61 6e  it int,.  ** han
28d0: 64 6c 65 20 74 68 65 20 72 6f 75 6e 64 69 6e 67  dle the rounding
28e0: 20 64 69 72 65 63 74 6c 79 2c 0a 20 20 2a 2a 20   directly,.  ** 
28f0: 6f 74 68 65 72 77 69 73 65 20 75 73 65 20 70 72  otherwise use pr
2900: 69 6e 74 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  intf..  */.  if(
2910: 20 6e 3d 3d 30 20 26 26 20 72 3e 3d 30 20 26 26   n==0 && r>=0 &&
2920: 20 72 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   r<LARGEST_INT64
2930: 2d 31 20 29 7b 0a 20 20 20 20 72 20 3d 20 28 64  -1 ){.    r = (d
2940: 6f 75 62 6c 65 29 28 28 73 71 6c 69 74 65 5f 69  ouble)((sqlite_i
2950: 6e 74 36 34 29 28 72 2b 30 2e 35 29 29 3b 0a 20  nt64)(r+0.5));. 
2960: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20   }else if( n==0 
2970: 26 26 20 72 3c 30 20 26 26 20 28 2d 72 29 3c 4c  && r<0 && (-r)<L
2980: 41 52 47 45 53 54 5f 49 4e 54 36 34 2d 31 20 29  ARGEST_INT64-1 )
2990: 7b 0a 20 20 20 20 72 20 3d 20 2d 28 64 6f 75 62  {.    r = -(doub
29a0: 6c 65 29 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  le)((sqlite_int6
29b0: 34 29 28 28 2d 72 29 2b 30 2e 35 29 29 3b 0a 20  4)((-r)+0.5));. 
29c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 42 75 66   }else{.    zBuf
29d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
29e0: 74 66 28 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a  tf("%.*f",n,r);.
29f0: 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20      if( zBuf==0 
2a00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a10: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
2a20: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
2a30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2a40: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  }.    sqlite3Ato
2a50: 46 28 7a 42 75 66 2c 20 26 72 2c 20 73 71 6c 69  F(zBuf, &r, sqli
2a60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
2a70: 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
2a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2a90: 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 73  e(zBuf);.  }.  s
2aa0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
2ab0: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29  uble(context, r)
2ac0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2ad0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
2ae0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2af0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  using sqlite3Mal
2b00: 6c 6f 63 28 29 2e 20 49 66 20 74 68 65 0a 2a 2a  loc(). If the.**
2b10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2b20: 73 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  s, call sqlite3_
2b30: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
2b40: 65 6d 28 29 20 74 6f 20 6e 6f 74 69 66 79 0a 2a  em() to notify.*
2b50: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  * the database h
2b60: 61 6e 64 6c 65 20 74 68 61 74 20 6d 61 6c 6c 6f  andle that mallo
2b70: 63 28 29 20 68 61 73 20 66 61 69 6c 65 64 20 61  c() has failed a
2b80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
2b90: 2a 2a 20 49 66 20 6e 42 79 74 65 20 69 73 20 6c  ** If nByte is l
2ba0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d  arger than the m
2bb0: 61 78 69 6d 75 6d 20 73 74 72 69 6e 67 20 6f 72  aximum string or
2bc0: 20 62 6c 6f 62 20 6c 65 6e 67 74 68 2c 20 74 68   blob length, th
2bd0: 65 6e 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53  en.** raise an S
2be0: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 65 78 63  QLITE_TOOBIG exc
2bf0: 65 70 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72  eption and retur
2c00: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
2c10: 63 20 76 6f 69 64 20 2a 63 6f 6e 74 65 78 74 4d  c void *contextM
2c20: 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 63 6f  alloc(sqlite3_co
2c30: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
2c40: 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 63 68  i64 nByte){.  ch
2c50: 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33  ar *z;.  sqlite3
2c60: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
2c70: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
2c80: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61 73 73  (context);.  ass
2c90: 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a  ert( nByte>0 );.
2ca0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 42 79 74    testcase( nByt
2cb0: 65 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e==db->aLimit[SQ
2cc0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
2cd0: 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  H] );.  testcase
2ce0: 28 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61 4c 69  ( nByte==db->aLi
2cf0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
2d00: 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20  _LENGTH]+1 );.  
2d10: 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c  if( nByte>db->aL
2d20: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
2d30: 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
2d40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2d50: 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e  error_toobig(con
2d60: 74 65 78 74 29 3b 0a 20 20 20 20 7a 20 3d 20 30  text);.    z = 0
2d70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2d80: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2d90: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
2da0: 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   !z ){.      sql
2db0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2dc0: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
2dd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2de0: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
2df0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2e00: 6f 66 20 74 68 65 20 75 70 70 65 72 28 29 20 61  of the upper() a
2e10: 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20 66  nd lower() SQL f
2e20: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  unctions..*/.sta
2e30: 74 69 63 20 76 6f 69 64 20 75 70 70 65 72 46 75  tic void upperFu
2e40: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
2e50: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
2e60: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
2e70: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
2e80: 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73  char *z1;.  cons
2e90: 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e  t char *z2;.  in
2ea0: 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45 44  t i, n;.  UNUSED
2eb0: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
2ec0: 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a 29  ;.  z2 = (char*)
2ed0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
2ee0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e  xt(argv[0]);.  n
2ef0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2f00: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
2f10: 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
2f20: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62  t the call to _b
2f30: 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74 20  ytes() does not 
2f40: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 5f  invalidate the _
2f50: 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20 2a  text() pointer *
2f60: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d 3d  /.  assert( z2==
2f70: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
2f80: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
2f90: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20 29  ]) );.  if( z2 )
2fa0: 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65  {.    z1 = conte
2fb0: 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74  xtMalloc(context
2fc0: 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a 20  , ((i64)n)+1);. 
2fd0: 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20 20     if( z1 ){.   
2fe0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
2ff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a   i++){.        z
3000: 31 5b 69 5d 20 3d 20 28 63 68 61 72 29 73 71 6c  1[i] = (char)sql
3010: 69 74 65 33 54 6f 75 70 70 65 72 28 7a 32 5b 69  ite3Toupper(z2[i
3020: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
3030: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3040: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
3050: 31 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72  1, n, sqlite3_fr
3060: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ee);.    }.  }.}
3070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 77  .static void low
3080: 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  erFunc(sqlite3_c
3090: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
30a0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
30b0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
30c0: 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  {.  char *z1;.  
30d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
30e0: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e    int i, n;.  UN
30f0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
3100: 72 67 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68  rgc);.  z2 = (ch
3110: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
3120: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
3130: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
3140: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
3150: 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79  0]);.  /* Verify
3160: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
3170: 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20  o _bytes() does 
3180: 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74  not invalidate t
3190: 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74  he _text() point
31a0: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
31b0: 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74  z2==(char*)sqlit
31c0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
31d0: 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  gv[0]) );.  if( 
31e0: 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63  z2 ){.    z1 = c
31f0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
3200: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31  text, ((i64)n)+1
3210: 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b  );.    if( z1 ){
3220: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
3230: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
3240: 20 20 20 7a 31 5b 69 5d 20 3d 20 73 71 6c 69 74     z1[i] = sqlit
3250: 65 33 54 6f 6c 6f 77 65 72 28 7a 32 5b 69 5d 29  e3Tolower(z2[i])
3260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3270: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
3280: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c  ext(context, z1,
3290: 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   n, sqlite3_free
32a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
32b0: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 66 75 6e 63 74  /*.** Some funct
32c0: 69 6f 6e 73 20 6c 69 6b 65 20 43 4f 41 4c 45 53  ions like COALES
32d0: 43 45 28 29 20 61 6e 64 20 49 46 4e 55 4c 4c 28  CE() and IFNULL(
32e0: 29 20 61 6e 64 20 55 4e 4c 49 4b 45 4c 59 28 29  ) and UNLIKELY()
32f0: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
3300: 0a 2a 2a 20 61 73 20 56 44 42 45 20 63 6f 64 65  .** as VDBE code
3310: 20 73 6f 20 74 68 61 74 20 75 6e 75 73 65 64 20   so that unused 
3320: 61 72 67 75 6d 65 6e 74 20 76 61 6c 75 65 73 20  argument values 
3330: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 62  do not have to b
3340: 65 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2a 20 48  e computed..** H
3350: 6f 77 65 76 65 72 2c 20 77 65 20 73 74 69 6c 6c  owever, we still
3360: 20 6e 65 65 64 20 73 6f 6d 65 20 6b 69 6e 64 20   need some kind 
3370: 6f 66 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  of function impl
3380: 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  ementation for t
3390: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  his.** routines 
33a0: 69 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  in the function 
33b0: 74 61 62 6c 65 2e 20 20 54 68 65 20 6e 6f 6f 70  table.  The noop
33c0: 46 75 6e 63 20 6d 61 63 72 6f 20 70 72 6f 76 69  Func macro provi
33d0: 64 65 73 20 74 68 69 73 2e 0a 2a 2a 20 6e 6f 6f  des this..** noo
33e0: 70 46 75 6e 63 20 77 69 6c 6c 20 6e 65 76 65 72  pFunc will never
33f0: 20 62 65 20 63 61 6c 6c 65 64 20 73 6f 20 69 74   be called so it
3400: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
3410: 77 68 61 74 20 74 68 65 20 69 6d 70 6c 65 6d 65  what the impleme
3420: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 2e 20 20  ntation.** is.  
3430: 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c  We might as well
3440: 20 75 73 65 20 74 68 65 20 22 76 65 72 73 69 6f   use the "versio
3450: 6e 28 29 22 20 66 75 6e 63 74 69 6f 6e 20 61 73  n()" function as
3460: 20 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a   a substitute..*
3470: 2f 0a 23 64 65 66 69 6e 65 20 6e 6f 6f 70 46 75  /.#define noopFu
3480: 6e 63 20 76 65 72 73 69 6f 6e 46 75 6e 63 20 20  nc versionFunc  
3490: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 66   /* Substitute f
34a0: 75 6e 63 74 69 6f 6e 20 2d 20 6e 65 76 65 72 20  unction - never 
34b0: 63 61 6c 6c 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  called */../*.**
34c0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
34d0: 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20 52 65  of random().  Re
34e0: 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 69 6e  turn a random in
34f0: 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74  teger.  .*/.stat
3500: 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46 75  ic void randomFu
3510: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3520: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
3530: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
3540: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3550: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
3560: 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 3b 0a 20  qlite_int64 r;. 
3570: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
3580: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
3590: 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  sed2);.  sqlite3
35a0: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
35b0: 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 69 66  of(r), &r);.  if
35c0: 28 20 72 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( r<0 ){.    /* 
35d0: 57 65 20 6e 65 65 64 20 74 6f 20 70 72 65 76 65  We need to preve
35e0: 6e 74 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  nt a random numb
35f0: 65 72 20 6f 66 20 30 78 38 30 30 30 30 30 30 30  er of 0x80000000
3600: 30 30 30 30 30 30 30 30 20 0a 20 20 20 20 2a 2a  00000000 .    **
3610: 20 28 6f 72 20 2d 39 32 32 33 33 37 32 30 33 36   (or -9223372036
3620: 38 35 34 37 37 35 38 30 38 29 20 73 69 6e 63 65  854775808) since
3630: 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 61 62 73   when you do abs
3640: 28 29 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a  () of that.    *
3650: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 79 6f 75 20  * number of you 
3660: 67 65 74 20 74 68 65 20 73 61 6d 65 20 76 61 6c  get the same val
3670: 75 65 20 62 61 63 6b 20 61 67 61 69 6e 2e 20 20  ue back again.  
3680: 54 6f 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a  To do this.    *
3690: 2a 20 69 6e 20 61 20 77 61 79 20 74 68 61 74 20  * in a way that 
36a0: 69 73 20 74 65 73 74 61 62 6c 65 2c 20 6d 61 73  is testable, mas
36b0: 6b 20 74 68 65 20 73 69 67 6e 20 62 69 74 20 6f  k the sign bit o
36c0: 66 66 20 6f 66 20 6e 65 67 61 74 69 76 65 0a 20  ff of negative. 
36d0: 20 20 20 2a 2a 20 76 61 6c 75 65 73 2c 20 72 65     ** values, re
36e0: 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 70 6f 73  sulting in a pos
36f0: 69 74 69 76 65 20 76 61 6c 75 65 2e 20 20 54 68  itive value.  Th
3700: 65 6e 20 74 61 6b 65 20 74 68 65 20 0a 20 20 20  en take the .   
3710: 20 2a 2a 20 32 73 20 63 6f 6d 70 6c 65 6d 65 6e   ** 2s complemen
3720: 74 20 6f 66 20 74 68 61 74 20 70 6f 73 69 74 69  t of that positi
3730: 76 65 20 76 61 6c 75 65 2e 20 20 54 68 65 20 65  ve value.  The e
3740: 6e 64 20 72 65 73 75 6c 74 20 63 61 6e 0a 20 20  nd result can.  
3750: 20 20 2a 2a 20 74 68 65 72 65 66 6f 72 65 20 62    ** therefore b
3760: 65 20 6e 6f 20 6c 65 73 73 20 74 68 61 6e 20 2d  e no less than -
3770: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
3780: 38 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  807..    */.    
3790: 72 20 3d 20 2d 28 72 20 26 20 4c 41 52 47 45 53  r = -(r & LARGES
37a0: 54 5f 49 4e 54 36 34 29 3b 0a 20 20 7d 0a 20 20  T_INT64);.  }.  
37b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
37c0: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 29  nt64(context, r)
37d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
37e0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e  mentation of ran
37f0: 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52 65 74  domblob(N).  Ret
3800: 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62 6c 6f  urn a random blo
3810: 62 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e 20 62  b.** that is N b
3820: 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  ytes long..*/.st
3830: 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d  atic void random
3840: 42 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f  Blob(.  sqlite3_
3850: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3860: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
3870: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3880: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  argv.){.  int n;
3890: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
38a0: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61   *p;.  assert( a
38b0: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
38c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
38d0: 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  c);.  n = sqlite
38e0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
38f0: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20  [0]);.  if( n<1 
3900: 29 7b 0a 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  ){.    n = 1;.  
3910: 7d 0a 20 20 70 20 3d 20 63 6f 6e 74 65 78 74 4d  }.  p = contextM
3920: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 6e  alloc(context, n
3930: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
3940: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
3950: 6e 65 73 73 28 6e 2c 20 70 29 3b 0a 20 20 20 20  ness(n, p);.    
3960: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
3970: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  lob(context, (ch
3980: 61 72 2a 29 70 2c 20 6e 2c 20 73 71 6c 69 74 65  ar*)p, n, sqlite
3990: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
39a0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
39b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 73 74  tion of the last
39c0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20  _insert_rowid() 
39d0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  SQL function.  T
39e0: 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c  he return.** val
39f0: 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ue is the same a
3a00: 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61  s the sqlite3_la
3a10: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
3a20: 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  ) API function..
3a30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
3a40: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
3a50: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3a60: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
3a70: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 0a 20   int NotUsed, . 
3a80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3a90: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
3aa0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
3ab0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
3ac0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
3ad0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
3ae0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
3af0: 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d  tUsed2);.  /* IM
3b00: 50 3a 20 52 2d 35 31 35 31 33 2d 31 32 30 32 36  P: R-51513-12026
3b10: 20 54 68 65 20 6c 61 73 74 5f 69 6e 73 65 72 74   The last_insert
3b20: 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75 6e  _rowid() SQL fun
3b30: 63 74 69 6f 6e 20 69 73 20 61 0a 20 20 2a 2a 20  ction is a.  ** 
3b40: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
3b50: 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  he sqlite3_last_
3b60: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 43  insert_rowid() C
3b70: 2f 43 2b 2b 20 69 6e 74 65 72 66 61 63 65 0a 20  /C++ interface. 
3b80: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f   ** function. */
3b90: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
3ba0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
3bb0: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
3bc0: 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29 29 3b  sert_rowid(db));
3bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
3be0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3bf0: 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75  changes() SQL fu
3c00: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d  nction..**.** IM
3c10: 50 3a 20 52 2d 36 32 30 37 33 2d 31 31 32 30 39  P: R-62073-11209
3c20: 20 54 68 65 20 63 68 61 6e 67 65 73 28 29 20 53   The changes() S
3c30: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  QL function is a
3c40: 20 77 72 61 70 70 65 72 0a 2a 2a 20 61 72 6f 75   wrapper.** arou
3c50: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  nd the sqlite3_c
3c60: 68 61 6e 67 65 73 28 29 20 43 2f 43 2b 2b 20 66  hanges() C/C++ f
3c70: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 68 65 6e 63  unction and henc
3c80: 65 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 73 61  e follows the sa
3c90: 6d 65 0a 2a 2a 20 72 75 6c 65 73 20 66 6f 72 20  me.** rules for 
3ca0: 63 6f 75 6e 74 69 6e 67 20 63 68 61 6e 67 65 73  counting changes
3cb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3cc0: 20 63 68 61 6e 67 65 73 28 0a 20 20 73 71 6c 69   changes(.  sqli
3cd0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3ce0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55  text,.  int NotU
3cf0: 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  sed,.  sqlite3_v
3d00: 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a  alue **NotUsed2.
3d10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
3d20: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
3d30: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
3d40: 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f  text);.  UNUSED_
3d50: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
3d60: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
3d70: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3d80: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
3d90: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29  ite3_changes(db)
3da0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
3db0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
3dc0: 65 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  e total_changes(
3dd0: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
3de0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
3df0: 65 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65  e is.** the same
3e00: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
3e10: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20  total_changes() 
3e20: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
3e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 74  .static void tot
3e40: 61 6c 5f 63 68 61 6e 67 65 73 28 0a 20 20 73 71  al_changes(.  sq
3e50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3e60: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
3e70: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
3e80: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
3e90: 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  2.){.  sqlite3 *
3ea0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
3eb0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
3ec0: 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45  ontext);.  UNUSE
3ed0: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
3ee0: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
3ef0: 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 37  .  /* IMP: R-527
3f00: 35 36 2d 34 31 39 39 33 20 54 68 69 73 20 66 75  56-41993 This fu
3f10: 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
3f20: 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a 20  per around the. 
3f30: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 6f 74 61   ** sqlite3_tota
3f40: 6c 5f 63 68 61 6e 67 65 73 28 29 20 43 2f 43 2b  l_changes() C/C+
3f50: 2b 20 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f 0a  + interface. */.
3f60: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3f70: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
3f80: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
3f90: 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ges(db));.}../*.
3fa0: 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 64  ** A structure d
3fb0: 65 66 69 6e 69 6e 67 20 68 6f 77 20 74 6f 20 64  efining how to d
3fc0: 6f 20 47 4c 4f 42 2d 73 74 79 6c 65 20 63 6f 6d  o GLOB-style com
3fd0: 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f 0a 73 74 72  parisons..*/.str
3fe0: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
3ff0: 7b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c 3b  {.  u8 matchAll;
4000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 2a 22            /* "*"
4010: 20 6f 72 20 22 25 22 20 2a 2f 0a 20 20 75 38 20   or "%" */.  u8 
4020: 6d 61 74 63 68 4f 6e 65 3b 20 20 20 20 20 20 20  matchOne;       
4030: 20 20 20 2f 2a 20 22 3f 22 20 6f 72 20 22 5f 22     /* "?" or "_"
4040: 20 2a 2f 0a 20 20 75 38 20 6d 61 74 63 68 53 65   */.  u8 matchSe
4050: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22  t;          /* "
4060: 5b 22 20 6f 72 20 30 20 2a 2f 0a 20 20 75 38 20  [" or 0 */.  u8 
4070: 6e 6f 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  noCase;         
4080: 20 20 20 2f 2a 20 74 72 75 65 20 74 6f 20 69 67     /* true to ig
4090: 6e 6f 72 65 20 63 61 73 65 20 64 69 66 66 65 72  nore case differ
40a0: 65 6e 63 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ences */.};../*.
40b0: 2a 2a 20 46 6f 72 20 4c 49 4b 45 20 61 6e 64 20  ** For LIKE and 
40c0: 47 4c 4f 42 20 6d 61 74 63 68 69 6e 67 20 6f 6e  GLOB matching on
40d0: 20 45 42 43 44 49 43 20 6d 61 63 68 69 6e 65 73   EBCDIC machines
40e0: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 65 76  , assume that ev
40f0: 65 72 79 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ery.** character
4100: 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
4110: 62 79 74 65 20 69 6e 20 73 69 7a 65 2e 20 20 41  byte in size.  A
4120: 6c 73 6f 2c 20 70 72 6f 76 64 65 20 74 68 65 20  lso, provde the 
4130: 55 74 66 38 52 65 61 64 28 29 0a 2a 2a 20 6d 61  Utf8Read().** ma
4140: 63 72 6f 20 66 6f 72 20 66 61 73 74 20 72 65 61  cro for fast rea
4150: 64 69 6e 67 20 6f 66 20 74 68 65 20 6e 65 78 74  ding of the next
4160: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
4170: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
4180: 65 72 65 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20  ere.** the next 
4190: 63 68 61 72 61 63 74 65 72 20 69 73 20 41 53 43  character is ASC
41a0: 49 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  II..*/.#if defin
41b0: 65 64 28 53 51 4c 49 54 45 5f 45 42 43 44 49 43  ed(SQLITE_EBCDIC
41c0: 29 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  ).# define sqlit
41d0: 65 33 55 74 66 38 52 65 61 64 28 41 29 20 20 20  e3Utf8Read(A)   
41e0: 20 20 20 20 20 28 2a 28 28 2a 41 29 2b 2b 29 29       (*((*A)++))
41f0: 0a 23 20 64 65 66 69 6e 65 20 55 74 66 38 52 65  .# define Utf8Re
4200: 61 64 28 41 29 20 20 20 20 20 20 20 20 20 20 20  ad(A)           
4210: 20 20 20 20 28 2a 28 41 2b 2b 29 29 0a 23 65 6c      (*(A++)).#el
4220: 73 65 0a 23 20 64 65 66 69 6e 65 20 55 74 66 38  se.# define Utf8
4230: 52 65 61 64 28 41 29 20 20 20 20 20 20 20 20 20  Read(A)         
4240: 20 20 20 20 20 20 28 41 5b 30 5d 3c 30 78 38 30        (A[0]<0x80
4250: 3f 2a 28 41 2b 2b 29 3a 73 71 6c 69 74 65 33 55  ?*(A++):sqlite3U
4260: 74 66 38 52 65 61 64 28 26 41 29 29 0a 23 65 6e  tf8Read(&A)).#en
4270: 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  dif..static cons
4280: 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65  t struct compare
4290: 49 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20  Info globInfo = 
42a0: 7b 20 27 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c  { '*', '?', '[',
42b0: 20 30 20 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72   0 };./* The cor
42c0: 72 65 63 74 20 53 51 4c 2d 39 32 20 62 65 68 61  rect SQL-92 beha
42d0: 76 69 6f 72 20 69 73 20 66 6f 72 20 74 68 65 20  vior is for the 
42e0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 74 6f  LIKE operator to
42f0: 20 69 67 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e   ignore.** case.
4300: 20 20 54 68 75 73 20 20 27 61 27 20 4c 49 4b 45    Thus  'a' LIKE
4310: 20 27 41 27 20 77 6f 75 6c 64 20 62 65 20 74 72   'A' would be tr
4320: 75 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ue. */.static co
4330: 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61  nst struct compa
4340: 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e  reInfo likeInfoN
4350: 6f 72 6d 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27  orm = { '%', '_'
4360: 2c 20 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49  ,   0, 1 };./* I
4370: 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45  f SQLITE_CASE_SE
4380: 4e 53 49 54 49 56 45 5f 4c 49 4b 45 20 69 73 20  NSITIVE_LIKE is 
4390: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
43a0: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a  e LIKE operator.
43b0: 2a 2a 20 69 73 20 63 61 73 65 20 73 65 6e 73 69  ** is case sensi
43c0: 74 69 76 65 20 63 61 75 73 69 6e 67 20 27 61 27  tive causing 'a'
43d0: 20 4c 49 4b 45 20 27 41 27 20 74 6f 20 62 65 20   LIKE 'A' to be 
43e0: 66 61 6c 73 65 20 2a 2f 0a 73 74 61 74 69 63 20  false */.static 
43f0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d  const struct com
4400: 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66  pareInfo likeInf
4410: 6f 41 6c 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f  oAlt = { '%', '_
4420: 27 2c 20 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a  ',   0, 0 };../*
4430: 0a 2a 2a 20 50 6f 73 73 69 62 6c 65 20 65 72 72  .** Possible err
4440: 6f 72 20 72 65 74 75 72 6e 73 20 66 72 6f 6d 20  or returns from 
4450: 70 61 74 74 65 72 6e 4d 61 74 63 68 28 29 0a 2a  patternMatch().*
4460: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
4470: 5f 4d 41 54 43 48 20 20 20 20 20 20 20 20 20 20  _MATCH          
4480: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 51 4c     0.#define SQL
4490: 49 54 45 5f 4e 4f 4d 41 54 43 48 20 20 20 20 20  ITE_NOMATCH     
44a0: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
44b0: 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52  SQLITE_NOWILDCAR
44c0: 44 4d 41 54 43 48 20 20 20 32 0a 0a 2f 2a 0a 2a  DMATCH   2../*.*
44d0: 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55 54  * Compare two UT
44e0: 46 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72 20  F-8 strings for 
44f0: 65 71 75 61 6c 69 74 79 20 77 68 65 72 65 20 74  equality where t
4500: 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20  he first string 
4510: 69 73 0a 2a 2a 20 61 20 47 4c 4f 42 20 6f 72 20  is.** a GLOB or 
4520: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 2e  LIKE expression.
4530: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a    Return values:
4540: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  .**.**    SQLITE
4550: 5f 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  _MATCH:         
4560: 20 20 20 4d 61 74 63 68 0a 2a 2a 20 20 20 20 53     Match.**    S
4570: 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3a 20 20  QLITE_NOMATCH:  
4580: 20 20 20 20 20 20 20 20 4e 6f 20 6d 61 74 63 68          No match
4590: 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  .**    SQLITE_NO
45a0: 57 49 4c 44 43 41 52 44 4d 41 54 43 48 3a 20 20  WILDCARDMATCH:  
45b0: 4e 6f 20 6d 61 74 63 68 20 69 6e 20 73 70 69 74  No match in spit
45c0: 65 20 6f 66 20 68 61 76 69 6e 67 20 2a 20 6f 72  e of having * or
45d0: 20 25 20 77 69 6c 64 63 61 72 64 73 2e 0a 2a 2a   % wildcards..**
45e0: 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c  .** Globbing rul
45f0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  es:.**.**      '
4600: 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  *'       Matches
4610: 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
4620: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
4630: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
4640: 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d       '?'       M
4650: 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f  atches exactly o
4660: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ne character..**
4670: 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20  .**     [...]   
4680: 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
4690: 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
46a0: 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20  e enclosed list 
46b0: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
46c0: 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e       characters.
46d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e  .**.**     [^...
46e0: 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e  ]     Matches on
46f0: 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20  e character not 
4700: 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  in the enclosed 
4710: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  list..**.** With
4720: 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e 64 20 5b   the [...] and [
4730: 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e 67 2c 20  ^...] matching, 
4740: 61 20 27 5d 27 20 63 68 61 72 61 63 74 65 72 20  a ']' character 
4750: 63 61 6e 20 62 65 20 69 6e 63 6c 75 64 65 64 0a  can be included.
4760: 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 20 62  ** in the list b
4770: 79 20 6d 61 6b 69 6e 67 20 69 74 20 74 68 65 20  y making it the 
4780: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
4790: 61 66 74 65 72 20 27 5b 27 20 6f 72 20 27 5e 27  after '[' or '^'
47a0: 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65 20 6f 66  .  A.** range of
47b0: 20 63 68 61 72 61 63 74 65 72 73 20 63 61 6e 20   characters can 
47c0: 62 65 20 73 70 65 63 69 66 69 65 64 20 75 73 69  be specified usi
47d0: 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d 70 6c 65  ng '-'.  Example
47e0: 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20 6d 61 74  :.** "[a-z]" mat
47f0: 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65 20  ches any single 
4800: 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65 74 74 65  lower-case lette
4810: 72 2e 20 20 54 6f 20 6d 61 74 63 68 20 61 20 27  r.  To match a '
4820: 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74  -', make.** it t
4830: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
4840: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  r in the list..*
4850: 2a 0a 2a 2a 20 4c 69 6b 65 20 6d 61 74 63 68 69  *.** Like matchi
4860: 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 20 0a 2a 2a  ng rules:.** .**
4870: 20 20 20 20 20 20 27 25 27 20 20 20 20 20 20 20        '%'       
4880: 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  Matches any sequ
4890: 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20  ence of zero or 
48a0: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 0a  more characters.
48b0: 2a 2a 0a 2a 2a 2a 20 20 20 20 20 27 5f 27 20 20  **.***     '_'  
48c0: 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
48d0: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 0a 2a   one character.*
48e0: 2a 0a 2a 2a 20 20 20 20 20 20 45 63 20 20 20 20  *.**      Ec    
48f0: 20 20 20 20 57 68 65 72 65 20 45 20 69 73 20 74      Where E is t
4900: 68 65 20 22 65 73 63 22 20 63 68 61 72 61 63 74  he "esc" charact
4910: 65 72 20 61 6e 64 20 63 20 69 73 20 61 6e 79 20  er and c is any 
4920: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
4930: 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65          characte
4940: 72 2c 20 69 6e 63 6c 75 64 69 6e 67 20 27 25 27  r, including '%'
4950: 2c 20 27 5f 27 2c 20 61 6e 64 20 65 73 63 2c 20  , '_', and esc, 
4960: 6d 61 74 63 68 20 65 78 61 63 74 6c 79 20 63 2e  match exactly c.
4970: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 65  .**.** The comme
4980: 6e 74 73 20 77 69 74 68 69 6e 20 74 68 69 73 20  nts within this 
4990: 72 6f 75 74 69 6e 65 20 75 73 75 61 6c 6c 79 20  routine usually 
49a0: 61 73 73 75 6d 65 20 67 6c 6f 62 20 6d 61 74 63  assume glob matc
49b0: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  hing..**.** This
49c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75 61   routine is usua
49d0: 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20 63  lly quick, but c
49e0: 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68  an be N**2 in th
49f0: 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2f  e worst case..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 74 74  .static int patt
4a10: 65 72 6e 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f  ernCompare(.  co
4a20: 6e 73 74 20 75 38 20 2a 7a 50 61 74 74 65 72 6e  nst u8 *zPattern
4a30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4a40: 2a 20 54 68 65 20 67 6c 6f 62 20 70 61 74 74 65  * The glob patte
4a50: 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  rn */.  const u8
4a60: 20 2a 7a 53 74 72 69 6e 67 2c 20 20 20 20 20 20   *zString,      
4a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4a80: 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72  string to compar
4a90: 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 67 6c  e against the gl
4aa0: 6f 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 74  ob */.  const st
4ab0: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
4ac0: 20 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49 6e 66 6f   *pInfo, /* Info
4ad0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 68 6f  rmation about ho
4ae0: 77 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70  w to do the comp
4af0: 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 6d 61 74  are */.  u32 mat
4b00: 63 68 4f 74 68 65 72 20 20 20 20 20 20 20 20 20  chOther         
4b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4b20: 20 65 73 63 61 70 65 20 63 68 61 72 20 28 4c 49   escape char (LI
4b30: 4b 45 29 20 6f 72 20 27 5b 27 20 28 47 4c 4f 42  KE) or '[' (GLOB
4b40: 29 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 63 2c  ) */.){.  u32 c,
4b50: 20 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   c2;            
4b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
4b70: 78 74 20 70 61 74 74 65 72 6e 20 61 6e 64 20 69  xt pattern and i
4b80: 6e 70 75 74 20 73 74 72 69 6e 67 20 63 68 61 72  nput string char
4b90: 73 20 2a 2f 0a 20 20 75 33 32 20 6d 61 74 63 68  s */.  u32 match
4ba0: 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74  One = pInfo->mat
4bb0: 63 68 4f 6e 65 3b 20 20 2f 2a 20 22 3f 22 20 6f  chOne;  /* "?" o
4bc0: 72 20 22 5f 22 20 2a 2f 0a 20 20 75 33 32 20 6d  r "_" */.  u32 m
4bd0: 61 74 63 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d  atchAll = pInfo-
4be0: 3e 6d 61 74 63 68 41 6c 6c 3b 20 20 2f 2a 20 22  >matchAll;  /* "
4bf0: 2a 22 20 6f 72 20 22 25 22 20 2a 2f 0a 20 20 75  *" or "%" */.  u
4c00: 38 20 6e 6f 43 61 73 65 20 3d 20 70 49 6e 66 6f  8 noCase = pInfo
4c10: 2d 3e 6e 6f 43 61 73 65 3b 20 20 20 20 20 20 20  ->noCase;       
4c20: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
4c30: 63 61 73 65 3d 3d 6c 6f 77 65 72 63 61 73 65 20  case==lowercase 
4c40: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  */.  const u8 *z
4c50: 45 73 63 61 70 65 64 20 3d 20 30 3b 20 20 20 20  Escaped = 0;    
4c60: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 70 61 73        /* One pas
4c70: 74 20 74 68 65 20 6c 61 73 74 20 65 73 63 61 70  t the last escap
4c80: 65 64 20 69 6e 70 75 74 20 63 68 61 72 20 2a 2f  ed input char */
4c90: 0a 20 20 0a 20 20 77 68 69 6c 65 28 20 28 63 20  .  .  while( (c 
4ca0: 3d 20 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  = Utf8Read(zPatt
4cb0: 65 72 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ern))!=0 ){.    
4cc0: 69 66 28 20 63 3d 3d 6d 61 74 63 68 41 6c 6c 20  if( c==matchAll 
4cd0: 29 7b 20 20 2f 2a 20 4d 61 74 63 68 20 22 2a 22  ){  /* Match "*"
4ce0: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69   */.      /* Ski
4cf0: 70 20 6f 76 65 72 20 6d 75 6c 74 69 70 6c 65 20  p over multiple 
4d00: 22 2a 22 20 63 68 61 72 61 63 74 65 72 73 20 69  "*" characters i
4d10: 6e 20 74 68 65 20 70 61 74 74 65 72 6e 2e 20 20  n the pattern.  
4d20: 49 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a  If there.      *
4d30: 2a 20 61 72 65 20 61 6c 73 6f 20 22 3f 22 20 63  * are also "?" c
4d40: 68 61 72 61 63 74 65 72 73 2c 20 73 6b 69 70 20  haracters, skip 
4d50: 74 68 6f 73 65 20 61 73 20 77 65 6c 6c 2c 20 62  those as well, b
4d60: 75 74 20 63 6f 6e 73 75 6d 65 20 61 0a 20 20 20  ut consume a.   
4d70: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 68 61     ** single cha
4d80: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e  racter of the in
4d90: 70 75 74 20 73 74 72 69 6e 67 20 66 6f 72 20 65  put string for e
4da0: 61 63 68 20 22 3f 22 20 73 6b 69 70 70 65 64 20  ach "?" skipped 
4db0: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
4dc0: 28 63 3d 55 74 66 38 52 65 61 64 28 7a 50 61 74  (c=Utf8Read(zPat
4dd0: 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74 63 68 41  tern)) == matchA
4de0: 6c 6c 20 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68  ll || c == match
4df0: 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  One ){.        i
4e00: 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26  f( c==matchOne &
4e10: 26 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  & sqlite3Utf8Rea
4e20: 64 28 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29  d(&zString)==0 )
4e30: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
4e40: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44  rn SQLITE_NOWILD
4e50: 43 41 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 20  CARDMATCH;.     
4e60: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4e70: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
4e80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
4e90: 4c 49 54 45 5f 4d 41 54 43 48 3b 20 20 20 2f 2a  LITE_MATCH;   /*
4ea0: 20 22 2a 22 20 61 74 20 74 68 65 20 65 6e 64 20   "*" at the end 
4eb0: 6f 66 20 74 68 65 20 70 61 74 74 65 72 6e 20 6d  of the pattern m
4ec0: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
4ed0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74  }else if( c==mat
4ee0: 63 68 4f 74 68 65 72 20 29 7b 0a 20 20 20 20 20  chOther ){.     
4ef0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6d 61     if( pInfo->ma
4f00: 74 63 68 53 65 74 3d 3d 30 20 29 7b 0a 20 20 20  tchSet==0 ){.   
4f10: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
4f20: 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74  e3Utf8Read(&zPat
4f30: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tern);.         
4f40: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
4f50: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44  rn SQLITE_NOWILD
4f60: 43 41 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 20  CARDMATCH;.     
4f70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4f80: 20 20 20 20 2f 2a 20 22 5b 2e 2e 2e 5d 22 20 69      /* "[...]" i
4f90: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
4fa0: 77 73 20 74 68 65 20 22 2a 22 2e 20 20 57 65 20  ws the "*".  We 
4fb0: 68 61 76 65 20 74 6f 20 64 6f 20 61 20 73 6c 6f  have to do a slo
4fc0: 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  w.          ** r
4fd0: 65 63 75 72 73 69 76 65 20 73 65 61 72 63 68 20  ecursive search 
4fe0: 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 62 75  in this case, bu
4ff0: 74 20 69 74 20 69 73 20 61 6e 20 75 6e 75 73 75  t it is an unusu
5000: 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  al case. */.    
5010: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61        assert( ma
5020: 74 63 68 4f 74 68 65 72 3c 30 78 38 30 20 29 3b  tchOther<0x80 );
5030: 20 20 2f 2a 20 27 5b 27 20 69 73 20 61 20 73 69    /* '[' is a si
5040: 6e 67 6c 65 2d 62 79 74 65 20 63 68 61 72 61 63  ngle-byte charac
5050: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ter */.         
5060: 20 77 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67   while( *zString
5070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5080: 69 6e 74 20 62 4d 61 74 63 68 20 3d 20 70 61 74  int bMatch = pat
5090: 74 65 72 6e 43 6f 6d 70 61 72 65 28 26 7a 50 61  ternCompare(&zPa
50a0: 74 74 65 72 6e 5b 2d 31 5d 2c 7a 53 74 72 69 6e  ttern[-1],zStrin
50b0: 67 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f 74 68  g,pInfo,matchOth
50c0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
50d0: 20 69 66 28 20 62 4d 61 74 63 68 21 3d 53 51 4c   if( bMatch!=SQL
50e0: 49 54 45 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65  ITE_NOMATCH ) re
50f0: 74 75 72 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20  turn bMatch;.   
5100: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5110: 53 4b 49 50 5f 55 54 46 38 28 7a 53 74 72 69 6e  SKIP_UTF8(zStrin
5120: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
5130: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5140: 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41   SQLITE_NOWILDCA
5150: 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20  RDMATCH;.       
5160: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
5170: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
5180: 6e 74 20 76 61 72 69 61 62 6c 65 20 63 20 63 6f  nt variable c co
5190: 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74  ntains the first
51a0: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
51b0: 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 74 74 65  e.      ** patte
51c0: 72 6e 20 73 74 72 69 6e 67 20 70 61 73 74 20 74  rn string past t
51d0: 68 65 20 22 2a 22 2e 20 20 53 65 61 72 63 68 20  he "*".  Search 
51e0: 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  in the input str
51f0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ing for the.    
5200: 20 20 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68    ** first match
5210: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 61 6e  ing character an
5220: 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 63 6f  d recursively co
5230: 6e 74 69 6e 75 65 20 74 68 65 20 6d 61 74 63 68  ntinue the match
5240: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74   from.      ** t
5250: 68 61 74 20 70 6f 69 6e 74 2e 0a 20 20 20 20 20  hat point..     
5260: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
5270: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
5280: 69 76 65 20 73 65 61 72 63 68 2c 20 73 65 74 20  ive search, set 
5290: 76 61 72 69 61 62 6c 65 20 63 78 20 74 6f 20 62  variable cx to b
52a0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
52b0: 20 20 20 20 2a 2a 20 63 20 62 75 74 20 69 6e 20      ** c but in 
52c0: 74 68 65 20 6f 74 68 65 72 20 63 61 73 65 20 61  the other case a
52d0: 6e 64 20 73 65 61 72 63 68 20 74 68 65 20 69 6e  nd search the in
52e0: 70 75 74 20 73 74 72 69 6e 67 20 66 6f 72 20 65  put string for e
52f0: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63  ither.      ** c
5300: 20 6f 72 20 63 78 2e 0a 20 20 20 20 20 20 2a 2f   or cx..      */
5310: 0a 20 20 20 20 20 20 69 66 28 20 63 3c 3d 30 78  .      if( c<=0x
5320: 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  80 ){.        ch
5330: 61 72 20 7a 53 74 6f 70 5b 33 5d 3b 0a 20 20 20  ar zStop[3];.   
5340: 20 20 20 20 20 69 6e 74 20 62 4d 61 74 63 68 3b       int bMatch;
5350: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 6f 43  .        if( noC
5360: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ase ){.         
5370: 20 7a 53 74 6f 70 5b 30 5d 20 3d 20 73 71 6c 69   zStop[0] = sqli
5380: 74 65 33 54 6f 75 70 70 65 72 28 63 29 3b 0a 20  te3Toupper(c);. 
5390: 20 20 20 20 20 20 20 20 20 7a 53 74 6f 70 5b 31           zStop[1
53a0: 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77  ] = sqlite3Tolow
53b0: 65 72 28 63 29 3b 0a 20 20 20 20 20 20 20 20 20  er(c);.         
53c0: 20 7a 53 74 6f 70 5b 32 5d 20 3d 20 30 3b 0a 20   zStop[2] = 0;. 
53d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
53e0: 20 20 20 20 20 20 20 20 7a 53 74 6f 70 5b 30 5d          zStop[0]
53f0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
5400: 7a 53 74 6f 70 5b 31 5d 20 3d 20 30 3b 0a 20 20  zStop[1] = 0;.  
5410: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5420: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
5430: 20 20 20 20 7a 53 74 72 69 6e 67 20 2b 3d 20 73      zString += s
5440: 74 72 63 73 70 6e 28 28 63 6f 6e 73 74 20 63 68  trcspn((const ch
5450: 61 72 2a 29 7a 53 74 72 69 6e 67 2c 20 7a 53 74  ar*)zString, zSt
5460: 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  op);.          i
5470: 66 28 20 7a 53 74 72 69 6e 67 5b 30 5d 3d 3d 30  f( zString[0]==0
5480: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5490: 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20      zString++;. 
54a0: 20 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20           bMatch 
54b0: 3d 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  = patternCompare
54c0: 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72 69 6e  (zPattern,zStrin
54d0: 67 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f 74 68  g,pInfo,matchOth
54e0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
54f0: 66 28 20 62 4d 61 74 63 68 21 3d 53 51 4c 49 54  f( bMatch!=SQLIT
5500: 45 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65 74 75  E_NOMATCH ) retu
5510: 72 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20 20 20  rn bMatch;.     
5520: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
5530: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4d  {.        int bM
5540: 61 74 63 68 3b 0a 20 20 20 20 20 20 20 20 77 68  atch;.        wh
5550: 69 6c 65 28 20 28 63 32 20 3d 20 55 74 66 38 52  ile( (c2 = Utf8R
5560: 65 61 64 28 7a 53 74 72 69 6e 67 29 29 21 3d 30  ead(zString))!=0
5570: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
5580: 28 20 63 32 21 3d 63 20 29 20 63 6f 6e 74 69 6e  ( c2!=c ) contin
5590: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 4d  ue;.          bM
55a0: 61 74 63 68 20 3d 20 70 61 74 74 65 72 6e 43 6f  atch = patternCo
55b0: 6d 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a  mpare(zPattern,z
55c0: 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 6d 61 74  String,pInfo,mat
55d0: 63 68 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20  chOther);.      
55e0: 20 20 20 20 69 66 28 20 62 4d 61 74 63 68 21 3d      if( bMatch!=
55f0: 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 20 29  SQLITE_NOMATCH )
5600: 20 72 65 74 75 72 6e 20 62 4d 61 74 63 68 3b 0a   return bMatch;.
5610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5620: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
5630: 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44  QLITE_NOWILDCARD
5640: 4d 41 54 43 48 3b 0a 20 20 20 20 7d 0a 20 20 20  MATCH;.    }.   
5650: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 74 68   if( c==matchOth
5660: 65 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  er ){.      if( 
5670: 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3d  pInfo->matchSet=
5680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  =0 ){.        c 
5690: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
56a0: 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  d(&zPattern);.  
56b0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
56c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
56d0: 4f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20  OMATCH;.        
56e0: 7a 45 73 63 61 70 65 64 20 3d 20 7a 50 61 74 74  zEscaped = zPatt
56f0: 65 72 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ern;.      }else
5700: 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 70 72  {.        u32 pr
5710: 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
5720: 20 20 20 69 6e 74 20 73 65 65 6e 20 3d 20 30 3b     int seen = 0;
5730: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 6e 76  .        int inv
5740: 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ert = 0;.       
5750: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38   c = sqlite3Utf8
5760: 52 65 61 64 28 26 7a 53 74 72 69 6e 67 29 3b 0a  Read(&zString);.
5770: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
5780: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5790: 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  _NOMATCH;.      
57a0: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74    c2 = sqlite3Ut
57b0: 66 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e  f8Read(&zPattern
57c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
57d0: 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20  2=='^' ){.      
57e0: 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a      invert = 1;.
57f0: 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73            c2 = s
5800: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
5810: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
5820: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
5830: 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20   c2==']' ){.    
5840: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27        if( c==']'
5850: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
5860: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
5870: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61  te3Utf8Read(&zPa
5880: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  ttern);.        
5890: 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  }.        while(
58a0: 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29   c2 && c2!=']' )
58b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
58c0: 63 32 3d 3d 27 2d 27 20 26 26 20 7a 50 61 74 74  c2=='-' && zPatt
58d0: 65 72 6e 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a  ern[0]!=']' && z
58e0: 50 61 74 74 65 72 6e 5b 30 5d 21 3d 30 20 26 26  Pattern[0]!=0 &&
58f0: 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20   prior_c>0 ){.  
5900: 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73            c2 = s
5910: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
5920: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
5930: 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72         if( c>=pr
5940: 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29  ior_c && c<=c2 )
5950: 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
5960: 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
5970: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
5980: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
5990: 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20   if( c==c2 ){.  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
59b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
59c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
59d0: 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20  prior_c = c2;.  
59e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
59f0: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
5a00: 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74 65  Utf8Read(&zPatte
5a10: 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rn);.        }. 
5a20: 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30         if( c2==0
5a30: 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65   || (seen ^ inve
5a40: 72 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rt)==0 ){.      
5a50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5a60: 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 20 20 20  E_NOMATCH;.     
5a70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6f 6e     }.        con
5a80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
5a90: 20 20 20 7d 0a 20 20 20 20 63 32 20 3d 20 55 74     }.    c2 = Ut
5aa0: 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 29 3b  f8Read(zString);
5ab0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29  .    if( c==c2 )
5ac0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
5ad0: 66 28 20 6e 6f 43 61 73 65 20 20 26 26 20 73 71  f( noCase  && sq
5ae0: 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63 29 3d  lite3Tolower(c)=
5af0: 3d 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28  =sqlite3Tolower(
5b00: 63 32 29 20 26 26 20 63 3c 30 78 38 30 20 26 26  c2) && c<0x80 &&
5b10: 20 63 32 3c 30 78 38 30 20 29 7b 0a 20 20 20 20   c2<0x80 ){.    
5b20: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
5b30: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 6d 61 74  }.    if( c==mat
5b40: 63 68 4f 6e 65 20 26 26 20 7a 50 61 74 74 65 72  chOne && zPatter
5b50: 6e 21 3d 7a 45 73 63 61 70 65 64 20 26 26 20 63  n!=zEscaped && c
5b60: 32 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  2!=0 ) continue;
5b70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5b80: 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 7d 0a  TE_NOMATCH;.  }.
5b90: 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e    return *zStrin
5ba0: 67 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f 4d 41  g==0 ? SQLITE_MA
5bb0: 54 43 48 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d  TCH : SQLITE_NOM
5bc0: 41 54 43 48 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ATCH;.}../*.** T
5bd0: 68 65 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  he sqlite3_strgl
5be0: 6f 62 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20  ob() interface. 
5bf0: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 61 20 6d   Return 0 on a m
5c00: 61 74 63 68 20 28 6c 69 6b 65 20 73 74 72 63 6d  atch (like strcm
5c10: 70 28 29 29 20 61 6e 64 0a 2a 2a 20 6e 6f 6e 2d  p()) and.** non-
5c20: 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 69 73  zero if there is
5c30: 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e   no match..*/.in
5c40: 74 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  t sqlite3_strglo
5c50: 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47  b(const char *zG
5c60: 6c 6f 62 50 61 74 74 65 72 6e 2c 20 63 6f 6e 73  lobPattern, cons
5c70: 74 20 63 68 61 72 20 2a 7a 53 74 72 69 6e 67 29  t char *zString)
5c80: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 74 74 65  {.  return patte
5c90: 72 6e 43 6f 6d 70 61 72 65 28 28 75 38 2a 29 7a  rnCompare((u8*)z
5ca0: 47 6c 6f 62 50 61 74 74 65 72 6e 2c 20 28 75 38  GlobPattern, (u8
5cb0: 2a 29 7a 53 74 72 69 6e 67 2c 20 26 67 6c 6f 62  *)zString, &glob
5cc0: 49 6e 66 6f 2c 20 27 5b 27 29 3b 0a 7d 0a 0a 2f  Info, '[');.}../
5cd0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
5ce0: 5f 73 74 72 6c 69 6b 65 28 29 20 69 6e 74 65 72  _strlike() inter
5cf0: 66 61 63 65 2e 20 20 52 65 74 75 72 6e 20 30 20  face.  Return 0 
5d00: 6f 6e 20 61 20 6d 61 74 63 68 20 61 6e 64 20 6e  on a match and n
5d10: 6f 6e 2d 7a 65 72 6f 20 66 6f 72 0a 2a 2a 20 61  on-zero for.** a
5d20: 20 6d 69 73 73 20 2d 20 6c 69 6b 65 20 73 74 72   miss - like str
5d30: 63 6d 70 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cmp()..*/.int sq
5d40: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 63 6f  lite3_strlike(co
5d50: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65  nst char *zPatte
5d60: 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  rn, const char *
5d70: 7a 53 74 72 2c 20 75 6e 73 69 67 6e 65 64 20 69  zStr, unsigned i
5d80: 6e 74 20 65 73 63 29 7b 0a 20 20 72 65 74 75 72  nt esc){.  retur
5d90: 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  n patternCompare
5da0: 28 28 75 38 2a 29 7a 50 61 74 74 65 72 6e 2c 20  ((u8*)zPattern, 
5db0: 28 75 38 2a 29 7a 53 74 72 2c 20 26 6c 69 6b 65  (u8*)zStr, &like
5dc0: 49 6e 66 6f 4e 6f 72 6d 2c 20 65 73 63 29 3b 0a  InfoNorm, esc);.
5dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  }../*.** Count t
5de0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
5df0: 65 73 20 74 68 61 74 20 74 68 65 20 4c 49 4b 45  es that the LIKE
5e00: 20 6f 70 65 72 61 74 6f 72 20 28 6f 72 20 47 4c   operator (or GL
5e10: 4f 42 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6a  OB which is.** j
5e20: 75 73 74 20 61 20 76 61 72 69 61 74 69 6f 6e 20  ust a variation 
5e30: 6f 66 20 4c 49 4b 45 29 20 67 65 74 73 20 63 61  of LIKE) gets ca
5e40: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 75  lled.  This is u
5e50: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
5e60: 2a 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ** only..*/.#ifd
5e70: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
5e80: 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f  nt sqlite3_like_
5e90: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
5ea0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  f.../*.** Implem
5eb0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
5ec0: 6c 69 6b 65 28 29 20 53 51 4c 20 66 75 6e 63 74  like() SQL funct
5ed0: 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ion.  This funct
5ee0: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  ion implements.*
5ef0: 2a 20 74 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c  * the build-in L
5f00: 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 20 20 54  IKE operator.  T
5f10: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5f20: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
5f30: 6e 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 74 74  n is the.** patt
5f40: 65 72 6e 20 61 6e 64 20 74 68 65 20 73 65 63 6f  ern and the seco
5f50: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
5f60: 68 65 20 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20  he string.  So, 
5f70: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
5f80: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ts:.**.**       
5f90: 41 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69  A LIKE B.**.** i
5fa0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
5fb0: 20 6c 69 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a   like(B,A)..**.*
5fc0: 2a 20 54 68 69 73 20 73 61 6d 65 20 66 75 6e 63  * This same func
5fd0: 74 69 6f 6e 20 28 77 69 74 68 20 61 20 64 69 66  tion (with a dif
5fe0: 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 65 49 6e  ferent compareIn
5ff0: 66 6f 20 73 74 72 75 63 74 75 72 65 29 20 63 6f  fo structure) co
6000: 6d 70 75 74 65 73 0a 2a 2a 20 74 68 65 20 47 4c  mputes.** the GL
6010: 4f 42 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  OB operator..*/.
6020: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6b 65  static void like
6030: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
6040: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
6050: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a  , .  int argc, .
6060: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6070: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
6080: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
6090: 2a 7a 41 2c 20 2a 7a 42 3b 0a 20 20 75 33 32 20  *zA, *zB;.  u32 
60a0: 65 73 63 61 70 65 3b 0a 20 20 69 6e 74 20 6e 50  escape;.  int nP
60b0: 61 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  at;.  sqlite3 *d
60c0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
60d0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
60e0: 6e 74 65 78 74 29 3b 0a 20 20 73 74 72 75 63 74  ntext);.  struct
60f0: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49   compareInfo *pI
6100: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  nfo = sqlite3_us
6110: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
6120: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
6130: 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54  _LIKE_DOESNT_MAT
6140: 43 48 5f 42 4c 4f 42 53 0a 20 20 69 66 28 20 73  CH_BLOBS.  if( s
6150: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
6160: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
6170: 54 45 5f 42 4c 4f 42 0a 20 20 20 7c 7c 20 73 71  TE_BLOB.   || sq
6180: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6190: 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54  (argv[1])==SQLIT
61a0: 45 5f 42 4c 4f 42 0a 20 20 29 7b 0a 23 69 66 64  E_BLOB.  ){.#ifd
61b0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
61c0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f     sqlite3_like_
61d0: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
61e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
61f0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
6200: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
6210: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 42 20    }.#endif.  zB 
6220: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6230: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
6240: 20 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   zA = sqlite3_va
6250: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
6260: 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74  );..  /* Limit t
6270: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
6280: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61   LIKE or GLOB pa
6290: 74 74 65 72 6e 20 74 6f 20 61 76 6f 69 64 20 70  ttern to avoid p
62a0: 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20  roblems.  ** of 
62b0: 64 65 65 70 20 72 65 63 75 72 73 69 6f 6e 20 61  deep recursion a
62c0: 6e 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20  nd N*N behavior 
62d0: 69 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  in patternCompar
62e0: 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 74  e()..  */.  nPat
62f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6300: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
6310: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
6320: 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  t==db->aLimit[SQ
6330: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
6340: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20  PATTERN_LENGTH] 
6350: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
6360: 50 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  Pat==db->aLimit[
6370: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
6380: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
6390: 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  ]+1 );.  if( nPa
63a0: 74 20 3e 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  t > db->aLimit[S
63b0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
63c0: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
63d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
63e0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
63f0: 74 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20 47  text, "LIKE or G
6400: 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f 20  LOB pattern too 
6410: 63 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a 20  complex", -1);. 
6420: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6430: 20 61 73 73 65 72 74 28 20 7a 42 3d 3d 73 71 6c   assert( zB==sql
6440: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6450: 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20  argv[0]) );  /* 
6460: 45 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e 6f 74  Encoding did not
6470: 20 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20 69 66   change */..  if
6480: 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20  ( argc==3 ){.   
6490: 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63   /* The escape c
64a0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20  haracter string 
64b0: 6d 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 20  must consist of 
64c0: 61 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63  a single UTF-8 c
64d0: 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a  haracter..    **
64e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
64f0: 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  rn an error..   
6500: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
6510: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 73  signed char *zEs
6520: 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  c = sqlite3_valu
6530: 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b  e_text(argv[2]);
6540: 0a 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d 30  .    if( zEsc==0
6550: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
6560: 66 28 20 73 71 6c 69 74 65 33 55 74 66 38 43 68  f( sqlite3Utf8Ch
6570: 61 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45 73  arLen((char*)zEs
6580: 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20 20  c, -1)!=1 ){.   
6590: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
65a0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
65b0: 20 0a 20 20 20 20 20 20 20 20 20 20 22 45 53 43   .          "ESC
65c0: 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  APE expression m
65d0: 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
65e0: 63 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29 3b  character", -1);
65f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
6600: 20 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65 20     }.    escape 
6610: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
6620: 64 28 26 7a 45 73 63 29 3b 0a 20 20 7d 65 6c 73  d(&zEsc);.  }els
6630: 65 7b 0a 20 20 20 20 65 73 63 61 70 65 20 3d 20  e{.    escape = 
6640: 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3b  pInfo->matchSet;
6650: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20 26 26  .  }.  if( zA &&
6660: 20 7a 42 20 29 7b 0a 23 69 66 64 65 66 20 53 51   zB ){.#ifdef SQ
6670: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
6680: 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
6690: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  ++;.#endif.    s
66a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
66b0: 74 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20  t(context,.     
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
66e0: 7a 42 2c 20 7a 41 2c 20 70 49 6e 66 6f 2c 20 65  zB, zA, pInfo, e
66f0: 73 63 61 70 65 29 3d 3d 53 51 4c 49 54 45 5f 4d  scape)==SQLITE_M
6700: 41 54 43 48 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ATCH);.  }.}../*
6710: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
6720: 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46  on of the NULLIF
6730: 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20  (x,y) function. 
6740: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
6750: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
6760: 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72 67 75  ment if the argu
6770: 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66 65 72  ments are differ
6780: 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ent.  The result
6790: 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a   is NULL if the.
67a0: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ** arguments are
67b0: 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20 6f   equal to each o
67c0: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
67d0: 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28  void nullifFunc(
67e0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
67f0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
6800: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
6810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
6820: 67 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  gv.){.  CollSeq 
6830: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
6840: 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63  GetFuncCollSeq(c
6850: 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45  ontext);.  UNUSE
6860: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
6870: 73 65 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  sed);.  if( sqli
6880: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72  te3MemCompare(ar
6890: 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20  gv[0], argv[1], 
68a0: 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20  pColl)!=0 ){.   
68b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
68c0: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
68d0: 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a  rgv[0]);.  }.}..
68e0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
68f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
6900: 74 65 5f 76 65 72 73 69 6f 6e 28 29 20 66 75 6e  te_version() fun
6910: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75  ction.  The resu
6920: 6c 74 20 69 73 20 74 68 65 20 76 65 72 73 69 6f  lt is the versio
6930: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 53 51 4c 69  n.** of the SQLi
6940: 74 65 20 6c 69 62 72 61 72 79 20 74 68 61 74 20  te library that 
6950: 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73  is running..*/.s
6960: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 73 69  tatic void versi
6970: 6f 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  onFunc(.  sqlite
6980: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6990: 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  xt,.  int NotUse
69a0: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  d,.  sqlite3_val
69b0: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
69c0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
69d0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
69e0: 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d  tUsed2);.  /* IM
69f0: 50 3a 20 52 2d 34 38 36 39 39 2d 34 38 36 31 37  P: R-48699-48617
6a00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6a10: 73 20 61 6e 20 53 51 4c 20 77 72 61 70 70 65 72  s an SQL wrapper
6a20: 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a   around the.  **
6a30: 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
6a40: 69 6f 6e 28 29 20 43 2d 69 6e 74 65 72 66 61 63  ion() C-interfac
6a50: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  e. */.  sqlite3_
6a60: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6a70: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62  ext, sqlite3_lib
6a80: 76 65 72 73 69 6f 6e 28 29 2c 20 2d 31 2c 20 53  version(), -1, S
6a90: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d  QLITE_STATIC);.}
6aa0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6ab0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  tation of the sq
6ac0: 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 28 29  lite_source_id()
6ad0: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 72   function. The r
6ae0: 65 73 75 6c 74 20 69 73 20 61 20 73 74 72 69 6e  esult is a strin
6af0: 67 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  g.** that identi
6b00: 66 69 65 73 20 74 68 65 20 70 61 72 74 69 63 75  fies the particu
6b10: 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  lar version of t
6b20: 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 75  he source code u
6b30: 73 65 64 20 74 6f 20 62 75 69 6c 64 0a 2a 2a 20  sed to build.** 
6b40: 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  SQLite..*/.stati
6b50: 63 20 76 6f 69 64 20 73 6f 75 72 63 65 69 64 46  c void sourceidF
6b60: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
6b70: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6b80: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
6b90: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6ba0: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
6bb0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6bc0: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
6bd0: 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20  ed2);.  /* IMP: 
6be0: 52 2d 32 34 34 37 30 2d 33 31 31 33 36 20 54 68  R-24470-31136 Th
6bf0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
6c00: 6e 20 53 51 4c 20 77 72 61 70 70 65 72 20 61 72  n SQL wrapper ar
6c10: 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71  ound the.  ** sq
6c20: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
6c30: 20 43 20 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f   C interface. */
6c40: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6c50: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6c60: 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
6c70: 28 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  (), -1, SQLITE_S
6c80: 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TATIC);.}../*.**
6c90: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
6ca0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6c 6f  of the sqlite_lo
6cb0: 67 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  g() function.  T
6cc0: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
6cd0: 20 61 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74   around.** sqlit
6ce0: 65 33 5f 6c 6f 67 28 29 2e 20 20 54 68 65 20 72  e3_log().  The r
6cf0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 4e  eturn value is N
6d00: 55 4c 4c 2e 20 20 54 68 65 20 66 75 6e 63 74 69  ULL.  The functi
6d10: 6f 6e 20 65 78 69 73 74 73 20 70 75 72 65 6c 79  on exists purely
6d20: 20 66 6f 72 0a 2a 2a 20 69 74 73 20 73 69 64 65   for.** its side
6d30: 2d 65 66 66 65 63 74 73 2e 0a 2a 2f 0a 73 74 61  -effects..*/.sta
6d40: 74 69 63 20 76 6f 69 64 20 65 72 72 6c 6f 67 46  tic void errlogF
6d50: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
6d60: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6d70: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
6d80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6d90: 72 67 76 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  rgv.){.  UNUSED_
6da0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
6db0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6dc0: 54 45 52 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  TER(context);.  
6dd0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 73 71 6c 69  sqlite3_log(sqli
6de0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
6df0: 67 76 5b 30 5d 29 2c 20 22 25 73 22 2c 20 73 71  gv[0]), "%s", sq
6e00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6e10: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f  (argv[1]));.}../
6e20: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
6e30: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
6e40: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
6e50: 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e  used() function.
6e60: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
6e70: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  s an integer tha
6e80: 74 20 69 64 65 6e 74 69 66 69 65 73 20 69 66 20  t identifies if 
6e90: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  the compiler opt
6ea0: 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20  ion.** was used 
6eb0: 74 6f 20 62 75 69 6c 64 20 53 51 4c 69 74 65 2e  to build SQLite.
6ec0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
6ed0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
6ee0: 50 54 49 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74  PTION_DIAGS.stat
6ef0: 69 63 20 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f  ic void compileo
6f00: 70 74 69 6f 6e 75 73 65 64 46 75 6e 63 28 0a 20  ptionusedFunc(. 
6f10: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6f20: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6f30: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
6f40: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6f50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6f60: 4f 70 74 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  OptName;.  asser
6f70: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
6f80: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6f90: 28 61 72 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50  (argc);.  /* IMP
6fa0: 3a 20 52 2d 33 39 35 36 34 2d 33 36 33 30 35 20  : R-39564-36305 
6fb0: 54 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69  The sqlite_compi
6fc0: 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 20  leoption_used() 
6fd0: 53 51 4c 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  SQL.  ** functio
6fe0: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
6ff0: 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65  round the sqlite
7000: 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
7010: 75 73 65 64 28 29 20 43 2f 43 2b 2b 0a 20 20 2a  used() C/C++.  *
7020: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  * function..  */
7030: 0a 20 20 69 66 28 20 28 7a 4f 70 74 4e 61 6d 65  .  if( (zOptName
7040: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
7050: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
7060: 78 74 28 61 72 67 76 5b 30 5d 29 29 21 3d 30 20  xt(argv[0]))!=0 
7070: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
7080: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7090: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  t, sqlite3_compi
70a0: 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 7a 4f  leoption_used(zO
70b0: 70 74 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a  ptName));.  }.}.
70c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
70d0: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
70e0: 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a  ION_DIAGS */../*
70f0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
7100: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
7110: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67  _compileoption_g
7120: 65 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  et() function. .
7130: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
7140: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
7150: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 63 6f  dentifies the co
7160: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 0a  mpiler options .
7170: 2a 2a 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  ** used to build
7180: 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e   SQLite..*/.#ifn
7190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
71a0: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
71b0: 41 47 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AGS.static void 
71c0: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74  compileoptionget
71d0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
71e0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
71f0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
7200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
7210: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  argv.){.  int n;
7220: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7230: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
7240: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
7250: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 39 32    /* IMP: R-0492
7260: 32 2d 32 34 30 37 36 20 54 68 65 20 73 71 6c 69  2-24076 The sqli
7270: 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  te_compileoption
7280: 5f 67 65 74 28 29 20 53 51 4c 20 66 75 6e 63 74  _get() SQL funct
7290: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 77 72  ion.  ** is a wr
72a0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65  apper around the
72b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
72c0: 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20 43 2f 43  option_get() C/C
72d0: 2b 2b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ++ function..  *
72e0: 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  /.  n = sqlite3_
72f0: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
7300: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ]);.  sqlite3_re
7310: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
7320: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  t, sqlite3_compi
7330: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 6e 29 2c  leoption_get(n),
7340: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
7350: 49 43 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  IC);.}.#endif /*
7360: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
7370: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
7380: 20 2a 2f 0a 0a 2f 2a 20 41 72 72 61 79 20 66 6f   */../* Array fo
7390: 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f  r converting fro
73a0: 6d 20 68 61 6c 66 2d 62 79 74 65 73 20 28 6e 79  m half-bytes (ny
73b0: 62 62 6c 65 73 29 20 69 6e 74 6f 20 41 53 43 49  bbles) into ASCI
73c0: 49 20 68 65 78 0a 2a 2a 20 64 69 67 69 74 73 2e  I hex.** digits.
73d0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
73e0: 20 63 68 61 72 20 68 65 78 64 69 67 69 74 73 5b   char hexdigits[
73f0: 5d 20 3d 20 7b 0a 20 20 27 30 27 2c 20 27 31 27  ] = {.  '0', '1'
7400: 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34 27 2c  , '2', '3', '4',
7410: 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a   '5', '6', '7',.
7420: 20 20 27 38 27 2c 20 27 39 27 2c 20 27 41 27 2c    '8', '9', 'A',
7430: 20 27 42 27 2c 20 27 43 27 2c 20 27 44 27 2c 20   'B', 'C', 'D', 
7440: 27 45 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f 2a  'E', 'F' .};../*
7450: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
7460: 6f 6e 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28  on of the QUOTE(
7470: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  ) function.  Thi
7480: 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  s function takes
7490: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67   a single.** arg
74a0: 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61  ument.  If the a
74b0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72  rgument is numer
74c0: 69 63 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  ic, the return v
74d0: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
74e0: 20 61 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d   as.** the argum
74f0: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67  ent.  If the arg
7500: 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
7510: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
7520: 69 73 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  is the string.**
7530: 20 22 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77   "NULL".  Otherw
7540: 69 73 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e  ise, the argumen
7550: 74 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  t is enclosed in
7560: 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77   single quotes w
7570: 69 74 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75  ith.** single-qu
7580: 6f 74 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a  ote escapes..*/.
7590: 73 74 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74  static void quot
75a0: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
75b0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
75c0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
75d0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
75e0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
75f0: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
7600: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
7610: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
7620: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
7630: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
7640: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
7650: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
7660: 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 63 68 61  1, r2;.      cha
7670: 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20  r zBuf[50];.    
7680: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 5f 76    r1 = sqlite3_v
7690: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
76a0: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  [0]);.      sqli
76b0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
76c0: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
76d0: 20 22 25 21 2e 31 35 67 22 2c 20 72 31 29 3b 0a   "%!.15g", r1);.
76e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f        sqlite3Ato
76f0: 46 28 7a 42 75 66 2c 20 26 72 32 2c 20 32 30 2c  F(zBuf, &r2, 20,
7700: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
7710: 20 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20       if( r1!=r2 
7720: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7730: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
7740: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
7750: 22 25 21 2e 32 30 65 22 2c 20 72 31 29 3b 0a 20  "%!.20e", r1);. 
7760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7770: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7780: 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20  (context, zBuf, 
7790: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
77a0: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65  IENT);.      bre
77b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
77c0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
77d0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
77e0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
77f0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
7800: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7810: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
7820: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
7830: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20      char *zText 
7840: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
7850: 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73  const *zBlob = s
7860: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
7870: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
7880: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
7890: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
78a0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
78b0: 20 20 61 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d    assert( zBlob=
78c0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  =sqlite3_value_b
78d0: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  lob(argv[0]) ); 
78e0: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
78f0: 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 7a  hange */.      z
7900: 54 65 78 74 20 3d 20 28 63 68 61 72 20 2a 29 63  Text = (char *)c
7910: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
7920: 74 65 78 74 2c 20 28 32 2a 28 69 36 34 29 6e 42  text, (2*(i64)nB
7930: 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20 20 20 20  lob)+4); .      
7940: 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
7950: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
7960: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7970: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Blob; i++){.    
7980: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32        zText[(i*2
7990: 29 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73  )+2] = hexdigits
79a0: 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30  [(zBlob[i]>>4)&0
79b0: 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x0F];.          
79c0: 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d  zText[(i*2)+3] =
79d0: 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f   hexdigits[(zBlo
79e0: 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20  b[i])&0x0F];.   
79f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
7a00: 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32  Text[(nBlob*2)+2
7a10: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
7a20: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
7a30: 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  )+3] = '\0';.   
7a40: 20 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20       zText[0] = 
7a50: 27 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  'X';.        zTe
7a60: 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  xt[1] = '\'';.  
7a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7a80: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
7a90: 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51  t, zText, -1, SQ
7aa0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
7ab0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7ac0: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
7ad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7ae0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7af0: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
7b00: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a  .      int i,j;.
7b10: 20 20 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20        u64 n;.   
7b20: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
7b30: 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73  d char *zArg = s
7b40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
7b50: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
7b60: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20    char *z;..    
7b70: 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20    if( zArg==0 ) 
7b80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
7b90: 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67  r(i=0, n=0; zArg
7ba0: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a  [i]; i++){ if( z
7bb0: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  Arg[i]=='\'' ) n
7bc0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20  ++; }.      z = 
7bd0: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
7be0: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 69 29 2b  ntext, ((i64)i)+
7bf0: 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a 20 20 20  ((i64)n)+3);.   
7c00: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
7c10: 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b      z[0] = '\'';
7c20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
7c30: 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20  , j=1; zArg[i]; 
7c40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7c50: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d  z[j++] = zArg[i]
7c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7c70: 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  zArg[i]=='\'' ){
7c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  .            z[j
7c90: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
7ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7cb0: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  }.        z[j++]
7cc0: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
7cd0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
7ce0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7cf0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
7d00: 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  z, j, sqlite3_fr
7d10: 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ee);.      }.   
7d20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7d30: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
7d40: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
7d50: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
7d60: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
7d70: 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  _NULL );.      s
7d80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7d90: 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c  xt(context, "NUL
7da0: 4c 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54  L", 4, SQLITE_ST
7db0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
7dc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
7dd0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 63 6f  ./*.** The unico
7de0: 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  de() function.  
7df0: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67  Return the integ
7e00: 65 72 20 75 6e 69 63 6f 64 65 20 63 6f 64 65 2d  er unicode code-
7e10: 70 6f 69 6e 74 20 76 61 6c 75 65 0a 2a 2a 20 66  point value.** f
7e20: 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 68 61  or the first cha
7e30: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e  racter of the in
7e40: 70 75 74 20 73 74 72 69 6e 67 2e 20 0a 2a 2f 0a  put string. .*/.
7e50: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 63  static void unic
7e60: 6f 64 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  odeFunc(.  sqlit
7e70: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7e80: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
7e90: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7ea0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
7eb0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
7ec0: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   *z = sqlite3_va
7ed0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
7ee0: 29 3b 0a 20 20 28 76 6f 69 64 29 61 72 67 63 3b  );.  (void)argc;
7ef0: 0a 20 20 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d  .  if( z && z[0]
7f00: 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c   ) sqlite3_resul
7f10: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
7f20: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
7f30: 7a 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  z));.}../*.** Th
7f40: 65 20 63 68 61 72 28 29 20 66 75 6e 63 74 69 6f  e char() functio
7f50: 6e 20 74 61 6b 65 73 20 7a 65 72 6f 20 6f 72 20  n takes zero or 
7f60: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2c 20  more arguments, 
7f70: 65 61 63 68 20 6f 66 20 77 68 69 63 68 20 69 73  each of which is
7f80: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 20  .** an integer. 
7f90: 20 49 74 20 63 6f 6e 73 74 72 75 63 74 73 20 61   It constructs a
7fa0: 20 73 74 72 69 6e 67 20 77 68 65 72 65 20 65 61   string where ea
7fb0: 63 68 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  ch character of 
7fc0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  the string.** is
7fd0: 20 74 68 65 20 75 6e 69 63 6f 64 65 20 63 68 61   the unicode cha
7fe0: 72 61 63 74 65 72 20 66 6f 72 20 74 68 65 20 63  racter for the c
7ff0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 74  orresponding int
8000: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  eger argument..*
8010: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
8020: 61 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  arFunc(.  sqlite
8030: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
8040: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
8050: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8060: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 75 6e 73 69  **argv.){.  unsi
8070: 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 2a 7a  gned char *z, *z
8080: 4f 75 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Out;.  int i;.  
8090: 7a 4f 75 74 20 3d 20 7a 20 3d 20 73 71 6c 69 74  zOut = z = sqlit
80a0: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 61 72 67  e3_malloc64( arg
80b0: 63 2a 34 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a  c*4+1 );.  if( z
80c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
80d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
80e0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
80f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8100: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
8110: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  c; i++){.    sql
8120: 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
8130: 20 20 75 6e 73 69 67 6e 65 64 20 63 3b 0a 20 20    unsigned c;.  
8140: 20 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    x = sqlite3_va
8150: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 69  lue_int64(argv[i
8160: 5d 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 30 20  ]);.    if( x<0 
8170: 7c 7c 20 78 3e 30 78 31 30 66 66 66 66 20 29 20  || x>0x10ffff ) 
8180: 78 20 3d 20 30 78 66 66 66 64 3b 0a 20 20 20 20  x = 0xfffd;.    
8190: 63 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 28 78  c = (unsigned)(x
81a0: 20 26 20 30 78 31 66 66 66 66 66 29 3b 0a 20 20   & 0x1fffff);.  
81b0: 20 20 69 66 28 20 63 3c 30 78 30 30 30 38 30 20    if( c<0x00080 
81c0: 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  ){.      *zOut++
81d0: 20 3d 20 28 75 38 29 28 63 26 30 78 46 46 29 3b   = (u8)(c&0xFF);
81e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
81f0: 3c 30 78 30 30 38 30 30 20 29 7b 0a 20 20 20 20  <0x00800 ){.    
8200: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 43 30    *zOut++ = 0xC0
8210: 20 2b 20 28 75 38 29 28 28 63 3e 3e 36 29 26 30   + (u8)((c>>6)&0
8220: 78 31 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75  x1F);.      *zOu
8230: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38  t++ = 0x80 + (u8
8240: 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20  )(c & 0x3F);.   
8250: 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31   }else if( c<0x1
8260: 30 30 30 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a  0000 ){.      *z
8270: 4f 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28  Out++ = 0xE0 + (
8280: 75 38 29 28 28 63 3e 3e 31 32 29 26 30 78 30 46  u8)((c>>12)&0x0F
8290: 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  );.      *zOut++
82a0: 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 28   = 0x80 + (u8)((
82b0: 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 0a 20  c>>6) & 0x3F);. 
82c0: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
82d0: 78 38 30 20 2b 20 28 75 38 29 28 63 20 26 20 30  x80 + (u8)(c & 0
82e0: 78 33 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  x3F);.    }else{
82f0: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
8300: 20 30 78 46 30 20 2b 20 28 75 38 29 28 28 63 3e   0xF0 + (u8)((c>
8310: 3e 31 38 29 20 26 20 30 78 30 37 29 3b 0a 20 20  >18) & 0x07);.  
8320: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
8330: 38 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 31 32  80 + (u8)((c>>12
8340: 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20  ) & 0x3F);.     
8350: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20   *zOut++ = 0x80 
8360: 2b 20 28 75 38 29 28 28 63 3e 3e 36 29 20 26 20  + (u8)((c>>6) & 
8370: 30 78 33 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f  0x3F);.      *zO
8380: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75  ut++ = 0x80 + (u
8390: 38 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20  8)(c & 0x3F);.  
83a0: 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20    }             
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 20 20 73         \.  }.  s
83e0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
83f0: 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 63  xt64(context, (c
8400: 68 61 72 2a 29 7a 2c 20 7a 4f 75 74 2d 7a 2c 20  har*)z, zOut-z, 
8410: 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20 53 51  sqlite3_free, SQ
8420: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 7d 0a 0a 2f  LITE_UTF8);.}../
8430: 2a 0a 2a 2a 20 54 68 65 20 68 65 78 28 29 20 66  *.** The hex() f
8440: 75 6e 63 74 69 6f 6e 2e 20 20 49 6e 74 65 72 70  unction.  Interp
8450: 72 65 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ret the argument
8460: 20 61 73 20 61 20 62 6c 6f 62 2e 20 20 52 65 74   as a blob.  Ret
8470: 75 72 6e 0a 2a 2a 20 61 20 68 65 78 61 64 65 63  urn.** a hexadec
8480: 69 6d 61 6c 20 72 65 6e 64 65 72 69 6e 67 20 61  imal rendering a
8490: 73 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69  s text..*/.stati
84a0: 63 20 76 6f 69 64 20 68 65 78 46 75 6e 63 28 0a  c void hexFunc(.
84b0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
84c0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
84d0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
84e0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
84f0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
8500: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8510: 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 63 68  har *pBlob;.  ch
8520: 61 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a 20 20  ar *zHex, *z;.  
8530: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
8540: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
8550: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 70  METER(argc);.  p
8560: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
8570: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
8580: 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  ]);.  n = sqlite
8590: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
85a0: 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[0]);.  assert
85b0: 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33  ( pBlob==sqlite3
85c0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
85d0: 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65  [0]) );  /* No e
85e0: 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a  ncoding change *
85f0: 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20 63  /.  z = zHex = c
8600: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
8610: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2a 32  text, ((i64)n)*2
8620: 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a 48 65   + 1);.  if( zHe
8630: 78 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  x ){.    for(i=0
8640: 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42 6c 6f  ; i<n; i++, pBlo
8650: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  b++){.      unsi
8660: 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 2a 70  gned char c = *p
8670: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 2a 28 7a 2b  Blob;.      *(z+
8680: 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  +) = hexdigits[(
8690: 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20  c>>4)&0xf];.    
86a0: 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69    *(z++) = hexdi
86b0: 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a 20 20 20  gits[c&0xf];.   
86c0: 20 7d 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20   }.    *z = 0;. 
86d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
86e0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
86f0: 7a 48 65 78 2c 20 6e 2a 32 2c 20 73 71 6c 69 74  zHex, n*2, sqlit
8700: 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a  e3_free);.  }.}.
8710: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a 65 72 6f 62  ./*.** The zerob
8720: 6c 6f 62 28 4e 29 20 66 75 6e 63 74 69 6f 6e 20  lob(N) function 
8730: 72 65 74 75 72 6e 73 20 61 20 7a 65 72 6f 2d 66  returns a zero-f
8740: 69 6c 6c 65 64 20 62 6c 6f 62 20 6f 66 20 73 69  illed blob of si
8750: 7a 65 20 4e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  ze N bytes..*/.s
8760: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 62  tatic void zerob
8770: 6c 6f 62 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  lobFunc(.  sqlit
8780: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
8790: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
87a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
87b0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 36 34   **argv.){.  i64
87c0: 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   n;.  int rc;.  
87d0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
87e0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
87f0: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e  METER(argc);.  n
8800: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8810: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
8820: 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d  .  if( n<0 ) n =
8830: 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
8840: 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c  e3_result_zerobl
8850: 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 6e 29  ob64(context, n)
8860: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 30 32 39  ; /* IMP: R-0029
8870: 33 2d 36 34 39 39 34 20 2a 2f 0a 20 20 69 66 28  3-64994 */.  if(
8880: 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
8890: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
88a0: 63 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63  code(context, rc
88b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
88c0: 54 68 65 20 72 65 70 6c 61 63 65 28 29 20 66 75  The replace() fu
88d0: 6e 63 74 69 6f 6e 2e 20 20 54 68 72 65 65 20 61  nction.  Three a
88e0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 6c 6c  rguments are all
88f0: 20 73 74 72 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a   strings: call.*
8900: 2a 20 74 68 65 6d 20 41 2c 20 42 2c 20 61 6e 64  * them A, B, and
8910: 20 43 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69   C. The result i
8920: 73 20 61 6c 73 6f 20 61 20 73 74 72 69 6e 67 20  s also a string 
8930: 77 68 69 63 68 20 69 73 20 64 65 72 69 76 65 64  which is derived
8940: 0a 2a 2a 20 66 72 6f 6d 20 41 20 62 79 20 72 65  .** from A by re
8950: 70 6c 61 63 69 6e 67 20 65 76 65 72 79 20 6f 63  placing every oc
8960: 63 75 72 72 65 6e 63 65 20 6f 66 20 42 20 77 69  currence of B wi
8970: 74 68 20 43 2e 20 20 54 68 65 20 6d 61 74 63 68  th C.  The match
8980: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 78 61 63  .** must be exac
8990: 74 2e 20 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65  t.  Collating se
89a0: 71 75 65 6e 63 65 73 20 61 72 65 20 6e 6f 74 20  quences are not 
89b0: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
89c0: 76 6f 69 64 20 72 65 70 6c 61 63 65 46 75 6e 63  void replaceFunc
89d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
89e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
89f0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
8a00: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8a10: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
8a20: 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72 3b  gned char *zStr;
8a30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
8a40: 6e 70 75 74 20 73 74 72 69 6e 67 20 41 20 2a 2f  nput string A */
8a50: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
8a60: 64 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e  d char *zPattern
8a70: 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74 74  ;    /* The patt
8a80: 65 72 6e 20 73 74 72 69 6e 67 20 42 20 2a 2f 0a  ern string B */.
8a90: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
8aa0: 20 63 68 61 72 20 2a 7a 52 65 70 3b 20 20 20 20   char *zRep;    
8ab0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 70 6c 61      /* The repla
8ac0: 63 65 6d 65 6e 74 20 73 74 72 69 6e 67 20 43 20  cement string C 
8ad0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
8ae0: 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20  ar *zOut;       
8af0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75         /* The ou
8b00: 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tput */.  int nS
8b10: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
8b20: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 53     /* Size of zS
8b30: 74 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  tr */.  int nPat
8b40: 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tern;           
8b50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 50 61 74   /* Size of zPat
8b60: 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  tern */.  int nR
8b70: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
8b80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 52     /* Size of zR
8b90: 65 70 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 75 74  ep */.  i64 nOut
8ba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8bb0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65   /* Maximum size
8bc0: 20 6f 66 20 7a 4f 75 74 20 2a 2f 0a 20 20 69 6e   of zOut */.  in
8bd0: 74 20 6c 6f 6f 70 4c 69 6d 69 74 3b 20 20 20 20  t loopLimit;    
8be0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 7a         /* Last z
8bf0: 53 74 72 5b 5d 20 74 68 61 74 20 6d 69 67 68 74  Str[] that might
8c00: 20 6d 61 74 63 68 20 7a 50 61 74 74 65 72 6e 5b   match zPattern[
8c10: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ] */.  int i, j;
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
8c40: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
8c50: 6e 74 45 78 70 61 6e 64 3b 20 20 20 20 20 20 2f  ntExpand;      /
8c60: 2a 20 4e 75 6d 62 65 72 20 7a 4f 75 74 20 65 78  * Number zOut ex
8c70: 70 61 6e 73 69 6f 6e 73 20 2a 2f 0a 20 20 73 71  pansions */.  sq
8c80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
8c90: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
8ca0: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
8cb0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
8cc0: 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =3 );.  UNUSED_P
8cd0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
8ce0: 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33    zStr = sqlite3
8cf0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8d00: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53 74 72  [0]);.  if( zStr
8d10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8d20: 6e 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  nStr = sqlite3_v
8d30: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
8d40: 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0]);.  assert( z
8d50: 53 74 72 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  Str==sqlite3_val
8d60: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
8d70: 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64   );  /* No encod
8d80: 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ing change */.  
8d90: 7a 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74  zPattern = sqlit
8da0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8db0: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50  gv[1]);.  if( zP
8dc0: 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20  attern==0 ){.   
8dd0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8de0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8df0: 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [1])==SQLITE_NUL
8e00: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
8e10: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8e20: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
8e30: 78 74 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  xt)->mallocFaile
8e40: 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
8e50: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74 74  .  }.  if( zPatt
8e60: 65 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ern[0]==0 ){.   
8e70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8e80: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8e90: 5b 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  [1])!=SQLITE_NUL
8ea0: 4c 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  L );.    sqlite3
8eb0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
8ec0: 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b  ntext, argv[0]);
8ed0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8ee0: 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73 71  .  nPattern = sq
8ef0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8f00: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73  s(argv[1]);.  as
8f10: 73 65 72 74 28 20 7a 50 61 74 74 65 72 6e 3d 3d  sert( zPattern==
8f20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8f30: 78 74 28 61 72 67 76 5b 31 5d 29 20 29 3b 20 20  xt(argv[1]) );  
8f40: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
8f50: 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65 70 20  hange */.  zRep 
8f60: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8f70: 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20  text(argv[2]);. 
8f80: 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20 72   if( zRep==0 ) r
8f90: 65 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20 3d 20  eturn;.  nRep = 
8fa0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
8fb0: 74 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  tes(argv[2]);.  
8fc0: 61 73 73 65 72 74 28 20 7a 52 65 70 3d 3d 73 71  assert( zRep==sq
8fd0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8fe0: 28 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20 20 6e  (argv[2]) );.  n
8ff0: 4f 75 74 20 3d 20 6e 53 74 72 20 2b 20 31 3b 0a  Out = nStr + 1;.
9000: 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3c 53    assert( nOut<S
9010: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
9020: 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63 6f 6e   );.  zOut = con
9030: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
9040: 78 74 2c 20 28 69 36 34 29 6e 4f 75 74 29 3b 0a  xt, (i64)nOut);.
9050: 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b    if( zOut==0 ){
9060: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9070: 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e  .  loopLimit = n
9080: 53 74 72 20 2d 20 6e 50 61 74 74 65 72 6e 3b 20  Str - nPattern; 
9090: 20 0a 20 20 63 6e 74 45 78 70 61 6e 64 20 3d 20   .  cntExpand = 
90a0: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
90b0: 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b  i<=loopLimit; i+
90c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 74 72  +){.    if( zStr
90d0: 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30 5d  [i]!=zPattern[0]
90e0: 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74 72   || memcmp(&zStr
90f0: 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e  [i], zPattern, n
9100: 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20 20 20  Pattern) ){.    
9110: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53    zOut[j++] = zS
9120: 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  tr[i];.    }else
9130: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 70  {.      if( nRep
9140: 3e 6e 50 61 74 74 65 72 6e 20 29 7b 0a 20 20 20  >nPattern ){.   
9150: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 6e 52 65       nOut += nRe
9160: 70 20 2d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  p - nPattern;.  
9170: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9180: 6e 4f 75 74 2d 31 3d 3d 64 62 2d 3e 61 4c 69 6d  nOut-1==db->aLim
9190: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
91a0: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20  LENGTH] );.     
91b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 75     testcase( nOu
91c0: 74 2d 32 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  t-2==db->aLimit[
91d0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
91e0: 47 54 48 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  GTH] );.        
91f0: 69 66 28 20 6e 4f 75 74 2d 31 3e 64 62 2d 3e 61  if( nOut-1>db->a
9200: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
9210: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
9220: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9230: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f  result_error_too
9240: 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  big(context);.  
9250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9260: 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
9270: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9290: 63 6e 74 45 78 70 61 6e 64 2b 2b 3b 0a 20 20 20  cntExpand++;.   
92a0: 20 20 20 20 20 69 66 28 20 28 63 6e 74 45 78 70       if( (cntExp
92b0: 61 6e 64 26 28 63 6e 74 45 78 70 61 6e 64 2d 31  and&(cntExpand-1
92c0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
92d0: 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 73     /* Grow the s
92e0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ize of the outpu
92f0: 74 20 62 75 66 66 65 72 20 6f 6e 6c 79 20 6f 6e  t buffer only on
9300: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 0a 20   substitutions. 
9310: 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 6f 73           ** whos
9320: 65 20 69 6e 64 65 78 20 69 73 20 61 20 70 6f 77  e index is a pow
9330: 65 72 20 6f 66 20 74 77 6f 3a 20 31 2c 20 32 2c  er of two: 1, 2,
9340: 20 34 2c 20 38 2c 20 31 36 2c 20 33 32 2c 20 2e   4, 8, 16, 32, .
9350: 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .. */.          
9360: 75 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20  u8 *zOld;.      
9370: 20 20 20 20 7a 4f 6c 64 20 3d 20 7a 4f 75 74 3b      zOld = zOut;
9380: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 20  .          zOut 
9390: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
93a0: 63 36 34 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e  c64(zOut, (int)n
93b0: 4f 75 74 20 2b 20 28 6e 4f 75 74 20 2d 20 6e 53  Out + (nOut - nS
93c0: 74 72 20 2d 20 31 29 29 3b 0a 20 20 20 20 20 20  tr - 1));.      
93d0: 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20      if( zOut==0 
93e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
93f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
9400: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
9410: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
9420: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c  sqlite3_free(zOl
9430: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
9440: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
9450: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9460: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
9470: 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65  py(&zOut[j], zRe
9480: 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20  p, nRep);.      
9490: 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20  j += nRep;.     
94a0: 20 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31   i += nPattern-1
94b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
94c0: 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31  sert( j+nStr-i+1
94d0: 3c 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63  <=nOut );.  memc
94e0: 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53  py(&zOut[j], &zS
94f0: 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a  tr[i], nStr-i);.
9500: 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b    j += nStr - i;
9510: 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f  .  assert( j<=nO
9520: 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20  ut );.  zOut[j] 
9530: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
9540: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
9550: 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c  xt, (char*)zOut,
9560: 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   j, sqlite3_free
9570: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
9580: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
9590: 65 20 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28  e TRIM(), LTRIM(
95a0: 29 2c 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66  ), and RTRIM() f
95b0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65  unctions..** The
95c0: 20 75 73 65 72 64 61 74 61 20 69 73 20 30 78 31   userdata is 0x1
95d0: 20 66 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20   for left trim, 
95e0: 30 78 32 20 66 6f 72 20 72 69 67 68 74 20 74 72  0x2 for right tr
95f0: 69 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68  im, 0x3 for both
9600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9610: 20 74 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c   trimFunc(.  sql
9620: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
9630: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
9640: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
9650: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
9660: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
9670: 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20  ar *zIn;        
9680: 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67   /* Input string
9690: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
96a0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72  gned char *zChar
96b0: 53 65 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f  Set;    /* Set o
96c0: 66 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20  f characters to 
96d0: 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  trim */.  int nI
96e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9700: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
9710: 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74  n input */.  int
9720: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9740: 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32  * 1: trimleft  2
9750: 3a 20 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20  : trimright  3: 
9760: 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  trim */.  int i;
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9790: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
97a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
97b0: 61 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  aLen = 0;       
97c0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
97d0: 65 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69  each character i
97e0: 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20  n zCharSet */.  
97f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
9800: 61 7a 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20  azChar = 0;     
9810: 20 20 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20    /* Individual 
9820: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43  characters in zC
9830: 68 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20  harSet */.  int 
9840: 6e 43 68 61 72 3b 20 20 20 20 20 20 20 20 20 20  nChar;          
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9860: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
9870: 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65  cters in zCharSe
9880: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69  t */..  if( sqli
9890: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
98a0: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
98b0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  NULL ){.    retu
98c0: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20  rn;.  }.  zIn = 
98d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
98e0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
98f0: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75  f( zIn==0 ) retu
9900: 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69  rn;.  nIn = sqli
9910: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
9920: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65  argv[0]);.  asse
9930: 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33  rt( zIn==sqlite3
9940: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9950: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72  [0]) );.  if( ar
9960: 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61  gc==1 ){.    sta
9970: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
9980: 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d  ed char lenOne[]
9990: 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74   = { 1 };.    st
99a0: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
99b0: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f 6e 65  ar * const azOne
99c0: 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20  [] = { (u8*)" " 
99d0: 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31  };.    nChar = 1
99e0: 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38  ;.    aLen = (u8
99f0: 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a  *)lenOne;.    az
9a00: 43 68 61 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  Char = (unsigned
9a10: 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a   char **)azOne;.
9a20: 20 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20 30      zCharSet = 0
9a30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a  ;.  }else if( (z
9a40: 43 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74 65  CharSet = sqlite
9a50: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9a60: 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20 20  v[1]))==0 ){.   
9a70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
9a80: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  {.    const unsi
9a90: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
9aa0: 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74    for(z=zCharSet
9ab0: 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e  , nChar=0; *z; n
9ac0: 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 53  Char++){.      S
9ad0: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
9ae0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
9af0: 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20  ( nChar>0 ){.   
9b00: 20 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e 74     azChar = cont
9b10: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
9b20: 74 2c 20 28 28 69 36 34 29 6e 43 68 61 72 29 2a  t, ((i64)nChar)*
9b30: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31  (sizeof(char*)+1
9b40: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
9b50: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Char==0 ){.     
9b60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
9b70: 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20   }.      aLen = 
9b80: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9b90: 26 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a  &azChar[nChar];.
9ba0: 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61        for(z=zCha
9bb0: 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a  rSet, nChar=0; *
9bc0: 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20  z; nChar++){.   
9bd0: 20 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61       azChar[nCha
9be0: 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  r] = (unsigned c
9bf0: 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20 20  har *)z;.       
9c00: 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46   SQLITE_SKIP_UTF
9c10: 38 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c  8(z);.        aL
9c20: 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75 38 29  en[nChar] = (u8)
9c30: 28 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61  (z - azChar[nCha
9c40: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r]);.      }.   
9c50: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68   }.  }.  if( nCh
9c60: 61 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c 61 67  ar>0 ){.    flag
9c70: 73 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  s = SQLITE_PTR_T
9c80: 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f 75 73  O_INT(sqlite3_us
9c90: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
9ca0: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
9cb0: 20 26 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68   & 1 ){.      wh
9cc0: 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20  ile( nIn>0 ){.  
9cd0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
9ce0: 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
9cf0: 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
9d00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
9d10: 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20   = aLen[i];.    
9d20: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e        if( len<=n
9d30: 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a 49 6e  In && memcmp(zIn
9d40: 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e  , azChar[i], len
9d50: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
9d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9d70: 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62  if( i>=nChar ) b
9d80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49  reak;.        zI
9d90: 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  n += len;.      
9da0: 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20    nIn -= len;.  
9db0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9dc0: 69 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b  if( flags & 2 ){
9dd0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49  .      while( nI
9de0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  n>0 ){.        i
9df0: 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nt len = 0;.    
9e00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9e10: 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Char; i++){.    
9e20: 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e        len = aLen
9e30: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
9e40: 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d  f( len<=nIn && m
9e50: 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c  emcmp(&zIn[nIn-l
9e60: 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65  en],azChar[i],le
9e70: 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  n)==0 ) break;. 
9e80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9e90: 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20   if( i>=nChar ) 
9ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e  break;.        n
9eb0: 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  In -= len;.     
9ec0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9ed0: 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20   zCharSet ){.   
9ee0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9ef0: 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20  azChar);.    }. 
9f00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
9f10: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
9f20: 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49  , (char*)zIn, nI
9f30: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
9f40: 45 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ENT);.}...#ifdef
9f50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
9f60: 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
9f70: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 75  ION./*.** The "u
9f80: 6e 6b 6e 6f 77 6e 22 20 66 75 6e 63 74 69 6f 6e  nknown" function
9f90: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
9fa0: 79 20 73 75 62 73 74 69 74 75 74 65 64 20 69 6e  y substituted in
9fb0: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 6e 79   place of.** any
9fc0: 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 66 75   unrecognized fu
9fd0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 77 68 65 6e  nction name when
9fe0: 20 64 6f 69 6e 67 20 61 6e 20 45 58 50 4c 41 49   doing an EXPLAI
9ff0: 4e 20 6f 72 20 45 58 50 4c 41 49 4e 20 51 55 45  N or EXPLAIN QUE
a000: 52 59 20 50 4c 41 4e 0a 2a 2a 20 77 68 65 6e 20  RY PLAN.** when 
a010: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
a020: 45 5f 55 4e 4b 4e 4f 57 4e 5f 46 55 4e 43 54 49  E_UNKNOWN_FUNCTI
a030: 4f 4e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ON compile-time 
a040: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
a050: 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  ** When the "sql
a060: 69 74 65 33 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69  ite3" command-li
a070: 6e 65 20 73 68 65 6c 6c 20 69 73 20 62 75 69 6c  ne shell is buil
a080: 74 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  t using this fun
a090: 63 74 69 6f 6e 61 6c 69 74 79 2c 0a 2a 2a 20 74  ctionality,.** t
a0a0: 68 61 74 20 61 6c 6c 6f 77 73 20 61 6e 20 45 58  hat allows an EX
a0b0: 50 4c 41 49 4e 20 6f 72 20 45 58 50 4c 41 49 4e  PLAIN or EXPLAIN
a0c0: 20 51 55 45 52 59 20 50 4c 41 4e 20 66 6f 72 20   QUERY PLAN for 
a0d0: 63 6f 6d 70 6c 65 78 20 71 75 65 72 69 65 73 0a  complex queries.
a0e0: 2a 2a 20 69 6e 76 6f 6c 76 69 6e 67 20 61 70 70  ** involving app
a0f0: 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  lication-defined
a100: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
a110: 20 65 78 61 6d 69 6e 65 64 20 69 6e 20 61 20 67   examined in a g
a120: 65 6e 65 72 69 63 0a 2a 2a 20 73 71 6c 69 74 65  eneric.** sqlite
a130: 33 20 73 68 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  3 shell..*/.stat
a140: 69 63 20 76 6f 69 64 20 75 6e 6b 6e 6f 77 6e 46  ic void unknownF
a150: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
a160: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
a170: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
a180: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
a190: 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f  rgv.){.  /* no-o
a1a0: 70 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  p */.}.#endif /*
a1b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
a1c0: 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49  KNOWN_SQL_FUNCTI
a1d0: 4f 4e 2a 2f 0a 0a 0a 2f 2a 20 49 4d 50 3a 20 52  ON*/.../* IMP: R
a1e0: 2d 32 35 33 36 31 2d 31 36 31 35 30 20 54 68 69  -25361-16150 Thi
a1f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6d  s function is om
a200: 69 74 74 65 64 20 66 72 6f 6d 20 53 51 4c 69 74  itted from SQLit
a210: 65 20 62 79 20 64 65 66 61 75 6c 74 2e 20 49 74  e by default. It
a220: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  .** is only avai
a230: 6c 61 62 6c 65 20 69 66 20 74 68 65 20 53 51 4c  lable if the SQL
a240: 49 54 45 5f 53 4f 55 4e 44 45 58 20 63 6f 6d 70  ITE_SOUNDEX comp
a250: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
a260: 69 73 20 75 73 65 64 0a 2a 2a 20 77 68 65 6e 20  is used.** when 
a270: 53 51 4c 69 74 65 20 69 73 20 62 75 69 6c 74 2e  SQLite is built.
a280: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
a290: 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  E_SOUNDEX./*.** 
a2a0: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f 75 6e  Compute the soun
a2b0: 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  dex encoding of 
a2c0: 61 20 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d  a word..**.** IM
a2d0: 50 3a 20 52 2d 35 39 37 38 32 2d 30 30 30 37 32  P: R-59782-00072
a2e0: 20 54 68 65 20 73 6f 75 6e 64 65 78 28 58 29 20   The soundex(X) 
a2f0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a300: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
a310: 73 20 74 68 65 0a 2a 2a 20 73 6f 75 6e 64 65 78  s the.** soundex
a320: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
a330: 20 73 74 72 69 6e 67 20 58 2e 20 0a 2a 2f 0a 73   string X. .*/.s
a340: 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 6e 64  tatic void sound
a350: 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  exFunc(.  sqlite
a360: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
a370: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
a380: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a390: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72  **argv.){.  char
a3a0: 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20 63   zResult[8];.  c
a3b0: 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20 20  onst u8 *zIn;.  
a3c0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74  int i, j;.  stat
a3d0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
a3e0: 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d 20 3d  d char iCode[] =
a3f0: 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20   {.    0, 0, 0, 
a400: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a410: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a420: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
a430: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a440: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a450: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
a460: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a470: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a480: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
a490: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a4a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a4b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a4c0: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20  0,.    0, 0, 1, 
a4d0: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30  2, 3, 0, 1, 2, 0
a4e0: 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c  , 0, 2, 2, 4, 5,
a4f0: 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c   5, 0,.    1, 2,
a500: 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   6, 2, 3, 0, 1, 
a510: 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30  0, 2, 0, 2, 0, 0
a520: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
a530: 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c  , 0, 1, 2, 3, 0,
a540: 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20   1, 2, 0, 0, 2, 
a550: 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20  2, 4, 5, 5, 0,. 
a560: 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33     1, 2, 6, 2, 3
a570: 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 1, 0, 2, 0,
a580: 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   2, 0, 0, 0, 0, 
a590: 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74  0,.  };.  assert
a5a0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a  ( argc==1 );.  z
a5b0: 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  In = (u8*)sqlite
a5c0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
a5d0: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e  v[0]);.  if( zIn
a5e0: 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75 38 2a  ==0 ) zIn = (u8*
a5f0: 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  )"";.  for(i=0; 
a600: 7a 49 6e 5b 69 5d 20 26 26 20 21 73 71 6c 69 74  zIn[i] && !sqlit
a610: 65 33 49 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d  e3Isalpha(zIn[i]
a620: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  ); i++){}.  if( 
a630: 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75 38  zIn[i] ){.    u8
a640: 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43 6f 64   prevcode = iCod
a650: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
a660: 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20 3d      zResult[0] =
a670: 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28   sqlite3Toupper(
a680: 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f 72  zIn[i]);.    for
a690: 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49 6e  (j=1; j<4 && zIn
a6a0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
a6b0: 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f 64   int code = iCod
a6c0: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
a6d0: 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 3e 30        if( code>0
a6e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a6f0: 63 6f 64 65 21 3d 70 72 65 76 63 6f 64 65 20 29  code!=prevcode )
a700: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  {.          prev
a710: 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20 20  code = code;.   
a720: 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a         zResult[j
a730: 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30 27  ++] = code + '0'
a740: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a760: 20 70 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a 20   prevcode = 0;. 
a770: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a780: 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a 20   while( j<4 ){. 
a790: 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b       zResult[j++
a7a0: 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a 20  ] = '0';.    }. 
a7b0: 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d 20     zResult[j] = 
a7c0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
a7d0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
a7e0: 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c 20  xt, zResult, 4, 
a7f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
a800: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a810: 2f 2a 20 49 4d 50 3a 20 52 2d 36 34 38 39 34 2d  /* IMP: R-64894-
a820: 35 30 33 32 31 20 54 68 65 20 73 74 72 69 6e 67  50321 The string
a830: 20 22 3f 30 30 30 22 20 69 73 20 72 65 74 75 72   "?000" is retur
a840: 6e 65 64 20 69 66 20 74 68 65 20 61 72 67 75 6d  ned if the argum
a850: 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 4e 55  ent.    ** is NU
a860: 4c 4c 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e  LL or contains n
a870: 6f 20 41 53 43 49 49 20 61 6c 70 68 61 62 65 74  o ASCII alphabet
a880: 69 63 20 63 68 61 72 61 63 74 65 72 73 2e 20 2a  ic characters. *
a890: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  /.    sqlite3_re
a8a0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
a8b0: 74 2c 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51  t, "?000", 4, SQ
a8c0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
a8d0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
a8e0: 4c 49 54 45 5f 53 4f 55 4e 44 45 58 20 2a 2f 0a  LITE_SOUNDEX */.
a8f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a900: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
a910: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63  ION./*.** A func
a920: 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 73 20  tion that loads 
a930: 61 20 73 68 61 72 65 64 2d 6c 69 62 72 61 72 79  a shared-library
a940: 20 65 78 74 65 6e 73 69 6f 6e 20 74 68 65 6e 20   extension then 
a950: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f  returns NULL..*/
a960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61  .static void loa
a970: 64 45 78 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e  dExt(sqlite3_con
a980: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
a990: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
a9a0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
a9b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
a9c0: 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
a9d0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
a9e0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
a9f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
aa00: 50 72 6f 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  Proc;.  sqlite3 
aa10: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
aa20: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
aa30: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72  context);.  char
aa40: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
aa50: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74 68    /* Disallow th
aa60: 65 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e load_extension
aa70: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
aa80: 75 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 49 54  unless the SQLIT
aa90: 45 5f 4c 6f 61 64 45 78 74 46 75 6e 63 0a 20 20  E_LoadExtFunc.  
aaa0: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ** flag is set. 
aab0: 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33   See the sqlite3
aac0: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
aad0: 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20  ension() API..  
aae0: 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  */.  if( (db->fl
aaf0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 6f 61  ags & SQLITE_Loa
ab00: 64 45 78 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a  dExtFunc)==0 ){.
ab10: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
ab20: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
ab30: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
ab40: 64 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  d", -1);.    ret
ab50: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
ab60: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  argc==2 ){.    z
ab70: 50 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68  Proc = (const ch
ab80: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
ab90: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
aba0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
abb0: 50 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Proc = 0;.  }.  
abc0: 69 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c  if( zFile && sql
abd0: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
abe0: 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  ion(db, zFile, z
abf0: 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20  Proc, &zErrMsg) 
ac00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
ac10: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
ac20: 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31  ext, zErrMsg, -1
ac30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ac40: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
ac50: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
ac60: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
ac70: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
ac80: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
ac90: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61  the context of a
aca0: 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67  .** sum() or avg
acb0: 28 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d  () aggregate com
acc0: 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  putation..*/.typ
acd0: 65 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43  edef struct SumC
ace0: 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63  tx SumCtx;.struc
acf0: 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75  t SumCtx {.  dou
ad00: 62 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f  ble rSum;      /
ad10: 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * Floating point
ad20: 20 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53   sum */.  i64 iS
ad30: 75 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  um;         /* I
ad40: 6e 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20  nteger sum */   
ad50: 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20  .  i64 cnt;     
ad60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ad70: 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65  f elements summe
ad80: 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c  d */.  u8 overfl
ad90: 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ow;      /* True
ada0: 20 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72   if integer over
adb0: 66 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75  flow seen */.  u
adc0: 38 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20  8 approx;       
add0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d   /* True if non-
ade0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 61  integer value wa
adf0: 73 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73  s input to the s
ae00: 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  um */.};../*.** 
ae10: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f  Routines used to
ae20: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d   compute the sum
ae30: 2c 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74  , average, and t
ae40: 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  otal..**.** The 
ae50: 53 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  SUM() function f
ae60: 6f 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b  ollows the (brok
ae70: 65 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64  en) SQL standard
ae80: 20 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20   which means.** 
ae90: 74 68 61 74 20 69 74 20 72 65 74 75 72 6e 73 20  that it returns 
aea0: 4e 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20  NULL if it sums 
aeb0: 6f 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20  over no inputs. 
aec0: 20 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a   TOTAL returns.*
aed0: 2a 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61  * 0.0 in that ca
aee0: 73 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  se.  In addition
aef0: 2c 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72  , TOTAL always r
af00: 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77  eturns a float w
af10: 68 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68  here.** SUM migh
af20: 74 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  t return an inte
af30: 67 65 72 20 69 66 20 69 74 20 6e 65 76 65 72 20  ger if it never 
af40: 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f  encounters a flo
af50: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
af60: 61 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76  alue.  TOTAL nev
af70: 65 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55  er fails, but SU
af80: 4d 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20  M might through 
af90: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a  an exception if.
afa0: 2a 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20  ** it overflows 
afb0: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  an integer..*/.s
afc0: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74  tatic void sumSt
afd0: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
afe0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
aff0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
b000: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
b010: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74  SumCtx *p;.  int
b020: 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28   type;.  assert(
b030: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
b040: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
b050: 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  rgc);.  p = sqli
b060: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
b070: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
b080: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79  izeof(*p));.  ty
b090: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
b0a0: 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
b0b0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
b0c0: 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54  p && type!=SQLIT
b0d0: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d  E_NULL ){.    p-
b0e0: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20  >cnt++;.    if( 
b0f0: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  type==SQLITE_INT
b100: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36  EGER ){.      i6
b110: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
b120: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
b130: 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  ]);.      p->rSu
b140: 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66  m += v;.      if
b150: 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e  ( (p->approx|p->
b160: 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20  overflow)==0 && 
b170: 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28  sqlite3AddInt64(
b180: 26 70 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b 0a  &p->iSum, v) ){.
b190: 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72 66          p->overf
b1a0: 6c 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  low = 1;.      }
b1b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b1c0: 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73 71 6c    p->rSum += sql
b1d0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
b1e0: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  e(argv[0]);.    
b1f0: 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20 31 3b    p->approx = 1;
b200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 69 66  .    }.  }.}.#if
b210: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b220: 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 73 74 61 74  _WINDOWFUNC.stat
b230: 69 63 20 76 6f 69 64 20 73 75 6d 49 6e 76 65 72  ic void sumInver
b240: 73 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  se(sqlite3_conte
b250: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
b260: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
b270: 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53  alue**argv){.  S
b280: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20  umCtx *p;.  int 
b290: 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28 20  type;.  assert( 
b2a0: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
b2b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
b2c0: 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  gc);.  p = sqlit
b2d0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
b2e0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
b2f0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79 70  zeof(*p));.  typ
b300: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
b310: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
b320: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70  rgv[0]);.  if( p
b330: 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54 45   && type!=SQLITE
b340: 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e  _NULL ){.    p->
b350: 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 74  cnt--;.    if( t
b360: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
b370: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36 34  GER ){.      i64
b380: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
b390: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
b3a0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d  );.      p->rSum
b3b0: 20 2d 3d 20 76 3b 0a 20 20 20 20 20 20 69 66 28   -= v;.      if(
b3c0: 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f   (p->approx|p->o
b3d0: 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20 73  verflow)==0 && s
b3e0: 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26  qlite3AddInt64(&
b3f0: 70 2d 3e 69 53 75 6d 2c 20 2d 31 2a 76 29 20 29  p->iSum, -1*v) )
b400: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65  {.        p->ove
b410: 72 66 6c 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20  rflow = 1;.     
b420: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
b430: 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73      p->rSum += s
b440: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
b450: 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
b460: 20 20 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20      p->approx = 
b470: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  1;.    }.  }.}.#
b480: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 75  else.# define su
b490: 6d 49 6e 76 65 72 73 65 20 30 0a 23 65 6e 64 69  mInverse 0.#endi
b4a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b4b0: 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 73  _WINDOWFUNC */.s
b4c0: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69  tatic void sumFi
b4d0: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
b4e0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
b4f0: 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20  {.  SumCtx *p;. 
b500: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
b510: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
b520: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66  ontext, 0);.  if
b530: 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20  ( p && p->cnt>0 
b540: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 76  ){.    if( p->ov
b550: 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
b560: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
b570: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69 6e  rror(context,"in
b580: 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c  teger overflow",
b590: 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  -1);.    }else i
b5a0: 66 28 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b 0a  f( p->approx ){.
b5b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
b5c0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
b5d0: 65 78 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a 20  ext, p->rSum);. 
b5e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b5f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
b600: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d  nt64(context, p-
b610: 3e 69 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  >iSum);.    }.  
b620: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
b630: 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  avgFinalize(sqli
b640: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
b650: 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20  text){.  SumCtx 
b660: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
b670: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
b680: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
b690: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63  .  if( p && p->c
b6a0: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  nt>0 ){.    sqli
b6b0: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
b6c0: 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53  e(context, p->rS
b6d0: 75 6d 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e  um/(double)p->cn
b6e0: 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
b6f0: 20 76 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61 6c   void totalFinal
b700: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
b710: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
b720: 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20   SumCtx *p;.  p 
b730: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
b740: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
b750: 65 78 74 2c 20 30 29 3b 0a 20 20 2f 2a 20 28 64  ext, 0);.  /* (d
b760: 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20  ouble)0 In case 
b770: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
b780: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
b790: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   */.  sqlite3_re
b7a0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
b7b0: 65 78 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75 6d  ext, p ? p->rSum
b7c0: 20 3a 20 28 64 6f 75 62 6c 65 29 30 29 3b 0a 7d   : (double)0);.}
b7d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b7e0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
b7f0: 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73  keeps track of s
b800: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
b810: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e   for the.** coun
b820: 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  t() aggregate fu
b830: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
b840: 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43  ef struct CountC
b850: 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72  tx CountCtx;.str
b860: 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20  uct CountCtx {. 
b870: 20 69 36 34 20 6e 3b 0a 23 69 66 64 65 66 20 53   i64 n;.#ifdef S
b880: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
b890: 74 20 62 49 6e 76 65 72 73 65 3b 20 20 20 20 20  t bInverse;     
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8b0: 20 54 72 75 65 20 69 66 20 78 49 6e 76 65 72 73   True if xInvers
b8c0: 65 28 29 20 65 76 65 72 20 63 61 6c 6c 65 64 20  e() ever called 
b8d0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
b8e0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
b8f0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
b900: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
b910: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
b920: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74  tic void countSt
b930: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
b940: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
b950: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
b960: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
b970: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
b980: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
b990: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
b9a0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
b9b0: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
b9c0: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
b9d0: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
b9e0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29 20 26  type(argv[0])) &
b9f0: 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b  & p ){.    p->n+
ba00: 2b 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  +;.  }..#ifndef 
ba10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
ba20: 45 43 41 54 45 44 0a 20 20 2f 2a 20 54 68 65 20  ECATED.  /* The 
ba30: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
ba40: 65 5f 63 6f 75 6e 74 28 29 20 66 75 6e 63 74 69  e_count() functi
ba50: 6f 6e 20 69 73 20 64 65 70 72 65 63 61 74 65 64  on is deprecated
ba60: 2e 20 20 42 75 74 20 6a 75 73 74 20 74 6f 20 6d  .  But just to m
ba70: 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 69 74  ake.  ** sure it
ba80: 20 73 74 69 6c 6c 20 6f 70 65 72 61 74 65 73 20   still operates 
ba90: 63 6f 72 72 65 63 74 6c 79 2c 20 76 65 72 69 66  correctly, verif
baa0: 79 20 74 68 61 74 20 69 74 73 20 63 6f 75 6e 74  y that its count
bab0: 20 61 67 72 65 65 73 20 77 69 74 68 20 6f 75 72   agrees with our
bac0: 20 0a 20 20 2a 2a 20 69 6e 74 65 72 6e 61 6c 20   .  ** internal 
bad0: 63 6f 75 6e 74 20 77 68 65 6e 20 75 73 69 6e 67  count when using
bae0: 20 63 6f 75 6e 74 28 2a 29 20 61 6e 64 20 77 68   count(*) and wh
baf0: 65 6e 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 75  en the total cou
bb00: 6e 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 65  nt can be.  ** e
bb10: 78 70 72 65 73 73 65 64 20 61 73 20 61 20 33 32  xpressed as a 32
bb20: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  -bit integer. */
bb30: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
bb40: 3d 31 20 7c 7c 20 70 3d 3d 30 20 7c 7c 20 70 2d  =1 || p==0 || p-
bb50: 3e 6e 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  >n>0x7fffffff ||
bb60: 20 70 2d 3e 62 49 6e 76 65 72 73 65 0a 20 20 20   p->bInverse.   
bb70: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6e 3d 3d         || p->n==
bb80: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
bb90: 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29  e_count(context)
bba0: 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 20 20 20 0a   );.#endif.}   .
bbb0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e  static void coun
bbc0: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
bbd0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
bbe0: 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  xt){.  CountCtx 
bbf0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
bc00: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
bc10: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
bc20: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
bc30: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
bc40: 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a   p ? p->n : 0);.
bc50: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
bc60: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
bc70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
bc80: 6e 74 49 6e 76 65 72 73 65 28 73 71 6c 69 74 65  ntInverse(sqlite
bc90: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
bca0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
bcb0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
bcc0: 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a  .  CountCtx *p;.
bcd0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
bce0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
bcf0: 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ctx, sizeof(*p))
bd00: 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30  ;.  if( (argc==0
bd10: 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21   || SQLITE_NULL!
bd20: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
bd30: 79 70 65 28 61 72 67 76 5b 30 5d 29 29 20 26 26  ype(argv[0])) &&
bd40: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2d 2d   p ){.    p->n--
bd50: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
bd60: 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 62 49 6e  DEBUG.    p->bIn
bd70: 76 65 72 73 65 20 3d 20 31 3b 0a 23 65 6e 64 69  verse = 1;.#endi
bd80: 66 0a 20 20 7d 0a 7d 20 20 20 0a 23 65 6c 73 65  f.  }.}   .#else
bd90: 0a 23 20 64 65 66 69 6e 65 20 63 6f 75 6e 74 49  .# define countI
bda0: 6e 76 65 72 73 65 20 30 0a 23 65 6e 64 69 66 20  nverse 0.#endif 
bdb0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
bdc0: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 0a 2f 2a  INDOWFUNC */../*
bdd0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
bde0: 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20  implement min() 
bdf0: 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65 67  and max() aggreg
be00: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
be10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69  /.static void mi
be20: 6e 6d 61 78 53 74 65 70 28 0a 20 20 73 71 6c 69  nmaxStep(.  sqli
be30: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
be40: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74  text, .  int Not
be50: 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74 65 33  Used, .  sqlite3
be60: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
be70: 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20  .  Mem *pArg  = 
be80: 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a  (Mem *)argv[0];.
be90: 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20    Mem *pBest;.  
bea0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
beb0: 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20 20 70 42  (NotUsed);..  pB
bec0: 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c  est = (Mem *)sql
bed0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
bee0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
bef0: 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 29 3b  sizeof(*pBest));
bf00: 0a 20 20 69 66 28 20 21 70 42 65 73 74 20 29 20  .  if( !pBest ) 
bf10: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
bf20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
bf30: 65 28 70 41 72 67 29 3d 3d 53 51 4c 49 54 45 5f  e(pArg)==SQLITE_
bf40: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  NULL ){.    if( 
bf50: 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 20 73  pBest->flags ) s
bf60: 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d 75  qlite3SkipAccumu
bf70: 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78  latorLoad(contex
bf80: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
bf90: 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 7b 0a  pBest->flags ){.
bfa0: 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20 20      int max;.   
bfb0: 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20 20 43 6f   int cmp;.    Co
bfc0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
bfd0: 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c  qlite3GetFuncCol
bfe0: 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20  lSeq(context);. 
bff0: 20 20 20 2f 2a 20 54 68 69 73 20 73 74 65 70 20     /* This step 
c000: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
c010: 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6d 69   for both the mi
c020: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67  n() and max() ag
c030: 67 72 65 67 61 74 65 73 2c 0a 20 20 20 20 2a 2a  gregates,.    **
c040: 20 74 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72   the only differ
c050: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65  ence between the
c060: 20 74 77 6f 20 62 65 69 6e 67 20 74 68 61 74 20   two being that 
c070: 74 68 65 20 73 65 6e 73 65 20 6f 66 20 74 68 65  the sense of the
c080: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73  .    ** comparis
c090: 6f 6e 20 69 73 20 69 6e 76 65 72 74 65 64 2e 20  on is inverted. 
c0a0: 46 6f 72 20 74 68 65 20 6d 61 78 28 29 20 61 67  For the max() ag
c0b0: 67 72 65 67 61 74 65 2c 20 74 68 65 0a 20 20 20  gregate, the.   
c0c0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 73 65 72   ** sqlite3_user
c0d0: 5f 64 61 74 61 28 29 20 66 75 6e 63 74 69 6f 6e  _data() function
c0e0: 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20 2a   returns (void *
c0f0: 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28 29 20 69  )-1. For min() i
c100: 74 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 73  t.    ** returns
c110: 20 28 76 6f 69 64 20 2a 29 64 62 2c 20 77 68 65   (void *)db, whe
c120: 72 65 20 64 62 20 69 73 20 74 68 65 20 73 71 6c  re db is the sql
c130: 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20 70  ite3* database p
c140: 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a 20 54  ointer..    ** T
c150: 68 65 72 65 66 6f 72 65 20 74 68 65 20 6e 65 78  herefore the nex
c160: 74 20 73 74 61 74 65 6d 65 6e 74 20 73 65 74 73  t statement sets
c170: 20 76 61 72 69 61 62 6c 65 20 27 6d 61 78 27 20   variable 'max' 
c180: 74 6f 20 31 20 66 6f 72 20 74 68 65 20 6d 61 78  to 1 for the max
c190: 28 29 0a 20 20 20 20 2a 2a 20 61 67 67 72 65 67  ().    ** aggreg
c1a0: 61 74 65 2c 20 6f 72 20 30 20 66 6f 72 20 6d 69  ate, or 0 for mi
c1b0: 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
c1c0: 6d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  max = sqlite3_us
c1d0: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
c1e0: 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20 3d 20 73  !=0;.    cmp = s
c1f0: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
c200: 28 70 42 65 73 74 2c 20 70 41 72 67 2c 20 70 43  (pBest, pArg, pC
c210: 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 6d  oll);.    if( (m
c220: 61 78 20 26 26 20 63 6d 70 3c 30 29 20 7c 7c 20  ax && cmp<0) || 
c230: 28 21 6d 61 78 20 26 26 20 63 6d 70 3e 30 29 20  (!max && cmp>0) 
c240: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c250: 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73  VdbeMemCopy(pBes
c260: 74 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65  t, pArg);.    }e
c270: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
c280: 65 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74 6f  e3SkipAccumulato
c290: 72 4c 6f 61 64 28 63 6f 6e 74 65 78 74 29 3b 0a  rLoad(context);.
c2a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
c2b0: 20 20 20 70 42 65 73 74 2d 3e 64 62 20 3d 20 73     pBest->db = s
c2c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
c2d0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
c2e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c2f0: 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c  beMemCopy(pBest,
c300: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74   pArg);.  }.}.st
c310: 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78  atic void minMax
c320: 56 61 6c 75 65 46 69 6e 61 6c 69 7a 65 28 73 71  ValueFinalize(sq
c330: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
c340: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 62 56 61 6c  ontext, int bVal
c350: 75 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ue){.  sqlite3_v
c360: 61 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20 70 52  alue *pRes;.  pR
c370: 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61  es = (sqlite3_va
c380: 6c 75 65 20 2a 29 73 71 6c 69 74 65 33 5f 61 67  lue *)sqlite3_ag
c390: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
c3a0: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
c3b0: 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 69  f( pRes ){.    i
c3c0: 66 28 20 70 52 65 73 2d 3e 66 6c 61 67 73 20 29  f( pRes->flags )
c3d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
c3e0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
c3f0: 74 65 78 74 2c 20 70 52 65 73 29 3b 0a 20 20 20  text, pRes);.   
c400: 20 7d 0a 20 20 20 20 69 66 28 20 62 56 61 6c 75   }.    if( bValu
c410: 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  e==0 ) sqlite3Vd
c420: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65  beMemRelease(pRe
c430: 73 29 3b 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64 65  s);.  }.}.#ifnde
c440: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
c450: 4e 44 4f 57 46 55 4e 43 0a 73 74 61 74 69 63 20  NDOWFUNC.static 
c460: 76 6f 69 64 20 6d 69 6e 4d 61 78 56 61 6c 75 65  void minMaxValue
c470: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c480: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 72 65   *context){.  re
c490: 74 75 72 6e 20 6d 69 6e 4d 61 78 56 61 6c 75 65  turn minMaxValue
c4a0: 46 69 6e 61 6c 69 7a 65 28 63 6f 6e 74 65 78 74  Finalize(context
c4b0: 2c 20 31 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  , 1);.}.#else.# 
c4c0: 64 65 66 69 6e 65 20 6d 69 6e 4d 61 78 56 61 6c  define minMaxVal
c4d0: 75 65 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ue 0.#endif /* S
c4e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
c4f0: 57 46 55 4e 43 20 2a 2f 0a 73 74 61 74 69 63 20  WFUNC */.static 
c500: 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c  void minMaxFinal
c510: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
c520: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
c530: 20 72 65 74 75 72 6e 20 6d 69 6e 4d 61 78 56 61   return minMaxVa
c540: 6c 75 65 46 69 6e 61 6c 69 7a 65 28 63 6f 6e 74  lueFinalize(cont
c550: 65 78 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ext, 0);.}../*.*
c560: 2a 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 45  * group_concat(E
c570: 58 50 52 2c 20 3f 53 45 50 41 52 41 54 4f 52 3f  XPR, ?SEPARATOR?
c580: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
c590: 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70   groupConcatStep
c5a0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
c5b0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
c5c0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
c5d0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
c5e0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
c5f0: 20 2a 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63 63   *zVal;.  StrAcc
c600: 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63 6f  um *pAccum;.  co
c610: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a  nst char *zSep;.
c620: 20 20 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65 70    int nVal, nSep
c630: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
c640: 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29  ==1 || argc==2 )
c650: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
c660: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
c670: 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
c680: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 41 63   ) return;.  pAc
c690: 63 75 6d 20 3d 20 28 53 74 72 41 63 63 75 6d 2a  cum = (StrAccum*
c6a0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
c6b0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
c6c0: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63 63  xt, sizeof(*pAcc
c6d0: 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20 70 41 63  um));..  if( pAc
c6e0: 63 75 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  cum ){.    sqlit
c6f0: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
c700: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
c710: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  le(context);.   
c720: 20 69 6e 74 20 66 69 72 73 74 54 65 72 6d 20 3d   int firstTerm =
c730: 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63   pAccum->mxAlloc
c740: 3d 3d 30 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d  ==0;.    pAccum-
c750: 3e 6d 78 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e 61  >mxAlloc = db->a
c760: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
c770: 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20  IT_LENGTH];.    
c780: 69 66 28 20 21 66 69 72 73 74 54 65 72 6d 20 29  if( !firstTerm )
c790: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72 67 63  {.      if( argc
c7a0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==2 ){.        z
c7b0: 53 65 70 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  Sep = (char*)sql
c7c0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
c7d0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20  argv[1]);.      
c7e0: 20 20 6e 53 65 70 20 3d 20 73 71 6c 69 74 65 33    nSep = sqlite3
c7f0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
c800: 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  v[1]);.      }el
c810: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70  se{.        zSep
c820: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 20 20   = ",";.        
c830: 6e 53 65 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  nSep = 1;.      
c840: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 65 70  }.      if( zSep
c850: 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61   ) sqlite3_str_a
c860: 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 53  ppend(pAccum, zS
c870: 65 70 2c 20 6e 53 65 70 29 3b 0a 20 20 20 20 7d  ep, nSep);.    }
c880: 0a 20 20 20 20 7a 56 61 6c 20 3d 20 28 63 68 61  .    zVal = (cha
c890: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
c8a0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
c8b0: 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74      nVal = sqlit
c8c0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
c8d0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
c8e0: 20 7a 56 61 6c 20 29 20 73 71 6c 69 74 65 33 5f   zVal ) sqlite3_
c8f0: 73 74 72 5f 61 70 70 65 6e 64 28 70 41 63 63 75  str_append(pAccu
c900: 6d 2c 20 7a 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a  m, zVal, nVal);.
c910: 20 20 7d 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51    }.}.#ifndef SQ
c920: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
c930: 46 55 4e 43 0a 73 74 61 74 69 63 20 76 6f 69 64  FUNC.static void
c940: 20 67 72 6f 75 70 43 6f 6e 63 61 74 49 6e 76 65   groupConcatInve
c950: 72 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  rse(.  sqlite3_c
c960: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
c970: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
c980: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c990: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  rgv.){.  int n;.
c9a0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
c9b0: 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a  1 || argc==2 );.
c9c0: 20 20 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63    StrAccum *pAcc
c9d0: 75 6d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  um;.  if( sqlite
c9e0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
c9f0: 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[0])==SQLITE_NU
ca00: 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  LL ) return;.  p
ca10: 41 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63 75  Accum = (StrAccu
ca20: 6d 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  m*)sqlite3_aggre
ca30: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
ca40: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41  text, sizeof(*pA
ca50: 63 63 75 6d 29 29 3b 0a 20 20 69 66 28 20 70 41  ccum));.  if( pA
ca60: 63 63 75 6d 20 29 7b 0a 20 20 20 20 6e 20 3d 20  ccum ){.    n = 
ca70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
ca80: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
ca90: 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b    if( argc==2 ){
caa0: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 73 71 6c 69  .      n += sqli
cab0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
cac0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a  argv[1]);.    }.
cad0: 20 20 20 20 69 66 28 20 6e 3e 3d 70 41 63 63 75      if( n>=pAccu
cae0: 6d 2d 3e 6e 43 68 61 72 20 29 7b 0a 20 20 20 20  m->nChar ){.    
caf0: 20 20 70 41 63 63 75 6d 2d 3e 6e 43 68 61 72 20    pAccum->nChar 
cb00: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
cb10: 20 20 20 20 20 20 70 41 63 63 75 6d 2d 3e 6e 43        pAccum->nC
cb20: 68 61 72 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20  har -= n;.      
cb30: 6d 65 6d 6d 6f 76 65 28 70 41 63 63 75 6d 2d 3e  memmove(pAccum->
cb40: 7a 54 65 78 74 2c 20 26 70 41 63 63 75 6d 2d 3e  zText, &pAccum->
cb50: 7a 54 65 78 74 5b 6e 5d 2c 20 70 41 63 63 75 6d  zText[n], pAccum
cb60: 2d 3e 6e 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a  ->nChar);.    }.
cb70: 20 20 20 20 69 66 28 20 70 41 63 63 75 6d 2d 3e      if( pAccum->
cb80: 6e 43 68 61 72 3d 3d 30 20 29 20 70 41 63 63 75  nChar==0 ) pAccu
cb90: 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20 30 3b 0a  m->mxAlloc = 0;.
cba0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
cbb0: 66 69 6e 65 20 67 72 6f 75 70 43 6f 6e 63 61 74  fine groupConcat
cbc0: 49 6e 76 65 72 73 65 20 30 0a 23 65 6e 64 69 66  Inverse 0.#endif
cbd0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
cbe0: 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 73 74  WINDOWFUNC */.st
cbf0: 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75 70 43  atic void groupC
cc00: 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 28 73 71  oncatFinalize(sq
cc10: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
cc20: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74 72 41 63  ontext){.  StrAc
cc30: 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 70  cum *pAccum;.  p
cc40: 41 63 63 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f  Accum = sqlite3_
cc50: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
cc60: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
cc70: 20 69 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20   if( pAccum ){. 
cc80: 20 20 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61     if( pAccum->a
cc90: 63 63 45 72 72 6f 72 3d 3d 53 51 4c 49 54 45 5f  ccError==SQLITE_
cca0: 54 4f 4f 42 49 47 20 29 7b 0a 20 20 20 20 20 20  TOOBIG ){.      
ccb0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
ccc0: 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74  rror_toobig(cont
ccd0: 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ext);.    }else 
cce0: 69 66 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45  if( pAccum->accE
ccf0: 72 72 6f 72 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  rror==SQLITE_NOM
cd00: 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  EM ){.      sqli
cd10: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
cd20: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
cd30: 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a  .    }else{    .
cd40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
cd50: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
cd60: 74 2c 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  t, sqlite3StrAcc
cd70: 75 6d 46 69 6e 69 73 68 28 70 41 63 63 75 6d 29  umFinish(pAccum)
cd80: 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  , -1, .         
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
cdb0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 69 66 6e      }.  }.}.#ifn
cdc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cdd0: 57 49 4e 44 4f 57 46 55 4e 43 0a 73 74 61 74 69  WINDOWFUNC.stati
cde0: 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63  c void groupConc
cdf0: 61 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33 5f  atValue(sqlite3_
ce00: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
ce10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72  ){.  sqlite3_str
ce20: 20 2a 70 41 63 63 75 6d 3b 0a 20 20 70 41 63 63   *pAccum;.  pAcc
ce30: 75 6d 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  um = (sqlite3_st
ce40: 72 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  r*)sqlite3_aggre
ce50: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
ce60: 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  text, 0);.  if( 
ce70: 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20 69 66  pAccum ){.    if
ce80: 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72 72  ( pAccum->accErr
ce90: 6f 72 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49  or==SQLITE_TOOBI
cea0: 47 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G ){.      sqlit
ceb0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
cec0: 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b  toobig(context);
ced0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
cee0: 41 63 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72 3d  Accum->accError=
cef0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
cf00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
cf10: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
cf20: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
cf30: 7d 65 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20  }else{    .     
cf40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
cf50: 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72  xt = sqlite3_str
cf60: 5f 76 61 6c 75 65 28 70 41 63 63 75 6d 29 3b 0a  _value(pAccum);.
cf70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
cf80: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
cf90: 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51  t, zText, -1, SQ
cfa0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
cfb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
cfc0: 73 65 0a 23 20 64 65 66 69 6e 65 20 67 72 6f 75  se.# define grou
cfd0: 70 43 6f 6e 63 61 74 56 61 6c 75 65 20 30 0a 23  pConcatValue 0.#
cfe0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
cff0: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
d000: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
d010: 6f 75 74 69 6e 65 20 64 6f 65 73 20 70 65 72 2d  outine does per-
d020: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 75 6e 63 74  connection funct
d030: 69 6f 6e 20 72 65 67 69 73 74 72 61 74 69 6f 6e  ion registration
d040: 2e 20 20 4d 6f 73 74 0a 2a 2a 20 6f 66 20 74 68  .  Most.** of th
d050: 65 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  e built-in funct
d060: 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 70  ions above are p
d070: 61 72 74 20 6f 66 20 74 68 65 20 67 6c 6f 62 61  art of the globa
d080: 6c 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 2e 0a  l function set..
d090: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d0a0: 6f 6e 6c 79 20 64 65 61 6c 73 20 77 69 74 68 20  only deals with 
d0b0: 74 68 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e  those that are n
d0c0: 6f 74 20 67 6c 6f 62 61 6c 2e 0a 2a 2f 0a 76 6f  ot global..*/.vo
d0d0: 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  id sqlite3Regist
d0e0: 65 72 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42  erPerConnectionB
d0f0: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
d100: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
d110: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
d120: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
d130: 6f 6e 28 64 62 2c 20 22 4d 41 54 43 48 22 2c 20  on(db, "MATCH", 
d140: 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  2);.  assert( rc
d150: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
d160: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
d170: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
d180: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
d190: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
d1a0: 28 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  (db);.  }.}../*.
d1b0: 2a 2a 20 53 65 74 20 74 68 65 20 4c 49 4b 45 4f  ** Set the LIKEO
d1c0: 50 54 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 32  PT flag on the 2
d1d0: 2d 61 72 67 75 6d 65 6e 74 20 66 75 6e 63 74 69  -argument functi
d1e0: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
d1f0: 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  n name..*/.stati
d200: 63 20 76 6f 69 64 20 73 65 74 4c 69 6b 65 4f 70  c void setLikeOp
d210: 74 46 6c 61 67 28 73 71 6c 69 74 65 33 20 2a 64  tFlag(sqlite3 *d
d220: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
d230: 4e 61 6d 65 2c 20 75 38 20 66 6c 61 67 56 61 6c  Name, u8 flagVal
d240: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44  ){.  FuncDef *pD
d250: 65 66 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c  ef;.  pDef = sql
d260: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
d270: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 32 2c 20 53  (db, zName, 2, S
d280: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
d290: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65    if( ALWAYS(pDe
d2a0: 66 29 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e  f) ){.    pDef->
d2b0: 66 75 6e 63 46 6c 61 67 73 20 7c 3d 20 66 6c 61  funcFlags |= fla
d2c0: 67 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gVal;.  }.}../*.
d2d0: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
d2e0: 62 75 69 6c 74 2d 69 6e 20 4c 49 4b 45 20 61 6e  built-in LIKE an
d2f0: 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73  d GLOB functions
d300: 2e 20 20 54 68 65 20 63 61 73 65 53 65 6e 73 69  .  The caseSensi
d310: 74 69 76 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  tive.** paramete
d320: 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  r determines whe
d330: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
d340: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73  LIKE operator is
d350: 20 63 61 73 65 0a 2a 2a 20 73 65 6e 73 69 74 69   case.** sensiti
d360: 76 65 2e 20 20 47 4c 4f 42 20 69 73 20 61 6c 77  ve.  GLOB is alw
d370: 61 79 73 20 63 61 73 65 20 73 65 6e 73 69 74 69  ays case sensiti
d380: 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ve..*/.void sqli
d390: 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46  te3RegisterLikeF
d3a0: 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33  unctions(sqlite3
d3b0: 20 2a 64 62 2c 20 69 6e 74 20 63 61 73 65 53 65   *db, int caseSe
d3c0: 6e 73 69 74 69 76 65 29 7b 0a 20 20 73 74 72 75  nsitive){.  stru
d3d0: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a  ct compareInfo *
d3e0: 70 49 6e 66 6f 3b 0a 20 20 69 66 28 20 63 61 73  pInfo;.  if( cas
d3f0: 65 53 65 6e 73 69 74 69 76 65 20 29 7b 0a 20 20  eSensitive ){.  
d400: 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63    pInfo = (struc
d410: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26  t compareInfo*)&
d420: 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d  likeInfoAlt;.  }
d430: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 20  else{.    pInfo 
d440: 3d 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72  = (struct compar
d450: 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f  eInfo*)&likeInfo
d460: 4e 6f 72 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Norm;.  }.  sqli
d470: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
d480: 2c 20 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c  , "like", 2, SQL
d490: 49 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c  ITE_UTF8, pInfo,
d4a0: 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c   likeFunc, 0, 0,
d4b0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   0, 0, 0);.  sql
d4c0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
d4d0: 62 2c 20 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51  b, "like", 3, SQ
d4e0: 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f  LITE_UTF8, pInfo
d4f0: 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30  , likeFunc, 0, 0
d500: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
d510: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
d520: 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32 2c 20 53  db, "glob", 2, S
d530: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
d540: 20 20 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61     (struct compa
d550: 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62 49 6e 66  reInfo*)&globInf
d560: 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20  o, likeFunc, 0, 
d570: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  0, 0, 0, 0);.  s
d580: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62  etLikeOptFlag(db
d590: 2c 20 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45  , "glob", SQLITE
d5a0: 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c  _FUNC_LIKE | SQL
d5b0: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a  ITE_FUNC_CASE);.
d5c0: 20 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67    setLikeOptFlag
d5d0: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20  (db, "like", .  
d5e0: 20 20 20 20 63 61 73 65 53 65 6e 73 69 74 69 76      caseSensitiv
d5f0: 65 20 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  e ? (SQLITE_FUNC
d600: 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46  _LIKE | SQLITE_F
d610: 55 4e 43 5f 43 41 53 45 29 20 3a 20 53 51 4c 49  UNC_CASE) : SQLI
d620: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d  TE_FUNC_LIKE);.}
d630: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f  ../*.** pExpr po
d640: 69 6e 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65  ints to an expre
d650: 73 73 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c  ssion which impl
d660: 65 6d 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f  ements a functio
d670: 6e 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20  n.  If.** it is 
d680: 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61  appropriate to a
d690: 70 70 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70  pply the LIKE op
d6a0: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68  timization to th
d6b0: 61 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74  at function.** t
d6c0: 68 65 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74  hen set aWc[0] t
d6d0: 68 72 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f  hrough aWc[2] to
d6e0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
d6f0: 61 72 61 63 74 65 72 73 20 61 6e 64 20 74 68 65  aracters and the
d700: 0a 2a 2a 20 65 73 63 61 70 65 20 63 68 61 72 61  .** escape chara
d710: 63 74 65 72 20 61 6e 64 20 74 68 65 6e 20 72 65  cter and then re
d720: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 74  turn TRUE.  If t
d730: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  he function is n
d740: 6f 74 20 61 20 0a 2a 2a 20 4c 49 4b 45 2d 73 74  ot a .** LIKE-st
d750: 79 6c 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 65  yle function the
d760: 6e 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  n return FALSE..
d770: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
d780: 73 69 6f 6e 20 22 61 20 4c 49 4b 45 20 62 20 45  sion "a LIKE b E
d790: 53 43 41 50 45 20 63 22 20 69 73 20 6f 6e 6c 79  SCAPE c" is only
d7a0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
d7b0: 6c 69 64 20 4c 49 4b 45 0a 2a 2a 20 6f 70 65 72  lid LIKE.** oper
d7c0: 61 74 6f 72 20 69 66 20 63 20 69 73 20 61 20 73  ator if c is a s
d7d0: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 74 68  tring literal th
d7e0: 61 74 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  at is exactly on
d7f0: 65 20 62 79 74 65 20 69 6e 20 6c 65 6e 67 74 68  e byte in length
d800: 2e 0a 2a 2a 20 54 68 61 74 20 6f 6e 65 20 62 79  ..** That one by
d810: 74 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  te is stored in 
d820: 61 57 63 5b 33 5d 2e 20 20 61 57 63 5b 33 5d 20  aWc[3].  aWc[3] 
d830: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
d840: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
d850: 20 45 53 43 41 50 45 20 63 6c 61 75 73 65 2e 0a   ESCAPE clause..
d860: 2a 2a 0a 2a 2a 20 2a 70 49 73 4e 6f 63 61 73 65  **.** *pIsNocase
d870: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
d880: 69 66 20 75 70 70 65 72 63 61 73 65 20 61 6e 64  if uppercase and
d890: 20 6c 6f 77 65 72 63 61 73 65 20 61 72 65 20 65   lowercase are e
d8a0: 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 0a 2a 2a  quivalent for.**
d8b0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 28 64   the function (d
d8c0: 65 66 61 75 6c 74 20 66 6f 72 20 4c 49 4b 45 29  efault for LIKE)
d8d0: 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  .  If the functi
d8e0: 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 69 73  on makes the dis
d8f0: 74 69 6e 63 74 69 6f 6e 0a 2a 2a 20 62 65 74 77  tinction.** betw
d900: 65 65 6e 20 75 70 70 65 72 63 61 73 65 20 61 6e  een uppercase an
d910: 64 20 6c 6f 77 65 72 63 61 73 65 20 28 61 73 20  d lowercase (as 
d920: 64 6f 65 73 20 47 4c 4f 42 29 20 74 68 65 6e 20  does GLOB) then 
d930: 2a 70 49 73 4e 6f 63 61 73 65 20 69 73 20 73 65  *pIsNocase is se
d940: 74 20 74 6f 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a  t to.** false..*
d950: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 4c  /.int sqlite3IsL
d960: 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69  ikeFunction(sqli
d970: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
d980: 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73 4e 6f  Expr, int *pIsNo
d990: 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57 63 29  case, char *aWc)
d9a0: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65  {.  FuncDef *pDe
d9b0: 66 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  f;.  int nExpr;.
d9c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
d9d0: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20  =TK_FUNCTION || 
d9e0: 21 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  !pExpr->x.pList 
d9f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
da00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
da10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
da20: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
da30: 65 63 74 29 20 29 3b 0a 20 20 6e 45 78 70 72 20  ect) );.  nExpr 
da40: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
da50: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 44 65 66 20  ->nExpr;.  pDef 
da60: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
da70: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2d  ction(db, pExpr-
da80: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 45 78 70 72  >u.zToken, nExpr
da90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
daa0: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
dab0: 44 65 66 3d 3d 30 29 20 7c 7c 20 28 70 44 65 66  Def==0) || (pDef
dac0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
dad0: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d  LITE_FUNC_LIKE)=
dae0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
daf0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 45   0;.  }.  if( nE
db00: 78 70 72 3c 33 20 29 7b 0a 20 20 20 20 61 57 63  xpr<3 ){.    aWc
db10: 5b 33 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  [3] = 0;.  }else
db20: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 73 63  {.    Expr *pEsc
db30: 61 70 65 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ape = pExpr->x.p
db40: 4c 69 73 74 2d 3e 61 5b 32 5d 2e 70 45 78 70 72  List->a[2].pExpr
db50: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 73 63  ;.    char *zEsc
db60: 61 70 65 3b 0a 20 20 20 20 69 66 28 20 70 45 73  ape;.    if( pEs
db70: 63 61 70 65 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  cape->op!=TK_STR
db80: 49 4e 47 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ING ) return 0;.
db90: 20 20 20 20 7a 45 73 63 61 70 65 20 3d 20 70 45      zEscape = pE
dba0: 73 63 61 70 65 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  scape->u.zToken;
dbb0: 0a 20 20 20 20 69 66 28 20 7a 45 73 63 61 70 65  .    if( zEscape
dbc0: 5b 30 5d 3d 3d 30 20 7c 7c 20 7a 45 73 63 61 70  [0]==0 || zEscap
dbd0: 65 5b 31 5d 21 3d 30 20 29 20 72 65 74 75 72 6e  e[1]!=0 ) return
dbe0: 20 30 3b 0a 20 20 20 20 61 57 63 5b 33 5d 20 3d   0;.    aWc[3] =
dbf0: 20 7a 45 73 63 61 70 65 5b 30 5d 3b 0a 20 20 7d   zEscape[0];.  }
dc00: 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70  ..  /* The memcp
dc10: 79 28 29 20 73 74 61 74 65 6d 65 6e 74 20 61 73  y() statement as
dc20: 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 77  sumes that the w
dc30: 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65  ildcard characte
dc40: 72 73 20 61 72 65 0a 20 20 2a 2a 20 74 68 65 20  rs are.  ** the 
dc50: 66 69 72 73 74 20 74 68 72 65 65 20 73 74 61 74  first three stat
dc60: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
dc70: 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75 63 74  mpareInfo struct
dc80: 75 72 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 61  ure.  The.  ** a
dc90: 73 73 65 72 74 73 28 29 20 74 68 61 74 20 66 6f  sserts() that fo
dca0: 6c 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  llow verify that
dcb0: 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2f   assumption.  */
dcc0: 0a 20 20 6d 65 6d 63 70 79 28 61 57 63 2c 20 70  .  memcpy(aWc, p
dcd0: 44 65 66 2d 3e 70 55 73 65 72 44 61 74 61 2c 20  Def->pUserData, 
dce0: 33 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63  3);.  assert( (c
dcf0: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
dd00: 74 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b  t == (char*)&lik
dd10: 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 41 6c  eInfoAlt.matchAl
dd20: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26  l );.  assert( &
dd30: 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66  ((char*)&likeInf
dd40: 6f 41 6c 74 29 5b 31 5d 20 3d 3d 20 28 63 68 61  oAlt)[1] == (cha
dd50: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e  r*)&likeInfoAlt.
dd60: 6d 61 74 63 68 4f 6e 65 20 29 3b 0a 20 20 61 73  matchOne );.  as
dd70: 73 65 72 74 28 20 26 28 28 63 68 61 72 2a 29 26  sert( &((char*)&
dd80: 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 32 5d 20  likeInfoAlt)[2] 
dd90: 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49  == (char*)&likeI
dda0: 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 53 65 74 20  nfoAlt.matchSet 
ddb0: 29 3b 0a 20 20 2a 70 49 73 4e 6f 63 61 73 65 20  );.  *pIsNocase 
ddc0: 3d 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  = (pDef->funcFla
ddd0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
dde0: 5f 43 41 53 45 29 3d 3d 30 3b 0a 20 20 72 65 74  _CASE)==0;.  ret
ddf0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
de00: 41 6c 6c 20 6f 66 20 74 68 65 20 46 75 6e 63 44  All of the FuncD
de10: 65 66 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ef structures in
de20: 20 74 68 65 20 61 42 75 69 6c 74 69 6e 46 75 6e   the aBuiltinFun
de30: 63 5b 5d 20 61 72 72 61 79 20 61 62 6f 76 65 0a  c[] array above.
de40: 2a 2a 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c  ** to the global
de50: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 68 20 74   function hash t
de60: 61 62 6c 65 2e 20 20 54 68 69 73 20 6f 63 63 75  able.  This occu
de70: 72 73 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65  rs at start-time
de80: 20 28 61 73 0a 2a 2a 20 61 20 63 6f 6e 73 65 71   (as.** a conseq
de90: 75 65 6e 63 65 20 6f 66 20 63 61 6c 6c 69 6e 67  uence of calling
dea0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
deb0: 69 7a 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 41 66  ize())..**.** Af
dec0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
ded0: 20 72 75 6e 73 0a 2a 2f 0a 76 6f 69 64 20 73 71   runs.*/.void sq
dee0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69  lite3RegisterBui
def0: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 76 6f  ltinFunctions(vo
df00: 69 64 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  id){.  /*.  ** T
df10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
df20: 61 79 20 68 6f 6c 64 73 20 46 75 6e 63 44 65 66  ay holds FuncDef
df30: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
df40: 61 6c 6c 20 6f 66 20 74 68 65 20 66 75 6e 63 74  all of the funct
df50: 69 6f 6e 73 0a 20 20 2a 2a 20 64 65 66 69 6e 65  ions.  ** define
df60: 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a  d in this file..
df70: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 72    **.  ** The ar
df80: 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ray cannot be co
df90: 6e 73 74 61 6e 74 20 73 69 6e 63 65 20 63 68 61  nstant since cha
dfa0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
dfb0: 20 74 68 65 0a 20 20 2a 2a 20 46 75 6e 63 44 65   the.  ** FuncDe
dfc0: 66 2e 70 48 61 73 68 20 65 6c 65 6d 65 6e 74 73  f.pHash elements
dfd0: 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 2e 20   at start-time. 
dfe0: 20 54 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   The elements of
dff0: 20 74 68 69 73 20 61 72 72 61 79 0a 20 20 2a 2a   this array.  **
e000: 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
e010: 66 74 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74  fter initializat
e020: 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ion is complete.
e030: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 70  .  **.  ** For p
e040: 65 61 6b 20 65 66 66 69 63 69 65 6e 63 79 2c 20  eak efficiency, 
e050: 70 75 74 20 74 68 65 20 6d 6f 73 74 20 66 72 65  put the most fre
e060: 71 75 65 6e 74 6c 79 20 75 73 65 64 20 66 75 6e  quently used fun
e070: 63 74 69 6f 6e 20 6c 61 73 74 2e 0a 20 20 2a 2f  ction last..  */
e080: 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63 44 65  .  static FuncDe
e090: 66 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d  f aBuiltinFunc[]
e0a0: 20 3d 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49   = {.#ifdef SQLI
e0b0: 54 45 5f 53 4f 55 4e 44 45 58 0a 20 20 20 20 46  TE_SOUNDEX.    F
e0c0: 55 4e 43 54 49 4f 4e 28 73 6f 75 6e 64 65 78 2c  UNCTION(soundex,
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
e0e0: 2c 20 30 2c 20 73 6f 75 6e 64 65 78 46 75 6e 63  , 0, soundexFunc
e0f0: 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a        ),.#endif.
e100: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e110: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
e120: 4f 4e 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e  ON.    VFUNCTION
e130: 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c  (load_extension,
e140: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 61      1, 0, 0, loa
e150: 64 45 78 74 20 20 20 20 20 20 20 20 20 20 29 2c  dExt          ),
e160: 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 6c  .    VFUNCTION(l
e170: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20  oad_extension,  
e180: 20 20 32 2c 20 30 2c 20 30 2c 20 6c 6f 61 64 45    2, 0, 0, loadE
e190: 78 74 20 20 20 20 20 20 20 20 20 20 29 2c 0a 23  xt          ),.#
e1a0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
e1b0: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
e1c0: 54 49 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f  TION.    FUNCTIO
e1d0: 4e 28 73 71 6c 69 74 65 5f 63 72 79 70 74 2c 20  N(sqlite_crypt, 
e1e0: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 73        2, 0, 0, s
e1f0: 71 6c 69 74 65 33 43 72 79 70 74 46 75 6e 63 20  qlite3CryptFunc 
e200: 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  ),.#endif.#ifnde
e210: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
e220: 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
e230: 53 0a 20 20 20 20 44 46 55 4e 43 54 49 4f 4e 28  S.    DFUNCTION(
e240: 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70  sqlite_compileop
e250: 74 69 6f 6e 5f 75 73 65 64 2c 31 2c 20 30 2c 20  tion_used,1, 0, 
e260: 30 2c 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  0, compileoption
e270: 75 73 65 64 46 75 6e 63 20 20 29 2c 0a 20 20 20  usedFunc  ),.   
e280: 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74   DFUNCTION(sqlit
e290: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
e2a0: 67 65 74 2c 20 31 2c 20 30 2c 20 30 2c 20 63 6f  get, 1, 0, 0, co
e2b0: 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75  mpileoptiongetFu
e2c0: 6e 63 20 20 29 2c 0a 23 65 6e 64 69 66 20 2f 2a  nc  ),.#endif /*
e2d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
e2e0: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
e2f0: 20 2a 2f 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   */.    FUNCTION
e300: 32 28 75 6e 6c 69 6b 65 6c 79 2c 20 20 20 20 20  2(unlikely,     
e310: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6e 6f       1, 0, 0, no
e320: 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  opFunc,  SQLITE_
e330: 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a  FUNC_UNLIKELY),.
e340: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c 69      FUNCTION2(li
e350: 6b 65 6c 69 68 6f 6f 64 2c 20 20 20 20 20 20 20  kelihood,       
e360: 20 32 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75   2, 0, 0, noopFu
e370: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
e380: 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20  _UNLIKELY),.    
e390: 46 55 4e 43 54 49 4f 4e 32 28 6c 69 6b 65 6c 79  FUNCTION2(likely
e3a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ,            1, 
e3b0: 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20  0, 0, noopFunc, 
e3c0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c   SQLITE_FUNC_UNL
e3d0: 49 4b 45 4c 59 29 2c 0a 23 69 66 64 65 66 20 53  IKELY),.#ifdef S
e3e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
e3f0: 46 55 4e 43 54 49 4f 4e 32 28 61 66 66 69 6e 69  FUNCTION2(affini
e400: 74 79 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  ty,          1, 
e410: 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20  0, 0, noopFunc, 
e420: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46   SQLITE_FUNC_AFF
e430: 49 4e 49 54 59 29 2c 0a 23 65 6e 64 69 66 0a 23  INITY),.#endif.#
e440: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e450: 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
e460: 55 4e 43 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  UNC.    FUNCTION
e470: 32 28 73 71 6c 69 74 65 5f 6f 66 66 73 65 74 2c  2(sqlite_offset,
e480: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6e 6f       1, 0, 0, no
e490: 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  opFunc,  SQLITE_
e4a0: 46 55 4e 43 5f 4f 46 46 53 45 54 7c 0a 20 20 20  FUNC_OFFSET|.   
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59    SQLITE_FUNC_TY
e4f0: 50 45 4f 46 29 2c 0a 23 65 6e 64 69 66 0a 20 20  PEOF),.#endif.  
e500: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d    FUNCTION(ltrim
e510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
e520: 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 1, 0, trimFunc
e530: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
e540: 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20  FUNCTION(ltrim, 
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
e560: 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  1, 0, trimFunc  
e570: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
e580: 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20  NCTION(rtrim,   
e590: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 32 2c             1, 2,
e5a0: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
e5b0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
e5c0: 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20  TION(rtrim,     
e5d0: 20 20 20 20 20 20 20 20 20 32 2c 20 32 2c 20 30           2, 2, 0
e5e0: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
e5f0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e600: 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20  ON(trim,        
e610: 20 20 20 20 20 20 20 31 2c 20 33 2c 20 30 2c 20         1, 3, 0, 
e620: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
e630: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e640: 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20  (trim,          
e650: 20 20 20 20 20 32 2c 20 33 2c 20 30 2c 20 74 72       2, 3, 0, tr
e660: 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29  imFunc         )
e670: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d  ,.    FUNCTION(m
e680: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
e690: 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d    -1, 0, 1, minm
e6a0: 61 78 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  axFunc       ),.
e6b0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e      FUNCTION(min
e6c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e6d0: 20 30 2c 20 30 2c 20 31 2c 20 30 20 20 20 20 20   0, 0, 1, 0     
e6e0: 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20             ),.  
e6f0: 20 20 57 41 47 47 52 45 47 41 54 45 28 6d 69 6e    WAGGREGATE(min
e700: 2c 20 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61  , 1, 0, 1, minma
e710: 78 53 74 65 70 2c 20 6d 69 6e 4d 61 78 46 69 6e  xStep, minMaxFin
e720: 61 6c 69 7a 65 2c 20 6d 69 6e 4d 61 78 56 61 6c  alize, minMaxVal
e730: 75 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ue, 0,.         
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
e770: 4d 41 58 20 29 2c 0a 20 20 20 20 46 55 4e 43 54  MAX ),.    FUNCT
e780: 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20  ION(max,        
e790: 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 31 2c         -1, 1, 1,
e7a0: 20 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20 20 20   minmaxFunc     
e7b0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
e7c0: 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20  N(max,          
e7d0: 20 20 20 20 20 20 30 2c 20 31 2c 20 31 2c 20 30        0, 1, 1, 0
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 29 2c 0a 20 20 20 20 57 41 47 47 52 45 47 41 54  ),.    WAGGREGAT
e800: 45 28 6d 61 78 2c 20 31 2c 20 31 2c 20 31 2c 20  E(max, 1, 1, 1, 
e810: 6d 69 6e 6d 61 78 53 74 65 70 2c 20 6d 69 6e 4d  minmaxStep, minM
e820: 61 78 46 69 6e 61 6c 69 7a 65 2c 20 6d 69 6e 4d  axFinalize, minM
e830: 61 78 56 61 6c 75 65 2c 20 30 2c 0a 20 20 20 20  axValue, 0,.    
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e        SQLITE_FUN
e870: 43 5f 4d 49 4e 4d 41 58 20 29 2c 0a 20 20 20 20  C_MINMAX ),.    
e880: 46 55 4e 43 54 49 4f 4e 32 28 74 79 70 65 6f 66  FUNCTION2(typeof
e890: 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ,            1, 
e8a0: 30 2c 20 30 2c 20 74 79 70 65 6f 66 46 75 6e 63  0, 0, typeofFunc
e8b0: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  ,  SQLITE_FUNC_T
e8c0: 59 50 45 4f 46 29 2c 0a 20 20 20 20 46 55 4e 43  YPEOF),.    FUNC
e8d0: 54 49 4f 4e 32 28 6c 65 6e 67 74 68 2c 20 20 20  TION2(length,   
e8e0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
e8f0: 2c 20 6c 65 6e 67 74 68 46 75 6e 63 2c 20 20 53  , lengthFunc,  S
e900: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
e910: 48 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  H),.    FUNCTION
e920: 28 69 6e 73 74 72 2c 20 20 20 20 20 20 20 20 20  (instr,         
e930: 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 69 6e       2, 0, 0, in
e940: 73 74 72 46 75 6e 63 20 20 20 20 20 20 20 20 29  strFunc        )
e950: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 70  ,.    FUNCTION(p
e960: 72 69 6e 74 66 2c 20 20 20 20 20 20 20 20 20 20  rintf,          
e970: 20 20 2d 31 2c 20 30 2c 20 30 2c 20 70 72 69 6e    -1, 0, 0, prin
e980: 74 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  tfFunc       ),.
e990: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 6e 69      FUNCTION(uni
e9a0: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
e9b0: 20 31 2c 20 30 2c 20 30 2c 20 75 6e 69 63 6f 64   1, 0, 0, unicod
e9c0: 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20  eFunc      ),.  
e9d0: 20 20 46 55 4e 43 54 49 4f 4e 28 63 68 61 72 2c    FUNCTION(char,
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
e9f0: 2c 20 30 2c 20 30 2c 20 63 68 61 72 46 75 6e 63  , 0, 0, charFunc
ea00: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
ea10: 46 55 4e 43 54 49 4f 4e 28 61 62 73 2c 20 20 20  FUNCTION(abs,   
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
ea30: 30 2c 20 30 2c 20 61 62 73 46 75 6e 63 20 20 20  0, 0, absFunc   
ea40: 20 20 20 20 20 20 20 29 2c 0a 23 69 66 6e 64 65         ),.#ifnde
ea50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
ea60: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
ea70: 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c   FUNCTION(round,
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
ea90: 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63   0, 0, roundFunc
eaa0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
eab0: 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20  UNCTION(round,  
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
ead0: 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20  , 0, roundFunc  
eae0: 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a        ),.#endif.
eaf0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 70 70      FUNCTION(upp
eb00: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
eb10: 20 31 2c 20 30 2c 20 30 2c 20 75 70 70 65 72 46   1, 0, 0, upperF
eb20: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20  unc        ),.  
eb30: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77 65 72    FUNCTION(lower
eb40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
eb50: 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46 75 6e  , 0, 0, lowerFun
eb60: 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  c        ),.    
eb70: 46 55 4e 43 54 49 4f 4e 28 68 65 78 2c 20 20 20  FUNCTION(hex,   
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
eb90: 30 2c 20 30 2c 20 68 65 78 46 75 6e 63 20 20 20  0, 0, hexFunc   
eba0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
ebb0: 4e 43 54 49 4f 4e 32 28 69 66 6e 75 6c 6c 2c 20  NCTION2(ifnull, 
ebc0: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
ebd0: 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53   0, noopFunc,  S
ebe0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
ebf0: 53 43 45 29 2c 0a 20 20 20 20 56 46 55 4e 43 54  SCE),.    VFUNCT
ec00: 49 4f 4e 28 72 61 6e 64 6f 6d 2c 20 20 20 20 20  ION(random,     
ec10: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
ec20: 72 61 6e 64 6f 6d 46 75 6e 63 20 20 20 20 20 20  randomFunc      
ec30: 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f   ),.    VFUNCTIO
ec40: 4e 28 72 61 6e 64 6f 6d 62 6c 6f 62 2c 20 20 20  N(randomblob,   
ec50: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 72 61       1, 0, 0, ra
ec60: 6e 64 6f 6d 42 6c 6f 62 20 20 20 20 20 20 20 29  ndomBlob       )
ec70: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6e  ,.    FUNCTION(n
ec80: 75 6c 6c 69 66 2c 20 20 20 20 20 20 20 20 20 20  ullif,          
ec90: 20 20 20 32 2c 20 30 2c 20 31 2c 20 6e 75 6c 6c     2, 0, 1, null
eca0: 69 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  ifFunc       ),.
ecb0: 20 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 73 71      DFUNCTION(sq
ecc0: 6c 69 74 65 5f 76 65 72 73 69 6f 6e 2c 20 20 20  lite_version,   
ecd0: 20 30 2c 20 30 2c 20 30 2c 20 76 65 72 73 69 6f   0, 0, 0, versio
ece0: 6e 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20  nFunc      ),.  
ecf0: 20 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69    DFUNCTION(sqli
ed00: 74 65 5f 73 6f 75 72 63 65 5f 69 64 2c 20 20 30  te_source_id,  0
ed10: 2c 20 30 2c 20 30 2c 20 73 6f 75 72 63 65 69 64  , 0, 0, sourceid
ed20: 46 75 6e 63 20 20 20 20 20 29 2c 0a 20 20 20 20  Func     ),.    
ed30: 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f  FUNCTION(sqlite_
ed40: 6c 6f 67 2c 20 20 20 20 20 20 20 20 20 32 2c 20  log,         2, 
ed50: 30 2c 20 30 2c 20 65 72 72 6c 6f 67 46 75 6e 63  0, 0, errlogFunc
ed60: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
ed70: 4e 43 54 49 4f 4e 28 71 75 6f 74 65 2c 20 20 20  NCTION(quote,   
ed80: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
ed90: 20 30 2c 20 71 75 6f 74 65 46 75 6e 63 20 20 20   0, quoteFunc   
eda0: 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55 4e       ),.    VFUN
edb0: 43 54 49 4f 4e 28 6c 61 73 74 5f 69 6e 73 65 72  CTION(last_inser
edc0: 74 5f 72 6f 77 69 64 2c 20 30 2c 20 30 2c 20 30  t_rowid, 0, 0, 0
edd0: 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  , last_insert_ro
ede0: 77 69 64 29 2c 0a 20 20 20 20 56 46 55 4e 43 54  wid),.    VFUNCT
edf0: 49 4f 4e 28 63 68 61 6e 67 65 73 2c 20 20 20 20  ION(changes,    
ee00: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
ee10: 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 20 20  changes         
ee20: 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f   ),.    VFUNCTIO
ee30: 4e 28 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 2c  N(total_changes,
ee40: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 74 6f       0, 0, 0, to
ee50: 74 61 6c 5f 63 68 61 6e 67 65 73 20 20 20 20 29  tal_changes    )
ee60: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72  ,.    FUNCTION(r
ee70: 65 70 6c 61 63 65 2c 20 20 20 20 20 20 20 20 20  eplace,         
ee80: 20 20 20 33 2c 20 30 2c 20 30 2c 20 72 65 70 6c     3, 0, 0, repl
ee90: 61 63 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a  aceFunc      ),.
eea0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 7a 65 72      FUNCTION(zer
eeb0: 6f 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 20  oblob,          
eec0: 20 31 2c 20 30 2c 20 30 2c 20 7a 65 72 6f 62 6c   1, 0, 0, zerobl
eed0: 6f 62 46 75 6e 63 20 20 20 20 20 29 2c 0a 20 20  obFunc     ),.  
eee0: 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62 73 74    FUNCTION(subst
eef0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32  r,             2
ef00: 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72 46 75  , 0, 0, substrFu
ef10: 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  nc       ),.    
ef20: 46 55 4e 43 54 49 4f 4e 28 73 75 62 73 74 72 2c  FUNCTION(substr,
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20               3, 
ef40: 30 2c 20 30 2c 20 73 75 62 73 74 72 46 75 6e 63  0, 0, substrFunc
ef50: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 57 41         ),.    WA
ef60: 47 47 52 45 47 41 54 45 28 73 75 6d 2c 20 20 20  GGREGATE(sum,   
ef70: 31 2c 30 2c 30 2c 20 73 75 6d 53 74 65 70 2c 20  1,0,0, sumStep, 
ef80: 73 75 6d 46 69 6e 61 6c 69 7a 65 2c 20 73 75 6d  sumFinalize, sum
ef90: 46 69 6e 61 6c 69 7a 65 2c 20 73 75 6d 49 6e 76  Finalize, sumInv
efa0: 65 72 73 65 2c 20 30 29 2c 0a 20 20 20 20 57 41  erse, 0),.    WA
efb0: 47 47 52 45 47 41 54 45 28 74 6f 74 61 6c 2c 20  GGREGATE(total, 
efc0: 31 2c 30 2c 30 2c 20 73 75 6d 53 74 65 70 2c 74  1,0,0, sumStep,t
efd0: 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 2c 74 6f 74  otalFinalize,tot
efe0: 61 6c 46 69 6e 61 6c 69 7a 65 2c 73 75 6d 49 6e  alFinalize,sumIn
eff0: 76 65 72 73 65 2c 20 30 29 2c 0a 20 20 20 20 57  verse, 0),.    W
f000: 41 47 47 52 45 47 41 54 45 28 61 76 67 2c 20 20  AGGREGATE(avg,  
f010: 20 31 2c 30 2c 30 2c 20 73 75 6d 53 74 65 70 2c   1,0,0, sumStep,
f020: 20 61 76 67 46 69 6e 61 6c 69 7a 65 2c 20 61 76   avgFinalize, av
f030: 67 46 69 6e 61 6c 69 7a 65 2c 20 73 75 6d 49 6e  gFinalize, sumIn
f040: 76 65 72 73 65 2c 20 30 29 2c 0a 20 20 20 20 57  verse, 0),.    W
f050: 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e 74 2c  AGGREGATE(count,
f060: 20 30 2c 30 2c 30 2c 20 63 6f 75 6e 74 53 74 65   0,0,0, countSte
f070: 70 2c 20 0a 20 20 20 20 20 20 20 20 63 6f 75 6e  p, .        coun
f080: 74 46 69 6e 61 6c 69 7a 65 2c 20 63 6f 75 6e 74  tFinalize, count
f090: 46 69 6e 61 6c 69 7a 65 2c 20 63 6f 75 6e 74 49  Finalize, countI
f0a0: 6e 76 65 72 73 65 2c 20 53 51 4c 49 54 45 5f 46  nverse, SQLITE_F
f0b0: 55 4e 43 5f 43 4f 55 4e 54 20 20 29 2c 0a 20 20  UNC_COUNT  ),.  
f0c0: 20 20 57 41 47 47 52 45 47 41 54 45 28 63 6f 75    WAGGREGATE(cou
f0d0: 6e 74 2c 20 31 2c 30 2c 30 2c 20 63 6f 75 6e 74  nt, 1,0,0, count
f0e0: 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 63  Step, .        c
f0f0: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 20 63 6f  ountFinalize, co
f100: 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 20 63 6f 75  untFinalize, cou
f110: 6e 74 49 6e 76 65 72 73 65 2c 20 30 20 20 29 2c  ntInverse, 0  ),
f120: 0a 20 20 20 20 57 41 47 47 52 45 47 41 54 45 28  .    WAGGREGATE(
f130: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20 31 2c  group_concat, 1,
f140: 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63   0, 0, groupConc
f150: 61 74 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20  atStep, .       
f160: 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61   groupConcatFina
f170: 6c 69 7a 65 2c 20 67 72 6f 75 70 43 6f 6e 63 61  lize, groupConca
f180: 74 56 61 6c 75 65 2c 20 67 72 6f 75 70 43 6f 6e  tValue, groupCon
f190: 63 61 74 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a  catInverse, 0),.
f1a0: 20 20 20 20 57 41 47 47 52 45 47 41 54 45 28 67      WAGGREGATE(g
f1b0: 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20 32 2c 20  roup_concat, 2, 
f1c0: 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61  0, 0, groupConca
f1d0: 74 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20  tStep, .        
f1e0: 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c  groupConcatFinal
f1f0: 69 7a 65 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74  ize, groupConcat
f200: 56 61 6c 75 65 2c 20 67 72 6f 75 70 43 6f 6e 63  Value, groupConc
f210: 61 74 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20  atInverse, 0),. 
f220: 20 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 67   .    LIKEFUNC(g
f230: 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f 62 49 6e 66  lob, 2, &globInf
f240: 6f 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  o, SQLITE_FUNC_L
f250: 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  IKE|SQLITE_FUNC_
f260: 43 41 53 45 29 2c 0a 23 69 66 64 65 66 20 53 51  CASE),.#ifdef SQ
f270: 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54  LITE_CASE_SENSIT
f280: 49 56 45 5f 4c 49 4b 45 0a 20 20 20 20 4c 49 4b  IVE_LIKE.    LIK
f290: 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26  EFUNC(like, 2, &
f2a0: 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c  likeInfoAlt, SQL
f2b0: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51  ITE_FUNC_LIKE|SQ
f2c0: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c  LITE_FUNC_CASE),
f2d0: 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69  .    LIKEFUNC(li
f2e0: 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f  ke, 3, &likeInfo
f2f0: 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  Alt, SQLITE_FUNC
f300: 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e  _LIKE|SQLITE_FUN
f310: 43 5f 43 41 53 45 29 2c 0a 23 65 6c 73 65 0a 20  C_CASE),.#else. 
f320: 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65     LIKEFUNC(like
f330: 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f  , 2, &likeInfoNo
f340: 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rm, SQLITE_FUNC_
f350: 4c 49 4b 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46  LIKE),.    LIKEF
f360: 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69  UNC(like, 3, &li
f370: 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49  keInfoNorm, SQLI
f380: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 23  TE_FUNC_LIKE),.#
f390: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
f3a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f  ITE_ENABLE_UNKNO
f3b0: 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a  WN_SQL_FUNCTION.
f3c0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 6e 6b      FUNCTION(unk
f3d0: 6e 6f 77 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nown,           
f3e0: 2d 31 2c 20 30 2c 20 30 2c 20 75 6e 6b 6e 6f 77  -1, 0, 0, unknow
f3f0: 6e 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 23 65  nFunc      ),.#e
f400: 6e 64 69 66 0a 20 20 20 20 46 55 4e 43 54 49 4f  ndif.    FUNCTIO
f410: 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20  N(coalesce,     
f420: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 30        1, 0, 0, 0
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
f450: 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20  coalesce,       
f460: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 20 20      0, 0, 0, 0  
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c                ),
f480: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 63  .    FUNCTION2(c
f490: 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20  oalesce,        
f4a0: 20 2d 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46   -1, 0, 0, noopF
f4b0: 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e  unc,  SQLITE_FUN
f4c0: 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a 20 20 7d  C_COALESCE),.  }
f4d0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f4e0: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
f4f0: 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 46  .  sqlite3AlterF
f500: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 65 6e 64  unctions();.#end
f510: 69 66 0a 20 20 73 71 6c 69 74 65 33 57 69 6e 64  if.  sqlite3Wind
f520: 6f 77 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23  owFunctions();.#
f530: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
f540: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20  E_ENABLE_STAT3) 
f550: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
f560: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 0a  E_ENABLE_STAT4).
f570: 20 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65    sqlite3Analyze
f580: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 65 6e  Functions();.#en
f590: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 67  dif.  sqlite3Reg
f5a0: 69 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e  isterDateTimeFun
f5b0: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 73 71 6c 69  ctions();.  sqli
f5c0: 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69 6e  te3InsertBuiltin
f5d0: 46 75 6e 63 73 28 61 42 75 69 6c 74 69 6e 46 75  Funcs(aBuiltinFu
f5e0: 6e 63 2c 20 41 72 72 61 79 53 69 7a 65 28 61 42  nc, ArraySize(aB
f5f0: 75 69 6c 74 69 6e 46 75 6e 63 29 29 3b 0a 0a 23  uiltinFunc));..#
f600: 69 66 20 30 20 20 2f 2a 20 45 6e 61 62 6c 65 20  if 0  /* Enable 
f610: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 68 6f 77  to print out how
f620: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75   the built-in fu
f630: 6e 63 74 69 6f 6e 73 20 61 72 65 20 68 61 73 68  nctions are hash
f640: 65 64 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 69 6e  ed */.  {.    in
f650: 74 20 69 3b 0a 20 20 20 20 46 75 6e 63 44 65 66  t i;.    FuncDef
f660: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
f670: 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ; i<SQLITE_FUNC_
f680: 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29 7b 0a 20  HASH_SZ; i++){. 
f690: 20 20 20 20 20 70 72 69 6e 74 66 28 22 46 55 4e       printf("FUN
f6a0: 43 2d 48 41 53 48 20 25 30 32 64 3a 22 2c 20 69  C-HASH %02d:", i
f6b0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73  );.      for(p=s
f6c0: 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e  qlite3BuiltinFun
f6d0: 63 74 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20  ctions.a[i]; p; 
f6e0: 70 3d 70 2d 3e 75 2e 70 48 61 73 68 29 7b 0a 20  p=p->u.pHash){. 
f6f0: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73         int n = s
f700: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
f710: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
f720: 20 20 69 6e 74 20 68 20 3d 20 70 2d 3e 7a 4e 61    int h = p->zNa
f730: 6d 65 5b 30 5d 20 2b 20 6e 3b 0a 20 20 20 20 20  me[0] + n;.     
f740: 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 28 25     printf(" %s(%
f750: 64 29 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 68  d)", p->zName, h
f760: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f770: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
f780: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f790: 7d 0a                                            }.