/ Hex Artifact Content
Login

Artifact 3e8a85f9bfc9117964523a5e17bdbc4b0b9d707830871cbc1dc44b9b538d5d82:


0000: 2f 2a 0a 2a 2a 20 32 30 30 32 20 46 65 62 72 75  /*.** 2002 Febru
0010: 61 72 79 20 32 33 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 23.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
0190: 43 2d 6c 61 6e 67 75 61 67 65 20 69 6d 70 6c 65  C-language imple
01a0: 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 6d  mentations for m
01b0: 61 6e 79 20 6f 66 20 74 68 65 20 53 51 4c 0a 2a  any of the SQL.*
01c0: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6f 66 20 53  * functions of S
01d0: 51 4c 69 74 65 2e 20 20 28 53 6f 6d 65 20 66 75  QLite.  (Some fu
01e0: 6e 63 74 69 6f 6e 2c 20 61 6e 64 20 69 6e 20 70  nction, and in p
01f0: 61 72 74 69 63 75 6c 61 72 20 74 68 65 20 64 61  articular the da
0200: 74 65 20 61 6e 64 0a 2a 2a 20 74 69 6d 65 20 66  te and.** time f
0210: 75 6e 63 74 69 6f 6e 73 2c 20 61 72 65 20 69 6d  unctions, are im
0220: 70 6c 65 6d 65 6e 74 65 64 20 73 65 70 61 72 61  plemented separa
0230: 74 65 6c 79 2e 29 0a 2a 2f 0a 23 69 6e 63 6c 75  tely.).*/.#inclu
0240: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0250: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
0260: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  b.h>.#include <a
0270: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0280: 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 2f  e "vdbeInt.h"../
0290: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
02a0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
02b0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
02c0: 74 68 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  th a function..*
02d0: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
02e0: 20 2a 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63   *sqlite3GetFunc
02f0: 43 6f 6c 6c 53 65 71 28 73 71 6c 69 74 65 33 5f  CollSeq(sqlite3_
0300: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0310: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
0320: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 6e 74  ;.  assert( cont
0330: 65 78 74 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  ext->pVdbe!=0 );
0340: 0a 20 20 70 4f 70 20 3d 20 26 63 6f 6e 74 65 78  .  pOp = &contex
0350: 74 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 63 6f  t->pVdbe->aOp[co
0360: 6e 74 65 78 74 2d 3e 69 4f 70 2d 31 5d 3b 0a 20  ntext->iOp-1];. 
0370: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
0380: 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71  code==OP_CollSeq
0390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
03a0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f  p->p4type==P4_CO
03b0: 4c 4c 53 45 51 20 29 3b 0a 20 20 72 65 74 75 72  LLSEQ );.  retur
03c0: 6e 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  n pOp->p4.pColl;
03d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
03e0: 74 65 20 74 68 61 74 20 74 68 65 20 61 63 63 75  te that the accu
03f0: 6d 75 6c 61 74 6f 72 20 6c 6f 61 64 20 73 68 6f  mulator load sho
0400: 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20 6f  uld be skipped o
0410: 6e 20 74 68 69 73 0a 2a 2a 20 69 74 65 72 61 74  n this.** iterat
0420: 69 6f 6e 20 6f 66 20 74 68 65 20 61 67 67 72 65  ion of the aggre
0430: 67 61 74 65 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74  gate loop..*/.st
0440: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
0450: 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74 6f 72  3SkipAccumulator
0460: 4c 6f 61 64 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Load(sqlite3_con
0470: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
0480: 20 20 61 73 73 65 72 74 28 20 63 6f 6e 74 65 78    assert( contex
0490: 74 2d 3e 69 73 45 72 72 6f 72 3c 3d 30 20 29 3b  t->isError<=0 );
04a0: 0a 20 20 63 6f 6e 74 65 78 74 2d 3e 69 73 45 72  .  context->isEr
04b0: 72 6f 72 20 3d 20 2d 31 3b 0a 20 20 63 6f 6e 74  ror = -1;.  cont
04c0: 65 78 74 2d 3e 73 6b 69 70 46 6c 61 67 20 3d 20  ext->skipFlag = 
04d0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  1;.}../*.** Impl
04e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
04f0: 65 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  e non-aggregate 
0500: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20  min() and max() 
0510: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61  functions.*/.sta
0520: 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78 46  tic void minmaxF
0530: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
0540: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
0550: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
0560: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
0570: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
0580: 20 20 69 6e 74 20 6d 61 73 6b 3b 20 20 20 20 2f    int mask;    /
0590: 2a 20 30 20 66 6f 72 20 6d 69 6e 28 29 20 6f 72  * 0 for min() or
05a0: 20 30 78 66 66 66 66 66 66 66 66 20 66 6f 72 20   0xffffffff for 
05b0: 6d 61 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69  max() */.  int i
05c0: 42 65 73 74 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  Best;.  CollSeq 
05d0: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 61 73 73 65 72  *pColl;..  asser
05e0: 74 28 20 61 72 67 63 3e 31 20 29 3b 0a 20 20 6d  t( argc>1 );.  m
05f0: 61 73 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  ask = sqlite3_us
0600: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
0610: 3d 3d 30 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20  ==0 ? 0 : -1;.  
0620: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
0630: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f  etFuncCollSeq(co
0640: 6e 74 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74  ntext);.  assert
0650: 28 20 70 43 6f 6c 6c 20 29 3b 0a 20 20 61 73 73  ( pColl );.  ass
0660: 65 72 74 28 20 6d 61 73 6b 3d 3d 2d 31 20 7c 7c  ert( mask==-1 ||
0670: 20 6d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 69 42   mask==0 );.  iB
0680: 65 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  est = 0;.  if( s
0690: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
06a0: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
06b0: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
06c0: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61  ;.  for(i=1; i<a
06d0: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rgc; i++){.    i
06e0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
06f0: 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 3d 3d  _type(argv[i])==
0700: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
0710: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 28 73  turn;.    if( (s
0720: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
0730: 28 61 72 67 76 5b 69 42 65 73 74 5d 2c 20 61 72  (argv[iBest], ar
0740: 67 76 5b 69 5d 2c 20 70 43 6f 6c 6c 29 5e 6d 61  gv[i], pColl)^ma
0750: 73 6b 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)>=0 ){.      
0760: 74 65 73 74 63 61 73 65 28 20 6d 61 73 6b 3d 3d  testcase( mask==
0770: 30 20 29 3b 0a 20 20 20 20 20 20 69 42 65 73 74  0 );.      iBest
0780: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
0790: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
07a0: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
07b0: 61 72 67 76 5b 69 42 65 73 74 5d 29 3b 0a 7d 0a  argv[iBest]);.}.
07c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
07d0: 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  e type of the ar
07e0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
07f0: 63 20 76 6f 69 64 20 74 79 70 65 6f 66 46 75 6e  c void typeofFun
0800: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
0810: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
0820: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20   int NotUsed,.  
0830: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0840: 61 72 67 76 0a 29 7b 0a 20 20 73 74 61 74 69 63  argv.){.  static
0850: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 54   const char *azT
0860: 79 70 65 5b 5d 20 3d 20 7b 20 22 69 6e 74 65 67  ype[] = { "integ
0870: 65 72 22 2c 20 22 72 65 61 6c 22 2c 20 22 74 65  er", "real", "te
0880: 78 74 22 2c 20 22 62 6c 6f 62 22 2c 20 22 6e 75  xt", "blob", "nu
0890: 6c 6c 22 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d  ll" };.  int i =
08a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
08b0: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 2d 20 31  ype(argv[0]) - 1
08c0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
08d0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
08e0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
08f0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 54   i<ArraySize(azT
0900: 79 70 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ype) );.  assert
0910: 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ( SQLITE_INTEGER
0920: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
0930: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3d 3d 32   SQLITE_FLOAT==2
0940: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
0950: 4c 49 54 45 5f 54 45 58 54 3d 3d 33 20 29 3b 0a  LITE_TEXT==3 );.
0960: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
0970: 5f 42 4c 4f 42 3d 3d 34 20 29 3b 0a 20 20 61 73  _BLOB==4 );.  as
0980: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4e 55 4c  sert( SQLITE_NUL
0990: 4c 3d 3d 35 20 29 3b 0a 20 20 2f 2a 20 45 56 49  L==5 );.  /* EVI
09a0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 34 37  DENCE-OF: R-0147
09b0: 30 2d 36 30 34 38 32 20 54 68 65 20 73 71 6c 69  0-60482 The sqli
09c0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 56  te3_value_type(V
09d0: 29 20 69 6e 74 65 72 66 61 63 65 20 72 65 74 75  ) interface retu
09e0: 72 6e 73 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  rns.  ** the dat
09f0: 61 74 79 70 65 20 63 6f 64 65 20 66 6f 72 20 74  atype code for t
0a00: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 74  he initial datat
0a10: 79 70 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ype of the sqlit
0a20: 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 0a  e3_value object.
0a30: 20 20 2a 2a 20 56 2e 20 54 68 65 20 72 65 74 75    ** V. The retu
0a40: 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6f 6e  rned value is on
0a50: 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45  e of SQLITE_INTE
0a60: 47 45 52 2c 20 53 51 4c 49 54 45 5f 46 4c 4f 41  GER, SQLITE_FLOA
0a70: 54 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54  T,.  ** SQLITE_T
0a80: 45 58 54 2c 20 53 51 4c 49 54 45 5f 42 4c 4f 42  EXT, SQLITE_BLOB
0a90: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  , or SQLITE_NULL
0aa0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  . */.  sqlite3_r
0ab0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
0ac0: 78 74 2c 20 61 7a 54 79 70 65 5b 69 5d 2c 20 2d  xt, azType[i], -
0ad0: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
0ae0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  );.}.../*.** Imp
0af0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0b00: 68 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e 63  he length() func
0b10: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
0b20: 6f 69 64 20 6c 65 6e 67 74 68 46 75 6e 63 28 0a  oid lengthFunc(.
0b30: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0b40: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
0b50: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
0b60: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
0b70: 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  {.  assert( argc
0b80: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
0b90: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
0ba0: 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74  .  switch( sqlit
0bb0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
0bc0: 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61  gv[0]) ){.    ca
0bd0: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a  se SQLITE_BLOB:.
0be0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0bf0: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
0c00: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
0c10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
0c20: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
0c30: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
0c40: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
0c50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0c60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
0c70: 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
0c80: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
0c90: 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  ed char *z = sql
0ca0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
0cb0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
0cc0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
0cd0: 68 61 72 20 2a 7a 30 3b 0a 20 20 20 20 20 20 75  har *z0;.      u
0ce0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 3b 0a  nsigned char c;.
0cf0: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
0d00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7a   return;.      z
0d10: 30 20 3d 20 7a 3b 0a 20 20 20 20 20 20 77 68 69  0 = z;.      whi
0d20: 6c 65 28 20 28 63 20 3d 20 2a 7a 29 21 3d 30 20  le( (c = *z)!=0 
0d30: 29 7b 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a  ){.        z++;.
0d40: 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30          if( c>=0
0d50: 78 63 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xc0 ){.         
0d60: 20 77 68 69 6c 65 28 20 28 2a 7a 20 26 20 30 78   while( (*z & 0x
0d70: 63 30 29 3d 3d 30 78 38 30 20 29 7b 20 7a 2b 2b  c0)==0x80 ){ z++
0d80: 3b 20 7a 30 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ; z0++; }.      
0d90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
0da0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0db0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 28 69  _int(context, (i
0dc0: 6e 74 29 28 7a 2d 7a 30 29 29 3b 0a 20 20 20 20  nt)(z-z0));.    
0dd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0de0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
0df0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0e00: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
0e10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0e20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0e30: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
0e40: 20 6f 66 20 74 68 65 20 61 62 73 28 29 20 66 75   of the abs() fu
0e50: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d  nction..**.** IM
0e60: 50 3a 20 52 2d 32 33 39 37 39 2d 32 36 38 35 35  P: R-23979-26855
0e70: 20 54 68 65 20 61 62 73 28 58 29 20 66 75 6e 63   The abs(X) func
0e80: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
0e90: 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20   absolute value 
0ea0: 6f 66 0a 2a 2a 20 74 68 65 20 6e 75 6d 65 72 69  of.** the numeri
0eb0: 63 20 61 72 67 75 6d 65 6e 74 20 58 2e 20 0a 2a  c argument X. .*
0ec0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 62  /.static void ab
0ed0: 73 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  sFunc(sqlite3_co
0ee0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
0ef0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
0f00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
0f10: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
0f20: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
0f30: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
0f40: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
0f50: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
0f60: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
0f70: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
0f80: 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56  : {.      i64 iV
0f90: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
0fa0: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
0fb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 56 61  );.      if( iVa
0fc0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  l<0 ){.        i
0fd0: 66 28 20 69 56 61 6c 3d 3d 53 4d 41 4c 4c 45 53  f( iVal==SMALLES
0fe0: 54 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20 20 20  T_INT64 ){.     
0ff0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
1000: 31 36 37 36 2d 34 35 35 30 39 20 49 66 20 58 20  1676-45509 If X 
1010: 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 2d  is the integer -
1020: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1030: 38 30 38 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  808.          **
1040: 20 74 68 65 6e 20 61 62 73 28 58 29 20 74 68 72   then abs(X) thr
1050: 6f 77 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  ows an integer o
1060: 76 65 72 66 6c 6f 77 20 65 72 72 6f 72 20 73 69  verflow error si
1070: 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 0a  nce there is no.
1080: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75            ** equ
1090: 69 76 61 6c 65 6e 74 20 70 6f 73 69 74 69 76 65  ivalent positive
10a0: 20 36 34 2d 62 69 74 20 74 77 6f 20 63 6f 6d 70   64-bit two comp
10b0: 6c 65 6d 65 6e 74 20 76 61 6c 75 65 2e 20 2a 2f  lement value. */
10c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
10e0: 63 6f 6e 74 65 78 74 2c 20 22 69 6e 74 65 67 65  context, "intege
10f0: 72 20 6f 76 65 72 66 6c 6f 77 22 2c 20 2d 31 29  r overflow", -1)
1100: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1110: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
1120: 20 20 20 20 20 20 69 56 61 6c 20 3d 20 2d 69 56        iVal = -iV
1130: 61 6c 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 20  al;.      } .   
1140: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1150: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
1160: 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 62 72   iVal);.      br
1170: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1180: 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
1190: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a   {.      /* IMP:
11a0: 20 52 2d 33 37 34 33 34 2d 31 39 39 32 39 20 41   R-37434-19929 A
11b0: 62 73 28 58 29 20 72 65 74 75 72 6e 73 20 4e 55  bs(X) returns NU
11c0: 4c 4c 20 69 66 20 58 20 69 73 20 4e 55 4c 4c 2e  LL if X is NULL.
11d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
11e0: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f  3_result_null(co
11f0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 62 72  ntext);.      br
1200: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
1210: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1220: 2f 2a 20 42 65 63 61 75 73 65 20 73 71 6c 69 74  /* Because sqlit
1230: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
1240: 29 20 72 65 74 75 72 6e 73 20 30 2e 30 20 69 66  ) returns 0.0 if
1250: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
1260: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 73 6f   not.      ** so
1270: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 61 6e  mething that can
1280: 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
1290: 74 6f 20 61 20 6e 75 6d 62 65 72 2c 20 77 65 20  to a number, we 
12a0: 68 61 76 65 3a 0a 20 20 20 20 20 20 2a 2a 20 49  have:.      ** I
12b0: 4d 50 3a 20 52 2d 30 31 39 39 32 2d 30 30 35 31  MP: R-01992-0051
12c0: 39 20 41 62 73 28 58 29 20 72 65 74 75 72 6e 73  9 Abs(X) returns
12d0: 20 30 2e 30 20 69 66 20 58 20 69 73 20 61 20 73   0.0 if X is a s
12e0: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 0a 20 20  tring or blob.  
12f0: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6e 6e      ** that cann
1300: 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ot be converted 
1310: 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c  to a numeric val
1320: 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ue..      */.   
1330: 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 20 3d     double rVal =
1340: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
1350: 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a  ouble(argv[0]);.
1360: 20 20 20 20 20 20 69 66 28 20 72 56 61 6c 3c 30        if( rVal<0
1370: 20 29 20 72 56 61 6c 20 3d 20 2d 72 56 61 6c 3b   ) rVal = -rVal;
1380: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
1390: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
13a0: 74 65 78 74 2c 20 72 56 61 6c 29 3b 0a 20 20 20  text, rVal);.   
13b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70    }.}../*.** Imp
13d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
13e0: 68 65 20 69 6e 73 74 72 28 29 20 66 75 6e 63 74  he instr() funct
13f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 72  ion..**.** instr
1400: 28 68 61 79 73 74 61 63 6b 2c 6e 65 65 64 6c 65  (haystack,needle
1410: 29 20 66 69 6e 64 73 20 74 68 65 20 66 69 72 73  ) finds the firs
1420: 74 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20  t occurrence of 
1430: 6e 65 65 64 6c 65 0a 2a 2a 20 69 6e 20 68 61 79  needle.** in hay
1440: 73 74 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e  stack and return
1450: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1460: 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
1470: 65 72 73 20 70 6c 75 73 20 31 2c 0a 2a 2a 20 6f  ers plus 1,.** o
1480: 72 20 30 20 69 66 20 6e 65 65 64 6c 65 20 64 6f  r 0 if needle do
1490: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 77 69 74  es not occur wit
14a0: 68 69 6e 20 68 61 79 73 74 61 63 6b 2e 0a 2a 2a  hin haystack..**
14b0: 0a 2a 2a 20 49 66 20 62 6f 74 68 20 68 61 79 73  .** If both hays
14c0: 74 61 63 6b 20 61 6e 64 20 6e 65 65 64 6c 65 20  tack and needle 
14d0: 61 72 65 20 42 4c 4f 42 73 2c 20 74 68 65 6e 20  are BLOBs, then 
14e0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6f 6e  the result is on
14f0: 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
1500: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1510: 65 73 20 69 6e 20 68 61 79 73 74 61 63 6b 20 70  es in haystack p
1520: 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rior to the firs
1530: 74 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20  t occurrence of 
1540: 6e 65 65 64 6c 65 2c 0a 2a 2a 20 6f 72 20 30 20  needle,.** or 0 
1550: 69 66 20 6e 65 65 64 6c 65 20 6e 65 76 65 72 20  if needle never 
1560: 6f 63 63 75 72 73 20 69 6e 20 68 61 79 73 74 61  occurs in haysta
1570: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
1580: 69 64 20 69 6e 73 74 72 46 75 6e 63 28 0a 20 20  id instrFunc(.  
1590: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
15a0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
15b0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
15c0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
15d0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
15e0: 20 63 68 61 72 20 2a 7a 48 61 79 73 74 61 63 6b   char *zHaystack
15f0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1600: 65 64 20 63 68 61 72 20 2a 7a 4e 65 65 64 6c 65  ed char *zNeedle
1610: 3b 0a 20 20 69 6e 74 20 6e 48 61 79 73 74 61 63  ;.  int nHaystac
1620: 6b 3b 0a 20 20 69 6e 74 20 6e 4e 65 65 64 6c 65  k;.  int nNeedle
1630: 3b 0a 20 20 69 6e 74 20 74 79 70 65 48 61 79 73  ;.  int typeHays
1640: 74 61 63 6b 2c 20 74 79 70 65 4e 65 65 64 6c 65  tack, typeNeedle
1650: 3b 0a 20 20 69 6e 74 20 4e 20 3d 20 31 3b 0a 20  ;.  int N = 1;. 
1660: 20 69 6e 74 20 69 73 54 65 78 74 3b 0a 0a 20 20   int isText;..  
1670: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1680: 28 61 72 67 63 29 3b 0a 20 20 74 79 70 65 48 61  (argc);.  typeHa
1690: 79 73 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  ystack = sqlite3
16a0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
16b0: 5b 30 5d 29 3b 0a 20 20 74 79 70 65 4e 65 65 64  [0]);.  typeNeed
16c0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
16d0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29  ue_type(argv[1])
16e0: 3b 0a 20 20 69 66 28 20 74 79 70 65 48 61 79 73  ;.  if( typeHays
16f0: 74 61 63 6b 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  tack==SQLITE_NUL
1700: 4c 20 7c 7c 20 74 79 70 65 4e 65 65 64 6c 65 3d  L || typeNeedle=
1710: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72  =SQLITE_NULL ) r
1720: 65 74 75 72 6e 3b 0a 20 20 6e 48 61 79 73 74 61  eturn;.  nHaysta
1730: 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ck = sqlite3_val
1740: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
1750: 29 3b 0a 20 20 6e 4e 65 65 64 6c 65 20 3d 20 73  );.  nNeedle = s
1760: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
1770: 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  es(argv[1]);.  i
1780: 66 28 20 6e 4e 65 65 64 6c 65 3e 30 20 29 7b 0a  f( nNeedle>0 ){.
1790: 20 20 20 20 69 66 28 20 74 79 70 65 48 61 79 73      if( typeHays
17a0: 74 61 63 6b 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  tack==SQLITE_BLO
17b0: 42 20 26 26 20 74 79 70 65 4e 65 65 64 6c 65 3d  B && typeNeedle=
17c0: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a  =SQLITE_BLOB ){.
17d0: 20 20 20 20 20 20 7a 48 61 79 73 74 61 63 6b 20        zHaystack 
17e0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
17f0: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
1800: 20 20 20 20 20 7a 4e 65 65 64 6c 65 20 3d 20 73       zNeedle = s
1810: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
1820: 62 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  b(argv[1]);.    
1830: 20 20 69 73 54 65 78 74 20 3d 20 30 3b 0a 20 20    isText = 0;.  
1840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1850: 48 61 79 73 74 61 63 6b 20 3d 20 73 71 6c 69 74  Haystack = sqlit
1860: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1870: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7a 4e  gv[0]);.      zN
1880: 65 65 64 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  eedle = sqlite3_
1890: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
18a0: 31 5d 29 3b 0a 20 20 20 20 20 20 69 73 54 65 78  1]);.      isTex
18b0: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
18c0: 20 69 66 28 20 7a 4e 65 65 64 6c 65 3d 3d 30 20   if( zNeedle==0 
18d0: 7c 7c 20 28 6e 48 61 79 73 74 61 63 6b 20 26 26  || (nHaystack &&
18e0: 20 7a 48 61 79 73 74 61 63 6b 3d 3d 30 29 20 29   zHaystack==0) )
18f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 77 68 69   return;.    whi
1900: 6c 65 28 20 6e 4e 65 65 64 6c 65 3c 3d 6e 48 61  le( nNeedle<=nHa
1910: 79 73 74 61 63 6b 20 26 26 20 6d 65 6d 63 6d 70  ystack && memcmp
1920: 28 7a 48 61 79 73 74 61 63 6b 2c 20 7a 4e 65 65  (zHaystack, zNee
1930: 64 6c 65 2c 20 6e 4e 65 65 64 6c 65 29 21 3d 30  dle, nNeedle)!=0
1940: 20 29 7b 0a 20 20 20 20 20 20 4e 2b 2b 3b 0a 20   ){.      N++;. 
1950: 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
1960: 20 6e 48 61 79 73 74 61 63 6b 2d 2d 3b 0a 20 20   nHaystack--;.  
1970: 20 20 20 20 20 20 7a 48 61 79 73 74 61 63 6b 2b        zHaystack+
1980: 2b 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  +;.      }while(
1990: 20 69 73 54 65 78 74 20 26 26 20 28 7a 48 61 79   isText && (zHay
19a0: 73 74 61 63 6b 5b 30 5d 26 30 78 63 30 29 3d 3d  stack[0]&0xc0)==
19b0: 30 78 38 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  0x80 );.    }.  
19c0: 20 20 69 66 28 20 6e 4e 65 65 64 6c 65 3e 6e 48    if( nNeedle>nH
19d0: 61 79 73 74 61 63 6b 20 29 20 4e 20 3d 20 30 3b  aystack ) N = 0;
19e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
19f0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
1a00: 74 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t, N);.}../*.** 
1a10: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1a20: 66 20 74 68 65 20 70 72 69 6e 74 66 28 29 20 66  f the printf() f
1a30: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1a40: 69 63 20 76 6f 69 64 20 70 72 69 6e 74 66 46 75  ic void printfFu
1a50: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
1a60: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
1a70: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
1a80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1a90: 67 76 0a 29 7b 0a 20 20 50 72 69 6e 74 66 41 72  gv.){.  PrintfAr
1aa0: 67 75 6d 65 6e 74 73 20 78 3b 0a 20 20 53 74 72  guments x;.  Str
1ab0: 41 63 63 75 6d 20 73 74 72 3b 0a 20 20 63 6f 6e  Accum str;.  con
1ac0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1ad0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
1ae0: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
1af0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
1b00: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 0a  ndle(context);..
1b10: 20 20 69 66 28 20 61 72 67 63 3e 3d 31 20 26 26    if( argc>=1 &&
1b20: 20 28 7a 46 6f 72 6d 61 74 20 3d 20 28 63 6f 6e   (zFormat = (con
1b30: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1b40: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1b50: 5b 30 5d 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  [0]))!=0 ){.    
1b60: 78 2e 6e 41 72 67 20 3d 20 61 72 67 63 2d 31 3b  x.nArg = argc-1;
1b70: 0a 20 20 20 20 78 2e 6e 55 73 65 64 20 3d 20 30  .    x.nUsed = 0
1b80: 3b 0a 20 20 20 20 78 2e 61 70 41 72 67 20 3d 20  ;.    x.apArg = 
1b90: 61 72 67 76 2b 31 3b 0a 20 20 20 20 73 71 6c 69  argv+1;.    sqli
1ba0: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
1bb0: 26 73 74 72 2c 20 64 62 2c 20 30 2c 20 30 2c 20  &str, db, 0, 0, 
1bc0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
1bd0: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 29  E_LIMIT_LENGTH])
1be0: 3b 0a 20 20 20 20 73 74 72 2e 70 72 69 6e 74 66  ;.    str.printf
1bf0: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 50  Flags = SQLITE_P
1c00: 52 49 4e 54 46 5f 53 51 4c 46 55 4e 43 3b 0a 20  RINTF_SQLFUNC;. 
1c10: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
1c20: 70 70 65 6e 64 66 28 26 73 74 72 2c 20 7a 46 6f  ppendf(&str, zFo
1c30: 72 6d 61 74 2c 20 26 78 29 3b 0a 20 20 20 20 6e  rmat, &x);.    n
1c40: 20 3d 20 73 74 72 2e 6e 43 68 61 72 3b 0a 20 20   = str.nChar;.  
1c50: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1c60: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  _text(context, s
1c70: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
1c80: 6e 69 73 68 28 26 73 74 72 29 2c 20 6e 2c 0a 20  nish(&str), n,. 
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 59         SQLITE_DY
1cb0: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
1cc0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1cd0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1ce0: 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  r() function..**
1cf0: 0a 2a 2a 20 73 75 62 73 74 72 28 78 2c 70 31 2c  .** substr(x,p1,
1d00: 70 32 29 20 20 72 65 74 75 72 6e 73 20 70 32 20  p2)  returns p2 
1d10: 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 78 5b  characters of x[
1d20: 5d 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  ] beginning with
1d30: 20 70 31 2e 0a 2a 2a 20 70 31 20 69 73 20 31 2d   p1..** p1 is 1-
1d40: 69 6e 64 65 78 65 64 2e 20 20 53 6f 20 73 75 62  indexed.  So sub
1d50: 73 74 72 28 78 2c 31 2c 31 29 20 72 65 74 75 72  str(x,1,1) retur
1d60: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 68 61  ns the first cha
1d70: 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 78 2e 20  racter.** of x. 
1d80: 20 49 66 20 78 20 69 73 20 74 65 78 74 2c 20 74   If x is text, t
1d90: 68 65 6e 20 77 65 20 61 63 74 75 61 6c 6c 79 20  hen we actually 
1da0: 63 6f 75 6e 74 20 55 54 46 2d 38 20 63 68 61 72  count UTF-8 char
1db0: 61 63 74 65 72 73 2e 0a 2a 2a 20 49 66 20 78 20  acters..** If x 
1dc0: 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 6e 20  is a blob, then 
1dd0: 77 65 20 63 6f 75 6e 74 20 62 79 74 65 73 2e 0a  we count bytes..
1de0: 2a 2a 0a 2a 2a 20 49 66 20 70 31 20 69 73 20 6e  **.** If p1 is n
1df0: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 77 65  egative, then we
1e00: 20 62 65 67 69 6e 20 61 62 73 28 70 31 29 20 66   begin abs(p1) f
1e10: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 78  rom the end of x
1e20: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 32 20  []..**.** If p2 
1e30: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 72 65 74  is negative, ret
1e40: 75 72 6e 20 74 68 65 20 70 32 20 63 68 61 72 61  urn the p2 chara
1e50: 63 74 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  cters preceding 
1e60: 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  p1..*/.static vo
1e70: 69 64 20 73 75 62 73 74 72 46 75 6e 63 28 0a 20  id substrFunc(. 
1e80: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1e90: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
1ea0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
1eb0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
1ec0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1ed0: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e  d char *z;.  con
1ee0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ef0: 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b   *z2;.  int len;
1f00: 0a 20 20 69 6e 74 20 70 30 74 79 70 65 3b 0a 20  .  int p0type;. 
1f10: 20 69 36 34 20 70 31 2c 20 70 32 3b 0a 20 20 69   i64 p1, p2;.  i
1f20: 6e 74 20 6e 65 67 50 32 20 3d 20 30 3b 0a 0a 20  nt negP2 = 0;.. 
1f30: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33   assert( argc==3
1f40: 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20   || argc==2 );. 
1f50: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
1f60: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29  ue_type(argv[1])
1f70: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20  ==SQLITE_NULL.  
1f80: 20 7c 7c 20 28 61 72 67 63 3d 3d 33 20 26 26 20   || (argc==3 && 
1f90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1fa0: 70 65 28 61 72 67 76 5b 32 5d 29 3d 3d 53 51 4c  pe(argv[2])==SQL
1fb0: 49 54 45 5f 4e 55 4c 4c 29 0a 20 20 29 7b 0a 20  ITE_NULL).  ){. 
1fc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1fd0: 20 70 30 74 79 70 65 20 3d 20 73 71 6c 69 74 65   p0type = sqlite
1fe0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
1ff0: 76 5b 30 5d 29 3b 0a 20 20 70 31 20 3d 20 73 71  v[0]);.  p1 = sq
2000: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
2010: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  argv[1]);.  if( 
2020: 70 30 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42  p0type==SQLITE_B
2030: 4c 4f 42 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  LOB ){.    len =
2040: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
2050: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
2060: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
2070: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
2080: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  ]);.    if( z==0
2090: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61   ) return;.    a
20a0: 73 73 65 72 74 28 20 6c 65 6e 3d 3d 73 71 6c 69  ssert( len==sqli
20b0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
20c0: 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 7d 65  argv[0]) );.  }e
20d0: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
20e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
20f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
2100: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
2110: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
2120: 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20    if( p1<0 ){.  
2130: 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a      for(z2=z; *z
2140: 32 3b 20 6c 65 6e 2b 2b 29 7b 0a 20 20 20 20 20  2; len++){.     
2150: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
2160: 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 20 20 7d  TF8(z2);.      }
2170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
2180: 66 20 53 51 4c 49 54 45 5f 53 55 42 53 54 52 5f  f SQLITE_SUBSTR_
2190: 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 0a 20 20  COMPATIBILITY.  
21a0: 2f 2a 20 49 66 20 53 55 42 53 54 52 5f 43 4f 4d  /* If SUBSTR_COM
21b0: 50 41 54 49 42 49 4c 49 54 59 20 69 73 20 64 65  PATIBILITY is de
21c0: 66 69 6e 65 64 20 74 68 65 6e 20 73 75 62 73 74  fined then subst
21d0: 72 28 58 2c 30 2c 4e 29 20 77 6f 72 6b 20 74 68  r(X,0,N) work th
21e0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 61  e same as.  ** a
21f0: 73 20 73 75 62 73 74 72 28 58 2c 31 2c 4e 29 20  s substr(X,1,N) 
2200: 2d 20 69 74 20 72 65 74 75 72 6e 73 20 74 68 65  - it returns the
2210: 20 66 69 72 73 74 20 4e 20 63 68 61 72 61 63 74   first N charact
2220: 65 72 73 20 6f 66 20 58 2e 20 20 54 68 69 73 0a  ers of X.  This.
2230: 20 20 2a 2a 20 69 73 20 65 73 73 65 6e 74 69 61    ** is essentia
2240: 6c 6c 79 20 61 20 62 61 63 6b 2d 6f 75 74 20 6f  lly a back-out o
2250: 66 20 74 68 65 20 62 75 67 2d 66 69 78 20 69 6e  f the bug-fix in
2260: 20 63 68 65 63 6b 2d 69 6e 20 5b 35 66 63 31 32   check-in [5fc12
2270: 35 64 33 36 32 64 66 34 62 38 5d 0a 20 20 2a 2a  5d362df4b8].  **
2280: 20 66 72 6f 6d 20 32 30 30 39 2d 30 32 2d 30 32   from 2009-02-02
2290: 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69   for compatibili
22a0: 74 79 20 6f 66 20 61 70 70 6c 69 63 61 74 69 6f  ty of applicatio
22b0: 6e 73 20 74 68 61 74 20 65 78 70 6c 6f 69 74 65  ns that exploite
22c0: 64 20 74 68 65 0a 20 20 2a 2a 20 6f 6c 64 20 62  d the.  ** old b
22d0: 75 67 67 79 20 62 65 68 61 76 69 6f 72 2e 20 2a  uggy behavior. *
22e0: 2f 0a 20 20 69 66 28 20 70 31 3d 3d 30 20 29 20  /.  if( p1==0 ) 
22f0: 70 31 20 3d 20 31 3b 20 2f 2a 20 3c 72 64 61 72  p1 = 1; /* <rdar
2300: 3a 2f 2f 70 72 6f 62 6c 65 6d 2f 36 37 37 38 33  ://problem/67783
2310: 33 39 3e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  39> */.#endif.  
2320: 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20  if( argc==3 ){. 
2330: 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f     p2 = sqlite3_
2340: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32  value_int(argv[2
2350: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 32 3c 30  ]);.    if( p2<0
2360: 20 29 7b 0a 20 20 20 20 20 20 70 32 20 3d 20 2d   ){.      p2 = -
2370: 70 32 3b 0a 20 20 20 20 20 20 6e 65 67 50 32 20  p2;.      negP2 
2380: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2390: 73 65 7b 0a 20 20 20 20 70 32 20 3d 20 73 71 6c  se{.    p2 = sql
23a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
23b0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 2d  handle(context)-
23c0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
23d0: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20  IMIT_LENGTH];.  
23e0: 7d 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a  }.  if( p1<0 ){.
23f0: 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20      p1 += len;. 
2400: 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20     if( p1<0 ){. 
2410: 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20       p2 += p1;. 
2420: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 20       if( p2<0 ) 
2430: 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 31  p2 = 0;.      p1
2440: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
2450: 6c 73 65 20 69 66 28 20 70 31 3e 30 20 29 7b 0a  lse if( p1>0 ){.
2460: 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 65 6c 73      p1--;.  }els
2470: 65 20 69 66 28 20 70 32 3e 30 20 29 7b 0a 20 20  e if( p2>0 ){.  
2480: 20 20 70 32 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66    p2--;.  }.  if
2490: 28 20 6e 65 67 50 32 20 29 7b 0a 20 20 20 20 70  ( negP2 ){.    p
24a0: 31 20 2d 3d 20 70 32 3b 0a 20 20 20 20 69 66 28  1 -= p2;.    if(
24b0: 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70   p1<0 ){.      p
24c0: 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 70  2 += p1;.      p
24d0: 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 = 0;.    }.  }
24e0: 0a 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30  .  assert( p1>=0
24f0: 20 26 26 20 70 32 3e 3d 30 20 29 3b 0a 20 20 69   && p2>=0 );.  i
2500: 66 28 20 70 30 74 79 70 65 21 3d 53 51 4c 49 54  f( p0type!=SQLIT
2510: 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 77 68  E_BLOB ){.    wh
2520: 69 6c 65 28 20 2a 7a 20 26 26 20 70 31 20 29 7b  ile( *z && p1 ){
2530: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b  .      SQLITE_SK
2540: 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20  IP_UTF8(z);.    
2550: 20 20 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20    p1--;.    }.  
2560: 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 20    for(z2=z; *z2 
2570: 26 26 20 70 32 3b 20 70 32 2d 2d 29 7b 0a 20 20  && p2; p2--){.  
2580: 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f      SQLITE_SKIP_
2590: 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 7d 0a  UTF8(z2);.    }.
25a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
25b0: 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78  lt_text64(contex
25c0: 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a 32 2d  t, (char*)z, z2-
25d0: 7a 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  z, SQLITE_TRANSI
25e0: 45 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ENT,.           
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2600: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 7d  QLITE_UTF8);.  }
2610: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 31  else{.    if( p1
2620: 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 20  +p2>len ){.     
2630: 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a 20 20   p2 = len-p1;.  
2640: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 20 70      if( p2<0 ) p
2650: 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 0;.    }.   
2660: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2670: 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20  blob64(context, 
2680: 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20 28  (char*)&z[p1], (
2690: 75 36 34 29 70 32 2c 20 53 51 4c 49 54 45 5f 54  u64)p2, SQLITE_T
26a0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d  RANSIENT);.  }.}
26b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
26c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  tation of the ro
26d0: 75 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a  und() function.*
26e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
26f0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
2700: 4f 49 4e 54 0a 73 74 61 74 69 63 20 76 6f 69 64  OINT.static void
2710: 20 72 6f 75 6e 64 46 75 6e 63 28 73 71 6c 69 74   roundFunc(sqlit
2720: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
2730: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
2740: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2750: 72 67 76 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  rgv){.  int n = 
2760: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  0;.  double r;. 
2770: 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 61   char *zBuf;.  a
2780: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
2790: 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69  | argc==2 );.  i
27a0: 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20  f( argc==2 ){.  
27b0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
27c0: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
27d0: 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 20 29  _type(argv[1]) )
27e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d   return;.    n =
27f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2800: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  nt(argv[1]);.   
2810: 20 69 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d 20   if( n>30 ) n = 
2820: 33 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20  30;.    if( n<0 
2830: 29 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ) n = 0;.  }.  i
2840: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
2850: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
2860: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
2870: 74 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71 6c 69  turn;.  r = sqli
2880: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
2890: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20  (argv[0]);.  /* 
28a0: 49 66 20 59 3d 3d 30 20 61 6e 64 20 58 20 77 69  If Y==0 and X wi
28b0: 6c 6c 20 66 69 74 20 69 6e 20 61 20 36 34 2d 62  ll fit in a 64-b
28c0: 69 74 20 69 6e 74 2c 0a 20 20 2a 2a 20 68 61 6e  it int,.  ** han
28d0: 64 6c 65 20 74 68 65 20 72 6f 75 6e 64 69 6e 67  dle the rounding
28e0: 20 64 69 72 65 63 74 6c 79 2c 0a 20 20 2a 2a 20   directly,.  ** 
28f0: 6f 74 68 65 72 77 69 73 65 20 75 73 65 20 70 72  otherwise use pr
2900: 69 6e 74 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  intf..  */.  if(
2910: 20 6e 3d 3d 30 20 26 26 20 72 3e 3d 30 20 26 26   n==0 && r>=0 &&
2920: 20 72 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   r<LARGEST_INT64
2930: 2d 31 20 29 7b 0a 20 20 20 20 72 20 3d 20 28 64  -1 ){.    r = (d
2940: 6f 75 62 6c 65 29 28 28 73 71 6c 69 74 65 5f 69  ouble)((sqlite_i
2950: 6e 74 36 34 29 28 72 2b 30 2e 35 29 29 3b 0a 20  nt64)(r+0.5));. 
2960: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20   }else if( n==0 
2970: 26 26 20 72 3c 30 20 26 26 20 28 2d 72 29 3c 4c  && r<0 && (-r)<L
2980: 41 52 47 45 53 54 5f 49 4e 54 36 34 2d 31 20 29  ARGEST_INT64-1 )
2990: 7b 0a 20 20 20 20 72 20 3d 20 2d 28 64 6f 75 62  {.    r = -(doub
29a0: 6c 65 29 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  le)((sqlite_int6
29b0: 34 29 28 28 2d 72 29 2b 30 2e 35 29 29 3b 0a 20  4)((-r)+0.5));. 
29c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 42 75 66   }else{.    zBuf
29d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
29e0: 74 66 28 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a  tf("%.*f",n,r);.
29f0: 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20      if( zBuf==0 
2a00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a10: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
2a20: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
2a30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2a40: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  }.    sqlite3Ato
2a50: 46 28 7a 42 75 66 2c 20 26 72 2c 20 73 71 6c 69  F(zBuf, &r, sqli
2a60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
2a70: 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
2a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2a90: 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 73  e(zBuf);.  }.  s
2aa0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
2ab0: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29  uble(context, r)
2ac0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2ad0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
2ae0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2af0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  using sqlite3Mal
2b00: 6c 6f 63 28 29 2e 20 49 66 20 74 68 65 0a 2a 2a  loc(). If the.**
2b10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2b20: 73 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  s, call sqlite3_
2b30: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
2b40: 65 6d 28 29 20 74 6f 20 6e 6f 74 69 66 79 0a 2a  em() to notify.*
2b50: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  * the database h
2b60: 61 6e 64 6c 65 20 74 68 61 74 20 6d 61 6c 6c 6f  andle that mallo
2b70: 63 28 29 20 68 61 73 20 66 61 69 6c 65 64 20 61  c() has failed a
2b80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
2b90: 2a 2a 20 49 66 20 6e 42 79 74 65 20 69 73 20 6c  ** If nByte is l
2ba0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d  arger than the m
2bb0: 61 78 69 6d 75 6d 20 73 74 72 69 6e 67 20 6f 72  aximum string or
2bc0: 20 62 6c 6f 62 20 6c 65 6e 67 74 68 2c 20 74 68   blob length, th
2bd0: 65 6e 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53  en.** raise an S
2be0: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 65 78 63  QLITE_TOOBIG exc
2bf0: 65 70 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72  eption and retur
2c00: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
2c10: 63 20 76 6f 69 64 20 2a 63 6f 6e 74 65 78 74 4d  c void *contextM
2c20: 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 63 6f  alloc(sqlite3_co
2c30: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
2c40: 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 63 68  i64 nByte){.  ch
2c50: 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33  ar *z;.  sqlite3
2c60: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
2c70: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
2c80: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61 73 73  (context);.  ass
2c90: 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a  ert( nByte>0 );.
2ca0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 42 79 74    testcase( nByt
2cb0: 65 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e==db->aLimit[SQ
2cc0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
2cd0: 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  H] );.  testcase
2ce0: 28 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61 4c 69  ( nByte==db->aLi
2cf0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
2d00: 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20  _LENGTH]+1 );.  
2d10: 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c  if( nByte>db->aL
2d20: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
2d30: 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
2d40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2d50: 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e  error_toobig(con
2d60: 74 65 78 74 29 3b 0a 20 20 20 20 7a 20 3d 20 30  text);.    z = 0
2d70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2d80: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2d90: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
2da0: 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   !z ){.      sql
2db0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2dc0: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
2dd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2de0: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
2df0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2e00: 6f 66 20 74 68 65 20 75 70 70 65 72 28 29 20 61  of the upper() a
2e10: 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20 66  nd lower() SQL f
2e20: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  unctions..*/.sta
2e30: 74 69 63 20 76 6f 69 64 20 75 70 70 65 72 46 75  tic void upperFu
2e40: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
2e50: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
2e60: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
2e70: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
2e80: 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73  char *z1;.  cons
2e90: 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e  t char *z2;.  in
2ea0: 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45 44  t i, n;.  UNUSED
2eb0: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
2ec0: 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a 29  ;.  z2 = (char*)
2ed0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
2ee0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e  xt(argv[0]);.  n
2ef0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2f00: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
2f10: 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
2f20: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62  t the call to _b
2f30: 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74 20  ytes() does not 
2f40: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 5f  invalidate the _
2f50: 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20 2a  text() pointer *
2f60: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d 3d  /.  assert( z2==
2f70: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
2f80: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
2f90: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20 29  ]) );.  if( z2 )
2fa0: 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65  {.    z1 = conte
2fb0: 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74  xtMalloc(context
2fc0: 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a 20  , ((i64)n)+1);. 
2fd0: 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20 20     if( z1 ){.   
2fe0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
2ff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a   i++){.        z
3000: 31 5b 69 5d 20 3d 20 28 63 68 61 72 29 73 71 6c  1[i] = (char)sql
3010: 69 74 65 33 54 6f 75 70 70 65 72 28 7a 32 5b 69  ite3Toupper(z2[i
3020: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
3030: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3040: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
3050: 31 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72  1, n, sqlite3_fr
3060: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ee);.    }.  }.}
3070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 77  .static void low
3080: 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  erFunc(sqlite3_c
3090: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
30a0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
30b0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
30c0: 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  {.  char *z1;.  
30d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
30e0: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e    int i, n;.  UN
30f0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
3100: 72 67 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68  rgc);.  z2 = (ch
3110: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
3120: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
3130: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
3140: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
3150: 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79  0]);.  /* Verify
3160: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
3170: 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20  o _bytes() does 
3180: 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74  not invalidate t
3190: 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74  he _text() point
31a0: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
31b0: 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74  z2==(char*)sqlit
31c0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
31d0: 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  gv[0]) );.  if( 
31e0: 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63  z2 ){.    z1 = c
31f0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
3200: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31  text, ((i64)n)+1
3210: 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b  );.    if( z1 ){
3220: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
3230: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
3240: 20 20 20 7a 31 5b 69 5d 20 3d 20 73 71 6c 69 74     z1[i] = sqlit
3250: 65 33 54 6f 6c 6f 77 65 72 28 7a 32 5b 69 5d 29  e3Tolower(z2[i])
3260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3270: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
3280: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c  ext(context, z1,
3290: 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   n, sqlite3_free
32a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
32b0: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 66 75 6e 63 74  /*.** Some funct
32c0: 69 6f 6e 73 20 6c 69 6b 65 20 43 4f 41 4c 45 53  ions like COALES
32d0: 43 45 28 29 20 61 6e 64 20 49 46 4e 55 4c 4c 28  CE() and IFNULL(
32e0: 29 20 61 6e 64 20 55 4e 4c 49 4b 45 4c 59 28 29  ) and UNLIKELY()
32f0: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
3300: 0a 2a 2a 20 61 73 20 56 44 42 45 20 63 6f 64 65  .** as VDBE code
3310: 20 73 6f 20 74 68 61 74 20 75 6e 75 73 65 64 20   so that unused 
3320: 61 72 67 75 6d 65 6e 74 20 76 61 6c 75 65 73 20  argument values 
3330: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 62  do not have to b
3340: 65 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2a 20 48  e computed..** H
3350: 6f 77 65 76 65 72 2c 20 77 65 20 73 74 69 6c 6c  owever, we still
3360: 20 6e 65 65 64 20 73 6f 6d 65 20 6b 69 6e 64 20   need some kind 
3370: 6f 66 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  of function impl
3380: 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  ementation for t
3390: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  his.** routines 
33a0: 69 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  in the function 
33b0: 74 61 62 6c 65 2e 20 20 54 68 65 20 6e 6f 6f 70  table.  The noop
33c0: 46 75 6e 63 20 6d 61 63 72 6f 20 70 72 6f 76 69  Func macro provi
33d0: 64 65 73 20 74 68 69 73 2e 0a 2a 2a 20 6e 6f 6f  des this..** noo
33e0: 70 46 75 6e 63 20 77 69 6c 6c 20 6e 65 76 65 72  pFunc will never
33f0: 20 62 65 20 63 61 6c 6c 65 64 20 73 6f 20 69 74   be called so it
3400: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
3410: 77 68 61 74 20 74 68 65 20 69 6d 70 6c 65 6d 65  what the impleme
3420: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 2e 20 20  ntation.** is.  
3430: 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c  We might as well
3440: 20 75 73 65 20 74 68 65 20 22 76 65 72 73 69 6f   use the "versio
3450: 6e 28 29 22 20 66 75 6e 63 74 69 6f 6e 20 61 73  n()" function as
3460: 20 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a   a substitute..*
3470: 2f 0a 23 64 65 66 69 6e 65 20 6e 6f 6f 70 46 75  /.#define noopFu
3480: 6e 63 20 76 65 72 73 69 6f 6e 46 75 6e 63 20 20  nc versionFunc  
3490: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 66   /* Substitute f
34a0: 75 6e 63 74 69 6f 6e 20 2d 20 6e 65 76 65 72 20  unction - never 
34b0: 63 61 6c 6c 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  called */../*.**
34c0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
34d0: 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20 52 65  of random().  Re
34e0: 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 69 6e  turn a random in
34f0: 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74  teger.  .*/.stat
3500: 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46 75  ic void randomFu
3510: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3520: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
3530: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
3540: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3550: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
3560: 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 3b 0a 20  qlite_int64 r;. 
3570: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
3580: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
3590: 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  sed2);.  sqlite3
35a0: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
35b0: 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 69 66  of(r), &r);.  if
35c0: 28 20 72 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( r<0 ){.    /* 
35d0: 57 65 20 6e 65 65 64 20 74 6f 20 70 72 65 76 65  We need to preve
35e0: 6e 74 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  nt a random numb
35f0: 65 72 20 6f 66 20 30 78 38 30 30 30 30 30 30 30  er of 0x80000000
3600: 30 30 30 30 30 30 30 30 20 0a 20 20 20 20 2a 2a  00000000 .    **
3610: 20 28 6f 72 20 2d 39 32 32 33 33 37 32 30 33 36   (or -9223372036
3620: 38 35 34 37 37 35 38 30 38 29 20 73 69 6e 63 65  854775808) since
3630: 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 61 62 73   when you do abs
3640: 28 29 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a  () of that.    *
3650: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 79 6f 75 20  * number of you 
3660: 67 65 74 20 74 68 65 20 73 61 6d 65 20 76 61 6c  get the same val
3670: 75 65 20 62 61 63 6b 20 61 67 61 69 6e 2e 20 20  ue back again.  
3680: 54 6f 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a  To do this.    *
3690: 2a 20 69 6e 20 61 20 77 61 79 20 74 68 61 74 20  * in a way that 
36a0: 69 73 20 74 65 73 74 61 62 6c 65 2c 20 6d 61 73  is testable, mas
36b0: 6b 20 74 68 65 20 73 69 67 6e 20 62 69 74 20 6f  k the sign bit o
36c0: 66 66 20 6f 66 20 6e 65 67 61 74 69 76 65 0a 20  ff of negative. 
36d0: 20 20 20 2a 2a 20 76 61 6c 75 65 73 2c 20 72 65     ** values, re
36e0: 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 70 6f 73  sulting in a pos
36f0: 69 74 69 76 65 20 76 61 6c 75 65 2e 20 20 54 68  itive value.  Th
3700: 65 6e 20 74 61 6b 65 20 74 68 65 20 0a 20 20 20  en take the .   
3710: 20 2a 2a 20 32 73 20 63 6f 6d 70 6c 65 6d 65 6e   ** 2s complemen
3720: 74 20 6f 66 20 74 68 61 74 20 70 6f 73 69 74 69  t of that positi
3730: 76 65 20 76 61 6c 75 65 2e 20 20 54 68 65 20 65  ve value.  The e
3740: 6e 64 20 72 65 73 75 6c 74 20 63 61 6e 0a 20 20  nd result can.  
3750: 20 20 2a 2a 20 74 68 65 72 65 66 6f 72 65 20 62    ** therefore b
3760: 65 20 6e 6f 20 6c 65 73 73 20 74 68 61 6e 20 2d  e no less than -
3770: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
3780: 38 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  807..    */.    
3790: 72 20 3d 20 2d 28 72 20 26 20 4c 41 52 47 45 53  r = -(r & LARGES
37a0: 54 5f 49 4e 54 36 34 29 3b 0a 20 20 7d 0a 20 20  T_INT64);.  }.  
37b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
37c0: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 29  nt64(context, r)
37d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
37e0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e  mentation of ran
37f0: 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52 65 74  domblob(N).  Ret
3800: 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62 6c 6f  urn a random blo
3810: 62 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e 20 62  b.** that is N b
3820: 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  ytes long..*/.st
3830: 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d  atic void random
3840: 42 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f  Blob(.  sqlite3_
3850: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3860: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
3870: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3880: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  argv.){.  int n;
3890: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
38a0: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61   *p;.  assert( a
38b0: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
38c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
38d0: 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  c);.  n = sqlite
38e0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
38f0: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20  [0]);.  if( n<1 
3900: 29 7b 0a 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  ){.    n = 1;.  
3910: 7d 0a 20 20 70 20 3d 20 63 6f 6e 74 65 78 74 4d  }.  p = contextM
3920: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 6e  alloc(context, n
3930: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
3940: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
3950: 6e 65 73 73 28 6e 2c 20 70 29 3b 0a 20 20 20 20  ness(n, p);.    
3960: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
3970: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  lob(context, (ch
3980: 61 72 2a 29 70 2c 20 6e 2c 20 73 71 6c 69 74 65  ar*)p, n, sqlite
3990: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
39a0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
39b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 73 74  tion of the last
39c0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20  _insert_rowid() 
39d0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  SQL function.  T
39e0: 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c  he return.** val
39f0: 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ue is the same a
3a00: 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61  s the sqlite3_la
3a10: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
3a20: 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  ) API function..
3a30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
3a40: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
3a50: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3a60: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
3a70: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 0a 20   int NotUsed, . 
3a80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3a90: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
3aa0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
3ab0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
3ac0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
3ad0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
3ae0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
3af0: 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d  tUsed2);.  /* IM
3b00: 50 3a 20 52 2d 35 31 35 31 33 2d 31 32 30 32 36  P: R-51513-12026
3b10: 20 54 68 65 20 6c 61 73 74 5f 69 6e 73 65 72 74   The last_insert
3b20: 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75 6e  _rowid() SQL fun
3b30: 63 74 69 6f 6e 20 69 73 20 61 0a 20 20 2a 2a 20  ction is a.  ** 
3b40: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
3b50: 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  he sqlite3_last_
3b60: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 43  insert_rowid() C
3b70: 2f 43 2b 2b 20 69 6e 74 65 72 66 61 63 65 0a 20  /C++ interface. 
3b80: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f   ** function. */
3b90: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
3ba0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
3bb0: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
3bc0: 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29 29 3b  sert_rowid(db));
3bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
3be0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3bf0: 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75  changes() SQL fu
3c00: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d  nction..**.** IM
3c10: 50 3a 20 52 2d 36 32 30 37 33 2d 31 31 32 30 39  P: R-62073-11209
3c20: 20 54 68 65 20 63 68 61 6e 67 65 73 28 29 20 53   The changes() S
3c30: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  QL function is a
3c40: 20 77 72 61 70 70 65 72 0a 2a 2a 20 61 72 6f 75   wrapper.** arou
3c50: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  nd the sqlite3_c
3c60: 68 61 6e 67 65 73 28 29 20 43 2f 43 2b 2b 20 66  hanges() C/C++ f
3c70: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 68 65 6e 63  unction and henc
3c80: 65 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 73 61  e follows the sa
3c90: 6d 65 0a 2a 2a 20 72 75 6c 65 73 20 66 6f 72 20  me.** rules for 
3ca0: 63 6f 75 6e 74 69 6e 67 20 63 68 61 6e 67 65 73  counting changes
3cb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3cc0: 20 63 68 61 6e 67 65 73 28 0a 20 20 73 71 6c 69   changes(.  sqli
3cd0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3ce0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55  text,.  int NotU
3cf0: 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  sed,.  sqlite3_v
3d00: 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a  alue **NotUsed2.
3d10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
3d20: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
3d30: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
3d40: 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f  text);.  UNUSED_
3d50: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
3d60: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
3d70: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3d80: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
3d90: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29  ite3_changes(db)
3da0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
3db0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
3dc0: 65 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  e total_changes(
3dd0: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
3de0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
3df0: 65 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65  e is.** the same
3e00: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
3e10: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20  total_changes() 
3e20: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
3e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 74  .static void tot
3e40: 61 6c 5f 63 68 61 6e 67 65 73 28 0a 20 20 73 71  al_changes(.  sq
3e50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3e60: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
3e70: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
3e80: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
3e90: 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  2.){.  sqlite3 *
3ea0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
3eb0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
3ec0: 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45  ontext);.  UNUSE
3ed0: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
3ee0: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
3ef0: 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 37  .  /* IMP: R-527
3f00: 35 36 2d 34 31 39 39 33 20 54 68 69 73 20 66 75  56-41993 This fu
3f10: 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
3f20: 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a 20  per around the. 
3f30: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 6f 74 61   ** sqlite3_tota
3f40: 6c 5f 63 68 61 6e 67 65 73 28 29 20 43 2f 43 2b  l_changes() C/C+
3f50: 2b 20 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f 0a  + interface. */.
3f60: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3f70: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
3f80: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
3f90: 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ges(db));.}../*.
3fa0: 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 64  ** A structure d
3fb0: 65 66 69 6e 69 6e 67 20 68 6f 77 20 74 6f 20 64  efining how to d
3fc0: 6f 20 47 4c 4f 42 2d 73 74 79 6c 65 20 63 6f 6d  o GLOB-style com
3fd0: 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f 0a 73 74 72  parisons..*/.str
3fe0: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
3ff0: 7b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c 3b  {.  u8 matchAll;
4000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 2a 22            /* "*"
4010: 20 6f 72 20 22 25 22 20 2a 2f 0a 20 20 75 38 20   or "%" */.  u8 
4020: 6d 61 74 63 68 4f 6e 65 3b 20 20 20 20 20 20 20  matchOne;       
4030: 20 20 20 2f 2a 20 22 3f 22 20 6f 72 20 22 5f 22     /* "?" or "_"
4040: 20 2a 2f 0a 20 20 75 38 20 6d 61 74 63 68 53 65   */.  u8 matchSe
4050: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22  t;          /* "
4060: 5b 22 20 6f 72 20 30 20 2a 2f 0a 20 20 75 38 20  [" or 0 */.  u8 
4070: 6e 6f 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  noCase;         
4080: 20 20 20 2f 2a 20 74 72 75 65 20 74 6f 20 69 67     /* true to ig
4090: 6e 6f 72 65 20 63 61 73 65 20 64 69 66 66 65 72  nore case differ
40a0: 65 6e 63 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ences */.};../*.
40b0: 2a 2a 20 46 6f 72 20 4c 49 4b 45 20 61 6e 64 20  ** For LIKE and 
40c0: 47 4c 4f 42 20 6d 61 74 63 68 69 6e 67 20 6f 6e  GLOB matching on
40d0: 20 45 42 43 44 49 43 20 6d 61 63 68 69 6e 65 73   EBCDIC machines
40e0: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 65 76  , assume that ev
40f0: 65 72 79 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ery.** character
4100: 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
4110: 62 79 74 65 20 69 6e 20 73 69 7a 65 2e 20 20 41  byte in size.  A
4120: 6c 73 6f 2c 20 70 72 6f 76 64 65 20 74 68 65 20  lso, provde the 
4130: 55 74 66 38 52 65 61 64 28 29 0a 2a 2a 20 6d 61  Utf8Read().** ma
4140: 63 72 6f 20 66 6f 72 20 66 61 73 74 20 72 65 61  cro for fast rea
4150: 64 69 6e 67 20 6f 66 20 74 68 65 20 6e 65 78 74  ding of the next
4160: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
4170: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
4180: 65 72 65 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20  ere.** the next 
4190: 63 68 61 72 61 63 74 65 72 20 69 73 20 41 53 43  character is ASC
41a0: 49 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  II..*/.#if defin
41b0: 65 64 28 53 51 4c 49 54 45 5f 45 42 43 44 49 43  ed(SQLITE_EBCDIC
41c0: 29 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  ).# define sqlit
41d0: 65 33 55 74 66 38 52 65 61 64 28 41 29 20 20 20  e3Utf8Read(A)   
41e0: 20 20 20 20 20 28 2a 28 28 2a 41 29 2b 2b 29 29       (*((*A)++))
41f0: 0a 23 20 64 65 66 69 6e 65 20 55 74 66 38 52 65  .# define Utf8Re
4200: 61 64 28 41 29 20 20 20 20 20 20 20 20 20 20 20  ad(A)           
4210: 20 20 20 20 28 2a 28 41 2b 2b 29 29 0a 23 65 6c      (*(A++)).#el
4220: 73 65 0a 23 20 64 65 66 69 6e 65 20 55 74 66 38  se.# define Utf8
4230: 52 65 61 64 28 41 29 20 20 20 20 20 20 20 20 20  Read(A)         
4240: 20 20 20 20 20 20 28 41 5b 30 5d 3c 30 78 38 30        (A[0]<0x80
4250: 3f 2a 28 41 2b 2b 29 3a 73 71 6c 69 74 65 33 55  ?*(A++):sqlite3U
4260: 74 66 38 52 65 61 64 28 26 41 29 29 0a 23 65 6e  tf8Read(&A)).#en
4270: 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  dif..static cons
4280: 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65  t struct compare
4290: 49 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20  Info globInfo = 
42a0: 7b 20 27 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c  { '*', '?', '[',
42b0: 20 30 20 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72   0 };./* The cor
42c0: 72 65 63 74 20 53 51 4c 2d 39 32 20 62 65 68 61  rect SQL-92 beha
42d0: 76 69 6f 72 20 69 73 20 66 6f 72 20 74 68 65 20  vior is for the 
42e0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 74 6f  LIKE operator to
42f0: 20 69 67 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e   ignore.** case.
4300: 20 20 54 68 75 73 20 20 27 61 27 20 4c 49 4b 45    Thus  'a' LIKE
4310: 20 27 41 27 20 77 6f 75 6c 64 20 62 65 20 74 72   'A' would be tr
4320: 75 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ue. */.static co
4330: 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61  nst struct compa
4340: 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e  reInfo likeInfoN
4350: 6f 72 6d 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27  orm = { '%', '_'
4360: 2c 20 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49  ,   0, 1 };./* I
4370: 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45  f SQLITE_CASE_SE
4380: 4e 53 49 54 49 56 45 5f 4c 49 4b 45 20 69 73 20  NSITIVE_LIKE is 
4390: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
43a0: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a  e LIKE operator.
43b0: 2a 2a 20 69 73 20 63 61 73 65 20 73 65 6e 73 69  ** is case sensi
43c0: 74 69 76 65 20 63 61 75 73 69 6e 67 20 27 61 27  tive causing 'a'
43d0: 20 4c 49 4b 45 20 27 41 27 20 74 6f 20 62 65 20   LIKE 'A' to be 
43e0: 66 61 6c 73 65 20 2a 2f 0a 73 74 61 74 69 63 20  false */.static 
43f0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d  const struct com
4400: 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66  pareInfo likeInf
4410: 6f 41 6c 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f  oAlt = { '%', '_
4420: 27 2c 20 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a  ',   0, 0 };../*
4430: 0a 2a 2a 20 50 6f 73 73 69 62 6c 65 20 65 72 72  .** Possible err
4440: 6f 72 20 72 65 74 75 72 6e 73 20 66 72 6f 6d 20  or returns from 
4450: 70 61 74 74 65 72 6e 4d 61 74 63 68 28 29 0a 2a  patternMatch().*
4460: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
4470: 5f 4d 41 54 43 48 20 20 20 20 20 20 20 20 20 20  _MATCH          
4480: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 51 4c     0.#define SQL
4490: 49 54 45 5f 4e 4f 4d 41 54 43 48 20 20 20 20 20  ITE_NOMATCH     
44a0: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
44b0: 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52  SQLITE_NOWILDCAR
44c0: 44 4d 41 54 43 48 20 20 20 32 0a 0a 2f 2a 0a 2a  DMATCH   2../*.*
44d0: 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55 54  * Compare two UT
44e0: 46 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72 20  F-8 strings for 
44f0: 65 71 75 61 6c 69 74 79 20 77 68 65 72 65 20 74  equality where t
4500: 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20  he first string 
4510: 69 73 0a 2a 2a 20 61 20 47 4c 4f 42 20 6f 72 20  is.** a GLOB or 
4520: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 2e  LIKE expression.
4530: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a    Return values:
4540: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  .**.**    SQLITE
4550: 5f 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  _MATCH:         
4560: 20 20 20 4d 61 74 63 68 0a 2a 2a 20 20 20 20 53     Match.**    S
4570: 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3a 20 20  QLITE_NOMATCH:  
4580: 20 20 20 20 20 20 20 20 4e 6f 20 6d 61 74 63 68          No match
4590: 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  .**    SQLITE_NO
45a0: 57 49 4c 44 43 41 52 44 4d 41 54 43 48 3a 20 20  WILDCARDMATCH:  
45b0: 4e 6f 20 6d 61 74 63 68 20 69 6e 20 73 70 69 74  No match in spit
45c0: 65 20 6f 66 20 68 61 76 69 6e 67 20 2a 20 6f 72  e of having * or
45d0: 20 25 20 77 69 6c 64 63 61 72 64 73 2e 0a 2a 2a   % wildcards..**
45e0: 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c  .** Globbing rul
45f0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  es:.**.**      '
4600: 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  *'       Matches
4610: 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
4620: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
4630: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
4640: 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d       '?'       M
4650: 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f  atches exactly o
4660: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ne character..**
4670: 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20  .**     [...]   
4680: 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
4690: 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
46a0: 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20  e enclosed list 
46b0: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
46c0: 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e       characters.
46d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e  .**.**     [^...
46e0: 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e  ]     Matches on
46f0: 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20  e character not 
4700: 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  in the enclosed 
4710: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  list..**.** With
4720: 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e 64 20 5b   the [...] and [
4730: 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e 67 2c 20  ^...] matching, 
4740: 61 20 27 5d 27 20 63 68 61 72 61 63 74 65 72 20  a ']' character 
4750: 63 61 6e 20 62 65 20 69 6e 63 6c 75 64 65 64 0a  can be included.
4760: 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 20 62  ** in the list b
4770: 79 20 6d 61 6b 69 6e 67 20 69 74 20 74 68 65 20  y making it the 
4780: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
4790: 61 66 74 65 72 20 27 5b 27 20 6f 72 20 27 5e 27  after '[' or '^'
47a0: 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65 20 6f 66  .  A.** range of
47b0: 20 63 68 61 72 61 63 74 65 72 73 20 63 61 6e 20   characters can 
47c0: 62 65 20 73 70 65 63 69 66 69 65 64 20 75 73 69  be specified usi
47d0: 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d 70 6c 65  ng '-'.  Example
47e0: 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20 6d 61 74  :.** "[a-z]" mat
47f0: 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65 20  ches any single 
4800: 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65 74 74 65  lower-case lette
4810: 72 2e 20 20 54 6f 20 6d 61 74 63 68 20 61 20 27  r.  To match a '
4820: 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74  -', make.** it t
4830: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
4840: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  r in the list..*
4850: 2a 0a 2a 2a 20 4c 69 6b 65 20 6d 61 74 63 68 69  *.** Like matchi
4860: 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 20 0a 2a 2a  ng rules:.** .**
4870: 20 20 20 20 20 20 27 25 27 20 20 20 20 20 20 20        '%'       
4880: 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  Matches any sequ
4890: 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20  ence of zero or 
48a0: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 0a  more characters.
48b0: 2a 2a 0a 2a 2a 2a 20 20 20 20 20 27 5f 27 20 20  **.***     '_'  
48c0: 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
48d0: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 0a 2a   one character.*
48e0: 2a 0a 2a 2a 20 20 20 20 20 20 45 63 20 20 20 20  *.**      Ec    
48f0: 20 20 20 20 57 68 65 72 65 20 45 20 69 73 20 74      Where E is t
4900: 68 65 20 22 65 73 63 22 20 63 68 61 72 61 63 74  he "esc" charact
4910: 65 72 20 61 6e 64 20 63 20 69 73 20 61 6e 79 20  er and c is any 
4920: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
4930: 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65          characte
4940: 72 2c 20 69 6e 63 6c 75 64 69 6e 67 20 27 25 27  r, including '%'
4950: 2c 20 27 5f 27 2c 20 61 6e 64 20 65 73 63 2c 20  , '_', and esc, 
4960: 6d 61 74 63 68 20 65 78 61 63 74 6c 79 20 63 2e  match exactly c.
4970: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 65  .**.** The comme
4980: 6e 74 73 20 77 69 74 68 69 6e 20 74 68 69 73 20  nts within this 
4990: 72 6f 75 74 69 6e 65 20 75 73 75 61 6c 6c 79 20  routine usually 
49a0: 61 73 73 75 6d 65 20 67 6c 6f 62 20 6d 61 74 63  assume glob matc
49b0: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  hing..**.** This
49c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75 61   routine is usua
49d0: 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20 63  lly quick, but c
49e0: 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68  an be N**2 in th
49f0: 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2f  e worst case..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 74 74  .static int patt
4a10: 65 72 6e 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f  ernCompare(.  co
4a20: 6e 73 74 20 75 38 20 2a 7a 50 61 74 74 65 72 6e  nst u8 *zPattern
4a30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4a40: 2a 20 54 68 65 20 67 6c 6f 62 20 70 61 74 74 65  * The glob patte
4a50: 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  rn */.  const u8
4a60: 20 2a 7a 53 74 72 69 6e 67 2c 20 20 20 20 20 20   *zString,      
4a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4a80: 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72  string to compar
4a90: 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 67 6c  e against the gl
4aa0: 6f 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 74  ob */.  const st
4ab0: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
4ac0: 20 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49 6e 66 6f   *pInfo, /* Info
4ad0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 68 6f  rmation about ho
4ae0: 77 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70  w to do the comp
4af0: 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 6d 61 74  are */.  u32 mat
4b00: 63 68 4f 74 68 65 72 20 20 20 20 20 20 20 20 20  chOther         
4b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4b20: 20 65 73 63 61 70 65 20 63 68 61 72 20 28 4c 49   escape char (LI
4b30: 4b 45 29 20 6f 72 20 27 5b 27 20 28 47 4c 4f 42  KE) or '[' (GLOB
4b40: 29 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 63 2c  ) */.){.  u32 c,
4b50: 20 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   c2;            
4b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
4b70: 78 74 20 70 61 74 74 65 72 6e 20 61 6e 64 20 69  xt pattern and i
4b80: 6e 70 75 74 20 73 74 72 69 6e 67 20 63 68 61 72  nput string char
4b90: 73 20 2a 2f 0a 20 20 75 33 32 20 6d 61 74 63 68  s */.  u32 match
4ba0: 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74  One = pInfo->mat
4bb0: 63 68 4f 6e 65 3b 20 20 2f 2a 20 22 3f 22 20 6f  chOne;  /* "?" o
4bc0: 72 20 22 5f 22 20 2a 2f 0a 20 20 75 33 32 20 6d  r "_" */.  u32 m
4bd0: 61 74 63 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d  atchAll = pInfo-
4be0: 3e 6d 61 74 63 68 41 6c 6c 3b 20 20 2f 2a 20 22  >matchAll;  /* "
4bf0: 2a 22 20 6f 72 20 22 25 22 20 2a 2f 0a 20 20 75  *" or "%" */.  u
4c00: 38 20 6e 6f 43 61 73 65 20 3d 20 70 49 6e 66 6f  8 noCase = pInfo
4c10: 2d 3e 6e 6f 43 61 73 65 3b 20 20 20 20 20 20 20  ->noCase;       
4c20: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
4c30: 63 61 73 65 3d 3d 6c 6f 77 65 72 63 61 73 65 20  case==lowercase 
4c40: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  */.  const u8 *z
4c50: 45 73 63 61 70 65 64 20 3d 20 30 3b 20 20 20 20  Escaped = 0;    
4c60: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 70 61 73        /* One pas
4c70: 74 20 74 68 65 20 6c 61 73 74 20 65 73 63 61 70  t the last escap
4c80: 65 64 20 69 6e 70 75 74 20 63 68 61 72 20 2a 2f  ed input char */
4c90: 0a 20 20 0a 20 20 77 68 69 6c 65 28 20 28 63 20  .  .  while( (c 
4ca0: 3d 20 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  = Utf8Read(zPatt
4cb0: 65 72 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ern))!=0 ){.    
4cc0: 69 66 28 20 63 3d 3d 6d 61 74 63 68 41 6c 6c 20  if( c==matchAll 
4cd0: 29 7b 20 20 2f 2a 20 4d 61 74 63 68 20 22 2a 22  ){  /* Match "*"
4ce0: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69   */.      /* Ski
4cf0: 70 20 6f 76 65 72 20 6d 75 6c 74 69 70 6c 65 20  p over multiple 
4d00: 22 2a 22 20 63 68 61 72 61 63 74 65 72 73 20 69  "*" characters i
4d10: 6e 20 74 68 65 20 70 61 74 74 65 72 6e 2e 20 20  n the pattern.  
4d20: 49 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a  If there.      *
4d30: 2a 20 61 72 65 20 61 6c 73 6f 20 22 3f 22 20 63  * are also "?" c
4d40: 68 61 72 61 63 74 65 72 73 2c 20 73 6b 69 70 20  haracters, skip 
4d50: 74 68 6f 73 65 20 61 73 20 77 65 6c 6c 2c 20 62  those as well, b
4d60: 75 74 20 63 6f 6e 73 75 6d 65 20 61 0a 20 20 20  ut consume a.   
4d70: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 68 61     ** single cha
4d80: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e  racter of the in
4d90: 70 75 74 20 73 74 72 69 6e 67 20 66 6f 72 20 65  put string for e
4da0: 61 63 68 20 22 3f 22 20 73 6b 69 70 70 65 64 20  ach "?" skipped 
4db0: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
4dc0: 28 63 3d 55 74 66 38 52 65 61 64 28 7a 50 61 74  (c=Utf8Read(zPat
4dd0: 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74 63 68 41  tern)) == matchA
4de0: 6c 6c 20 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68  ll || c == match
4df0: 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  One ){.        i
4e00: 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26  f( c==matchOne &
4e10: 26 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  & sqlite3Utf8Rea
4e20: 64 28 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29  d(&zString)==0 )
4e30: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
4e40: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44  rn SQLITE_NOWILD
4e50: 43 41 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 20  CARDMATCH;.     
4e60: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4e70: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
4e80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
4e90: 4c 49 54 45 5f 4d 41 54 43 48 3b 20 20 20 2f 2a  LITE_MATCH;   /*
4ea0: 20 22 2a 22 20 61 74 20 74 68 65 20 65 6e 64 20   "*" at the end 
4eb0: 6f 66 20 74 68 65 20 70 61 74 74 65 72 6e 20 6d  of the pattern m
4ec0: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
4ed0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74  }else if( c==mat
4ee0: 63 68 4f 74 68 65 72 20 29 7b 0a 20 20 20 20 20  chOther ){.     
4ef0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6d 61     if( pInfo->ma
4f00: 74 63 68 53 65 74 3d 3d 30 20 29 7b 0a 20 20 20  tchSet==0 ){.   
4f10: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
4f20: 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74  e3Utf8Read(&zPat
4f30: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tern);.         
4f40: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
4f50: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44  rn SQLITE_NOWILD
4f60: 43 41 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 20  CARDMATCH;.     
4f70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4f80: 20 20 20 20 2f 2a 20 22 5b 2e 2e 2e 5d 22 20 69      /* "[...]" i
4f90: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
4fa0: 77 73 20 74 68 65 20 22 2a 22 2e 20 20 57 65 20  ws the "*".  We 
4fb0: 68 61 76 65 20 74 6f 20 64 6f 20 61 20 73 6c 6f  have to do a slo
4fc0: 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  w.          ** r
4fd0: 65 63 75 72 73 69 76 65 20 73 65 61 72 63 68 20  ecursive search 
4fe0: 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 62 75  in this case, bu
4ff0: 74 20 69 74 20 69 73 20 61 6e 20 75 6e 75 73 75  t it is an unusu
5000: 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  al case. */.    
5010: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61        assert( ma
5020: 74 63 68 4f 74 68 65 72 3c 30 78 38 30 20 29 3b  tchOther<0x80 );
5030: 20 20 2f 2a 20 27 5b 27 20 69 73 20 61 20 73 69    /* '[' is a si
5040: 6e 67 6c 65 2d 62 79 74 65 20 63 68 61 72 61 63  ngle-byte charac
5050: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ter */.         
5060: 20 77 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67   while( *zString
5070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5080: 69 6e 74 20 62 4d 61 74 63 68 20 3d 20 70 61 74  int bMatch = pat
5090: 74 65 72 6e 43 6f 6d 70 61 72 65 28 26 7a 50 61  ternCompare(&zPa
50a0: 74 74 65 72 6e 5b 2d 31 5d 2c 7a 53 74 72 69 6e  ttern[-1],zStrin
50b0: 67 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f 74 68  g,pInfo,matchOth
50c0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
50d0: 20 69 66 28 20 62 4d 61 74 63 68 21 3d 53 51 4c   if( bMatch!=SQL
50e0: 49 54 45 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65  ITE_NOMATCH ) re
50f0: 74 75 72 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20  turn bMatch;.   
5100: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5110: 53 4b 49 50 5f 55 54 46 38 28 7a 53 74 72 69 6e  SKIP_UTF8(zStrin
5120: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
5130: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5140: 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41   SQLITE_NOWILDCA
5150: 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20  RDMATCH;.       
5160: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
5170: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
5180: 6e 74 20 76 61 72 69 61 62 6c 65 20 63 20 63 6f  nt variable c co
5190: 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74  ntains the first
51a0: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
51b0: 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 74 74 65  e.      ** patte
51c0: 72 6e 20 73 74 72 69 6e 67 20 70 61 73 74 20 74  rn string past t
51d0: 68 65 20 22 2a 22 2e 20 20 53 65 61 72 63 68 20  he "*".  Search 
51e0: 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  in the input str
51f0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ing for the.    
5200: 20 20 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68    ** first match
5210: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 61 6e  ing character an
5220: 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 63 6f  d recursively co
5230: 6e 74 69 6e 75 65 20 74 68 65 20 6d 61 74 63 68  ntinue the match
5240: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74   from.      ** t
5250: 68 61 74 20 70 6f 69 6e 74 2e 0a 20 20 20 20 20  hat point..     
5260: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
5270: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
5280: 69 76 65 20 73 65 61 72 63 68 2c 20 73 65 74 20  ive search, set 
5290: 76 61 72 69 61 62 6c 65 20 63 78 20 74 6f 20 62  variable cx to b
52a0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
52b0: 20 20 20 20 2a 2a 20 63 20 62 75 74 20 69 6e 20      ** c but in 
52c0: 74 68 65 20 6f 74 68 65 72 20 63 61 73 65 20 61  the other case a
52d0: 6e 64 20 73 65 61 72 63 68 20 74 68 65 20 69 6e  nd search the in
52e0: 70 75 74 20 73 74 72 69 6e 67 20 66 6f 72 20 65  put string for e
52f0: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63  ither.      ** c
5300: 20 6f 72 20 63 78 2e 0a 20 20 20 20 20 20 2a 2f   or cx..      */
5310: 0a 20 20 20 20 20 20 69 66 28 20 63 3c 3d 30 78  .      if( c<=0x
5320: 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  80 ){.        ch
5330: 61 72 20 7a 53 74 6f 70 5b 33 5d 3b 0a 20 20 20  ar zStop[3];.   
5340: 20 20 20 20 20 69 6e 74 20 62 4d 61 74 63 68 3b       int bMatch;
5350: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 6f 43  .        if( noC
5360: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ase ){.         
5370: 20 7a 53 74 6f 70 5b 30 5d 20 3d 20 73 71 6c 69   zStop[0] = sqli
5380: 74 65 33 54 6f 75 70 70 65 72 28 63 29 3b 0a 20  te3Toupper(c);. 
5390: 20 20 20 20 20 20 20 20 20 7a 53 74 6f 70 5b 31           zStop[1
53a0: 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77  ] = sqlite3Tolow
53b0: 65 72 28 63 29 3b 0a 20 20 20 20 20 20 20 20 20  er(c);.         
53c0: 20 7a 53 74 6f 70 5b 32 5d 20 3d 20 30 3b 0a 20   zStop[2] = 0;. 
53d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
53e0: 20 20 20 20 20 20 20 20 7a 53 74 6f 70 5b 30 5d          zStop[0]
53f0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
5400: 7a 53 74 6f 70 5b 31 5d 20 3d 20 30 3b 0a 20 20  zStop[1] = 0;.  
5410: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5420: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
5430: 20 20 20 20 7a 53 74 72 69 6e 67 20 2b 3d 20 73      zString += s
5440: 74 72 63 73 70 6e 28 28 63 6f 6e 73 74 20 63 68  trcspn((const ch
5450: 61 72 2a 29 7a 53 74 72 69 6e 67 2c 20 7a 53 74  ar*)zString, zSt
5460: 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  op);.          i
5470: 66 28 20 7a 53 74 72 69 6e 67 5b 30 5d 3d 3d 30  f( zString[0]==0
5480: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5490: 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20      zString++;. 
54a0: 20 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20           bMatch 
54b0: 3d 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  = patternCompare
54c0: 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72 69 6e  (zPattern,zStrin
54d0: 67 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f 74 68  g,pInfo,matchOth
54e0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
54f0: 66 28 20 62 4d 61 74 63 68 21 3d 53 51 4c 49 54  f( bMatch!=SQLIT
5500: 45 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65 74 75  E_NOMATCH ) retu
5510: 72 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20 20 20  rn bMatch;.     
5520: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
5530: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4d  {.        int bM
5540: 61 74 63 68 3b 0a 20 20 20 20 20 20 20 20 77 68  atch;.        wh
5550: 69 6c 65 28 20 28 63 32 20 3d 20 55 74 66 38 52  ile( (c2 = Utf8R
5560: 65 61 64 28 7a 53 74 72 69 6e 67 29 29 21 3d 30  ead(zString))!=0
5570: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
5580: 28 20 63 32 21 3d 63 20 29 20 63 6f 6e 74 69 6e  ( c2!=c ) contin
5590: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 4d  ue;.          bM
55a0: 61 74 63 68 20 3d 20 70 61 74 74 65 72 6e 43 6f  atch = patternCo
55b0: 6d 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a  mpare(zPattern,z
55c0: 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 6d 61 74  String,pInfo,mat
55d0: 63 68 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20  chOther);.      
55e0: 20 20 20 20 69 66 28 20 62 4d 61 74 63 68 21 3d      if( bMatch!=
55f0: 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 20 29  SQLITE_NOMATCH )
5600: 20 72 65 74 75 72 6e 20 62 4d 61 74 63 68 3b 0a   return bMatch;.
5610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5620: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
5630: 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44  QLITE_NOWILDCARD
5640: 4d 41 54 43 48 3b 0a 20 20 20 20 7d 0a 20 20 20  MATCH;.    }.   
5650: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 74 68   if( c==matchOth
5660: 65 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  er ){.      if( 
5670: 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3d  pInfo->matchSet=
5680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  =0 ){.        c 
5690: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
56a0: 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  d(&zPattern);.  
56b0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
56c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
56d0: 4f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20  OMATCH;.        
56e0: 7a 45 73 63 61 70 65 64 20 3d 20 7a 50 61 74 74  zEscaped = zPatt
56f0: 65 72 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ern;.      }else
5700: 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 70 72  {.        u32 pr
5710: 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
5720: 20 20 20 69 6e 74 20 73 65 65 6e 20 3d 20 30 3b     int seen = 0;
5730: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 6e 76  .        int inv
5740: 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ert = 0;.       
5750: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38   c = sqlite3Utf8
5760: 52 65 61 64 28 26 7a 53 74 72 69 6e 67 29 3b 0a  Read(&zString);.
5770: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
5780: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5790: 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  _NOMATCH;.      
57a0: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74    c2 = sqlite3Ut
57b0: 66 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e  f8Read(&zPattern
57c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
57d0: 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20  2=='^' ){.      
57e0: 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a      invert = 1;.
57f0: 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73            c2 = s
5800: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
5810: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
5820: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
5830: 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20   c2==']' ){.    
5840: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27        if( c==']'
5850: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
5860: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
5870: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61  te3Utf8Read(&zPa
5880: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  ttern);.        
5890: 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  }.        while(
58a0: 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29   c2 && c2!=']' )
58b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
58c0: 63 32 3d 3d 27 2d 27 20 26 26 20 7a 50 61 74 74  c2=='-' && zPatt
58d0: 65 72 6e 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a  ern[0]!=']' && z
58e0: 50 61 74 74 65 72 6e 5b 30 5d 21 3d 30 20 26 26  Pattern[0]!=0 &&
58f0: 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20   prior_c>0 ){.  
5900: 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73            c2 = s
5910: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
5920: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
5930: 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72         if( c>=pr
5940: 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29  ior_c && c<=c2 )
5950: 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
5960: 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
5970: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
5980: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
5990: 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20   if( c==c2 ){.  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
59b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
59c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
59d0: 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20  prior_c = c2;.  
59e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
59f0: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
5a00: 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74 65  Utf8Read(&zPatte
5a10: 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rn);.        }. 
5a20: 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30         if( c2==0
5a30: 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65   || (seen ^ inve
5a40: 72 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rt)==0 ){.      
5a50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5a60: 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 20 20 20  E_NOMATCH;.     
5a70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6f 6e     }.        con
5a80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
5a90: 20 20 20 7d 0a 20 20 20 20 63 32 20 3d 20 55 74     }.    c2 = Ut
5aa0: 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 29 3b  f8Read(zString);
5ab0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29  .    if( c==c2 )
5ac0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
5ad0: 66 28 20 6e 6f 43 61 73 65 20 20 26 26 20 73 71  f( noCase  && sq
5ae0: 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63 29 3d  lite3Tolower(c)=
5af0: 3d 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28  =sqlite3Tolower(
5b00: 63 32 29 20 26 26 20 63 3c 30 78 38 30 20 26 26  c2) && c<0x80 &&
5b10: 20 63 32 3c 30 78 38 30 20 29 7b 0a 20 20 20 20   c2<0x80 ){.    
5b20: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
5b30: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 6d 61 74  }.    if( c==mat
5b40: 63 68 4f 6e 65 20 26 26 20 7a 50 61 74 74 65 72  chOne && zPatter
5b50: 6e 21 3d 7a 45 73 63 61 70 65 64 20 26 26 20 63  n!=zEscaped && c
5b60: 32 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  2!=0 ) continue;
5b70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5b80: 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 7d 0a  TE_NOMATCH;.  }.
5b90: 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e    return *zStrin
5ba0: 67 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f 4d 41  g==0 ? SQLITE_MA
5bb0: 54 43 48 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d  TCH : SQLITE_NOM
5bc0: 41 54 43 48 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ATCH;.}../*.** T
5bd0: 68 65 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  he sqlite3_strgl
5be0: 6f 62 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20  ob() interface. 
5bf0: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 61 20 6d   Return 0 on a m
5c00: 61 74 63 68 20 28 6c 69 6b 65 20 73 74 72 63 6d  atch (like strcm
5c10: 70 28 29 29 20 61 6e 64 0a 2a 2a 20 6e 6f 6e 2d  p()) and.** non-
5c20: 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 69 73  zero if there is
5c30: 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e   no match..*/.in
5c40: 74 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  t sqlite3_strglo
5c50: 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47  b(const char *zG
5c60: 6c 6f 62 50 61 74 74 65 72 6e 2c 20 63 6f 6e 73  lobPattern, cons
5c70: 74 20 63 68 61 72 20 2a 7a 53 74 72 69 6e 67 29  t char *zString)
5c80: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 74 74 65  {.  return patte
5c90: 72 6e 43 6f 6d 70 61 72 65 28 28 75 38 2a 29 7a  rnCompare((u8*)z
5ca0: 47 6c 6f 62 50 61 74 74 65 72 6e 2c 20 28 75 38  GlobPattern, (u8
5cb0: 2a 29 7a 53 74 72 69 6e 67 2c 20 26 67 6c 6f 62  *)zString, &glob
5cc0: 49 6e 66 6f 2c 20 27 5b 27 29 3b 0a 7d 0a 0a 2f  Info, '[');.}../
5cd0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
5ce0: 5f 73 74 72 6c 69 6b 65 28 29 20 69 6e 74 65 72  _strlike() inter
5cf0: 66 61 63 65 2e 20 20 52 65 74 75 72 6e 20 30 20  face.  Return 0 
5d00: 6f 6e 20 61 20 6d 61 74 63 68 20 61 6e 64 20 6e  on a match and n
5d10: 6f 6e 2d 7a 65 72 6f 20 66 6f 72 0a 2a 2a 20 61  on-zero for.** a
5d20: 20 6d 69 73 73 20 2d 20 6c 69 6b 65 20 73 74 72   miss - like str
5d30: 63 6d 70 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cmp()..*/.int sq
5d40: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 63 6f  lite3_strlike(co
5d50: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65  nst char *zPatte
5d60: 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  rn, const char *
5d70: 7a 53 74 72 2c 20 75 6e 73 69 67 6e 65 64 20 69  zStr, unsigned i
5d80: 6e 74 20 65 73 63 29 7b 0a 20 20 72 65 74 75 72  nt esc){.  retur
5d90: 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  n patternCompare
5da0: 28 28 75 38 2a 29 7a 50 61 74 74 65 72 6e 2c 20  ((u8*)zPattern, 
5db0: 28 75 38 2a 29 7a 53 74 72 2c 20 26 6c 69 6b 65  (u8*)zStr, &like
5dc0: 49 6e 66 6f 4e 6f 72 6d 2c 20 65 73 63 29 3b 0a  InfoNorm, esc);.
5dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  }../*.** Count t
5de0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
5df0: 65 73 20 74 68 61 74 20 74 68 65 20 4c 49 4b 45  es that the LIKE
5e00: 20 6f 70 65 72 61 74 6f 72 20 28 6f 72 20 47 4c   operator (or GL
5e10: 4f 42 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6a  OB which is.** j
5e20: 75 73 74 20 61 20 76 61 72 69 61 74 69 6f 6e 20  ust a variation 
5e30: 6f 66 20 4c 49 4b 45 29 20 67 65 74 73 20 63 61  of LIKE) gets ca
5e40: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 75  lled.  This is u
5e50: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
5e60: 2a 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ** only..*/.#ifd
5e70: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
5e80: 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f  nt sqlite3_like_
5e90: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
5ea0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  f.../*.** Implem
5eb0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
5ec0: 6c 69 6b 65 28 29 20 53 51 4c 20 66 75 6e 63 74  like() SQL funct
5ed0: 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ion.  This funct
5ee0: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  ion implements.*
5ef0: 2a 20 74 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c  * the build-in L
5f00: 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 20 20 54  IKE operator.  T
5f10: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5f20: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
5f30: 6e 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 74 74  n is the.** patt
5f40: 65 72 6e 20 61 6e 64 20 74 68 65 20 73 65 63 6f  ern and the seco
5f50: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
5f60: 68 65 20 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20  he string.  So, 
5f70: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
5f80: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ts:.**.**       
5f90: 41 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69  A LIKE B.**.** i
5fa0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
5fb0: 20 6c 69 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a   like(B,A)..**.*
5fc0: 2a 20 54 68 69 73 20 73 61 6d 65 20 66 75 6e 63  * This same func
5fd0: 74 69 6f 6e 20 28 77 69 74 68 20 61 20 64 69 66  tion (with a dif
5fe0: 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 65 49 6e  ferent compareIn
5ff0: 66 6f 20 73 74 72 75 63 74 75 72 65 29 20 63 6f  fo structure) co
6000: 6d 70 75 74 65 73 0a 2a 2a 20 74 68 65 20 47 4c  mputes.** the GL
6010: 4f 42 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  OB operator..*/.
6020: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6b 65  static void like
6030: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
6040: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
6050: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a  , .  int argc, .
6060: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6070: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
6080: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
6090: 2a 7a 41 2c 20 2a 7a 42 3b 0a 20 20 75 33 32 20  *zA, *zB;.  u32 
60a0: 65 73 63 61 70 65 3b 0a 20 20 69 6e 74 20 6e 50  escape;.  int nP
60b0: 61 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  at;.  sqlite3 *d
60c0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
60d0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
60e0: 6e 74 65 78 74 29 3b 0a 20 20 73 74 72 75 63 74  ntext);.  struct
60f0: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49   compareInfo *pI
6100: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  nfo = sqlite3_us
6110: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
6120: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
6130: 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54  _LIKE_DOESNT_MAT
6140: 43 48 5f 42 4c 4f 42 53 0a 20 20 69 66 28 20 73  CH_BLOBS.  if( s
6150: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
6160: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
6170: 54 45 5f 42 4c 4f 42 0a 20 20 20 7c 7c 20 73 71  TE_BLOB.   || sq
6180: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6190: 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54  (argv[1])==SQLIT
61a0: 45 5f 42 4c 4f 42 0a 20 20 29 7b 0a 23 69 66 64  E_BLOB.  ){.#ifd
61b0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
61c0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f     sqlite3_like_
61d0: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
61e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
61f0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
6200: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
6210: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 42 20    }.#endif.  zB 
6220: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6230: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
6240: 20 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   zA = sqlite3_va
6250: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
6260: 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74  );..  /* Limit t
6270: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
6280: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61   LIKE or GLOB pa
6290: 74 74 65 72 6e 20 74 6f 20 61 76 6f 69 64 20 70  ttern to avoid p
62a0: 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20  roblems.  ** of 
62b0: 64 65 65 70 20 72 65 63 75 72 73 69 6f 6e 20 61  deep recursion a
62c0: 6e 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20  nd N*N behavior 
62d0: 69 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  in patternCompar
62e0: 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 74  e()..  */.  nPat
62f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6300: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
6310: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
6320: 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  t==db->aLimit[SQ
6330: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
6340: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20  PATTERN_LENGTH] 
6350: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
6360: 50 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  Pat==db->aLimit[
6370: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
6380: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
6390: 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  ]+1 );.  if( nPa
63a0: 74 20 3e 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  t > db->aLimit[S
63b0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
63c0: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
63d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
63e0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
63f0: 74 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20 47  text, "LIKE or G
6400: 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f 20  LOB pattern too 
6410: 63 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a 20  complex", -1);. 
6420: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6430: 20 61 73 73 65 72 74 28 20 7a 42 3d 3d 73 71 6c   assert( zB==sql
6440: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6450: 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20  argv[0]) );  /* 
6460: 45 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e 6f 74  Encoding did not
6470: 20 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20 69 66   change */..  if
6480: 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20  ( argc==3 ){.   
6490: 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63   /* The escape c
64a0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20  haracter string 
64b0: 6d 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 20  must consist of 
64c0: 61 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63  a single UTF-8 c
64d0: 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a  haracter..    **
64e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
64f0: 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  rn an error..   
6500: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
6510: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 73  signed char *zEs
6520: 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  c = sqlite3_valu
6530: 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b  e_text(argv[2]);
6540: 0a 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d 30  .    if( zEsc==0
6550: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
6560: 66 28 20 73 71 6c 69 74 65 33 55 74 66 38 43 68  f( sqlite3Utf8Ch
6570: 61 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45 73  arLen((char*)zEs
6580: 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20 20  c, -1)!=1 ){.   
6590: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
65a0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
65b0: 20 0a 20 20 20 20 20 20 20 20 20 20 22 45 53 43   .          "ESC
65c0: 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  APE expression m
65d0: 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
65e0: 63 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29 3b  character", -1);
65f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
6600: 20 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65 20     }.    escape 
6610: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
6620: 64 28 26 7a 45 73 63 29 3b 0a 20 20 7d 65 6c 73  d(&zEsc);.  }els
6630: 65 7b 0a 20 20 20 20 65 73 63 61 70 65 20 3d 20  e{.    escape = 
6640: 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3b  pInfo->matchSet;
6650: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20 26 26  .  }.  if( zA &&
6660: 20 7a 42 20 29 7b 0a 23 69 66 64 65 66 20 53 51   zB ){.#ifdef SQ
6670: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
6680: 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
6690: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  ++;.#endif.    s
66a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
66b0: 74 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20  t(context,.     
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
66e0: 7a 42 2c 20 7a 41 2c 20 70 49 6e 66 6f 2c 20 65  zB, zA, pInfo, e
66f0: 73 63 61 70 65 29 3d 3d 53 51 4c 49 54 45 5f 4d  scape)==SQLITE_M
6700: 41 54 43 48 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ATCH);.  }.}../*
6710: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
6720: 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46  on of the NULLIF
6730: 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20  (x,y) function. 
6740: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
6750: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
6760: 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72 67 75  ment if the argu
6770: 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66 65 72  ments are differ
6780: 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ent.  The result
6790: 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a   is NULL if the.
67a0: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ** arguments are
67b0: 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20 6f   equal to each o
67c0: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
67d0: 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28  void nullifFunc(
67e0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
67f0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
6800: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
6810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
6820: 67 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  gv.){.  CollSeq 
6830: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
6840: 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63  GetFuncCollSeq(c
6850: 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45  ontext);.  UNUSE
6860: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
6870: 73 65 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  sed);.  if( sqli
6880: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72  te3MemCompare(ar
6890: 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20  gv[0], argv[1], 
68a0: 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20  pColl)!=0 ){.   
68b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
68c0: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
68d0: 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a  rgv[0]);.  }.}..
68e0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
68f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
6900: 74 65 5f 76 65 72 73 69 6f 6e 28 29 20 66 75 6e  te_version() fun
6910: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75  ction.  The resu
6920: 6c 74 20 69 73 20 74 68 65 20 76 65 72 73 69 6f  lt is the versio
6930: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 53 51 4c 69  n.** of the SQLi
6940: 74 65 20 6c 69 62 72 61 72 79 20 74 68 61 74 20  te library that 
6950: 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73  is running..*/.s
6960: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 73 69  tatic void versi
6970: 6f 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  onFunc(.  sqlite
6980: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6990: 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  xt,.  int NotUse
69a0: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  d,.  sqlite3_val
69b0: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
69c0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
69d0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
69e0: 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d  tUsed2);.  /* IM
69f0: 50 3a 20 52 2d 34 38 36 39 39 2d 34 38 36 31 37  P: R-48699-48617
6a00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6a10: 73 20 61 6e 20 53 51 4c 20 77 72 61 70 70 65 72  s an SQL wrapper
6a20: 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a   around the.  **
6a30: 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
6a40: 69 6f 6e 28 29 20 43 2d 69 6e 74 65 72 66 61 63  ion() C-interfac
6a50: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  e. */.  sqlite3_
6a60: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6a70: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62  ext, sqlite3_lib
6a80: 76 65 72 73 69 6f 6e 28 29 2c 20 2d 31 2c 20 53  version(), -1, S
6a90: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d  QLITE_STATIC);.}
6aa0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6ab0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  tation of the sq
6ac0: 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 28 29  lite_source_id()
6ad0: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 72   function. The r
6ae0: 65 73 75 6c 74 20 69 73 20 61 20 73 74 72 69 6e  esult is a strin
6af0: 67 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  g.** that identi
6b00: 66 69 65 73 20 74 68 65 20 70 61 72 74 69 63 75  fies the particu
6b10: 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  lar version of t
6b20: 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 75  he source code u
6b30: 73 65 64 20 74 6f 20 62 75 69 6c 64 0a 2a 2a 20  sed to build.** 
6b40: 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  SQLite..*/.stati
6b50: 63 20 76 6f 69 64 20 73 6f 75 72 63 65 69 64 46  c void sourceidF
6b60: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
6b70: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6b80: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
6b90: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6ba0: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
6bb0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6bc0: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
6bd0: 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20  ed2);.  /* IMP: 
6be0: 52 2d 32 34 34 37 30 2d 33 31 31 33 36 20 54 68  R-24470-31136 Th
6bf0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
6c00: 6e 20 53 51 4c 20 77 72 61 70 70 65 72 20 61 72  n SQL wrapper ar
6c10: 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71  ound the.  ** sq
6c20: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
6c30: 20 43 20 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f   C interface. */
6c40: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6c50: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6c60: 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
6c70: 28 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  (), -1, SQLITE_S
6c80: 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TATIC);.}../*.**
6c90: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
6ca0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6c 6f  of the sqlite_lo
6cb0: 67 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  g() function.  T
6cc0: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
6cd0: 20 61 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74   around.** sqlit
6ce0: 65 33 5f 6c 6f 67 28 29 2e 20 20 54 68 65 20 72  e3_log().  The r
6cf0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 4e  eturn value is N
6d00: 55 4c 4c 2e 20 20 54 68 65 20 66 75 6e 63 74 69  ULL.  The functi
6d10: 6f 6e 20 65 78 69 73 74 73 20 70 75 72 65 6c 79  on exists purely
6d20: 20 66 6f 72 0a 2a 2a 20 69 74 73 20 73 69 64 65   for.** its side
6d30: 2d 65 66 66 65 63 74 73 2e 0a 2a 2f 0a 73 74 61  -effects..*/.sta
6d40: 74 69 63 20 76 6f 69 64 20 65 72 72 6c 6f 67 46  tic void errlogF
6d50: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
6d60: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6d70: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
6d80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6d90: 72 67 76 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  rgv.){.  UNUSED_
6da0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
6db0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6dc0: 54 45 52 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  TER(context);.  
6dd0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 73 71 6c 69  sqlite3_log(sqli
6de0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
6df0: 67 76 5b 30 5d 29 2c 20 22 25 73 22 2c 20 73 71  gv[0]), "%s", sq
6e00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6e10: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f  (argv[1]));.}../
6e20: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
6e30: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
6e40: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
6e50: 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e  used() function.
6e60: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
6e70: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  s an integer tha
6e80: 74 20 69 64 65 6e 74 69 66 69 65 73 20 69 66 20  t identifies if 
6e90: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  the compiler opt
6ea0: 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20  ion.** was used 
6eb0: 74 6f 20 62 75 69 6c 64 20 53 51 4c 69 74 65 2e  to build SQLite.
6ec0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
6ed0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
6ee0: 50 54 49 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74  PTION_DIAGS.stat
6ef0: 69 63 20 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f  ic void compileo
6f00: 70 74 69 6f 6e 75 73 65 64 46 75 6e 63 28 0a 20  ptionusedFunc(. 
6f10: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6f20: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6f30: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
6f40: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6f50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6f60: 4f 70 74 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  OptName;.  asser
6f70: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
6f80: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6f90: 28 61 72 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50  (argc);.  /* IMP
6fa0: 3a 20 52 2d 33 39 35 36 34 2d 33 36 33 30 35 20  : R-39564-36305 
6fb0: 54 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69  The sqlite_compi
6fc0: 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 20  leoption_used() 
6fd0: 53 51 4c 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  SQL.  ** functio
6fe0: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
6ff0: 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65  round the sqlite
7000: 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
7010: 75 73 65 64 28 29 20 43 2f 43 2b 2b 0a 20 20 2a  used() C/C++.  *
7020: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  * function..  */
7030: 0a 20 20 69 66 28 20 28 7a 4f 70 74 4e 61 6d 65  .  if( (zOptName
7040: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
7050: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
7060: 78 74 28 61 72 67 76 5b 30 5d 29 29 21 3d 30 20  xt(argv[0]))!=0 
7070: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
7080: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7090: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  t, sqlite3_compi
70a0: 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 7a 4f  leoption_used(zO
70b0: 70 74 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a  ptName));.  }.}.
70c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
70d0: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
70e0: 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a  ION_DIAGS */../*
70f0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
7100: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
7110: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67  _compileoption_g
7120: 65 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  et() function. .
7130: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
7140: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
7150: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 63 6f  dentifies the co
7160: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 0a  mpiler options .
7170: 2a 2a 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  ** used to build
7180: 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e   SQLite..*/.#ifn
7190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
71a0: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
71b0: 41 47 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AGS.static void 
71c0: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74  compileoptionget
71d0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
71e0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
71f0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
7200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
7210: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  argv.){.  int n;
7220: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7230: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
7240: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
7250: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 39 32    /* IMP: R-0492
7260: 32 2d 32 34 30 37 36 20 54 68 65 20 73 71 6c 69  2-24076 The sqli
7270: 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  te_compileoption
7280: 5f 67 65 74 28 29 20 53 51 4c 20 66 75 6e 63 74  _get() SQL funct
7290: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 77 72  ion.  ** is a wr
72a0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65  apper around the
72b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
72c0: 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20 43 2f 43  option_get() C/C
72d0: 2b 2b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ++ function..  *
72e0: 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  /.  n = sqlite3_
72f0: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
7300: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ]);.  sqlite3_re
7310: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
7320: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  t, sqlite3_compi
7330: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 6e 29 2c  leoption_get(n),
7340: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
7350: 49 43 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  IC);.}.#endif /*
7360: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
7370: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
7380: 20 2a 2f 0a 0a 2f 2a 20 41 72 72 61 79 20 66 6f   */../* Array fo
7390: 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f  r converting fro
73a0: 6d 20 68 61 6c 66 2d 62 79 74 65 73 20 28 6e 79  m half-bytes (ny
73b0: 62 62 6c 65 73 29 20 69 6e 74 6f 20 41 53 43 49  bbles) into ASCI
73c0: 49 20 68 65 78 0a 2a 2a 20 64 69 67 69 74 73 2e  I hex.** digits.
73d0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
73e0: 20 63 68 61 72 20 68 65 78 64 69 67 69 74 73 5b   char hexdigits[
73f0: 5d 20 3d 20 7b 0a 20 20 27 30 27 2c 20 27 31 27  ] = {.  '0', '1'
7400: 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34 27 2c  , '2', '3', '4',
7410: 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a   '5', '6', '7',.
7420: 20 20 27 38 27 2c 20 27 39 27 2c 20 27 41 27 2c    '8', '9', 'A',
7430: 20 27 42 27 2c 20 27 43 27 2c 20 27 44 27 2c 20   'B', 'C', 'D', 
7440: 27 45 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f 2a  'E', 'F' .};../*
7450: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
7460: 6f 6e 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28  on of the QUOTE(
7470: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  ) function.  Thi
7480: 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  s function takes
7490: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67   a single.** arg
74a0: 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61  ument.  If the a
74b0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72  rgument is numer
74c0: 69 63 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  ic, the return v
74d0: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
74e0: 20 61 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d   as.** the argum
74f0: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67  ent.  If the arg
7500: 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
7510: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
7520: 69 73 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  is the string.**
7530: 20 22 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77   "NULL".  Otherw
7540: 69 73 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e  ise, the argumen
7550: 74 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  t is enclosed in
7560: 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77   single quotes w
7570: 69 74 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75  ith.** single-qu
7580: 6f 74 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a  ote escapes..*/.
7590: 73 74 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74  static void quot
75a0: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
75b0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
75c0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
75d0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
75e0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
75f0: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
7600: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
7610: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
7620: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
7630: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
7640: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
7650: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
7660: 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 63 68 61  1, r2;.      cha
7670: 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20  r zBuf[50];.    
7680: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 5f 76    r1 = sqlite3_v
7690: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
76a0: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  [0]);.      sqli
76b0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
76c0: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
76d0: 20 22 25 21 2e 31 35 67 22 2c 20 72 31 29 3b 0a   "%!.15g", r1);.
76e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f        sqlite3Ato
76f0: 46 28 7a 42 75 66 2c 20 26 72 32 2c 20 32 30 2c  F(zBuf, &r2, 20,
7700: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
7710: 20 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20       if( r1!=r2 
7720: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7730: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
7740: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
7750: 22 25 21 2e 32 30 65 22 2c 20 72 31 29 3b 0a 20  "%!.20e", r1);. 
7760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7770: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7780: 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20  (context, zBuf, 
7790: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
77a0: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65  IENT);.      bre
77b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
77c0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
77d0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
77e0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
77f0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
7800: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7810: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
7820: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
7830: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20      char *zText 
7840: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
7850: 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73  const *zBlob = s
7860: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
7870: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
7880: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
7890: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
78a0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
78b0: 20 20 61 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d    assert( zBlob=
78c0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  =sqlite3_value_b
78d0: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  lob(argv[0]) ); 
78e0: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
78f0: 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 7a  hange */.      z
7900: 54 65 78 74 20 3d 20 28 63 68 61 72 20 2a 29 63  Text = (char *)c
7910: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
7920: 74 65 78 74 2c 20 28 32 2a 28 69 36 34 29 6e 42  text, (2*(i64)nB
7930: 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20 20 20 20  lob)+4); .      
7940: 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
7950: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
7960: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7970: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Blob; i++){.    
7980: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32        zText[(i*2
7990: 29 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73  )+2] = hexdigits
79a0: 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30  [(zBlob[i]>>4)&0
79b0: 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x0F];.          
79c0: 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d  zText[(i*2)+3] =
79d0: 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f   hexdigits[(zBlo
79e0: 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20  b[i])&0x0F];.   
79f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
7a00: 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32  Text[(nBlob*2)+2
7a10: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
7a20: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
7a30: 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  )+3] = '\0';.   
7a40: 20 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20       zText[0] = 
7a50: 27 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  'X';.        zTe
7a60: 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  xt[1] = '\'';.  
7a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7a80: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
7a90: 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51  t, zText, -1, SQ
7aa0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
7ab0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7ac0: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
7ad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7ae0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7af0: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
7b00: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a  .      int i,j;.
7b10: 20 20 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20        u64 n;.   
7b20: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
7b30: 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73  d char *zArg = s
7b40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
7b50: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
7b60: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20    char *z;..    
7b70: 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20    if( zArg==0 ) 
7b80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
7b90: 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67  r(i=0, n=0; zArg
7ba0: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a  [i]; i++){ if( z
7bb0: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  Arg[i]=='\'' ) n
7bc0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20  ++; }.      z = 
7bd0: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
7be0: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 69 29 2b  ntext, ((i64)i)+
7bf0: 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a 20 20 20  ((i64)n)+3);.   
7c00: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
7c10: 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b      z[0] = '\'';
7c20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
7c30: 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20  , j=1; zArg[i]; 
7c40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7c50: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d  z[j++] = zArg[i]
7c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7c70: 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  zArg[i]=='\'' ){
7c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  .            z[j
7c90: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
7ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7cb0: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  }.        z[j++]
7cc0: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
7cd0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
7ce0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7cf0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
7d00: 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  z, j, sqlite3_fr
7d10: 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ee);.      }.   
7d20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7d30: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
7d40: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
7d50: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
7d60: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
7d70: 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  _NULL );.      s
7d80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7d90: 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c  xt(context, "NUL
7da0: 4c 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54  L", 4, SQLITE_ST
7db0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
7dc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
7dd0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 63 6f  ./*.** The unico
7de0: 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  de() function.  
7df0: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67  Return the integ
7e00: 65 72 20 75 6e 69 63 6f 64 65 20 63 6f 64 65 2d  er unicode code-
7e10: 70 6f 69 6e 74 20 76 61 6c 75 65 0a 2a 2a 20 66  point value.** f
7e20: 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 68 61  or the first cha
7e30: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e  racter of the in
7e40: 70 75 74 20 73 74 72 69 6e 67 2e 20 0a 2a 2f 0a  put string. .*/.
7e50: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 63  static void unic
7e60: 6f 64 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  odeFunc(.  sqlit
7e70: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7e80: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
7e90: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7ea0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
7eb0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
7ec0: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   *z = sqlite3_va
7ed0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
7ee0: 29 3b 0a 20 20 28 76 6f 69 64 29 61 72 67 63 3b  );.  (void)argc;
7ef0: 0a 20 20 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d  .  if( z && z[0]
7f00: 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c   ) sqlite3_resul
7f10: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
7f20: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
7f30: 7a 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  z));.}../*.** Th
7f40: 65 20 63 68 61 72 28 29 20 66 75 6e 63 74 69 6f  e char() functio
7f50: 6e 20 74 61 6b 65 73 20 7a 65 72 6f 20 6f 72 20  n takes zero or 
7f60: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2c 20  more arguments, 
7f70: 65 61 63 68 20 6f 66 20 77 68 69 63 68 20 69 73  each of which is
7f80: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 20  .** an integer. 
7f90: 20 49 74 20 63 6f 6e 73 74 72 75 63 74 73 20 61   It constructs a
7fa0: 20 73 74 72 69 6e 67 20 77 68 65 72 65 20 65 61   string where ea
7fb0: 63 68 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  ch character of 
7fc0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  the string.** is
7fd0: 20 74 68 65 20 75 6e 69 63 6f 64 65 20 63 68 61   the unicode cha
7fe0: 72 61 63 74 65 72 20 66 6f 72 20 74 68 65 20 63  racter for the c
7ff0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 74  orresponding int
8000: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  eger argument..*
8010: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
8020: 61 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  arFunc(.  sqlite
8030: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
8040: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
8050: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8060: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 75 6e 73 69  **argv.){.  unsi
8070: 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 2a 7a  gned char *z, *z
8080: 4f 75 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Out;.  int i;.  
8090: 7a 4f 75 74 20 3d 20 7a 20 3d 20 73 71 6c 69 74  zOut = z = sqlit
80a0: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 61 72 67  e3_malloc64( arg
80b0: 63 2a 34 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a  c*4+1 );.  if( z
80c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
80d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
80e0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
80f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8100: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
8110: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  c; i++){.    sql
8120: 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
8130: 20 20 75 6e 73 69 67 6e 65 64 20 63 3b 0a 20 20    unsigned c;.  
8140: 20 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    x = sqlite3_va
8150: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 69  lue_int64(argv[i
8160: 5d 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 30 20  ]);.    if( x<0 
8170: 7c 7c 20 78 3e 30 78 31 30 66 66 66 66 20 29 20  || x>0x10ffff ) 
8180: 78 20 3d 20 30 78 66 66 66 64 3b 0a 20 20 20 20  x = 0xfffd;.    
8190: 63 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 28 78  c = (unsigned)(x
81a0: 20 26 20 30 78 31 66 66 66 66 66 29 3b 0a 20 20   & 0x1fffff);.  
81b0: 20 20 69 66 28 20 63 3c 30 78 30 30 30 38 30 20    if( c<0x00080 
81c0: 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  ){.      *zOut++
81d0: 20 3d 20 28 75 38 29 28 63 26 30 78 46 46 29 3b   = (u8)(c&0xFF);
81e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
81f0: 3c 30 78 30 30 38 30 30 20 29 7b 0a 20 20 20 20  <0x00800 ){.    
8200: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 43 30    *zOut++ = 0xC0
8210: 20 2b 20 28 75 38 29 28 28 63 3e 3e 36 29 26 30   + (u8)((c>>6)&0
8220: 78 31 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75  x1F);.      *zOu
8230: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38  t++ = 0x80 + (u8
8240: 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20  )(c & 0x3F);.   
8250: 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31   }else if( c<0x1
8260: 30 30 30 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a  0000 ){.      *z
8270: 4f 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28  Out++ = 0xE0 + (
8280: 75 38 29 28 28 63 3e 3e 31 32 29 26 30 78 30 46  u8)((c>>12)&0x0F
8290: 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  );.      *zOut++
82a0: 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 28   = 0x80 + (u8)((
82b0: 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 0a 20  c>>6) & 0x3F);. 
82c0: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
82d0: 78 38 30 20 2b 20 28 75 38 29 28 63 20 26 20 30  x80 + (u8)(c & 0
82e0: 78 33 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  x3F);.    }else{
82f0: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
8300: 20 30 78 46 30 20 2b 20 28 75 38 29 28 28 63 3e   0xF0 + (u8)((c>
8310: 3e 31 38 29 20 26 20 30 78 30 37 29 3b 0a 20 20  >18) & 0x07);.  
8320: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
8330: 38 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 31 32  80 + (u8)((c>>12
8340: 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20  ) & 0x3F);.     
8350: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20   *zOut++ = 0x80 
8360: 2b 20 28 75 38 29 28 28 63 3e 3e 36 29 20 26 20  + (u8)((c>>6) & 
8370: 30 78 33 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f  0x3F);.      *zO
8380: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75  ut++ = 0x80 + (u
8390: 38 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20  8)(c & 0x3F);.  
83a0: 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20    }             
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 20 20 73         \.  }.  s
83e0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
83f0: 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 63  xt64(context, (c
8400: 68 61 72 2a 29 7a 2c 20 7a 4f 75 74 2d 7a 2c 20  har*)z, zOut-z, 
8410: 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20 53 51  sqlite3_free, SQ
8420: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 7d 0a 0a 2f  LITE_UTF8);.}../
8430: 2a 0a 2a 2a 20 54 68 65 20 68 65 78 28 29 20 66  *.** The hex() f
8440: 75 6e 63 74 69 6f 6e 2e 20 20 49 6e 74 65 72 70  unction.  Interp
8450: 72 65 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ret the argument
8460: 20 61 73 20 61 20 62 6c 6f 62 2e 20 20 52 65 74   as a blob.  Ret
8470: 75 72 6e 0a 2a 2a 20 61 20 68 65 78 61 64 65 63  urn.** a hexadec
8480: 69 6d 61 6c 20 72 65 6e 64 65 72 69 6e 67 20 61  imal rendering a
8490: 73 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69  s text..*/.stati
84a0: 63 20 76 6f 69 64 20 68 65 78 46 75 6e 63 28 0a  c void hexFunc(.
84b0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
84c0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
84d0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
84e0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
84f0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
8500: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8510: 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 63 68  har *pBlob;.  ch
8520: 61 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a 20 20  ar *zHex, *z;.  
8530: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
8540: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
8550: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 70  METER(argc);.  p
8560: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
8570: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
8580: 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  ]);.  n = sqlite
8590: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
85a0: 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[0]);.  assert
85b0: 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33  ( pBlob==sqlite3
85c0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
85d0: 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65  [0]) );  /* No e
85e0: 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a  ncoding change *
85f0: 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20 63  /.  z = zHex = c
8600: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
8610: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2a 32  text, ((i64)n)*2
8620: 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a 48 65   + 1);.  if( zHe
8630: 78 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  x ){.    for(i=0
8640: 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42 6c 6f  ; i<n; i++, pBlo
8650: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  b++){.      unsi
8660: 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 2a 70  gned char c = *p
8670: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 2a 28 7a 2b  Blob;.      *(z+
8680: 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  +) = hexdigits[(
8690: 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20  c>>4)&0xf];.    
86a0: 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69    *(z++) = hexdi
86b0: 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a 20 20 20  gits[c&0xf];.   
86c0: 20 7d 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20   }.    *z = 0;. 
86d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
86e0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
86f0: 7a 48 65 78 2c 20 6e 2a 32 2c 20 73 71 6c 69 74  zHex, n*2, sqlit
8700: 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a  e3_free);.  }.}.
8710: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a 65 72 6f 62  ./*.** The zerob
8720: 6c 6f 62 28 4e 29 20 66 75 6e 63 74 69 6f 6e 20  lob(N) function 
8730: 72 65 74 75 72 6e 73 20 61 20 7a 65 72 6f 2d 66  returns a zero-f
8740: 69 6c 6c 65 64 20 62 6c 6f 62 20 6f 66 20 73 69  illed blob of si
8750: 7a 65 20 4e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  ze N bytes..*/.s
8760: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 62  tatic void zerob
8770: 6c 6f 62 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  lobFunc(.  sqlit
8780: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
8790: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
87a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
87b0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 36 34   **argv.){.  i64
87c0: 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   n;.  int rc;.  
87d0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
87e0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
87f0: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e  METER(argc);.  n
8800: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8810: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
8820: 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d  .  if( n<0 ) n =
8830: 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
8840: 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c  e3_result_zerobl
8850: 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 6e 29  ob64(context, n)
8860: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 30 32 39  ; /* IMP: R-0029
8870: 33 2d 36 34 39 39 34 20 2a 2f 0a 20 20 69 66 28  3-64994 */.  if(
8880: 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
8890: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
88a0: 63 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63  code(context, rc
88b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
88c0: 54 68 65 20 72 65 70 6c 61 63 65 28 29 20 66 75  The replace() fu
88d0: 6e 63 74 69 6f 6e 2e 20 20 54 68 72 65 65 20 61  nction.  Three a
88e0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 6c 6c  rguments are all
88f0: 20 73 74 72 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a   strings: call.*
8900: 2a 20 74 68 65 6d 20 41 2c 20 42 2c 20 61 6e 64  * them A, B, and
8910: 20 43 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69   C. The result i
8920: 73 20 61 6c 73 6f 20 61 20 73 74 72 69 6e 67 20  s also a string 
8930: 77 68 69 63 68 20 69 73 20 64 65 72 69 76 65 64  which is derived
8940: 0a 2a 2a 20 66 72 6f 6d 20 41 20 62 79 20 72 65  .** from A by re
8950: 70 6c 61 63 69 6e 67 20 65 76 65 72 79 20 6f 63  placing every oc
8960: 63 75 72 72 65 6e 63 65 20 6f 66 20 42 20 77 69  currence of B wi
8970: 74 68 20 43 2e 20 20 54 68 65 20 6d 61 74 63 68  th C.  The match
8980: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 78 61 63  .** must be exac
8990: 74 2e 20 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65  t.  Collating se
89a0: 71 75 65 6e 63 65 73 20 61 72 65 20 6e 6f 74 20  quences are not 
89b0: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
89c0: 76 6f 69 64 20 72 65 70 6c 61 63 65 46 75 6e 63  void replaceFunc
89d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
89e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
89f0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
8a00: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8a10: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
8a20: 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72 3b  gned char *zStr;
8a30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
8a40: 6e 70 75 74 20 73 74 72 69 6e 67 20 41 20 2a 2f  nput string A */
8a50: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
8a60: 64 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e  d char *zPattern
8a70: 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74 74  ;    /* The patt
8a80: 65 72 6e 20 73 74 72 69 6e 67 20 42 20 2a 2f 0a  ern string B */.
8a90: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
8aa0: 20 63 68 61 72 20 2a 7a 52 65 70 3b 20 20 20 20   char *zRep;    
8ab0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 70 6c 61      /* The repla
8ac0: 63 65 6d 65 6e 74 20 73 74 72 69 6e 67 20 43 20  cement string C 
8ad0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
8ae0: 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20  ar *zOut;       
8af0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75         /* The ou
8b00: 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tput */.  int nS
8b10: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
8b20: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 53     /* Size of zS
8b30: 74 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  tr */.  int nPat
8b40: 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tern;           
8b50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 50 61 74   /* Size of zPat
8b60: 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  tern */.  int nR
8b70: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
8b80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 52     /* Size of zR
8b90: 65 70 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 75 74  ep */.  i64 nOut
8ba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8bb0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65   /* Maximum size
8bc0: 20 6f 66 20 7a 4f 75 74 20 2a 2f 0a 20 20 69 6e   of zOut */.  in
8bd0: 74 20 6c 6f 6f 70 4c 69 6d 69 74 3b 20 20 20 20  t loopLimit;    
8be0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 7a         /* Last z
8bf0: 53 74 72 5b 5d 20 74 68 61 74 20 6d 69 67 68 74  Str[] that might
8c00: 20 6d 61 74 63 68 20 7a 50 61 74 74 65 72 6e 5b   match zPattern[
8c10: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ] */.  int i, j;
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
8c40: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
8c50: 6e 74 45 78 70 61 6e 64 3b 20 20 20 20 20 20 2f  ntExpand;      /
8c60: 2a 20 4e 75 6d 62 65 72 20 7a 4f 75 74 20 65 78  * Number zOut ex
8c70: 70 61 6e 73 69 6f 6e 73 20 2a 2f 0a 20 20 73 71  pansions */.  sq
8c80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
8c90: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
8ca0: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
8cb0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
8cc0: 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =3 );.  UNUSED_P
8cd0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
8ce0: 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33    zStr = sqlite3
8cf0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8d00: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53 74 72  [0]);.  if( zStr
8d10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8d20: 6e 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  nStr = sqlite3_v
8d30: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
8d40: 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0]);.  assert( z
8d50: 53 74 72 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  Str==sqlite3_val
8d60: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
8d70: 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64   );  /* No encod
8d80: 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ing change */.  
8d90: 7a 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74  zPattern = sqlit
8da0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8db0: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50  gv[1]);.  if( zP
8dc0: 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20  attern==0 ){.   
8dd0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8de0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8df0: 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [1])==SQLITE_NUL
8e00: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
8e10: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8e20: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
8e30: 78 74 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  xt)->mallocFaile
8e40: 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
8e50: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74 74  .  }.  if( zPatt
8e60: 65 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ern[0]==0 ){.   
8e70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8e80: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8e90: 5b 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  [1])!=SQLITE_NUL
8ea0: 4c 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  L );.    sqlite3
8eb0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
8ec0: 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b  ntext, argv[0]);
8ed0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8ee0: 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73 71  .  nPattern = sq
8ef0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8f00: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73  s(argv[1]);.  as
8f10: 73 65 72 74 28 20 7a 50 61 74 74 65 72 6e 3d 3d  sert( zPattern==
8f20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8f30: 78 74 28 61 72 67 76 5b 31 5d 29 20 29 3b 20 20  xt(argv[1]) );  
8f40: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
8f50: 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65 70 20  hange */.  zRep 
8f60: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8f70: 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20  text(argv[2]);. 
8f80: 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20 72   if( zRep==0 ) r
8f90: 65 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20 3d 20  eturn;.  nRep = 
8fa0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
8fb0: 74 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  tes(argv[2]);.  
8fc0: 61 73 73 65 72 74 28 20 7a 52 65 70 3d 3d 73 71  assert( zRep==sq
8fd0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8fe0: 28 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20 20 6e  (argv[2]) );.  n
8ff0: 4f 75 74 20 3d 20 6e 53 74 72 20 2b 20 31 3b 0a  Out = nStr + 1;.
9000: 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3c 53    assert( nOut<S
9010: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
9020: 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63 6f 6e   );.  zOut = con
9030: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
9040: 78 74 2c 20 28 69 36 34 29 6e 4f 75 74 29 3b 0a  xt, (i64)nOut);.
9050: 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b    if( zOut==0 ){
9060: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9070: 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e  .  loopLimit = n
9080: 53 74 72 20 2d 20 6e 50 61 74 74 65 72 6e 3b 20  Str - nPattern; 
9090: 20 0a 20 20 63 6e 74 45 78 70 61 6e 64 20 3d 20   .  cntExpand = 
90a0: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
90b0: 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b  i<=loopLimit; i+
90c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 74 72  +){.    if( zStr
90d0: 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30 5d  [i]!=zPattern[0]
90e0: 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74 72   || memcmp(&zStr
90f0: 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e  [i], zPattern, n
9100: 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20 20 20  Pattern) ){.    
9110: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53    zOut[j++] = zS
9120: 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  tr[i];.    }else
9130: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 70  {.      if( nRep
9140: 3e 6e 50 61 74 74 65 72 6e 20 29 7b 0a 20 20 20  >nPattern ){.   
9150: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 6e 52 65       nOut += nRe
9160: 70 20 2d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  p - nPattern;.  
9170: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9180: 6e 4f 75 74 2d 31 3d 3d 64 62 2d 3e 61 4c 69 6d  nOut-1==db->aLim
9190: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
91a0: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20  LENGTH] );.     
91b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 75     testcase( nOu
91c0: 74 2d 32 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  t-2==db->aLimit[
91d0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
91e0: 47 54 48 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  GTH] );.        
91f0: 69 66 28 20 6e 4f 75 74 2d 31 3e 64 62 2d 3e 61  if( nOut-1>db->a
9200: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
9210: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
9220: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9230: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f  result_error_too
9240: 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  big(context);.  
9250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9260: 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
9270: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9290: 63 6e 74 45 78 70 61 6e 64 2b 2b 3b 0a 20 20 20  cntExpand++;.   
92a0: 20 20 20 20 20 69 66 28 20 28 63 6e 74 45 78 70       if( (cntExp
92b0: 61 6e 64 26 28 63 6e 74 45 78 70 61 6e 64 2d 31  and&(cntExpand-1
92c0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
92d0: 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 73     /* Grow the s
92e0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ize of the outpu
92f0: 74 20 62 75 66 66 65 72 20 6f 6e 6c 79 20 6f 6e  t buffer only on
9300: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 0a 20   substitutions. 
9310: 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 6f 73           ** whos
9320: 65 20 69 6e 64 65 78 20 69 73 20 61 20 70 6f 77  e index is a pow
9330: 65 72 20 6f 66 20 74 77 6f 3a 20 31 2c 20 32 2c  er of two: 1, 2,
9340: 20 34 2c 20 38 2c 20 31 36 2c 20 33 32 2c 20 2e   4, 8, 16, 32, .
9350: 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .. */.          
9360: 75 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20  u8 *zOld;.      
9370: 20 20 20 20 7a 4f 6c 64 20 3d 20 7a 4f 75 74 3b      zOld = zOut;
9380: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 20  .          zOut 
9390: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
93a0: 63 36 34 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e  c64(zOut, (int)n
93b0: 4f 75 74 20 2b 20 28 6e 4f 75 74 20 2d 20 6e 53  Out + (nOut - nS
93c0: 74 72 20 2d 20 31 29 29 3b 0a 20 20 20 20 20 20  tr - 1));.      
93d0: 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20      if( zOut==0 
93e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
93f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
9400: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
9410: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
9420: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c  sqlite3_free(zOl
9430: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
9440: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
9450: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9460: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
9470: 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65  py(&zOut[j], zRe
9480: 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20  p, nRep);.      
9490: 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20  j += nRep;.     
94a0: 20 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31   i += nPattern-1
94b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
94c0: 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31  sert( j+nStr-i+1
94d0: 3c 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63  <=nOut );.  memc
94e0: 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53  py(&zOut[j], &zS
94f0: 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a  tr[i], nStr-i);.
9500: 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b    j += nStr - i;
9510: 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f  .  assert( j<=nO
9520: 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20  ut );.  zOut[j] 
9530: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
9540: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
9550: 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c  xt, (char*)zOut,
9560: 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   j, sqlite3_free
9570: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
9580: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
9590: 65 20 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28  e TRIM(), LTRIM(
95a0: 29 2c 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66  ), and RTRIM() f
95b0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65  unctions..** The
95c0: 20 75 73 65 72 64 61 74 61 20 69 73 20 30 78 31   userdata is 0x1
95d0: 20 66 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20   for left trim, 
95e0: 30 78 32 20 66 6f 72 20 72 69 67 68 74 20 74 72  0x2 for right tr
95f0: 69 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68  im, 0x3 for both
9600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9610: 20 74 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c   trimFunc(.  sql
9620: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
9630: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
9640: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
9650: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
9660: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
9670: 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20  ar *zIn;        
9680: 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67   /* Input string
9690: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
96a0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72  gned char *zChar
96b0: 53 65 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f  Set;    /* Set o
96c0: 66 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20  f characters to 
96d0: 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  trim */.  int nI
96e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9700: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
9710: 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74  n input */.  int
9720: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9740: 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32  * 1: trimleft  2
9750: 3a 20 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20  : trimright  3: 
9760: 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  trim */.  int i;
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9790: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
97a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
97b0: 61 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  aLen = 0;       
97c0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
97d0: 65 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69  each character i
97e0: 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20  n zCharSet */.  
97f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
9800: 61 7a 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20  azChar = 0;     
9810: 20 20 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20    /* Individual 
9820: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43  characters in zC
9830: 68 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20  harSet */.  int 
9840: 6e 43 68 61 72 3b 20 20 20 20 20 20 20 20 20 20  nChar;          
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9860: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
9870: 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65  cters in zCharSe
9880: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69  t */..  if( sqli
9890: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
98a0: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
98b0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  NULL ){.    retu
98c0: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20  rn;.  }.  zIn = 
98d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
98e0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
98f0: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75  f( zIn==0 ) retu
9900: 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69  rn;.  nIn = sqli
9910: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
9920: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65  argv[0]);.  asse
9930: 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33  rt( zIn==sqlite3
9940: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9950: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72  [0]) );.  if( ar
9960: 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61  gc==1 ){.    sta
9970: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
9980: 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d  ed char lenOne[]
9990: 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74   = { 1 };.    st
99a0: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
99b0: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f 6e 65  ar * const azOne
99c0: 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20  [] = { (u8*)" " 
99d0: 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31  };.    nChar = 1
99e0: 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38  ;.    aLen = (u8
99f0: 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a  *)lenOne;.    az
9a00: 43 68 61 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  Char = (unsigned
9a10: 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a   char **)azOne;.
9a20: 20 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20 30      zCharSet = 0
9a30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a  ;.  }else if( (z
9a40: 43 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74 65  CharSet = sqlite
9a50: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9a60: 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20 20  v[1]))==0 ){.   
9a70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
9a80: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  {.    const unsi
9a90: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
9aa0: 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74    for(z=zCharSet
9ab0: 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e  , nChar=0; *z; n
9ac0: 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 53  Char++){.      S
9ad0: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
9ae0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
9af0: 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20  ( nChar>0 ){.   
9b00: 20 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e 74     azChar = cont
9b10: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
9b20: 74 2c 20 28 28 69 36 34 29 6e 43 68 61 72 29 2a  t, ((i64)nChar)*
9b30: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31  (sizeof(char*)+1
9b40: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
9b50: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Char==0 ){.     
9b60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
9b70: 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20   }.      aLen = 
9b80: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9b90: 26 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a  &azChar[nChar];.
9ba0: 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61        for(z=zCha
9bb0: 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a  rSet, nChar=0; *
9bc0: 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20  z; nChar++){.   
9bd0: 20 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61       azChar[nCha
9be0: 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  r] = (unsigned c
9bf0: 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20 20  har *)z;.       
9c00: 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46   SQLITE_SKIP_UTF
9c10: 38 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c  8(z);.        aL
9c20: 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75 38 29  en[nChar] = (u8)
9c30: 28 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61  (z - azChar[nCha
9c40: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r]);.      }.   
9c50: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68   }.  }.  if( nCh
9c60: 61 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c 61 67  ar>0 ){.    flag
9c70: 73 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  s = SQLITE_PTR_T
9c80: 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f 75 73  O_INT(sqlite3_us
9c90: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
9ca0: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
9cb0: 20 26 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68   & 1 ){.      wh
9cc0: 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20  ile( nIn>0 ){.  
9cd0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
9ce0: 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
9cf0: 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
9d00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
9d10: 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20   = aLen[i];.    
9d20: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e        if( len<=n
9d30: 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a 49 6e  In && memcmp(zIn
9d40: 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e  , azChar[i], len
9d50: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
9d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9d70: 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62  if( i>=nChar ) b
9d80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49  reak;.        zI
9d90: 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  n += len;.      
9da0: 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20    nIn -= len;.  
9db0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9dc0: 69 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b  if( flags & 2 ){
9dd0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49  .      while( nI
9de0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  n>0 ){.        i
9df0: 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nt len = 0;.    
9e00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9e10: 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Char; i++){.    
9e20: 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e        len = aLen
9e30: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
9e40: 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d  f( len<=nIn && m
9e50: 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c  emcmp(&zIn[nIn-l
9e60: 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65  en],azChar[i],le
9e70: 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  n)==0 ) break;. 
9e80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9e90: 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20   if( i>=nChar ) 
9ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e  break;.        n
9eb0: 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  In -= len;.     
9ec0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9ed0: 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20   zCharSet ){.   
9ee0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9ef0: 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20  azChar);.    }. 
9f00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
9f10: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
9f20: 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49  , (char*)zIn, nI
9f30: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
9f40: 45 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ENT);.}...#ifdef
9f50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
9f60: 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
9f70: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 75  ION./*.** The "u
9f80: 6e 6b 6e 6f 77 6e 22 20 66 75 6e 63 74 69 6f 6e  nknown" function
9f90: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
9fa0: 79 20 73 75 62 73 74 69 74 75 74 65 64 20 69 6e  y substituted in
9fb0: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 6e 79   place of.** any
9fc0: 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 66 75   unrecognized fu
9fd0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 77 68 65 6e  nction name when
9fe0: 20 64 6f 69 6e 67 20 61 6e 20 45 58 50 4c 41 49   doing an EXPLAI
9ff0: 4e 20 6f 72 20 45 58 50 4c 41 49 4e 20 51 55 45  N or EXPLAIN QUE
a000: 52 59 20 50 4c 41 4e 0a 2a 2a 20 77 68 65 6e 20  RY PLAN.** when 
a010: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
a020: 45 5f 55 4e 4b 4e 4f 57 4e 5f 46 55 4e 43 54 49  E_UNKNOWN_FUNCTI
a030: 4f 4e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ON compile-time 
a040: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
a050: 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  ** When the "sql
a060: 69 74 65 33 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69  ite3" command-li
a070: 6e 65 20 73 68 65 6c 6c 20 69 73 20 62 75 69 6c  ne shell is buil
a080: 74 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  t using this fun
a090: 63 74 69 6f 6e 61 6c 69 74 79 2c 0a 2a 2a 20 74  ctionality,.** t
a0a0: 68 61 74 20 61 6c 6c 6f 77 73 20 61 6e 20 45 58  hat allows an EX
a0b0: 50 4c 41 49 4e 20 6f 72 20 45 58 50 4c 41 49 4e  PLAIN or EXPLAIN
a0c0: 20 51 55 45 52 59 20 50 4c 41 4e 20 66 6f 72 20   QUERY PLAN for 
a0d0: 63 6f 6d 70 6c 65 78 20 71 75 65 72 69 65 73 0a  complex queries.
a0e0: 2a 2a 20 69 6e 76 6f 6c 76 69 6e 67 20 61 70 70  ** involving app
a0f0: 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  lication-defined
a100: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
a110: 20 65 78 61 6d 69 6e 65 64 20 69 6e 20 61 20 67   examined in a g
a120: 65 6e 65 72 69 63 0a 2a 2a 20 73 71 6c 69 74 65  eneric.** sqlite
a130: 33 20 73 68 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  3 shell..*/.stat
a140: 69 63 20 76 6f 69 64 20 75 6e 6b 6e 6f 77 6e 46  ic void unknownF
a150: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
a160: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
a170: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
a180: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
a190: 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f  rgv.){.  /* no-o
a1a0: 70 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  p */.}.#endif /*
a1b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
a1c0: 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49  KNOWN_SQL_FUNCTI
a1d0: 4f 4e 2a 2f 0a 0a 0a 2f 2a 20 49 4d 50 3a 20 52  ON*/.../* IMP: R
a1e0: 2d 32 35 33 36 31 2d 31 36 31 35 30 20 54 68 69  -25361-16150 Thi
a1f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6d  s function is om
a200: 69 74 74 65 64 20 66 72 6f 6d 20 53 51 4c 69 74  itted from SQLit
a210: 65 20 62 79 20 64 65 66 61 75 6c 74 2e 20 49 74  e by default. It
a220: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  .** is only avai
a230: 6c 61 62 6c 65 20 69 66 20 74 68 65 20 53 51 4c  lable if the SQL
a240: 49 54 45 5f 53 4f 55 4e 44 45 58 20 63 6f 6d 70  ITE_SOUNDEX comp
a250: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
a260: 69 73 20 75 73 65 64 0a 2a 2a 20 77 68 65 6e 20  is used.** when 
a270: 53 51 4c 69 74 65 20 69 73 20 62 75 69 6c 74 2e  SQLite is built.
a280: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
a290: 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  E_SOUNDEX./*.** 
a2a0: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f 75 6e  Compute the soun
a2b0: 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  dex encoding of 
a2c0: 61 20 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d  a word..**.** IM
a2d0: 50 3a 20 52 2d 35 39 37 38 32 2d 30 30 30 37 32  P: R-59782-00072
a2e0: 20 54 68 65 20 73 6f 75 6e 64 65 78 28 58 29 20   The soundex(X) 
a2f0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a300: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
a310: 73 20 74 68 65 0a 2a 2a 20 73 6f 75 6e 64 65 78  s the.** soundex
a320: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
a330: 20 73 74 72 69 6e 67 20 58 2e 20 0a 2a 2f 0a 73   string X. .*/.s
a340: 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 6e 64  tatic void sound
a350: 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  exFunc(.  sqlite
a360: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
a370: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
a380: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a390: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72  **argv.){.  char
a3a0: 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20 63   zResult[8];.  c
a3b0: 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20 20  onst u8 *zIn;.  
a3c0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74  int i, j;.  stat
a3d0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
a3e0: 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d 20 3d  d char iCode[] =
a3f0: 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20   {.    0, 0, 0, 
a400: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a410: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a420: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
a430: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a440: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a450: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
a460: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a470: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a480: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
a490: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a4a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a4b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a4c0: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20  0,.    0, 0, 1, 
a4d0: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30  2, 3, 0, 1, 2, 0
a4e0: 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c  , 0, 2, 2, 4, 5,
a4f0: 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c   5, 0,.    1, 2,
a500: 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   6, 2, 3, 0, 1, 
a510: 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30  0, 2, 0, 2, 0, 0
a520: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
a530: 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c  , 0, 1, 2, 3, 0,
a540: 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20   1, 2, 0, 0, 2, 
a550: 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20  2, 4, 5, 5, 0,. 
a560: 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33     1, 2, 6, 2, 3
a570: 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 1, 0, 2, 0,
a580: 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   2, 0, 0, 0, 0, 
a590: 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74  0,.  };.  assert
a5a0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a  ( argc==1 );.  z
a5b0: 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  In = (u8*)sqlite
a5c0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
a5d0: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e  v[0]);.  if( zIn
a5e0: 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75 38 2a  ==0 ) zIn = (u8*
a5f0: 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  )"";.  for(i=0; 
a600: 7a 49 6e 5b 69 5d 20 26 26 20 21 73 71 6c 69 74  zIn[i] && !sqlit
a610: 65 33 49 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d  e3Isalpha(zIn[i]
a620: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  ); i++){}.  if( 
a630: 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75 38  zIn[i] ){.    u8
a640: 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43 6f 64   prevcode = iCod
a650: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
a660: 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20 3d      zResult[0] =
a670: 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28   sqlite3Toupper(
a680: 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f 72  zIn[i]);.    for
a690: 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49 6e  (j=1; j<4 && zIn
a6a0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
a6b0: 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f 64   int code = iCod
a6c0: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
a6d0: 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 3e 30        if( code>0
a6e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a6f0: 63 6f 64 65 21 3d 70 72 65 76 63 6f 64 65 20 29  code!=prevcode )
a700: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  {.          prev
a710: 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20 20  code = code;.   
a720: 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a         zResult[j
a730: 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30 27  ++] = code + '0'
a740: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a760: 20 70 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a 20   prevcode = 0;. 
a770: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a780: 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a 20   while( j<4 ){. 
a790: 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b       zResult[j++
a7a0: 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a 20  ] = '0';.    }. 
a7b0: 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d 20     zResult[j] = 
a7c0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
a7d0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
a7e0: 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c 20  xt, zResult, 4, 
a7f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
a800: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a810: 2f 2a 20 49 4d 50 3a 20 52 2d 36 34 38 39 34 2d  /* IMP: R-64894-
a820: 35 30 33 32 31 20 54 68 65 20 73 74 72 69 6e 67  50321 The string
a830: 20 22 3f 30 30 30 22 20 69 73 20 72 65 74 75 72   "?000" is retur
a840: 6e 65 64 20 69 66 20 74 68 65 20 61 72 67 75 6d  ned if the argum
a850: 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 4e 55  ent.    ** is NU
a860: 4c 4c 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e  LL or contains n
a870: 6f 20 41 53 43 49 49 20 61 6c 70 68 61 62 65 74  o ASCII alphabet
a880: 69 63 20 63 68 61 72 61 63 74 65 72 73 2e 20 2a  ic characters. *
a890: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  /.    sqlite3_re
a8a0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
a8b0: 74 2c 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51  t, "?000", 4, SQ
a8c0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
a8d0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
a8e0: 4c 49 54 45 5f 53 4f 55 4e 44 45 58 20 2a 2f 0a  LITE_SOUNDEX */.
a8f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a900: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
a910: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63  ION./*.** A func
a920: 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 73 20  tion that loads 
a930: 61 20 73 68 61 72 65 64 2d 6c 69 62 72 61 72 79  a shared-library
a940: 20 65 78 74 65 6e 73 69 6f 6e 20 74 68 65 6e 20   extension then 
a950: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f  returns NULL..*/
a960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61  .static void loa
a970: 64 45 78 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e  dExt(sqlite3_con
a980: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
a990: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
a9a0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
a9b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
a9c0: 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
a9d0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
a9e0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
a9f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
aa00: 50 72 6f 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  Proc;.  sqlite3 
aa10: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
aa20: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
aa30: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72  context);.  char
aa40: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
aa50: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74 68    /* Disallow th
aa60: 65 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e load_extension
aa70: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
aa80: 75 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 49 54  unless the SQLIT
aa90: 45 5f 4c 6f 61 64 45 78 74 46 75 6e 63 0a 20 20  E_LoadExtFunc.  
aaa0: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ** flag is set. 
aab0: 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33   See the sqlite3
aac0: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
aad0: 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20  ension() API..  
aae0: 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  */.  if( (db->fl
aaf0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 6f 61  ags & SQLITE_Loa
ab00: 64 45 78 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a  dExtFunc)==0 ){.
ab10: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
ab20: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
ab30: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
ab40: 64 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  d", -1);.    ret
ab50: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
ab60: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  argc==2 ){.    z
ab70: 50 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68  Proc = (const ch
ab80: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
ab90: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
aba0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
abb0: 50 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Proc = 0;.  }.  
abc0: 69 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c  if( zFile && sql
abd0: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
abe0: 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  ion(db, zFile, z
abf0: 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20  Proc, &zErrMsg) 
ac00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
ac10: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
ac20: 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31  ext, zErrMsg, -1
ac30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ac40: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
ac50: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
ac60: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
ac70: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
ac80: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
ac90: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61  the context of a
aca0: 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67  .** sum() or avg
acb0: 28 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d  () aggregate com
acc0: 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  putation..*/.typ
acd0: 65 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43  edef struct SumC
ace0: 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63  tx SumCtx;.struc
acf0: 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75  t SumCtx {.  dou
ad00: 62 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f  ble rSum;      /
ad10: 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * Floating point
ad20: 20 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53   sum */.  i64 iS
ad30: 75 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  um;         /* I
ad40: 6e 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20  nteger sum */   
ad50: 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20  .  i64 cnt;     
ad60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ad70: 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65  f elements summe
ad80: 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c  d */.  u8 overfl
ad90: 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ow;      /* True
ada0: 20 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72   if integer over
adb0: 66 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75  flow seen */.  u
adc0: 38 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20  8 approx;       
add0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d   /* True if non-
ade0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 61  integer value wa
adf0: 73 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73  s input to the s
ae00: 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  um */.};../*.** 
ae10: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f  Routines used to
ae20: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d   compute the sum
ae30: 2c 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74  , average, and t
ae40: 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  otal..**.** The 
ae50: 53 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  SUM() function f
ae60: 6f 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b  ollows the (brok
ae70: 65 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64  en) SQL standard
ae80: 20 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20   which means.** 
ae90: 74 68 61 74 20 69 74 20 72 65 74 75 72 6e 73 20  that it returns 
aea0: 4e 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20  NULL if it sums 
aeb0: 6f 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20  over no inputs. 
aec0: 20 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a   TOTAL returns.*
aed0: 2a 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61  * 0.0 in that ca
aee0: 73 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  se.  In addition
aef0: 2c 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72  , TOTAL always r
af00: 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77  eturns a float w
af10: 68 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68  here.** SUM migh
af20: 74 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  t return an inte
af30: 67 65 72 20 69 66 20 69 74 20 6e 65 76 65 72 20  ger if it never 
af40: 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f  encounters a flo
af50: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
af60: 61 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76  alue.  TOTAL nev
af70: 65 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55  er fails, but SU
af80: 4d 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20  M might through 
af90: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a  an exception if.
afa0: 2a 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20  ** it overflows 
afb0: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  an integer..*/.s
afc0: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74  tatic void sumSt
afd0: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
afe0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
aff0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
b000: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
b010: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74  SumCtx *p;.  int
b020: 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28   type;.  assert(
b030: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
b040: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
b050: 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  rgc);.  p = sqli
b060: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
b070: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
b080: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79  izeof(*p));.  ty
b090: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
b0a0: 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
b0b0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
b0c0: 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54  p && type!=SQLIT
b0d0: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d  E_NULL ){.    p-
b0e0: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20  >cnt++;.    if( 
b0f0: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  type==SQLITE_INT
b100: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36  EGER ){.      i6
b110: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
b120: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
b130: 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  ]);.      p->rSu
b140: 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66  m += v;.      if
b150: 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e  ( (p->approx|p->
b160: 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20  overflow)==0 && 
b170: 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28  sqlite3AddInt64(
b180: 26 70 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b 0a  &p->iSum, v) ){.
b190: 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72 66          p->overf
b1a0: 6c 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  low = 1;.      }
b1b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b1c0: 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73 71 6c    p->rSum += sql
b1d0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
b1e0: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  e(argv[0]);.    
b1f0: 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20 31 3b    p->approx = 1;
b200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
b210: 74 69 63 20 76 6f 69 64 20 73 75 6d 49 6e 76 65  tic void sumInve
b220: 72 73 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  rse(sqlite3_cont
b230: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
b240: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
b250: 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20  value**argv){.  
b260: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74  SumCtx *p;.  int
b270: 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28   type;.  assert(
b280: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
b290: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
b2a0: 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  rgc);.  p = sqli
b2b0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
b2c0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
b2d0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79  izeof(*p));.  ty
b2e0: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
b2f0: 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
b300: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
b310: 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54  p && type!=SQLIT
b320: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d  E_NULL ){.    p-
b330: 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  >cnt--;.    if( 
b340: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  type==SQLITE_INT
b350: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36  EGER ){.      i6
b360: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
b370: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
b380: 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  ]);.      p->rSu
b390: 6d 20 2d 3d 20 76 3b 0a 20 20 20 20 20 20 69 66  m -= v;.      if
b3a0: 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e  ( (p->approx|p->
b3b0: 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20  overflow)==0 && 
b3c0: 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28  sqlite3AddInt64(
b3d0: 26 70 2d 3e 69 53 75 6d 2c 20 2d 31 2a 76 29 20  &p->iSum, -1*v) 
b3e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 76  ){.        p->ov
b3f0: 65 72 66 6c 6f 77 20 3d 20 31 3b 0a 20 20 20 20  erflow = 1;.    
b400: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
b410: 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20       p->rSum += 
b420: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
b430: 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  uble(argv[0]);. 
b440: 20 20 20 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d       p->approx =
b450: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
b460: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46  static void sumF
b470: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
b480: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
b490: 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a  ){.  SumCtx *p;.
b4a0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
b4b0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
b4c0: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
b4d0: 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30  f( p && p->cnt>0
b4e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   ){.    if( p->o
b4f0: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
b500: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b510: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69  error(context,"i
b520: 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 22  nteger overflow"
b530: 2c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ,-1);.    }else 
b540: 69 66 28 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b  if( p->approx ){
b550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
b560: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
b570: 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a  text, p->rSum);.
b580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b590: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b5a0: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70  int64(context, p
b5b0: 2d 3e 69 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20  ->iSum);.    }. 
b5c0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
b5d0: 20 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c   avgFinalize(sql
b5e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
b5f0: 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78  ntext){.  SumCtx
b600: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
b610: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
b620: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
b630: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
b640: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  cnt>0 ){.    sql
b650: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
b660: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72  le(context, p->r
b670: 53 75 6d 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63  Sum/(double)p->c
b680: 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nt);.  }.}.stati
b690: 63 20 76 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61  c void totalFina
b6a0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
b6b0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
b6c0: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
b6d0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
b6e0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
b6f0: 74 65 78 74 2c 20 30 29 3b 0a 20 20 2f 2a 20 28  text, 0);.  /* (
b700: 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65  double)0 In case
b710: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
b720: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
b730: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  . */.  sqlite3_r
b740: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
b750: 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75  text, p ? p->rSu
b760: 6d 20 3a 20 28 64 6f 75 62 6c 65 29 30 29 3b 0a  m : (double)0);.
b770: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
b780: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
b790: 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20   keeps track of 
b7a0: 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  state informatio
b7b0: 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75  n for the.** cou
b7c0: 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66  nt() aggregate f
b7d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  unction..*/.type
b7e0: 64 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74  def struct Count
b7f0: 43 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74  Ctx CountCtx;.st
b800: 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a  ruct CountCtx {.
b810: 20 20 69 36 34 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a    i64 n;.};../*.
b820: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69  ** Routines to i
b830: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  mplement the cou
b840: 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66  nt() aggregate f
b850: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
b860: 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74 65  ic void countSte
b870: 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  p(sqlite3_contex
b880: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
b890: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
b8a0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43  lue **argv){.  C
b8b0: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
b8c0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
b8d0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
b8e0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
b8f0: 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30  ;.  if( (argc==0
b900: 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21   || SQLITE_NULL!
b910: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
b920: 79 70 65 28 61 72 67 76 5b 30 5d 29 29 20 26 26  ype(argv[0])) &&
b930: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b   p ){.    p->n++
b940: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
b950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
b960: 43 41 54 45 44 0a 20 20 2f 2a 20 54 68 65 20 73  CATED.  /* The s
b970: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
b980: 5f 63 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f  _count() functio
b990: 6e 20 69 73 20 64 65 70 72 65 63 61 74 65 64 2e  n is deprecated.
b9a0: 20 20 42 75 74 20 6a 75 73 74 20 74 6f 20 6d 61    But just to ma
b9b0: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 69 74 20  ke.  ** sure it 
b9c0: 73 74 69 6c 6c 20 6f 70 65 72 61 74 65 73 20 63  still operates c
b9d0: 6f 72 72 65 63 74 6c 79 2c 20 76 65 72 69 66 79  orrectly, verify
b9e0: 20 74 68 61 74 20 69 74 73 20 63 6f 75 6e 74 20   that its count 
b9f0: 61 67 72 65 65 73 20 77 69 74 68 20 6f 75 72 20  agrees with our 
ba00: 0a 20 20 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 63  .  ** internal c
ba10: 6f 75 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20  ount when using 
ba20: 63 6f 75 6e 74 28 2a 29 20 61 6e 64 20 77 68 65  count(*) and whe
ba30: 6e 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e  n the total coun
ba40: 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 65 78  t can be.  ** ex
ba50: 70 72 65 73 73 65 64 20 61 73 20 61 20 33 32 2d  pressed as a 32-
ba60: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  bit integer. */.
ba70: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
ba80: 31 20 7c 7c 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  1 || p==0 || p->
ba90: 6e 3e 30 78 37 66 66 66 66 66 66 66 0a 20 20 20  n>0x7fffffff.   
baa0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6e 3d 3d         || p->n==
bab0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
bac0: 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29  e_count(context)
bad0: 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 20 20 20 0a   );.#endif.}   .
bae0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e  static void coun
baf0: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
bb00: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
bb10: 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  xt){.  CountCtx 
bb20: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
bb30: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
bb40: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
bb50: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
bb60: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
bb70: 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a   p ? p->n : 0);.
bb80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
bb90: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d  s to implement m
bba0: 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61  in() and max() a
bbb0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
bbc0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
bbd0: 69 64 20 6d 69 6e 6d 61 78 53 74 65 70 28 0a 20  id minmaxStep(. 
bbe0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
bbf0: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
bc00: 74 20 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71  t NotUsed, .  sq
bc10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
bc20: 67 76 0a 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72  gv.){.  Mem *pAr
bc30: 67 20 20 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76  g  = (Mem *)argv
bc40: 5b 30 5d 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73  [0];.  Mem *pBes
bc50: 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  t;.  UNUSED_PARA
bc60: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
bc70: 0a 20 20 70 42 65 73 74 20 3d 20 28 4d 65 6d 20  .  pBest = (Mem 
bc80: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
bc90: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
bca0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65  ext, sizeof(*pBe
bcb0: 73 74 29 29 3b 0a 20 20 69 66 28 20 21 70 42 65  st));.  if( !pBe
bcc0: 73 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  st ) return;..  
bcd0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
bce0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
bcf0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
bd00: 20 20 20 20 69 66 28 20 70 42 65 73 74 2d 3e 66      if( pBest->f
bd10: 6c 61 67 73 20 29 20 73 71 6c 69 74 65 33 53 6b  lags ) sqlite3Sk
bd20: 69 70 41 63 63 75 6d 75 6c 61 74 6f 72 4c 6f 61  ipAccumulatorLoa
bd30: 64 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  d(context);.  }e
bd40: 6c 73 65 20 69 66 28 20 70 42 65 73 74 2d 3e 66  lse if( pBest->f
bd50: 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  lags ){.    int 
bd60: 6d 61 78 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70  max;.    int cmp
bd70: 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
bd80: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
bd90: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e  tFuncCollSeq(con
bda0: 74 65 78 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68  text);.    /* Th
bdb0: 69 73 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  is step function
bdc0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 62 6f 74   is used for bot
bdd0: 68 20 74 68 65 20 6d 69 6e 28 29 20 61 6e 64 20  h the min() and 
bde0: 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65 73  max() aggregates
bdf0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c  ,.    ** the onl
be00: 79 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  y difference bet
be10: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 65 69  ween the two bei
be20: 6e 67 20 74 68 61 74 20 74 68 65 20 73 65 6e 73  ng that the sens
be30: 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  e of the.    ** 
be40: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 69 6e  comparison is in
be50: 76 65 72 74 65 64 2e 20 46 6f 72 20 74 68 65 20  verted. For the 
be60: 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65 2c  max() aggregate,
be70: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69   the.    ** sqli
be80: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 29 20  te3_user_data() 
be90: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
bea0: 20 28 76 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72   (void *)-1. For
beb0: 20 6d 69 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a   min() it.    **
bec0: 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20 2a   returns (void *
bed0: 29 64 62 2c 20 77 68 65 72 65 20 64 62 20 69 73  )db, where db is
bee0: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 64 61   the sqlite3* da
bef0: 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a  tabase pointer..
bf00: 20 20 20 20 2a 2a 20 54 68 65 72 65 66 6f 72 65      ** Therefore
bf10: 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d   the next statem
bf20: 65 6e 74 20 73 65 74 73 20 76 61 72 69 61 62 6c  ent sets variabl
bf30: 65 20 27 6d 61 78 27 20 74 6f 20 31 20 66 6f 72  e 'max' to 1 for
bf40: 20 74 68 65 20 6d 61 78 28 29 0a 20 20 20 20 2a   the max().    *
bf50: 2a 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72 20  * aggregate, or 
bf60: 30 20 66 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20  0 for min()..   
bf70: 20 2a 2f 0a 20 20 20 20 6d 61 78 20 3d 20 73 71   */.    max = sq
bf80: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
bf90: 63 6f 6e 74 65 78 74 29 21 3d 30 3b 0a 20 20 20  context)!=0;.   
bfa0: 20 63 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 65   cmp = sqlite3Me
bfb0: 6d 43 6f 6d 70 61 72 65 28 70 42 65 73 74 2c 20  mCompare(pBest, 
bfc0: 70 41 72 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pArg, pColl);.  
bfd0: 20 20 69 66 28 20 28 6d 61 78 20 26 26 20 63 6d    if( (max && cm
bfe0: 70 3c 30 29 20 7c 7c 20 28 21 6d 61 78 20 26 26  p<0) || (!max &&
bff0: 20 63 6d 70 3e 30 29 20 29 7b 0a 20 20 20 20 20   cmp>0) ){.     
c000: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
c010: 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72 67 29  opy(pBest, pArg)
c020: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c030: 20 20 20 73 71 6c 69 74 65 33 53 6b 69 70 41 63     sqlite3SkipAc
c040: 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f  cumulatorLoad(co
c050: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ntext);.    }.  
c060: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 65 73 74  }else{.    pBest
c070: 2d 3e 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->db = sqlite3_c
c080: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
c090: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73  (context);.    s
c0a0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
c0b0: 79 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a  y(pBest, pArg);.
c0c0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
c0d0: 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65  d minMaxFinalize
c0e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c0f0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71   *context){.  sq
c100: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
c110: 73 3b 0a 20 20 70 52 65 73 20 3d 20 28 73 71 6c  s;.  pRes = (sql
c120: 69 74 65 33 5f 76 61 6c 75 65 20 2a 29 73 71 6c  ite3_value *)sql
c130: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
c140: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
c150: 30 29 3b 0a 20 20 69 66 28 20 70 52 65 73 20 29  0);.  if( pRes )
c160: 7b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e  {.    if( pRes->
c170: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 73  flags ){.      s
c180: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
c190: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 70 52 65  lue(context, pRe
c1a0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  s);.    }.    sq
c1b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
c1c0: 61 73 65 28 70 52 65 73 29 3b 0a 20 20 7d 0a 7d  ase(pRes);.  }.}
c1d0: 0a 0a 2f 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63 6f  ../*.** group_co
c1e0: 6e 63 61 74 28 45 58 50 52 2c 20 3f 53 45 50 41  ncat(EXPR, ?SEPA
c1f0: 52 41 54 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74 69  RATOR?).*/.stati
c200: 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63  c void groupConc
c210: 61 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  atStep(.  sqlite
c220: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
c230: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
c240: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
c250: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
c260: 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20  t char *zVal;.  
c270: 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d  StrAccum *pAccum
c280: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
c290: 7a 53 65 70 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  zSep;.  int nVal
c2a0: 2c 20 6e 53 65 70 3b 0a 20 20 61 73 73 65 72 74  , nSep;.  assert
c2b0: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67  ( argc==1 || arg
c2c0: 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 73 71  c==2 );.  if( sq
c2d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c2e0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
c2f0: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
c300: 0a 20 20 70 41 63 63 75 6d 20 3d 20 28 53 74 72  .  pAccum = (Str
c310: 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61  Accum*)sqlite3_a
c320: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
c330: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
c340: 28 2a 70 41 63 63 75 6d 29 29 3b 0a 0a 20 20 69  (*pAccum));..  i
c350: 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20  f( pAccum ){.   
c360: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
c370: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
c380: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
c390: 29 3b 0a 20 20 20 20 69 6e 74 20 66 69 72 73 74  );.    int first
c3a0: 54 65 72 6d 20 3d 20 70 41 63 63 75 6d 2d 3e 6e  Term = pAccum->n
c3b0: 43 68 61 72 3d 3d 30 3b 0a 20 20 20 20 70 41 63  Char==0;.    pAc
c3c0: 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20 64  cum->mxAlloc = d
c3d0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
c3e0: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a  _LIMIT_LENGTH];.
c3f0: 20 20 20 20 69 66 28 20 21 66 69 72 73 74 54 65      if( !firstTe
c400: 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rm ){.      if( 
c410: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  argc==2 ){.     
c420: 20 20 20 7a 53 65 70 20 3d 20 28 63 68 61 72 2a     zSep = (char*
c430: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
c440: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
c450: 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 71 6c        nSep = sql
c460: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
c470: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20  (argv[1]);.     
c480: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c490: 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20  zSep = ",";.    
c4a0: 20 20 20 20 6e 53 65 70 20 3d 20 31 3b 0a 20 20      nSep = 1;.  
c4b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c4c0: 7a 53 65 70 20 29 20 73 71 6c 69 74 65 33 5f 73  zSep ) sqlite3_s
c4d0: 74 72 5f 61 70 70 65 6e 64 28 70 41 63 63 75 6d  tr_append(pAccum
c4e0: 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20  , zSep, nSep);. 
c4f0: 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20 3d 20     }.    zVal = 
c500: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
c510: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
c520: 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20 73  ]);.    nVal = s
c530: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
c540: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
c550: 20 69 66 28 20 7a 56 61 6c 20 29 20 73 71 6c 69   if( zVal ) sqli
c560: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70  te3_str_append(p
c570: 41 63 63 75 6d 2c 20 7a 56 61 6c 2c 20 6e 56 61  Accum, zVal, nVa
c580: 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  l);.  }.}.static
c590: 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61   void groupConca
c5a0: 74 49 6e 76 65 72 73 65 28 0a 20 20 73 71 6c 69  tInverse(.  sqli
c5b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
c5c0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
c5d0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
c5e0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
c5f0: 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t n;.  assert( a
c600: 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d  rgc==1 || argc==
c610: 32 20 29 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  2 );.  StrAccum 
c620: 2a 70 41 63 63 75 6d 3b 0a 20 20 69 66 28 20 73  *pAccum;.  if( s
c630: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
c640: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
c650: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
c660: 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20 28 53 74  ;.  pAccum = (St
c670: 72 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f  rAccum*)sqlite3_
c680: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
c690: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
c6a0: 66 28 2a 70 41 63 63 75 6d 29 29 3b 0a 20 20 69  f(*pAccum));.  i
c6b0: 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20  f( pAccum ){.   
c6c0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
c6d0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
c6e0: 29 3b 0a 20 20 20 20 69 66 28 20 61 72 67 63 3d  );.    if( argc=
c6f0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d  =2 ){.      n +=
c700: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
c710: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ytes(argv[1]);. 
c720: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 3d     }.    if( n>=
c730: 70 41 63 63 75 6d 2d 3e 6e 43 68 61 72 20 29 7b  pAccum->nChar ){
c740: 0a 20 20 20 20 20 20 70 41 63 63 75 6d 2d 3e 6e  .      pAccum->n
c750: 43 68 61 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Char = 0;.    }e
c760: 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 63 63 75  lse{.      pAccu
c770: 6d 2d 3e 6e 43 68 61 72 20 2d 3d 20 6e 3b 0a 20  m->nChar -= n;. 
c780: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 41 63       memmove(pAc
c790: 63 75 6d 2d 3e 7a 54 65 78 74 2c 20 26 70 41 63  cum->zText, &pAc
c7a0: 63 75 6d 2d 3e 7a 54 65 78 74 5b 6e 5d 2c 20 70  cum->zText[n], p
c7b0: 41 63 63 75 6d 2d 3e 6e 43 68 61 72 29 3b 0a 20  Accum->nChar);. 
c7c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
c7d0: 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63  c void groupConc
c7e0: 61 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  atFinalize(sqlit
c7f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
c800: 65 78 74 29 7b 0a 20 20 53 74 72 41 63 63 75 6d  ext){.  StrAccum
c810: 20 2a 70 41 63 63 75 6d 3b 0a 20 20 70 41 63 63   *pAccum;.  pAcc
c820: 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67  um = sqlite3_agg
c830: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
c840: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66  ontext, 0);.  if
c850: 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20  ( pAccum ){.    
c860: 69 66 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45  if( pAccum->accE
c870: 72 72 6f 72 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f  rror==SQLITE_TOO
c880: 42 49 47 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  BIG ){.      sql
c890: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
c8a0: 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74  r_toobig(context
c8b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
c8c0: 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72 72 6f   pAccum->accErro
c8d0: 72 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  r==SQLITE_NOMEM 
c8e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c8f0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
c900: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
c910: 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20 20 20    }else{    .   
c920: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
c930: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
c940: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
c950: 69 6e 69 73 68 28 70 41 63 63 75 6d 29 2c 20 2d  inish(pAccum), -
c960: 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c980: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
c990: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
c9a0: 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61 74  void groupConcat
c9b0: 56 61 6c 75 65 28 73 71 6c 69 74 65 33 5f 63 6f  Value(sqlite3_co
c9c0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
c9d0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 20 2a  .  sqlite3_str *
c9e0: 70 41 63 63 75 6d 3b 0a 20 20 70 41 63 63 75 6d  pAccum;.  pAccum
c9f0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 72 2a   = (sqlite3_str*
ca00: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
ca10: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
ca20: 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 41  xt, 0);.  if( pA
ca30: 63 63 75 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  ccum ){.    if( 
ca40: 70 41 63 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72  pAccum->accError
ca50: 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  ==SQLITE_TOOBIG 
ca60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ca70: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f  _result_error_to
ca80: 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20  obig(context);. 
ca90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 63     }else if( pAc
caa0: 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53  cum->accError==S
cab0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
cac0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
cad0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
cae0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65  context);.    }e
caf0: 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20 20 63  lse{    .      c
cb00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
cb10: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 76   = sqlite3_str_v
cb20: 61 6c 75 65 28 70 41 63 63 75 6d 29 3b 0a 20 20  alue(pAccum);.  
cb30: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
cb40: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
cb50: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51 4c 49   zText, -1, SQLI
cb60: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
cb70: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
cb80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
cb90: 6f 65 73 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69  oes per-connecti
cba0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69  on function regi
cbb0: 73 74 72 61 74 69 6f 6e 2e 20 20 4d 6f 73 74 0a  stration.  Most.
cbc0: 2a 2a 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  ** of the built-
cbd0: 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 61 62 6f  in functions abo
cbe0: 76 65 20 61 72 65 20 70 61 72 74 20 6f 66 20 74  ve are part of t
cbf0: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
cc00: 6f 6e 20 73 65 74 2e 0a 2a 2a 20 54 68 69 73 20  on set..** This 
cc10: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 64 65 61  routine only dea
cc20: 6c 73 20 77 69 74 68 20 74 68 6f 73 65 20 74 68  ls with those th
cc30: 61 74 20 61 72 65 20 6e 6f 74 20 67 6c 6f 62 61  at are not globa
cc40: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
cc50: 65 33 52 65 67 69 73 74 65 72 50 65 72 43 6f 6e  e3RegisterPerCon
cc60: 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69 6e 46 75  nectionBuiltinFu
cc70: 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20  nctions(sqlite3 
cc80: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *db){.  int rc =
cc90: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
cca0: 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  d_function(db, "
ccb0: 4d 41 54 43 48 22 2c 20 32 29 3b 0a 20 20 61 73  MATCH", 2);.  as
ccc0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
ccd0: 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51  _NOMEM || rc==SQ
cce0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
ccf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
cd00: 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
cd10: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
cd20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
cd30: 68 65 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67 20  he LIKEOPT flag 
cd40: 6f 6e 20 74 68 65 20 32 2d 61 72 67 75 6d 65 6e  on the 2-argumen
cd50: 74 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  t function with 
cd60: 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a  the given name..
cd70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
cd80: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73 71  etLikeOptFlag(sq
cd90: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
cda0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 75 38   char *zName, u8
cdb0: 20 66 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75 6e   flagVal){.  Fun
cdc0: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 70 44  cDef *pDef;.  pD
cdd0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
cde0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
cdf0: 6d 65 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  me, 2, SQLITE_UT
ce00: 46 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c  F8, 0);.  if( AL
ce10: 57 41 59 53 28 70 44 65 66 29 20 29 7b 0a 20 20  WAYS(pDef) ){.  
ce20: 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67    pDef->funcFlag
ce30: 73 20 7c 3d 20 66 6c 61 67 56 61 6c 3b 0a 20 20  s |= flagVal;.  
ce40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  }.}../*.** Regis
ce50: 74 65 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  ter the built-in
ce60: 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66   LIKE and GLOB f
ce70: 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 63  unctions.  The c
ce80: 61 73 65 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20  aseSensitive.** 
ce90: 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
cea0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
ceb0: 6e 6f 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  not the LIKE ope
cec0: 72 61 74 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a  rator is case.**
ced0: 20 73 65 6e 73 69 74 69 76 65 2e 20 20 47 4c 4f   sensitive.  GLO
cee0: 42 20 69 73 20 61 6c 77 61 79 73 20 63 61 73 65  B is always case
cef0: 20 73 65 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76   sensitive..*/.v
cf00: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73  oid sqlite3Regis
cf10: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
cf20: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
cf30: 74 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 29  t caseSensitive)
cf40: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61  {.  struct compa
cf50: 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  reInfo *pInfo;. 
cf60: 20 69 66 28 20 63 61 73 65 53 65 6e 73 69 74 69   if( caseSensiti
cf70: 76 65 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20  ve ){.    pInfo 
cf80: 3d 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72  = (struct compar
cf90: 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f  eInfo*)&likeInfo
cfa0: 41 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Alt;.  }else{.  
cfb0: 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63    pInfo = (struc
cfc0: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26  t compareInfo*)&
cfd0: 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20  likeInfoNorm;.  
cfe0: 7d 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74  }.  sqlite3Creat
cff0: 65 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22  eFunc(db, "like"
d000: 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
d010: 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e  , pInfo, likeFun
d020: 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  c, 0, 0, 0);.  s
d030: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
d040: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 33 2c 20  (db, "like", 3, 
d050: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e  SQLITE_UTF8, pIn
d060: 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c  fo, likeFunc, 0,
d070: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
d080: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
d090: 22 67 6c 6f 62 22 2c 20 32 2c 20 53 51 4c 49 54  "glob", 2, SQLIT
d0a0: 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28  E_UTF8, .      (
d0b0: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
d0c0: 66 6f 2a 29 26 67 6c 6f 62 49 6e 66 6f 2c 20 6c  fo*)&globInfo, l
d0d0: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30  ikeFunc, 0, 0, 0
d0e0: 29 3b 0a 20 20 73 65 74 4c 69 6b 65 4f 70 74 46  );.  setLikeOptF
d0f0: 6c 61 67 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20  lag(db, "glob", 
d100: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
d110: 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   | SQLITE_FUNC_C
d120: 41 53 45 29 3b 0a 20 20 73 65 74 4c 69 6b 65 4f  ASE);.  setLikeO
d130: 70 74 46 6c 61 67 28 64 62 2c 20 22 6c 69 6b 65  ptFlag(db, "like
d140: 22 2c 20 0a 20 20 20 20 20 20 63 61 73 65 53 65  ", .      caseSe
d150: 6e 73 69 74 69 76 65 20 3f 20 28 53 51 4c 49 54  nsitive ? (SQLIT
d160: 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51  E_FUNC_LIKE | SQ
d170: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 20  LITE_FUNC_CASE) 
d180: 3a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  : SQLITE_FUNC_LI
d190: 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  KE);.}../*.** pE
d1a0: 78 70 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  xpr points to an
d1b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63   expression whic
d1c0: 68 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 66  h implements a f
d1d0: 75 6e 63 74 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20  unction.  If.** 
d1e0: 69 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  it is appropriat
d1f0: 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 4c  e to apply the L
d200: 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
d210: 20 74 6f 20 74 68 61 74 20 66 75 6e 63 74 69 6f   to that functio
d220: 6e 0a 2a 2a 20 74 68 65 6e 20 73 65 74 20 61 57  n.** then set aW
d230: 63 5b 30 5d 20 74 68 72 6f 75 67 68 20 61 57 63  c[0] through aWc
d240: 5b 32 5d 20 74 6f 20 74 68 65 20 77 69 6c 64 63  [2] to the wildc
d250: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 61  ard characters a
d260: 6e 64 20 74 68 65 0a 2a 2a 20 65 73 63 61 70 65  nd the.** escape
d270: 20 63 68 61 72 61 63 74 65 72 20 61 6e 64 20 74   character and t
d280: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
d290: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
d2a0: 6e 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 4c  n is not a .** L
d2b0: 49 4b 45 2d 73 74 79 6c 65 20 66 75 6e 63 74 69  IKE-style functi
d2c0: 6f 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 20 46  on then return F
d2d0: 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ALSE..**.** The 
d2e0: 65 78 70 72 65 73 73 69 6f 6e 20 22 61 20 4c 49  expression "a LI
d2f0: 4b 45 20 62 20 45 53 43 41 50 45 20 63 22 20 69  KE b ESCAPE c" i
d300: 73 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65  s only considere
d310: 64 20 61 20 76 61 6c 69 64 20 4c 49 4b 45 0a 2a  d a valid LIKE.*
d320: 2a 20 6f 70 65 72 61 74 6f 72 20 69 66 20 63 20  * operator if c 
d330: 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  is a string lite
d340: 72 61 6c 20 74 68 61 74 20 69 73 20 65 78 61 63  ral that is exac
d350: 74 6c 79 20 6f 6e 65 20 62 79 74 65 20 69 6e 20  tly one byte in 
d360: 6c 65 6e 67 74 68 2e 0a 2a 2a 20 54 68 61 74 20  length..** That 
d370: 6f 6e 65 20 62 79 74 65 20 69 73 20 73 74 6f 72  one byte is stor
d380: 65 64 20 69 6e 20 61 57 63 5b 33 5d 2e 20 20 61  ed in aWc[3].  a
d390: 57 63 5b 33 5d 20 69 73 20 73 65 74 20 74 6f 20  Wc[3] is set to 
d3a0: 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 69 73  zero if there is
d3b0: 0a 2a 2a 20 6e 6f 20 45 53 43 41 50 45 20 63 6c  .** no ESCAPE cl
d3c0: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 49 73  ause..**.** *pIs
d3d0: 4e 6f 63 61 73 65 20 69 73 20 73 65 74 20 74 6f  Nocase is set to
d3e0: 20 74 72 75 65 20 69 66 20 75 70 70 65 72 63 61   true if upperca
d3f0: 73 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65  se and lowercase
d400: 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20   are equivalent 
d410: 66 6f 72 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74  for.** the funct
d420: 69 6f 6e 20 28 64 65 66 61 75 6c 74 20 66 6f 72  ion (default for
d430: 20 4c 49 4b 45 29 2e 20 20 49 66 20 74 68 65 20   LIKE).  If the 
d440: 66 75 6e 63 74 69 6f 6e 20 6d 61 6b 65 73 20 74  function makes t
d450: 68 65 20 64 69 73 74 69 6e 63 74 69 6f 6e 0a 2a  he distinction.*
d460: 2a 20 62 65 74 77 65 65 6e 20 75 70 70 65 72 63  * between upperc
d470: 61 73 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73  ase and lowercas
d480: 65 20 28 61 73 20 64 6f 65 73 20 47 4c 4f 42 29  e (as does GLOB)
d490: 20 74 68 65 6e 20 2a 70 49 73 4e 6f 63 61 73 65   then *pIsNocase
d4a0: 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 66 61   is set to.** fa
d4b0: 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lse..*/.int sqli
d4c0: 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f  te3IsLikeFunctio
d4d0: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  n(sqlite3 *db, E
d4e0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
d4f0: 2a 70 49 73 4e 6f 63 61 73 65 2c 20 63 68 61 72  *pIsNocase, char
d500: 20 2a 61 57 63 29 7b 0a 20 20 46 75 6e 63 44 65   *aWc){.  FuncDe
d510: 66 20 2a 70 44 65 66 3b 0a 20 20 69 6e 74 20 6e  f *pDef;.  int n
d520: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
d530: 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49  r->op!=TK_FUNCTI
d540: 4f 4e 20 7c 7c 20 21 70 45 78 70 72 2d 3e 78 2e  ON || !pExpr->x.
d550: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74  pList ){.    ret
d560: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
d570: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
d580: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
d590: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
d5a0: 6e 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78  nExpr = pExpr->x
d5b0: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
d5c0: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
d5d0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
d5e0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
d5f0: 20 6e 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55   nExpr, SQLITE_U
d600: 54 46 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 4e  TF8, 0);.  if( N
d610: 45 56 45 52 28 70 44 65 66 3d 3d 30 29 20 7c 7c  EVER(pDef==0) ||
d620: 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
d630: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
d640: 4c 49 4b 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LIKE)==0 ){.    
d650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d660: 69 66 28 20 6e 45 78 70 72 3c 33 20 29 7b 0a 20  if( nExpr<3 ){. 
d670: 20 20 20 61 57 63 5b 33 5d 20 3d 20 30 3b 0a 20     aWc[3] = 0;. 
d680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
d690: 20 2a 70 45 73 63 61 70 65 20 3d 20 70 45 78 70   *pEscape = pExp
d6a0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 32 5d  r->x.pList->a[2]
d6b0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 68 61 72  .pExpr;.    char
d6c0: 20 2a 7a 45 73 63 61 70 65 3b 0a 20 20 20 20 69   *zEscape;.    i
d6d0: 66 28 20 70 45 73 63 61 70 65 2d 3e 6f 70 21 3d  f( pEscape->op!=
d6e0: 54 4b 5f 53 54 52 49 4e 47 20 29 20 72 65 74 75  TK_STRING ) retu
d6f0: 72 6e 20 30 3b 0a 20 20 20 20 7a 45 73 63 61 70  rn 0;.    zEscap
d700: 65 20 3d 20 70 45 73 63 61 70 65 2d 3e 75 2e 7a  e = pEscape->u.z
d710: 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 7a  Token;.    if( z
d720: 45 73 63 61 70 65 5b 30 5d 3d 3d 30 20 7c 7c 20  Escape[0]==0 || 
d730: 7a 45 73 63 61 70 65 5b 31 5d 21 3d 30 20 29 20  zEscape[1]!=0 ) 
d740: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 57  return 0;.    aW
d750: 63 5b 33 5d 20 3d 20 7a 45 73 63 61 70 65 5b 30  c[3] = zEscape[0
d760: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  ];.  }..  /* The
d770: 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65 6d   memcpy() statem
d780: 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61 74  ent assumes that
d790: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
d7a0: 61 72 61 63 74 65 72 73 20 61 72 65 0a 20 20 2a  aracters are.  *
d7b0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  * the first thre
d7c0: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  e statements in 
d7d0: 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  the compareInfo 
d7e0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 0a  structure.  The.
d7f0: 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20 74    ** asserts() t
d800: 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66  hat follow verif
d810: 79 20 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f  y that assumptio
d820: 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  n.  */.  memcpy(
d830: 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65 72  aWc, pDef->pUser
d840: 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73 65  Data, 3);.  asse
d850: 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b 65  rt( (char*)&like
d860: 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72  InfoAlt == (char
d870: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d  *)&likeInfoAlt.m
d880: 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73  atchAll );.  ass
d890: 65 72 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c  ert( &((char*)&l
d8a0: 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d  ikeInfoAlt)[1] =
d8b0: 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  = (char*)&likeIn
d8c0: 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29  foAlt.matchOne )
d8d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63  ;.  assert( &((c
d8e0: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
d8f0: 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29  t)[2] == (char*)
d900: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74  &likeInfoAlt.mat
d910: 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49 73 4e  chSet );.  *pIsN
d920: 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d 3e 66  ocase = (pDef->f
d930: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
d940: 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30 3b  E_FUNC_CASE)==0;
d950: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
d960: 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  /*.** All of the
d970: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
d980: 72 65 73 20 69 6e 20 74 68 65 20 61 42 75 69 6c  res in the aBuil
d990: 74 69 6e 46 75 6e 63 5b 5d 20 61 72 72 61 79 20  tinFunc[] array 
d9a0: 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 74 68 65 20  above.** to the 
d9b0: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
d9c0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 54 68 69  hash table.  Thi
d9d0: 73 20 6f 63 63 75 72 73 20 61 74 20 73 74 61 72  s occurs at star
d9e0: 74 2d 74 69 6d 65 20 28 61 73 0a 2a 2a 20 61 20  t-time (as.** a 
d9f0: 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 63  consequence of c
da00: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 69  alling sqlite3_i
da10: 6e 69 74 69 61 6c 69 7a 65 28 29 29 2e 0a 2a 2a  nitialize())..**
da20: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
da30: 6f 75 74 69 6e 65 20 72 75 6e 73 0a 2a 2f 0a 76  outine runs.*/.v
da40: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73  oid sqlite3Regis
da50: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
da60: 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 0a  ons(void){.  /*.
da70: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
da80: 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 46  ng array holds F
da90: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
daa0: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
dab0: 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20   functions.  ** 
dac0: 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
dad0: 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  file..  **.  ** 
dae0: 54 68 65 20 61 72 72 61 79 20 63 61 6e 6e 6f 74  The array cannot
daf0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 73 69 6e   be constant sin
db00: 63 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ce changes are m
db10: 61 64 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ade to the.  ** 
db20: 46 75 6e 63 44 65 66 2e 70 48 61 73 68 20 65 6c  FuncDef.pHash el
db30: 65 6d 65 6e 74 73 20 61 74 20 73 74 61 72 74 2d  ements at start-
db40: 74 69 6d 65 2e 20 20 54 68 65 20 65 6c 65 6d 65  time.  The eleme
db50: 6e 74 73 20 6f 66 20 74 68 69 73 20 61 72 72 61  nts of this arra
db60: 79 0a 20 20 2a 2a 20 61 72 65 20 72 65 61 64 2d  y.  ** are read-
db70: 6f 6e 6c 79 20 61 66 74 65 72 20 69 6e 69 74 69  only after initi
db80: 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d  alization is com
db90: 70 6c 65 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  plete..  **.  **
dba0: 20 46 6f 72 20 70 65 61 6b 20 65 66 66 69 63 69   For peak effici
dbb0: 65 6e 63 79 2c 20 70 75 74 20 74 68 65 20 6d 6f  ency, put the mo
dbc0: 73 74 20 66 72 65 71 75 65 6e 74 6c 79 20 75 73  st frequently us
dbd0: 65 64 20 66 75 6e 63 74 69 6f 6e 20 6c 61 73 74  ed function last
dbe0: 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
dbf0: 46 75 6e 63 44 65 66 20 61 42 75 69 6c 74 69 6e  FuncDef aBuiltin
dc00: 46 75 6e 63 5b 5d 20 3d 20 7b 0a 23 69 66 64 65  Func[] = {.#ifde
dc10: 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58  f SQLITE_SOUNDEX
dc20: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 6f  .    FUNCTION(so
dc30: 75 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  undex,          
dc40: 20 20 31 2c 20 30 2c 20 30 2c 20 73 6f 75 6e 64    1, 0, 0, sound
dc50: 65 78 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 23  exFunc      ),.#
dc60: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
dc70: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
dc80: 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 56 46 55  XTENSION.    VFU
dc90: 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65  NCTION(load_exte
dca0: 6e 73 69 6f 6e 2c 20 20 20 20 31 2c 20 30 2c 20  nsion,    1, 0, 
dcb0: 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20  0, loadExt      
dcc0: 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43      ),.    VFUNC
dcd0: 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73  TION(load_extens
dce0: 69 6f 6e 2c 20 20 20 20 32 2c 20 30 2c 20 30 2c  ion,    2, 0, 0,
dcf0: 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20 20 20   loadExt        
dd00: 20 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20    ),.#endif.#if 
dd10: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
dd20: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 46  ENTICATION.    F
dd30: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63  UNCTION(sqlite_c
dd40: 72 79 70 74 2c 20 20 20 20 20 20 20 32 2c 20 30  rypt,       2, 0
dd50: 2c 20 30 2c 20 73 71 6c 69 74 65 33 43 72 79 70  , 0, sqlite3Cryp
dd60: 74 46 75 6e 63 20 29 2c 0a 23 65 6e 64 69 66 0a  tFunc ),.#endif.
dd70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dd80: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
dd90: 4e 5f 44 49 41 47 53 0a 20 20 20 20 44 46 55 4e  N_DIAGS.    DFUN
dda0: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d  CTION(sqlite_com
ddb0: 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 2c  pileoption_used,
ddc0: 31 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65  1, 0, 0, compile
ddd0: 6f 70 74 69 6f 6e 75 73 65 64 46 75 6e 63 20 20  optionusedFunc  
dde0: 29 2c 0a 20 20 20 20 44 46 55 4e 43 54 49 4f 4e  ),.    DFUNCTION
ddf0: 28 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f  (sqlite_compileo
de00: 70 74 69 6f 6e 5f 67 65 74 2c 20 31 2c 20 30 2c  ption_get, 1, 0,
de10: 20 30 2c 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f   0, compileoptio
de20: 6e 67 65 74 46 75 6e 63 20 20 29 2c 0a 23 65 6e  ngetFunc  ),.#en
de30: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
de40: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
de50: 5f 44 49 41 47 53 20 2a 2f 0a 20 20 20 20 46 55  _DIAGS */.    FU
de60: 4e 43 54 49 4f 4e 32 28 75 6e 6c 69 6b 65 6c 79  NCTION2(unlikely
de70: 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c  ,          1, 0,
de80: 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53   0, noopFunc,  S
de90: 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
dea0: 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  ELY),.    FUNCTI
deb0: 4f 4e 32 28 6c 69 6b 65 6c 69 68 6f 6f 64 2c 20  ON2(likelihood, 
dec0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
ded0: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
dee0: 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29  E_FUNC_UNLIKELY)
def0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  ,.    FUNCTION2(
df00: 6c 69 6b 65 6c 79 2c 20 20 20 20 20 20 20 20 20  likely,         
df10: 20 20 20 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70     1, 0, 0, noop
df20: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
df30: 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a 23 69  NC_UNLIKELY),.#i
df40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
df50: 47 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  G.    FUNCTION2(
df60: 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 20  affinity,       
df70: 20 20 20 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70     1, 0, 0, noop
df80: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
df90: 4e 43 5f 41 46 46 49 4e 49 54 59 29 2c 0a 23 65  NC_AFFINITY),.#e
dfa0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
dfb0: 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
dfc0: 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 46 55  _SQL_FUNC.    FU
dfd0: 4e 43 54 49 4f 4e 32 28 73 71 6c 69 74 65 5f 6f  NCTION2(sqlite_o
dfe0: 66 66 73 65 74 2c 20 20 20 20 20 31 2c 20 30 2c  ffset,     1, 0,
dff0: 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53   0, noopFunc,  S
e000: 51 4c 49 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45  QLITE_FUNC_OFFSE
e010: 54 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T|.             
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46          SQLITE_F
e050: 55 4e 43 5f 54 59 50 45 4f 46 29 2c 0a 23 65 6e  UNC_TYPEOF),.#en
e060: 64 69 66 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  dif.    FUNCTION
e070: 28 6c 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20  (ltrim,         
e080: 20 20 20 20 20 31 2c 20 31 2c 20 30 2c 20 74 72       1, 1, 0, tr
e090: 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29  imFunc         )
e0a0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c  ,.    FUNCTION(l
e0b0: 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20  trim,           
e0c0: 20 20 20 32 2c 20 31 2c 20 30 2c 20 74 72 69 6d     2, 1, 0, trim
e0d0: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
e0e0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 74 72      FUNCTION(rtr
e0f0: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
e100: 20 31 2c 20 32 2c 20 30 2c 20 74 72 69 6d 46 75   1, 2, 0, trimFu
e110: 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  nc         ),.  
e120: 20 20 46 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d    FUNCTION(rtrim
e130: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ,              2
e140: 2c 20 32 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 2, 0, trimFunc
e150: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
e160: 46 55 4e 43 54 49 4f 4e 28 74 72 69 6d 2c 20 20  FUNCTION(trim,  
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
e180: 33 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  3, 0, trimFunc  
e190: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
e1a0: 4e 43 54 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20  NCTION(trim,    
e1b0: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 33 2c             2, 3,
e1c0: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
e1d0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
e1e0: 54 49 4f 4e 28 6d 69 6e 2c 20 20 20 20 20 20 20  TION(min,       
e1f0: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 31          -1, 0, 1
e200: 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20 20  , minmaxFunc    
e210: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e220: 4f 4e 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20  ON(min,         
e230: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 31 2c 20         0, 0, 1, 
e240: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e250: 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54   ),.    AGGREGAT
e260: 45 32 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20  E2(min,         
e270: 20 20 20 20 20 31 2c 20 30 2c 20 31 2c 20 6d 69       1, 0, 1, mi
e280: 6e 6d 61 78 53 74 65 70 2c 20 20 20 20 20 20 6d  nmaxStep,      m
e290: 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 2c 0a 20  inMaxFinalize,. 
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
e2d0: 46 55 4e 43 5f 4d 49 4e 4d 41 58 20 29 2c 0a 20  FUNC_MINMAX ),. 
e2e0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 61 78 2c     FUNCTION(max,
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
e300: 31 2c 20 31 2c 20 31 2c 20 6d 69 6e 6d 61 78 46  1, 1, 1, minmaxF
e310: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
e320: 20 46 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20   FUNCTION(max,  
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e340: 20 31 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20   1, 1, 0        
e350: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41          ),.    A
e360: 47 47 52 45 47 41 54 45 32 28 6d 61 78 2c 20 20  GGREGATE2(max,  
e370: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 31              1, 1
e380: 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c  , 1, minmaxStep,
e390: 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61        minMaxFina
e3a0: 6c 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  lize,.          
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
e3e0: 41 58 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  AX ),.    FUNCTI
e3f0: 4f 4e 32 28 74 79 70 65 6f 66 2c 20 20 20 20 20  ON2(typeof,     
e400: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
e410: 74 79 70 65 6f 66 46 75 6e 63 2c 20 20 53 51 4c  typeofFunc,  SQL
e420: 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29  ITE_FUNC_TYPEOF)
e430: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  ,.    FUNCTION2(
e440: 6c 65 6e 67 74 68 2c 20 20 20 20 20 20 20 20 20  length,         
e450: 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 65 6e 67     1, 0, 0, leng
e460: 74 68 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  thFunc,  SQLITE_
e470: 46 55 4e 43 5f 4c 45 4e 47 54 48 29 2c 0a 20 20  FUNC_LENGTH),.  
e480: 20 20 46 55 4e 43 54 49 4f 4e 28 69 6e 73 74 72    FUNCTION(instr
e490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ,              2
e4a0: 2c 20 30 2c 20 30 2c 20 69 6e 73 74 72 46 75 6e  , 0, 0, instrFun
e4b0: 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  c        ),.    
e4c0: 46 55 4e 43 54 49 4f 4e 28 70 72 69 6e 74 66 2c  FUNCTION(printf,
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
e4e0: 30 2c 20 30 2c 20 70 72 69 6e 74 66 46 75 6e 63  0, 0, printfFunc
e4f0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
e500: 4e 43 54 49 4f 4e 28 75 6e 69 63 6f 64 65 2c 20  NCTION(unicode, 
e510: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
e520: 20 30 2c 20 75 6e 69 63 6f 64 65 46 75 6e 63 20   0, unicodeFunc 
e530: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
e540: 54 49 4f 4e 28 63 68 61 72 2c 20 20 20 20 20 20  TION(char,      
e550: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30          -1, 0, 0
e560: 2c 20 63 68 61 72 46 75 6e 63 20 20 20 20 20 20  , charFunc      
e570: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e580: 4f 4e 28 61 62 73 2c 20 20 20 20 20 20 20 20 20  ON(abs,         
e590: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
e5a0: 61 62 73 46 75 6e 63 20 20 20 20 20 20 20 20 20  absFunc         
e5b0: 20 29 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ),.#ifndef SQLI
e5c0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
e5d0: 5f 50 4f 49 4e 54 0a 20 20 20 20 46 55 4e 43 54  _POINT.    FUNCT
e5e0: 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20 20 20 20  ION(round,      
e5f0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
e600: 20 72 6f 75 6e 64 46 75 6e 63 20 20 20 20 20 20   roundFunc      
e610: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
e620: 4e 28 72 6f 75 6e 64 2c 20 20 20 20 20 20 20 20  N(round,        
e630: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 72        2, 0, 0, r
e640: 6f 75 6e 64 46 75 6e 63 20 20 20 20 20 20 20 20  oundFunc        
e650: 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 55  ),.#endif.    FU
e660: 4e 43 54 49 4f 4e 28 75 70 70 65 72 2c 20 20 20  NCTION(upper,   
e670: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
e680: 20 30 2c 20 75 70 70 65 72 46 75 6e 63 20 20 20   0, upperFunc   
e690: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
e6a0: 54 49 4f 4e 28 6c 6f 77 65 72 2c 20 20 20 20 20  TION(lower,     
e6b0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
e6c0: 2c 20 6c 6f 77 65 72 46 75 6e 63 20 20 20 20 20  , lowerFunc     
e6d0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e6e0: 4f 4e 28 68 65 78 2c 20 20 20 20 20 20 20 20 20  ON(hex,         
e6f0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
e700: 68 65 78 46 75 6e 63 20 20 20 20 20 20 20 20 20  hexFunc         
e710: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e720: 32 28 69 66 6e 75 6c 6c 2c 20 20 20 20 20 20 20  2(ifnull,       
e730: 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 6e 6f       2, 0, 0, no
e740: 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  opFunc,  SQLITE_
e750: 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a  FUNC_COALESCE),.
e760: 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 72 61      VFUNCTION(ra
e770: 6e 64 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  ndom,           
e780: 20 30 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d   0, 0, 0, random
e790: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
e7a0: 20 20 56 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64    VFUNCTION(rand
e7b0: 6f 6d 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 31  omblob,        1
e7c0: 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 42 6c  , 0, 0, randomBl
e7d0: 6f 62 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  ob       ),.    
e7e0: 46 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c 69 66 2c  FUNCTION(nullif,
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
e800: 30 2c 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e 63  0, 1, nullifFunc
e810: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 44 46         ),.    DF
e820: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 76  UNCTION(sqlite_v
e830: 65 72 73 69 6f 6e 2c 20 20 20 20 30 2c 20 30 2c  ersion,    0, 0,
e840: 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 20   0, versionFunc 
e850: 20 20 20 20 20 29 2c 0a 20 20 20 20 44 46 55 4e       ),.    DFUN
e860: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 73 6f 75  CTION(sqlite_sou
e870: 72 63 65 5f 69 64 2c 20 20 30 2c 20 30 2c 20 30  rce_id,  0, 0, 0
e880: 2c 20 73 6f 75 72 63 65 69 64 46 75 6e 63 20 20  , sourceidFunc  
e890: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e8a0: 4f 4e 28 73 71 6c 69 74 65 5f 6c 6f 67 2c 20 20  ON(sqlite_log,  
e8b0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
e8c0: 65 72 72 6c 6f 67 46 75 6e 63 20 20 20 20 20 20  errlogFunc      
e8d0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e8e0: 28 71 75 6f 74 65 2c 20 20 20 20 20 20 20 20 20  (quote,         
e8f0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 71 75       1, 0, 0, qu
e900: 6f 74 65 46 75 6e 63 20 20 20 20 20 20 20 20 29  oteFunc        )
e910: 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28  ,.    VFUNCTION(
e920: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
e930: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 6c 61 73 74  d, 0, 0, 0, last
e940: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 29 2c 0a  _insert_rowid),.
e950: 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 63 68      VFUNCTION(ch
e960: 61 6e 67 65 73 2c 20 20 20 20 20 20 20 20 20 20  anges,          
e970: 20 30 2c 20 30 2c 20 30 2c 20 63 68 61 6e 67 65   0, 0, 0, change
e980: 73 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  s          ),.  
e990: 20 20 56 46 55 4e 43 54 49 4f 4e 28 74 6f 74 61    VFUNCTION(tota
e9a0: 6c 5f 63 68 61 6e 67 65 73 2c 20 20 20 20 20 30  l_changes,     0
e9b0: 2c 20 30 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68  , 0, 0, total_ch
e9c0: 61 6e 67 65 73 20 20 20 20 29 2c 0a 20 20 20 20  anges    ),.    
e9d0: 46 55 4e 43 54 49 4f 4e 28 72 65 70 6c 61 63 65  FUNCTION(replace
e9e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20  ,            3, 
e9f0: 30 2c 20 30 2c 20 72 65 70 6c 61 63 65 46 75 6e  0, 0, replaceFun
ea00: 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55  c      ),.    FU
ea10: 4e 43 54 49 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c  NCTION(zeroblob,
ea20: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
ea30: 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63   0, zeroblobFunc
ea40: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
ea50: 54 49 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20  TION(substr,    
ea60: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30           2, 0, 0
ea70: 2c 20 73 75 62 73 74 72 46 75 6e 63 20 20 20 20  , substrFunc    
ea80: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
ea90: 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20 20 20  ON(substr,      
eaa0: 20 20 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20         3, 0, 0, 
eab0: 73 75 62 73 74 72 46 75 6e 63 20 20 20 20 20 20  substrFunc      
eac0: 20 29 2c 0a 20 20 20 20 57 41 47 47 52 45 47 41   ),.    WAGGREGA
ead0: 54 45 28 73 75 6d 2c 20 20 20 31 2c 30 2c 30 2c  TE(sum,   1,0,0,
eae0: 20 73 75 6d 53 74 65 70 2c 20 73 75 6d 46 69 6e   sumStep, sumFin
eaf0: 61 6c 69 7a 65 2c 20 73 75 6d 46 69 6e 61 6c 69  alize, sumFinali
eb00: 7a 65 2c 20 73 75 6d 49 6e 76 65 72 73 65 29 2c  ze, sumInverse),
eb10: 0a 20 20 20 20 57 41 47 47 52 45 47 41 54 45 28  .    WAGGREGATE(
eb20: 74 6f 74 61 6c 2c 20 31 2c 30 2c 30 2c 20 73 75  total, 1,0,0, su
eb30: 6d 53 74 65 70 2c 20 74 6f 74 61 6c 46 69 6e 61  mStep, totalFina
eb40: 6c 69 7a 65 2c 20 74 6f 74 61 6c 46 69 6e 61 6c  lize, totalFinal
eb50: 69 7a 65 2c 20 73 75 6d 49 6e 76 65 72 73 65 29  ize, sumInverse)
eb60: 2c 0a 20 20 20 20 57 41 47 47 52 45 47 41 54 45  ,.    WAGGREGATE
eb70: 28 61 76 67 2c 20 20 20 31 2c 30 2c 30 2c 20 73  (avg,   1,0,0, s
eb80: 75 6d 53 74 65 70 2c 20 61 76 67 46 69 6e 61 6c  umStep, avgFinal
eb90: 69 7a 65 2c 20 61 76 67 46 69 6e 61 6c 69 7a 65  ize, avgFinalize
eba0: 2c 20 73 75 6d 49 6e 76 65 72 73 65 29 2c 0a 20  , sumInverse),. 
ebb0: 20 20 20 41 47 47 52 45 47 41 54 45 32 28 63 6f     AGGREGATE2(co
ebc0: 75 6e 74 2c 20 30 2c 30 2c 30 2c 20 63 6f 75 6e  unt, 0,0,0, coun
ebd0: 74 53 74 65 70 2c 20 63 6f 75 6e 74 46 69 6e 61  tStep, countFina
ebe0: 6c 69 7a 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e  lize, SQLITE_FUN
ebf0: 43 5f 43 4f 55 4e 54 20 20 29 2c 0a 20 20 20 20  C_COUNT  ),.    
ec00: 57 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e 74  WAGGREGATE(count
ec10: 2c 20 31 2c 30 2c 30 2c 20 63 6f 75 6e 74 53 74  , 1,0,0, countSt
ec20: 65 70 2c 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a  ep, countFinaliz
ec30: 65 2c 20 30 2c 20 30 20 29 2c 0a 20 20 20 20 57  e, 0, 0 ),.    W
ec40: 41 47 47 52 45 47 41 54 45 28 67 72 6f 75 70 5f  AGGREGATE(group_
ec50: 63 6f 6e 63 61 74 2c 20 31 2c 20 30 2c 20 30 2c  concat, 1, 0, 0,
ec60: 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70   groupConcatStep
ec70: 2c 20 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  , .        group
ec80: 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 2c 20  ConcatFinalize, 
ec90: 67 72 6f 75 70 43 6f 6e 63 61 74 56 61 6c 75 65  groupConcatValue
eca0: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 49 6e 76  , groupConcatInv
ecb0: 65 72 73 65 29 2c 0a 20 20 20 20 57 41 47 47 52  erse),.    WAGGR
ecc0: 45 47 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63  EGATE(group_conc
ecd0: 61 74 2c 20 32 2c 20 30 2c 20 30 2c 20 67 72 6f  at, 2, 0, 0, gro
ece0: 75 70 43 6f 6e 63 61 74 53 74 65 70 2c 20 0a 20  upConcatStep, . 
ecf0: 20 20 20 20 20 20 20 67 72 6f 75 70 43 6f 6e 63         groupConc
ed00: 61 74 46 69 6e 61 6c 69 7a 65 2c 20 67 72 6f 75  atFinalize, grou
ed10: 70 43 6f 6e 63 61 74 56 61 6c 75 65 2c 20 67 72  pConcatValue, gr
ed20: 6f 75 70 43 6f 6e 63 61 74 49 6e 76 65 72 73 65  oupConcatInverse
ed30: 29 2c 0a 20 20 0a 20 20 20 20 4c 49 4b 45 46 55  ),.  .    LIKEFU
ed40: 4e 43 28 67 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f  NC(glob, 2, &glo
ed50: 62 49 6e 66 6f 2c 20 53 51 4c 49 54 45 5f 46 55  bInfo, SQLITE_FU
ed60: 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46  NC_LIKE|SQLITE_F
ed70: 55 4e 43 5f 43 41 53 45 29 2c 0a 23 69 66 64 65  UNC_CASE),.#ifde
ed80: 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45  f SQLITE_CASE_SE
ed90: 4e 53 49 54 49 56 45 5f 4c 49 4b 45 0a 20 20 20  NSITIVE_LIKE.   
eda0: 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20   LIKEFUNC(like, 
edb0: 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c  2, &likeInfoAlt,
edc0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
edd0: 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  E|SQLITE_FUNC_CA
ede0: 53 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e  SE),.    LIKEFUN
edf0: 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65  C(like, 3, &like
ee00: 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f  InfoAlt, SQLITE_
ee10: 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45  FUNC_LIKE|SQLITE
ee20: 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 23 65 6c  _FUNC_CASE),.#el
ee30: 73 65 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28  se.    LIKEFUNC(
ee40: 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e  like, 2, &likeIn
ee50: 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46  foNorm, SQLITE_F
ee60: 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c  UNC_LIKE),.    L
ee70: 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c  IKEFUNC(like, 3,
ee80: 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20   &likeInfoNorm, 
ee90: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
eea0: 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  ),.#endif.#ifdef
eeb0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
eec0: 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
eed0: 49 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  ION.    FUNCTION
eee0: 28 75 6e 6b 6e 6f 77 6e 2c 20 20 20 20 20 20 20  (unknown,       
eef0: 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 75 6e      -1, 0, 0, un
ef00: 6b 6e 6f 77 6e 46 75 6e 63 20 20 20 20 20 20 29  knownFunc      )
ef10: 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 55 4e  ,.#endif.    FUN
ef20: 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20  CTION(coalesce, 
ef30: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
ef40: 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  0, 0            
ef50: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
ef60: 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20 20  ION(coalesce,   
ef70: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
ef80: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
ef90: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
efa0: 4e 32 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20  N2(coalesce,    
efb0: 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 6e       -1, 0, 0, n
efc0: 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45  oopFunc,  SQLITE
efd0: 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c  _FUNC_COALESCE),
efe0: 0a 20 20 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51  .  };.#ifndef SQ
eff0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
f000: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c  ABLE.  sqlite3Al
f010: 74 65 72 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  terFunctions();.
f020: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f030: 57 69 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73 28  WindowFunctions(
f040: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
f050: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
f060: 54 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  T3) || defined(S
f070: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
f080: 54 34 29 0a 20 20 73 71 6c 69 74 65 33 41 6e 61  T4).  sqlite3Ana
f090: 6c 79 7a 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b  lyzeFunctions();
f0a0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f0b0: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
f0c0: 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20  eFunctions();.  
f0d0: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 42 75 69  sqlite3InsertBui
f0e0: 6c 74 69 6e 46 75 6e 63 73 28 61 42 75 69 6c 74  ltinFuncs(aBuilt
f0f0: 69 6e 46 75 6e 63 2c 20 41 72 72 61 79 53 69 7a  inFunc, ArraySiz
f100: 65 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 29  e(aBuiltinFunc))
f110: 3b 0a 0a 23 69 66 20 30 20 20 2f 2a 20 45 6e 61  ;..#if 0  /* Ena
f120: 62 6c 65 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  ble to print out
f130: 20 68 6f 77 20 74 68 65 20 62 75 69 6c 74 2d 69   how the built-i
f140: 6e 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  n functions are 
f150: 68 61 73 68 65 64 20 2a 2f 0a 20 20 7b 0a 20 20  hashed */.  {.  
f160: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 75 6e    int i;.    Fun
f170: 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 66 6f 72  cDef *p;.    for
f180: 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 46  (i=0; i<SQLITE_F
f190: 55 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b 2b  UNC_HASH_SZ; i++
f1a0: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
f1b0: 22 46 55 4e 43 2d 48 41 53 48 20 25 30 32 64 3a  "FUNC-HASH %02d:
f1c0: 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 66 6f 72  ", i);.      for
f1d0: 28 70 3d 73 71 6c 69 74 65 33 42 75 69 6c 74 69  (p=sqlite3Builti
f1e0: 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b 69 5d 3b  nFunctions.a[i];
f1f0: 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48 61 73 68   p; p=p->u.pHash
f200: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
f210: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f220: 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  30(p->zName);.  
f230: 20 20 20 20 20 20 69 6e 74 20 68 20 3d 20 70 2d        int h = p-
f240: 3e 7a 4e 61 6d 65 5b 30 5d 20 2b 20 6e 3b 0a 20  >zName[0] + n;. 
f250: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20         printf(" 
f260: 25 73 28 25 64 29 22 2c 20 70 2d 3e 7a 4e 61 6d  %s(%d)", p->zNam
f270: 65 2c 20 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, h);.      }. 
f280: 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22       printf("\n"
f290: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
f2a0: 64 69 66 0a 7d 0a                                dif.}.