/ Hex Artifact Content
Login

Artifact 23d9499688bc862cbb78026670e22140a0c6129527a1470b9b2913d854576153:


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 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
a910: 49 4e 54 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  INT./*.** Implem
a920: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
a930: 69 65 65 65 37 35 34 28 29 20 66 75 6e 63 74 69  ieee754() functi
a940: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
a950: 64 20 69 65 65 65 37 35 34 66 75 6e 63 28 0a 20  d ieee754func(. 
a960: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
a970: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
a980: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
a990: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
a9a0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20 29  .  if( argc==1 )
a9b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
a9c0: 74 36 34 20 6d 2c 20 61 3b 0a 20 20 20 20 64 6f  t64 m, a;.    do
a9d0: 75 62 6c 65 20 72 3b 0a 20 20 20 20 69 6e 74 20  uble r;.    int 
a9e0: 65 3b 0a 20 20 20 20 69 6e 74 20 69 73 4e 65 67  e;.    int isNeg
a9f0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 52 65 73 75  ;.    char zResu
aa00: 6c 74 5b 31 30 30 5d 3b 0a 20 20 20 20 61 73 73  lt[100];.    ass
aa10: 65 72 74 28 20 73 69 7a 65 6f 66 28 6d 29 3d 3d  ert( sizeof(m)==
aa20: 73 69 7a 65 6f 66 28 72 29 20 29 3b 0a 20 20 20  sizeof(r) );.   
aa30: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
aa40: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
aa50: 21 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  !=SQLITE_FLOAT )
aa60: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 72 20 3d   return;.    r =
aa70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
aa80: 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a  ouble(argv[0]);.
aa90: 20 20 20 20 69 66 28 20 72 3c 30 2e 30 20 29 7b      if( r<0.0 ){
aaa0: 0a 20 20 20 20 20 20 69 73 4e 65 67 20 3d 20 31  .      isNeg = 1
aab0: 3b 0a 20 20 20 20 20 20 72 20 3d 20 2d 72 3b 0a  ;.      r = -r;.
aac0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aad0: 20 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20 20 20   isNeg = 0;.    
aae0: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 2c  }.    memcpy(&a,
aaf0: 26 72 2c 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20  &r,sizeof(a));. 
ab00: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
ab10: 20 20 20 20 20 65 20 3d 20 30 3b 0a 20 20 20 20       e = 0;.    
ab20: 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    m = 0;.    }el
ab30: 73 65 7b 0a 20 20 20 20 20 20 65 20 3d 20 61 3e  se{.      e = a>
ab40: 3e 35 32 3b 0a 20 20 20 20 20 20 6d 20 3d 20 61  >52;.      m = a
ab50: 20 26 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69   & ((((sqlite3_i
ab60: 6e 74 36 34 29 31 29 3c 3c 35 32 29 2d 31 29 3b  nt64)1)<<52)-1);
ab70: 0a 20 20 20 20 20 20 6d 20 7c 3d 20 28 28 73 71  .      m |= ((sq
ab80: 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 29 3c 3c  lite3_int64)1)<<
ab90: 35 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  52;.      while(
aba0: 20 65 3c 31 30 37 35 20 26 26 20 6d 3e 30 20 26   e<1075 && m>0 &
abb0: 26 20 28 6d 26 31 29 3d 3d 30 20 29 7b 0a 20 20  & (m&1)==0 ){.  
abc0: 20 20 20 20 20 20 6d 20 3e 3e 3d 20 31 3b 0a 20        m >>= 1;. 
abd0: 20 20 20 20 20 20 20 65 2b 2b 3b 0a 20 20 20 20         e++;.    
abe0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
abf0: 4e 65 67 20 29 20 6d 20 3d 20 2d 6d 3b 0a 20 20  Neg ) m = -m;.  
ac00: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
ac10: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
ac20: 7a 52 65 73 75 6c 74 29 2c 20 7a 52 65 73 75 6c  zResult), zResul
ac30: 74 2c 20 22 69 65 65 65 37 35 34 28 25 6c 6c 64  t, "ieee754(%lld
ac40: 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%d)",.         
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 6d 2c 20 65              m, e
ac60: 2d 31 30 37 35 29 3b 0a 20 20 20 20 73 71 6c 69  -1075);.    sqli
ac70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
ac80: 63 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c 74  context, zResult
ac90: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
aca0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
acb0: 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a   if( argc==2 ){.
acc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
acd0: 34 20 6d 2c 20 65 2c 20 61 3b 0a 20 20 20 20 64  4 m, e, a;.    d
ace0: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 69 6e 74  ouble r;.    int
acf0: 20 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20 20 20   isNeg = 0;.    
ad00: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  m = sqlite3_valu
ad10: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
ad20: 3b 0a 20 20 20 20 65 20 3d 20 73 71 6c 69 74 65  ;.    e = sqlite
ad30: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
ad40: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[1]);.    if( 
ad50: 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 73 4e  m<0 ){.      isN
ad60: 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 20  eg = 1;.      m 
ad70: 3d 20 2d 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  = -m;.      if( 
ad80: 6d 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  m<0 ) return;.  
ad90: 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 3d 3d 30    }else if( m==0
ada0: 20 26 26 20 65 3e 31 30 30 30 20 26 26 20 65 3c   && e>1000 && e<
adb0: 31 30 30 30 20 29 7b 0a 20 20 20 20 20 20 73 71  1000 ){.      sq
adc0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
add0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 30 2e 30  ble(context, 0.0
ade0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
adf0: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
ae00: 28 20 28 6d 3e 3e 33 32 29 26 30 78 66 66 65 30  ( (m>>32)&0xffe0
ae10: 30 30 30 30 20 29 7b 0a 20 20 20 20 20 20 6d 20  0000 ){.      m 
ae20: 3e 3e 3d 20 31 3b 0a 20 20 20 20 20 20 65 2b 2b  >>= 1;.      e++
ae30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
ae40: 65 28 20 6d 21 3d 30 20 26 26 20 28 28 6d 3e 3e  e( m!=0 && ((m>>
ae50: 33 32 29 26 30 78 66 66 66 30 30 30 30 30 29 3d  32)&0xfff00000)=
ae60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 20 3c 3c  =0 ){.      m <<
ae70: 3d 20 31 3b 0a 20 20 20 20 20 20 65 2d 2d 3b 0a  = 1;.      e--;.
ae80: 20 20 20 20 7d 0a 20 20 20 20 65 20 2b 3d 20 31      }.    e += 1
ae90: 30 37 35 3b 0a 20 20 20 20 69 66 28 20 65 3c 30  075;.    if( e<0
aea0: 20 29 20 65 20 3d 20 6d 20 3d 20 30 3b 0a 20 20   ) e = m = 0;.  
aeb0: 20 20 69 66 28 20 65 3e 30 78 37 66 66 20 29 20    if( e>0x7ff ) 
aec0: 65 20 3d 20 30 78 37 66 66 3b 0a 20 20 20 20 61  e = 0x7ff;.    a
aed0: 20 3d 20 6d 20 26 20 28 28 28 28 73 71 6c 69 74   = m & ((((sqlit
aee0: 65 33 5f 69 6e 74 36 34 29 31 29 3c 3c 35 32 29  e3_int64)1)<<52)
aef0: 2d 31 29 3b 0a 20 20 20 20 61 20 7c 3d 20 65 3c  -1);.    a |= e<
af00: 3c 35 32 3b 0a 20 20 20 20 69 66 28 20 69 73 4e  <52;.    if( isN
af10: 65 67 20 29 20 61 20 7c 3d 20 28 28 73 71 6c 69  eg ) a |= ((sqli
af20: 74 65 33 5f 75 69 6e 74 36 34 29 31 29 3c 3c 36  te3_uint64)1)<<6
af30: 33 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 72  3;.    memcpy(&r
af40: 2c 20 26 61 2c 20 73 69 7a 65 6f 66 28 72 29 29  , &a, sizeof(r))
af50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
af60: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
af70: 65 78 74 2c 20 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  ext, r);.  }.}..
af80: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
af90: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
afa0: 4f 49 4e 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  OINT */..#ifndef
afb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
afc0: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
afd0: 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  * A function tha
afe0: 74 20 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64  t loads a shared
aff0: 2d 6c 69 62 72 61 72 79 20 65 78 74 65 6e 73 69  -library extensi
b000: 6f 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  on then returns 
b010: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
b020: 76 6f 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c  void loadExt(sql
b030: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
b040: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
b050: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b060: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
b070: 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63  char *zFile = (c
b080: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
b090: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
b0a0: 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74  rgv[0]);.  const
b0b0: 20 63 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20   char *zProc;.  
b0c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
b0d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
b0e0: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
b0f0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
b100: 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 69 73  g = 0;..  /* Dis
b110: 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 61 64 5f 65  allow the load_e
b120: 78 74 65 6e 73 69 6f 6e 28 29 20 53 51 4c 20 66  xtension() SQL f
b130: 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74  unction unless t
b140: 68 65 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78  he SQLITE_LoadEx
b150: 74 46 75 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  tFunc.  ** flag 
b160: 69 73 20 73 65 74 2e 20 20 53 65 65 20 74 68 65  is set.  See the
b170: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
b180: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29  load_extension()
b190: 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   API..  */.  if(
b1a0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
b1b0: 4c 49 54 45 5f 4c 6f 61 64 45 78 74 46 75 6e 63  LITE_LoadExtFunc
b1c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
b1d0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
b1e0: 28 63 6f 6e 74 65 78 74 2c 20 22 6e 6f 74 20 61  (context, "not a
b1f0: 75 74 68 6f 72 69 7a 65 64 22 2c 20 2d 31 29 3b  uthorized", -1);
b200: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b210: 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20  ..  if( argc==2 
b220: 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 28  ){.    zProc = (
b230: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
b240: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
b250: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73  argv[1]);.  }els
b260: 65 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 30  e{.    zProc = 0
b270: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
b280: 65 20 26 26 20 73 71 6c 69 74 65 33 5f 6c 6f 61  e && sqlite3_loa
b290: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20  d_extension(db, 
b2a0: 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a  zFile, zProc, &z
b2b0: 45 72 72 4d 73 67 29 20 29 7b 0a 20 20 20 20 73  ErrMsg) ){.    s
b2c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
b2d0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72  ror(context, zEr
b2e0: 72 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73  rMsg, -1);.    s
b2f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
b300: 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Msg);.  }.}.#end
b310: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  if.../*.** An in
b320: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
b330: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
b340: 65 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74  e holds the cont
b350: 65 78 74 20 6f 66 20 61 0a 2a 2a 20 73 75 6d 28  ext of a.** sum(
b360: 29 20 6f 72 20 61 76 67 28 29 20 61 67 67 72 65  ) or avg() aggre
b370: 67 61 74 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e  gate computation
b380: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
b390: 75 63 74 20 53 75 6d 43 74 78 20 53 75 6d 43 74  uct SumCtx SumCt
b3a0: 78 3b 0a 73 74 72 75 63 74 20 53 75 6d 43 74 78  x;.struct SumCtx
b3b0: 20 7b 0a 20 20 64 6f 75 62 6c 65 20 72 53 75 6d   {.  double rSum
b3c0: 3b 20 20 20 20 20 20 2f 2a 20 46 6c 6f 61 74 69  ;      /* Floati
b3d0: 6e 67 20 70 6f 69 6e 74 20 73 75 6d 20 2a 2f 0a  ng point sum */.
b3e0: 20 20 69 36 34 20 69 53 75 6d 3b 20 20 20 20 20    i64 iSum;     
b3f0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 73      /* Integer s
b400: 75 6d 20 2a 2f 20 20 20 0a 20 20 69 36 34 20 63  um */   .  i64 c
b410: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
b420: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
b430: 74 73 20 73 75 6d 6d 65 64 20 2a 2f 0a 20 20 75  ts summed */.  u
b440: 38 20 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20 20  8 overflow;     
b450: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 74 65   /* True if inte
b460: 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 73 65 65  ger overflow see
b470: 6e 20 2a 2f 0a 20 20 75 38 20 61 70 70 72 6f 78  n */.  u8 approx
b480: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
b490: 20 69 66 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20   if non-integer 
b4a0: 76 61 6c 75 65 20 77 61 73 20 69 6e 70 75 74 20  value was input 
b4b0: 74 6f 20 74 68 65 20 73 75 6d 20 2a 2f 0a 7d 3b  to the sum */.};
b4c0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
b4d0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
b4e0: 20 74 68 65 20 73 75 6d 2c 20 61 76 65 72 61 67   the sum, averag
b4f0: 65 2c 20 61 6e 64 20 74 6f 74 61 6c 2e 0a 2a 2a  e, and total..**
b500: 0a 2a 2a 20 54 68 65 20 53 55 4d 28 29 20 66 75  .** The SUM() fu
b510: 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 20 74  nction follows t
b520: 68 65 20 28 62 72 6f 6b 65 6e 29 20 53 51 4c 20  he (broken) SQL 
b530: 73 74 61 6e 64 61 72 64 20 77 68 69 63 68 20 6d  standard which m
b540: 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 69 74 20  eans.** that it 
b550: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
b560: 69 74 20 73 75 6d 73 20 6f 76 65 72 20 6e 6f 20  it sums over no 
b570: 69 6e 70 75 74 73 2e 20 20 54 4f 54 41 4c 20 72  inputs.  TOTAL r
b580: 65 74 75 72 6e 73 0a 2a 2a 20 30 2e 30 20 69 6e  eturns.** 0.0 in
b590: 20 74 68 61 74 20 63 61 73 65 2e 20 20 49 6e 20   that case.  In 
b5a0: 61 64 64 69 74 69 6f 6e 2c 20 54 4f 54 41 4c 20  addition, TOTAL 
b5b0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 61  always returns a
b5c0: 20 66 6c 6f 61 74 20 77 68 65 72 65 0a 2a 2a 20   float where.** 
b5d0: 53 55 4d 20 6d 69 67 68 74 20 72 65 74 75 72 6e  SUM might return
b5e0: 20 61 6e 20 69 6e 74 65 67 65 72 20 69 66 20 69   an integer if i
b5f0: 74 20 6e 65 76 65 72 20 65 6e 63 6f 75 6e 74 65  t never encounte
b600: 72 73 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f  rs a floating po
b610: 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 2e 20 20 54  int.** value.  T
b620: 4f 54 41 4c 20 6e 65 76 65 72 20 66 61 69 6c 73  OTAL never fails
b630: 2c 20 62 75 74 20 53 55 4d 20 6d 69 67 68 74 20  , but SUM might 
b640: 74 68 72 6f 75 67 68 20 61 6e 20 65 78 63 65 70  through an excep
b650: 74 69 6f 6e 20 69 66 0a 2a 2a 20 69 74 20 6f 76  tion if.** it ov
b660: 65 72 66 6c 6f 77 73 20 61 6e 20 69 6e 74 65 67  erflows an integ
b670: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b680: 69 64 20 73 75 6d 53 74 65 70 28 73 71 6c 69 74  id sumStep(sqlit
b690: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
b6a0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
b6b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
b6c0: 72 67 76 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a  rgv){.  SumCtx *
b6d0: 70 3b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  p;.  int type;. 
b6e0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
b6f0: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
b700: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
b710: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
b720: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
b730: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
b740: 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 73 71 6c  ));.  type = sql
b750: 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72  ite3_value_numer
b760: 69 63 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ic_type(argv[0])
b770: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 74 79 70  ;.  if( p && typ
b780: 65 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e!=SQLITE_NULL )
b790: 7b 0a 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a  {.    p->cnt++;.
b7a0: 20 20 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51      if( type==SQ
b7b0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
b7c0: 20 20 20 20 20 20 69 36 34 20 76 20 3d 20 73 71        i64 v = sq
b7d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
b7e0: 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  4(argv[0]);.    
b7f0: 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 76 3b 0a    p->rSum += v;.
b800: 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 61 70        if( (p->ap
b810: 70 72 6f 78 7c 70 2d 3e 6f 76 65 72 66 6c 6f 77  prox|p->overflow
b820: 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 41  )==0 && sqlite3A
b830: 64 64 49 6e 74 36 34 28 26 70 2d 3e 69 53 75 6d  ddInt64(&p->iSum
b840: 2c 20 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , v) ){.        
b850: 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 3d 20 31 3b  p->overflow = 1;
b860: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
b870: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  se{.      p->rSu
b880: 6d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  m += sqlite3_val
b890: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
b8a0: 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 70  ]);.      p->app
b8b0: 72 6f 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  rox = 1;.    }. 
b8c0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
b8d0: 20 73 75 6d 46 69 6e 61 6c 69 7a 65 28 73 71 6c   sumFinalize(sql
b8e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
b8f0: 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78  ntext){.  SumCtx
b900: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
b910: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
b920: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
b930: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
b940: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  cnt>0 ){.    if(
b950: 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 29 7b 0a   p->overflow ){.
b960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
b970: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
b980: 78 74 2c 22 69 6e 74 65 67 65 72 20 6f 76 65 72  xt,"integer over
b990: 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20 20 20 20 7d  flow",-1);.    }
b9a0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 61 70 70 72  else if( p->appr
b9b0: 6f 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ox ){.      sqli
b9c0: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
b9d0: 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53  e(context, p->rS
b9e0: 75 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  um);.    }else{.
b9f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
ba00: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
ba10: 78 74 2c 20 70 2d 3e 69 53 75 6d 29 3b 0a 20 20  xt, p->iSum);.  
ba20: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
ba30: 20 76 6f 69 64 20 61 76 67 46 69 6e 61 6c 69 7a   void avgFinaliz
ba40: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
ba50: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
ba60: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  umCtx *p;.  p = 
ba70: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
ba80: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
ba90: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26  t, 0);.  if( p &
baa0: 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20  & p->cnt>0 ){.  
bab0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
bac0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
bad0: 20 70 2d 3e 72 53 75 6d 2f 28 64 6f 75 62 6c 65   p->rSum/(double
bae0: 29 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  )p->cnt);.  }.}.
baf0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 74 61  static void tota
bb00: 6c 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  lFinalize(sqlite
bb10: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
bb20: 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70  xt){.  SumCtx *p
bb30: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
bb40: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
bb50: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
bb60: 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
bb70: 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
bb80: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
bb90: 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 73 71 6c 69  INT... */.  sqli
bba0: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
bbb0: 65 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70  e(context, p ? p
bbc0: 2d 3e 72 53 75 6d 20 3a 20 28 64 6f 75 62 6c 65  ->rSum : (double
bbd0: 29 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  )0);.}../*.** Th
bbe0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
bbf0: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
bc00: 6b 20 6f 66 20 73 74 61 74 65 20 69 6e 66 6f 72  k of state infor
bc10: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a  mation for the.*
bc20: 2a 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67  * count() aggreg
bc30: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ate function..*/
bc40: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
bc50: 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e 74 43 74  CountCtx CountCt
bc60: 78 3b 0a 73 74 72 75 63 74 20 43 6f 75 6e 74 43  x;.struct CountC
bc70: 74 78 20 7b 0a 20 20 69 36 34 20 6e 3b 0a 7d 3b  tx {.  i64 n;.};
bc80: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
bc90: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
bca0: 65 20 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67  e count() aggreg
bcb0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ate function..*/
bcc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
bcd0: 6e 74 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63  ntStep(sqlite3_c
bce0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
bcf0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
bd00: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
bd10: 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b  {.  CountCtx *p;
bd20: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
bd30: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
bd40: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
bd50: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72  (*p));.  if( (ar
bd60: 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f  gc==0 || SQLITE_
bd70: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
bd80: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
bd90: 29 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20 70  )) && p ){.    p
bda0: 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 0a 23 69 66 6e  ->n++;.  }..#ifn
bdb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bdc0: 44 45 50 52 45 43 41 54 45 44 0a 20 20 2f 2a 20  DEPRECATED.  /* 
bdd0: 54 68 65 20 73 71 6c 69 74 65 33 5f 61 67 67 72  The sqlite3_aggr
bde0: 65 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 66 75  egate_count() fu
bdf0: 6e 63 74 69 6f 6e 20 69 73 20 64 65 70 72 65 63  nction is deprec
be00: 61 74 65 64 2e 20 20 42 75 74 20 6a 75 73 74 20  ated.  But just 
be10: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  to make.  ** sur
be20: 65 20 69 74 20 73 74 69 6c 6c 20 6f 70 65 72 61  e it still opera
be30: 74 65 73 20 63 6f 72 72 65 63 74 6c 79 2c 20 76  tes correctly, v
be40: 65 72 69 66 79 20 74 68 61 74 20 69 74 73 20 63  erify that its c
be50: 6f 75 6e 74 20 61 67 72 65 65 73 20 77 69 74 68  ount agrees with
be60: 20 6f 75 72 20 0a 20 20 2a 2a 20 69 6e 74 65 72   our .  ** inter
be70: 6e 61 6c 20 63 6f 75 6e 74 20 77 68 65 6e 20 75  nal count when u
be80: 73 69 6e 67 20 63 6f 75 6e 74 28 2a 29 20 61 6e  sing count(*) an
be90: 64 20 77 68 65 6e 20 74 68 65 20 74 6f 74 61 6c  d when the total
bea0: 20 63 6f 75 6e 74 20 63 61 6e 20 62 65 0a 20 20   count can be.  
beb0: 2a 2a 20 65 78 70 72 65 73 73 65 64 20 61 73 20  ** expressed as 
bec0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
bed0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61  . */.  assert( a
bee0: 72 67 63 3d 3d 31 20 7c 7c 20 70 3d 3d 30 20 7c  rgc==1 || p==0 |
bef0: 7c 20 70 2d 3e 6e 3e 30 78 37 66 66 66 66 66 66  | p->n>0x7ffffff
bf00: 66 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  f.          || p
bf10: 2d 3e 6e 3d 3d 73 71 6c 69 74 65 33 5f 61 67 67  ->n==sqlite3_agg
bf20: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e  regate_count(con
bf30: 74 65 78 74 29 20 29 3b 0a 23 65 6e 64 69 66 0a  text) );.#endif.
bf40: 7d 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64  }   .static void
bf50: 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73   countFinalize(s
bf60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
bf70: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75 6e  context){.  Coun
bf80: 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  tCtx *p;.  p = s
bf90: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
bfa0: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
bfb0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
bfc0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
bfd0: 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a  text, p ? p->n :
bfe0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   0);.}../*.** Ro
bff0: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
c000: 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61  ent min() and ma
c010: 78 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  x() aggregate fu
c020: 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  nctions..*/.stat
c030: 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78 53 74  ic void minmaxSt
c040: 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ep(.  sqlite3_co
c050: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
c060: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20  .  int NotUsed, 
c070: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
c080: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4d 65 6d   **argv.){.  Mem
c090: 20 2a 70 41 72 67 20 20 3d 20 28 4d 65 6d 20 2a   *pArg  = (Mem *
c0a0: 29 61 72 67 76 5b 30 5d 3b 0a 20 20 4d 65 6d 20  )argv[0];.  Mem 
c0b0: 2a 70 42 65 73 74 3b 0a 20 20 55 4e 55 53 45 44  *pBest;.  UNUSED
c0c0: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
c0d0: 65 64 29 3b 0a 0a 20 20 70 42 65 73 74 20 3d 20  ed);..  pBest = 
c0e0: 28 4d 65 6d 20 2a 29 73 71 6c 69 74 65 33 5f 61  (Mem *)sqlite3_a
c0f0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
c100: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
c110: 28 2a 70 42 65 73 74 29 29 3b 0a 20 20 69 66 28  (*pBest));.  if(
c120: 20 21 70 42 65 73 74 20 29 20 72 65 74 75 72 6e   !pBest ) return
c130: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
c140: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
c150: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
c160: 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 65  L ){.    if( pBe
c170: 73 74 2d 3e 66 6c 61 67 73 20 29 20 73 71 6c 69  st->flags ) sqli
c180: 74 65 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74  te3SkipAccumulat
c190: 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78 74 29 3b  orLoad(context);
c1a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 65  .  }else if( pBe
c1b0: 73 74 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  st->flags ){.   
c1c0: 20 69 6e 74 20 6d 61 78 3b 0a 20 20 20 20 69 6e   int max;.    in
c1d0: 74 20 63 6d 70 3b 0a 20 20 20 20 43 6f 6c 6c 53  t cmp;.    CollS
c1e0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
c1f0: 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65  te3GetFuncCollSe
c200: 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  q(context);.    
c210: 2f 2a 20 54 68 69 73 20 73 74 65 70 20 66 75 6e  /* This step fun
c220: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ction is used fo
c230: 72 20 62 6f 74 68 20 74 68 65 20 6d 69 6e 28 29  r both the min()
c240: 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65   and max() aggre
c250: 67 61 74 65 73 2c 0a 20 20 20 20 2a 2a 20 74 68  gates,.    ** th
c260: 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63  e only differenc
c270: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  e between the tw
c280: 6f 20 62 65 69 6e 67 20 74 68 61 74 20 74 68 65  o being that the
c290: 20 73 65 6e 73 65 20 6f 66 20 74 68 65 0a 20 20   sense of the.  
c2a0: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
c2b0: 69 73 20 69 6e 76 65 72 74 65 64 2e 20 46 6f 72  is inverted. For
c2c0: 20 74 68 65 20 6d 61 78 28 29 20 61 67 67 72 65   the max() aggre
c2d0: 67 61 74 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a  gate, the.    **
c2e0: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
c2f0: 74 61 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  ta() function re
c300: 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 2d 31  turns (void *)-1
c310: 2e 20 46 6f 72 20 6d 69 6e 28 29 20 69 74 0a 20  . For min() it. 
c320: 20 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 28 76     ** returns (v
c330: 6f 69 64 20 2a 29 64 62 2c 20 77 68 65 72 65 20  oid *)db, where 
c340: 64 62 20 69 73 20 74 68 65 20 73 71 6c 69 74 65  db is the sqlite
c350: 33 2a 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  3* database poin
c360: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 54 68 65 72  ter..    ** Ther
c370: 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 20 73  efore the next s
c380: 74 61 74 65 6d 65 6e 74 20 73 65 74 73 20 76 61  tatement sets va
c390: 72 69 61 62 6c 65 20 27 6d 61 78 27 20 74 6f 20  riable 'max' to 
c3a0: 31 20 66 6f 72 20 74 68 65 20 6d 61 78 28 29 0a  1 for the max().
c3b0: 20 20 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65      ** aggregate
c3c0: 2c 20 6f 72 20 30 20 66 6f 72 20 6d 69 6e 28 29  , or 0 for min()
c3d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 61 78  ..    */.    max
c3e0: 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
c3f0: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 21 3d 30  data(context)!=0
c400: 3b 0a 20 20 20 20 63 6d 70 20 3d 20 73 71 6c 69  ;.    cmp = sqli
c410: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 42  te3MemCompare(pB
c420: 65 73 74 2c 20 70 41 72 67 2c 20 70 43 6f 6c 6c  est, pArg, pColl
c430: 29 3b 0a 20 20 20 20 69 66 28 20 28 6d 61 78 20  );.    if( (max 
c440: 26 26 20 63 6d 70 3c 30 29 20 7c 7c 20 28 21 6d  && cmp<0) || (!m
c450: 61 78 20 26 26 20 63 6d 70 3e 30 29 20 29 7b 0a  ax && cmp>0) ){.
c460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c470: 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20  eMemCopy(pBest, 
c480: 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pArg);.    }else
c490: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
c4a0: 6b 69 70 41 63 63 75 6d 75 6c 61 74 6f 72 4c 6f  kipAccumulatorLo
c4b0: 61 64 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ad(context);.   
c4c0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
c4d0: 70 42 65 73 74 2d 3e 64 62 20 3d 20 73 71 6c 69  pBest->db = sqli
c4e0: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
c4f0: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
c500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
c510: 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41  emCopy(pBest, pA
c520: 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  rg);.  }.}.stati
c530: 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e  c void minMaxFin
c540: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
c550: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
c560: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
c570: 20 2a 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d   *pRes;.  pRes =
c580: 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20   (sqlite3_value 
c590: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
c5a0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
c5b0: 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ext, 0);.  if( p
c5c0: 52 65 73 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Res ){.    if( p
c5d0: 52 65 73 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20  Res->flags ){.  
c5e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
c5f0: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
c600: 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20  , pRes);.    }. 
c610: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
c620: 6d 52 65 6c 65 61 73 65 28 70 52 65 73 29 3b 0a  mRelease(pRes);.
c630: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67 72 6f    }.}../*.** gro
c640: 75 70 5f 63 6f 6e 63 61 74 28 45 58 50 52 2c 20  up_concat(EXPR, 
c650: 3f 53 45 50 41 52 41 54 4f 52 3f 29 0a 2a 2f 0a  ?SEPARATOR?).*/.
c660: 73 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75  static void grou
c670: 70 43 6f 6e 63 61 74 53 74 65 70 28 0a 20 20 73  pConcatStep(.  s
c680: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c690: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
c6a0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
c6b0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
c6c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
c6d0: 6c 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  l;.  StrAccum *p
c6e0: 41 63 63 75 6d 3b 0a 20 20 63 6f 6e 73 74 20 63  Accum;.  const c
c6f0: 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 69 6e 74  har *zSep;.  int
c700: 20 6e 56 61 6c 2c 20 6e 53 65 70 3b 0a 20 20 61   nVal, nSep;.  a
c710: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
c720: 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69  | argc==2 );.  i
c730: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
c740: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
c750: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
c760: 74 75 72 6e 3b 0a 20 20 70 41 63 63 75 6d 20 3d  turn;.  pAccum =
c770: 20 28 53 74 72 41 63 63 75 6d 2a 29 73 71 6c 69   (StrAccum*)sqli
c780: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
c790: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
c7a0: 69 7a 65 6f 66 28 2a 70 41 63 63 75 6d 29 29 3b  izeof(*pAccum));
c7b0: 0a 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20 29  ..  if( pAccum )
c7c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
c7d0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
c7e0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
c7f0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20  ntext);.    int 
c800: 66 69 72 73 74 54 65 72 6d 20 3d 20 70 41 63 63  firstTerm = pAcc
c810: 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 3d 3d 30 3b 0a  um->mxAlloc==0;.
c820: 20 20 20 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c      pAccum->mxAl
c830: 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  loc = db->aLimit
c840: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
c850: 4e 47 54 48 5d 3b 0a 20 20 20 20 69 66 28 20 21  NGTH];.    if( !
c860: 66 69 72 73 74 54 65 72 6d 20 29 7b 0a 20 20 20  firstTerm ){.   
c870: 20 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29     if( argc==2 )
c880: 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  {.        zSep =
c890: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
c8a0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
c8b0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 53 65  1]);.        nSe
c8c0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  p = sqlite3_valu
c8d0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29  e_bytes(argv[1])
c8e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c8f0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
c900: 22 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70 20  ";.        nSep 
c910: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
c920: 20 20 20 69 66 28 20 7a 53 65 70 20 29 20 73 71     if( zSep ) sq
c930: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
c940: 28 70 41 63 63 75 6d 2c 20 7a 53 65 70 2c 20 6e  (pAccum, zSep, n
c950: 53 65 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sep);.    }.    
c960: 7a 56 61 6c 20 3d 20 28 63 68 61 72 2a 29 73 71  zVal = (char*)sq
c970: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
c980: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
c990: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
c9a0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
c9b0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c  ]);.    if( zVal
c9c0: 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61   ) sqlite3_str_a
c9d0: 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 56  ppend(pAccum, zV
c9e0: 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 7d 0a 7d  al, nVal);.  }.}
c9f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f  .static void gro
ca00: 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65  upConcatFinalize
ca10: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ca20: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74   *context){.  St
ca30: 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a  rAccum *pAccum;.
ca40: 20 20 70 41 63 63 75 6d 20 3d 20 73 71 6c 69 74    pAccum = sqlit
ca50: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
ca60: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
ca70: 3b 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20 29  ;.  if( pAccum )
ca80: 7b 0a 20 20 20 20 69 66 28 20 70 41 63 63 75 6d  {.    if( pAccum
ca90: 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53 51 4c 49  ->accError==SQLI
caa0: 54 45 5f 54 4f 4f 42 49 47 20 29 7b 0a 20 20 20  TE_TOOBIG ){.   
cab0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
cac0: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
cad0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ontext);.    }el
cae0: 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61  se if( pAccum->a
caf0: 63 63 45 72 72 6f 72 3d 3d 53 51 4c 49 54 45 5f  ccError==SQLITE_
cb00: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
cb10: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
cb20: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
cb30: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20  t);.    }else{  
cb40: 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33    .      sqlite3
cb50: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
cb60: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53 74 72  text, sqlite3Str
cb70: 41 63 63 75 6d 46 69 6e 69 73 68 28 70 41 63 63  AccumFinish(pAcc
cb80: 75 6d 29 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  um), -1, .      
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cba0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
cbb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
cbc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
cbd0: 6e 65 20 64 6f 65 73 20 70 65 72 2d 63 6f 6e 6e  ne does per-conn
cbe0: 65 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  ection function 
cbf0: 72 65 67 69 73 74 72 61 74 69 6f 6e 2e 20 20 4d  registration.  M
cc00: 6f 73 74 0a 2a 2a 20 6f 66 20 74 68 65 20 62 75  ost.** of the bu
cc10: 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ilt-in functions
cc20: 20 61 62 6f 76 65 20 61 72 65 20 70 61 72 74 20   above are part 
cc30: 6f 66 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75  of the global fu
cc40: 6e 63 74 69 6f 6e 20 73 65 74 2e 0a 2a 2a 20 54  nction set..** T
cc50: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
cc60: 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 6f 73   deals with thos
cc70: 65 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 67  e that are not g
cc80: 6c 6f 62 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lobal..*/.void s
cc90: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 50 65  qlite3RegisterPe
cca0: 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74  rConnectionBuilt
ccb0: 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69  inFunctions(sqli
ccc0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
ccd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65  rc = sqlite3_ove
cce0: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64  rload_function(d
ccf0: 62 2c 20 22 4d 41 54 43 48 22 2c 20 32 29 3b 0a  b, "MATCH", 2);.
cd00: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
cd10: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63  LITE_NOMEM || rc
cd20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
cd30: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cd40: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
cd50: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
cd60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
cd70: 65 74 20 74 68 65 20 4c 49 4b 45 4f 50 54 20 66  et the LIKEOPT f
cd80: 6c 61 67 20 6f 6e 20 74 68 65 20 32 2d 61 72 67  lag on the 2-arg
cd90: 75 6d 65 6e 74 20 66 75 6e 63 74 69 6f 6e 20 77  ument function w
cda0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61  ith the given na
cdb0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
cdc0: 69 64 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61  id setLikeOptFla
cdd0: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  g(sqlite3 *db, c
cde0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
cdf0: 2c 20 75 38 20 66 6c 61 67 56 61 6c 29 7b 0a 20  , u8 flagVal){. 
ce00: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
ce10: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
ce20: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
ce30: 20 7a 4e 61 6d 65 2c 20 32 2c 20 53 51 4c 49 54   zName, 2, SQLIT
ce40: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66  E_UTF8, 0);.  if
ce50: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 29  ( ALWAYS(pDef) )
ce60: 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63  {.    pDef->func
ce70: 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67 56 61 6c  Flags |= flagVal
ce80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
ce90: 65 67 69 73 74 65 72 20 74 68 65 20 62 75 69 6c  egister the buil
cea0: 74 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20 47 4c  t-in LIKE and GL
ceb0: 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  OB functions.  T
cec0: 68 65 20 63 61 73 65 53 65 6e 73 69 74 69 76 65  he caseSensitive
ced0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 64 65  .** parameter de
cee0: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
cef0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49 4b 45   or not the LIKE
cf00: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63 61 73   operator is cas
cf10: 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65 2e 20  e.** sensitive. 
cf20: 20 47 4c 4f 42 20 69 73 20 61 6c 77 61 79 73 20   GLOB is always 
cf30: 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2e 0a  case sensitive..
cf40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
cf50: 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74  egisterLikeFunct
cf60: 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ions(sqlite3 *db
cf70: 2c 20 69 6e 74 20 63 61 73 65 53 65 6e 73 69 74  , int caseSensit
cf80: 69 76 65 29 7b 0a 20 20 73 74 72 75 63 74 20 63  ive){.  struct c
cf90: 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66  ompareInfo *pInf
cfa0: 6f 3b 0a 20 20 69 66 28 20 63 61 73 65 53 65 6e  o;.  if( caseSen
cfb0: 73 69 74 69 76 65 20 29 7b 0a 20 20 20 20 70 49  sitive ){.    pI
cfc0: 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f  nfo = (struct co
cfd0: 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65  mpareInfo*)&like
cfe0: 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c 73 65  InfoAlt;.  }else
cff0: 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73  {.    pInfo = (s
d000: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
d010: 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d  o*)&likeInfoNorm
d020: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
d030: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 6c  reateFunc(db, "l
d040: 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ike", 2, SQLITE_
d050: 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b  UTF8, pInfo, lik
d060: 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b  eFunc, 0, 0, 0);
d070: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
d080: 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c  Func(db, "like",
d090: 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   3, SQLITE_UTF8,
d0a0: 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63   pInfo, likeFunc
d0b0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
d0c0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
d0d0: 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32 2c 20 53  db, "glob", 2, S
d0e0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
d0f0: 20 20 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61     (struct compa
d100: 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62 49 6e 66  reInfo*)&globInf
d110: 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20  o, likeFunc, 0, 
d120: 30 2c 20 30 29 3b 0a 20 20 73 65 74 4c 69 6b 65  0, 0);.  setLike
d130: 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67 6c 6f  OptFlag(db, "glo
d140: 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  b", SQLITE_FUNC_
d150: 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55  LIKE | SQLITE_FU
d160: 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65 74 4c  NC_CASE);.  setL
d170: 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22  ikeOptFlag(db, "
d180: 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20 63 61  like", .      ca
d190: 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20 28 53  seSensitive ? (S
d1a0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20  QLITE_FUNC_LIKE 
d1b0: 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  | SQLITE_FUNC_CA
d1c0: 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46 55 4e  SE) : SQLITE_FUN
d1d0: 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_LIKE);.}../*.*
d1e0: 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73 20 74  * pExpr points t
d1f0: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
d200: 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74 73  which implements
d210: 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66   a function.  If
d220: 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72 6f 70  .** it is approp
d230: 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79 20 74  riate to apply t
d240: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
d250: 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66 75 6e  tion to that fun
d260: 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73 65  ction.** then se
d270: 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75 67 68  t aWc[0] through
d280: 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65 20 77   aWc[2] to the w
d290: 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65  ildcard characte
d2a0: 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 73  rs and the.** es
d2b0: 63 61 70 65 20 63 68 61 72 61 63 74 65 72 20 61  cape character a
d2c0: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54  nd then return T
d2d0: 52 55 45 2e 20 20 49 66 20 74 68 65 20 66 75 6e  RUE.  If the fun
d2e0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 0a  ction is not a .
d2f0: 2a 2a 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75  ** LIKE-style fu
d300: 6e 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 74 75  nction then retu
d310: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a 20  rn FALSE..**.** 
d320: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
d330: 61 20 4c 49 4b 45 20 62 20 45 53 43 41 50 45 20  a LIKE b ESCAPE 
d340: 63 22 20 69 73 20 6f 6e 6c 79 20 63 6f 6e 73 69  c" is only consi
d350: 64 65 72 65 64 20 61 20 76 61 6c 69 64 20 4c 49  dered a valid LI
d360: 4b 45 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  KE.** operator i
d370: 66 20 63 20 69 73 20 61 20 73 74 72 69 6e 67 20  f c is a string 
d380: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73 20  literal that is 
d390: 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74 65  exactly one byte
d3a0: 20 69 6e 20 6c 65 6e 67 74 68 2e 0a 2a 2a 20 54   in length..** T
d3b0: 68 61 74 20 6f 6e 65 20 62 79 74 65 20 69 73 20  hat one byte is 
d3c0: 73 74 6f 72 65 64 20 69 6e 20 61 57 63 5b 33 5d  stored in aWc[3]
d3d0: 2e 20 20 61 57 63 5b 33 5d 20 69 73 20 73 65 74  .  aWc[3] is set
d3e0: 20 74 6f 20 7a 65 72 6f 20 69 66 20 74 68 65 72   to zero if ther
d3f0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 45 53 43 41 50  e is.** no ESCAP
d400: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
d410: 2a 70 49 73 4e 6f 63 61 73 65 20 69 73 20 73 65  *pIsNocase is se
d420: 74 20 74 6f 20 74 72 75 65 20 69 66 20 75 70 70  t to true if upp
d430: 65 72 63 61 73 65 20 61 6e 64 20 6c 6f 77 65 72  ercase and lower
d440: 63 61 73 65 20 61 72 65 20 65 71 75 69 76 61 6c  case are equival
d450: 65 6e 74 20 66 6f 72 0a 2a 2a 20 74 68 65 20 66  ent for.** the f
d460: 75 6e 63 74 69 6f 6e 20 28 64 65 66 61 75 6c 74  unction (default
d470: 20 66 6f 72 20 4c 49 4b 45 29 2e 20 20 49 66 20   for LIKE).  If 
d480: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d 61 6b  the function mak
d490: 65 73 20 74 68 65 20 64 69 73 74 69 6e 63 74 69  es the distincti
d4a0: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 75 70  on.** between up
d4b0: 70 65 72 63 61 73 65 20 61 6e 64 20 6c 6f 77 65  percase and lowe
d4c0: 72 63 61 73 65 20 28 61 73 20 64 6f 65 73 20 47  rcase (as does G
d4d0: 4c 4f 42 29 20 74 68 65 6e 20 2a 70 49 73 4e 6f  LOB) then *pIsNo
d4e0: 63 61 73 65 20 69 73 20 73 65 74 20 74 6f 0a 2a  case is set to.*
d4f0: 2a 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  * false..*/.int 
d500: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
d510: 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  ction(sqlite3 *d
d520: 62 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  b, Expr *pExpr, 
d530: 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73 65 2c 20  int *pIsNocase, 
d540: 63 68 61 72 20 2a 61 57 63 29 7b 0a 20 20 46 75  char *aWc){.  Fu
d550: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 69  ncDef *pDef;.  i
d560: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  nt nExpr;.  if( 
d570: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55  pExpr->op!=TK_FU
d580: 4e 43 54 49 4f 4e 20 7c 7c 20 21 70 45 78 70 72  NCTION || !pExpr
d590: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
d5a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d5b0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
d5c0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
d5d0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
d5e0: 3b 0a 20 20 6e 45 78 70 72 20 3d 20 70 45 78 70  ;.  nExpr = pExp
d5f0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
d600: 72 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69  r;.  pDef = sqli
d610: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
d620: 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  db, pExpr->u.zTo
d630: 6b 65 6e 2c 20 6e 45 78 70 72 2c 20 53 51 4c 49  ken, nExpr, SQLI
d640: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69  TE_UTF8, 0);.  i
d650: 66 28 20 4e 45 56 45 52 28 70 44 65 66 3d 3d 30  f( NEVER(pDef==0
d660: 29 20 7c 7c 20 28 70 44 65 66 2d 3e 66 75 6e 63  ) || (pDef->func
d670: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
d680: 55 4e 43 5f 4c 49 4b 45 29 3d 3d 30 20 29 7b 0a  UNC_LIKE)==0 ){.
d690: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d6a0: 7d 0a 20 20 69 66 28 20 6e 45 78 70 72 3c 33 20  }.  if( nExpr<3 
d6b0: 29 7b 0a 20 20 20 20 61 57 63 5b 33 5d 20 3d 20  ){.    aWc[3] = 
d6c0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
d6d0: 45 78 70 72 20 2a 70 45 73 63 61 70 65 20 3d 20  Expr *pEscape = 
d6e0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
d6f0: 61 5b 32 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[2].pExpr;.    
d700: 63 68 61 72 20 2a 7a 45 73 63 61 70 65 3b 0a 20  char *zEscape;. 
d710: 20 20 20 69 66 28 20 70 45 73 63 61 70 65 2d 3e     if( pEscape->
d720: 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 20  op!=TK_STRING ) 
d730: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a 45  return 0;.    zE
d740: 73 63 61 70 65 20 3d 20 70 45 73 63 61 70 65 2d  scape = pEscape-
d750: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  >u.zToken;.    i
d760: 66 28 20 7a 45 73 63 61 70 65 5b 30 5d 3d 3d 30  f( zEscape[0]==0
d770: 20 7c 7c 20 7a 45 73 63 61 70 65 5b 31 5d 21 3d   || zEscape[1]!=
d780: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d790: 20 20 61 57 63 5b 33 5d 20 3d 20 7a 45 73 63 61    aWc[3] = zEsca
d7a0: 70 65 5b 30 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pe[0];.  }..  /*
d7b0: 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73 74   The memcpy() st
d7c0: 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73 20  atement assumes 
d7d0: 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61 72  that the wildcar
d7e0: 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65  d characters are
d7f0: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
d800: 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74 73  three statements
d810: 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65 49   in the compareI
d820: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
d830: 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 73  The.  ** asserts
d840: 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76  () that follow v
d850: 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75 6d  erify that assum
d860: 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ption.  */.  mem
d870: 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e 70  cpy(aWc, pDef->p
d880: 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20 20  UserData, 3);.  
d890: 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29 26  assert( (char*)&
d8a0: 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28  likeInfoAlt == (
d8b0: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
d8c0: 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20  lt.matchAll );. 
d8d0: 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61 72   assert( &((char
d8e0: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b  *)&likeInfoAlt)[
d8f0: 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69  1] == (char*)&li
d900: 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f  keInfoAlt.matchO
d910: 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
d920: 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  &((char*)&likeIn
d930: 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68  foAlt)[2] == (ch
d940: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
d950: 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20 2a  .matchSet );.  *
d960: 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44 65  pIsNocase = (pDe
d970: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
d980: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
d990: 3d 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ==0;.  return 1;
d9a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  .}../*.** All of
d9b0: 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74 72   the FuncDef str
d9c0: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 61  uctures in the a
d9d0: 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61 72  BuiltinFunc[] ar
d9e0: 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ray above.** to 
d9f0: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
da00: 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 20  ion hash table. 
da10: 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 74 20   This occurs at 
da20: 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a 2a  start-time (as.*
da30: 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  * a consequence 
da40: 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  of calling sqlit
da50: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 29  e3_initialize())
da60: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
da70: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 0a  is routine runs.
da80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
da90: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
daa0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
dab0: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c   /*.  ** The fol
dac0: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
dad0: 64 73 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ds FuncDef struc
dae0: 74 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66  tures for all of
daf0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20   the functions. 
db00: 20 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74   ** defined in t
db10: 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  his file..  **. 
db20: 20 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63 61   ** The array ca
db30: 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  nnot be constant
db40: 20 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61   since changes a
db50: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20  re made to the. 
db60: 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73   ** FuncDef.pHas
db70: 68 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74  h elements at st
db80: 61 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65  art-time.  The e
db90: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20  lements of this 
dba0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72  array.  ** are r
dbb0: 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69  ead-only after i
dbc0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73  nitialization is
dbd0: 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2a 0a   complete..  **.
dbe0: 20 20 2a 2a 20 46 6f 72 20 70 65 61 6b 20 65 66    ** For peak ef
dbf0: 66 69 63 69 65 6e 63 79 2c 20 70 75 74 20 74 68  ficiency, put th
dc00: 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 6c  e most frequentl
dc10: 79 20 75 73 65 64 20 66 75 6e 63 74 69 6f 6e 20  y used function 
dc20: 6c 61 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61  last..  */.  sta
dc30: 74 69 63 20 46 75 6e 63 44 65 66 20 61 42 75 69  tic FuncDef aBui
dc40: 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 23  ltinFunc[] = {.#
dc50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55  ifdef SQLITE_SOU
dc60: 4e 44 45 58 0a 20 20 20 20 46 55 4e 43 54 49 4f  NDEX.    FUNCTIO
dc70: 4e 28 73 6f 75 6e 64 65 78 2c 20 20 20 20 20 20  N(soundex,      
dc80: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73        1, 0, 0, s
dc90: 6f 75 6e 64 65 78 46 75 6e 63 20 20 20 20 20 20  oundexFunc      
dca0: 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  ),.#endif.#ifnde
dcb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
dcc0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
dcd0: 20 56 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f   VFUNCTION(load_
dce0: 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 31 2c  extension,    1,
dcf0: 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20   0, 0, loadExt  
dd00: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56          ),.    V
dd10: 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78  FUNCTION(load_ex
dd20: 74 65 6e 73 69 6f 6e 2c 20 20 20 20 32 2c 20 30  tension,    2, 0
dd30: 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20  , 0, loadExt    
dd40: 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a        ),.#endif.
dd50: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
dd60: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
dd70: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69     FUNCTION(sqli
dd80: 74 65 5f 63 72 79 70 74 2c 20 20 20 20 20 20 20  te_crypt,       
dd90: 32 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33  2, 0, 0, sqlite3
dda0: 43 72 79 70 74 46 75 6e 63 20 29 2c 0a 23 65 6e  CryptFunc ),.#en
ddb0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
ddc0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
ddd0: 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20 20 20  PTION_DIAGS.    
dde0: 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65  DFUNCTION(sqlite
ddf0: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
de00: 73 65 64 2c 31 2c 20 30 2c 20 30 2c 20 63 6f 6d  sed,1, 0, 0, com
de10: 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46 75  pileoptionusedFu
de20: 6e 63 20 20 29 2c 0a 20 20 20 20 44 46 55 4e 43  nc  ),.    DFUNC
de30: 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70  TION(sqlite_comp
de40: 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 2c 20 31  ileoption_get, 1
de50: 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f  , 0, 0, compileo
de60: 70 74 69 6f 6e 67 65 74 46 75 6e 63 20 20 29 2c  ptiongetFunc  ),
de70: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
de80: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
de90: 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 20 20  TION_DIAGS */.  
dea0: 20 20 46 55 4e 43 54 49 4f 4e 32 28 75 6e 6c 69    FUNCTION2(unli
deb0: 6b 65 6c 79 2c 20 20 20 20 20 20 20 20 20 20 31  kely,          1
dec0: 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63  , 0, 0, noopFunc
ded0: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55  ,  SQLITE_FUNC_U
dee0: 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20 46 55  NLIKELY),.    FU
def0: 4e 43 54 49 4f 4e 32 28 6c 69 6b 65 6c 69 68 6f  NCTION2(likeliho
df00: 6f 64 2c 20 20 20 20 20 20 20 20 32 2c 20 30 2c  od,        2, 0,
df10: 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53   0, noopFunc,  S
df20: 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
df30: 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  ELY),.    FUNCTI
df40: 4f 4e 32 28 6c 69 6b 65 6c 79 2c 20 20 20 20 20  ON2(likely,     
df50: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
df60: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
df70: 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29  E_FUNC_UNLIKELY)
df80: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
df90: 44 45 42 55 47 0a 20 20 20 20 46 55 4e 43 54 49  DEBUG.    FUNCTI
dfa0: 4f 4e 32 28 61 66 66 69 6e 69 74 79 2c 20 20 20  ON2(affinity,   
dfb0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
dfc0: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
dfd0: 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 29  E_FUNC_AFFINITY)
dfe0: 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ,.#endif.#ifdef 
dff0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
e000: 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20  FSET_SQL_FUNC.  
e010: 20 20 46 55 4e 43 54 49 4f 4e 32 28 73 71 6c 69    FUNCTION2(sqli
e020: 74 65 5f 6f 66 66 73 65 74 2c 20 20 20 20 20 31  te_offset,     1
e030: 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63  , 0, 0, noopFunc
e040: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f  ,  SQLITE_FUNC_O
e050: 46 46 53 45 54 7c 0a 20 20 20 20 20 20 20 20 20  FFSET|.         
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e090: 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 2c  TE_FUNC_TYPEOF),
e0a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 55 4e 43  .#endif.    FUNC
e0b0: 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20 20  TION(ltrim,     
e0c0: 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 30           1, 1, 0
e0d0: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
e0e0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e0f0: 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20 20 20 20  ON(ltrim,       
e100: 20 20 20 20 20 20 20 32 2c 20 31 2c 20 30 2c 20         2, 1, 0, 
e110: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
e120: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e130: 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20  (rtrim,         
e140: 20 20 20 20 20 31 2c 20 32 2c 20 30 2c 20 74 72       1, 2, 0, tr
e150: 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29  imFunc         )
e160: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72  ,.    FUNCTION(r
e170: 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20  trim,           
e180: 20 20 20 32 2c 20 32 2c 20 30 2c 20 74 72 69 6d     2, 2, 0, trim
e190: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
e1a0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72 69      FUNCTION(tri
e1b0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
e1c0: 20 31 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46 75   1, 3, 0, trimFu
e1d0: 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  nc         ),.  
e1e0: 20 20 46 55 4e 43 54 49 4f 4e 28 74 72 69 6d 2c    FUNCTION(trim,
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
e200: 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 3, 0, trimFunc
e210: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
e220: 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20 20  FUNCTION(min,   
e230: 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
e240: 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63  0, 1, minmaxFunc
e250: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
e260: 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20 20 20 20  NCTION(min,     
e270: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
e280: 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   1, 0           
e290: 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52       ),.    AGGR
e2a0: 45 47 41 54 45 32 28 6d 69 6e 2c 20 20 20 20 20  EGATE2(min,     
e2b0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 31           1, 0, 1
e2c0: 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20  , minmaxStep,   
e2d0: 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a     minMaxFinaliz
e2e0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
e310: 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 20  ITE_FUNC_MINMAX 
e320: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
e330: 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  max,            
e340: 20 20 20 2d 31 2c 20 31 2c 20 31 2c 20 6d 69 6e     -1, 1, 1, min
e350: 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20 29 2c  maxFunc       ),
e360: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 61  .    FUNCTION(ma
e370: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
e380: 20 20 30 2c 20 31 2c 20 31 2c 20 30 20 20 20 20    0, 1, 1, 0    
e390: 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20              ),. 
e3a0: 20 20 20 41 47 47 52 45 47 41 54 45 32 28 6d 61     AGGREGATE2(ma
e3b0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
e3c0: 31 2c 20 31 2c 20 31 2c 20 6d 69 6e 6d 61 78 53  1, 1, 1, minmaxS
e3d0: 74 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61 78  tep,      minMax
e3e0: 46 69 6e 61 6c 69 7a 65 2c 0a 20 20 20 20 20 20  Finalize,.      
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f      SQLITE_FUNC_
e420: 4d 49 4e 4d 41 58 20 29 2c 0a 20 20 20 20 46 55  MINMAX ),.    FU
e430: 4e 43 54 49 4f 4e 32 28 74 79 70 65 6f 66 2c 20  NCTION2(typeof, 
e440: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
e450: 20 30 2c 20 74 79 70 65 6f 66 46 75 6e 63 2c 20   0, typeofFunc, 
e460: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
e470: 45 4f 46 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  EOF),.    FUNCTI
e480: 4f 4e 32 28 6c 65 6e 67 74 68 2c 20 20 20 20 20  ON2(length,     
e490: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
e4a0: 6c 65 6e 67 74 68 46 75 6e 63 2c 20 20 53 51 4c  lengthFunc,  SQL
e4b0: 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 29  ITE_FUNC_LENGTH)
e4c0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 69  ,.    FUNCTION(i
e4d0: 6e 73 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  nstr,           
e4e0: 20 20 20 32 2c 20 30 2c 20 30 2c 20 69 6e 73 74     2, 0, 0, inst
e4f0: 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a  rFunc        ),.
e500: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 70 72 69      FUNCTION(pri
e510: 6e 74 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  ntf,            
e520: 2d 31 2c 20 30 2c 20 30 2c 20 70 72 69 6e 74 66  -1, 0, 0, printf
e530: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
e540: 20 20 46 55 4e 43 54 49 4f 4e 28 75 6e 69 63 6f    FUNCTION(unico
e550: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  de,            1
e560: 2c 20 30 2c 20 30 2c 20 75 6e 69 63 6f 64 65 46  , 0, 0, unicodeF
e570: 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20  unc      ),.    
e580: 46 55 4e 43 54 49 4f 4e 28 63 68 61 72 2c 20 20  FUNCTION(char,  
e590: 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
e5a0: 30 2c 20 30 2c 20 63 68 61 72 46 75 6e 63 20 20  0, 0, charFunc  
e5b0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
e5c0: 4e 43 54 49 4f 4e 28 61 62 73 2c 20 20 20 20 20  NCTION(abs,     
e5d0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
e5e0: 20 30 2c 20 61 62 73 46 75 6e 63 20 20 20 20 20   0, absFunc     
e5f0: 20 20 20 20 20 29 2c 0a 23 69 66 6e 64 65 66 20       ),.#ifndef 
e600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
e610: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 46  TING_POINT.    F
e620: 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20  UNCTION(round,  
e630: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
e640: 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20  , 0, roundFunc  
e650: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
e660: 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20 20  CTION(round,    
e670: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
e680: 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 20 20  0, roundFunc    
e690: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
e6a0: 49 4f 4e 28 69 65 65 65 37 35 34 2c 20 20 20 20  ION(ieee754,    
e6b0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
e6c0: 20 69 65 65 65 37 35 34 66 75 6e 63 20 20 20 20   ieee754func    
e6d0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
e6e0: 4e 28 69 65 65 65 37 35 34 2c 20 20 20 20 20 20  N(ieee754,      
e6f0: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 69        2, 0, 0, i
e700: 65 65 65 37 35 34 66 75 6e 63 20 20 20 20 20 20  eee754func      
e710: 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 55  ),.#endif.    FU
e720: 4e 43 54 49 4f 4e 28 75 70 70 65 72 2c 20 20 20  NCTION(upper,   
e730: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
e740: 20 30 2c 20 75 70 70 65 72 46 75 6e 63 20 20 20   0, upperFunc   
e750: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
e760: 54 49 4f 4e 28 6c 6f 77 65 72 2c 20 20 20 20 20  TION(lower,     
e770: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
e780: 2c 20 6c 6f 77 65 72 46 75 6e 63 20 20 20 20 20  , lowerFunc     
e790: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e7a0: 4f 4e 28 68 65 78 2c 20 20 20 20 20 20 20 20 20  ON(hex,         
e7b0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
e7c0: 68 65 78 46 75 6e 63 20 20 20 20 20 20 20 20 20  hexFunc         
e7d0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e7e0: 32 28 69 66 6e 75 6c 6c 2c 20 20 20 20 20 20 20  2(ifnull,       
e7f0: 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 6e 6f       2, 0, 0, no
e800: 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  opFunc,  SQLITE_
e810: 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a  FUNC_COALESCE),.
e820: 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 72 61      VFUNCTION(ra
e830: 6e 64 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  ndom,           
e840: 20 30 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d   0, 0, 0, random
e850: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
e860: 20 20 56 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64    VFUNCTION(rand
e870: 6f 6d 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 31  omblob,        1
e880: 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 42 6c  , 0, 0, randomBl
e890: 6f 62 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  ob       ),.    
e8a0: 46 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c 69 66 2c  FUNCTION(nullif,
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
e8c0: 30 2c 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e 63  0, 1, nullifFunc
e8d0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 44 46         ),.    DF
e8e0: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 76  UNCTION(sqlite_v
e8f0: 65 72 73 69 6f 6e 2c 20 20 20 20 30 2c 20 30 2c  ersion,    0, 0,
e900: 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 20   0, versionFunc 
e910: 20 20 20 20 20 29 2c 0a 20 20 20 20 44 46 55 4e       ),.    DFUN
e920: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 73 6f 75  CTION(sqlite_sou
e930: 72 63 65 5f 69 64 2c 20 20 30 2c 20 30 2c 20 30  rce_id,  0, 0, 0
e940: 2c 20 73 6f 75 72 63 65 69 64 46 75 6e 63 20 20  , sourceidFunc  
e950: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e960: 4f 4e 28 73 71 6c 69 74 65 5f 6c 6f 67 2c 20 20  ON(sqlite_log,  
e970: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
e980: 65 72 72 6c 6f 67 46 75 6e 63 20 20 20 20 20 20  errlogFunc      
e990: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e9a0: 28 71 75 6f 74 65 2c 20 20 20 20 20 20 20 20 20  (quote,         
e9b0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 71 75       1, 0, 0, qu
e9c0: 6f 74 65 46 75 6e 63 20 20 20 20 20 20 20 20 29  oteFunc        )
e9d0: 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28  ,.    VFUNCTION(
e9e0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
e9f0: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 6c 61 73 74  d, 0, 0, 0, last
ea00: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 29 2c 0a  _insert_rowid),.
ea10: 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 63 68      VFUNCTION(ch
ea20: 61 6e 67 65 73 2c 20 20 20 20 20 20 20 20 20 20  anges,          
ea30: 20 30 2c 20 30 2c 20 30 2c 20 63 68 61 6e 67 65   0, 0, 0, change
ea40: 73 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  s          ),.  
ea50: 20 20 56 46 55 4e 43 54 49 4f 4e 28 74 6f 74 61    VFUNCTION(tota
ea60: 6c 5f 63 68 61 6e 67 65 73 2c 20 20 20 20 20 30  l_changes,     0
ea70: 2c 20 30 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68  , 0, 0, total_ch
ea80: 61 6e 67 65 73 20 20 20 20 29 2c 0a 20 20 20 20  anges    ),.    
ea90: 46 55 4e 43 54 49 4f 4e 28 72 65 70 6c 61 63 65  FUNCTION(replace
eaa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20  ,            3, 
eab0: 30 2c 20 30 2c 20 72 65 70 6c 61 63 65 46 75 6e  0, 0, replaceFun
eac0: 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55  c      ),.    FU
ead0: 4e 43 54 49 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c  NCTION(zeroblob,
eae0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
eaf0: 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63   0, zeroblobFunc
eb00: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
eb10: 54 49 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20  TION(substr,    
eb20: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30           2, 0, 0
eb30: 2c 20 73 75 62 73 74 72 46 75 6e 63 20 20 20 20  , substrFunc    
eb40: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
eb50: 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20 20 20  ON(substr,      
eb60: 20 20 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20         3, 0, 0, 
eb70: 73 75 62 73 74 72 46 75 6e 63 20 20 20 20 20 20  substrFunc      
eb80: 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54   ),.    AGGREGAT
eb90: 45 28 73 75 6d 2c 20 20 20 20 20 20 20 20 20 20  E(sum,          
eba0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75       1, 0, 0, su
ebb0: 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20 20 73  mStep,         s
ebc0: 75 6d 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c  umFinalize    ),
ebd0: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 74  .    AGGREGATE(t
ebe0: 6f 74 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20  otal,           
ebf0: 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74    1, 0, 0, sumSt
ec00: 65 70 2c 20 20 20 20 20 20 20 20 20 74 6f 74 61  ep,         tota
ec10: 6c 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a  lFinalize    ),.
ec20: 20 20 20 20 41 47 47 52 45 47 41 54 45 28 61 76      AGGREGATE(av
ec30: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
ec40: 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65   1, 0, 0, sumSte
ec50: 70 2c 20 20 20 20 20 20 20 20 20 61 76 67 46 69  p,         avgFi
ec60: 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20  nalize    ),.   
ec70: 20 41 47 47 52 45 47 41 54 45 32 28 63 6f 75 6e   AGGREGATE2(coun
ec80: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  t,            0,
ec90: 20 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70   0, 0, countStep
eca0: 2c 20 20 20 20 20 20 20 63 6f 75 6e 74 46 69 6e  ,       countFin
ecb0: 61 6c 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  alize,.         
ecc0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e        SQLITE_FUN
ecd0: 43 5f 43 4f 55 4e 54 20 20 29 2c 0a 20 20 20 20  C_COUNT  ),.    
ece0: 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e 74 2c  AGGREGATE(count,
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
ed00: 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c  0, 0, countStep,
ed10: 20 20 20 20 20 20 20 63 6f 75 6e 74 46 69 6e 61         countFina
ed20: 6c 69 7a 65 20 20 29 2c 0a 20 20 20 20 41 47 47  lize  ),.    AGG
ed30: 52 45 47 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e  REGATE(group_con
ed40: 63 61 74 2c 20 20 20 20 20 20 31 2c 20 30 2c 20  cat,      1, 0, 
ed50: 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74  0, groupConcatSt
ed60: 65 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 46  ep, groupConcatF
ed70: 69 6e 61 6c 69 7a 65 29 2c 0a 20 20 20 20 41 47  inalize),.    AG
ed80: 47 52 45 47 41 54 45 28 67 72 6f 75 70 5f 63 6f  GREGATE(group_co
ed90: 6e 63 61 74 2c 20 20 20 20 20 20 32 2c 20 30 2c  ncat,      2, 0,
eda0: 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53   0, groupConcatS
edb0: 74 65 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74  tep, groupConcat
edc0: 46 69 6e 61 6c 69 7a 65 29 2c 0a 20 20 0a 20 20  Finalize),.  .  
edd0: 20 20 4c 49 4b 45 46 55 4e 43 28 67 6c 6f 62 2c    LIKEFUNC(glob,
ede0: 20 32 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c 20 53   2, &globInfo, S
edf0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c  QLITE_FUNC_LIKE|
ee00: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45  SQLITE_FUNC_CASE
ee10: 29 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ),.#ifdef SQLITE
ee20: 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f  _CASE_SENSITIVE_
ee30: 4c 49 4b 45 0a 20 20 20 20 4c 49 4b 45 46 55 4e  LIKE.    LIKEFUN
ee40: 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65  C(like, 2, &like
ee50: 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f  InfoAlt, SQLITE_
ee60: 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45  FUNC_LIKE|SQLITE
ee70: 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20 20  _FUNC_CASE),.   
ee80: 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20   LIKEFUNC(like, 
ee90: 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c  3, &likeInfoAlt,
eea0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
eeb0: 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  E|SQLITE_FUNC_CA
eec0: 53 45 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 4c  SE),.#else.    L
eed0: 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c  IKEFUNC(like, 2,
eee0: 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20   &likeInfoNorm, 
eef0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
ef00: 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28  ),.    LIKEFUNC(
ef10: 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e  like, 3, &likeIn
ef20: 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46  foNorm, SQLITE_F
ef30: 55 4e 43 5f 4c 49 4b 45 29 2c 0a 23 65 6e 64 69  UNC_LIKE),.#endi
ef40: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
ef50: 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53  ENABLE_UNKNOWN_S
ef60: 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20  QL_FUNCTION.    
ef70: 46 55 4e 43 54 49 4f 4e 28 75 6e 6b 6e 6f 77 6e  FUNCTION(unknown
ef80: 2c 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20  ,           -1, 
ef90: 30 2c 20 30 2c 20 75 6e 6b 6e 6f 77 6e 46 75 6e  0, 0, unknownFun
efa0: 63 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66  c      ),.#endif
efb0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f  .    FUNCTION(co
efc0: 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20 20  alesce,         
efd0: 20 20 31 2c 20 30 2c 20 30 2c 20 30 20 20 20 20    1, 0, 0, 0    
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20              ),. 
eff0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c     FUNCTION(coal
f000: 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  esce,           
f010: 30 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20  0, 0, 0, 0      
f020: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
f030: 20 46 55 4e 43 54 49 4f 4e 32 28 63 6f 61 6c 65   FUNCTION2(coale
f040: 73 63 65 2c 20 20 20 20 20 20 20 20 20 2d 31 2c  sce,         -1,
f050: 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c   0, 0, noopFunc,
f060: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f    SQLITE_FUNC_CO
f070: 41 4c 45 53 43 45 29 2c 0a 20 20 7d 3b 0a 23 69  ALESCE),.  };.#i
f080: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f090: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 73  T_ALTERTABLE.  s
f0a0: 71 6c 69 74 65 33 41 6c 74 65 72 46 75 6e 63 74  qlite3AlterFunct
f0b0: 69 6f 6e 73 28 29 3b 0a 23 65 6e 64 69 66 0a 23  ions();.#endif.#
f0c0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
f0d0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20  E_ENABLE_STAT3) 
f0e0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
f0f0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 0a  E_ENABLE_STAT4).
f100: 20 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65    sqlite3Analyze
f110: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 65 6e  Functions();.#en
f120: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 67  dif.  sqlite3Reg
f130: 69 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e  isterDateTimeFun
f140: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 73 71 6c 69  ctions();.  sqli
f150: 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69 6e  te3InsertBuiltin
f160: 46 75 6e 63 73 28 61 42 75 69 6c 74 69 6e 46 75  Funcs(aBuiltinFu
f170: 6e 63 2c 20 41 72 72 61 79 53 69 7a 65 28 61 42  nc, ArraySize(aB
f180: 75 69 6c 74 69 6e 46 75 6e 63 29 29 3b 0a 0a 23  uiltinFunc));..#
f190: 69 66 20 30 20 20 2f 2a 20 45 6e 61 62 6c 65 20  if 0  /* Enable 
f1a0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 68 6f 77  to print out how
f1b0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75   the built-in fu
f1c0: 6e 63 74 69 6f 6e 73 20 61 72 65 20 68 61 73 68  nctions are hash
f1d0: 65 64 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 69 6e  ed */.  {.    in
f1e0: 74 20 69 3b 0a 20 20 20 20 46 75 6e 63 44 65 66  t i;.    FuncDef
f1f0: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
f200: 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ; i<SQLITE_FUNC_
f210: 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29 7b 0a 20  HASH_SZ; i++){. 
f220: 20 20 20 20 20 70 72 69 6e 74 66 28 22 46 55 4e       printf("FUN
f230: 43 2d 48 41 53 48 20 25 30 32 64 3a 22 2c 20 69  C-HASH %02d:", i
f240: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73  );.      for(p=s
f250: 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e  qlite3BuiltinFun
f260: 63 74 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20  ctions.a[i]; p; 
f270: 70 3d 70 2d 3e 75 2e 70 48 61 73 68 29 7b 0a 20  p=p->u.pHash){. 
f280: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73         int n = s
f290: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
f2a0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
f2b0: 20 20 69 6e 74 20 68 20 3d 20 70 2d 3e 7a 4e 61    int h = p->zNa
f2c0: 6d 65 5b 30 5d 20 2b 20 6e 3b 0a 20 20 20 20 20  me[0] + n;.     
f2d0: 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 28 25     printf(" %s(%
f2e0: 64 29 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 68  d)", p->zName, h
f2f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f300: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
f310: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f320: 7d 0a                                            }.