/ Hex Artifact Content
Login

Artifact 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f:


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 61 70 70 72 6f          p->appro
b1a0: 78 20 3d 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20  x = p->overflow 
b1b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
b1c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
b1d0: 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33  >rSum += sqlite3
b1e0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
b1f0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d  gv[0]);.      p-
b200: 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20  >approx = 1;.   
b210: 20 7d 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64 65 66   }.  }.}.#ifndef
b220: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
b230: 44 4f 57 46 55 4e 43 0a 73 74 61 74 69 63 20 76  DOWFUNC.static v
b240: 6f 69 64 20 73 75 6d 49 6e 76 65 72 73 65 28 73  oid sumInverse(s
b250: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
b260: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
b270: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
b280: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43 74  **argv){.  SumCt
b290: 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70 65  x *p;.  int type
b2a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
b2b0: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
b2c0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
b2d0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
b2e0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
b2f0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
b300: 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  (*p));.  type = 
b310: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75  sqlite3_value_nu
b320: 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76 5b  meric_type(argv[
b330: 30 5d 29 3b 0a 20 20 2f 2a 20 70 20 69 73 20 61  0]);.  /* p is a
b340: 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
b350: 65 63 61 75 73 65 20 73 75 6d 53 74 65 70 28 29  ecause sumStep()
b360: 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
b370: 63 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 20 2a  called first.  *
b380: 2a 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  * to initialize 
b390: 69 74 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  it */.  if( ALWA
b3a0: 59 53 28 70 29 20 26 26 20 74 79 70 65 21 3d 53  YS(p) && type!=S
b3b0: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
b3c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 63 6e 74    assert( p->cnt
b3d0: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 63 6e 74  >0 );.    p->cnt
b3e0: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
b3f0: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  type==SQLITE_INT
b400: 45 47 45 52 20 7c 7c 20 70 2d 3e 61 70 70 72 6f  EGER || p->appro
b410: 78 20 29 3b 0a 20 20 20 20 69 66 28 20 74 79 70  x );.    if( typ
b420: 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  e==SQLITE_INTEGE
b430: 52 20 26 26 20 70 2d 3e 61 70 70 72 6f 78 3d 3d  R && p->approx==
b440: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76  0 ){.      i64 v
b450: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
b460: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
b470: 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2d  .      p->rSum -
b480: 3d 20 76 3b 0a 20 20 20 20 20 20 70 2d 3e 69 53  = v;.      p->iS
b490: 75 6d 20 2d 3d 20 76 3b 0a 20 20 20 20 7d 65 6c  um -= v;.    }el
b4a0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  se{.      p->rSu
b4b0: 6d 20 2d 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  m -= sqlite3_val
b4c0: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
b4d0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ]);.    }.  }.}.
b4e0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
b4f0: 75 6d 49 6e 76 65 72 73 65 20 30 0a 23 65 6e 64  umInverse 0.#end
b500: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b510: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
b520: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46  static void sumF
b530: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
b540: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
b550: 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a  ){.  SumCtx *p;.
b560: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
b570: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
b580: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
b590: 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30  f( p && p->cnt>0
b5a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   ){.    if( p->o
b5b0: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
b5c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b5d0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69  error(context,"i
b5e0: 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 22  nteger overflow"
b5f0: 2c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ,-1);.    }else 
b600: 69 66 28 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b  if( p->approx ){
b610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
b620: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
b630: 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a  text, p->rSum);.
b640: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b650: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b660: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70  int64(context, p
b670: 2d 3e 69 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20  ->iSum);.    }. 
b680: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
b690: 20 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c   avgFinalize(sql
b6a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
b6b0: 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78  ntext){.  SumCtx
b6c0: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
b6d0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
b6e0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
b6f0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
b700: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  cnt>0 ){.    sql
b710: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
b720: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72  le(context, p->r
b730: 53 75 6d 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63  Sum/(double)p->c
b740: 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nt);.  }.}.stati
b750: 63 20 76 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61  c void totalFina
b760: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
b770: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
b780: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
b790: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
b7a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
b7b0: 74 65 78 74 2c 20 30 29 3b 0a 20 20 2f 2a 20 28  text, 0);.  /* (
b7c0: 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65  double)0 In case
b7d0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
b7e0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
b7f0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  . */.  sqlite3_r
b800: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
b810: 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75  text, p ? p->rSu
b820: 6d 20 3a 20 28 64 6f 75 62 6c 65 29 30 29 3b 0a  m : (double)0);.
b830: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
b840: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
b850: 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20   keeps track of 
b860: 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  state informatio
b870: 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75  n for the.** cou
b880: 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66  nt() aggregate f
b890: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  unction..*/.type
b8a0: 64 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74  def struct Count
b8b0: 43 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74  Ctx CountCtx;.st
b8c0: 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a  ruct CountCtx {.
b8d0: 20 20 69 36 34 20 6e 3b 0a 23 69 66 64 65 66 20    i64 n;.#ifdef 
b8e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
b8f0: 6e 74 20 62 49 6e 76 65 72 73 65 3b 20 20 20 20  nt bInverse;    
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b910: 2a 20 54 72 75 65 20 69 66 20 78 49 6e 76 65 72  * True if xInver
b920: 73 65 28 29 20 65 76 65 72 20 63 61 6c 6c 65 64  se() ever called
b930: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
b940: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
b950: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
b960: 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65  ount() aggregate
b970: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
b980: 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53  atic void countS
b990: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
b9a0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
b9b0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
b9c0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
b9d0: 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20   CountCtx *p;.  
b9e0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
b9f0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
ba00: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
ba10: 29 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d  ));.  if( (argc=
ba20: 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c  =0 || SQLITE_NUL
ba30: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
ba40: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29 20  _type(argv[0])) 
ba50: 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  && p ){.    p->n
ba60: 2b 2b 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ++;.  }..#ifndef
ba70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
ba80: 52 45 43 41 54 45 44 0a 20 20 2f 2a 20 54 68 65  RECATED.  /* The
ba90: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
baa0: 74 65 5f 63 6f 75 6e 74 28 29 20 66 75 6e 63 74  te_count() funct
bab0: 69 6f 6e 20 69 73 20 64 65 70 72 65 63 61 74 65  ion is deprecate
bac0: 64 2e 20 20 42 75 74 20 6a 75 73 74 20 74 6f 20  d.  But just to 
bad0: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 69  make.  ** sure i
bae0: 74 20 73 74 69 6c 6c 20 6f 70 65 72 61 74 65 73  t still operates
baf0: 20 63 6f 72 72 65 63 74 6c 79 2c 20 76 65 72 69   correctly, veri
bb00: 66 79 20 74 68 61 74 20 69 74 73 20 63 6f 75 6e  fy that its coun
bb10: 74 20 61 67 72 65 65 73 20 77 69 74 68 20 6f 75  t agrees with ou
bb20: 72 20 0a 20 20 2a 2a 20 69 6e 74 65 72 6e 61 6c  r .  ** internal
bb30: 20 63 6f 75 6e 74 20 77 68 65 6e 20 75 73 69 6e   count when usin
bb40: 67 20 63 6f 75 6e 74 28 2a 29 20 61 6e 64 20 77  g count(*) and w
bb50: 68 65 6e 20 74 68 65 20 74 6f 74 61 6c 20 63 6f  hen the total co
bb60: 75 6e 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  unt can be.  ** 
bb70: 65 78 70 72 65 73 73 65 64 20 61 73 20 61 20 33  expressed as a 3
bb80: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 2a  2-bit integer. *
bb90: 2f 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  /.  assert( argc
bba0: 3d 3d 31 20 7c 7c 20 70 3d 3d 30 20 7c 7c 20 70  ==1 || p==0 || p
bbb0: 2d 3e 6e 3e 30 78 37 66 66 66 66 66 66 66 20 7c  ->n>0x7fffffff |
bbc0: 7c 20 70 2d 3e 62 49 6e 76 65 72 73 65 0a 20 20  | p->bInverse.  
bbd0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6e 3d          || p->n=
bbe0: 3d 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  =sqlite3_aggrega
bbf0: 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74  te_count(context
bc00: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 20 20 20  ) );.#endif.}   
bc10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
bc20: 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  ntFinalize(sqlit
bc30: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
bc40: 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78  ext){.  CountCtx
bc50: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
bc60: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
bc70: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
bc80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
bc90: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
bca0: 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b  , p ? p->n : 0);
bcb0: 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .}.#ifndef SQLIT
bcc0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
bcd0: 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  C.static void co
bce0: 75 6e 74 49 6e 76 65 72 73 65 28 73 71 6c 69 74  untInverse(sqlit
bcf0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
bd00: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
bd10: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
bd20: 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b  {.  CountCtx *p;
bd30: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
bd40: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
bd50: 28 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  (ctx, sizeof(*p)
bd60: 29 3b 0a 20 20 2f 2a 20 70 20 69 73 20 61 6c 77  );.  /* p is alw
bd70: 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 73 69 6e  ays non-NULL sin
bd80: 63 65 20 63 6f 75 6e 74 53 74 65 70 28 29 20 77  ce countStep() w
bd90: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61  ill have been ca
bda0: 6c 6c 65 64 20 66 69 72 73 74 20 2a 2f 0a 20 20  lled first */.  
bdb0: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
bdc0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
bdd0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
bde0: 61 72 67 76 5b 30 5d 29 29 20 26 26 20 41 4c 57  argv[0])) && ALW
bdf0: 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70 2d  AYS(p) ){.    p-
be00: 3e 6e 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c  >n--;.#ifdef SQL
be10: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d  ITE_DEBUG.    p-
be20: 3e 62 49 6e 76 65 72 73 65 20 3d 20 31 3b 0a 23  >bInverse = 1;.#
be30: 65 6e 64 69 66 0a 20 20 7d 0a 7d 20 20 20 0a 23  endif.  }.}   .#
be40: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6f  else.# define co
be50: 75 6e 74 49 6e 76 65 72 73 65 20 30 0a 23 65 6e  untInverse 0.#en
be60: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
be70: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
be80: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
be90: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69   to implement mi
bea0: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67  n() and max() ag
beb0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
bec0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
bed0: 64 20 6d 69 6e 6d 61 78 53 74 65 70 28 0a 20 20  d minmaxStep(.  
bee0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
bef0: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
bf00: 20 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c   NotUsed, .  sql
bf10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
bf20: 76 0a 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67  v.){.  Mem *pArg
bf30: 20 20 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b    = (Mem *)argv[
bf40: 30 5d 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74  0];.  Mem *pBest
bf50: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
bf60: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a  ETER(NotUsed);..
bf70: 20 20 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a    pBest = (Mem *
bf80: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
bf90: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
bfa0: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73  xt, sizeof(*pBes
bfb0: 74 29 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73  t));.  if( !pBes
bfc0: 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  t ) return;..  i
bfd0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
bfe0: 5f 74 79 70 65 28 70 41 72 67 29 3d 3d 53 51 4c  _type(pArg)==SQL
bff0: 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
c000: 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73  if( pBest->flags
c010: 20 29 20 73 71 6c 69 74 65 33 53 6b 69 70 41 63   ) sqlite3SkipAc
c020: 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f  cumulatorLoad(co
c030: 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 20  ntext);.  }else 
c040: 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73  if( pBest->flags
c050: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b   ){.    int max;
c060: 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20  .    int cmp;.  
c070: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
c080: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e   = sqlite3GetFun
c090: 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74  cCollSeq(context
c0a0: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73  );.    /* This s
c0b0: 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  tep function is 
c0c0: 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
c0d0: 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28  e min() and max(
c0e0: 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20 20  ) aggregates,.  
c0f0: 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69    ** the only di
c100: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
c110: 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20 74   the two being t
c120: 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f 66  hat the sense of
c130: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70   the.    ** comp
c140: 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72 74  arison is invert
c150: 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78 28  ed. For the max(
c160: 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65  ) aggregate, the
c170: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
c180: 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e 63  user_data() func
c190: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76 6f  tion returns (vo
c1a0: 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e  id *)-1. For min
c1b0: 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 74  () it.    ** ret
c1c0: 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62 2c  urns (void *)db,
c1d0: 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68 65   where db is the
c1e0: 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61   sqlite3* databa
c1f0: 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20  se pointer..    
c200: 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68 65  ** Therefore the
c210: 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
c220: 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27 6d  sets variable 'm
c230: 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68 65  ax' to 1 for the
c240: 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61 67   max().    ** ag
c250: 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66 6f  gregate, or 0 fo
c260: 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  r min()..    */.
c270: 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74 65      max = sqlite
c280: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
c290: 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70  ext)!=0;.    cmp
c2a0: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
c2b0: 70 61 72 65 28 70 42 65 73 74 2c 20 70 41 72 67  pare(pBest, pArg
c2c0: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66  , pColl);.    if
c2d0: 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30 29  ( (max && cmp<0)
c2e0: 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d 70   || (!max && cmp
c2f0: 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >0) ){.      sql
c300: 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
c310: 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20  pBest, pArg);.  
c320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
c330: 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d 75  qlite3SkipAccumu
c340: 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78  latorLoad(contex
c350: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
c360: 65 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 64 62  e{.    pBest->db
c370: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
c380: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
c390: 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  text);.    sqlit
c3a0: 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42  e3VdbeMemCopy(pB
c3b0: 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a  est, pArg);.  }.
c3c0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69  }.static void mi
c3d0: 6e 4d 61 78 56 61 6c 75 65 46 69 6e 61 6c 69 7a  nMaxValueFinaliz
c3e0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
c3f0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
c400: 62 56 61 6c 75 65 29 7b 0a 20 20 73 71 6c 69 74  bValue){.  sqlit
c410: 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a  e3_value *pRes;.
c420: 20 20 70 52 65 73 20 3d 20 28 73 71 6c 69 74 65    pRes = (sqlite
c430: 33 5f 76 61 6c 75 65 20 2a 29 73 71 6c 69 74 65  3_value *)sqlite
c440: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
c450: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
c460: 0a 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20  .  if( pRes ){. 
c470: 20 20 20 69 66 28 20 70 52 65 73 2d 3e 66 6c 61     if( pRes->fla
c480: 67 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  gs ){.      sqli
c490: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
c4a0: 28 63 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b  (context, pRes);
c4b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
c4c0: 56 61 6c 75 65 3d 3d 30 20 29 20 73 71 6c 69 74  Value==0 ) sqlit
c4d0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
c4e0: 28 70 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 23 69  (pRes);.  }.}.#i
c4f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c500: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 73 74 61  T_WINDOWFUNC.sta
c510: 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 56  tic void minMaxV
c520: 61 6c 75 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  alue(sqlite3_con
c530: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
c540: 20 20 6d 69 6e 4d 61 78 56 61 6c 75 65 46 69 6e    minMaxValueFin
c550: 61 6c 69 7a 65 28 63 6f 6e 74 65 78 74 2c 20 31  alize(context, 1
c560: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
c570: 69 6e 65 20 6d 69 6e 4d 61 78 56 61 6c 75 65 20  ine minMaxValue 
c580: 30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  0.#endif /* SQLI
c590: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
c5a0: 4e 43 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  NC */.static voi
c5b0: 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65  d minMaxFinalize
c5c0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c5d0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 6d 69   *context){.  mi
c5e0: 6e 4d 61 78 56 61 6c 75 65 46 69 6e 61 6c 69 7a  nMaxValueFinaliz
c5f0: 65 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 7d  e(context, 0);.}
c600: 0a 0a 2f 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63 6f  ../*.** group_co
c610: 6e 63 61 74 28 45 58 50 52 2c 20 3f 53 45 50 41  ncat(EXPR, ?SEPA
c620: 52 41 54 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74 69  RATOR?).*/.stati
c630: 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63  c void groupConc
c640: 61 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  atStep(.  sqlite
c650: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
c660: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
c670: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
c680: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
c690: 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20  t char *zVal;.  
c6a0: 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d  StrAccum *pAccum
c6b0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
c6c0: 7a 53 65 70 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  zSep;.  int nVal
c6d0: 2c 20 6e 53 65 70 3b 0a 20 20 61 73 73 65 72 74  , nSep;.  assert
c6e0: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67  ( argc==1 || arg
c6f0: 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 73 71  c==2 );.  if( sq
c700: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c710: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
c720: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
c730: 0a 20 20 70 41 63 63 75 6d 20 3d 20 28 53 74 72  .  pAccum = (Str
c740: 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61  Accum*)sqlite3_a
c750: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
c760: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
c770: 28 2a 70 41 63 63 75 6d 29 29 3b 0a 0a 20 20 69  (*pAccum));..  i
c780: 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20  f( pAccum ){.   
c790: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
c7a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
c7b0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
c7c0: 29 3b 0a 20 20 20 20 69 6e 74 20 66 69 72 73 74  );.    int first
c7d0: 54 65 72 6d 20 3d 20 70 41 63 63 75 6d 2d 3e 6d  Term = pAccum->m
c7e0: 78 41 6c 6c 6f 63 3d 3d 30 3b 0a 20 20 20 20 70  xAlloc==0;.    p
c7f0: 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d  Accum->mxAlloc =
c800: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
c810: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
c820: 3b 0a 20 20 20 20 69 66 28 20 21 66 69 72 73 74  ;.    if( !first
c830: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66  Term ){.      if
c840: 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20  ( argc==2 ){.   
c850: 20 20 20 20 20 7a 53 65 70 20 3d 20 28 63 68 61       zSep = (cha
c860: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
c870: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
c880: 20 20 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73          nSep = s
c890: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
c8a0: 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  es(argv[1]);.   
c8b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c8c0: 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20    zSep = ",";.  
c8d0: 20 20 20 20 20 20 6e 53 65 70 20 3d 20 31 3b 0a        nSep = 1;.
c8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c8f0: 28 20 7a 53 65 70 20 29 20 73 71 6c 69 74 65 33  ( zSep ) sqlite3
c900: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 41 63 63  _str_append(pAcc
c910: 75 6d 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b  um, zSep, nSep);
c920: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20  .    }.    zVal 
c930: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
c940: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
c950: 5b 30 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d  [0]);.    nVal =
c960: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
c970: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
c980: 20 20 20 69 66 28 20 7a 56 61 6c 20 29 20 73 71     if( zVal ) sq
c990: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
c9a0: 28 70 41 63 63 75 6d 2c 20 7a 56 61 6c 2c 20 6e  (pAccum, zVal, n
c9b0: 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 23 69 66 6e  Val);.  }.}.#ifn
c9c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c9d0: 57 49 4e 44 4f 57 46 55 4e 43 0a 73 74 61 74 69  WINDOWFUNC.stati
c9e0: 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63  c void groupConc
c9f0: 61 74 49 6e 76 65 72 73 65 28 0a 20 20 73 71 6c  atInverse(.  sql
ca00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
ca10: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
ca20: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
ca30: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
ca40: 6e 74 20 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  nt n;.  StrAccum
ca50: 20 2a 70 41 63 63 75 6d 3b 0a 20 20 61 73 73 65   *pAccum;.  asse
ca60: 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61  rt( argc==1 || a
ca70: 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20  rgc==2 );.  if( 
ca80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
ca90: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
caa0: 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72  ITE_NULL ) retur
cab0: 6e 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20 28 53  n;.  pAccum = (S
cac0: 74 72 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33  trAccum*)sqlite3
cad0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
cae0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
caf0: 6f 66 28 2a 70 41 63 63 75 6d 29 29 3b 0a 20 20  of(*pAccum));.  
cb00: 2f 2a 20 70 41 63 63 75 6d 20 69 73 20 61 6c 77  /* pAccum is alw
cb10: 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 73 69 6e  ays non-NULL sin
cb20: 63 65 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74  ce groupConcatSt
cb30: 65 70 28 29 20 77 69 6c 6c 20 68 61 76 65 20 61  ep() will have a
cb40: 6c 77 61 79 73 0a 20 20 2a 2a 20 72 75 6e 20 66  lways.  ** run f
cb50: 72 69 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  rist to initiali
cb60: 7a 65 20 69 74 20 2a 2f 0a 20 20 69 66 28 20 41  ze it */.  if( A
cb70: 4c 57 41 59 53 28 70 41 63 63 75 6d 29 20 29 7b  LWAYS(pAccum) ){
cb80: 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
cb90: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
cba0: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 61  v[0]);.    if( a
cbb0: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  rgc==2 ){.      
cbc0: 6e 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  n += sqlite3_val
cbd0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d  ue_bytes(argv[1]
cbe0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
cbf0: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
cc00: 20 20 20 69 66 28 20 6e 3e 3d 28 69 6e 74 29 70     if( n>=(int)p
cc10: 41 63 63 75 6d 2d 3e 6e 43 68 61 72 20 29 7b 0a  Accum->nChar ){.
cc20: 20 20 20 20 20 20 70 41 63 63 75 6d 2d 3e 6e 43        pAccum->nC
cc30: 68 61 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  har = 0;.    }el
cc40: 73 65 7b 0a 20 20 20 20 20 20 70 41 63 63 75 6d  se{.      pAccum
cc50: 2d 3e 6e 43 68 61 72 20 2d 3d 20 6e 3b 0a 20 20  ->nChar -= n;.  
cc60: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 41 63 63      memmove(pAcc
cc70: 75 6d 2d 3e 7a 54 65 78 74 2c 20 26 70 41 63 63  um->zText, &pAcc
cc80: 75 6d 2d 3e 7a 54 65 78 74 5b 6e 5d 2c 20 70 41  um->zText[n], pA
cc90: 63 63 75 6d 2d 3e 6e 43 68 61 72 29 3b 0a 20 20  ccum->nChar);.  
cca0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 41 63 63    }.    if( pAcc
ccb0: 75 6d 2d 3e 6e 43 68 61 72 3d 3d 30 20 29 20 70  um->nChar==0 ) p
ccc0: 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d  Accum->mxAlloc =
ccd0: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   0;.  }.}.#else.
cce0: 23 20 64 65 66 69 6e 65 20 67 72 6f 75 70 43 6f  # define groupCo
ccf0: 6e 63 61 74 49 6e 76 65 72 73 65 20 30 0a 23 65  ncatInverse 0.#e
cd00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
cd10: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
cd20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72  /.static void gr
cd30: 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a  oupConcatFinaliz
cd40: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
cd50: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
cd60: 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b  trAccum *pAccum;
cd70: 0a 20 20 70 41 63 63 75 6d 20 3d 20 73 71 6c 69  .  pAccum = sqli
cd80: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
cd90: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
cda0: 29 3b 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20  );.  if( pAccum 
cdb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 41 63 63 75  ){.    if( pAccu
cdc0: 6d 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53 51 4c  m->accError==SQL
cdd0: 49 54 45 5f 54 4f 4f 42 49 47 20 29 7b 0a 20 20  ITE_TOOBIG ){.  
cde0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
cdf0: 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28  lt_error_toobig(
ce00: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65  context);.    }e
ce10: 6c 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d 3e  lse if( pAccum->
ce20: 61 63 63 45 72 72 6f 72 3d 3d 53 51 4c 49 54 45  accError==SQLITE
ce30: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
ce40: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
ce50: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
ce60: 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  xt);.    }else{ 
ce70: 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65     .      sqlite
ce80: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
ce90: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53 74  ntext, sqlite3St
cea0: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 70 41 63  rAccumFinish(pAc
ceb0: 63 75 6d 29 2c 20 2d 31 2c 20 0a 20 20 20 20 20  cum), -1, .     
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
cee0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
cef0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cf00: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 73  MIT_WINDOWFUNC.s
cf10: 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75 70  tatic void group
cf20: 43 6f 6e 63 61 74 56 61 6c 75 65 28 73 71 6c 69  ConcatValue(sqli
cf30: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
cf40: 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  text){.  sqlite3
cf50: 5f 73 74 72 20 2a 70 41 63 63 75 6d 3b 0a 20 20  _str *pAccum;.  
cf60: 70 41 63 63 75 6d 20 3d 20 28 73 71 6c 69 74 65  pAccum = (sqlite
cf70: 33 5f 73 74 72 2a 29 73 71 6c 69 74 65 33 5f 61  3_str*)sqlite3_a
cf80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
cf90: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
cfa0: 69 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20  if( pAccum ){.  
cfb0: 20 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61 63    if( pAccum->ac
cfc0: 63 45 72 72 6f 72 3d 3d 53 51 4c 49 54 45 5f 54  cError==SQLITE_T
cfd0: 4f 4f 42 49 47 20 29 7b 0a 20 20 20 20 20 20 73  OOBIG ){.      s
cfe0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
cff0: 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65  ror_toobig(conte
d000: 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  xt);.    }else i
d010: 66 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72  f( pAccum->accEr
d020: 72 6f 72 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  ror==SQLITE_NOME
d030: 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M ){.      sqlit
d040: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
d050: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
d060: 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20      }else{    . 
d070: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d080: 2a 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33  *zText = sqlite3
d090: 5f 73 74 72 5f 76 61 6c 75 65 28 70 41 63 63 75  _str_value(pAccu
d0a0: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
d0b0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
d0c0: 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31  ntext, zText, -1
d0d0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d0e0: 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  NT);.    }.  }.}
d0f0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
d100: 67 72 6f 75 70 43 6f 6e 63 61 74 56 61 6c 75 65  groupConcatValue
d110: 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   0.#endif /* SQL
d120: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
d130: 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  UNC */../*.** Th
d140: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
d150: 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  per-connection f
d160: 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 72 61  unction registra
d170: 74 69 6f 6e 2e 20 20 4d 6f 73 74 0a 2a 2a 20 6f  tion.  Most.** o
d180: 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66  f the built-in f
d190: 75 6e 63 74 69 6f 6e 73 20 61 62 6f 76 65 20 61  unctions above a
d1a0: 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 67  re part of the g
d1b0: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73  lobal function s
d1c0: 65 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  et..** This rout
d1d0: 69 6e 65 20 6f 6e 6c 79 20 64 65 61 6c 73 20 77  ine only deals w
d1e0: 69 74 68 20 74 68 6f 73 65 20 74 68 61 74 20 61  ith those that a
d1f0: 72 65 20 6e 6f 74 20 67 6c 6f 62 61 6c 2e 0a 2a  re not global..*
d200: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
d210: 67 69 73 74 65 72 50 65 72 43 6f 6e 6e 65 63 74  gisterPerConnect
d220: 69 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  ionBuiltinFuncti
d230: 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ons(sqlite3 *db)
d240: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
d250: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
d260: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 4d 41 54 43  nction(db, "MATC
d270: 48 22 2c 20 32 29 3b 0a 20 20 61 73 73 65 72 74  H", 2);.  assert
d280: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
d290: 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  EM || rc==SQLITE
d2a0: 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  _OK );.  if( rc=
d2b0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
d2c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
d2d0: 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 7d 0a  ault(db);.  }.}.
d2e0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 4c  ./*.** Set the L
d2f0: 49 4b 45 4f 50 54 20 66 6c 61 67 20 6f 6e 20 74  IKEOPT flag on t
d300: 68 65 20 32 2d 61 72 67 75 6d 65 6e 74 20 66 75  he 2-argument fu
d310: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
d320: 67 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  given name..*/.s
d330: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4c 69  tatic void setLi
d340: 6b 65 4f 70 74 46 6c 61 67 28 73 71 6c 69 74 65  keOptFlag(sqlite
d350: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
d360: 72 20 2a 7a 4e 61 6d 65 2c 20 75 38 20 66 6c 61  r *zName, u8 fla
d370: 67 56 61 6c 29 7b 0a 20 20 46 75 6e 63 44 65 66  gVal){.  FuncDef
d380: 20 2a 70 44 65 66 3b 0a 20 20 70 44 65 66 20 3d   *pDef;.  pDef =
d390: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
d3a0: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
d3b0: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
d3c0: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
d3d0: 28 70 44 65 66 29 20 29 7b 0a 20 20 20 20 70 44  (pDef) ){.    pD
d3e0: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 7c 3d  ef->funcFlags |=
d3f0: 20 66 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a 7d 0a   flagVal;.  }.}.
d400: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
d410: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 4c 49 4b  the built-in LIK
d420: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
d430: 69 6f 6e 73 2e 20 20 54 68 65 20 63 61 73 65 53  ions.  The caseS
d440: 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61 72 61  ensitive.** para
d450: 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
d460: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
d470: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
d480: 72 20 69 73 20 63 61 73 65 0a 2a 2a 20 73 65 6e  r is case.** sen
d490: 73 69 74 69 76 65 2e 20 20 47 4c 4f 42 20 69 73  sitive.  GLOB is
d4a0: 20 61 6c 77 61 79 73 20 63 61 73 65 20 73 65 6e   always case sen
d4b0: 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20  sitive..*/.void 
d4c0: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c  sqlite3RegisterL
d4d0: 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c  ikeFunctions(sql
d4e0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 63 61  ite3 *db, int ca
d4f0: 73 65 53 65 6e 73 69 74 69 76 65 29 7b 0a 20 20  seSensitive){.  
d500: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
d510: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69 66 28  fo *pInfo;.  if(
d520: 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 29   caseSensitive )
d530: 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73  {.    pInfo = (s
d540: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
d550: 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b  o*)&likeInfoAlt;
d560: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
d570: 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f  nfo = (struct co
d580: 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65  mpareInfo*)&like
d590: 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a 20 20  InfoNorm;.  }.  
d5a0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
d5b0: 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 32 2c  c(db, "like", 2,
d5c0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49   SQLITE_UTF8, pI
d5d0: 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30  nfo, likeFunc, 0
d5e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
d5f0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
d600: 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 33  nc(db, "like", 3
d610: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70  , SQLITE_UTF8, p
d620: 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20  Info, likeFunc, 
d630: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  0, 0, 0, 0, 0);.
d640: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
d650: 75 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20  unc(db, "glob", 
d660: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
d670: 0a 20 20 20 20 20 20 28 73 74 72 75 63 74 20 63  .      (struct c
d680: 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f  ompareInfo*)&glo
d690: 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c  bInfo, likeFunc,
d6a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   0, 0, 0, 0, 0);
d6b0: 0a 20 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61  .  setLikeOptFla
d6c0: 67 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 53 51  g(db, "glob", SQ
d6d0: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c  LITE_FUNC_LIKE |
d6e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53   SQLITE_FUNC_CAS
d6f0: 45 29 3b 0a 20 20 73 65 74 4c 69 6b 65 4f 70 74  E);.  setLikeOpt
d700: 46 6c 61 67 28 64 62 2c 20 22 6c 69 6b 65 22 2c  Flag(db, "like",
d710: 20 0a 20 20 20 20 20 20 63 61 73 65 53 65 6e 73   .      caseSens
d720: 69 74 69 76 65 20 3f 20 28 53 51 4c 49 54 45 5f  itive ? (SQLITE_
d730: 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49  FUNC_LIKE | SQLI
d740: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 20 3a 20  TE_FUNC_CASE) : 
d750: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
d760: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  );.}../*.** pExp
d770: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  r points to an e
d780: 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20  xpression which 
d790: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 66 75 6e  implements a fun
d7a0: 63 74 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 69 74  ction.  If.** it
d7b0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
d7c0: 74 6f 20 61 70 70 6c 79 20 74 68 65 20 4c 49 4b  to apply the LIK
d7d0: 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74  E optimization t
d7e0: 6f 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 0a  o that function.
d7f0: 2a 2a 20 74 68 65 6e 20 73 65 74 20 61 57 63 5b  ** then set aWc[
d800: 30 5d 20 74 68 72 6f 75 67 68 20 61 57 63 5b 32  0] through aWc[2
d810: 5d 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  ] to the wildcar
d820: 64 20 63 68 61 72 61 63 74 65 72 73 20 61 6e 64  d characters and
d830: 20 74 68 65 0a 2a 2a 20 65 73 63 61 70 65 20 63   the.** escape c
d840: 68 61 72 61 63 74 65 72 20 61 6e 64 20 74 68 65  haracter and the
d850: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
d860: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
d870: 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 4c 49 4b  is not a .** LIK
d880: 45 2d 73 74 79 6c 65 20 66 75 6e 63 74 69 6f 6e  E-style function
d890: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 46 41 4c   then return FAL
d8a0: 53 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  SE..**.** The ex
d8b0: 70 72 65 73 73 69 6f 6e 20 22 61 20 4c 49 4b 45  pression "a LIKE
d8c0: 20 62 20 45 53 43 41 50 45 20 63 22 20 69 73 20   b ESCAPE c" is 
d8d0: 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
d8e0: 61 20 76 61 6c 69 64 20 4c 49 4b 45 0a 2a 2a 20  a valid LIKE.** 
d8f0: 6f 70 65 72 61 74 6f 72 20 69 66 20 63 20 69 73  operator if c is
d900: 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61   a string litera
d910: 6c 20 74 68 61 74 20 69 73 20 65 78 61 63 74 6c  l that is exactl
d920: 79 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 6c 65  y one byte in le
d930: 6e 67 74 68 2e 0a 2a 2a 20 54 68 61 74 20 6f 6e  ngth..** That on
d940: 65 20 62 79 74 65 20 69 73 20 73 74 6f 72 65 64  e byte is stored
d950: 20 69 6e 20 61 57 63 5b 33 5d 2e 20 20 61 57 63   in aWc[3].  aWc
d960: 5b 33 5d 20 69 73 20 73 65 74 20 74 6f 20 7a 65  [3] is set to ze
d970: 72 6f 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  ro if there is.*
d980: 2a 20 6e 6f 20 45 53 43 41 50 45 20 63 6c 61 75  * no ESCAPE clau
d990: 73 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 49 73 4e 6f  se..**.** *pIsNo
d9a0: 63 61 73 65 20 69 73 20 73 65 74 20 74 6f 20 74  case is set to t
d9b0: 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65  rue if uppercase
d9c0: 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 61   and lowercase a
d9d0: 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  re equivalent fo
d9e0: 72 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f  r.** the functio
d9f0: 6e 20 28 64 65 66 61 75 6c 74 20 66 6f 72 20 4c  n (default for L
da00: 49 4b 45 29 2e 20 20 49 66 20 74 68 65 20 66 75  IKE).  If the fu
da10: 6e 63 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  nction makes the
da20: 20 64 69 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a 20   distinction.** 
da30: 62 65 74 77 65 65 6e 20 75 70 70 65 72 63 61 73  between uppercas
da40: 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20  e and lowercase 
da50: 28 61 73 20 64 6f 65 73 20 47 4c 4f 42 29 20 74  (as does GLOB) t
da60: 68 65 6e 20 2a 70 49 73 4e 6f 63 61 73 65 20 69  hen *pIsNocase i
da70: 73 20 73 65 74 20 74 6f 0a 2a 2a 20 66 61 6c 73  s set to.** fals
da80: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
da90: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
daa0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
dab0: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
dac0: 49 73 4e 6f 63 61 73 65 2c 20 63 68 61 72 20 2a  IsNocase, char *
dad0: 61 57 63 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  aWc){.  FuncDef 
dae0: 2a 70 44 65 66 3b 0a 20 20 69 6e 74 20 6e 45 78  *pDef;.  int nEx
daf0: 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  pr;.  if( pExpr-
db00: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
db10: 20 7c 7c 20 21 70 45 78 70 72 2d 3e 78 2e 70 4c   || !pExpr->x.pL
db20: 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
db30: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 0;.  }.  asser
db40: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
db50: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
db60: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 6e 45  sSelect) );.  nE
db70: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
db80: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
db90: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
dba0: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45  dFunction(db, pE
dbb0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e  xpr->u.zToken, n
dbc0: 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46  Expr, SQLITE_UTF
dbd0: 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 4e 45 56  8, 0);.  if( NEV
dbe0: 45 52 28 70 44 65 66 3d 3d 30 29 20 7c 7c 20 28  ER(pDef==0) || (
dbf0: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
dc00: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  & SQLITE_FUNC_LI
dc10: 4b 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  KE)==0 ){.    re
dc20: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
dc30: 28 20 6e 45 78 70 72 3c 33 20 29 7b 0a 20 20 20  ( nExpr<3 ){.   
dc40: 20 61 57 63 5b 33 5d 20 3d 20 30 3b 0a 20 20 7d   aWc[3] = 0;.  }
dc50: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
dc60: 70 45 73 63 61 70 65 20 3d 20 70 45 78 70 72 2d  pEscape = pExpr-
dc70: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 32 5d 2e 70  >x.pList->a[2].p
dc80: 45 78 70 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  Expr;.    char *
dc90: 7a 45 73 63 61 70 65 3b 0a 20 20 20 20 69 66 28  zEscape;.    if(
dca0: 20 70 45 73 63 61 70 65 2d 3e 6f 70 21 3d 54 4b   pEscape->op!=TK
dcb0: 5f 53 54 52 49 4e 47 20 29 20 72 65 74 75 72 6e  _STRING ) return
dcc0: 20 30 3b 0a 20 20 20 20 7a 45 73 63 61 70 65 20   0;.    zEscape 
dcd0: 3d 20 70 45 73 63 61 70 65 2d 3e 75 2e 7a 54 6f  = pEscape->u.zTo
dce0: 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 7a 45 73  ken;.    if( zEs
dcf0: 63 61 70 65 5b 30 5d 3d 3d 30 20 7c 7c 20 7a 45  cape[0]==0 || zE
dd00: 73 63 61 70 65 5b 31 5d 21 3d 30 20 29 20 72 65  scape[1]!=0 ) re
dd10: 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 57 63 5b  turn 0;.    aWc[
dd20: 33 5d 20 3d 20 7a 45 73 63 61 70 65 5b 30 5d 3b  3] = zEscape[0];
dd30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  .  }..  /* The m
dd40: 65 6d 63 70 79 28 29 20 73 74 61 74 65 6d 65 6e  emcpy() statemen
dd50: 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  t assumes that t
dd60: 68 65 20 77 69 6c 64 63 61 72 64 20 63 68 61 72  he wildcard char
dd70: 61 63 74 65 72 73 20 61 72 65 0a 20 20 2a 2a 20  acters are.  ** 
dd80: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
dd90: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
dda0: 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74  e compareInfo st
ddb0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 0a 20 20  ructure.  The.  
ddc0: 2a 2a 20 61 73 73 65 72 74 73 28 29 20 74 68 61  ** asserts() tha
ddd0: 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66 79 20  t follow verify 
dde0: 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f 6e 0a  that assumption.
ddf0: 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 61 57    */.  memcpy(aW
de00: 63 2c 20 70 44 65 66 2d 3e 70 55 73 65 72 44 61  c, pDef->pUserDa
de10: 74 61 2c 20 33 29 3b 0a 20 20 61 73 73 65 72 74  ta, 3);.  assert
de20: 28 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  ( (char*)&likeIn
de30: 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72 2a 29  foAlt == (char*)
de40: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74  &likeInfoAlt.mat
de50: 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  chAll );.  asser
de60: 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b  t( &((char*)&lik
de70: 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d 3d 20  eInfoAlt)[1] == 
de80: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
de90: 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29 3b 0a  Alt.matchOne );.
dea0: 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61    assert( &((cha
deb0: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29  r*)&likeInfoAlt)
dec0: 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c  [2] == (char*)&l
ded0: 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68  ikeInfoAlt.match
dee0: 53 65 74 20 29 3b 0a 20 20 2a 70 49 73 4e 6f 63  Set );.  *pIsNoc
def0: 61 73 65 20 3d 20 28 70 44 65 66 2d 3e 66 75 6e  ase = (pDef->fun
df00: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
df10: 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20  FUNC_CASE)==0;. 
df20: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
df30: 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 46  .** All of the F
df40: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
df50: 73 20 69 6e 20 74 68 65 20 61 42 75 69 6c 74 69  s in the aBuilti
df60: 6e 46 75 6e 63 5b 5d 20 61 72 72 61 79 20 61 62  nFunc[] array ab
df70: 6f 76 65 0a 2a 2a 20 74 6f 20 74 68 65 20 67 6c  ove.** to the gl
df80: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 68 61  obal function ha
df90: 73 68 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  sh table.  This 
dfa0: 6f 63 63 75 72 73 20 61 74 20 73 74 61 72 74 2d  occurs at start-
dfb0: 74 69 6d 65 20 28 61 73 0a 2a 2a 20 61 20 63 6f  time (as.** a co
dfc0: 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 63 61 6c  nsequence of cal
dfd0: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6e 69  ling sqlite3_ini
dfe0: 74 69 61 6c 69 7a 65 28 29 29 2e 0a 2a 2a 0a 2a  tialize())..**.*
dff0: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
e000: 74 69 6e 65 20 72 75 6e 73 0a 2a 2f 0a 76 6f 69  tine runs.*/.voi
e010: 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  d sqlite3Registe
e020: 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  rBuiltinFunction
e030: 73 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 0a 20 20  s(void){.  /*.  
e040: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
e050: 20 61 72 72 61 79 20 68 6f 6c 64 73 20 46 75 6e   array holds Fun
e060: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 73 20  cDef structures 
e070: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 66  for all of the f
e080: 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 64 65  unctions.  ** de
e090: 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69  fined in this fi
e0a0: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  le..  **.  ** Th
e0b0: 65 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62  e array cannot b
e0c0: 65 20 63 6f 6e 73 74 61 6e 74 20 73 69 6e 63 65  e constant since
e0d0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
e0e0: 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 75  e to the.  ** Fu
e0f0: 6e 63 44 65 66 2e 70 48 61 73 68 20 65 6c 65 6d  ncDef.pHash elem
e100: 65 6e 74 73 20 61 74 20 73 74 61 72 74 2d 74 69  ents at start-ti
e110: 6d 65 2e 20 20 54 68 65 20 65 6c 65 6d 65 6e 74  me.  The element
e120: 73 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 0a  s of this array.
e130: 20 20 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e    ** are read-on
e140: 6c 79 20 61 66 74 65 72 20 69 6e 69 74 69 61 6c  ly after initial
e150: 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c  ization is compl
e160: 65 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  ete..  **.  ** F
e170: 6f 72 20 70 65 61 6b 20 65 66 66 69 63 69 65 6e  or peak efficien
e180: 63 79 2c 20 70 75 74 20 74 68 65 20 6d 6f 73 74  cy, put the most
e190: 20 66 72 65 71 75 65 6e 74 6c 79 20 75 73 65 64   frequently used
e1a0: 20 66 75 6e 63 74 69 6f 6e 20 6c 61 73 74 2e 0a   function last..
e1b0: 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 46 75    */.  static Fu
e1c0: 6e 63 44 65 66 20 61 42 75 69 6c 74 69 6e 46 75  ncDef aBuiltinFu
e1d0: 6e 63 5b 5d 20 3d 20 7b 0a 23 69 66 64 65 66 20  nc[] = {.#ifdef 
e1e0: 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20  SQLITE_SOUNDEX. 
e1f0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 6f 75 6e     FUNCTION(soun
e200: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
e210: 31 2c 20 30 2c 20 30 2c 20 73 6f 75 6e 64 65 78  1, 0, 0, soundex
e220: 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 23 65 6e  Func      ),.#en
e230: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
e240: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
e250: 45 4e 53 49 4f 4e 0a 20 20 20 20 56 46 55 4e 43  ENSION.    VFUNC
e260: 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73  TION(load_extens
e270: 69 6f 6e 2c 20 20 20 20 31 2c 20 30 2c 20 30 2c  ion,    1, 0, 0,
e280: 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20 20 20   loadExt        
e290: 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49    ),.    VFUNCTI
e2a0: 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  ON(load_extensio
e2b0: 6e 2c 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 6c  n,    2, 0, 0, l
e2c0: 6f 61 64 45 78 74 20 20 20 20 20 20 20 20 20 20  oadExt          
e2d0: 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ),.#endif.#if SQ
e2e0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
e2f0: 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 46 55 4e  TICATION.    FUN
e300: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63 72 79  CTION(sqlite_cry
e310: 70 74 2c 20 20 20 20 20 20 20 32 2c 20 30 2c 20  pt,       2, 0, 
e320: 30 2c 20 73 71 6c 69 74 65 33 43 72 79 70 74 46  0, sqlite3CryptF
e330: 75 6e 63 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69  unc ),.#endif.#i
e340: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e350: 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
e360: 44 49 41 47 53 0a 20 20 20 20 44 46 55 4e 43 54  DIAGS.    DFUNCT
e370: 49 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70 69  ION(sqlite_compi
e380: 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 2c 31 2c  leoption_used,1,
e390: 20 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f 70   0, 0, compileop
e3a0: 74 69 6f 6e 75 73 65 64 46 75 6e 63 20 20 29 2c  tionusedFunc  ),
e3b0: 0a 20 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 73  .    DFUNCTION(s
e3c0: 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74  qlite_compileopt
e3d0: 69 6f 6e 5f 67 65 74 2c 20 31 2c 20 30 2c 20 30  ion_get, 1, 0, 0
e3e0: 2c 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67  , compileoptiong
e3f0: 65 74 46 75 6e 63 20 20 29 2c 0a 23 65 6e 64 69  etFunc  ),.#endi
e400: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e410: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
e420: 49 41 47 53 20 2a 2f 0a 20 20 20 20 46 55 4e 43  IAGS */.    FUNC
e430: 54 49 4f 4e 32 28 75 6e 6c 69 6b 65 6c 79 2c 20  TION2(unlikely, 
e440: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
e450: 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c  , noopFunc,  SQL
e460: 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
e470: 59 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  Y),.    FUNCTION
e480: 32 28 6c 69 6b 65 6c 69 68 6f 6f 64 2c 20 20 20  2(likelihood,   
e490: 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 6e 6f       2, 0, 0, no
e4a0: 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  opFunc,  SQLITE_
e4b0: 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a  FUNC_UNLIKELY),.
e4c0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c 69      FUNCTION2(li
e4d0: 6b 65 6c 79 2c 20 20 20 20 20 20 20 20 20 20 20  kely,           
e4e0: 20 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75   1, 0, 0, noopFu
e4f0: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
e500: 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a 23 69 66 64  _UNLIKELY),.#ifd
e510: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
e520: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 61 66      FUNCTION2(af
e530: 66 69 6e 69 74 79 2c 20 20 20 20 20 20 20 20 20  finity,         
e540: 20 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75   1, 0, 0, noopFu
e550: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
e560: 5f 41 46 46 49 4e 49 54 59 29 2c 0a 23 65 6e 64  _AFFINITY),.#end
e570: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
e580: 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53  _ENABLE_OFFSET_S
e590: 51 4c 5f 46 55 4e 43 0a 20 20 20 20 46 55 4e 43  QL_FUNC.    FUNC
e5a0: 54 49 4f 4e 32 28 73 71 6c 69 74 65 5f 6f 66 66  TION2(sqlite_off
e5b0: 73 65 74 2c 20 20 20 20 20 31 2c 20 30 2c 20 30  set,     1, 0, 0
e5c0: 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c  , noopFunc,  SQL
e5d0: 49 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45 54 7c  ITE_FUNC_OFFSET|
e5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e        SQLITE_FUN
e620: 43 5f 54 59 50 45 4f 46 29 2c 0a 23 65 6e 64 69  C_TYPEOF),.#endi
e630: 66 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c  f.    FUNCTION(l
e640: 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20  trim,           
e650: 20 20 20 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d     1, 1, 0, trim
e660: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
e670: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72      FUNCTION(ltr
e680: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
e690: 20 32 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75   2, 1, 0, trimFu
e6a0: 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  nc         ),.  
e6b0: 20 20 46 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d    FUNCTION(rtrim
e6c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
e6d0: 2c 20 32 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 2, 0, trimFunc
e6e0: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
e6f0: 46 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20  FUNCTION(rtrim, 
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
e710: 32 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  2, 0, trimFunc  
e720: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
e730: 4e 43 54 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20  NCTION(trim,    
e740: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 33 2c             1, 3,
e750: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
e760: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
e770: 54 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20  TION(trim,      
e780: 20 20 20 20 20 20 20 20 20 32 2c 20 33 2c 20 30           2, 3, 0
e790: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
e7a0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e7b0: 4f 4e 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20  ON(min,         
e7c0: 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 31 2c 20        -1, 0, 1, 
e7d0: 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20  minmaxFunc      
e7e0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e7f0: 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  (min,           
e800: 20 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 30 20       0, 0, 1, 0 
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
e820: 2c 0a 20 20 20 20 57 41 47 47 52 45 47 41 54 45  ,.    WAGGREGATE
e830: 28 6d 69 6e 2c 20 31 2c 20 30 2c 20 31 2c 20 6d  (min, 1, 0, 1, m
e840: 69 6e 6d 61 78 53 74 65 70 2c 20 6d 69 6e 4d 61  inmaxStep, minMa
e850: 78 46 69 6e 61 6c 69 7a 65 2c 20 6d 69 6e 4d 61  xFinalize, minMa
e860: 78 56 61 6c 75 65 2c 20 30 2c 0a 20 20 20 20 20  xValue, 0,.     
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43       SQLITE_FUNC
e8a0: 5f 4d 49 4e 4d 41 58 20 29 2c 0a 20 20 20 20 46  _MINMAX ),.    F
e8b0: 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20  UNCTION(max,    
e8c0: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 31             -1, 1
e8d0: 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20  , 1, minmaxFunc 
e8e0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
e8f0: 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20  CTION(max,      
e900: 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20            0, 1, 
e910: 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  1, 0            
e920: 20 20 20 20 29 2c 0a 20 20 20 20 57 41 47 47 52      ),.    WAGGR
e930: 45 47 41 54 45 28 6d 61 78 2c 20 31 2c 20 31 2c  EGATE(max, 1, 1,
e940: 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20   1, minmaxStep, 
e950: 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 2c 20  minMaxFinalize, 
e960: 6d 69 6e 4d 61 78 56 61 6c 75 65 2c 20 30 2c 0a  minMaxValue, 0,.
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
e9a0: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 20 29 2c 0a  _FUNC_MINMAX ),.
e9b0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 74 79      FUNCTION2(ty
e9c0: 70 65 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  peof,           
e9d0: 20 31 2c 20 30 2c 20 30 2c 20 74 79 70 65 6f 66   1, 0, 0, typeof
e9e0: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
e9f0: 4e 43 5f 54 59 50 45 4f 46 29 2c 0a 20 20 20 20  NC_TYPEOF),.    
ea00: 46 55 4e 43 54 49 4f 4e 32 28 6c 65 6e 67 74 68  FUNCTION2(length
ea10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ,            1, 
ea20: 30 2c 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63  0, 0, lengthFunc
ea30: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  ,  SQLITE_FUNC_L
ea40: 45 4e 47 54 48 29 2c 0a 20 20 20 20 46 55 4e 43  ENGTH),.    FUNC
ea50: 54 49 4f 4e 28 69 6e 73 74 72 2c 20 20 20 20 20  TION(instr,     
ea60: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30           2, 0, 0
ea70: 2c 20 69 6e 73 74 72 46 75 6e 63 20 20 20 20 20  , instrFunc     
ea80: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
ea90: 4f 4e 28 70 72 69 6e 74 66 2c 20 20 20 20 20 20  ON(printf,      
eaa0: 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20        -1, 0, 0, 
eab0: 70 72 69 6e 74 66 46 75 6e 63 20 20 20 20 20 20  printfFunc      
eac0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
ead0: 28 75 6e 69 63 6f 64 65 2c 20 20 20 20 20 20 20  (unicode,       
eae0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 6e       1, 0, 0, un
eaf0: 69 63 6f 64 65 46 75 6e 63 20 20 20 20 20 20 29  icodeFunc      )
eb00: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63  ,.    FUNCTION(c
eb10: 68 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  har,            
eb20: 20 20 2d 31 2c 20 30 2c 20 30 2c 20 63 68 61 72    -1, 0, 0, char
eb30: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
eb40: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 61 62 73      FUNCTION(abs
eb50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
eb60: 20 31 2c 20 30 2c 20 30 2c 20 61 62 73 46 75 6e   1, 0, 0, absFun
eb70: 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a 23 69  c          ),.#i
eb80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eb90: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
eba0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f  .    FUNCTION(ro
ebb0: 75 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  und,            
ebc0: 20 20 31 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64    1, 0, 0, round
ebd0: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
ebe0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e     FUNCTION(roun
ebf0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
ec00: 32 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75  2, 0, 0, roundFu
ec10: 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 23 65 6e  nc        ),.#en
ec20: 64 69 66 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  dif.    FUNCTION
ec30: 28 75 70 70 65 72 2c 20 20 20 20 20 20 20 20 20  (upper,         
ec40: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 70       1, 0, 0, up
ec50: 70 65 72 46 75 6e 63 20 20 20 20 20 20 20 20 29  perFunc        )
ec60: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c  ,.    FUNCTION(l
ec70: 6f 77 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ower,           
ec80: 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65     1, 0, 0, lowe
ec90: 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a  rFunc        ),.
eca0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 68 65 78      FUNCTION(hex
ecb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ecc0: 20 31 2c 20 30 2c 20 30 2c 20 68 65 78 46 75 6e   1, 0, 0, hexFun
ecd0: 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  c          ),.  
ece0: 20 20 46 55 4e 43 54 49 4f 4e 32 28 69 66 6e 75    FUNCTION2(ifnu
ecf0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 32  ll,            2
ed00: 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63  , 0, 0, noopFunc
ed10: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  ,  SQLITE_FUNC_C
ed20: 4f 41 4c 45 53 43 45 29 2c 0a 20 20 20 20 56 46  OALESCE),.    VF
ed30: 55 4e 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 2c 20  UNCTION(random, 
ed40: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
ed50: 20 30 2c 20 72 61 6e 64 6f 6d 46 75 6e 63 20 20   0, randomFunc  
ed60: 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55 4e       ),.    VFUN
ed70: 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 62 6c 6f 62  CTION(randomblob
ed80: 2c 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30  ,        1, 0, 0
ed90: 2c 20 72 61 6e 64 6f 6d 42 6c 6f 62 20 20 20 20  , randomBlob    
eda0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
edb0: 4f 4e 28 6e 75 6c 6c 69 66 2c 20 20 20 20 20 20  ON(nullif,      
edc0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 31 2c 20         2, 0, 1, 
edd0: 6e 75 6c 6c 69 66 46 75 6e 63 20 20 20 20 20 20  nullifFunc      
ede0: 20 29 2c 0a 20 20 20 20 44 46 55 4e 43 54 49 4f   ),.    DFUNCTIO
edf0: 4e 28 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e  N(sqlite_version
ee00: 2c 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 76 65  ,    0, 0, 0, ve
ee10: 72 73 69 6f 6e 46 75 6e 63 20 20 20 20 20 20 29  rsionFunc      )
ee20: 2c 0a 20 20 20 20 44 46 55 4e 43 54 49 4f 4e 28  ,.    DFUNCTION(
ee30: 73 71 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64  sqlite_source_id
ee40: 2c 20 20 30 2c 20 30 2c 20 30 2c 20 73 6f 75 72  ,  0, 0, 0, sour
ee50: 63 65 69 64 46 75 6e 63 20 20 20 20 20 29 2c 0a  ceidFunc     ),.
ee60: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c      FUNCTION(sql
ee70: 69 74 65 5f 6c 6f 67 2c 20 20 20 20 20 20 20 20  ite_log,        
ee80: 20 32 2c 20 30 2c 20 30 2c 20 65 72 72 6c 6f 67   2, 0, 0, errlog
ee90: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
eea0: 20 20 46 55 4e 43 54 49 4f 4e 28 71 75 6f 74 65    FUNCTION(quote
eeb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
eec0: 2c 20 30 2c 20 30 2c 20 71 75 6f 74 65 46 75 6e  , 0, 0, quoteFun
eed0: 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  c        ),.    
eee0: 56 46 55 4e 43 54 49 4f 4e 28 6c 61 73 74 5f 69  VFUNCTION(last_i
eef0: 6e 73 65 72 74 5f 72 6f 77 69 64 2c 20 30 2c 20  nsert_rowid, 0, 
ef00: 30 2c 20 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72  0, 0, last_inser
ef10: 74 5f 72 6f 77 69 64 29 2c 0a 20 20 20 20 56 46  t_rowid),.    VF
ef20: 55 4e 43 54 49 4f 4e 28 63 68 61 6e 67 65 73 2c  UNCTION(changes,
ef30: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
ef40: 20 30 2c 20 63 68 61 6e 67 65 73 20 20 20 20 20   0, changes     
ef50: 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55 4e       ),.    VFUN
ef60: 43 54 49 4f 4e 28 74 6f 74 61 6c 5f 63 68 61 6e  CTION(total_chan
ef70: 67 65 73 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  ges,     0, 0, 0
ef80: 2c 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20  , total_changes 
ef90: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
efa0: 4f 4e 28 72 65 70 6c 61 63 65 2c 20 20 20 20 20  ON(replace,     
efb0: 20 20 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20         3, 0, 0, 
efc0: 72 65 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20  replaceFunc     
efd0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
efe0: 28 7a 65 72 6f 62 6c 6f 62 2c 20 20 20 20 20 20  (zeroblob,      
eff0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 7a 65       1, 0, 0, ze
f000: 72 6f 62 6c 6f 62 46 75 6e 63 20 20 20 20 20 29  roblobFunc     )
f010: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  ,.    FUNCTION(s
f020: 75 62 73 74 72 2c 20 20 20 20 20 20 20 20 20 20  ubstr,          
f030: 20 20 20 32 2c 20 30 2c 20 30 2c 20 73 75 62 73     2, 0, 0, subs
f040: 74 72 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  trFunc       ),.
f050: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62      FUNCTION(sub
f060: 73 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  str,            
f070: 20 33 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72   3, 0, 0, substr
f080: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
f090: 20 20 57 41 47 47 52 45 47 41 54 45 28 73 75 6d    WAGGREGATE(sum
f0a0: 2c 20 20 20 31 2c 30 2c 30 2c 20 73 75 6d 53 74  ,   1,0,0, sumSt
f0b0: 65 70 2c 20 73 75 6d 46 69 6e 61 6c 69 7a 65 2c  ep, sumFinalize,
f0c0: 20 73 75 6d 46 69 6e 61 6c 69 7a 65 2c 20 73 75   sumFinalize, su
f0d0: 6d 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20 20  mInverse, 0),.  
f0e0: 20 20 57 41 47 47 52 45 47 41 54 45 28 74 6f 74    WAGGREGATE(tot
f0f0: 61 6c 2c 20 31 2c 30 2c 30 2c 20 73 75 6d 53 74  al, 1,0,0, sumSt
f100: 65 70 2c 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65  ep,totalFinalize
f110: 2c 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 2c 73  ,totalFinalize,s
f120: 75 6d 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20  umInverse, 0),. 
f130: 20 20 20 57 41 47 47 52 45 47 41 54 45 28 61 76     WAGGREGATE(av
f140: 67 2c 20 20 20 31 2c 30 2c 30 2c 20 73 75 6d 53  g,   1,0,0, sumS
f150: 74 65 70 2c 20 61 76 67 46 69 6e 61 6c 69 7a 65  tep, avgFinalize
f160: 2c 20 61 76 67 46 69 6e 61 6c 69 7a 65 2c 20 73  , avgFinalize, s
f170: 75 6d 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20  umInverse, 0),. 
f180: 20 20 20 57 41 47 47 52 45 47 41 54 45 28 63 6f     WAGGREGATE(co
f190: 75 6e 74 2c 20 30 2c 30 2c 30 2c 20 63 6f 75 6e  unt, 0,0,0, coun
f1a0: 74 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20  tStep, .        
f1b0: 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 20 63  countFinalize, c
f1c0: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 20 63 6f  ountFinalize, co
f1d0: 75 6e 74 49 6e 76 65 72 73 65 2c 20 53 51 4c 49  untInverse, SQLI
f1e0: 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 20 20 29  TE_FUNC_COUNT  )
f1f0: 2c 0a 20 20 20 20 57 41 47 47 52 45 47 41 54 45  ,.    WAGGREGATE
f200: 28 63 6f 75 6e 74 2c 20 31 2c 30 2c 30 2c 20 63  (count, 1,0,0, c
f210: 6f 75 6e 74 53 74 65 70 2c 20 0a 20 20 20 20 20  ountStep, .     
f220: 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65     countFinalize
f230: 2c 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c  , countFinalize,
f240: 20 63 6f 75 6e 74 49 6e 76 65 72 73 65 2c 20 30   countInverse, 0
f250: 20 20 29 2c 0a 20 20 20 20 57 41 47 47 52 45 47    ),.    WAGGREG
f260: 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ATE(group_concat
f270: 2c 20 31 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70  , 1, 0, 0, group
f280: 43 6f 6e 63 61 74 53 74 65 70 2c 20 0a 20 20 20  ConcatStep, .   
f290: 20 20 20 20 20 67 72 6f 75 70 43 6f 6e 63 61 74       groupConcat
f2a0: 46 69 6e 61 6c 69 7a 65 2c 20 67 72 6f 75 70 43  Finalize, groupC
f2b0: 6f 6e 63 61 74 56 61 6c 75 65 2c 20 67 72 6f 75  oncatValue, grou
f2c0: 70 43 6f 6e 63 61 74 49 6e 76 65 72 73 65 2c 20  pConcatInverse, 
f2d0: 30 29 2c 0a 20 20 20 20 57 41 47 47 52 45 47 41  0),.    WAGGREGA
f2e0: 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c  TE(group_concat,
f2f0: 20 32 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43   2, 0, 0, groupC
f300: 6f 6e 63 61 74 53 74 65 70 2c 20 0a 20 20 20 20  oncatStep, .    
f310: 20 20 20 20 67 72 6f 75 70 43 6f 6e 63 61 74 46      groupConcatF
f320: 69 6e 61 6c 69 7a 65 2c 20 67 72 6f 75 70 43 6f  inalize, groupCo
f330: 6e 63 61 74 56 61 6c 75 65 2c 20 67 72 6f 75 70  ncatValue, group
f340: 43 6f 6e 63 61 74 49 6e 76 65 72 73 65 2c 20 30  ConcatInverse, 0
f350: 29 2c 0a 20 20 0a 20 20 20 20 4c 49 4b 45 46 55  ),.  .    LIKEFU
f360: 4e 43 28 67 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f  NC(glob, 2, &glo
f370: 62 49 6e 66 6f 2c 20 53 51 4c 49 54 45 5f 46 55  bInfo, SQLITE_FU
f380: 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46  NC_LIKE|SQLITE_F
f390: 55 4e 43 5f 43 41 53 45 29 2c 0a 23 69 66 64 65  UNC_CASE),.#ifde
f3a0: 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45  f SQLITE_CASE_SE
f3b0: 4e 53 49 54 49 56 45 5f 4c 49 4b 45 0a 20 20 20  NSITIVE_LIKE.   
f3c0: 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20   LIKEFUNC(like, 
f3d0: 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c  2, &likeInfoAlt,
f3e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
f3f0: 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  E|SQLITE_FUNC_CA
f400: 53 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e  SE),.    LIKEFUN
f410: 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65  C(like, 3, &like
f420: 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f  InfoAlt, SQLITE_
f430: 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45  FUNC_LIKE|SQLITE
f440: 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 23 65 6c  _FUNC_CASE),.#el
f450: 73 65 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28  se.    LIKEFUNC(
f460: 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e  like, 2, &likeIn
f470: 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46  foNorm, SQLITE_F
f480: 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c  UNC_LIKE),.    L
f490: 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c  IKEFUNC(like, 3,
f4a0: 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20   &likeInfoNorm, 
f4b0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
f4c0: 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  ),.#endif.#ifdef
f4d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
f4e0: 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
f4f0: 49 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  ION.    FUNCTION
f500: 28 75 6e 6b 6e 6f 77 6e 2c 20 20 20 20 20 20 20  (unknown,       
f510: 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 75 6e      -1, 0, 0, un
f520: 6b 6e 6f 77 6e 46 75 6e 63 20 20 20 20 20 20 29  knownFunc      )
f530: 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 55 4e  ,.#endif.    FUN
f540: 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20  CTION(coalesce, 
f550: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
f560: 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  0, 0            
f570: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
f580: 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20 20  ION(coalesce,   
f590: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
f5a0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
f5b0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
f5c0: 4e 32 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20  N2(coalesce,    
f5d0: 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 6e       -1, 0, 0, n
f5e0: 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45  oopFunc,  SQLITE
f5f0: 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c  _FUNC_COALESCE),
f600: 0a 20 20 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51  .  };.#ifndef SQ
f610: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
f620: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c  ABLE.  sqlite3Al
f630: 74 65 72 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  terFunctions();.
f640: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f650: 57 69 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73 28  WindowFunctions(
f660: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
f670: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
f680: 54 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  T3) || defined(S
f690: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
f6a0: 54 34 29 0a 20 20 73 71 6c 69 74 65 33 41 6e 61  T4).  sqlite3Ana
f6b0: 6c 79 7a 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b  lyzeFunctions();
f6c0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f6d0: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
f6e0: 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20  eFunctions();.  
f6f0: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 42 75 69  sqlite3InsertBui
f700: 6c 74 69 6e 46 75 6e 63 73 28 61 42 75 69 6c 74  ltinFuncs(aBuilt
f710: 69 6e 46 75 6e 63 2c 20 41 72 72 61 79 53 69 7a  inFunc, ArraySiz
f720: 65 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 29  e(aBuiltinFunc))
f730: 3b 0a 0a 23 69 66 20 30 20 20 2f 2a 20 45 6e 61  ;..#if 0  /* Ena
f740: 62 6c 65 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  ble to print out
f750: 20 68 6f 77 20 74 68 65 20 62 75 69 6c 74 2d 69   how the built-i
f760: 6e 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  n functions are 
f770: 68 61 73 68 65 64 20 2a 2f 0a 20 20 7b 0a 20 20  hashed */.  {.  
f780: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 75 6e    int i;.    Fun
f790: 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 66 6f 72  cDef *p;.    for
f7a0: 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 46  (i=0; i<SQLITE_F
f7b0: 55 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b 2b  UNC_HASH_SZ; i++
f7c0: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
f7d0: 22 46 55 4e 43 2d 48 41 53 48 20 25 30 32 64 3a  "FUNC-HASH %02d:
f7e0: 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 66 6f 72  ", i);.      for
f7f0: 28 70 3d 73 71 6c 69 74 65 33 42 75 69 6c 74 69  (p=sqlite3Builti
f800: 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b 69 5d 3b  nFunctions.a[i];
f810: 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48 61 73 68   p; p=p->u.pHash
f820: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
f830: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f840: 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  30(p->zName);.  
f850: 20 20 20 20 20 20 69 6e 74 20 68 20 3d 20 70 2d        int h = p-
f860: 3e 7a 4e 61 6d 65 5b 30 5d 20 2b 20 6e 3b 0a 20  >zName[0] + n;. 
f870: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20         printf(" 
f880: 25 73 28 25 64 29 22 2c 20 70 2d 3e 7a 4e 61 6d  %s(%d)", p->zNam
f890: 65 2c 20 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, h);.      }. 
f8a0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22       printf("\n"
f8b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
f8c0: 64 69 66 0a 7d 0a                                dif.}.