/ Hex Artifact Content
Login

Artifact 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8:


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 3c 6d 61 74 68 2e 68 3e 0a 23 69 6e 63 6c  e <math.h>.#incl
0290: 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a  ude "vdbeInt.h".
02a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
02b0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
02c0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
02d0: 77 69 74 68 20 61 20 66 75 6e 63 74 69 6f 6e 2e  with a function.
02e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
02f0: 65 71 20 2a 73 71 6c 69 74 65 33 47 65 74 46 75  eq *sqlite3GetFu
0300: 6e 63 43 6f 6c 6c 53 65 71 28 73 71 6c 69 74 65  ncCollSeq(sqlite
0310: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
0320: 78 74 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70  xt){.  VdbeOp *p
0330: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f  Op;.  assert( co
0340: 6e 74 65 78 74 2d 3e 70 56 64 62 65 21 3d 30 20  ntext->pVdbe!=0 
0350: 29 3b 0a 20 20 70 4f 70 20 3d 20 26 63 6f 6e 74  );.  pOp = &cont
0360: 65 78 74 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b  ext->pVdbe->aOp[
0370: 63 6f 6e 74 65 78 74 2d 3e 69 4f 70 2d 31 5d 3b  context->iOp-1];
0380: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
0390: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53  opcode==OP_CollS
03a0: 65 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  eq );.  assert( 
03b0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
03c0: 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 72 65 74  COLLSEQ );.  ret
03d0: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  urn pOp->p4.pCol
03e0: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  l;.}../*.** Indi
03f0: 63 61 74 65 20 74 68 61 74 20 74 68 65 20 61 63  cate that the ac
0400: 63 75 6d 75 6c 61 74 6f 72 20 6c 6f 61 64 20 73  cumulator load s
0410: 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64  hould be skipped
0420: 20 6f 6e 20 74 68 69 73 0a 2a 2a 20 69 74 65 72   on this.** iter
0430: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 67 67  ation of the agg
0440: 72 65 67 61 74 65 20 6c 6f 6f 70 2e 0a 2a 2f 0a  regate loop..*/.
0450: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
0460: 74 65 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74  te3SkipAccumulat
0470: 6f 72 4c 6f 61 64 28 73 71 6c 69 74 65 33 5f 63  orLoad(sqlite3_c
0480: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
0490: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 6e 74  {.  assert( cont
04a0: 65 78 74 2d 3e 69 73 45 72 72 6f 72 3c 3d 30 20  ext->isError<=0 
04b0: 29 3b 0a 20 20 63 6f 6e 74 65 78 74 2d 3e 69 73  );.  context->is
04c0: 45 72 72 6f 72 20 3d 20 2d 31 3b 0a 20 20 63 6f  Error = -1;.  co
04d0: 6e 74 65 78 74 2d 3e 73 6b 69 70 46 6c 61 67 20  ntext->skipFlag 
04e0: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  = 1;.}../*.** Im
04f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0500: 74 68 65 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  the non-aggregat
0510: 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28  e min() and max(
0520: 29 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2f 0a 73  ) functions.*/.s
0530: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61  tatic void minma
0540: 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  xFunc(.  sqlite3
0550: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
0560: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
0570: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0580: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
0590: 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 20 20 20  ;.  int mask;   
05a0: 20 2f 2a 20 30 20 66 6f 72 20 6d 69 6e 28 29 20   /* 0 for min() 
05b0: 6f 72 20 30 78 66 66 66 66 66 66 66 66 20 66 6f  or 0xffffffff fo
05c0: 72 20 6d 61 78 28 29 20 2a 2f 0a 20 20 69 6e 74  r max() */.  int
05d0: 20 69 42 65 73 74 3b 0a 20 20 43 6f 6c 6c 53 65   iBest;.  CollSe
05e0: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 61 73 73  q *pColl;..  ass
05f0: 65 72 74 28 20 61 72 67 63 3e 31 20 29 3b 0a 20  ert( argc>1 );. 
0600: 20 6d 61 73 6b 20 3d 20 73 71 6c 69 74 65 33 5f   mask = sqlite3_
0610: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
0620: 74 29 3d 3d 30 20 3f 20 30 20 3a 20 2d 31 3b 0a  t)==0 ? 0 : -1;.
0630: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
0640: 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28  3GetFuncCollSeq(
0650: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61 73 73 65  context);.  asse
0660: 72 74 28 20 70 43 6f 6c 6c 20 29 3b 0a 20 20 61  rt( pColl );.  a
0670: 73 73 65 72 74 28 20 6d 61 73 6b 3d 3d 2d 31 20  ssert( mask==-1 
0680: 7c 7c 20 6d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20  || mask==0 );.  
0690: 69 42 65 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  iBest = 0;.  if(
06a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
06b0: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
06c0: 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75  LITE_NULL ) retu
06d0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  rn;.  for(i=1; i
06e0: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
06f0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
0700: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29  ue_type(argv[i])
0710: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
0720: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
0730: 28 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61  (sqlite3MemCompa
0740: 72 65 28 61 72 67 76 5b 69 42 65 73 74 5d 2c 20  re(argv[iBest], 
0750: 61 72 67 76 5b 69 5d 2c 20 70 43 6f 6c 6c 29 5e  argv[i], pColl)^
0760: 6d 61 73 6b 29 3e 3d 30 20 29 7b 0a 20 20 20 20  mask)>=0 ){.    
0770: 20 20 74 65 73 74 63 61 73 65 28 20 6d 61 73 6b    testcase( mask
0780: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 42 65  ==0 );.      iBe
0790: 73 74 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  st = i;.    }.  
07a0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
07b0: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
07c0: 2c 20 61 72 67 76 5b 69 42 65 73 74 5d 29 3b 0a  , argv[iBest]);.
07d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
07e0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20  the type of the 
07f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
0800: 74 69 63 20 76 6f 69 64 20 74 79 70 65 6f 66 46  tic void typeofF
0810: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
0820: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
0830: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
0840: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
0850: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74 61 74  **argv.){.  stat
0860: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
0870: 7a 54 79 70 65 5b 5d 20 3d 20 7b 20 22 69 6e 74  zType[] = { "int
0880: 65 67 65 72 22 2c 20 22 72 65 61 6c 22 2c 20 22  eger", "real", "
0890: 74 65 78 74 22 2c 20 22 62 6c 6f 62 22 2c 20 22  text", "blob", "
08a0: 6e 75 6c 6c 22 20 7d 3b 0a 20 20 69 6e 74 20 69  null" };.  int i
08b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
08c0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 2d  _type(argv[0]) -
08d0: 20 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   1;.  UNUSED_PAR
08e0: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
08f0: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
0900: 26 26 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  && i<ArraySize(a
0910: 7a 54 79 70 65 29 20 29 3b 0a 20 20 61 73 73 65  zType) );.  asse
0920: 72 74 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  rt( SQLITE_INTEG
0930: 45 52 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ER==1 );.  asser
0940: 74 28 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3d  t( SQLITE_FLOAT=
0950: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
0960: 53 51 4c 49 54 45 5f 54 45 58 54 3d 3d 33 20 29  SQLITE_TEXT==3 )
0970: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
0980: 54 45 5f 42 4c 4f 42 3d 3d 34 20 29 3b 0a 20 20  TE_BLOB==4 );.  
0990: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4e  assert( SQLITE_N
09a0: 55 4c 4c 3d 3d 35 20 29 3b 0a 20 20 2f 2a 20 45  ULL==5 );.  /* E
09b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
09c0: 34 37 30 2d 36 30 34 38 32 20 54 68 65 20 73 71  470-60482 The sq
09d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
09e0: 28 56 29 20 69 6e 74 65 72 66 61 63 65 20 72 65  (V) interface re
09f0: 74 75 72 6e 73 0a 20 20 2a 2a 20 74 68 65 20 64  turns.  ** the d
0a00: 61 74 61 74 79 70 65 20 63 6f 64 65 20 66 6f 72  atatype code for
0a10: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   the initial dat
0a20: 61 74 79 70 65 20 6f 66 20 74 68 65 20 73 71 6c  atype of the sql
0a30: 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63  ite3_value objec
0a40: 74 0a 20 20 2a 2a 20 56 2e 20 54 68 65 20 72 65  t.  ** V. The re
0a50: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
0a60: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e  one of SQLITE_IN
0a70: 54 45 47 45 52 2c 20 53 51 4c 49 54 45 5f 46 4c  TEGER, SQLITE_FL
0a80: 4f 41 54 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  OAT,.  ** SQLITE
0a90: 5f 54 45 58 54 2c 20 53 51 4c 49 54 45 5f 42 4c  _TEXT, SQLITE_BL
0aa0: 4f 42 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 55  OB, or SQLITE_NU
0ab0: 4c 4c 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  LL. */.  sqlite3
0ac0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
0ad0: 74 65 78 74 2c 20 61 7a 54 79 70 65 5b 69 5d 2c  text, azType[i],
0ae0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
0af0: 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  IC);.}.../*.** I
0b00: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
0b10: 20 74 68 65 20 6c 65 6e 67 74 68 28 29 20 66 75   the length() fu
0b20: 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  nction.*/.static
0b30: 20 76 6f 69 64 20 6c 65 6e 67 74 68 46 75 6e 63   void lengthFunc
0b40: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
0b50: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
0b60: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
0b70: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
0b80: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72  .){.  assert( ar
0b90: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
0ba0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
0bb0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  );.  switch( sql
0bc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
0bd0: 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20  argv[0]) ){.    
0be0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
0bf0: 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
0c00: 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  E_INTEGER:.    c
0c10: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
0c20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
0c30: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
0c40: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
0c50: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
0c60: 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ]));.      break
0c70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
0c80: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a   SQLITE_TEXT: {.
0c90: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
0ca0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73  gned char *z = s
0cb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
0cc0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
0cd0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
0ce0: 20 63 68 61 72 20 2a 7a 30 3b 0a 20 20 20 20 20   char *z0;.     
0cf0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
0d00: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30  ;.      if( z==0
0d10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
0d20: 20 7a 30 20 3d 20 7a 3b 0a 20 20 20 20 20 20 77   z0 = z;.      w
0d30: 68 69 6c 65 28 20 28 63 20 3d 20 2a 7a 29 21 3d  hile( (c = *z)!=
0d40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 2b 2b  0 ){.        z++
0d50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3e  ;.        if( c>
0d60: 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 20  =0xc0 ){.       
0d70: 20 20 20 77 68 69 6c 65 28 20 28 2a 7a 20 26 20     while( (*z & 
0d80: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 20 7a  0xc0)==0x80 ){ z
0d90: 2b 2b 3b 20 7a 30 2b 2b 3b 20 7d 0a 20 20 20 20  ++; z0++; }.    
0da0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
0db0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0dc0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
0dd0: 28 69 6e 74 29 28 7a 2d 7a 30 29 29 3b 0a 20 20  (int)(z-z0));.  
0de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0df0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
0e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0e10: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
0e20: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
0e30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
0e40: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
0e50: 6f 6e 20 6f 66 20 74 68 65 20 61 62 73 28 29 20  on of the abs() 
0e60: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
0e70: 49 4d 50 3a 20 52 2d 32 33 39 37 39 2d 32 36 38  IMP: R-23979-268
0e80: 35 35 20 54 68 65 20 61 62 73 28 58 29 20 66 75  55 The abs(X) fu
0e90: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
0ea0: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
0eb0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 75 6d 65  e of.** the nume
0ec0: 72 69 63 20 61 72 67 75 6d 65 6e 74 20 58 2e 20  ric argument X. 
0ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0ee0: 61 62 73 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  absFunc(sqlite3_
0ef0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0f00: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
0f10: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
0f20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ){.  assert( arg
0f30: 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==1 );.  UNUSED
0f40: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
0f50: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
0f60: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
0f70: 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63  rgv[0]) ){.    c
0f80: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
0f90: 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20  ER: {.      i64 
0fa0: 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  iVal = sqlite3_v
0fb0: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
0fc0: 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  0]);.      if( i
0fd0: 56 61 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Val<0 ){.       
0fe0: 20 69 66 28 20 69 56 61 6c 3d 3d 53 4d 41 4c 4c   if( iVal==SMALL
0ff0: 45 53 54 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20  EST_INT64 ){.   
1000: 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
1010: 2d 33 31 36 37 36 2d 34 35 35 30 39 20 49 66 20  -31676-45509 If 
1020: 58 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72  X is the integer
1030: 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37   -92233720368547
1040: 37 35 38 30 38 0a 20 20 20 20 20 20 20 20 20 20  75808.          
1050: 2a 2a 20 74 68 65 6e 20 61 62 73 28 58 29 20 74  ** then abs(X) t
1060: 68 72 6f 77 73 20 61 6e 20 69 6e 74 65 67 65 72  hrows an integer
1070: 20 6f 76 65 72 66 6c 6f 77 20 65 72 72 6f 72 20   overflow error 
1080: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  since there is n
1090: 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  o.          ** e
10a0: 71 75 69 76 61 6c 65 6e 74 20 70 6f 73 69 74 69  quivalent positi
10b0: 76 65 20 36 34 2d 62 69 74 20 74 77 6f 20 63 6f  ve 64-bit two co
10c0: 6d 70 6c 65 6d 65 6e 74 20 76 61 6c 75 65 2e 20  mplement value. 
10d0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
10e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
10f0: 72 28 63 6f 6e 74 65 78 74 2c 20 22 69 6e 74 65  r(context, "inte
1100: 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c 20 2d  ger overflow", -
1110: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  1);.          re
1120: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
1130: 20 20 20 20 20 20 20 20 69 56 61 6c 20 3d 20 2d          iVal = -
1140: 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d 20 0a 20  iVal;.      } . 
1150: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1160: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
1170: 74 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, iVal);.      
1180: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1190: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
11a0: 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d  L: {.      /* IM
11b0: 50 3a 20 52 2d 33 37 34 33 34 2d 31 39 39 32 39  P: R-37434-19929
11c0: 20 41 62 73 28 58 29 20 72 65 74 75 72 6e 73 20   Abs(X) returns 
11d0: 4e 55 4c 4c 20 69 66 20 58 20 69 73 20 4e 55 4c  NULL if X is NUL
11e0: 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  L. */.      sqli
11f0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
1200: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
1210: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1220: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1230: 20 20 2f 2a 20 42 65 63 61 75 73 65 20 73 71 6c    /* Because sql
1240: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
1250: 65 28 29 20 72 65 74 75 72 6e 73 20 30 2e 30 20  e() returns 0.0 
1260: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
1270: 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  is not.      ** 
1280: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63  something that c
1290: 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  an be converted 
12a0: 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2c 20 77  into a number, w
12b0: 65 20 68 61 76 65 3a 0a 20 20 20 20 20 20 2a 2a  e have:.      **
12c0: 20 49 4d 50 3a 20 52 2d 30 31 39 39 32 2d 30 30   IMP: R-01992-00
12d0: 35 31 39 20 41 62 73 28 58 29 20 72 65 74 75 72  519 Abs(X) retur
12e0: 6e 73 20 30 2e 30 20 69 66 20 58 20 69 73 20 61  ns 0.0 if X is a
12f0: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 0a   string or blob.
1300: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61        ** that ca
1310: 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65  nnot be converte
1320: 64 20 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 76  d to a numeric v
1330: 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  alue..      */. 
1340: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c       double rVal
1350: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1360: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29  _double(argv[0])
1370: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 56 61 6c  ;.      if( rVal
1380: 3c 30 20 29 20 72 56 61 6c 20 3d 20 2d 72 56 61  <0 ) rVal = -rVa
1390: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
13a0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
13b0: 6f 6e 74 65 78 74 2c 20 72 56 61 6c 29 3b 0a 20  ontext, rVal);. 
13c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13d0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
13e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
13f0: 20 74 68 65 20 69 6e 73 74 72 28 29 20 66 75 6e   the instr() fun
1400: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73  ction..**.** ins
1410: 74 72 28 68 61 79 73 74 61 63 6b 2c 6e 65 65 64  tr(haystack,need
1420: 6c 65 29 20 66 69 6e 64 73 20 74 68 65 20 66 69  le) finds the fi
1430: 72 73 74 20 6f 63 63 75 72 72 65 6e 63 65 20 6f  rst occurrence o
1440: 66 20 6e 65 65 64 6c 65 0a 2a 2a 20 69 6e 20 68  f needle.** in h
1450: 61 79 73 74 61 63 6b 20 61 6e 64 20 72 65 74 75  aystack and retu
1460: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1470: 66 20 70 72 65 76 69 6f 75 73 20 63 68 61 72 61  f previous chara
1480: 63 74 65 72 73 20 70 6c 75 73 20 31 2c 0a 2a 2a  cters plus 1,.**
1490: 20 6f 72 20 30 20 69 66 20 6e 65 65 64 6c 65 20   or 0 if needle 
14a0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 77  does not occur w
14b0: 69 74 68 69 6e 20 68 61 79 73 74 61 63 6b 2e 0a  ithin haystack..
14c0: 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 68 61  **.** If both ha
14d0: 79 73 74 61 63 6b 20 61 6e 64 20 6e 65 65 64 6c  ystack and needl
14e0: 65 20 61 72 65 20 42 4c 4f 42 73 2c 20 74 68 65  e are BLOBs, the
14f0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
1500: 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
1510: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1520: 79 74 65 73 20 69 6e 20 68 61 79 73 74 61 63 6b  ytes in haystack
1530: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
1540: 72 73 74 20 6f 63 63 75 72 72 65 6e 63 65 20 6f  rst occurrence o
1550: 66 20 6e 65 65 64 6c 65 2c 0a 2a 2a 20 6f 72 20  f needle,.** or 
1560: 30 20 69 66 20 6e 65 65 64 6c 65 20 6e 65 76 65  0 if needle neve
1570: 72 20 6f 63 63 75 72 73 20 69 6e 20 68 61 79 73  r occurs in hays
1580: 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tack..*/.static 
1590: 76 6f 69 64 20 69 6e 73 74 72 46 75 6e 63 28 0a  void instrFunc(.
15a0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
15b0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
15c0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
15d0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
15e0: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
15f0: 65 64 20 63 68 61 72 20 2a 7a 48 61 79 73 74 61  ed char *zHaysta
1600: 63 6b 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ck;.  const unsi
1610: 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e 65 65 64  gned char *zNeed
1620: 6c 65 3b 0a 20 20 69 6e 74 20 6e 48 61 79 73 74  le;.  int nHayst
1630: 61 63 6b 3b 0a 20 20 69 6e 74 20 6e 4e 65 65 64  ack;.  int nNeed
1640: 6c 65 3b 0a 20 20 69 6e 74 20 74 79 70 65 48 61  le;.  int typeHa
1650: 79 73 74 61 63 6b 2c 20 74 79 70 65 4e 65 65 64  ystack, typeNeed
1660: 6c 65 3b 0a 20 20 69 6e 74 20 4e 20 3d 20 31 3b  le;.  int N = 1;
1670: 0a 20 20 69 6e 74 20 69 73 54 65 78 74 3b 0a 20  .  int isText;. 
1680: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66   unsigned char f
1690: 69 72 73 74 43 68 61 72 3b 0a 0a 20 20 55 4e 55  irstChar;..  UNU
16a0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
16b0: 67 63 29 3b 0a 20 20 74 79 70 65 48 61 79 73 74  gc);.  typeHayst
16c0: 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ack = sqlite3_va
16d0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
16e0: 29 3b 0a 20 20 74 79 70 65 4e 65 65 64 6c 65 20  );.  typeNeedle 
16f0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1700: 74 79 70 65 28 61 72 67 76 5b 31 5d 29 3b 0a 20  type(argv[1]);. 
1710: 20 69 66 28 20 74 79 70 65 48 61 79 73 74 61 63   if( typeHaystac
1720: 6b 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c  k==SQLITE_NULL |
1730: 7c 20 74 79 70 65 4e 65 65 64 6c 65 3d 3d 53 51  | typeNeedle==SQ
1740: 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75  LITE_NULL ) retu
1750: 72 6e 3b 0a 20 20 6e 48 61 79 73 74 61 63 6b 20  rn;.  nHaystack 
1760: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1770: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
1780: 20 20 6e 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69    nNeedle = sqli
1790: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
17a0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  argv[1]);.  if( 
17b0: 6e 4e 65 65 64 6c 65 3e 30 20 29 7b 0a 20 20 20  nNeedle>0 ){.   
17c0: 20 69 66 28 20 74 79 70 65 48 61 79 73 74 61 63   if( typeHaystac
17d0: 6b 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  k==SQLITE_BLOB &
17e0: 26 20 74 79 70 65 4e 65 65 64 6c 65 3d 3d 53 51  & typeNeedle==SQ
17f0: 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
1800: 20 20 20 7a 48 61 79 73 74 61 63 6b 20 3d 20 73     zHaystack = 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 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
1830: 20 20 7a 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69    zNeedle = sqli
1840: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
1850: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  rgv[1]);.      i
1860: 73 54 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  sText = 0;.    }
1870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 48 61 79  else{.      zHay
1880: 73 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  stack = sqlite3_
1890: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
18a0: 30 5d 29 3b 0a 20 20 20 20 20 20 7a 4e 65 65 64  0]);.      zNeed
18b0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
18c0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
18d0: 3b 0a 20 20 20 20 20 20 69 73 54 65 78 74 20 3d  ;.      isText =
18e0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
18f0: 28 20 7a 4e 65 65 64 6c 65 3d 3d 30 20 7c 7c 20  ( zNeedle==0 || 
1900: 28 6e 48 61 79 73 74 61 63 6b 20 26 26 20 7a 48  (nHaystack && zH
1910: 61 79 73 74 61 63 6b 3d 3d 30 29 20 29 20 72 65  aystack==0) ) re
1920: 74 75 72 6e 3b 0a 20 20 20 20 66 69 72 73 74 43  turn;.    firstC
1930: 68 61 72 20 3d 20 7a 4e 65 65 64 6c 65 5b 30 5d  har = zNeedle[0]
1940: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 4e 65  ;.    while( nNe
1950: 65 64 6c 65 3c 3d 6e 48 61 79 73 74 61 63 6b 0a  edle<=nHaystack.
1960: 20 20 20 20 20 20 20 26 26 20 28 7a 48 61 79 73         && (zHays
1970: 74 61 63 6b 5b 30 5d 21 3d 66 69 72 73 74 43 68  tack[0]!=firstCh
1980: 61 72 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 48 61  ar || memcmp(zHa
1990: 79 73 74 61 63 6b 2c 20 7a 4e 65 65 64 6c 65 2c  ystack, zNeedle,
19a0: 20 6e 4e 65 65 64 6c 65 29 21 3d 30 29 0a 20 20   nNeedle)!=0).  
19b0: 20 20 29 7b 0a 20 20 20 20 20 20 4e 2b 2b 3b 0a    ){.      N++;.
19c0: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
19d0: 20 20 6e 48 61 79 73 74 61 63 6b 2d 2d 3b 0a 20    nHaystack--;. 
19e0: 20 20 20 20 20 20 20 7a 48 61 79 73 74 61 63 6b         zHaystack
19f0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  ++;.      }while
1a00: 28 20 69 73 54 65 78 74 20 26 26 20 28 7a 48 61  ( isText && (zHa
1a10: 79 73 74 61 63 6b 5b 30 5d 26 30 78 63 30 29 3d  ystack[0]&0xc0)=
1a20: 3d 30 78 38 30 20 29 3b 0a 20 20 20 20 7d 0a 20  =0x80 );.    }. 
1a30: 20 20 20 69 66 28 20 6e 4e 65 65 64 6c 65 3e 6e     if( nNeedle>n
1a40: 48 61 79 73 74 61 63 6b 20 29 20 4e 20 3d 20 30  Haystack ) N = 0
1a50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1a60: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
1a70: 78 74 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xt, N);.}../*.**
1a80: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1a90: 6f 66 20 74 68 65 20 70 72 69 6e 74 66 28 29 20  of the printf() 
1aa0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
1ab0: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 66 46  tic void printfF
1ac0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1ad0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1ae0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
1af0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1b00: 72 67 76 0a 29 7b 0a 20 20 50 72 69 6e 74 66 41  rgv.){.  PrintfA
1b10: 72 67 75 6d 65 6e 74 73 20 78 3b 0a 20 20 53 74  rguments x;.  St
1b20: 72 41 63 63 75 6d 20 73 74 72 3b 0a 20 20 63 6f  rAccum str;.  co
1b30: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1b40: 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  t;.  int n;.  sq
1b50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
1b60: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
1b70: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
1b80: 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 31 20 26  .  if( argc>=1 &
1b90: 26 20 28 7a 46 6f 72 6d 61 74 20 3d 20 28 63 6f  & (zFormat = (co
1ba0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1bb0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1bc0: 76 5b 30 5d 29 29 21 3d 30 20 29 7b 0a 20 20 20  v[0]))!=0 ){.   
1bd0: 20 78 2e 6e 41 72 67 20 3d 20 61 72 67 63 2d 31   x.nArg = argc-1
1be0: 3b 0a 20 20 20 20 78 2e 6e 55 73 65 64 20 3d 20  ;.    x.nUsed = 
1bf0: 30 3b 0a 20 20 20 20 78 2e 61 70 41 72 67 20 3d  0;.    x.apArg =
1c00: 20 61 72 67 76 2b 31 3b 0a 20 20 20 20 73 71 6c   argv+1;.    sql
1c10: 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
1c20: 28 26 73 74 72 2c 20 64 62 2c 20 30 2c 20 30 2c  (&str, db, 0, 0,
1c30: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
1c40: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
1c50: 29 3b 0a 20 20 20 20 73 74 72 2e 70 72 69 6e 74  );.    str.print
1c60: 66 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  fFlags = SQLITE_
1c70: 50 52 49 4e 54 46 5f 53 51 4c 46 55 4e 43 3b 0a  PRINTF_SQLFUNC;.
1c80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
1c90: 61 70 70 65 6e 64 66 28 26 73 74 72 2c 20 7a 46  appendf(&str, zF
1ca0: 6f 72 6d 61 74 2c 20 26 78 29 3b 0a 20 20 20 20  ormat, &x);.    
1cb0: 6e 20 3d 20 73 74 72 2e 6e 43 68 61 72 3b 0a 20  n = str.nChar;. 
1cc0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1cd0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
1ce0: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
1cf0: 69 6e 69 73 68 28 26 73 74 72 29 2c 20 6e 2c 0a  inish(&str), n,.
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
1d20: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  YNAMIC);.  }.}..
1d30: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1d40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1d50: 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  tr() function..*
1d60: 2a 0a 2a 2a 20 73 75 62 73 74 72 28 78 2c 70 31  *.** substr(x,p1
1d70: 2c 70 32 29 20 20 72 65 74 75 72 6e 73 20 70 32  ,p2)  returns p2
1d80: 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 78   characters of x
1d90: 5b 5d 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  [] beginning wit
1da0: 68 20 70 31 2e 0a 2a 2a 20 70 31 20 69 73 20 31  h p1..** p1 is 1
1db0: 2d 69 6e 64 65 78 65 64 2e 20 20 53 6f 20 73 75  -indexed.  So su
1dc0: 62 73 74 72 28 78 2c 31 2c 31 29 20 72 65 74 75  bstr(x,1,1) retu
1dd0: 72 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 68  rns the first ch
1de0: 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 78 2e  aracter.** of x.
1df0: 20 20 49 66 20 78 20 69 73 20 74 65 78 74 2c 20    If x is text, 
1e00: 74 68 65 6e 20 77 65 20 61 63 74 75 61 6c 6c 79  then we actually
1e10: 20 63 6f 75 6e 74 20 55 54 46 2d 38 20 63 68 61   count UTF-8 cha
1e20: 72 61 63 74 65 72 73 2e 0a 2a 2a 20 49 66 20 78  racters..** If x
1e30: 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 6e   is a blob, then
1e40: 20 77 65 20 63 6f 75 6e 74 20 62 79 74 65 73 2e   we count bytes.
1e50: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 31 20 69 73 20  .**.** If p1 is 
1e60: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 77  negative, then w
1e70: 65 20 62 65 67 69 6e 20 61 62 73 28 70 31 29 20  e begin abs(p1) 
1e80: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
1e90: 78 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 32  x[]..**.** If p2
1ea0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 72 65   is negative, re
1eb0: 74 75 72 6e 20 74 68 65 20 70 32 20 63 68 61 72  turn the p2 char
1ec0: 61 63 74 65 72 73 20 70 72 65 63 65 64 69 6e 67  acters preceding
1ed0: 20 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   p1..*/.static v
1ee0: 6f 69 64 20 73 75 62 73 74 72 46 75 6e 63 28 0a  oid substrFunc(.
1ef0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1f00: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
1f10: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
1f20: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
1f30: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1f40: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f  ed char *z;.  co
1f50: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1f60: 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 6c 65 6e  r *z2;.  int len
1f70: 3b 0a 20 20 69 6e 74 20 70 30 74 79 70 65 3b 0a  ;.  int p0type;.
1f80: 20 20 69 36 34 20 70 31 2c 20 70 32 3b 0a 20 20    i64 p1, p2;.  
1f90: 69 6e 74 20 6e 65 67 50 32 20 3d 20 30 3b 0a 0a  int negP2 = 0;..
1fa0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
1fb0: 33 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a  3 || argc==2 );.
1fc0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
1fd0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d  lue_type(argv[1]
1fe0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20  )==SQLITE_NULL. 
1ff0: 20 20 7c 7c 20 28 61 72 67 63 3d 3d 33 20 26 26    || (argc==3 &&
2000: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2010: 79 70 65 28 61 72 67 76 5b 32 5d 29 3d 3d 53 51  ype(argv[2])==SQ
2020: 4c 49 54 45 5f 4e 55 4c 4c 29 0a 20 20 29 7b 0a  LITE_NULL).  ){.
2030: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2040: 20 20 70 30 74 79 70 65 20 3d 20 73 71 6c 69 74    p0type = sqlit
2050: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
2060: 67 76 5b 30 5d 29 3b 0a 20 20 70 31 20 3d 20 73  gv[0]);.  p1 = s
2070: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2080: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (argv[1]);.  if(
2090: 20 70 30 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f   p0type==SQLITE_
20a0: 42 4c 4f 42 20 29 7b 0a 20 20 20 20 6c 65 6e 20  BLOB ){.    len 
20b0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
20c0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
20d0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
20e0: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
20f0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  0]);.    if( z==
2100: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
2110: 61 73 73 65 72 74 28 20 6c 65 6e 3d 3d 73 71 6c  assert( len==sql
2120: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2130: 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 7d  (argv[0]) );.  }
2140: 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71  else{.    z = sq
2150: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
2160: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
2170: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
2180: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  ;.    len = 0;. 
2190: 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20     if( p1<0 ){. 
21a0: 20 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a       for(z2=z; *
21b0: 7a 32 3b 20 6c 65 6e 2b 2b 29 7b 0a 20 20 20 20  z2; len++){.    
21c0: 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f      SQLITE_SKIP_
21d0: 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 20 20  UTF8(z2);.      
21e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  }.    }.  }.#ifd
21f0: 65 66 20 53 51 4c 49 54 45 5f 53 55 42 53 54 52  ef SQLITE_SUBSTR
2200: 5f 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 0a 20  _COMPATIBILITY. 
2210: 20 2f 2a 20 49 66 20 53 55 42 53 54 52 5f 43 4f   /* If SUBSTR_CO
2220: 4d 50 41 54 49 42 49 4c 49 54 59 20 69 73 20 64  MPATIBILITY is d
2230: 65 66 69 6e 65 64 20 74 68 65 6e 20 73 75 62 73  efined then subs
2240: 74 72 28 58 2c 30 2c 4e 29 20 77 6f 72 6b 20 74  tr(X,0,N) work t
2250: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
2260: 61 73 20 73 75 62 73 74 72 28 58 2c 31 2c 4e 29  as substr(X,1,N)
2270: 20 2d 20 69 74 20 72 65 74 75 72 6e 73 20 74 68   - it returns th
2280: 65 20 66 69 72 73 74 20 4e 20 63 68 61 72 61 63  e first N charac
2290: 74 65 72 73 20 6f 66 20 58 2e 20 20 54 68 69 73  ters of X.  This
22a0: 0a 20 20 2a 2a 20 69 73 20 65 73 73 65 6e 74 69  .  ** is essenti
22b0: 61 6c 6c 79 20 61 20 62 61 63 6b 2d 6f 75 74 20  ally a back-out 
22c0: 6f 66 20 74 68 65 20 62 75 67 2d 66 69 78 20 69  of the bug-fix i
22d0: 6e 20 63 68 65 63 6b 2d 69 6e 20 5b 35 66 63 31  n check-in [5fc1
22e0: 32 35 64 33 36 32 64 66 34 62 38 5d 0a 20 20 2a  25d362df4b8].  *
22f0: 2a 20 66 72 6f 6d 20 32 30 30 39 2d 30 32 2d 30  * from 2009-02-0
2300: 32 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c  2 for compatibil
2310: 69 74 79 20 6f 66 20 61 70 70 6c 69 63 61 74 69  ity of applicati
2320: 6f 6e 73 20 74 68 61 74 20 65 78 70 6c 6f 69 74  ons that exploit
2330: 65 64 20 74 68 65 0a 20 20 2a 2a 20 6f 6c 64 20  ed the.  ** old 
2340: 62 75 67 67 79 20 62 65 68 61 76 69 6f 72 2e 20  buggy behavior. 
2350: 2a 2f 0a 20 20 69 66 28 20 70 31 3d 3d 30 20 29  */.  if( p1==0 )
2360: 20 70 31 20 3d 20 31 3b 20 2f 2a 20 3c 72 64 61   p1 = 1; /* <rda
2370: 72 3a 2f 2f 70 72 6f 62 6c 65 6d 2f 36 37 37 38  r://problem/6778
2380: 33 33 39 3e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  339> */.#endif. 
2390: 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a   if( argc==3 ){.
23a0: 20 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33      p2 = sqlite3
23b0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
23c0: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 32 3c  2]);.    if( p2<
23d0: 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20 3d 20  0 ){.      p2 = 
23e0: 2d 70 32 3b 0a 20 20 20 20 20 20 6e 65 67 50 32  -p2;.      negP2
23f0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2400: 6c 73 65 7b 0a 20 20 20 20 70 32 20 3d 20 73 71  lse{.    p2 = sq
2410: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
2420: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
2430: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
2440: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20  LIMIT_LENGTH];. 
2450: 20 7d 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b   }.  if( p1<0 ){
2460: 0a 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a  .    p1 += len;.
2470: 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a      if( p1<0 ){.
2480: 20 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a        p2 += p1;.
2490: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29        if( p2<0 )
24a0: 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 70   p2 = 0;.      p
24b0: 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 = 0;.    }.  }
24c0: 65 6c 73 65 20 69 66 28 20 70 31 3e 30 20 29 7b  else if( p1>0 ){
24d0: 0a 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 65 6c  .    p1--;.  }el
24e0: 73 65 20 69 66 28 20 70 32 3e 30 20 29 7b 0a 20  se if( p2>0 ){. 
24f0: 20 20 20 70 32 2d 2d 3b 0a 20 20 7d 0a 20 20 69     p2--;.  }.  i
2500: 66 28 20 6e 65 67 50 32 20 29 7b 0a 20 20 20 20  f( negP2 ){.    
2510: 70 31 20 2d 3d 20 70 32 3b 0a 20 20 20 20 69 66  p1 -= p2;.    if
2520: 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( p1<0 ){.      
2530: 70 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20  p2 += p1;.      
2540: 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  p1 = 0;.    }.  
2550: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d  }.  assert( p1>=
2560: 30 20 26 26 20 70 32 3e 3d 30 20 29 3b 0a 20 20  0 && p2>=0 );.  
2570: 69 66 28 20 70 30 74 79 70 65 21 3d 53 51 4c 49  if( p0type!=SQLI
2580: 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 77  TE_BLOB ){.    w
2590: 68 69 6c 65 28 20 2a 7a 20 26 26 20 70 31 20 29  hile( *z && p1 )
25a0: 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53  {.      SQLITE_S
25b0: 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20  KIP_UTF8(z);.   
25c0: 20 20 20 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a 20     p1--;.    }. 
25d0: 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32     for(z2=z; *z2
25e0: 20 26 26 20 70 32 3b 20 70 32 2d 2d 29 7b 0a 20   && p2; p2--){. 
25f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50       SQLITE_SKIP
2600: 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 7d  _UTF8(z2);.    }
2610: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2620: 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65  ult_text64(conte
2630: 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a 32  xt, (char*)z, z2
2640: 2d 7a 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -z, SQLITE_TRANS
2650: 49 45 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20  IENT,.          
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
2680: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
2690: 31 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20 20 20 20  1+p2>len ){.    
26a0: 20 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a 20    p2 = len-p1;. 
26b0: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 20       if( p2<0 ) 
26c0: 70 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  p2 = 0;.    }.  
26d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26e0: 5f 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c  _blob64(context,
26f0: 20 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20   (char*)&z[p1], 
2700: 28 75 36 34 29 70 32 2c 20 53 51 4c 49 54 45 5f  (u64)p2, SQLITE_
2710: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
2720: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2730: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ntation of the r
2740: 6f 75 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a  ound() function.
2750: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2760: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
2770: 50 4f 49 4e 54 0a 73 74 61 74 69 63 20 76 6f 69  POINT.static voi
2780: 64 20 72 6f 75 6e 64 46 75 6e 63 28 73 71 6c 69  d roundFunc(sqli
2790: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
27a0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
27b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
27c0: 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  argv){.  int n =
27d0: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a   0;.  double r;.
27e0: 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20    char *zBuf;.  
27f0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
2800: 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20  || argc==2 );.  
2810: 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20  if( argc==2 ){. 
2820: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55     if( SQLITE_NU
2830: 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL==sqlite3_valu
2840: 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 20  e_type(argv[1]) 
2850: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20  ) return;.    n 
2860: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2870: 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  int(argv[1]);.  
2880: 20 20 69 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d    if( n>30 ) n =
2890: 20 33 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c 30   30;.    if( n<0
28a0: 20 29 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   ) n = 0;.  }.  
28b0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
28c0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
28d0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72  =SQLITE_NULL ) r
28e0: 65 74 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71 6c  eturn;.  r = sql
28f0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
2900: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a  e(argv[0]);.  /*
2910: 20 49 66 20 59 3d 3d 30 20 61 6e 64 20 58 20 77   If Y==0 and X w
2920: 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 36 34 2d  ill fit in a 64-
2930: 62 69 74 20 69 6e 74 2c 0a 20 20 2a 2a 20 68 61  bit int,.  ** ha
2940: 6e 64 6c 65 20 74 68 65 20 72 6f 75 6e 64 69 6e  ndle the roundin
2950: 67 20 64 69 72 65 63 74 6c 79 2c 0a 20 20 2a 2a  g directly,.  **
2960: 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 20 70   otherwise use p
2970: 72 69 6e 74 66 2e 0a 20 20 2a 2f 0a 20 20 69 66  rintf..  */.  if
2980: 28 20 72 3c 2d 34 35 30 33 35 39 39 36 32 37 33  ( r<-45035996273
2990: 37 30 34 39 36 2e 30 20 7c 7c 20 72 3e 2b 34 35  70496.0 || r>+45
29a0: 30 33 35 39 39 36 32 37 33 37 30 34 39 36 2e 30  03599627370496.0
29b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 76   ){.    /* The v
29c0: 61 6c 75 65 20 68 61 73 20 6e 6f 20 66 72 61 63  alue has no frac
29d0: 74 69 6f 6e 61 6c 20 70 61 72 74 20 73 6f 20 74  tional part so t
29e0: 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
29f0: 74 6f 20 72 6f 75 6e 64 20 2a 2f 0a 20 20 7d 65  to round */.  }e
2a00: 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20 29 7b 20  lse if( n==0 ){ 
2a10: 20 0a 20 20 20 20 72 20 3d 20 28 64 6f 75 62 6c   .    r = (doubl
2a20: 65 29 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34  e)((sqlite_int64
2a30: 29 28 72 2b 28 72 3c 30 3f 2d 30 2e 35 3a 2b 30  )(r+(r<0?-0.5:+0
2a40: 2e 35 29 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  .5)));.  }else{.
2a50: 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74      zBuf = sqlit
2a60: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 66  e3_mprintf("%.*f
2a70: 22 2c 6e 2c 72 29 3b 0a 20 20 20 20 69 66 28 20  ",n,r);.    if( 
2a80: 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
2a90: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2aa0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
2ab0: 65 78 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ext);.      retu
2ac0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
2ad0: 6c 69 74 65 33 41 74 6f 46 28 7a 42 75 66 2c 20  lite3AtoF(zBuf, 
2ae0: 26 72 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  &r, sqlite3Strle
2af0: 6e 33 30 28 7a 42 75 66 29 2c 20 53 51 4c 49 54  n30(zBuf), SQLIT
2b00: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 73 71 6c  E_UTF8);.    sql
2b10: 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
2b20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
2b30: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
2b40: 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 23 65 6e 64  text, r);.}.#end
2b50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  if../*.** Alloca
2b60: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
2b70: 66 20 73 70 61 63 65 20 75 73 69 6e 67 20 73 71  f space using sq
2b80: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
2b90: 66 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  f the.** allocat
2ba0: 69 6f 6e 20 66 61 69 6c 73 2c 20 63 61 6c 6c 20  ion fails, call 
2bb0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2bc0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 29 20 74 6f 20  rror_nomem() to 
2bd0: 6e 6f 74 69 66 79 0a 2a 2a 20 74 68 65 20 64 61  notify.** the da
2be0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
2bf0: 61 74 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20  at malloc() has 
2c00: 66 61 69 6c 65 64 20 61 6e 64 20 72 65 74 75 72  failed and retur
2c10: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 6e 42  n NULL..** If nB
2c20: 79 74 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  yte is larger th
2c30: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  an the maximum s
2c40: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6c 65  tring or blob le
2c50: 6e 67 74 68 2c 20 74 68 65 6e 0a 2a 2a 20 72 61  ngth, then.** ra
2c60: 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 54 4f  ise an SQLITE_TO
2c70: 4f 42 49 47 20 65 78 63 65 70 74 69 6f 6e 20 61  OBIG exception a
2c80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
2c90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
2ca0: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 73 71  contextMalloc(sq
2cb0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
2cc0: 6f 6e 74 65 78 74 2c 20 69 36 34 20 6e 42 79 74  ontext, i64 nByt
2cd0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  e){.  char *z;. 
2ce0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
2cf0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
2d00: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
2d10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
2d20: 74 65 3e 30 20 29 3b 0a 20 20 74 65 73 74 63 61  te>0 );.  testca
2d30: 73 65 28 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61  se( nByte==db->a
2d40: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
2d50: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20  IT_LENGTH] );.  
2d60: 74 65 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d  testcase( nByte=
2d70: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
2d80: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
2d90: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  +1 );.  if( nByt
2da0: 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  e>db->aLimit[SQL
2db0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
2dc0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
2dd0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f  _result_error_to
2de0: 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20  obig(context);. 
2df0: 20 20 20 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c 73     z = 0;.  }els
2e00: 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  e{.    z = sqlit
2e10: 65 33 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  e3Malloc(nByte);
2e20: 0a 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20  .    if( !z ){. 
2e30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2e40: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
2e50: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a  context);.    }.
2e60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
2e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2e80: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 75  ntation of the u
2e90: 70 70 65 72 28 29 20 61 6e 64 20 6c 6f 77 65 72  pper() and lower
2ea0: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  () SQL functions
2eb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ec0: 20 75 70 70 65 72 46 75 6e 63 28 73 71 6c 69 74   upperFunc(sqlit
2ed0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
2ee0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
2ef0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2f00: 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31  rgv){.  char *z1
2f10: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2f20: 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  z2;.  int i, n;.
2f30: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2f40: 45 52 28 61 72 67 63 29 3b 0a 20 20 7a 32 20 3d  ER(argc);.  z2 =
2f50: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
2f60: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
2f70: 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  0]);.  n = sqlit
2f80: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
2f90: 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20 56 65  rgv[0]);.  /* Ve
2fa0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 61  rify that the ca
2fb0: 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28 29 20 64  ll to _bytes() d
2fc0: 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c 69 64 61  oes not invalida
2fd0: 74 65 20 74 68 65 20 5f 74 65 78 74 28 29 20 70  te the _text() p
2fe0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61 73 73 65  ointer */.  asse
2ff0: 72 74 28 20 7a 32 3d 3d 28 63 68 61 72 2a 29 73  rt( z2==(char*)s
3000: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
3010: 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20  t(argv[0]) );.  
3020: 69 66 28 20 7a 32 20 29 7b 0a 20 20 20 20 7a 31  if( z2 ){.    z1
3030: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
3040: 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29  (context, ((i64)
3050: 6e 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 7a  n)+1);.    if( z
3060: 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  1 ){.      for(i
3070: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
3080: 20 20 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20 28         z1[i] = (
3090: 63 68 61 72 29 73 71 6c 69 74 65 33 54 6f 75 70  char)sqlite3Toup
30a0: 70 65 72 28 7a 32 5b 69 5d 29 3b 0a 20 20 20 20  per(z2[i]);.    
30b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
30c0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
30d0: 6e 74 65 78 74 2c 20 7a 31 2c 20 6e 2c 20 73 71  ntext, z1, n, sq
30e0: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
30f0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
3100: 76 6f 69 64 20 6c 6f 77 65 72 46 75 6e 63 28 73  void lowerFunc(s
3110: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3120: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
3130: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
3140: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72   **argv){.  char
3150: 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *z1;.  const ch
3160: 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c  ar *z2;.  int i,
3170: 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   n;.  UNUSED_PAR
3180: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
3190: 7a 32 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  z2 = (char*)sqli
31a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
31b0: 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73  rgv[0]);.  n = s
31c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
31d0: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f  es(argv[0]);.  /
31e0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
31f0: 65 20 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73  e call to _bytes
3200: 28 29 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61  () does not inva
3210: 6c 69 64 61 74 65 20 74 68 65 20 5f 74 65 78 74  lidate the _text
3220: 28 29 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  () pointer */.  
3230: 61 73 73 65 72 74 28 20 7a 32 3d 3d 28 63 68 61  assert( z2==(cha
3240: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
3250: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29  _text(argv[0]) )
3260: 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b 0a 20 20  ;.  if( z2 ){.  
3270: 20 20 7a 31 20 3d 20 63 6f 6e 74 65 78 74 4d 61    z1 = contextMa
3280: 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28  lloc(context, ((
3290: 69 36 34 29 6e 29 2b 31 29 3b 0a 20 20 20 20 69  i64)n)+1);.    i
32a0: 66 28 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 66  f( z1 ){.      f
32b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
32c0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b 69 5d  ){.        z1[i]
32d0: 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65   = sqlite3Tolowe
32e0: 72 28 7a 32 5b 69 5d 29 3b 0a 20 20 20 20 20 20  r(z2[i]);.      
32f0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
3300: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
3310: 65 78 74 2c 20 7a 31 2c 20 6e 2c 20 73 71 6c 69  ext, z1, n, sqli
3320: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d  te3_free);.    }
3330: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  .  }.}../*.** So
3340: 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 6c 69 6b  me functions lik
3350: 65 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  e COALESCE() and
3360: 20 49 46 4e 55 4c 4c 28 29 20 61 6e 64 20 55 4e   IFNULL() and UN
3370: 4c 49 4b 45 4c 59 28 29 20 61 72 65 20 69 6d 70  LIKELY() are imp
3380: 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 56  lemented.** as V
3390: 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74  DBE code so that
33a0: 20 75 6e 75 73 65 64 20 61 72 67 75 6d 65 6e 74   unused argument
33b0: 20 76 61 6c 75 65 73 20 64 6f 20 6e 6f 74 20 68   values do not h
33c0: 61 76 65 20 74 6f 20 62 65 20 63 6f 6d 70 75 74  ave to be comput
33d0: 65 64 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ed..** However, 
33e0: 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 73 6f  we still need so
33f0: 6d 65 20 6b 69 6e 64 20 6f 66 20 66 75 6e 63 74  me kind of funct
3400: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ion implementati
3410: 6f 6e 20 66 6f 72 20 74 68 69 73 0a 2a 2a 20 72  on for this.** r
3420: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 65 20 66  outines in the f
3430: 75 6e 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20  unction table.  
3440: 54 68 65 20 6e 6f 6f 70 46 75 6e 63 20 6d 61 63  The noopFunc mac
3450: 72 6f 20 70 72 6f 76 69 64 65 73 20 74 68 69 73  ro provides this
3460: 2e 0a 2a 2a 20 6e 6f 6f 70 46 75 6e 63 20 77 69  ..** noopFunc wi
3470: 6c 6c 20 6e 65 76 65 72 20 62 65 20 63 61 6c 6c  ll never be call
3480: 65 64 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  ed so it doesn't
3490: 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65   matter what the
34a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
34b0: 2a 2a 20 69 73 2e 20 20 57 65 20 6d 69 67 68 74  ** is.  We might
34c0: 20 61 73 20 77 65 6c 6c 20 75 73 65 20 74 68 65   as well use the
34d0: 20 22 76 65 72 73 69 6f 6e 28 29 22 20 66 75 6e   "version()" fun
34e0: 63 74 69 6f 6e 20 61 73 20 61 20 73 75 62 73 74  ction as a subst
34f0: 69 74 75 74 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  itute..*/.#defin
3500: 65 20 6e 6f 6f 70 46 75 6e 63 20 76 65 72 73 69  e noopFunc versi
3510: 6f 6e 46 75 6e 63 20 20 20 2f 2a 20 53 75 62 73  onFunc   /* Subs
3520: 74 69 74 75 74 65 20 66 75 6e 63 74 69 6f 6e 20  titute function 
3530: 2d 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 2a  - never called *
3540: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
3550: 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f  ntation of rando
3560: 6d 28 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72  m().  Return a r
3570: 61 6e 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20 20  andom integer.  
3580: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3590: 72 61 6e 64 6f 6d 46 75 6e 63 28 0a 20 20 73 71  randomFunc(.  sq
35a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
35b0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
35c0: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
35d0: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
35e0: 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e  2.){.  sqlite_in
35f0: 74 36 34 20 72 3b 0a 20 20 55 4e 55 53 45 44 5f  t64 r;.  UNUSED_
3600: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
3610: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
3620: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
3630: 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26  ess(sizeof(r), &
3640: 72 29 3b 0a 20 20 69 66 28 20 72 3c 30 20 29 7b  r);.  if( r<0 ){
3650: 0a 20 20 20 20 2f 2a 20 57 65 20 6e 65 65 64 20  .    /* We need 
3660: 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 61 6e  to prevent a ran
3670: 64 6f 6d 20 6e 75 6d 62 65 72 20 6f 66 20 30 78  dom number of 0x
3680: 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30  8000000000000000
3690: 20 0a 20 20 20 20 2a 2a 20 28 6f 72 20 2d 39 32   .    ** (or -92
36a0: 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
36b0: 38 29 20 73 69 6e 63 65 20 77 68 65 6e 20 79 6f  8) since when yo
36c0: 75 20 64 6f 20 61 62 73 28 29 20 6f 66 20 74 68  u do abs() of th
36d0: 61 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  at.    ** number
36e0: 20 6f 66 20 79 6f 75 20 67 65 74 20 74 68 65 20   of you get the 
36f0: 73 61 6d 65 20 76 61 6c 75 65 20 62 61 63 6b 20  same value back 
3700: 61 67 61 69 6e 2e 20 20 54 6f 20 64 6f 20 74 68  again.  To do th
3710: 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 77  is.    ** in a w
3720: 61 79 20 74 68 61 74 20 69 73 20 74 65 73 74 61  ay that is testa
3730: 62 6c 65 2c 20 6d 61 73 6b 20 74 68 65 20 73 69  ble, mask the si
3740: 67 6e 20 62 69 74 20 6f 66 66 20 6f 66 20 6e 65  gn bit off of ne
3750: 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 76 61  gative.    ** va
3760: 6c 75 65 73 2c 20 72 65 73 75 6c 74 69 6e 67 20  lues, resulting 
3770: 69 6e 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  in a positive va
3780: 6c 75 65 2e 20 20 54 68 65 6e 20 74 61 6b 65 20  lue.  Then take 
3790: 74 68 65 20 0a 20 20 20 20 2a 2a 20 32 73 20 63  the .    ** 2s c
37a0: 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 61  omplement of tha
37b0: 74 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  t positive value
37c0: 2e 20 20 54 68 65 20 65 6e 64 20 72 65 73 75 6c  .  The end resul
37d0: 74 20 63 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65  t can.    ** the
37e0: 72 65 66 6f 72 65 20 62 65 20 6e 6f 20 6c 65 73  refore be no les
37f0: 73 20 74 68 61 6e 20 2d 39 32 32 33 33 37 32 30  s than -92233720
3800: 33 36 38 35 34 37 37 35 38 30 37 2e 0a 20 20 20  36854775807..   
3810: 20 2a 2f 0a 20 20 20 20 72 20 3d 20 2d 28 72 20   */.    r = -(r 
3820: 26 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 29  & LARGEST_INT64)
3830: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
3840: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
3850: 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a  text, r);.}../*.
3860: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3870: 6e 20 6f 66 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  n of randomblob(
3880: 4e 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61  N).  Return a ra
3890: 6e 64 6f 6d 20 62 6c 6f 62 0a 2a 2a 20 74 68 61  ndom blob.** tha
38a0: 74 20 69 73 20 4e 20 62 79 74 65 73 20 6c 6f 6e  t is N bytes lon
38b0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
38c0: 64 20 72 61 6e 64 6f 6d 42 6c 6f 62 28 0a 20 20  d randomBlob(.  
38d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
38e0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
38f0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
3900: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
3910: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
3920: 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  n;.  unsigned ch
3930: 61 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  ar *p;.  assert(
3940: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
3950: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
3960: 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  rgc);.  n = sqli
3970: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
3980: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
3990: 6e 3c 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 31  n<1 ){.    n = 1
39a0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 63 6f 6e 74  ;.  }.  p = cont
39b0: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
39c0: 74 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70 20 29  t, n);.  if( p )
39d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  {.    sqlite3_ra
39e0: 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a  ndomness(n, p);.
39f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3a00: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
3a10: 20 28 63 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71   (char*)p, n, sq
3a20: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
3a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
3a40: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3a50: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
3a60: 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  d() SQL function
3a70: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a  .  The return.**
3a80: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
3a90: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
3aa0: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
3ab0: 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69  wid() API functi
3ac0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
3ad0: 69 64 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  id last_insert_r
3ae0: 6f 77 69 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  owid(.  sqlite3_
3af0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3b00: 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64  , .  int NotUsed
3b10: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
3b20: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
3b30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3b40: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3b50: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
3b60: 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  xt);.  UNUSED_PA
3b70: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
3b80: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f  , NotUsed2);.  /
3b90: 2a 20 49 4d 50 3a 20 52 2d 35 31 35 31 33 2d 31  * IMP: R-51513-1
3ba0: 32 30 32 36 20 54 68 65 20 6c 61 73 74 5f 69 6e  2026 The last_in
3bb0: 73 65 72 74 5f 72 6f 77 69 64 28 29 20 53 51 4c  sert_rowid() SQL
3bc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 20   function is a. 
3bd0: 20 2a 2a 20 77 72 61 70 70 65 72 20 61 72 6f 75   ** wrapper arou
3be0: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  nd the sqlite3_l
3bf0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
3c00: 28 29 20 43 2f 43 2b 2b 20 69 6e 74 65 72 66 61  () C/C++ interfa
3c10: 63 65 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ce.  ** function
3c20: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  . */.  sqlite3_r
3c30: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
3c40: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73  ext, sqlite3_las
3c50: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64  t_insert_rowid(d
3c60: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  b));.}../*.** Im
3c70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
3c80: 74 68 65 20 63 68 61 6e 67 65 73 28 29 20 53 51  the changes() SQ
3c90: 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  L function..**.*
3ca0: 2a 20 49 4d 50 3a 20 52 2d 36 32 30 37 33 2d 31  * IMP: R-62073-1
3cb0: 31 32 30 39 20 54 68 65 20 63 68 61 6e 67 65 73  1209 The changes
3cc0: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
3cd0: 69 73 20 61 20 77 72 61 70 70 65 72 0a 2a 2a 20  is a wrapper.** 
3ce0: 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74  around the sqlit
3cf0: 65 33 5f 63 68 61 6e 67 65 73 28 29 20 43 2f 43  e3_changes() C/C
3d00: 2b 2b 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  ++ function and 
3d10: 68 65 6e 63 65 20 66 6f 6c 6c 6f 77 73 20 74 68  hence follows th
3d20: 65 20 73 61 6d 65 0a 2a 2a 20 72 75 6c 65 73 20  e same.** rules 
3d30: 66 6f 72 20 63 6f 75 6e 74 69 6e 67 20 63 68 61  for counting cha
3d40: 6e 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nges..*/.static 
3d50: 76 6f 69 64 20 63 68 61 6e 67 65 73 28 0a 20 20  void changes(.  
3d60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3d70: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
3d80: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
3d90: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
3da0: 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ed2.){.  sqlite3
3db0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
3dc0: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
3dd0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55  (context);.  UNU
3de0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
3df0: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
3e00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
3e10: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
3e20: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
3e30: 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (db));.}../*.** 
3e40: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
3e50: 66 20 74 68 65 20 74 6f 74 61 6c 5f 63 68 61 6e  f the total_chan
3e60: 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ges() SQL functi
3e70: 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  on.  The return 
3e80: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20  value is.** the 
3e90: 73 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69  same as the sqli
3ea0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
3eb0: 73 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  s() API function
3ec0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ed0: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 0a   total_changes(.
3ee0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3ef0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
3f00: 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c  t NotUsed,.  sql
3f10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74  ite3_value **Not
3f20: 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74  Used2.){.  sqlit
3f30: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
3f40: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
3f50: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55  le(context);.  U
3f60: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
3f70: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
3f80: 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52  d2);.  /* IMP: R
3f90: 2d 35 32 37 35 36 2d 34 31 39 39 33 20 54 68 69  -52756-41993 Thi
3fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
3fb0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
3fc0: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
3fd0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20  total_changes() 
3fe0: 43 2f 43 2b 2b 20 69 6e 74 65 72 66 61 63 65 2e  C/C++ interface.
3ff0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   */.  sqlite3_re
4000: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
4010: 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  , sqlite3_total_
4020: 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a  changes(db));.}.
4030: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
4040: 72 65 20 64 65 66 69 6e 69 6e 67 20 68 6f 77 20  re defining how 
4050: 74 6f 20 64 6f 20 47 4c 4f 42 2d 73 74 79 6c 65  to do GLOB-style
4060: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f   comparisons..*/
4070: 0a 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  .struct compareI
4080: 6e 66 6f 20 7b 0a 20 20 75 38 20 6d 61 74 63 68  nfo {.  u8 match
4090: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  All;          /*
40a0: 20 22 2a 22 20 6f 72 20 22 25 22 20 2a 2f 0a 20   "*" or "%" */. 
40b0: 20 75 38 20 6d 61 74 63 68 4f 6e 65 3b 20 20 20   u8 matchOne;   
40c0: 20 20 20 20 20 20 20 2f 2a 20 22 3f 22 20 6f 72         /* "?" or
40d0: 20 22 5f 22 20 2a 2f 0a 20 20 75 38 20 6d 61 74   "_" */.  u8 mat
40e0: 63 68 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  chSet;          
40f0: 2f 2a 20 22 5b 22 20 6f 72 20 30 20 2a 2f 0a 20  /* "[" or 0 */. 
4100: 20 75 38 20 6e 6f 43 61 73 65 3b 20 20 20 20 20   u8 noCase;     
4110: 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 74         /* true t
4120: 6f 20 69 67 6e 6f 72 65 20 63 61 73 65 20 64 69  o ignore case di
4130: 66 66 65 72 65 6e 63 65 73 20 2a 2f 0a 7d 3b 0a  fferences */.};.
4140: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 4c 49 4b 45 20  ./*.** For LIKE 
4150: 61 6e 64 20 47 4c 4f 42 20 6d 61 74 63 68 69 6e  and GLOB matchin
4160: 67 20 6f 6e 20 45 42 43 44 49 43 20 6d 61 63 68  g on EBCDIC mach
4170: 69 6e 65 73 2c 20 61 73 73 75 6d 65 20 74 68 61  ines, assume tha
4180: 74 20 65 76 65 72 79 0a 2a 2a 20 63 68 61 72 61  t every.** chara
4190: 63 74 65 72 20 69 73 20 65 78 61 63 74 6c 79 20  cter is exactly 
41a0: 6f 6e 65 20 62 79 74 65 20 69 6e 20 73 69 7a 65  one byte in size
41b0: 2e 20 20 41 6c 73 6f 2c 20 70 72 6f 76 64 65 20  .  Also, provde 
41c0: 74 68 65 20 55 74 66 38 52 65 61 64 28 29 0a 2a  the Utf8Read().*
41d0: 2a 20 6d 61 63 72 6f 20 66 6f 72 20 66 61 73 74  * macro for fast
41e0: 20 72 65 61 64 69 6e 67 20 6f 66 20 74 68 65 20   reading of the 
41f0: 6e 65 78 74 20 63 68 61 72 61 63 74 65 72 20 69  next character i
4200: 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
4210: 65 20 77 68 65 72 65 0a 2a 2a 20 74 68 65 20 6e  e where.** the n
4220: 65 78 74 20 63 68 61 72 61 63 74 65 72 20 69 73  ext character is
4230: 20 41 53 43 49 49 2e 0a 2a 2f 0a 23 69 66 20 64   ASCII..*/.#if d
4240: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 42  efined(SQLITE_EB
4250: 43 44 49 43 29 0a 23 20 64 65 66 69 6e 65 20 73  CDIC).# define s
4260: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 41  qlite3Utf8Read(A
4270: 29 20 20 20 20 20 20 20 20 28 2a 28 28 2a 41 29  )        (*((*A)
4280: 2b 2b 29 29 0a 23 20 64 65 66 69 6e 65 20 55 74  ++)).# define Ut
4290: 66 38 52 65 61 64 28 41 29 20 20 20 20 20 20 20  f8Read(A)       
42a0: 20 20 20 20 20 20 20 20 28 2a 28 41 2b 2b 29 29          (*(A++))
42b0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
42c0: 55 74 66 38 52 65 61 64 28 41 29 20 20 20 20 20  Utf8Read(A)     
42d0: 20 20 20 20 20 20 20 20 20 20 28 41 5b 30 5d 3c            (A[0]<
42e0: 30 78 38 30 3f 2a 28 41 2b 2b 29 3a 73 71 6c 69  0x80?*(A++):sqli
42f0: 74 65 33 55 74 66 38 52 65 61 64 28 26 41 29 29  te3Utf8Read(&A))
4300: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
4310: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d  const struct com
4320: 70 61 72 65 49 6e 66 6f 20 67 6c 6f 62 49 6e 66  pareInfo globInf
4330: 6f 20 3d 20 7b 20 27 2a 27 2c 20 27 3f 27 2c 20  o = { '*', '?', 
4340: 27 5b 27 2c 20 30 20 7d 3b 0a 2f 2a 20 54 68 65  '[', 0 };./* The
4350: 20 63 6f 72 72 65 63 74 20 53 51 4c 2d 39 32 20   correct SQL-92 
4360: 62 65 68 61 76 69 6f 72 20 69 73 20 66 6f 72 20  behavior is for 
4370: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
4380: 72 20 74 6f 20 69 67 6e 6f 72 65 0a 2a 2a 20 63  r to ignore.** c
4390: 61 73 65 2e 20 20 54 68 75 73 20 20 27 61 27 20  ase.  Thus  'a' 
43a0: 4c 49 4b 45 20 27 41 27 20 77 6f 75 6c 64 20 62  LIKE 'A' would b
43b0: 65 20 74 72 75 65 2e 20 2a 2f 0a 73 74 61 74 69  e true. */.stati
43c0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63  c const struct c
43d0: 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49  ompareInfo likeI
43e0: 6e 66 6f 4e 6f 72 6d 20 3d 20 7b 20 27 25 27 2c  nfoNorm = { '%',
43f0: 20 27 5f 27 2c 20 20 20 30 2c 20 31 20 7d 3b 0a   '_',   0, 1 };.
4400: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 41 53  /* If SQLITE_CAS
4410: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
4420: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
4430: 6e 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  n the LIKE opera
4440: 74 6f 72 0a 2a 2a 20 69 73 20 63 61 73 65 20 73  tor.** is case s
4450: 65 6e 73 69 74 69 76 65 20 63 61 75 73 69 6e 67  ensitive causing
4460: 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20 74 6f   'a' LIKE 'A' to
4470: 20 62 65 20 66 61 6c 73 65 20 2a 2f 0a 73 74 61   be false */.sta
4480: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
4490: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b   compareInfo lik
44a0: 65 49 6e 66 6f 41 6c 74 20 3d 20 7b 20 27 25 27  eInfoAlt = { '%'
44b0: 2c 20 27 5f 27 2c 20 20 20 30 2c 20 30 20 7d 3b  , '_',   0, 0 };
44c0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 73 73 69 62 6c 65  ../*.** Possible
44d0: 20 65 72 72 6f 72 20 72 65 74 75 72 6e 73 20 66   error returns f
44e0: 72 6f 6d 20 70 61 74 74 65 72 6e 4d 61 74 63 68  rom patternMatch
44f0: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  ().*/.#define SQ
4500: 4c 49 54 45 5f 4d 41 54 43 48 20 20 20 20 20 20  LITE_MATCH      
4510: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
4520: 20 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 20   SQLITE_NOMATCH 
4530: 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66            1.#def
4540: 69 6e 65 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c  ine SQLITE_NOWIL
4550: 44 43 41 52 44 4d 41 54 43 48 20 20 20 32 0a 0a  DCARDMATCH   2..
4560: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
4570: 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73 20  o UTF-8 strings 
4580: 66 6f 72 20 65 71 75 61 6c 69 74 79 20 77 68 65  for equality whe
4590: 72 65 20 74 68 65 20 66 69 72 73 74 20 73 74 72  re the first str
45a0: 69 6e 67 20 69 73 0a 2a 2a 20 61 20 47 4c 4f 42  ing is.** a GLOB
45b0: 20 6f 72 20 4c 49 4b 45 20 65 78 70 72 65 73 73   or LIKE express
45c0: 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 76 61 6c  ion.  Return val
45d0: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51  ues:.**.**    SQ
45e0: 4c 49 54 45 5f 4d 41 54 43 48 3a 20 20 20 20 20  LITE_MATCH:     
45f0: 20 20 20 20 20 20 20 4d 61 74 63 68 0a 2a 2a 20         Match.** 
4600: 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43     SQLITE_NOMATC
4610: 48 3a 20 20 20 20 20 20 20 20 20 20 4e 6f 20 6d  H:          No m
4620: 61 74 63 68 0a 2a 2a 20 20 20 20 53 51 4c 49 54  atch.**    SQLIT
4630: 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d 41 54 43  E_NOWILDCARDMATC
4640: 48 3a 20 20 4e 6f 20 6d 61 74 63 68 20 69 6e 20  H:  No match in 
4650: 73 70 69 74 65 20 6f 66 20 68 61 76 69 6e 67 20  spite of having 
4660: 2a 20 6f 72 20 25 20 77 69 6c 64 63 61 72 64 73  * or % wildcards
4670: 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67  ..**.** Globbing
4680: 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
4690: 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74     '*'       Mat
46a0: 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63  ches any sequenc
46b0: 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  e of zero or mor
46c0: 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a  e characters..**
46d0: 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20  .**      '?'    
46e0: 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74     Matches exact
46f0: 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  ly one character
4700: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e  ..**.**     [...
4710: 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  ]      Matches o
4720: 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f  ne character fro
4730: 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c  m the enclosed l
4740: 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  ist of.**       
4750: 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74           charact
4760: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b  ers..**.**     [
4770: 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65  ^...]     Matche
4780: 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20  s one character 
4790: 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f  not in the enclo
47a0: 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  sed list..**.** 
47b0: 57 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61  With the [...] a
47c0: 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69  nd [^...] matchi
47d0: 6e 67 2c 20 61 20 27 5d 27 20 63 68 61 72 61 63  ng, a ']' charac
47e0: 74 65 72 20 63 61 6e 20 62 65 20 69 6e 63 6c 75  ter can be inclu
47f0: 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ded.** in the li
4800: 73 74 20 62 79 20 6d 61 6b 69 6e 67 20 69 74 20  st by making it 
4810: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
4820: 74 65 72 20 61 66 74 65 72 20 27 5b 27 20 6f 72  ter after '[' or
4830: 20 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67   '^'.  A.** rang
4840: 65 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  e of characters 
4850: 63 61 6e 20 62 65 20 73 70 65 63 69 66 69 65 64  can be specified
4860: 20 75 73 69 6e 67 20 27 2d 27 2e 20 20 45 78 61   using '-'.  Exa
4870: 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22  mple:.** "[a-z]"
4880: 20 6d 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e   matches any sin
4890: 67 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c  gle lower-case l
48a0: 65 74 74 65 72 2e 20 20 54 6f 20 6d 61 74 63 68  etter.  To match
48b0: 20 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20   a '-', make.** 
48c0: 69 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  it the last char
48d0: 61 63 74 65 72 20 69 6e 20 74 68 65 20 6c 69 73  acter in the lis
48e0: 74 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6b 65 20 6d 61  t..**.** Like ma
48f0: 74 63 68 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a  tching rules:.**
4900: 20 0a 2a 2a 20 20 20 20 20 20 27 25 27 20 20 20   .**      '%'   
4910: 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
4920: 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f  sequence of zero
4930: 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74   or more charact
4940: 65 72 73 0a 2a 2a 0a 2a 2a 2a 20 20 20 20 20 27  ers.**.***     '
4950: 5f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  _'       Matches
4960: 20 61 6e 79 20 6f 6e 65 20 63 68 61 72 61 63 74   any one charact
4970: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 63  er.**.**      Ec
4980: 20 20 20 20 20 20 20 20 57 68 65 72 65 20 45 20          Where E 
4990: 69 73 20 74 68 65 20 22 65 73 63 22 20 63 68 61  is the "esc" cha
49a0: 72 61 63 74 65 72 20 61 6e 64 20 63 20 69 73 20  racter and c is 
49b0: 61 6e 79 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20  any other.**    
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
49d0: 61 63 74 65 72 2c 20 69 6e 63 6c 75 64 69 6e 67  acter, including
49e0: 20 27 25 27 2c 20 27 5f 27 2c 20 61 6e 64 20 65   '%', '_', and e
49f0: 73 63 2c 20 6d 61 74 63 68 20 65 78 61 63 74 6c  sc, match exactl
4a00: 79 20 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  y c..**.** The c
4a10: 6f 6d 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74  omments within t
4a20: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 75 61  his routine usua
4a30: 6c 6c 79 20 61 73 73 75 6d 65 20 67 6c 6f 62 20  lly assume glob 
4a40: 6d 61 74 63 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  matching..**.** 
4a50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4a60: 75 73 75 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62  usually quick, b
4a70: 75 74 20 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69  ut can be N**2 i
4a80: 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65  n the worst case
4a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4aa0: 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 0a  patternCompare(.
4ab0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 61 74    const u8 *zPat
4ac0: 74 65 72 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tern,           
4ad0: 20 20 20 2f 2a 20 54 68 65 20 67 6c 6f 62 20 70     /* The glob p
4ae0: 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73  attern */.  cons
4af0: 74 20 75 38 20 2a 7a 53 74 72 69 6e 67 2c 20 20  t u8 *zString,  
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b10: 54 68 65 20 73 74 72 69 6e 67 20 74 6f 20 63 6f  The string to co
4b20: 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68  mpare against th
4b30: 65 20 67 6c 6f 62 20 2a 2f 0a 20 20 63 6f 6e 73  e glob */.  cons
4b40: 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65  t struct compare
4b50: 49 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20 2f 2a 20  Info *pInfo, /* 
4b60: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4b70: 74 20 68 6f 77 20 74 6f 20 64 6f 20 74 68 65 20  t how to do the 
4b80: 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32  compare */.  u32
4b90: 20 6d 61 74 63 68 4f 74 68 65 72 20 20 20 20 20   matchOther     
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bb0: 20 54 68 65 20 65 73 63 61 70 65 20 63 68 61 72   The escape char
4bc0: 20 28 4c 49 4b 45 29 20 6f 72 20 27 5b 27 20 28   (LIKE) or '[' (
4bd0: 47 4c 4f 42 29 20 2a 2f 0a 29 7b 0a 20 20 75 33  GLOB) */.){.  u3
4be0: 32 20 63 2c 20 63 32 3b 20 20 20 20 20 20 20 20  2 c, c2;        
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c00: 2a 20 4e 65 78 74 20 70 61 74 74 65 72 6e 20 61  * Next pattern a
4c10: 6e 64 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  nd input string 
4c20: 63 68 61 72 73 20 2a 2f 0a 20 20 75 33 32 20 6d  chars */.  u32 m
4c30: 61 74 63 68 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d  atchOne = pInfo-
4c40: 3e 6d 61 74 63 68 4f 6e 65 3b 20 20 2f 2a 20 22  >matchOne;  /* "
4c50: 3f 22 20 6f 72 20 22 5f 22 20 2a 2f 0a 20 20 75  ?" or "_" */.  u
4c60: 33 32 20 6d 61 74 63 68 41 6c 6c 20 3d 20 70 49  32 matchAll = pI
4c70: 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c 6c 3b 20 20  nfo->matchAll;  
4c80: 2f 2a 20 22 2a 22 20 6f 72 20 22 25 22 20 2a 2f  /* "*" or "%" */
4c90: 0a 20 20 75 38 20 6e 6f 43 61 73 65 20 3d 20 70  .  u8 noCase = p
4ca0: 49 6e 66 6f 2d 3e 6e 6f 43 61 73 65 3b 20 20 20  Info->noCase;   
4cb0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75      /* True if u
4cc0: 70 70 65 72 63 61 73 65 3d 3d 6c 6f 77 65 72 63  ppercase==lowerc
4cd0: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ase */.  const u
4ce0: 38 20 2a 7a 45 73 63 61 70 65 64 20 3d 20 30 3b  8 *zEscaped = 0;
4cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
4d00: 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
4d10: 73 63 61 70 65 64 20 69 6e 70 75 74 20 63 68 61  scaped input cha
4d20: 72 20 2a 2f 0a 20 20 0a 20 20 77 68 69 6c 65 28  r */.  .  while(
4d30: 20 28 63 20 3d 20 55 74 66 38 52 65 61 64 28 7a   (c = Utf8Read(z
4d40: 50 61 74 74 65 72 6e 29 29 21 3d 30 20 29 7b 0a  Pattern))!=0 ){.
4d50: 20 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68      if( c==match
4d60: 41 6c 6c 20 29 7b 20 20 2f 2a 20 4d 61 74 63 68  All ){  /* Match
4d70: 20 22 2a 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a   "*" */.      /*
4d80: 20 53 6b 69 70 20 6f 76 65 72 20 6d 75 6c 74 69   Skip over multi
4d90: 70 6c 65 20 22 2a 22 20 63 68 61 72 61 63 74 65  ple "*" characte
4da0: 72 73 20 69 6e 20 74 68 65 20 70 61 74 74 65 72  rs in the patter
4db0: 6e 2e 20 20 49 66 20 74 68 65 72 65 0a 20 20 20  n.  If there.   
4dc0: 20 20 20 2a 2a 20 61 72 65 20 61 6c 73 6f 20 22     ** are also "
4dd0: 3f 22 20 63 68 61 72 61 63 74 65 72 73 2c 20 73  ?" characters, s
4de0: 6b 69 70 20 74 68 6f 73 65 20 61 73 20 77 65 6c  kip those as wel
4df0: 6c 2c 20 62 75 74 20 63 6f 6e 73 75 6d 65 20 61  l, but consume a
4e00: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
4e10: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
4e20: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 66  e input string f
4e30: 6f 72 20 65 61 63 68 20 22 3f 22 20 73 6b 69 70  or each "?" skip
4e40: 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ped */.      whi
4e50: 6c 65 28 20 28 63 3d 55 74 66 38 52 65 61 64 28  le( (c=Utf8Read(
4e60: 7a 50 61 74 74 65 72 6e 29 29 20 3d 3d 20 6d 61  zPattern)) == ma
4e70: 74 63 68 41 6c 6c 20 7c 7c 20 63 20 3d 3d 20 6d  tchAll || c == m
4e80: 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20  atchOne ){.     
4e90: 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f     if( c==matchO
4ea0: 6e 65 20 26 26 20 73 71 6c 69 74 65 33 55 74 66  ne && sqlite3Utf
4eb0: 38 52 65 61 64 28 26 7a 53 74 72 69 6e 67 29 3d  8Read(&zString)=
4ec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4ed0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4ee0: 57 49 4c 44 43 41 52 44 4d 41 54 43 48 3b 0a 20  WILDCARDMATCH;. 
4ef0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4f00: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
4f10: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4f20: 6e 20 53 51 4c 49 54 45 5f 4d 41 54 43 48 3b 20  n SQLITE_MATCH; 
4f30: 20 20 2f 2a 20 22 2a 22 20 61 74 20 74 68 65 20    /* "*" at the 
4f40: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 74 74 65  end of the patte
4f50: 72 6e 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  rn matches */.  
4f60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
4f70: 3d 6d 61 74 63 68 4f 74 68 65 72 20 29 7b 0a 20  =matchOther ){. 
4f80: 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f         if( pInfo
4f90: 2d 3e 6d 61 74 63 68 53 65 74 3d 3d 30 20 29 7b  ->matchSet==0 ){
4fa0: 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
4fb0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
4fc0: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
4fd0: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
4fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4ff0: 57 49 4c 44 43 41 52 44 4d 41 54 43 48 3b 0a 20  WILDCARDMATCH;. 
5000: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5010: 20 20 20 20 20 20 20 20 2f 2a 20 22 5b 2e 2e 2e          /* "[...
5020: 5d 22 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ]" immediately f
5030: 6f 6c 6c 6f 77 73 20 74 68 65 20 22 2a 22 2e 20  ollows the "*". 
5040: 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 61   We have to do a
5050: 20 73 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 20   slow.          
5060: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 73 65 61  ** recursive sea
5070: 72 63 68 20 69 6e 20 74 68 69 73 20 63 61 73 65  rch in this case
5080: 2c 20 62 75 74 20 69 74 20 69 73 20 61 6e 20 75  , but it is an u
5090: 6e 75 73 75 61 6c 20 63 61 73 65 2e 20 2a 2f 0a  nusual case. */.
50a0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
50b0: 28 20 6d 61 74 63 68 4f 74 68 65 72 3c 30 78 38  ( matchOther<0x8
50c0: 30 20 29 3b 20 20 2f 2a 20 27 5b 27 20 69 73 20  0 );  /* '[' is 
50d0: 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 63 68  a single-byte ch
50e0: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 20 20 20  aracter */.     
50f0: 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53 74       while( *zSt
5100: 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ring ){.        
5110: 20 20 20 20 69 6e 74 20 62 4d 61 74 63 68 20 3d      int bMatch =
5120: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
5130: 26 7a 50 61 74 74 65 72 6e 5b 2d 31 5d 2c 7a 53  &zPattern[-1],zS
5140: 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 6d 61 74 63  tring,pInfo,matc
5150: 68 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20  hOther);.       
5160: 20 20 20 20 20 69 66 28 20 62 4d 61 74 63 68 21       if( bMatch!
5170: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 20  =SQLITE_NOMATCH 
5180: 29 20 72 65 74 75 72 6e 20 62 4d 61 74 63 68 3b  ) return bMatch;
5190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
51a0: 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 53  ITE_SKIP_UTF8(zS
51b0: 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  tring);.        
51c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65    }.          re
51d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49  turn SQLITE_NOWI
51e0: 4c 44 43 41 52 44 4d 41 54 43 48 3b 0a 20 20 20  LDCARDMATCH;.   
51f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
5200: 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
5210: 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 20   point variable 
5220: 63 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  c contains the f
5230: 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 6f  irst character o
5240: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  f the.      ** p
5250: 61 74 74 65 72 6e 20 73 74 72 69 6e 67 20 70 61  attern string pa
5260: 73 74 20 74 68 65 20 22 2a 22 2e 20 20 53 65 61  st the "*".  Sea
5270: 72 63 68 20 69 6e 20 74 68 65 20 69 6e 70 75 74  rch in the input
5280: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a   string for the.
5290: 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 6d        ** first m
52a0: 61 74 63 68 69 6e 67 20 63 68 61 72 61 63 74 65  atching characte
52b0: 72 20 61 6e 64 20 72 65 63 75 72 73 69 76 65 6c  r and recursivel
52c0: 79 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 6d  y continue the m
52d0: 61 74 63 68 20 66 72 6f 6d 0a 20 20 20 20 20 20  atch from.      
52e0: 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 20  ** that point.. 
52f0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
5300: 20 46 6f 72 20 61 20 63 61 73 65 2d 69 6e 73 65   For a case-inse
5310: 6e 73 69 74 69 76 65 20 73 65 61 72 63 68 2c 20  nsitive search, 
5320: 73 65 74 20 76 61 72 69 61 62 6c 65 20 63 78 20  set variable cx 
5330: 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  to be the same a
5340: 73 0a 20 20 20 20 20 20 2a 2a 20 63 20 62 75 74  s.      ** c but
5350: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 63 61   in the other ca
5360: 73 65 20 61 6e 64 20 73 65 61 72 63 68 20 74 68  se and search th
5370: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 66  e input string f
5380: 6f 72 20 65 69 74 68 65 72 0a 20 20 20 20 20 20  or either.      
5390: 2a 2a 20 63 20 6f 72 20 63 78 2e 0a 20 20 20 20  ** c or cx..    
53a0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 63    */.      if( c
53b0: 3c 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20  <=0x80 ){.      
53c0: 20 20 63 68 61 72 20 7a 53 74 6f 70 5b 33 5d 3b    char zStop[3];
53d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4d 61  .        int bMa
53e0: 74 63 68 3b 0a 20 20 20 20 20 20 20 20 69 66 28  tch;.        if(
53f0: 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20   noCase ){.     
5400: 20 20 20 20 20 7a 53 74 6f 70 5b 30 5d 20 3d 20       zStop[0] = 
5410: 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 63  sqlite3Toupper(c
5420: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  );.          zSt
5430: 6f 70 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 54  op[1] = sqlite3T
5440: 6f 6c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20  olower(c);.     
5450: 20 20 20 20 20 7a 53 74 6f 70 5b 32 5d 20 3d 20       zStop[2] = 
5460: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
5470: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 6f  {.          zSto
5480: 70 5b 30 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  p[0] = c;.      
5490: 20 20 20 20 7a 53 74 6f 70 5b 31 5d 20 3d 20 30      zStop[1] = 0
54a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
54b0: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
54c0: 20 20 20 20 20 20 20 20 7a 53 74 72 69 6e 67 20          zString 
54d0: 2b 3d 20 73 74 72 63 73 70 6e 28 28 63 6f 6e 73  += strcspn((cons
54e0: 74 20 63 68 61 72 2a 29 7a 53 74 72 69 6e 67 2c  t char*)zString,
54f0: 20 7a 53 74 6f 70 29 3b 0a 20 20 20 20 20 20 20   zStop);.       
5500: 20 20 20 69 66 28 20 7a 53 74 72 69 6e 67 5b 30     if( zString[0
5510: 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
5520: 20 20 20 20 20 20 20 20 7a 53 74 72 69 6e 67 2b          zString+
5530: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61  +;.          bMa
5540: 74 63 68 20 3d 20 70 61 74 74 65 72 6e 43 6f 6d  tch = patternCom
5550: 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a 53  pare(zPattern,zS
5560: 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 6d 61 74 63  tring,pInfo,matc
5570: 68 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20  hOther);.       
5580: 20 20 20 69 66 28 20 62 4d 61 74 63 68 21 3d 53     if( bMatch!=S
5590: 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 20 29 20  QLITE_NOMATCH ) 
55a0: 72 65 74 75 72 6e 20 62 4d 61 74 63 68 3b 0a 20  return bMatch;. 
55b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
55c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
55d0: 74 20 62 4d 61 74 63 68 3b 0a 20 20 20 20 20 20  t bMatch;.      
55e0: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 55    while( (c2 = U
55f0: 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 29  tf8Read(zString)
5600: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
5610: 20 20 69 66 28 20 63 32 21 3d 63 20 29 20 63 6f    if( c2!=c ) co
5620: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5630: 20 20 62 4d 61 74 63 68 20 3d 20 70 61 74 74 65    bMatch = patte
5640: 72 6e 43 6f 6d 70 61 72 65 28 7a 50 61 74 74 65  rnCompare(zPatte
5650: 72 6e 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f  rn,zString,pInfo
5660: 2c 6d 61 74 63 68 4f 74 68 65 72 29 3b 0a 20 20  ,matchOther);.  
5670: 20 20 20 20 20 20 20 20 69 66 28 20 62 4d 61 74          if( bMat
5680: 63 68 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 41 54  ch!=SQLITE_NOMAT
5690: 43 48 20 29 20 72 65 74 75 72 6e 20 62 4d 61 74  CH ) return bMat
56a0: 63 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ch;.        }.  
56b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
56c0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44  rn SQLITE_NOWILD
56d0: 43 41 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 7d  CARDMATCH;.    }
56e0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63  .    if( c==matc
56f0: 68 4f 74 68 65 72 20 29 7b 0a 20 20 20 20 20 20  hOther ){.      
5700: 69 66 28 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68  if( pInfo->match
5710: 53 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Set==0 ){.      
5720: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66    c = sqlite3Utf
5730: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
5740: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
5750: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
5760: 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 20 20  TE_NOMATCH;.    
5770: 20 20 20 20 7a 45 73 63 61 70 65 64 20 3d 20 7a      zEscaped = z
5780: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 7d  Pattern;.      }
5790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 33  else{.        u3
57a0: 32 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20  2 prior_c = 0;. 
57b0: 20 20 20 20 20 20 20 69 6e 74 20 73 65 65 6e 20         int seen 
57c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
57d0: 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20   invert = 0;.   
57e0: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
57f0: 55 74 66 38 52 65 61 64 28 26 7a 53 74 72 69 6e  Utf8Read(&zStrin
5800: 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g);.        if( 
5810: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  c==0 ) return SQ
5820: 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20  LITE_NOMATCH;.  
5830: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
5840: 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74  e3Utf8Read(&zPat
5850: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  tern);.        i
5860: 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20  f( c2=='^' ){.  
5870: 20 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d          invert =
5880: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 32   1;.          c2
5890: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
58a0: 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ad(&zPattern);. 
58b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
58c0: 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a   if( c2==']' ){.
58d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
58e0: 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b  =']' ) seen = 1;
58f0: 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
5900: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
5910: 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  &zPattern);.    
5920: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68      }.        wh
5930: 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27  ile( c2 && c2!='
5940: 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]' ){.          
5950: 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a  if( c2=='-' && z
5960: 50 61 74 74 65 72 6e 5b 30 5d 21 3d 27 5d 27 20  Pattern[0]!=']' 
5970: 26 26 20 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d  && zPattern[0]!=
5980: 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20 29  0 && prior_c>0 )
5990: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 32  {.            c2
59a0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
59b0: 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ad(&zPattern);. 
59c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
59d0: 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d  >=prior_c && c<=
59e0: 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  c2 ) seen = 1;. 
59f0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72             prior
5a00: 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
5a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5a20: 20 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29       if( c==c2 )
5a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5a40: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
5a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5a60: 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32      prior_c = c2
5a70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5a80: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
5a90: 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50  ite3Utf8Read(&zP
5aa0: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20  attern);.       
5ab0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
5ac0: 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20  2==0 || (seen ^ 
5ad0: 69 6e 76 65 72 74 29 3d 3d 30 20 29 7b 0a 20 20  invert)==0 ){.  
5ae0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
5af0: 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20  QLITE_NOMATCH;. 
5b00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5b10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5b20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 32 20   }.    }.    c2 
5b30: 3d 20 55 74 66 38 52 65 61 64 28 7a 53 74 72 69  = Utf8Read(zStri
5b40: 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ng);.    if( c==
5b50: 63 32 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  c2 ) continue;. 
5b60: 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 20 26     if( noCase  &
5b70: 26 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72  & sqlite3Tolower
5b80: 28 63 29 3d 3d 73 71 6c 69 74 65 33 54 6f 6c 6f  (c)==sqlite3Tolo
5b90: 77 65 72 28 63 32 29 20 26 26 20 63 3c 30 78 38  wer(c2) && c<0x8
5ba0: 30 20 26 26 20 63 32 3c 30 78 38 30 20 29 7b 0a  0 && c2<0x80 ){.
5bb0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
5bc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
5bd0: 3d 6d 61 74 63 68 4f 6e 65 20 26 26 20 7a 50 61  =matchOne && zPa
5be0: 74 74 65 72 6e 21 3d 7a 45 73 63 61 70 65 64 20  ttern!=zEscaped 
5bf0: 26 26 20 63 32 21 3d 30 20 29 20 63 6f 6e 74 69  && c2!=0 ) conti
5c00: 6e 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  nue;.    return 
5c10: 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a  SQLITE_NOMATCH;.
5c20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53    }.  return *zS
5c30: 74 72 69 6e 67 3d 3d 30 20 3f 20 53 51 4c 49 54  tring==0 ? SQLIT
5c40: 45 5f 4d 41 54 43 48 20 3a 20 53 51 4c 49 54 45  E_MATCH : SQLITE
5c50: 5f 4e 4f 4d 41 54 43 48 3b 0a 7d 0a 0a 2f 2a 0a  _NOMATCH;.}../*.
5c60: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  ** The sqlite3_s
5c70: 74 72 67 6c 6f 62 28 29 20 69 6e 74 65 72 66 61  trglob() interfa
5c80: 63 65 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e  ce.  Return 0 on
5c90: 20 61 20 6d 61 74 63 68 20 28 6c 69 6b 65 20 73   a match (like s
5ca0: 74 72 63 6d 70 28 29 29 20 61 6e 64 0a 2a 2a 20  trcmp()) and.** 
5cb0: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 72  non-zero if ther
5cc0: 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a  e is no match..*
5cd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  /.int sqlite3_st
5ce0: 72 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61 72  rglob(const char
5cf0: 20 2a 7a 47 6c 6f 62 50 61 74 74 65 72 6e 2c 20   *zGlobPattern, 
5d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
5d10: 69 6e 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ing){.  return p
5d20: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 28 75  atternCompare((u
5d30: 38 2a 29 7a 47 6c 6f 62 50 61 74 74 65 72 6e 2c  8*)zGlobPattern,
5d40: 20 28 75 38 2a 29 7a 53 74 72 69 6e 67 2c 20 26   (u8*)zString, &
5d50: 67 6c 6f 62 49 6e 66 6f 2c 20 27 5b 27 29 3b 0a  globInfo, '[');.
5d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  }../*.** The sql
5d70: 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 29 20 69  ite3_strlike() i
5d80: 6e 74 65 72 66 61 63 65 2e 20 20 52 65 74 75 72  nterface.  Retur
5d90: 6e 20 30 20 6f 6e 20 61 20 6d 61 74 63 68 20 61  n 0 on a match a
5da0: 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 0a  nd non-zero for.
5db0: 2a 2a 20 61 20 6d 69 73 73 20 2d 20 6c 69 6b 65  ** a miss - like
5dc0: 20 73 74 72 63 6d 70 28 29 2e 0a 2a 2f 0a 69 6e   strcmp()..*/.in
5dd0: 74 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  t sqlite3_strlik
5de0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  e(const char *zP
5df0: 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68  attern, const ch
5e00: 61 72 20 2a 7a 53 74 72 2c 20 75 6e 73 69 67 6e  ar *zStr, unsign
5e10: 65 64 20 69 6e 74 20 65 73 63 29 7b 0a 20 20 72  ed int esc){.  r
5e20: 65 74 75 72 6e 20 70 61 74 74 65 72 6e 43 6f 6d  eturn patternCom
5e30: 70 61 72 65 28 28 75 38 2a 29 7a 50 61 74 74 65  pare((u8*)zPatte
5e40: 72 6e 2c 20 28 75 38 2a 29 7a 53 74 72 2c 20 26  rn, (u8*)zStr, &
5e50: 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 65 73  likeInfoNorm, es
5e60: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  c);.}../*.** Cou
5e70: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
5e80: 20 74 69 6d 65 73 20 74 68 61 74 20 74 68 65 20   times that the 
5e90: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 28 6f  LIKE operator (o
5ea0: 72 20 47 4c 4f 42 20 77 68 69 63 68 20 69 73 0a  r GLOB which is.
5eb0: 2a 2a 20 6a 75 73 74 20 61 20 76 61 72 69 61 74  ** just a variat
5ec0: 69 6f 6e 20 6f 66 20 4c 49 4b 45 29 20 67 65 74  ion of LIKE) get
5ed0: 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  s called.  This 
5ee0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
5ef0: 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ing.** only..*/.
5f00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
5f10: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  ST.int sqlite3_l
5f20: 69 6b 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ike_count = 0;.#
5f30: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  endif.../*.** Im
5f40: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
5f50: 74 68 65 20 6c 69 6b 65 28 29 20 53 51 4c 20 66  the like() SQL f
5f60: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66  unction.  This f
5f70: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
5f80: 74 73 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2d  ts.** the build-
5f90: 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  in LIKE operator
5fa0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 61 72 67  .  The first arg
5fb0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
5fc0: 63 74 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a 20  ction is the.** 
5fd0: 70 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20  pattern and the 
5fe0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5ff0: 69 73 20 74 68 65 20 73 74 72 69 6e 67 2e 20 20  is the string.  
6000: 53 6f 2c 20 74 68 65 20 53 51 4c 20 73 74 61 74  So, the SQL stat
6010: 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ements:.**.**   
6020: 20 20 20 20 41 20 4c 49 4b 45 20 42 0a 2a 2a 0a      A LIKE B.**.
6030: 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ** is implemente
6040: 64 20 61 73 20 6c 69 6b 65 28 42 2c 41 29 2e 0a  d as like(B,A)..
6050: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 61 6d 65 20  **.** This same 
6060: 66 75 6e 63 74 69 6f 6e 20 28 77 69 74 68 20 61  function (with a
6070: 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6d 70 61   different compa
6080: 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
6090: 29 20 63 6f 6d 70 75 74 65 73 0a 2a 2a 20 74 68  ) computes.** th
60a0: 65 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 2e  e GLOB operator.
60b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
60c0: 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  likeFunc(.  sqli
60d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
60e0: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67  text, .  int arg
60f0: 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  c, .  sqlite3_va
6100: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
6110: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
6120: 68 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b 0a 20 20  har *zA, *zB;.  
6130: 75 33 32 20 65 73 63 61 70 65 3b 0a 20 20 69 6e  u32 escape;.  in
6140: 74 20 6e 50 61 74 3b 0a 20 20 73 71 6c 69 74 65  t nPat;.  sqlite
6150: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
6160: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
6170: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 74  e(context);.  st
6180: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
6190: 20 2a 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   *pInfo = sqlite
61a0: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
61b0: 65 78 74 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ext);..#ifdef SQ
61c0: 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54  LITE_LIKE_DOESNT
61d0: 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 69  _MATCH_BLOBS.  i
61e0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
61f0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
6200: 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 20 7c  SQLITE_BLOB.   |
6210: 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  | sqlite3_value_
6220: 74 79 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53  type(argv[1])==S
6230: 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 29 7b 0a  QLITE_BLOB.  ){.
6240: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
6250: 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ST.    sqlite3_l
6260: 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ike_count++;.#en
6270: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
6280: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6290: 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  xt, 0);.    retu
62a0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
62b0: 20 20 2f 2a 20 4c 69 6d 69 74 20 74 68 65 20 6c    /* Limit the l
62c0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 4c 49 4b  ength of the LIK
62d0: 45 20 6f 72 20 47 4c 4f 42 20 70 61 74 74 65 72  E or GLOB patter
62e0: 6e 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  n to avoid probl
62f0: 65 6d 73 0a 20 20 2a 2a 20 6f 66 20 64 65 65 70  ems.  ** of deep
6300: 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20 4e   recursion and N
6310: 2a 4e 20 62 65 68 61 76 69 6f 72 20 69 6e 20 70  *N behavior in p
6320: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 29 2e  atternCompare().
6330: 0a 20 20 2a 2f 0a 20 20 6e 50 61 74 20 3d 20 73  .  */.  nPat = s
6340: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6350: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74  es(argv[0]);.  t
6360: 65 73 74 63 61 73 65 28 20 6e 50 61 74 3d 3d 64  estcase( nPat==d
6370: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
6380: 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
6390: 45 52 4e 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20  ERN_LENGTH] );. 
63a0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 74 3d   testcase( nPat=
63b0: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
63c0: 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
63d0: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 2b 31 20  TTERN_LENGTH]+1 
63e0: 29 3b 0a 20 20 69 66 28 20 6e 50 61 74 20 3e 20  );.  if( nPat > 
63f0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
6400: 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
6410: 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a  TERN_LENGTH] ){.
6420: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6430: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
6440: 2c 20 22 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20  , "LIKE or GLOB 
6450: 70 61 74 74 65 72 6e 20 74 6f 6f 20 63 6f 6d 70  pattern too comp
6460: 6c 65 78 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72  lex", -1);.    r
6470: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
6480: 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20   argc==3 ){.    
6490: 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63 68  /* The escape ch
64a0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 6d  aracter string m
64b0: 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 61  ust consist of a
64c0: 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63 68   single UTF-8 ch
64d0: 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20  aracter..    ** 
64e0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
64f0: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
6500: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  */.    const uns
6510: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 73 63  igned char *zEsc
6520: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6530: 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a  _text(argv[2]);.
6540: 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d 30 20      if( zEsc==0 
6550: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
6560: 28 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  ( sqlite3Utf8Cha
6570: 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45 73 63  rLen((char*)zEsc
6580: 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20 20 20  , -1)!=1 ){.    
6590: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
65a0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
65b0: 0a 20 20 20 20 20 20 20 20 20 20 22 45 53 43 41  .          "ESCA
65c0: 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  PE expression mu
65d0: 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
65e0: 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29 3b 0a  haracter", -1);.
65f0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
6600: 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65 20 3d    }.    escape =
6610: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
6620: 28 26 7a 45 73 63 29 3b 0a 20 20 7d 65 6c 73 65  (&zEsc);.  }else
6630: 7b 0a 20 20 20 20 65 73 63 61 70 65 20 3d 20 70  {.    escape = p
6640: 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3b 0a  Info->matchSet;.
6650: 20 20 7d 0a 20 20 7a 42 20 3d 20 73 71 6c 69 74    }.  zB = sqlit
6660: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6670: 67 76 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20 73  gv[0]);.  zA = s
6680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6690: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66  t(argv[1]);.  if
66a0: 28 20 7a 41 20 26 26 20 7a 42 20 29 7b 0a 23 69  ( zA && zB ){.#i
66b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
66c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b  .    sqlite3_lik
66d0: 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  e_count++;.#endi
66e0: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  f.    sqlite3_re
66f0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
6700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6710: 20 20 20 20 20 20 20 20 70 61 74 74 65 72 6e 43          patternC
6720: 6f 6d 70 61 72 65 28 7a 42 2c 20 7a 41 2c 20 70  ompare(zB, zA, p
6730: 49 6e 66 6f 2c 20 65 73 63 61 70 65 29 3d 3d 53  Info, escape)==S
6740: 51 4c 49 54 45 5f 4d 41 54 43 48 29 3b 0a 20 20  QLITE_MATCH);.  
6750: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
6760: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
6770: 20 4e 55 4c 4c 49 46 28 78 2c 79 29 20 66 75 6e   NULLIF(x,y) fun
6780: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75  ction.  The resu
6790: 6c 74 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  lt is the first.
67a0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 66 20 74  ** argument if t
67b0: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  he arguments are
67c0: 20 64 69 66 66 65 72 65 6e 74 2e 20 20 54 68 65   different.  The
67d0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20   result is NULL 
67e0: 69 66 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  if the.** argume
67f0: 6e 74 73 20 61 72 65 20 65 71 75 61 6c 20 74 6f  nts are equal to
6800: 20 65 61 63 68 20 6f 74 68 65 72 2e 0a 2a 2f 0a   each other..*/.
6810: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 75 6c 6c  static void null
6820: 69 66 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ifFunc(.  sqlite
6830: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6840: 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  xt,.  int NotUse
6850: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  d,.  sqlite3_val
6860: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 43  ue **argv.){.  C
6870: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
6880: 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f  sqlite3GetFuncCo
6890: 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a  llSeq(context);.
68a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
68b0: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  ER(NotUsed);.  i
68c0: 66 28 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  f( sqlite3MemCom
68d0: 70 61 72 65 28 61 72 67 76 5b 30 5d 2c 20 61 72  pare(argv[0], ar
68e0: 67 76 5b 31 5d 2c 20 70 43 6f 6c 6c 29 21 3d 30  gv[1], pColl)!=0
68f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6900: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
6910: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  text, argv[0]);.
6920: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70    }.}../*.** Imp
6930: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
6940: 68 65 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f  he sqlite_versio
6950: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  n() function.  T
6960: 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
6970: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74   version.** of t
6980: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
6990: 79 20 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e  y that is runnin
69a0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
69b0: 64 20 76 65 72 73 69 6f 6e 46 75 6e 63 28 0a 20  d versionFunc(. 
69c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
69d0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
69e0: 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69   NotUsed,.  sqli
69f0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55  te3_value **NotU
6a00: 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44  sed2.){.  UNUSED
6a10: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
6a20: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
6a30: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 36 39    /* IMP: R-4869
6a40: 39 2d 34 38 36 31 37 20 54 68 69 73 20 66 75 6e  9-48617 This fun
6a50: 63 74 69 6f 6e 20 69 73 20 61 6e 20 53 51 4c 20  ction is an SQL 
6a60: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
6a70: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
6a80: 6c 69 62 76 65 72 73 69 6f 6e 28 29 20 43 2d 69  libversion() C-i
6a90: 6e 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73  nterface. */.  s
6aa0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6ab0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  xt(context, sqli
6ac0: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
6ad0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
6ae0: 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  TIC);.}../*.** I
6af0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
6b00: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 6f 75 72   the sqlite_sour
6b10: 63 65 5f 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  ce_id() function
6b20: 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  . The result is 
6b30: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
6b40: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
6b50: 70 61 72 74 69 63 75 6c 61 72 20 76 65 72 73 69  particular versi
6b60: 6f 6e 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  on of the source
6b70: 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20 62 75   code used to bu
6b80: 69 6c 64 0a 2a 2a 20 53 51 4c 69 74 65 2e 0a 2a  ild.** SQLite..*
6b90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f  /.static void so
6ba0: 75 72 63 65 69 64 46 75 6e 63 28 0a 20 20 73 71  urceidFunc(.  sq
6bb0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6bc0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
6bd0: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
6be0: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
6bf0: 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  2.){.  UNUSED_PA
6c00: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
6c10: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f  , NotUsed2);.  /
6c20: 2a 20 49 4d 50 3a 20 52 2d 32 34 34 37 30 2d 33  * IMP: R-24470-3
6c30: 31 31 33 36 20 54 68 69 73 20 66 75 6e 63 74 69  1136 This functi
6c40: 6f 6e 20 69 73 20 61 6e 20 53 51 4c 20 77 72 61  on is an SQL wra
6c50: 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a  pper around the.
6c60: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 75    ** sqlite3_sou
6c70: 72 63 65 69 64 28 29 20 43 20 69 6e 74 65 72 66  rceid() C interf
6c80: 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ace. */.  sqlite
6c90: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
6ca0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 73  ntext, sqlite3_s
6cb0: 6f 75 72 63 65 69 64 28 29 2c 20 2d 31 2c 20 53  ourceid(), -1, S
6cc0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d  QLITE_STATIC);.}
6cd0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6ce0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  tation of the sq
6cf0: 6c 69 74 65 5f 6c 6f 67 28 29 20 66 75 6e 63 74  lite_log() funct
6d00: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 61 20  ion.  This is a 
6d10: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a  wrapper around.*
6d20: 2a 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 2e  * sqlite3_log().
6d30: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
6d40: 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65  ue is NULL.  The
6d50: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
6d60: 20 70 75 72 65 6c 79 20 66 6f 72 0a 2a 2a 20 69   purely for.** i
6d70: 74 73 20 73 69 64 65 2d 65 66 66 65 63 74 73 2e  ts side-effects.
6d80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6d90: 65 72 72 6c 6f 67 46 75 6e 63 28 0a 20 20 73 71  errlogFunc(.  sq
6da0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6db0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
6dc0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
6dd0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
6de0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6df0: 28 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44  (argc);.  UNUSED
6e00: 5f 50 41 52 41 4d 45 54 45 52 28 63 6f 6e 74 65  _PARAMETER(conte
6e10: 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  xt);.  sqlite3_l
6e20: 6f 67 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  og(sqlite3_value
6e30: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 2c 20 22  _int(argv[0]), "
6e40: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  %s", sqlite3_val
6e50: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
6e60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
6e70: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
6e80: 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65  e sqlite_compile
6e90: 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 20 66 75  option_used() fu
6ea0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72  nction..** The r
6eb0: 65 73 75 6c 74 20 69 73 20 61 6e 20 69 6e 74 65  esult is an inte
6ec0: 67 65 72 20 74 68 61 74 20 69 64 65 6e 74 69 66  ger that identif
6ed0: 69 65 73 20 69 66 20 74 68 65 20 63 6f 6d 70 69  ies if the compi
6ee0: 6c 65 72 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61  ler option.** wa
6ef0: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
6f00: 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64  SQLite..*/.#ifnd
6f10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
6f20: 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
6f30: 47 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  GS.static void c
6f40: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64  ompileoptionused
6f50: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
6f60: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
6f70: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
6f80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6f90: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
6fa0: 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a  char *zOptName;.
6fb0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
6fc0: 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
6fd0: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
6fe0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 39 35 36 34   /* IMP: R-39564
6ff0: 2d 33 36 33 30 35 20 54 68 65 20 73 71 6c 69 74  -36305 The sqlit
7000: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
7010: 75 73 65 64 28 29 20 53 51 4c 0a 20 20 2a 2a 20  used() SQL.  ** 
7020: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
7030: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65  apper around the
7040: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
7050: 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 20 43 2f  option_used() C/
7060: 43 2b 2b 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  C++.  ** functio
7070: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 7a  n..  */.  if( (z
7080: 4f 70 74 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  OptName = (const
7090: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
70a0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
70b0: 5d 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ]))!=0 ){.    sq
70c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
70d0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
70e0: 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
70f0: 75 73 65 64 28 7a 4f 70 74 4e 61 6d 65 29 29 3b  used(zOptName));
7100: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
7110: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
7120: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
7130: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65   */../*.** Imple
7140: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
7150: 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f   sqlite_compileo
7160: 70 74 69 6f 6e 5f 67 65 74 28 29 20 66 75 6e 63  ption_get() func
7170: 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 72 65  tion. .** The re
7180: 73 75 6c 74 20 69 73 20 61 20 73 74 72 69 6e 67  sult is a string
7190: 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 73   that identifies
71a0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
71b0: 74 69 6f 6e 73 20 0a 2a 2a 20 75 73 65 64 20 74  tions .** used t
71c0: 6f 20 62 75 69 6c 64 20 53 51 4c 69 74 65 2e 0a  o build SQLite..
71d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
71e0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
71f0: 54 49 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74 69  TION_DIAGS.stati
7200: 63 20 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f 70  c void compileop
7210: 74 69 6f 6e 67 65 74 46 75 6e 63 28 0a 20 20 73  tiongetFunc(.  s
7220: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7230: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
7240: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
7250: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
7260: 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74   int n;.  assert
7270: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55  ( argc==1 );.  U
7280: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
7290: 61 72 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a  argc);.  /* IMP:
72a0: 20 52 2d 30 34 39 32 32 2d 32 34 30 37 36 20 54   R-04922-24076 T
72b0: 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c  he sqlite_compil
72c0: 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20 53 51  eoption_get() SQ
72d0: 4c 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  L function.  ** 
72e0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
72f0: 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  und the sqlite3_
7300: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
7310: 74 28 29 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69  t() C/C++ functi
7320: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 73  on..  */.  n = s
7330: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
7340: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c  (argv[0]);.  sql
7350: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7360: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
7370: 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
7380: 67 65 74 28 6e 29 2c 20 2d 31 2c 20 53 51 4c 49  get(n), -1, SQLI
7390: 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 23 65  TE_STATIC);.}.#e
73a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
73b0: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
73c0: 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a 20 41  N_DIAGS */../* A
73d0: 72 72 61 79 20 66 6f 72 20 63 6f 6e 76 65 72 74  rray for convert
73e0: 69 6e 67 20 66 72 6f 6d 20 68 61 6c 66 2d 62 79  ing from half-by
73f0: 74 65 73 20 28 6e 79 62 62 6c 65 73 29 20 69 6e  tes (nybbles) in
7400: 74 6f 20 41 53 43 49 49 20 68 65 78 0a 2a 2a 20  to ASCII hex.** 
7410: 64 69 67 69 74 73 2e 20 2a 2f 0a 73 74 61 74 69  digits. */.stati
7420: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 68 65 78  c const char hex
7430: 64 69 67 69 74 73 5b 5d 20 3d 20 7b 0a 20 20 27  digits[] = {.  '
7440: 30 27 2c 20 27 31 27 2c 20 27 32 27 2c 20 27 33  0', '1', '2', '3
7450: 27 2c 20 27 34 27 2c 20 27 35 27 2c 20 27 36 27  ', '4', '5', '6'
7460: 2c 20 27 37 27 2c 0a 20 20 27 38 27 2c 20 27 39  , '7',.  '8', '9
7470: 27 2c 20 27 41 27 2c 20 27 42 27 2c 20 27 43 27  ', 'A', 'B', 'C'
7480: 2c 20 27 44 27 2c 20 27 45 27 2c 20 27 46 27 20  , 'D', 'E', 'F' 
7490: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .};../*.** Imple
74a0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
74b0: 20 51 55 4f 54 45 28 29 20 66 75 6e 63 74 69 6f   QUOTE() functio
74c0: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
74d0: 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  n takes a single
74e0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  .** argument.  I
74f0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
7500: 73 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 20 72  s numeric, the r
7510: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
7520: 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68  he same as.** th
7530: 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20  e argument.  If 
7540: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
7550: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 74 75 72 6e  NULL, the return
7560: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 74   value is the st
7570: 72 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20  ring.** "NULL". 
7580: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
7590: 61 72 67 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c  argument is encl
75a0: 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 71  osed in single q
75b0: 75 6f 74 65 73 20 77 69 74 68 0a 2a 2a 20 73 69  uotes with.** si
75c0: 6e 67 6c 65 2d 71 75 6f 74 65 20 65 73 63 61 70  ngle-quote escap
75d0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
75e0: 69 64 20 71 75 6f 74 65 46 75 6e 63 28 73 71 6c  id quoteFunc(sql
75f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7600: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
7610: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7620: 2a 61 72 67 76 29 7b 0a 20 20 61 73 73 65 72 74  *argv){.  assert
7630: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55  ( argc==1 );.  U
7640: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
7650: 61 72 67 63 29 3b 0a 20 20 73 77 69 74 63 68 28  argc);.  switch(
7660: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
7670: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a  ype(argv[0]) ){.
7680: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7690: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 64  FLOAT: {.      d
76a0: 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20  ouble r1, r2;.  
76b0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30      char zBuf[50
76c0: 5d 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  ];.      r1 = sq
76d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
76e0: 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  le(argv[0]);.   
76f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7700: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
7710: 2c 20 7a 42 75 66 2c 20 22 25 21 2e 31 35 67 22  , zBuf, "%!.15g"
7720: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
7730: 69 74 65 33 41 74 6f 46 28 7a 42 75 66 2c 20 26  ite3AtoF(zBuf, &
7740: 72 32 2c 20 32 30 2c 20 53 51 4c 49 54 45 5f 55  r2, 20, SQLITE_U
7750: 54 46 38 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TF8);.      if( 
7760: 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20  r1!=r2 ){.      
7770: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7780: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
7790: 20 7a 42 75 66 2c 20 22 25 21 2e 32 30 65 22 2c   zBuf, "%!.20e",
77a0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
77b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
77c0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
77d0: 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54   zBuf, -1, SQLIT
77e0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
77f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7800: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7810: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
7820: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7830: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
7840: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
7850: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7860: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
7870: 42 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  B: {.      char 
7880: 2a 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  *zText = 0;.    
7890: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42    char const *zB
78a0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
78b0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
78c0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  );.      int nBl
78d0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
78e0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
78f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
7900: 20 7a 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f   zBlob==sqlite3_
7910: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
7920: 30 5d 29 20 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63  0]) ); /* No enc
7930: 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a  oding change */.
7940: 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 28 63        zText = (c
7950: 68 61 72 20 2a 29 63 6f 6e 74 65 78 74 4d 61 6c  har *)contextMal
7960: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 32 2a  loc(context, (2*
7970: 28 69 36 34 29 6e 42 6c 6f 62 29 2b 34 29 3b 20  (i64)nBlob)+4); 
7980: 0a 20 20 20 20 20 20 69 66 28 20 7a 54 65 78 74  .      if( zText
7990: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
79a0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
79b0: 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b  =0; i<nBlob; i++
79c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
79d0: 78 74 5b 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65  xt[(i*2)+2] = he
79e0: 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69  xdigits[(zBlob[i
79f0: 5d 3e 3e 34 29 26 30 78 30 46 5d 3b 0a 20 20 20  ]>>4)&0x0F];.   
7a00: 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a         zText[(i*
7a10: 32 29 2b 33 5d 20 3d 20 68 65 78 64 69 67 69 74  2)+3] = hexdigit
7a20: 73 5b 28 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30  s[(zBlob[i])&0x0
7a30: 46 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  F];.        }.  
7a40: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c        zText[(nBl
7a50: 6f 62 2a 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b  ob*2)+2] = '\'';
7a60: 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28  .        zText[(
7a70: 6e 42 6c 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c  nBlob*2)+3] = '\
7a80: 30 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78  0';.        zTex
7a90: 74 5b 30 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20  t[0] = 'X';.    
7aa0: 20 20 20 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27      zText[1] = '
7ab0: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  \'';.        sql
7ac0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7ad0: 28 63 6f 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c  (context, zText,
7ae0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
7af0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20  SIENT);.        
7b00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
7b10: 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
7b20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7b30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7b40: 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TEXT: {.      in
7b50: 74 20 69 2c 6a 3b 0a 20 20 20 20 20 20 75 36 34  t i,j;.      u64
7b60: 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
7b70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
7b80: 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Arg = sqlite3_va
7b90: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
7ba0: 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
7bb0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 41 72  ;..      if( zAr
7bc0: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  g==0 ) return;. 
7bd0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d       for(i=0, n=
7be0: 30 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29  0; zArg[i]; i++)
7bf0: 7b 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27  { if( zArg[i]=='
7c00: 5c 27 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20  \'' ) n++; }.   
7c10: 20 20 20 7a 20 3d 20 63 6f 6e 74 65 78 74 4d 61     z = contextMa
7c20: 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28  lloc(context, ((
7c30: 69 36 34 29 69 29 2b 28 28 69 36 34 29 6e 29 2b  i64)i)+((i64)n)+
7c40: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20  3);.      if( z 
7c50: 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 30 5d 20  ){.        z[0] 
7c60: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
7c70: 66 6f 72 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41  for(i=0, j=1; zA
7c80: 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  rg[i]; i++){.   
7c90: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
7ca0: 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
7cb0: 20 20 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d     if( zArg[i]==
7cc0: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
7cd0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27      z[j++] = '\'
7ce0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
7cf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d00: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[j++] = '\'';.
7d10: 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30          z[j] = 0
7d20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7d30: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
7d40: 6e 74 65 78 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c  ntext, z, j, sql
7d50: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20  ite3_free);.    
7d60: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7d70: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
7d80: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
7d90: 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rt( sqlite3_valu
7da0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
7db0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a  =SQLITE_NULL );.
7dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7dd0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
7de0: 74 2c 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51  t, "NULL", 4, SQ
7df0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7e10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
7e20: 65 20 75 6e 69 63 6f 64 65 28 29 20 66 75 6e 63  e unicode() func
7e30: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 68  tion.  Return th
7e40: 65 20 69 6e 74 65 67 65 72 20 75 6e 69 63 6f 64  e integer unicod
7e50: 65 20 63 6f 64 65 2d 70 6f 69 6e 74 20 76 61 6c  e code-point val
7e60: 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 69  ue.** for the fi
7e70: 72 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  rst character of
7e80: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
7e90: 67 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  g. .*/.static vo
7ea0: 69 64 20 75 6e 69 63 6f 64 65 46 75 6e 63 28 0a  id unicodeFunc(.
7eb0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
7ec0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
7ed0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
7ee0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7ef0: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
7f00: 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  ed char *z = sql
7f10: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7f20: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 28 76 6f 69  argv[0]);.  (voi
7f30: 64 29 61 72 67 63 3b 0a 20 20 69 66 28 20 7a 20  d)argc;.  if( z 
7f40: 26 26 20 7a 5b 30 5d 20 29 20 73 71 6c 69 74 65  && z[0] ) sqlite
7f50: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
7f60: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 55 74 66  text, sqlite3Utf
7f70: 38 52 65 61 64 28 26 7a 29 29 3b 0a 7d 0a 0a 2f  8Read(&z));.}../
7f80: 2a 0a 2a 2a 20 54 68 65 20 63 68 61 72 28 29 20  *.** The char() 
7f90: 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 7a  function takes z
7fa0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75  ero or more argu
7fb0: 6d 65 6e 74 73 2c 20 65 61 63 68 20 6f 66 20 77  ments, each of w
7fc0: 68 69 63 68 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  hich is.** an in
7fd0: 74 65 67 65 72 2e 20 20 49 74 20 63 6f 6e 73 74  teger.  It const
7fe0: 72 75 63 74 73 20 61 20 73 74 72 69 6e 67 20 77  ructs a string w
7ff0: 68 65 72 65 20 65 61 63 68 20 63 68 61 72 61 63  here each charac
8000: 74 65 72 20 6f 66 20 74 68 65 20 73 74 72 69 6e  ter of the strin
8010: 67 0a 2a 2a 20 69 73 20 74 68 65 20 75 6e 69 63  g.** is the unic
8020: 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 66 6f  ode character fo
8030: 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
8040: 69 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67 75  ing integer argu
8050: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
8060: 76 6f 69 64 20 63 68 61 72 46 75 6e 63 28 0a 20  void charFunc(. 
8070: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8080: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
8090: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
80a0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
80b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
80c0: 20 2a 7a 2c 20 2a 7a 4f 75 74 3b 0a 20 20 69 6e   *z, *zOut;.  in
80d0: 74 20 69 3b 0a 20 20 7a 4f 75 74 20 3d 20 7a 20  t i;.  zOut = z 
80e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
80f0: 36 34 28 20 61 72 67 63 2a 34 2b 31 20 29 3b 0a  64( argc*4+1 );.
8100: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
8110: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8120: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
8130: 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72  text);.    retur
8140: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
8150: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
8160: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
8170: 34 20 78 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  4 x;.    unsigne
8180: 64 20 63 3b 0a 20 20 20 20 78 20 3d 20 73 71 6c  d c;.    x = sql
8190: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
81a0: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (argv[i]);.    i
81b0: 66 28 20 78 3c 30 20 7c 7c 20 78 3e 30 78 31 30  f( x<0 || x>0x10
81c0: 66 66 66 66 20 29 20 78 20 3d 20 30 78 66 66 66  ffff ) x = 0xfff
81d0: 64 3b 0a 20 20 20 20 63 20 3d 20 28 75 6e 73 69  d;.    c = (unsi
81e0: 67 6e 65 64 29 28 78 20 26 20 30 78 31 66 66 66  gned)(x & 0x1fff
81f0: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 63 3c 30  ff);.    if( c<0
8200: 78 30 30 30 38 30 20 29 7b 0a 20 20 20 20 20 20  x00080 ){.      
8210: 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 63  *zOut++ = (u8)(c
8220: 26 30 78 46 46 29 3b 0a 20 20 20 20 7d 65 6c 73  &0xFF);.    }els
8230: 65 20 69 66 28 20 63 3c 30 78 30 30 38 30 30 20  e if( c<0x00800 
8240: 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  ){.      *zOut++
8250: 20 3d 20 30 78 43 30 20 2b 20 28 75 38 29 28 28   = 0xC0 + (u8)((
8260: 63 3e 3e 36 29 26 30 78 31 46 29 3b 0a 20 20 20  c>>6)&0x1F);.   
8270: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38     *zOut++ = 0x8
8280: 30 20 2b 20 28 75 38 29 28 63 20 26 20 30 78 33  0 + (u8)(c & 0x3
8290: 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  F);.    }else if
82a0: 28 20 63 3c 30 78 31 30 30 30 30 20 29 7b 0a 20  ( c<0x10000 ){. 
82b0: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
82c0: 78 45 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 31  xE0 + (u8)((c>>1
82d0: 32 29 26 30 78 30 46 29 3b 0a 20 20 20 20 20 20  2)&0x0F);.      
82e0: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
82f0: 20 28 75 38 29 28 28 63 3e 3e 36 29 20 26 20 30   (u8)((c>>6) & 0
8300: 78 33 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75  x3F);.      *zOu
8310: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38  t++ = 0x80 + (u8
8320: 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20  )(c & 0x3F);.   
8330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 7a   }else{.      *z
8340: 4f 75 74 2b 2b 20 3d 20 30 78 46 30 20 2b 20 28  Out++ = 0xF0 + (
8350: 75 38 29 28 28 63 3e 3e 31 38 29 20 26 20 30 78  u8)((c>>18) & 0x
8360: 30 37 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74  07);.      *zOut
8370: 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29  ++ = 0x80 + (u8)
8380: 28 28 63 3e 3e 31 32 29 20 26 20 30 78 33 46 29  ((c>>12) & 0x3F)
8390: 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  ;.      *zOut++ 
83a0: 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 28 63  = 0x80 + (u8)((c
83b0: 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 0a 20 20  >>6) & 0x3F);.  
83c0: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
83d0: 38 30 20 2b 20 28 75 38 29 28 63 20 26 20 30 78  80 + (u8)(c & 0x
83e0: 33 46 29 3b 0a 20 20 20 20 7d 20 20 20 20 20 20  3F);.    }      
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
8420: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
8430: 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74  sult_text64(cont
8440: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a  ext, (char*)z, z
8450: 4f 75 74 2d 7a 2c 20 73 71 6c 69 74 65 33 5f 66  Out-z, sqlite3_f
8460: 72 65 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ree, SQLITE_UTF8
8470: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
8480: 68 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  hex() function. 
8490: 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 61   Interpret the a
84a0: 72 67 75 6d 65 6e 74 20 61 73 20 61 20 62 6c 6f  rgument as a blo
84b0: 62 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  b.  Return.** a 
84c0: 68 65 78 61 64 65 63 69 6d 61 6c 20 72 65 6e 64  hexadecimal rend
84d0: 65 72 69 6e 67 20 61 73 20 74 65 78 74 2e 0a 2a  ering as text..*
84e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
84f0: 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  xFunc(.  sqlite3
8500: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
8510: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
8520: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8530: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
8540: 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  , n;.  const uns
8550: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f  igned char *pBlo
8560: 62 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 2c  b;.  char *zHex,
8570: 20 2a 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 61   *z;.  assert( a
8580: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
8590: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
85a0: 63 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71  c);.  pBlob = sq
85b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
85c0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d  (argv[0]);.  n =
85d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
85e0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
85f0: 20 61 73 73 65 72 74 28 20 70 42 6c 6f 62 3d 3d   assert( pBlob==
8600: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
8610: 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20  ob(argv[0]) );  
8620: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
8630: 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 20 3d 20 7a  hange */.  z = z
8640: 48 65 78 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c  Hex = contextMal
8650: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69  loc(context, ((i
8660: 36 34 29 6e 29 2a 32 20 2b 20 31 29 3b 0a 20 20  64)n)*2 + 1);.  
8670: 69 66 28 20 7a 48 65 78 20 29 7b 0a 20 20 20 20  if( zHex ){.    
8680: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
8690: 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a 20 20 20  +, pBlob++){.   
86a0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
86b0: 20 63 20 3d 20 2a 70 42 6c 6f 62 3b 0a 20 20 20   c = *pBlob;.   
86c0: 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64     *(z++) = hexd
86d0: 69 67 69 74 73 5b 28 63 3e 3e 34 29 26 30 78 66  igits[(c>>4)&0xf
86e0: 5d 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20  ];.      *(z++) 
86f0: 3d 20 68 65 78 64 69 67 69 74 73 5b 63 26 30 78  = hexdigits[c&0x
8700: 66 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  f];.    }.    *z
8710: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
8720: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
8730: 6e 74 65 78 74 2c 20 7a 48 65 78 2c 20 6e 2a 32  ntext, zHex, n*2
8740: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
8750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
8760: 65 20 7a 65 72 6f 62 6c 6f 62 28 4e 29 20 66 75  e zeroblob(N) fu
8770: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
8780: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 62 6c 6f   zero-filled blo
8790: 62 20 6f 66 20 73 69 7a 65 20 4e 20 62 79 74 65  b of size N byte
87a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
87b0: 64 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 28 0a  d zeroblobFunc(.
87c0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
87d0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
87e0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
87f0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
8800: 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74  {.  i64 n;.  int
8810: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61   rc;.  assert( a
8820: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
8830: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
8840: 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  c);.  n = sqlite
8850: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
8860: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c  gv[0]);.  if( n<
8870: 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20 72 63 20  0 ) n = 0;.  rc 
8880: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  = sqlite3_result
8890: 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 63 6f 6e 74  _zeroblob64(cont
88a0: 65 78 74 2c 20 6e 29 3b 20 2f 2a 20 49 4d 50 3a  ext, n); /* IMP:
88b0: 20 52 2d 30 30 32 39 33 2d 36 34 39 39 34 20 2a   R-00293-64994 *
88c0: 2f 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  /.  if( rc ){.  
88d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
88e0: 5f 65 72 72 6f 72 5f 63 6f 64 65 28 63 6f 6e 74  _error_code(cont
88f0: 65 78 74 2c 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a  ext, rc);.  }.}.
8900: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 70 6c 61  ./*.** The repla
8910: 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ce() function.  
8920: 54 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20  Three arguments 
8930: 61 72 65 20 61 6c 6c 20 73 74 72 69 6e 67 73 3a  are all strings:
8940: 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 6d 20 41 2c   call.** them A,
8950: 20 42 2c 20 61 6e 64 20 43 2e 20 54 68 65 20 72   B, and C. The r
8960: 65 73 75 6c 74 20 69 73 20 61 6c 73 6f 20 61 20  esult is also a 
8970: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
8980: 64 65 72 69 76 65 64 0a 2a 2a 20 66 72 6f 6d 20  derived.** from 
8990: 41 20 62 79 20 72 65 70 6c 61 63 69 6e 67 20 65  A by replacing e
89a0: 76 65 72 79 20 6f 63 63 75 72 72 65 6e 63 65 20  very occurrence 
89b0: 6f 66 20 42 20 77 69 74 68 20 43 2e 20 20 54 68  of B with C.  Th
89c0: 65 20 6d 61 74 63 68 0a 2a 2a 20 6d 75 73 74 20  e match.** must 
89d0: 62 65 20 65 78 61 63 74 2e 20 20 43 6f 6c 6c 61  be exact.  Colla
89e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61  ting sequences a
89f0: 72 65 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2f 0a  re not used..*/.
8a00: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 70 6c  static void repl
8a10: 61 63 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  aceFunc(.  sqlit
8a20: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
8a30: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
8a40: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8a50: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
8a60: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
8a70: 20 2a 7a 53 74 72 3b 20 20 20 20 20 20 20 20 2f   *zStr;        /
8a80: 2a 20 54 68 65 20 69 6e 70 75 74 20 73 74 72 69  * The input stri
8a90: 6e 67 20 41 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ng A */.  const 
8aa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
8ab0: 50 61 74 74 65 72 6e 3b 20 20 20 20 2f 2a 20 54  Pattern;    /* T
8ac0: 68 65 20 70 61 74 74 65 72 6e 20 73 74 72 69 6e  he pattern strin
8ad0: 67 20 42 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  g B */.  const u
8ae0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 52  nsigned char *zR
8af0: 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ep;        /* Th
8b00: 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 73 74  e replacement st
8b10: 72 69 6e 67 20 43 20 2a 2f 0a 20 20 75 6e 73 69  ring C */.  unsi
8b20: 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74 3b  gned char *zOut;
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b40: 20 54 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   The output */. 
8b50: 20 69 6e 74 20 6e 53 74 72 3b 20 20 20 20 20 20   int nStr;      
8b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
8b70: 65 20 6f 66 20 7a 53 74 72 20 2a 2f 0a 20 20 69  e of zStr */.  i
8b80: 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20 20 20 20  nt nPattern;    
8b90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8ba0: 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20  of zPattern */. 
8bb0: 20 69 6e 74 20 6e 52 65 70 3b 20 20 20 20 20 20   int nRep;      
8bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
8bd0: 65 20 6f 66 20 7a 52 65 70 20 2a 2f 0a 20 20 69  e of zRep */.  i
8be0: 36 34 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  64 nOut;        
8bf0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
8c00: 75 6d 20 73 69 7a 65 20 6f 66 20 7a 4f 75 74 20  um size of zOut 
8c10: 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f 70 4c 69 6d  */.  int loopLim
8c20: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  it;           /*
8c30: 20 4c 61 73 74 20 7a 53 74 72 5b 5d 20 74 68 61   Last zStr[] tha
8c40: 74 20 6d 69 67 68 74 20 6d 61 74 63 68 20 7a 50  t might match zP
8c50: 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a 20 20 69 6e  attern[] */.  in
8c60: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
8c70: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8c80: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 6e 73  ounters */.  uns
8c90: 69 67 6e 65 64 20 63 6e 74 45 78 70 61 6e 64 3b  igned cntExpand;
8ca0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8cb0: 7a 4f 75 74 20 65 78 70 61 6e 73 69 6f 6e 73 20  zOut expansions 
8cc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
8cd0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
8ce0: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
8cf0: 74 65 78 74 29 3b 0a 0a 20 20 61 73 73 65 72 74  text);..  assert
8d00: 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 55  ( argc==3 );.  U
8d10: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
8d20: 61 72 67 63 29 3b 0a 20 20 7a 53 74 72 20 3d 20  argc);.  zStr = 
8d30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8d40: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
8d50: 66 28 20 7a 53 74 72 3d 3d 30 20 29 20 72 65 74  f( zStr==0 ) ret
8d60: 75 72 6e 3b 0a 20 20 6e 53 74 72 20 3d 20 73 71  urn;.  nStr = sq
8d70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8d80: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73  s(argv[0]);.  as
8d90: 73 65 72 74 28 20 7a 53 74 72 3d 3d 73 71 6c 69  sert( zStr==sqli
8da0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8db0: 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e  rgv[0]) );  /* N
8dc0: 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67  o encoding chang
8dd0: 65 20 2a 2f 0a 20 20 7a 50 61 74 74 65 72 6e 20  e */.  zPattern 
8de0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8df0: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  text(argv[1]);. 
8e00: 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30   if( zPattern==0
8e10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8e20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8e30: 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c  pe(argv[1])==SQL
8e40: 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20 20 20 20  ITE_NULL.       
8e50: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
8e60: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
8e70: 65 28 63 6f 6e 74 65 78 74 29 2d 3e 6d 61 6c 6c  e(context)->mall
8e80: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8e90: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
8ea0: 28 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 30  ( zPattern[0]==0
8eb0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8ec0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8ed0: 70 65 28 61 72 67 76 5b 31 5d 29 21 3d 53 51 4c  pe(argv[1])!=SQL
8ee0: 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_NULL );.    
8ef0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
8f00: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
8f10: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 75  gv[0]);.    retu
8f20: 72 6e 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 74 65  rn;.  }.  nPatte
8f30: 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  rn = sqlite3_val
8f40: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d  ue_bytes(argv[1]
8f50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50 61  );.  assert( zPa
8f60: 74 74 65 72 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  ttern==sqlite3_v
8f70: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
8f80: 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63  ]) );  /* No enc
8f90: 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a  oding change */.
8fa0: 20 20 7a 52 65 70 20 3d 20 73 71 6c 69 74 65 33    zRep = sqlite3
8fb0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8fc0: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 52 65 70  [2]);.  if( zRep
8fd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8fe0: 6e 52 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76  nRep = sqlite3_v
8ff0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
9000: 32 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  2]);.  assert( z
9010: 52 65 70 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  Rep==sqlite3_val
9020: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
9030: 20 29 3b 0a 20 20 6e 4f 75 74 20 3d 20 6e 53 74   );.  nOut = nSt
9040: 72 20 2b 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r + 1;.  assert(
9050: 20 6e 4f 75 74 3c 53 51 4c 49 54 45 5f 4d 41 58   nOut<SQLITE_MAX
9060: 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 7a 4f 75  _LENGTH );.  zOu
9070: 74 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  t = contextMallo
9080: 63 28 63 6f 6e 74 65 78 74 2c 20 28 69 36 34 29  c(context, (i64)
9090: 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 7a 4f 75  nOut);.  if( zOu
90a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
90b0: 72 6e 3b 0a 20 20 7d 0a 20 20 6c 6f 6f 70 4c 69  rn;.  }.  loopLi
90c0: 6d 69 74 20 3d 20 6e 53 74 72 20 2d 20 6e 50 61  mit = nStr - nPa
90d0: 74 74 65 72 6e 3b 20 20 0a 20 20 63 6e 74 45 78  ttern;  .  cntEx
90e0: 70 61 6e 64 20 3d 20 30 3b 0a 20 20 66 6f 72 28  pand = 0;.  for(
90f0: 69 3d 6a 3d 30 3b 20 69 3c 3d 6c 6f 6f 70 4c 69  i=j=0; i<=loopLi
9100: 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  mit; i++){.    i
9110: 66 28 20 7a 53 74 72 5b 69 5d 21 3d 7a 50 61 74  f( zStr[i]!=zPat
9120: 74 65 72 6e 5b 30 5d 20 7c 7c 20 6d 65 6d 63 6d  tern[0] || memcm
9130: 70 28 26 7a 53 74 72 5b 69 5d 2c 20 7a 50 61 74  p(&zStr[i], zPat
9140: 74 65 72 6e 2c 20 6e 50 61 74 74 65 72 6e 29 20  tern, nPattern) 
9150: 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b  ){.      zOut[j+
9160: 2b 5d 20 3d 20 7a 53 74 72 5b 69 5d 3b 0a 20 20  +] = zStr[i];.  
9170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
9180: 66 28 20 6e 52 65 70 3e 6e 50 61 74 74 65 72 6e  f( nRep>nPattern
9190: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74   ){.        nOut
91a0: 20 2b 3d 20 6e 52 65 70 20 2d 20 6e 50 61 74 74   += nRep - nPatt
91b0: 65 72 6e 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ern;.        tes
91c0: 74 63 61 73 65 28 20 6e 4f 75 74 2d 31 3d 3d 64  tcase( nOut-1==d
91d0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
91e0: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
91f0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
9200: 73 65 28 20 6e 4f 75 74 2d 32 3d 3d 64 62 2d 3e  se( nOut-2==db->
9210: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9220: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20  MIT_LENGTH] );. 
9230: 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 2d         if( nOut-
9240: 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  1>db->aLimit[SQL
9250: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
9260: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ] ){.          s
9270: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
9280: 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65  ror_toobig(conte
9290: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xt);.          s
92a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
92b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
92c0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
92d0: 20 20 20 20 20 20 20 63 6e 74 45 78 70 61 6e 64         cntExpand
92e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
92f0: 28 63 6e 74 45 78 70 61 6e 64 26 28 63 6e 74 45  (cntExpand&(cntE
9300: 78 70 61 6e 64 2d 31 29 29 3d 3d 30 20 29 7b 0a  xpand-1))==0 ){.
9310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f            /* Gro
9320: 77 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  w the size of th
9330: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
9340: 6f 6e 6c 79 20 6f 6e 20 73 75 62 73 74 69 74 75  only on substitu
9350: 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  tions.          
9360: 2a 2a 20 77 68 6f 73 65 20 69 6e 64 65 78 20 69  ** whose index i
9370: 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  s a power of two
9380: 3a 20 31 2c 20 32 2c 20 34 2c 20 38 2c 20 31 36  : 1, 2, 4, 8, 16
9390: 2c 20 33 32 2c 20 2e 2e 2e 20 2a 2f 0a 20 20 20  , 32, ... */.   
93a0: 20 20 20 20 20 20 20 75 38 20 2a 7a 4f 6c 64 3b         u8 *zOld;
93b0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
93c0: 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  = zOut;.        
93d0: 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    zOut = sqlite3
93e0: 5f 72 65 61 6c 6c 6f 63 36 34 28 7a 4f 75 74 2c  _realloc64(zOut,
93f0: 20 28 69 6e 74 29 6e 4f 75 74 20 2b 20 28 6e 4f   (int)nOut + (nO
9400: 75 74 20 2d 20 6e 53 74 72 20 2d 20 31 29 29 3b  ut - nStr - 1));
9410: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
9420: 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
9430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
9440: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
9450: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
9460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
9470: 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20  ree(zOld);.     
9480: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
9490: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
94a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
94b0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b     memcpy(&zOut[
94c0: 6a 5d 2c 20 7a 52 65 70 2c 20 6e 52 65 70 29 3b  j], zRep, nRep);
94d0: 0a 20 20 20 20 20 20 6a 20 2b 3d 20 6e 52 65 70  .      j += nRep
94e0: 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50 61  ;.      i += nPa
94f0: 74 74 65 72 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20  ttern-1;.    }. 
9500: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 2b 6e   }.  assert( j+n
9510: 53 74 72 2d 69 2b 31 3c 3d 6e 4f 75 74 20 29 3b  Str-i+1<=nOut );
9520: 0a 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b  .  memcpy(&zOut[
9530: 6a 5d 2c 20 26 7a 53 74 72 5b 69 5d 2c 20 6e 53  j], &zStr[i], nS
9540: 74 72 2d 69 29 3b 0a 20 20 6a 20 2b 3d 20 6e 53  tr-i);.  j += nS
9550: 74 72 20 2d 20 69 3b 0a 20 20 61 73 73 65 72 74  tr - i;.  assert
9560: 28 20 6a 3c 3d 6e 4f 75 74 20 29 3b 0a 20 20 7a  ( j<=nOut );.  z
9570: 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 73 71  Out[j] = 0;.  sq
9580: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
9590: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
95a0: 2a 29 7a 4f 75 74 2c 20 6a 2c 20 73 71 6c 69 74  *)zOut, j, sqlit
95b0: 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e3_free);.}../*.
95c0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
95d0: 6e 20 6f 66 20 74 68 65 20 54 52 49 4d 28 29 2c  n of the TRIM(),
95e0: 20 4c 54 52 49 4d 28 29 2c 20 61 6e 64 20 52 54   LTRIM(), and RT
95f0: 52 49 4d 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  RIM() functions.
9600: 0a 2a 2a 20 54 68 65 20 75 73 65 72 64 61 74 61  .** The userdata
9610: 20 69 73 20 30 78 31 20 66 6f 72 20 6c 65 66 74   is 0x1 for left
9620: 20 74 72 69 6d 2c 20 30 78 32 20 66 6f 72 20 72   trim, 0x2 for r
9630: 69 67 68 74 20 74 72 69 6d 2c 20 30 78 33 20 66  ight trim, 0x3 f
9640: 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74  or both..*/.stat
9650: 69 63 20 76 6f 69 64 20 74 72 69 6d 46 75 6e 63  ic void trimFunc
9660: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
9670: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
9680: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
9690: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
96a0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
96b0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 20  gned char *zIn; 
96c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
96d0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e   string */.  con
96e0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
96f0: 20 2a 7a 43 68 61 72 53 65 74 3b 20 20 20 20 2f   *zCharSet;    /
9700: 2a 20 53 65 74 20 6f 66 20 63 68 61 72 61 63 74  * Set of charact
9710: 65 72 73 20 74 6f 20 74 72 69 6d 20 2a 2f 0a 20  ers to trim */. 
9720: 20 69 6e 74 20 6e 49 6e 3b 20 20 20 20 20 20 20   int nIn;       
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9750: 62 79 74 65 73 20 69 6e 20 69 6e 70 75 74 20 2a  bytes in input *
9760: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 20 2f 2a 20 31 3a 20 74 72 69 6d        /* 1: trim
9790: 6c 65 66 74 20 20 32 3a 20 74 72 69 6d 72 69 67  left  2: trimrig
97a0: 68 74 20 20 33 3a 20 74 72 69 6d 20 2a 2f 0a 20  ht  3: trim */. 
97b0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
97e0: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
97f0: 20 63 68 61 72 20 2a 61 4c 65 6e 20 3d 20 30 3b   char *aLen = 0;
9800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
9810: 67 74 68 20 6f 66 20 65 61 63 68 20 63 68 61 72  gth of each char
9820: 61 63 74 65 72 20 69 6e 20 7a 43 68 61 72 53 65  acter in zCharSe
9830: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
9840: 63 68 61 72 20 2a 2a 61 7a 43 68 61 72 20 3d 20  char **azChar = 
9850: 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  0;       /* Indi
9860: 76 69 64 75 61 6c 20 63 68 61 72 61 63 74 65 72  vidual character
9870: 73 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f  s in zCharSet */
9880: 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 20 20 20  .  int nChar;   
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
98b0: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
98c0: 7a 43 68 61 72 53 65 74 20 2a 2f 0a 0a 20 20 69  zCharSet */..  i
98d0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
98e0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
98f0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
9900: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
9910: 20 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76   zIn = sqlite3_v
9920: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
9930: 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30  ]);.  if( zIn==0
9940: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 49 6e   ) return;.  nIn
9950: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
9960: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
9970: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 3d 3d  .  assert( zIn==
9980: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
9990: 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20  xt(argv[0]) );. 
99a0: 20 69 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a   if( argc==1 ){.
99b0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
99c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
99d0: 65 6e 4f 6e 65 5b 5d 20 3d 20 7b 20 31 20 7d 3b  enOne[] = { 1 };
99e0: 0a 20 20 20 20 73 74 61 74 69 63 20 75 6e 73 69  .    static unsi
99f0: 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73  gned char * cons
9a00: 74 20 61 7a 4f 6e 65 5b 5d 20 3d 20 7b 20 28 75  t azOne[] = { (u
9a10: 38 2a 29 22 20 22 20 7d 3b 0a 20 20 20 20 6e 43  8*)" " };.    nC
9a20: 68 61 72 20 3d 20 31 3b 0a 20 20 20 20 61 4c 65  har = 1;.    aLe
9a30: 6e 20 3d 20 28 75 38 2a 29 6c 65 6e 4f 6e 65 3b  n = (u8*)lenOne;
9a40: 0a 20 20 20 20 61 7a 43 68 61 72 20 3d 20 28 75  .    azChar = (u
9a50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 29  nsigned char **)
9a60: 61 7a 4f 6e 65 3b 0a 20 20 20 20 7a 43 68 61 72  azOne;.    zChar
9a70: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
9a80: 20 69 66 28 20 28 7a 43 68 61 72 53 65 74 20 3d   if( (zCharSet =
9a90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
9aa0: 65 78 74 28 61 72 67 76 5b 31 5d 29 29 3d 3d 30  ext(argv[1]))==0
9ab0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
9ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
9ad0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
9ae0: 20 2a 7a 3b 0a 20 20 20 20 66 6f 72 28 7a 3d 7a   *z;.    for(z=z
9af0: 43 68 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30  CharSet, nChar=0
9b00: 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a  ; *z; nChar++){.
9b10: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
9b20: 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 7d  P_UTF8(z);.    }
9b30: 0a 20 20 20 20 69 66 28 20 6e 43 68 61 72 3e 30  .    if( nChar>0
9b40: 20 29 7b 0a 20 20 20 20 20 20 61 7a 43 68 61 72   ){.      azChar
9b50: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
9b60: 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29  (context, ((i64)
9b70: 6e 43 68 61 72 29 2a 28 73 69 7a 65 6f 66 28 63  nChar)*(sizeof(c
9b80: 68 61 72 2a 29 2b 31 29 29 3b 0a 20 20 20 20 20  har*)+1));.     
9b90: 20 69 66 28 20 61 7a 43 68 61 72 3d 3d 30 20 29   if( azChar==0 )
9ba0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
9bb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9bc0: 61 4c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64  aLen = (unsigned
9bd0: 20 63 68 61 72 2a 29 26 61 7a 43 68 61 72 5b 6e   char*)&azChar[n
9be0: 43 68 61 72 5d 3b 0a 20 20 20 20 20 20 66 6f 72  Char];.      for
9bf0: 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43 68  (z=zCharSet, nCh
9c00: 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b  ar=0; *z; nChar+
9c10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 68  +){.        azCh
9c20: 61 72 5b 6e 43 68 61 72 5d 20 3d 20 28 75 6e 73  ar[nChar] = (uns
9c30: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 3b 0a  igned char *)z;.
9c40: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
9c50: 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20  KIP_UTF8(z);.   
9c60: 20 20 20 20 20 61 4c 65 6e 5b 6e 43 68 61 72 5d       aLen[nChar]
9c70: 20 3d 20 28 75 38 29 28 7a 20 2d 20 61 7a 43 68   = (u8)(z - azCh
9c80: 61 72 5b 6e 43 68 61 72 5d 29 3b 0a 20 20 20 20  ar[nChar]);.    
9c90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9ca0: 69 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20  if( nChar>0 ){. 
9cb0: 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54     flags = SQLIT
9cc0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 73 71 6c  E_PTR_TO_INT(sql
9cd0: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
9ce0: 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 69 66  ontext));.    if
9cf0: 28 20 66 6c 61 67 73 20 26 20 31 20 29 7b 0a 20  ( flags & 1 ){. 
9d00: 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e       while( nIn>
9d10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
9d20: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20   len = 0;.      
9d30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68    for(i=0; i<nCh
9d40: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
9d50: 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69      len = aLen[i
9d60: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
9d70: 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65 6d   len<=nIn && mem
9d80: 63 6d 70 28 7a 49 6e 2c 20 61 7a 43 68 61 72 5b  cmp(zIn, azChar[
9d90: 69 5d 2c 20 6c 65 6e 29 3d 3d 30 20 29 20 62 72  i], len)==0 ) br
9da0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
9db0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43         if( i>=nC
9dc0: 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  har ) break;.   
9dd0: 20 20 20 20 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b       zIn += len;
9de0: 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20  .        nIn -= 
9df0: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
9e00: 20 7d 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73   }.    if( flags
9e10: 20 26 20 32 20 29 7b 0a 20 20 20 20 20 20 77 68   & 2 ){.      wh
9e20: 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20  ile( nIn>0 ){.  
9e30: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
9e40: 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
9e50: 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
9e60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
9e70: 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20   = aLen[i];.    
9e80: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e        if( len<=n
9e90: 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 7a 49  In && memcmp(&zI
9ea0: 6e 5b 6e 49 6e 2d 6c 65 6e 5d 2c 61 7a 43 68 61  n[nIn-len],azCha
9eb0: 72 5b 69 5d 2c 6c 65 6e 29 3d 3d 30 20 29 20 62  r[i],len)==0 ) b
9ec0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
9ed0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e          if( i>=n
9ee0: 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Char ) break;.  
9ef0: 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e        nIn -= len
9f00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9f10: 20 20 20 20 69 66 28 20 7a 43 68 61 72 53 65 74      if( zCharSet
9f20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9f30: 33 5f 66 72 65 65 28 61 7a 43 68 61 72 29 3b 0a  3_free(azChar);.
9f40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
9f50: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
9f60: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
9f70: 7a 49 6e 2c 20 6e 49 6e 2c 20 53 51 4c 49 54 45  zIn, nIn, SQLITE
9f80: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a  _TRANSIENT);.}..
9f90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9fa0: 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51  NABLE_UNKNOWN_SQ
9fb0: 4c 5f 46 55 4e 43 54 49 4f 4e 0a 2f 2a 0a 2a 2a  L_FUNCTION./*.**
9fc0: 20 54 68 65 20 22 75 6e 6b 6e 6f 77 6e 22 20 66   The "unknown" f
9fd0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6d  unction is autom
9fe0: 61 74 69 63 61 6c 6c 79 20 73 75 62 73 74 69 74  atically substit
9ff0: 75 74 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  uted in place of
a000: 0a 2a 2a 20 61 6e 79 20 75 6e 72 65 63 6f 67 6e  .** any unrecogn
a010: 69 7a 65 64 20 66 75 6e 63 74 69 6f 6e 20 6e 61  ized function na
a020: 6d 65 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 6e  me when doing an
a030: 20 45 58 50 4c 41 49 4e 20 6f 72 20 45 58 50 4c   EXPLAIN or EXPL
a040: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a  AIN QUERY PLAN.*
a050: 2a 20 77 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * when the SQLIT
a060: 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e  E_ENABLE_UNKNOWN
a070: 5f 46 55 4e 43 54 49 4f 4e 20 63 6f 6d 70 69 6c  _FUNCTION compil
a080: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
a090: 20 75 73 65 64 2e 0a 2a 2a 20 57 68 65 6e 20 74   used..** When t
a0a0: 68 65 20 22 73 71 6c 69 74 65 33 22 20 63 6f 6d  he "sqlite3" com
a0b0: 6d 61 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 20  mand-line shell 
a0c0: 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 74  is built using t
a0d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  his functionalit
a0e0: 79 2c 0a 2a 2a 20 74 68 61 74 20 61 6c 6c 6f 77  y,.** that allow
a0f0: 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 6f 72 20  s an EXPLAIN or 
a100: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
a110: 41 4e 20 66 6f 72 20 63 6f 6d 70 6c 65 78 20 71  AN for complex q
a120: 75 65 72 69 65 73 0a 2a 2a 20 69 6e 76 6f 6c 76  ueries.** involv
a130: 69 6e 67 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d  ing application-
a140: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
a150: 73 20 74 6f 20 62 65 20 65 78 61 6d 69 6e 65 64  s to be examined
a160: 20 69 6e 20 61 20 67 65 6e 65 72 69 63 0a 2a 2a   in a generic.**
a170: 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 0a   sqlite3 shell..
a180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
a190: 6e 6b 6e 6f 77 6e 46 75 6e 63 28 0a 20 20 73 71  nknownFunc(.  sq
a1a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
a1b0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
a1c0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
a1d0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
a1e0: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 23 65  /* no-op */.}.#e
a1f0: 6e 64 69 66 20 2f 2a 53 51 4c 49 54 45 5f 45 4e  ndif /*SQLITE_EN
a200: 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c  ABLE_UNKNOWN_SQL
a210: 5f 46 55 4e 43 54 49 4f 4e 2a 2f 0a 0a 0a 2f 2a  _FUNCTION*/.../*
a220: 20 49 4d 50 3a 20 52 2d 32 35 33 36 31 2d 31 36   IMP: R-25361-16
a230: 31 35 30 20 54 68 69 73 20 66 75 6e 63 74 69 6f  150 This functio
a240: 6e 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  n is omitted fro
a250: 6d 20 53 51 4c 69 74 65 20 62 79 20 64 65 66 61  m SQLite by defa
a260: 75 6c 74 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e  ult. It.** is on
a270: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20  ly available if 
a280: 74 68 65 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44  the SQLITE_SOUND
a290: 45 58 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  EX compile-time 
a2a0: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 2a  option is used.*
a2b0: 2a 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73  * when SQLite is
a2c0: 20 62 75 69 6c 74 2e 0a 2a 2f 0a 23 69 66 64 65   built..*/.#ifde
a2d0: 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58  f SQLITE_SOUNDEX
a2e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
a2f0: 68 65 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64  he soundex encod
a300: 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a  ing of a word..*
a310: 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d 35 39 37 38  *.** IMP: R-5978
a320: 32 2d 30 30 30 37 32 20 54 68 65 20 73 6f 75 6e  2-00072 The soun
a330: 64 65 78 28 58 29 20 66 75 6e 63 74 69 6f 6e 20  dex(X) function 
a340: 72 65 74 75 72 6e 73 20 61 20 73 74 72 69 6e 67  returns a string
a350: 20 74 68 61 74 20 69 73 20 74 68 65 0a 2a 2a 20   that is the.** 
a360: 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e 67  soundex encoding
a370: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 58   of the string X
a380: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
a390: 64 20 73 6f 75 6e 64 65 78 46 75 6e 63 28 0a 20  d soundexFunc(. 
a3a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
a3b0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
a3c0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
a3d0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
a3e0: 0a 20 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b  .  char zResult[
a3f0: 38 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  8];.  const u8 *
a400: 7a 49 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  zIn;.  int i, j;
a410: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
a420: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 43  unsigned char iC
a430: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c  ode[] = {.    0,
a440: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a450: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a460: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
a470: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a480: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a490: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a4a0: 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,.    0, 0, 0, 0
a4b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a4c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a4d0: 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20  0, 0,.    0, 0, 
a4e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a4f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a500: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c   0, 0, 0,.    0,
a510: 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20   0, 1, 2, 3, 0, 
a520: 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32  1, 2, 0, 0, 2, 2
a530: 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20  , 4, 5, 5, 0,.  
a540: 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c    1, 2, 6, 2, 3,
a550: 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20   0, 1, 0, 2, 0, 
a560: 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  2, 0, 0, 0, 0, 0
a570: 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32  ,.    0, 0, 1, 2
a580: 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c  , 3, 0, 1, 2, 0,
a590: 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20   0, 2, 2, 4, 5, 
a5a0: 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20  5, 0,.    1, 2, 
a5b0: 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30  6, 2, 3, 0, 1, 0
a5c0: 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c  , 2, 0, 2, 0, 0,
a5d0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20   0, 0, 0,.  };. 
a5e0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
a5f0: 20 29 3b 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a   );.  zIn = (u8*
a600: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
a610: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
a620: 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 7a 49 6e  if( zIn==0 ) zIn
a630: 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20 20 66 6f   = (u8*)"";.  fo
a640: 72 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26  r(i=0; zIn[i] &&
a650: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61   !sqlite3Isalpha
a660: 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  (zIn[i]); i++){}
a670: 0a 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20 29 7b  .  if( zIn[i] ){
a680: 0a 20 20 20 20 75 38 20 70 72 65 76 63 6f 64 65  .    u8 prevcode
a690: 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26   = iCode[zIn[i]&
a6a0: 30 78 37 66 5d 3b 0a 20 20 20 20 7a 52 65 73 75  0x7f];.    zResu
a6b0: 6c 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 54  lt[0] = sqlite3T
a6c0: 6f 75 70 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a  oupper(zIn[i]);.
a6d0: 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34      for(j=1; j<4
a6e0: 20 26 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29   && zIn[i]; i++)
a6f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65  {.      int code
a700: 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26   = iCode[zIn[i]&
a710: 30 78 37 66 5d 3b 0a 20 20 20 20 20 20 69 66 28  0x7f];.      if(
a720: 20 63 6f 64 65 3e 30 20 29 7b 0a 20 20 20 20 20   code>0 ){.     
a730: 20 20 20 69 66 28 20 63 6f 64 65 21 3d 70 72 65     if( code!=pre
a740: 76 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  vcode ){.       
a750: 20 20 20 70 72 65 76 63 6f 64 65 20 3d 20 63 6f     prevcode = co
a760: 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 52  de;.          zR
a770: 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64  esult[j++] = cod
a780: 65 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 20  e + '0';.       
a790: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
a7a0: 20 20 20 20 20 20 20 20 70 72 65 76 63 6f 64 65          prevcode
a7b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
a7c0: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 6a    }.    while( j
a7d0: 3c 34 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 73  <4 ){.      zRes
a7e0: 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a  ult[j++] = '0';.
a7f0: 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c      }.    zResul
a800: 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  t[j] = 0;.    sq
a810: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
a820: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75  t(context, zResu
a830: 6c 74 2c 20 34 2c 20 53 51 4c 49 54 45 5f 54 52  lt, 4, SQLITE_TR
a840: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
a850: 65 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  e{.    /* IMP: R
a860: 2d 36 34 38 39 34 2d 35 30 33 32 31 20 54 68 65  -64894-50321 The
a870: 20 73 74 72 69 6e 67 20 22 3f 30 30 30 22 20 69   string "?000" i
a880: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
a890: 65 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a  e argument.    *
a8a0: 2a 20 69 73 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e  * is NULL or con
a8b0: 74 61 69 6e 73 20 6e 6f 20 41 53 43 49 49 20 61  tains no ASCII a
a8c0: 6c 70 68 61 62 65 74 69 63 20 63 68 61 72 61 63  lphabetic charac
a8d0: 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ters. */.    sql
a8e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
a8f0: 28 63 6f 6e 74 65 78 74 2c 20 22 3f 30 30 30 22  (context, "?000"
a900: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , 4, SQLITE_STAT
a910: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  IC);.  }.}.#endi
a920: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 55 4e  f /* SQLITE_SOUN
a930: 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  DEX */..#ifndef 
a940: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
a950: 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
a960: 20 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   A function that
a970: 20 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64 2d   loads a shared-
a980: 6c 69 62 72 61 72 79 20 65 78 74 65 6e 73 69 6f  library extensio
a990: 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 4e  n then returns N
a9a0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
a9b0: 6f 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c 69  oid loadExt(sqli
a9c0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
a9d0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
a9e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
a9f0: 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63  argv){.  const c
aa00: 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63 6f  har *zFile = (co
aa10: 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
aa20: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
aa30: 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20  gv[0]);.  const 
aa40: 63 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20 73  char *zProc;.  s
aa50: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
aa60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
aa70: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
aa80: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
aa90: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 69 73 61   = 0;..  /* Disa
aaa0: 6c 6c 6f 77 20 74 68 65 20 6c 6f 61 64 5f 65 78  llow the load_ex
aab0: 74 65 6e 73 69 6f 6e 28 29 20 53 51 4c 20 66 75  tension() SQL fu
aac0: 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74 68  nction unless th
aad0: 65 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  e SQLITE_LoadExt
aae0: 46 75 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69  Func.  ** flag i
aaf0: 73 20 73 65 74 2e 20 20 53 65 65 20 74 68 65 20  s set.  See the 
ab00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
ab10: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20  oad_extension() 
ab20: 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  API..  */.  if( 
ab30: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
ab40: 49 54 45 5f 4c 6f 61 64 45 78 74 46 75 6e 63 29  ITE_LoadExtFunc)
ab50: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
ab60: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
ab70: 63 6f 6e 74 65 78 74 2c 20 22 6e 6f 74 20 61 75  context, "not au
ab80: 74 68 6f 72 69 7a 65 64 22 2c 20 2d 31 29 3b 0a  thorized", -1);.
ab90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
aba0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29  .  if( argc==2 )
abb0: 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 28 63  {.    zProc = (c
abc0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
abd0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
abe0: 72 67 76 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65  rgv[1]);.  }else
abf0: 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 30 3b  {.    zProc = 0;
ac00: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65  .  }.  if( zFile
ac10: 20 26 26 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64   && sqlite3_load
ac20: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  _extension(db, z
ac30: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
ac40: 72 72 4d 73 67 29 20 29 7b 0a 20 20 20 20 73 71  rrMsg) ){.    sq
ac50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
ac60: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72  or(context, zErr
ac70: 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  Msg, -1);.    sq
ac80: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
ac90: 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  sg);.  }.}.#endi
aca0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  f.../*.** An ins
acb0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
acc0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
acd0: 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6e 74 65   holds the conte
ace0: 78 74 20 6f 66 20 61 0a 2a 2a 20 73 75 6d 28 29  xt of a.** sum()
acf0: 20 6f 72 20 61 76 67 28 29 20 61 67 67 72 65 67   or avg() aggreg
ad00: 61 74 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e  ate computation.
ad10: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
ad20: 63 74 20 53 75 6d 43 74 78 20 53 75 6d 43 74 78  ct SumCtx SumCtx
ad30: 3b 0a 73 74 72 75 63 74 20 53 75 6d 43 74 78 20  ;.struct SumCtx 
ad40: 7b 0a 20 20 64 6f 75 62 6c 65 20 72 53 75 6d 3b  {.  double rSum;
ad50: 20 20 20 20 20 20 2f 2a 20 46 6c 6f 61 74 69 6e        /* Floatin
ad60: 67 20 70 6f 69 6e 74 20 73 75 6d 20 2a 2f 0a 20  g point sum */. 
ad70: 20 69 36 34 20 69 53 75 6d 3b 20 20 20 20 20 20   i64 iSum;      
ad80: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 73 75     /* Integer su
ad90: 6d 20 2a 2f 20 20 20 0a 20 20 69 36 34 20 63 6e  m */   .  i64 cn
ada0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  t;          /* N
adb0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
adc0: 73 20 73 75 6d 6d 65 64 20 2a 2f 0a 20 20 75 38  s summed */.  u8
add0: 20 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20 20 20   overflow;      
ade0: 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 74 65 67  /* True if integ
adf0: 65 72 20 6f 76 65 72 66 6c 6f 77 20 73 65 65 6e  er overflow seen
ae00: 20 2a 2f 0a 20 20 75 38 20 61 70 70 72 6f 78 3b   */.  u8 approx;
ae10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
ae20: 69 66 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 76  if non-integer v
ae30: 61 6c 75 65 20 77 61 73 20 69 6e 70 75 74 20 74  alue was input t
ae40: 6f 20 74 68 65 20 73 75 6d 20 2a 2f 0a 7d 3b 0a  o the sum */.};.
ae50: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
ae60: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
ae70: 74 68 65 20 73 75 6d 2c 20 61 76 65 72 61 67 65  the sum, average
ae80: 2c 20 61 6e 64 20 74 6f 74 61 6c 2e 0a 2a 2a 0a  , and total..**.
ae90: 2a 2a 20 54 68 65 20 53 55 4d 28 29 20 66 75 6e  ** The SUM() fun
aea0: 63 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 20 74 68  ction follows th
aeb0: 65 20 28 62 72 6f 6b 65 6e 29 20 53 51 4c 20 73  e (broken) SQL s
aec0: 74 61 6e 64 61 72 64 20 77 68 69 63 68 20 6d 65  tandard which me
aed0: 61 6e 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 72  ans.** that it r
aee0: 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 69  eturns NULL if i
aef0: 74 20 73 75 6d 73 20 6f 76 65 72 20 6e 6f 20 69  t sums over no i
af00: 6e 70 75 74 73 2e 20 20 54 4f 54 41 4c 20 72 65  nputs.  TOTAL re
af10: 74 75 72 6e 73 0a 2a 2a 20 30 2e 30 20 69 6e 20  turns.** 0.0 in 
af20: 74 68 61 74 20 63 61 73 65 2e 20 20 49 6e 20 61  that case.  In a
af30: 64 64 69 74 69 6f 6e 2c 20 54 4f 54 41 4c 20 61  ddition, TOTAL a
af40: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 61 20  lways returns a 
af50: 66 6c 6f 61 74 20 77 68 65 72 65 0a 2a 2a 20 53  float where.** S
af60: 55 4d 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  UM might return 
af70: 61 6e 20 69 6e 74 65 67 65 72 20 69 66 20 69 74  an integer if it
af80: 20 6e 65 76 65 72 20 65 6e 63 6f 75 6e 74 65 72   never encounter
af90: 73 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  s a floating poi
afa0: 6e 74 0a 2a 2a 20 76 61 6c 75 65 2e 20 20 54 4f  nt.** value.  TO
afb0: 54 41 4c 20 6e 65 76 65 72 20 66 61 69 6c 73 2c  TAL never fails,
afc0: 20 62 75 74 20 53 55 4d 20 6d 69 67 68 74 20 74   but SUM might t
afd0: 68 72 6f 75 67 68 20 61 6e 20 65 78 63 65 70 74  hrough an except
afe0: 69 6f 6e 20 69 66 0a 2a 2a 20 69 74 20 6f 76 65  ion if.** it ove
aff0: 72 66 6c 6f 77 73 20 61 6e 20 69 6e 74 65 67 65  rflows an intege
b000: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b010: 64 20 73 75 6d 53 74 65 70 28 73 71 6c 69 74 65  d sumStep(sqlite
b020: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
b030: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
b040: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
b050: 67 76 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70  gv){.  SumCtx *p
b060: 3b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  ;.  int type;.  
b070: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
b080: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
b090: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 70  METER(argc);.  p
b0a0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
b0b0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
b0c0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
b0d0: 29 3b 0a 20 20 74 79 70 65 20 3d 20 73 71 6c 69  );.  type = sqli
b0e0: 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69  te3_value_numeri
b0f0: 63 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3b  c_type(argv[0]);
b100: 0a 20 20 69 66 28 20 70 20 26 26 20 74 79 70 65  .  if( p && type
b110: 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  !=SQLITE_NULL ){
b120: 0a 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20  .    p->cnt++;. 
b130: 20 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c     if( type==SQL
b140: 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
b150: 20 20 20 20 20 69 36 34 20 76 20 3d 20 73 71 6c       i64 v = sql
b160: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
b170: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
b180: 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 76 3b 0a 20   p->rSum += v;. 
b190: 20 20 20 20 20 69 66 28 20 28 70 2d 3e 61 70 70       if( (p->app
b1a0: 72 6f 78 7c 70 2d 3e 6f 76 65 72 66 6c 6f 77 29  rox|p->overflow)
b1b0: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 41 64  ==0 && sqlite3Ad
b1c0: 64 49 6e 74 36 34 28 26 70 2d 3e 69 53 75 6d 2c  dInt64(&p->iSum,
b1d0: 20 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   v) ){.        p
b1e0: 2d 3e 61 70 70 72 6f 78 20 3d 20 70 2d 3e 6f 76  ->approx = p->ov
b1f0: 65 72 66 6c 6f 77 20 3d 20 31 3b 0a 20 20 20 20  erflow = 1;.    
b200: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
b210: 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20       p->rSum += 
b220: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
b230: 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  uble(argv[0]);. 
b240: 20 20 20 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d       p->approx =
b250: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
b260: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b270: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 73  MIT_WINDOWFUNC.s
b280: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 49 6e  tatic void sumIn
b290: 76 65 72 73 65 28 73 71 6c 69 74 65 33 5f 63 6f  verse(sqlite3_co
b2a0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
b2b0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
b2c0: 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a  3_value**argv){.
b2d0: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69    SumCtx *p;.  i
b2e0: 6e 74 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72  nt type;.  asser
b2f0: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
b300: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
b310: 28 61 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71  (argc);.  p = sq
b320: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
b330: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
b340: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
b350: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  type = sqlite3_v
b360: 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70  alue_numeric_typ
b370: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a  e(argv[0]);.  /*
b380: 20 70 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e   p is always non
b390: 2d 4e 55 4c 4c 20 62 65 63 61 75 73 65 20 73 75  -NULL because su
b3a0: 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 68 61 76  mStep() will hav
b3b0: 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 69  e been called fi
b3c0: 72 73 74 0a 20 20 2a 2a 20 74 6f 20 69 6e 69 74  rst.  ** to init
b3d0: 69 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 20 20 69  ialize it */.  i
b3e0: 66 28 20 41 4c 57 41 59 53 28 70 29 20 26 26 20  f( ALWAYS(p) && 
b3f0: 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  type!=SQLITE_NUL
b400: 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  L ){.    assert(
b410: 20 70 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20   p->cnt>0 );.   
b420: 20 70 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 61   p->cnt--;.    a
b430: 73 73 65 72 74 28 20 74 79 70 65 3d 3d 53 51 4c  ssert( type==SQL
b440: 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70  ITE_INTEGER || p
b450: 2d 3e 61 70 70 72 6f 78 20 29 3b 0a 20 20 20 20  ->approx );.    
b460: 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45  if( type==SQLITE
b470: 5f 49 4e 54 45 47 45 52 20 26 26 20 70 2d 3e 61  _INTEGER && p->a
b480: 70 70 72 6f 78 3d 3d 30 20 29 7b 0a 20 20 20 20  pprox==0 ){.    
b490: 20 20 69 36 34 20 76 20 3d 20 73 71 6c 69 74 65    i64 v = sqlite
b4a0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
b4b0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d  gv[0]);.      p-
b4c0: 3e 72 53 75 6d 20 2d 3d 20 76 3b 0a 20 20 20 20  >rSum -= v;.    
b4d0: 20 20 70 2d 3e 69 53 75 6d 20 2d 3d 20 76 3b 0a    p->iSum -= v;.
b4e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4f0: 20 70 2d 3e 72 53 75 6d 20 2d 3d 20 73 71 6c 69   p->rSum -= sqli
b500: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
b510: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7d  (argv[0]);.    }
b520: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
b530: 65 66 69 6e 65 20 73 75 6d 49 6e 76 65 72 73 65  efine sumInverse
b540: 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   0.#endif /* SQL
b550: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
b560: 55 4e 43 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  UNC */.static vo
b570: 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65 28 73  id sumFinalize(s
b580: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
b590: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43  context){.  SumC
b5a0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
b5b0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
b5c0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
b5d0: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
b5e0: 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 69  ->cnt>0 ){.    i
b5f0: 66 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 29  f( p->overflow )
b600: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b610: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
b620: 74 65 78 74 2c 22 69 6e 74 65 67 65 72 20 6f 76  text,"integer ov
b630: 65 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20 20 20  erflow",-1);.   
b640: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 61 70   }else if( p->ap
b650: 70 72 6f 78 20 29 7b 0a 20 20 20 20 20 20 73 71  prox ){.      sq
b660: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
b670: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e  ble(context, p->
b680: 72 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rSum);.    }else
b690: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b6a0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
b6b0: 74 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29 3b 0a  text, p->iSum);.
b6c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
b6d0: 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e 61 6c  ic void avgFinal
b6e0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
b6f0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
b700: 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20   SumCtx *p;.  p 
b710: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
b720: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
b730: 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ext, 0);.  if( p
b740: 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a   && p->cnt>0 ){.
b750: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b760: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
b770: 74 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f 75 62  t, p->rSum/(doub
b780: 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d 0a  le)p->cnt);.  }.
b790: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f  }.static void to
b7a0: 74 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  talFinalize(sqli
b7b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
b7c0: 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20  text){.  SumCtx 
b7d0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
b7e0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
b7f0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
b800: 0a 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20  .  /* (double)0 
b810: 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54  In case of SQLIT
b820: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
b830: 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 73 71  POINT... */.  sq
b840: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
b850: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  ble(context, p ?
b860: 20 70 2d 3e 72 53 75 6d 20 3a 20 28 64 6f 75 62   p->rSum : (doub
b870: 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  le)0);.}../*.** 
b880: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
b890: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
b8a0: 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69 6e 66  ack of state inf
b8b0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
b8c0: 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67 67 72  .** count() aggr
b8d0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  egate function..
b8e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
b8f0: 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e 74  t CountCtx Count
b900: 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75 6e  Ctx;.struct Coun
b910: 74 43 74 78 20 7b 0a 20 20 69 36 34 20 6e 3b 0a  tCtx {.  i64 n;.
b920: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b930: 42 55 47 0a 20 20 69 6e 74 20 62 49 6e 76 65 72  BUG.  int bInver
b940: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
b950: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
b960: 20 78 49 6e 76 65 72 73 65 28 29 20 65 76 65 72   xInverse() ever
b970: 20 63 61 6c 6c 65 64 20 2a 2f 0a 23 65 6e 64 69   called */.#endi
b980: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  f.};../*.** Rout
b990: 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ines to implemen
b9a0: 74 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67  t the count() ag
b9b0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b9c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b9d0: 20 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74   countStep(sqlit
b9e0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
b9f0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
ba00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
ba10: 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78  rgv){.  CountCtx
ba20: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
ba30: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
ba40: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
ba50: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
ba60: 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c   (argc==0 || SQL
ba70: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
ba80: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
ba90: 76 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20  v[0])) && p ){. 
baa0: 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 0a     p->n++;.  }..
bab0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bac0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
bad0: 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f   /* The sqlite3_
bae0: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
baf0: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65  ) function is de
bb00: 70 72 65 63 61 74 65 64 2e 20 20 42 75 74 20 6a  precated.  But j
bb10: 75 73 74 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  ust to make.  **
bb20: 20 73 75 72 65 20 69 74 20 73 74 69 6c 6c 20 6f   sure it still o
bb30: 70 65 72 61 74 65 73 20 63 6f 72 72 65 63 74 6c  perates correctl
bb40: 79 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 69  y, verify that i
bb50: 74 73 20 63 6f 75 6e 74 20 61 67 72 65 65 73 20  ts count agrees 
bb60: 77 69 74 68 20 6f 75 72 20 0a 20 20 2a 2a 20 69  with our .  ** i
bb70: 6e 74 65 72 6e 61 6c 20 63 6f 75 6e 74 20 77 68  nternal count wh
bb80: 65 6e 20 75 73 69 6e 67 20 63 6f 75 6e 74 28 2a  en using count(*
bb90: 29 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 74  ) and when the t
bba0: 6f 74 61 6c 20 63 6f 75 6e 74 20 63 61 6e 20 62  otal count can b
bbb0: 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 65 64  e.  ** expressed
bbc0: 20 61 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74   as a 32-bit int
bbd0: 65 67 65 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72  eger. */.  asser
bbe0: 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 70 3d  t( argc==1 || p=
bbf0: 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78 37 66 66  =0 || p->n>0x7ff
bc00: 66 66 66 66 66 20 7c 7c 20 70 2d 3e 62 49 6e 76  fffff || p->bInv
bc10: 65 72 73 65 0a 20 20 20 20 20 20 20 20 20 20 7c  erse.          |
bc20: 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69 74 65 33 5f  | p->n==sqlite3_
bc30: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
bc40: 63 6f 6e 74 65 78 74 29 20 29 3b 0a 23 65 6e 64  context) );.#end
bc50: 69 66 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76  if.}   .static v
bc60: 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a  oid countFinaliz
bc70: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
bc80: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43  t *context){.  C
bc90: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
bca0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
bcb0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
bcc0: 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ext, 0);.  sqlit
bcd0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
bce0: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
bcf0: 6e 20 3a 20 30 29 3b 0a 7d 0a 23 69 66 6e 64 65  n : 0);.}.#ifnde
bd00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
bd10: 4e 44 4f 57 46 55 4e 43 0a 73 74 61 74 69 63 20  NDOWFUNC.static 
bd20: 76 6f 69 64 20 63 6f 75 6e 74 49 6e 76 65 72 73  void countInvers
bd30: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
bd40: 74 20 2a 63 74 78 2c 20 69 6e 74 20 61 72 67 63  t *ctx, int argc
bd50: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
bd60: 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74  **argv){.  Count
bd70: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
bd80: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
bd90: 63 6f 6e 74 65 78 74 28 63 74 78 2c 20 73 69 7a  context(ctx, siz
bda0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 2f 2a 20 70  eof(*p));.  /* p
bdb0: 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
bdc0: 55 4c 4c 20 73 69 6e 63 65 20 63 6f 75 6e 74 53  ULL since countS
bdd0: 74 65 70 28 29 20 77 69 6c 6c 20 68 61 76 65 20  tep() will have 
bde0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 69 72 73  been called firs
bdf0: 74 20 2a 2f 0a 20 20 69 66 28 20 28 61 72 67 63  t */.  if( (argc
be00: 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55  ==0 || SQLITE_NU
be10: 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL!=sqlite3_valu
be20: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29  e_type(argv[0]))
be30: 20 26 26 20 41 4c 57 41 59 53 28 70 29 20 29 7b   && ALWAYS(p) ){
be40: 0a 20 20 20 20 70 2d 3e 6e 2d 2d 3b 0a 23 69 66  .    p->n--;.#if
be50: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
be60: 0a 20 20 20 20 70 2d 3e 62 49 6e 76 65 72 73 65  .    p->bInverse
be70: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 7d   = 1;.#endif.  }
be80: 0a 7d 20 20 20 0a 23 65 6c 73 65 0a 23 20 64 65  .}   .#else.# de
be90: 66 69 6e 65 20 63 6f 75 6e 74 49 6e 76 65 72 73  fine countInvers
bea0: 65 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  e 0.#endif /* SQ
beb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
bec0: 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  FUNC */../*.** R
bed0: 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65  outines to imple
bee0: 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64 20 6d  ment min() and m
bef0: 61 78 28 29 20 61 67 67 72 65 67 61 74 65 20 66  ax() aggregate f
bf00: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  unctions..*/.sta
bf10: 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78 53  tic void minmaxS
bf20: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
bf30: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
bf40: 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c   .  int NotUsed,
bf50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
bf60: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4d 65  e **argv.){.  Me
bf70: 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d 65 6d 20  m *pArg  = (Mem 
bf80: 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20 4d 65 6d  *)argv[0];.  Mem
bf90: 20 2a 70 42 65 73 74 3b 0a 20 20 55 4e 55 53 45   *pBest;.  UNUSE
bfa0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
bfb0: 73 65 64 29 3b 0a 0a 20 20 70 42 65 73 74 20 3d  sed);..  pBest =
bfc0: 20 28 4d 65 6d 20 2a 29 73 71 6c 69 74 65 33 5f   (Mem *)sqlite3_
bfd0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
bfe0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
bff0: 66 28 2a 70 42 65 73 74 29 29 3b 0a 20 20 69 66  f(*pBest));.  if
c000: 28 20 21 70 42 65 73 74 20 29 20 72 65 74 75 72  ( !pBest ) retur
c010: 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n;..  if( sqlite
c020: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 41 72  3_value_type(pAr
c030: 67 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  g)==SQLITE_NULL 
c040: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 65 73 74  ){.    if( pBest
c050: 2d 3e 66 6c 61 67 73 20 29 20 73 71 6c 69 74 65  ->flags ) sqlite
c060: 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74 6f 72  3SkipAccumulator
c070: 4c 6f 61 64 28 63 6f 6e 74 65 78 74 29 3b 0a 20  Load(context);. 
c080: 20 7d 65 6c 73 65 20 69 66 28 20 70 42 65 73 74   }else if( pBest
c090: 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  ->flags ){.    i
c0a0: 6e 74 20 6d 61 78 3b 0a 20 20 20 20 69 6e 74 20  nt max;.    int 
c0b0: 63 6d 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  cmp;.    CollSeq
c0c0: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
c0d0: 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28  3GetFuncCollSeq(
c0e0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 2f 2a  context);.    /*
c0f0: 20 54 68 69 73 20 73 74 65 70 20 66 75 6e 63 74   This step funct
c100: 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20  ion is used for 
c110: 62 6f 74 68 20 74 68 65 20 6d 69 6e 28 29 20 61  both the min() a
c120: 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65 67 61  nd max() aggrega
c130: 74 65 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  tes,.    ** the 
c140: 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20  only difference 
c150: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20  between the two 
c160: 62 65 69 6e 67 20 74 68 61 74 20 74 68 65 20 73  being that the s
c170: 65 6e 73 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ense of the.    
c180: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ** comparison is
c190: 20 69 6e 76 65 72 74 65 64 2e 20 46 6f 72 20 74   inverted. For t
c1a0: 68 65 20 6d 61 78 28 29 20 61 67 67 72 65 67 61  he max() aggrega
c1b0: 74 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  te, the.    ** s
c1c0: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
c1d0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
c1e0: 72 6e 73 20 28 76 6f 69 64 20 2a 29 2d 31 2e 20  rns (void *)-1. 
c1f0: 46 6f 72 20 6d 69 6e 28 29 20 69 74 0a 20 20 20  For min() it.   
c200: 20 2a 2a 20 72 65 74 75 72 6e 73 20 28 76 6f 69   ** returns (voi
c210: 64 20 2a 29 64 62 2c 20 77 68 65 72 65 20 64 62  d *)db, where db
c220: 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 33 2a   is the sqlite3*
c230: 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
c240: 72 2e 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 66  r..    ** Theref
c250: 6f 72 65 20 74 68 65 20 6e 65 78 74 20 73 74 61  ore the next sta
c260: 74 65 6d 65 6e 74 20 73 65 74 73 20 76 61 72 69  tement sets vari
c270: 61 62 6c 65 20 27 6d 61 78 27 20 74 6f 20 31 20  able 'max' to 1 
c280: 66 6f 72 20 74 68 65 20 6d 61 78 28 29 0a 20 20  for the max().  
c290: 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 2c 20    ** aggregate, 
c2a0: 6f 72 20 30 20 66 6f 72 20 6d 69 6e 28 29 2e 0a  or 0 for min()..
c2b0: 20 20 20 20 2a 2f 0a 20 20 20 20 6d 61 78 20 3d      */.    max =
c2c0: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
c2d0: 74 61 28 63 6f 6e 74 65 78 74 29 21 3d 30 3b 0a  ta(context)!=0;.
c2e0: 20 20 20 20 63 6d 70 20 3d 20 73 71 6c 69 74 65      cmp = sqlite
c2f0: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 42 65 73  3MemCompare(pBes
c300: 74 2c 20 70 41 72 67 2c 20 70 43 6f 6c 6c 29 3b  t, pArg, pColl);
c310: 0a 20 20 20 20 69 66 28 20 28 6d 61 78 20 26 26  .    if( (max &&
c320: 20 63 6d 70 3c 30 29 20 7c 7c 20 28 21 6d 61 78   cmp<0) || (!max
c330: 20 26 26 20 63 6d 70 3e 30 29 20 29 7b 0a 20 20   && cmp>0) ){.  
c340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
c350: 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41  emCopy(pBest, pA
c360: 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rg);.    }else{.
c370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 6b 69        sqlite3Ski
c380: 70 41 63 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64  pAccumulatorLoad
c390: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  (context);.    }
c3a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
c3b0: 65 73 74 2d 3e 64 62 20 3d 20 73 71 6c 69 74 65  est->db = sqlite
c3c0: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
c3d0: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
c3e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
c3f0: 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72 67  Copy(pBest, pArg
c400: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
c410: 76 6f 69 64 20 6d 69 6e 4d 61 78 56 61 6c 75 65  void minMaxValue
c420: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
c430: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
c440: 74 2c 20 69 6e 74 20 62 56 61 6c 75 65 29 7b 0a  t, int bValue){.
c450: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
c460: 2a 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d 20  *pRes;.  pRes = 
c470: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  (sqlite3_value *
c480: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
c490: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
c4a0: 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 52  xt, 0);.  if( pR
c4b0: 65 73 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52  es ){.    if( pR
c4c0: 65 73 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  es->flags ){.   
c4d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
c4e0: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
c4f0: 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20   pRes);.    }.  
c500: 20 20 69 66 28 20 62 56 61 6c 75 65 3d 3d 30 20    if( bValue==0 
c510: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
c520: 52 65 6c 65 61 73 65 28 70 52 65 73 29 3b 0a 20  Release(pRes);. 
c530: 20 7d 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c   }.}.#ifndef SQL
c540: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
c550: 55 4e 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UNC.static void 
c560: 6d 69 6e 4d 61 78 56 61 6c 75 65 28 73 71 6c 69  minMaxValue(sqli
c570: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
c580: 74 65 78 74 29 7b 0a 20 20 6d 69 6e 4d 61 78 56  text){.  minMaxV
c590: 61 6c 75 65 46 69 6e 61 6c 69 7a 65 28 63 6f 6e  alueFinalize(con
c5a0: 74 65 78 74 2c 20 31 29 3b 0a 7d 0a 23 65 6c 73  text, 1);.}.#els
c5b0: 65 0a 23 20 64 65 66 69 6e 65 20 6d 69 6e 4d 61  e.# define minMa
c5c0: 78 56 61 6c 75 65 20 30 0a 23 65 6e 64 69 66 20  xValue 0.#endif 
c5d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
c5e0: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 73 74 61  INDOWFUNC */.sta
c5f0: 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46  tic void minMaxF
c600: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
c610: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
c620: 29 7b 0a 20 20 6d 69 6e 4d 61 78 56 61 6c 75 65  ){.  minMaxValue
c630: 46 69 6e 61 6c 69 7a 65 28 63 6f 6e 74 65 78 74  Finalize(context
c640: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67  , 0);.}../*.** g
c650: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 45 58 50 52  roup_concat(EXPR
c660: 2c 20 3f 53 45 50 41 52 41 54 4f 52 3f 29 0a 2a  , ?SEPARATOR?).*
c670: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72  /.static void gr
c680: 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 28 0a 20  oupConcatStep(. 
c690: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
c6a0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
c6b0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
c6c0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
c6d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c6e0: 56 61 6c 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  Val;.  StrAccum 
c6f0: 2a 70 41 63 63 75 6d 3b 0a 20 20 63 6f 6e 73 74  *pAccum;.  const
c700: 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 69   char *zSep;.  i
c710: 6e 74 20 6e 56 61 6c 2c 20 6e 53 65 70 3b 0a 20  nt nVal, nSep;. 
c720: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
c730: 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20   || argc==2 );. 
c740: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
c750: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
c760: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
c770: 72 65 74 75 72 6e 3b 0a 20 20 70 41 63 63 75 6d  return;.  pAccum
c780: 20 3d 20 28 53 74 72 41 63 63 75 6d 2a 29 73 71   = (StrAccum*)sq
c790: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
c7a0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
c7b0: 20 73 69 7a 65 6f 66 28 2a 70 41 63 63 75 6d 29   sizeof(*pAccum)
c7c0: 29 3b 0a 0a 20 20 69 66 28 20 70 41 63 63 75 6d  );..  if( pAccum
c7d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
c7e0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
c7f0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
c800: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 6e  context);.    in
c810: 74 20 66 69 72 73 74 54 65 72 6d 20 3d 20 70 41  t firstTerm = pA
c820: 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 3d 3d 30  ccum->mxAlloc==0
c830: 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 6d 78  ;.    pAccum->mx
c840: 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c 69 6d  Alloc = db->aLim
c850: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
c860: 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 69 66 28  LENGTH];.    if(
c870: 20 21 66 69 72 73 74 54 65 72 6d 20 29 7b 0a 20   !firstTerm ){. 
c880: 20 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 32       if( argc==2
c890: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70   ){.        zSep
c8a0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
c8b0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
c8c0: 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e  v[1]);.        n
c8d0: 53 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Sep = sqlite3_va
c8e0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31  lue_bytes(argv[1
c8f0: 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
c900: 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
c910: 22 2c 22 3b 0a 20 20 20 20 20 20 20 20 6e 53 65  ",";.        nSe
c920: 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  p = 1;.      }. 
c930: 20 20 20 20 20 69 66 28 20 7a 53 65 70 20 29 20       if( zSep ) 
c940: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
c950: 6e 64 28 70 41 63 63 75 6d 2c 20 7a 53 65 70 2c  nd(pAccum, zSep,
c960: 20 6e 53 65 70 29 3b 0a 20 20 20 20 7d 0a 20 20   nSep);.    }.  
c970: 20 20 7a 56 61 6c 20 3d 20 28 63 68 61 72 2a 29    zVal = (char*)
c980: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
c990: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  xt(argv[0]);.   
c9a0: 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nVal = sqlite3_
c9b0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
c9c0: 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 56  [0]);.    if( zV
c9d0: 61 6c 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72  al ) sqlite3_str
c9e0: 5f 61 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20  _append(pAccum, 
c9f0: 7a 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 7d  zVal, nVal);.  }
ca00: 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .}.#ifndef SQLIT
ca10: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
ca20: 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72  C.static void gr
ca30: 6f 75 70 43 6f 6e 63 61 74 49 6e 76 65 72 73 65  oupConcatInverse
ca40: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
ca50: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
ca60: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
ca70: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
ca80: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 53  .){.  int n;.  S
ca90: 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b  trAccum *pAccum;
caa0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
cab0: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
cac0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
cad0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
cae0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
caf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 41 63 63  ) return;.  pAcc
cb00: 75 6d 20 3d 20 28 53 74 72 41 63 63 75 6d 2a 29  um = (StrAccum*)
cb10: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
cb20: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
cb30: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63 63 75  t, sizeof(*pAccu
cb40: 6d 29 29 3b 0a 20 20 2f 2a 20 70 41 63 63 75 6d  m));.  /* pAccum
cb50: 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
cb60: 55 4c 4c 20 73 69 6e 63 65 20 67 72 6f 75 70 43  ULL since groupC
cb70: 6f 6e 63 61 74 53 74 65 70 28 29 20 77 69 6c 6c  oncatStep() will
cb80: 20 68 61 76 65 20 61 6c 77 61 79 73 0a 20 20 2a   have always.  *
cb90: 2a 20 72 75 6e 20 66 72 69 73 74 20 74 6f 20 69  * run frist to i
cba0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 2a 2f 0a  nitialize it */.
cbb0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 41 63    if( ALWAYS(pAc
cbc0: 63 75 6d 29 20 29 7b 0a 20 20 20 20 6e 20 3d 20  cum) ){.    n = 
cbd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
cbe0: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
cbf0: 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b    if( argc==2 ){
cc00: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 73 71 6c 69  .      n += sqli
cc10: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
cc20: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  argv[1]);.    }e
cc30: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  lse{.      n++;.
cc40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
cc50: 3d 28 69 6e 74 29 70 41 63 63 75 6d 2d 3e 6e 43  =(int)pAccum->nC
cc60: 68 61 72 20 29 7b 0a 20 20 20 20 20 20 70 41 63  har ){.      pAc
cc70: 63 75 6d 2d 3e 6e 43 68 61 72 20 3d 20 30 3b 0a  cum->nChar = 0;.
cc80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cc90: 20 70 41 63 63 75 6d 2d 3e 6e 43 68 61 72 20 2d   pAccum->nChar -
cca0: 3d 20 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f  = n;.      memmo
ccb0: 76 65 28 70 41 63 63 75 6d 2d 3e 7a 54 65 78 74  ve(pAccum->zText
ccc0: 2c 20 26 70 41 63 63 75 6d 2d 3e 7a 54 65 78 74  , &pAccum->zText
ccd0: 5b 6e 5d 2c 20 70 41 63 63 75 6d 2d 3e 6e 43 68  [n], pAccum->nCh
cce0: 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ar);.    }.    i
ccf0: 66 28 20 70 41 63 63 75 6d 2d 3e 6e 43 68 61 72  f( pAccum->nChar
cd00: 3d 3d 30 20 29 20 70 41 63 63 75 6d 2d 3e 6d 78  ==0 ) pAccum->mx
cd10: 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Alloc = 0;.  }.}
cd20: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
cd30: 67 72 6f 75 70 43 6f 6e 63 61 74 49 6e 76 65 72  groupConcatInver
cd40: 73 65 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 53  se 0.#endif /* S
cd50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
cd60: 57 46 55 4e 43 20 2a 2f 0a 73 74 61 74 69 63 20  WFUNC */.static 
cd70: 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61 74  void groupConcat
cd80: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
cd90: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
cda0: 74 29 7b 0a 20 20 53 74 72 41 63 63 75 6d 20 2a  t){.  StrAccum *
cdb0: 70 41 63 63 75 6d 3b 0a 20 20 70 41 63 63 75 6d  pAccum;.  pAccum
cdc0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
cdd0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
cde0: 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  text, 0);.  if( 
cdf0: 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20 69 66  pAccum ){.    if
ce00: 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72 72  ( pAccum->accErr
ce10: 6f 72 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49  or==SQLITE_TOOBI
ce20: 47 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G ){.      sqlit
ce30: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
ce40: 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b  toobig(context);
ce50: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
ce60: 41 63 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72 3d  Accum->accError=
ce70: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
ce80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
ce90: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
cea0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
ceb0: 7d 65 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20  }else{    .     
cec0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ced0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  text(context, sq
cee0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
cef0: 69 73 68 28 70 41 63 63 75 6d 29 2c 20 2d 31 2c  ish(pAccum), -1,
cf00: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
cf20: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d  te3_free);.    }
cf30: 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64 65 66 20 53  .  }.}.#ifndef S
cf40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
cf50: 57 46 55 4e 43 0a 73 74 61 74 69 63 20 76 6f 69  WFUNC.static voi
cf60: 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 56 61 6c  d groupConcatVal
cf70: 75 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ue(sqlite3_conte
cf80: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
cf90: 73 71 6c 69 74 65 33 5f 73 74 72 20 2a 70 41 63  sqlite3_str *pAc
cfa0: 63 75 6d 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20  cum;.  pAccum = 
cfb0: 28 73 71 6c 69 74 65 33 5f 73 74 72 2a 29 73 71  (sqlite3_str*)sq
cfc0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
cfd0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
cfe0: 20 30 29 3b 0a 20 20 69 66 28 20 70 41 63 63 75   0);.  if( pAccu
cff0: 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 63  m ){.    if( pAc
d000: 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53  cum->accError==S
d010: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 7b 0a  QLITE_TOOBIG ){.
d020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
d030: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
d040: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  g(context);.    
d050: 7d 65 6c 73 65 20 69 66 28 20 70 41 63 63 75 6d  }else if( pAccum
d060: 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53 51 4c 49  ->accError==SQLI
d070: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
d080: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
d090: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
d0a0: 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  text);.    }else
d0b0: 7b 20 20 20 20 0a 20 20 20 20 20 20 63 6f 6e 73  {    .      cons
d0c0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20  t char *zText = 
d0d0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 76 61 6c 75  sqlite3_str_valu
d0e0: 65 28 70 41 63 63 75 6d 29 3b 0a 20 20 20 20 20  e(pAccum);.     
d0f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
d100: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 54  text(context, zT
d110: 65 78 74 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ext, -1, SQLITE_
d120: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d130: 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
d140: 64 65 66 69 6e 65 20 67 72 6f 75 70 43 6f 6e 63  define groupConc
d150: 61 74 56 61 6c 75 65 20 30 0a 23 65 6e 64 69 66  atValue 0.#endif
d160: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
d170: 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 0a 2f  WINDOWFUNC */../
d180: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d190: 65 20 64 6f 65 73 20 70 65 72 2d 63 6f 6e 6e 65  e does per-conne
d1a0: 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 72  ction function r
d1b0: 65 67 69 73 74 72 61 74 69 6f 6e 2e 20 20 4d 6f  egistration.  Mo
d1c0: 73 74 0a 2a 2a 20 6f 66 20 74 68 65 20 62 75 69  st.** of the bui
d1d0: 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20  lt-in functions 
d1e0: 61 62 6f 76 65 20 61 72 65 20 70 61 72 74 20 6f  above are part o
d1f0: 66 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  f the global fun
d200: 63 74 69 6f 6e 20 73 65 74 2e 0a 2a 2a 20 54 68  ction set..** Th
d210: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
d220: 64 65 61 6c 73 20 77 69 74 68 20 74 68 6f 73 65  deals with those
d230: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 67 6c   that are not gl
d240: 6f 62 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  obal..*/.void sq
d250: 6c 69 74 65 33 52 65 67 69 73 74 65 72 50 65 72  lite3RegisterPer
d260: 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69  ConnectionBuilti
d270: 6e 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74  nFunctions(sqlit
d280: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
d290: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  c = sqlite3_over
d2a0: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62  load_function(db
d2b0: 2c 20 22 4d 41 54 43 48 22 2c 20 32 29 3b 0a 20  , "MATCH", 2);. 
d2c0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
d2d0: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d  ITE_NOMEM || rc=
d2e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
d2f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
d300: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69  OMEM ){.    sqli
d310: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
d320: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
d330: 2d 72 65 67 69 73 74 65 72 20 74 68 65 20 62 75  -register the bu
d340: 69 6c 74 2d 69 6e 20 4c 49 4b 45 20 66 75 6e 63  ilt-in LIKE func
d350: 74 69 6f 6e 73 2e 20 20 54 68 65 20 63 61 73 65  tions.  The case
d360: 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61 72  Sensitive.** par
d370: 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
d380: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
d390: 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   the LIKE operat
d3a0: 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a 20 73 65  or is case.** se
d3b0: 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64  nsitive..*/.void
d3c0: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
d3d0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73 71  LikeFunctions(sq
d3e0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 63  lite3 *db, int c
d3f0: 61 73 65 53 65 6e 73 69 74 69 76 65 29 7b 0a 20  aseSensitive){. 
d400: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
d410: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69 6e  nfo *pInfo;.  in
d420: 74 20 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63  t flags;.  if( c
d430: 61 73 65 53 65 6e 73 69 74 69 76 65 20 29 7b 0a  aseSensitive ){.
d440: 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72      pInfo = (str
d450: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a  uct compareInfo*
d460: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20  )&likeInfoAlt;. 
d470: 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54     flags = SQLIT
d480: 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51  E_FUNC_LIKE | SQ
d490: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 3b 0a  LITE_FUNC_CASE;.
d4a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
d4b0: 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d  fo = (struct com
d4c0: 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49  pareInfo*)&likeI
d4d0: 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 20 20 66 6c 61  nfoNorm;.    fla
d4e0: 67 73 20 3d 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs = SQLITE_FUNC
d4f0: 5f 4c 49 4b 45 3b 0a 20 20 7d 0a 20 20 73 71 6c  _LIKE;.  }.  sql
d500: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
d510: 62 2c 20 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51  b, "like", 2, SQ
d520: 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f  LITE_UTF8, pInfo
d530: 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30  , likeFunc, 0, 0
d540: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
d550: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
d560: 64 62 2c 20 22 6c 69 6b 65 22 2c 20 33 2c 20 53  db, "like", 3, S
d570: 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e 66  QLITE_UTF8, pInf
d580: 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20  o, likeFunc, 0, 
d590: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  0, 0, 0, 0);.  s
d5a0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
d5b0: 6f 6e 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 32  on(db, "like", 2
d5c0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
d5d0: 29 2d 3e 66 75 6e 63 46 6c 61 67 73 20 7c 3d 20  )->funcFlags |= 
d5e0: 66 6c 61 67 73 3b 0a 20 20 73 71 6c 69 74 65 33  flags;.  sqlite3
d5f0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
d600: 20 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49   "like", 3, SQLI
d610: 54 45 5f 55 54 46 38 2c 20 30 29 2d 3e 66 75 6e  TE_UTF8, 0)->fun
d620: 63 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b  cFlags |= flags;
d630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
d640: 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 78 70  points to an exp
d650: 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 6d  ression which im
d660: 70 6c 65 6d 65 6e 74 73 20 61 20 66 75 6e 63 74  plements a funct
d670: 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69  ion.  If.** it i
d680: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f  s appropriate to
d690: 20 61 70 70 6c 79 20 74 68 65 20 4c 49 4b 45 20   apply the LIKE 
d6a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20  optimization to 
d6b0: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  that function.**
d6c0: 20 74 68 65 6e 20 73 65 74 20 61 57 63 5b 30 5d   then set aWc[0]
d6d0: 20 74 68 72 6f 75 67 68 20 61 57 63 5b 32 5d 20   through aWc[2] 
d6e0: 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  to the wildcard 
d6f0: 63 68 61 72 61 63 74 65 72 73 20 61 6e 64 20 74  characters and t
d700: 68 65 0a 2a 2a 20 65 73 63 61 70 65 20 63 68 61  he.** escape cha
d710: 72 61 63 74 65 72 20 61 6e 64 20 74 68 65 6e 20  racter and then 
d720: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
d730: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
d740: 20 6e 6f 74 20 61 20 0a 2a 2a 20 4c 49 4b 45 2d   not a .** LIKE-
d750: 73 74 79 6c 65 20 66 75 6e 63 74 69 6f 6e 20 74  style function t
d760: 68 65 6e 20 72 65 74 75 72 6e 20 46 41 4c 53 45  hen return FALSE
d770: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
d780: 65 73 73 69 6f 6e 20 22 61 20 4c 49 4b 45 20 62  ession "a LIKE b
d790: 20 45 53 43 41 50 45 20 63 22 20 69 73 20 6f 6e   ESCAPE c" is on
d7a0: 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ly considered a 
d7b0: 76 61 6c 69 64 20 4c 49 4b 45 0a 2a 2a 20 6f 70  valid LIKE.** op
d7c0: 65 72 61 74 6f 72 20 69 66 20 63 20 69 73 20 61  erator if c is a
d7d0: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
d7e0: 74 68 61 74 20 69 73 20 65 78 61 63 74 6c 79 20  that is exactly 
d7f0: 6f 6e 65 20 62 79 74 65 20 69 6e 20 6c 65 6e 67  one byte in leng
d800: 74 68 2e 0a 2a 2a 20 54 68 61 74 20 6f 6e 65 20  th..** That one 
d810: 62 79 74 65 20 69 73 20 73 74 6f 72 65 64 20 69  byte is stored i
d820: 6e 20 61 57 63 5b 33 5d 2e 20 20 61 57 63 5b 33  n aWc[3].  aWc[3
d830: 5d 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ] is set to zero
d840: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
d850: 6e 6f 20 45 53 43 41 50 45 20 63 6c 61 75 73 65  no ESCAPE clause
d860: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 49 73 4e 6f 63 61  ..**.** *pIsNoca
d870: 73 65 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  se is set to tru
d880: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 61  e if uppercase a
d890: 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 61 72 65  nd lowercase are
d8a0: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 0a   equivalent for.
d8b0: 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ** the function 
d8c0: 28 64 65 66 61 75 6c 74 20 66 6f 72 20 4c 49 4b  (default for LIK
d8d0: 45 29 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63  E).  If the func
d8e0: 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
d8f0: 69 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a 20 62 65  istinction.** be
d900: 74 77 65 65 6e 20 75 70 70 65 72 63 61 73 65 20  tween uppercase 
d910: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 28 61  and lowercase (a
d920: 73 20 64 6f 65 73 20 47 4c 4f 42 29 20 74 68 65  s does GLOB) the
d930: 6e 20 2a 70 49 73 4e 6f 63 61 73 65 20 69 73 20  n *pIsNocase is 
d940: 73 65 74 20 74 6f 0a 2a 2a 20 66 61 6c 73 65 2e  set to.** false.
d950: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
d960: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71  sLikeFunction(sq
d970: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
d980: 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73  *pExpr, int *pIs
d990: 4e 6f 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57  Nocase, char *aW
d9a0: 63 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70  c){.  FuncDef *p
d9b0: 44 65 66 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  Def;.  int nExpr
d9c0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
d9d0: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c  p!=TK_FUNCTION |
d9e0: 7c 20 21 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  | !pExpr->x.pLis
d9f0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
da00: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
da10: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
da20: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
da30: 65 6c 65 63 74 29 20 29 3b 0a 20 20 6e 45 78 70  elect) );.  nExp
da40: 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  r = pExpr->x.pLi
da50: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 44 65  st->nExpr;.  pDe
da60: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
da70: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70  unction(db, pExp
da80: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 45 78  r->u.zToken, nEx
da90: 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  pr, SQLITE_UTF8,
daa0: 20 30 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   0);.  if( NEVER
dab0: 28 70 44 65 66 3d 3d 30 29 20 7c 7c 20 28 70 44  (pDef==0) || (pD
dac0: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
dad0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
dae0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
daf0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
db00: 6e 45 78 70 72 3c 33 20 29 7b 0a 20 20 20 20 61  nExpr<3 ){.    a
db10: 57 63 5b 33 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c  Wc[3] = 0;.  }el
db20: 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  se{.    Expr *pE
db30: 73 63 61 70 65 20 3d 20 70 45 78 70 72 2d 3e 78  scape = pExpr->x
db40: 2e 70 4c 69 73 74 2d 3e 61 5b 32 5d 2e 70 45 78  .pList->a[2].pEx
db50: 70 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  pr;.    char *zE
db60: 73 63 61 70 65 3b 0a 20 20 20 20 69 66 28 20 70  scape;.    if( p
db70: 45 73 63 61 70 65 2d 3e 6f 70 21 3d 54 4b 5f 53  Escape->op!=TK_S
db80: 54 52 49 4e 47 20 29 20 72 65 74 75 72 6e 20 30  TRING ) return 0
db90: 3b 0a 20 20 20 20 7a 45 73 63 61 70 65 20 3d 20  ;.    zEscape = 
dba0: 70 45 73 63 61 70 65 2d 3e 75 2e 7a 54 6f 6b 65  pEscape->u.zToke
dbb0: 6e 3b 0a 20 20 20 20 69 66 28 20 7a 45 73 63 61  n;.    if( zEsca
dbc0: 70 65 5b 30 5d 3d 3d 30 20 7c 7c 20 7a 45 73 63  pe[0]==0 || zEsc
dbd0: 61 70 65 5b 31 5d 21 3d 30 20 29 20 72 65 74 75  ape[1]!=0 ) retu
dbe0: 72 6e 20 30 3b 0a 20 20 20 20 61 57 63 5b 33 5d  rn 0;.    aWc[3]
dbf0: 20 3d 20 7a 45 73 63 61 70 65 5b 30 5d 3b 0a 20   = zEscape[0];. 
dc00: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 65 6d   }..  /* The mem
dc10: 63 70 79 28 29 20 73 74 61 74 65 6d 65 6e 74 20  cpy() statement 
dc20: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
dc30: 20 77 69 6c 64 63 61 72 64 20 63 68 61 72 61 63   wildcard charac
dc40: 74 65 72 73 20 61 72 65 0a 20 20 2a 2a 20 74 68  ters are.  ** th
dc50: 65 20 66 69 72 73 74 20 74 68 72 65 65 20 73 74  e first three st
dc60: 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
dc70: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75  compareInfo stru
dc80: 63 74 75 72 65 2e 20 20 54 68 65 0a 20 20 2a 2a  cture.  The.  **
dc90: 20 61 73 73 65 72 74 73 28 29 20 74 68 61 74 20   asserts() that 
dca0: 66 6f 6c 6c 6f 77 20 76 65 72 69 66 79 20 74 68  follow verify th
dcb0: 61 74 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  at assumption.  
dcc0: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 61 57 63 2c  */.  memcpy(aWc,
dcd0: 20 70 44 65 66 2d 3e 70 55 73 65 72 44 61 74 61   pDef->pUserData
dce0: 2c 20 33 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 3);.  assert( 
dcf0: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
dd00: 41 6c 74 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c  Alt == (char*)&l
dd10: 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68  ikeInfoAlt.match
dd20: 41 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  All );.  assert(
dd30: 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49   &((char*)&likeI
dd40: 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d 3d 20 28 63  nfoAlt)[1] == (c
dd50: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
dd60: 74 2e 6d 61 74 63 68 4f 6e 65 20 29 3b 0a 20 20  t.matchOne );.  
dd70: 61 73 73 65 72 74 28 20 26 28 28 63 68 61 72 2a  assert( &((char*
dd80: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 32  )&likeInfoAlt)[2
dd90: 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b  ] == (char*)&lik
dda0: 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 53 65  eInfoAlt.matchSe
ddb0: 74 20 29 3b 0a 20 20 2a 70 49 73 4e 6f 63 61 73  t );.  *pIsNocas
ddc0: 65 20 3d 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  e = (pDef->funcF
ddd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
dde0: 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20 20 72  NC_CASE)==0;.  r
ddf0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
de00: 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 46 75 6e  * All of the Fun
de10: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 73 20  cDef structures 
de20: 69 6e 20 74 68 65 20 61 42 75 69 6c 74 69 6e 46  in the aBuiltinF
de30: 75 6e 63 5b 5d 20 61 72 72 61 79 20 61 62 6f 76  unc[] array abov
de40: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 67 6c 6f 62  e.** to the glob
de50: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 68  al function hash
de60: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 6f 63   table.  This oc
de70: 63 75 72 73 20 61 74 20 73 74 61 72 74 2d 74 69  curs at start-ti
de80: 6d 65 20 28 61 73 0a 2a 2a 20 61 20 63 6f 6e 73  me (as.** a cons
de90: 65 71 75 65 6e 63 65 20 6f 66 20 63 61 6c 6c 69  equence of calli
dea0: 6e 67 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  ng sqlite3_initi
deb0: 61 6c 69 7a 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  alize())..**.** 
dec0: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
ded0: 6e 65 20 72 75 6e 73 0a 2a 2f 0a 76 6f 69 64 20  ne runs.*/.void 
dee0: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
def0: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
df00: 76 6f 69 64 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a  void){.  /*.  **
df10: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
df20: 72 72 61 79 20 68 6f 6c 64 73 20 46 75 6e 63 44  rray holds FuncD
df30: 65 66 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  ef structures fo
df40: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 75 6e  r all of the fun
df50: 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 64 65 66 69  ctions.  ** defi
df60: 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ned in this file
df70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
df80: 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20  array cannot be 
df90: 63 6f 6e 73 74 61 6e 74 20 73 69 6e 63 65 20 63  constant since c
dfa0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
dfb0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 75 6e 63  to the.  ** Func
dfc0: 44 65 66 2e 70 48 61 73 68 20 65 6c 65 6d 65 6e  Def.pHash elemen
dfd0: 74 73 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65  ts at start-time
dfe0: 2e 20 20 54 68 65 20 65 6c 65 6d 65 6e 74 73 20  .  The elements 
dff0: 6f 66 20 74 68 69 73 20 61 72 72 61 79 0a 20 20  of this array.  
e000: 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
e010: 20 61 66 74 65 72 20 69 6e 69 74 69 61 6c 69 7a   after initializ
e020: 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ation is complet
e030: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  e..  **.  ** For
e040: 20 70 65 61 6b 20 65 66 66 69 63 69 65 6e 63 79   peak efficiency
e050: 2c 20 70 75 74 20 74 68 65 20 6d 6f 73 74 20 66  , put the most f
e060: 72 65 71 75 65 6e 74 6c 79 20 75 73 65 64 20 66  requently used f
e070: 75 6e 63 74 69 6f 6e 20 6c 61 73 74 2e 0a 20 20  unction last..  
e080: 2a 2f 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63  */.  static Func
e090: 44 65 66 20 61 42 75 69 6c 74 69 6e 46 75 6e 63  Def aBuiltinFunc
e0a0: 5b 5d 20 3d 20 7b 0a 23 69 66 64 65 66 20 53 51  [] = {.#ifdef SQ
e0b0: 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20 20 20  LITE_SOUNDEX.   
e0c0: 20 46 55 4e 43 54 49 4f 4e 28 73 6f 75 6e 64 65   FUNCTION(sounde
e0d0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  x,            1,
e0e0: 20 30 2c 20 30 2c 20 73 6f 75 6e 64 65 78 46 75   0, 0, soundexFu
e0f0: 6e 63 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69  nc      ),.#endi
e100: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
e110: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
e120: 53 49 4f 4e 0a 20 20 20 20 56 46 55 4e 43 54 49  SION.    VFUNCTI
e130: 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  ON(load_extensio
e140: 6e 2c 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c  n,    1, 0, 0, l
e150: 6f 61 64 45 78 74 20 20 20 20 20 20 20 20 20 20  oadExt          
e160: 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e  ),.    VFUNCTION
e170: 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c  (load_extension,
e180: 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 6c 6f 61      2, 0, 0, loa
e190: 64 45 78 74 20 20 20 20 20 20 20 20 20 20 29 2c  dExt          ),
e1a0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
e1b0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
e1c0: 43 41 54 49 4f 4e 0a 20 20 20 20 46 55 4e 43 54  CATION.    FUNCT
e1d0: 49 4f 4e 28 73 71 6c 69 74 65 5f 63 72 79 70 74  ION(sqlite_crypt
e1e0: 2c 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c  ,       2, 0, 0,
e1f0: 20 73 71 6c 69 74 65 33 43 72 79 70 74 46 75 6e   sqlite3CryptFun
e200: 63 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e  c ),.#endif.#ifn
e210: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e220: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
e230: 41 47 53 0a 20 20 20 20 44 46 55 4e 43 54 49 4f  AGS.    DFUNCTIO
e240: 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65  N(sqlite_compile
e250: 6f 70 74 69 6f 6e 5f 75 73 65 64 2c 31 2c 20 30  option_used,1, 0
e260: 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f 70 74 69  , 0, compileopti
e270: 6f 6e 75 73 65 64 46 75 6e 63 20 20 29 2c 0a 20  onusedFunc  ),. 
e280: 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c     DFUNCTION(sql
e290: 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  ite_compileoptio
e2a0: 6e 5f 67 65 74 2c 20 31 2c 20 30 2c 20 30 2c 20  n_get, 1, 0, 0, 
e2b0: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74  compileoptionget
e2c0: 46 75 6e 63 20 20 29 2c 0a 23 65 6e 64 69 66 20  Func  ),.#endif 
e2d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
e2e0: 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
e2f0: 47 53 20 2a 2f 0a 20 20 20 20 46 55 4e 43 54 49  GS */.    FUNCTI
e300: 4f 4e 32 28 75 6e 6c 69 6b 65 6c 79 2c 20 20 20  ON2(unlikely,   
e310: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
e320: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
e330: 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29  E_FUNC_UNLIKELY)
e340: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  ,.    FUNCTION2(
e350: 6c 69 6b 65 6c 69 68 6f 6f 64 2c 20 20 20 20 20  likelihood,     
e360: 20 20 20 32 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70     2, 0, 0, noop
e370: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
e380: 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20  NC_UNLIKELY),.  
e390: 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c 69 6b 65    FUNCTION2(like
e3a0: 6c 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  ly,            1
e3b0: 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63  , 0, 0, noopFunc
e3c0: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55  ,  SQLITE_FUNC_U
e3d0: 4e 4c 49 4b 45 4c 59 29 2c 0a 23 69 66 64 65 66  NLIKELY),.#ifdef
e3e0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
e3f0: 20 20 46 55 4e 43 54 49 4f 4e 32 28 61 66 66 69    FUNCTION2(affi
e400: 6e 69 74 79 2c 20 20 20 20 20 20 20 20 20 20 31  nity,          1
e410: 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63  , 0, 0, noopFunc
e420: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41  ,  SQLITE_FUNC_A
e430: 46 46 49 4e 49 54 59 29 2c 0a 23 65 6e 64 69 66  FFINITY),.#endif
e440: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e450: 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
e460: 5f 46 55 4e 43 0a 20 20 20 20 46 55 4e 43 54 49  _FUNC.    FUNCTI
e470: 4f 4e 32 28 73 71 6c 69 74 65 5f 6f 66 66 73 65  ON2(sqlite_offse
e480: 74 2c 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20  t,     1, 0, 0, 
e490: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
e4a0: 45 5f 46 55 4e 43 5f 4f 46 46 53 45 54 7c 0a 20  E_FUNC_OFFSET|. 
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f      SQLITE_FUNC_
e4f0: 54 59 50 45 4f 46 29 2c 0a 23 65 6e 64 69 66 0a  TYPEOF),.#endif.
e500: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72      FUNCTION(ltr
e510: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
e520: 20 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75   1, 1, 0, trimFu
e530: 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  nc         ),.  
e540: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d    FUNCTION(ltrim
e550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ,              2
e560: 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 1, 0, trimFunc
e570: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
e580: 46 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20  FUNCTION(rtrim, 
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
e5a0: 32 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  2, 0, trimFunc  
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 72 74 72 69 6d 2c 20 20 20  NCTION(rtrim,   
e5d0: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 32 2c             2, 2,
e5e0: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
e5f0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
e600: 54 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20  TION(trim,      
e610: 20 20 20 20 20 20 20 20 20 31 2c 20 33 2c 20 30           1, 3, 0
e620: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
e630: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e640: 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20  ON(trim,        
e650: 20 20 20 20 20 20 20 32 2c 20 33 2c 20 30 2c 20         2, 3, 0, 
e660: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
e670: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e680: 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  (min,           
e690: 20 20 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69      -1, 0, 1, mi
e6a0: 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20 29  nmaxFunc       )
e6b0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d  ,.    FUNCTION(m
e6c0: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
e6d0: 20 20 20 30 2c 20 30 2c 20 31 2c 20 30 20 20 20     0, 0, 1, 0   
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a               ),.
e6f0: 20 20 20 20 57 41 47 47 52 45 47 41 54 45 28 6d      WAGGREGATE(m
e700: 69 6e 2c 20 31 2c 20 30 2c 20 31 2c 20 6d 69 6e  in, 1, 0, 1, min
e710: 6d 61 78 53 74 65 70 2c 20 6d 69 6e 4d 61 78 46  maxStep, minMaxF
e720: 69 6e 61 6c 69 7a 65 2c 20 6d 69 6e 4d 61 78 56  inalize, minMaxV
e730: 61 6c 75 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  alue, 0,.       
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d     SQLITE_FUNC_M
e770: 49 4e 4d 41 58 20 29 2c 0a 20 20 20 20 46 55 4e  INMAX ),.    FUN
e780: 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20  CTION(max,      
e790: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20           -1, 1, 
e7a0: 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20  1, minmaxFunc   
e7b0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
e7c0: 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20  ION(max,        
e7d0: 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20 31 2c          0, 1, 1,
e7e0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
e7f0: 20 20 29 2c 0a 20 20 20 20 57 41 47 47 52 45 47    ),.    WAGGREG
e800: 41 54 45 28 6d 61 78 2c 20 31 2c 20 31 2c 20 31  ATE(max, 1, 1, 1
e810: 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 6d 69  , minmaxStep, mi
e820: 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 2c 20 6d 69  nMaxFinalize, mi
e830: 6e 4d 61 78 56 61 6c 75 65 2c 20 30 2c 0a 20 20  nMaxValue, 0,.  
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46          SQLITE_F
e870: 55 4e 43 5f 4d 49 4e 4d 41 58 20 29 2c 0a 20 20  UNC_MINMAX ),.  
e880: 20 20 46 55 4e 43 54 49 4f 4e 32 28 74 79 70 65    FUNCTION2(type
e890: 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  of,            1
e8a0: 2c 20 30 2c 20 30 2c 20 74 79 70 65 6f 66 46 75  , 0, 0, typeofFu
e8b0: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
e8c0: 5f 54 59 50 45 4f 46 29 2c 0a 20 20 20 20 46 55  _TYPEOF),.    FU
e8d0: 4e 43 54 49 4f 4e 32 28 6c 65 6e 67 74 68 2c 20  NCTION2(length, 
e8e0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
e8f0: 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63 2c 20   0, lengthFunc, 
e900: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e   SQLITE_FUNC_LEN
e910: 47 54 48 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  GTH),.    FUNCTI
e920: 4f 4e 28 69 6e 73 74 72 2c 20 20 20 20 20 20 20  ON(instr,       
e930: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
e940: 69 6e 73 74 72 46 75 6e 63 20 20 20 20 20 20 20  instrFunc       
e950: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e960: 28 70 72 69 6e 74 66 2c 20 20 20 20 20 20 20 20  (printf,        
e970: 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 70 72      -1, 0, 0, pr
e980: 69 6e 74 66 46 75 6e 63 20 20 20 20 20 20 20 29  intfFunc       )
e990: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75  ,.    FUNCTION(u
e9a0: 6e 69 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  nicode,         
e9b0: 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 6e 69 63     1, 0, 0, unic
e9c0: 6f 64 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a  odeFunc      ),.
e9d0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 68 61      FUNCTION(cha
e9e0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
e9f0: 2d 31 2c 20 30 2c 20 30 2c 20 63 68 61 72 46 75  -1, 0, 0, charFu
ea00: 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  nc         ),.  
ea10: 20 20 46 55 4e 43 54 49 4f 4e 28 61 62 73 2c 20    FUNCTION(abs, 
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
ea30: 2c 20 30 2c 20 30 2c 20 61 62 73 46 75 6e 63 20  , 0, 0, absFunc 
ea40: 20 20 20 20 20 20 20 20 20 29 2c 0a 23 69 66 6e           ),.#ifn
ea50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ea60: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
ea70: 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e     FUNCTION(roun
ea80: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
ea90: 31 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75  1, 0, 0, roundFu
eaa0: 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  nc        ),.   
eab0: 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c   FUNCTION(round,
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
ead0: 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63   0, 0, roundFunc
eae0: 20 20 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69          ),.#endi
eaf0: 66 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75  f.    FUNCTION(u
eb00: 70 70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  pper,           
eb10: 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 70 70 65     1, 0, 0, uppe
eb20: 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a  rFunc        ),.
eb30: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77      FUNCTION(low
eb40: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
eb50: 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46   1, 0, 0, lowerF
eb60: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20  unc        ),.  
eb70: 20 20 46 55 4e 43 54 49 4f 4e 28 68 65 78 2c 20    FUNCTION(hex, 
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
eb90: 2c 20 30 2c 20 30 2c 20 68 65 78 46 75 6e 63 20  , 0, 0, hexFunc 
eba0: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
ebb0: 46 55 4e 43 54 49 4f 4e 32 28 69 66 6e 75 6c 6c  FUNCTION2(ifnull
ebc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20  ,            2, 
ebd0: 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20  0, 0, noopFunc, 
ebe0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
ebf0: 4c 45 53 43 45 29 2c 0a 20 20 20 20 56 46 55 4e  LESCE),.    VFUN
ec00: 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 2c 20 20 20  CTION(random,   
ec10: 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30           0, 0, 0
ec20: 2c 20 72 61 6e 64 6f 6d 46 75 6e 63 20 20 20 20  , randomFunc    
ec30: 20 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54     ),.    VFUNCT
ec40: 49 4f 4e 28 72 61 6e 64 6f 6d 62 6c 6f 62 2c 20  ION(randomblob, 
ec50: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
ec60: 72 61 6e 64 6f 6d 42 6c 6f 62 20 20 20 20 20 20  randomBlob      
ec70: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
ec80: 28 6e 75 6c 6c 69 66 2c 20 20 20 20 20 20 20 20  (nullif,        
ec90: 20 20 20 20 20 32 2c 20 30 2c 20 31 2c 20 6e 75       2, 0, 1, nu
eca0: 6c 6c 69 66 46 75 6e 63 20 20 20 20 20 20 20 29  llifFunc       )
ecb0: 2c 0a 20 20 20 20 44 46 55 4e 43 54 49 4f 4e 28  ,.    DFUNCTION(
ecc0: 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 2c 20  sqlite_version, 
ecd0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 76 65 72 73     0, 0, 0, vers
ece0: 69 6f 6e 46 75 6e 63 20 20 20 20 20 20 29 2c 0a  ionFunc      ),.
ecf0: 20 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 73 71      DFUNCTION(sq
ed00: 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 2c 20  lite_source_id, 
ed10: 20 30 2c 20 30 2c 20 30 2c 20 73 6f 75 72 63 65   0, 0, 0, source
ed20: 69 64 46 75 6e 63 20 20 20 20 20 29 2c 0a 20 20  idFunc     ),.  
ed30: 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74    FUNCTION(sqlit
ed40: 65 5f 6c 6f 67 2c 20 20 20 20 20 20 20 20 20 32  e_log,         2
ed50: 2c 20 30 2c 20 30 2c 20 65 72 72 6c 6f 67 46 75  , 0, 0, errlogFu
ed60: 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  nc       ),.    
ed70: 46 55 4e 43 54 49 4f 4e 28 71 75 6f 74 65 2c 20  FUNCTION(quote, 
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
ed90: 30 2c 20 30 2c 20 71 75 6f 74 65 46 75 6e 63 20  0, 0, quoteFunc 
eda0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46         ),.    VF
edb0: 55 4e 43 54 49 4f 4e 28 6c 61 73 74 5f 69 6e 73  UNCTION(last_ins
edc0: 65 72 74 5f 72 6f 77 69 64 2c 20 30 2c 20 30 2c  ert_rowid, 0, 0,
edd0: 20 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f   0, last_insert_
ede0: 72 6f 77 69 64 29 2c 0a 20 20 20 20 56 46 55 4e  rowid),.    VFUN
edf0: 43 54 49 4f 4e 28 63 68 61 6e 67 65 73 2c 20 20  CTION(changes,  
ee00: 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30           0, 0, 0
ee10: 2c 20 63 68 61 6e 67 65 73 20 20 20 20 20 20 20  , changes       
ee20: 20 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54     ),.    VFUNCT
ee30: 49 4f 4e 28 74 6f 74 61 6c 5f 63 68 61 6e 67 65  ION(total_change
ee40: 73 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  s,     0, 0, 0, 
ee50: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20 20 20  total_changes   
ee60: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
ee70: 28 72 65 70 6c 61 63 65 2c 20 20 20 20 20 20 20  (replace,       
ee80: 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 72 65       3, 0, 0, re
ee90: 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20 29  placeFunc      )
eea0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 7a  ,.    FUNCTION(z
eeb0: 65 72 6f 62 6c 6f 62 2c 20 20 20 20 20 20 20 20  eroblob,        
eec0: 20 20 20 31 2c 20 30 2c 20 30 2c 20 7a 65 72 6f     1, 0, 0, zero
eed0: 62 6c 6f 62 46 75 6e 63 20 20 20 20 20 29 2c 0a  blobFunc     ),.
eee0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62      FUNCTION(sub
eef0: 73 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  str,            
ef00: 20 32 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72   2, 0, 0, substr
ef10: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
ef20: 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62 73 74    FUNCTION(subst
ef30: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 33  r,             3
ef40: 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72 46 75  , 0, 0, substrFu
ef50: 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  nc       ),.    
ef60: 57 41 47 47 52 45 47 41 54 45 28 73 75 6d 2c 20  WAGGREGATE(sum, 
ef70: 20 20 31 2c 30 2c 30 2c 20 73 75 6d 53 74 65 70    1,0,0, sumStep
ef80: 2c 20 73 75 6d 46 69 6e 61 6c 69 7a 65 2c 20 73  , sumFinalize, s
ef90: 75 6d 46 69 6e 61 6c 69 7a 65 2c 20 73 75 6d 49  umFinalize, sumI
efa0: 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20 20 20 20  nverse, 0),.    
efb0: 57 41 47 47 52 45 47 41 54 45 28 74 6f 74 61 6c  WAGGREGATE(total
efc0: 2c 20 31 2c 30 2c 30 2c 20 73 75 6d 53 74 65 70  , 1,0,0, sumStep
efd0: 2c 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 2c 74  ,totalFinalize,t
efe0: 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 2c 73 75 6d  otalFinalize,sum
eff0: 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20 20 20  Inverse, 0),.   
f000: 20 57 41 47 47 52 45 47 41 54 45 28 61 76 67 2c   WAGGREGATE(avg,
f010: 20 20 20 31 2c 30 2c 30 2c 20 73 75 6d 53 74 65     1,0,0, sumSte
f020: 70 2c 20 61 76 67 46 69 6e 61 6c 69 7a 65 2c 20  p, avgFinalize, 
f030: 61 76 67 46 69 6e 61 6c 69 7a 65 2c 20 73 75 6d  avgFinalize, sum
f040: 49 6e 76 65 72 73 65 2c 20 30 29 2c 0a 20 20 20  Inverse, 0),.   
f050: 20 57 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e   WAGGREGATE(coun
f060: 74 2c 20 30 2c 30 2c 30 2c 20 63 6f 75 6e 74 53  t, 0,0,0, countS
f070: 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 63 6f  tep, .        co
f080: 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 20 63 6f 75  untFinalize, cou
f090: 6e 74 46 69 6e 61 6c 69 7a 65 2c 20 63 6f 75 6e  ntFinalize, coun
f0a0: 74 49 6e 76 65 72 73 65 2c 20 53 51 4c 49 54 45  tInverse, SQLITE
f0b0: 5f 46 55 4e 43 5f 43 4f 55 4e 54 20 20 29 2c 0a  _FUNC_COUNT  ),.
f0c0: 20 20 20 20 57 41 47 47 52 45 47 41 54 45 28 63      WAGGREGATE(c
f0d0: 6f 75 6e 74 2c 20 31 2c 30 2c 30 2c 20 63 6f 75  ount, 1,0,0, cou
f0e0: 6e 74 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20  ntStep, .       
f0f0: 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 20   countFinalize, 
f100: 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 20 63  countFinalize, c
f110: 6f 75 6e 74 49 6e 76 65 72 73 65 2c 20 30 20 20  ountInverse, 0  
f120: 29 2c 0a 20 20 20 20 57 41 47 47 52 45 47 41 54  ),.    WAGGREGAT
f130: 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20  E(group_concat, 
f140: 31 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f  1, 0, 0, groupCo
f150: 6e 63 61 74 53 74 65 70 2c 20 0a 20 20 20 20 20  ncatStep, .     
f160: 20 20 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69     groupConcatFi
f170: 6e 61 6c 69 7a 65 2c 20 67 72 6f 75 70 43 6f 6e  nalize, groupCon
f180: 63 61 74 56 61 6c 75 65 2c 20 67 72 6f 75 70 43  catValue, groupC
f190: 6f 6e 63 61 74 49 6e 76 65 72 73 65 2c 20 30 29  oncatInverse, 0)
f1a0: 2c 0a 20 20 20 20 57 41 47 47 52 45 47 41 54 45  ,.    WAGGREGATE
f1b0: 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20 32  (group_concat, 2
f1c0: 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e  , 0, 0, groupCon
f1d0: 63 61 74 53 74 65 70 2c 20 0a 20 20 20 20 20 20  catStep, .      
f1e0: 20 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e    groupConcatFin
f1f0: 61 6c 69 7a 65 2c 20 67 72 6f 75 70 43 6f 6e 63  alize, groupConc
f200: 61 74 56 61 6c 75 65 2c 20 67 72 6f 75 70 43 6f  atValue, groupCo
f210: 6e 63 61 74 49 6e 76 65 72 73 65 2c 20 30 29 2c  ncatInverse, 0),
f220: 0a 20 20 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43  .  .    LIKEFUNC
f230: 28 67 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f 62 49  (glob, 2, &globI
f240: 6e 66 6f 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  nfo, SQLITE_FUNC
f250: 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e  _LIKE|SQLITE_FUN
f260: 43 5f 43 41 53 45 29 2c 0a 23 69 66 64 65 66 20  C_CASE),.#ifdef 
f270: 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53  SQLITE_CASE_SENS
f280: 49 54 49 56 45 5f 4c 49 4b 45 0a 20 20 20 20 4c  ITIVE_LIKE.    L
f290: 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c  IKEFUNC(like, 2,
f2a0: 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53   &likeInfoAlt, S
f2b0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c  QLITE_FUNC_LIKE|
f2c0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45  SQLITE_FUNC_CASE
f2d0: 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28  ),.    LIKEFUNC(
f2e0: 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e  like, 3, &likeIn
f2f0: 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55  foAlt, SQLITE_FU
f300: 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46  NC_LIKE|SQLITE_F
f310: 55 4e 43 5f 43 41 53 45 29 2c 0a 23 65 6c 73 65  UNC_CASE),.#else
f320: 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69  .    LIKEFUNC(li
f330: 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f  ke, 2, &likeInfo
f340: 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e  Norm, SQLITE_FUN
f350: 43 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c 49 4b  C_LIKE),.    LIK
f360: 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26  EFUNC(like, 3, &
f370: 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51  likeInfoNorm, SQ
f380: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c  LITE_FUNC_LIKE),
f390: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
f3a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b  QLITE_ENABLE_UNK
f3b0: 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f  NOWN_SQL_FUNCTIO
f3c0: 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75  N.    FUNCTION(u
f3d0: 6e 6b 6e 6f 77 6e 2c 20 20 20 20 20 20 20 20 20  nknown,         
f3e0: 20 20 2d 31 2c 20 30 2c 20 30 2c 20 75 6e 6b 6e    -1, 0, 0, unkn
f3f0: 6f 77 6e 46 75 6e 63 20 20 20 20 20 20 29 2c 0a  ownFunc      ),.
f400: 23 65 6e 64 69 66 0a 20 20 20 20 46 55 4e 43 54  #endif.    FUNCT
f410: 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20 20  ION(coalesce,   
f420: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
f430: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
f440: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
f450: 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20  N(coalesce,     
f460: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30        0, 0, 0, 0
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f480: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32  ),.    FUNCTION2
f490: 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20  (coalesce,      
f4a0: 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f     -1, 0, 0, noo
f4b0: 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46  pFunc,  SQLITE_F
f4c0: 55 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a 20  UNC_COALESCE),. 
f4d0: 20 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   };.#ifndef SQLI
f4e0: 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
f4f0: 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65  LE.  sqlite3Alte
f500: 72 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 65  rFunctions();.#e
f510: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57 69  ndif.  sqlite3Wi
f520: 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73 28 29 3b  ndowFunctions();
f530: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
f540: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
f550: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
f560: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
f570: 29 0a 20 20 73 71 6c 69 74 65 33 41 6e 61 6c 79  ).  sqlite3Analy
f580: 7a 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23  zeFunctions();.#
f590: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
f5a0: 65 67 69 73 74 65 72 44 61 74 65 54 69 6d 65 46  egisterDateTimeF
f5b0: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 73 71  unctions();.  sq
f5c0: 6c 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74  lite3InsertBuilt
f5d0: 69 6e 46 75 6e 63 73 28 61 42 75 69 6c 74 69 6e  inFuncs(aBuiltin
f5e0: 46 75 6e 63 2c 20 41 72 72 61 79 53 69 7a 65 28  Func, ArraySize(
f5f0: 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 29 3b 0a  aBuiltinFunc));.
f600: 0a 23 69 66 20 30 20 20 2f 2a 20 45 6e 61 62 6c  .#if 0  /* Enabl
f610: 65 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 68  e to print out h
f620: 6f 77 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  ow the built-in 
f630: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 68 61  functions are ha
f640: 73 68 65 64 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  shed */.  {.    
f650: 69 6e 74 20 69 3b 0a 20 20 20 20 46 75 6e 63 44  int i;.    FuncD
f660: 65 66 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69  ef *p;.    for(i
f670: 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55 4e  =0; i<SQLITE_FUN
f680: 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29 7b  C_HASH_SZ; i++){
f690: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 46  .      printf("F
f6a0: 55 4e 43 2d 48 41 53 48 20 25 30 32 64 3a 22 2c  UNC-HASH %02d:",
f6b0: 20 69 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   i);.      for(p
f6c0: 3d 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46  =sqlite3BuiltinF
f6d0: 75 6e 63 74 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70  unctions.a[i]; p
f6e0: 3b 20 70 3d 70 2d 3e 75 2e 70 48 61 73 68 29 7b  ; p=p->u.pHash){
f6f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
f700: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
f710: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  (p->zName);.    
f720: 20 20 20 20 69 6e 74 20 68 20 3d 20 70 2d 3e 7a      int h = p->z
f730: 4e 61 6d 65 5b 30 5d 20 2b 20 6e 3b 0a 20 20 20  Name[0] + n;.   
f740: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 73       printf(" %s
f750: 28 25 64 29 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  (%d)", p->zName,
f760: 20 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   h);.      }.   
f770: 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
f780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f790: 66 0a 7d 0a                                      f.}.