/ Hex Artifact Content
Login

Artifact 08d6d07d138735dd79f12a2b0c623d1dc9270d0eea61b8be584625391ef84475:


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 6e 3d 3d 30 20 26 26 20 72 3e 3d 30 20 26  ( n==0 && r>=0 &
2990: 26 20 72 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36  & r<LARGEST_INT6
29a0: 34 2d 31 20 29 7b 0a 20 20 20 20 72 20 3d 20 28  4-1 ){.    r = (
29b0: 64 6f 75 62 6c 65 29 28 28 73 71 6c 69 74 65 5f  double)((sqlite_
29c0: 69 6e 74 36 34 29 28 72 2b 30 2e 35 29 29 3b 0a  int64)(r+0.5));.
29d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30    }else if( n==0
29e0: 20 26 26 20 72 3c 30 20 26 26 20 28 2d 72 29 3c   && r<0 && (-r)<
29f0: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2d 31 20  LARGEST_INT64-1 
2a00: 29 7b 0a 20 20 20 20 72 20 3d 20 2d 28 64 6f 75  ){.    r = -(dou
2a10: 62 6c 65 29 28 28 73 71 6c 69 74 65 5f 69 6e 74  ble)((sqlite_int
2a20: 36 34 29 28 28 2d 72 29 2b 30 2e 35 29 29 3b 0a  64)((-r)+0.5));.
2a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 42 75    }else{.    zBu
2a40: 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  f = sqlite3_mpri
2a50: 6e 74 66 28 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b  ntf("%.*f",n,r);
2a60: 0a 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30  .    if( zBuf==0
2a70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2a80: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
2a90: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
2aa0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2ab0: 20 7d 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69   }.    if( !sqli
2ac0: 74 65 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72  te3AtoF(zBuf, &r
2ad0: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
2ae0: 30 28 7a 42 75 66 29 2c 20 53 51 4c 49 54 45 5f  0(zBuf), SQLITE_
2af0: 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20 20 61  UTF8) ){.      a
2b00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73  ssert( sqlite3_s
2b10: 74 72 67 6c 6f 62 28 22 2a 49 6e 66 22 2c 20 7a  trglob("*Inf", z
2b20: 42 75 66 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Buf)==0 );.     
2b30: 20 72 20 3d 20 7a 42 75 66 5b 30 5d 3d 3d 27 2d   r = zBuf[0]=='-
2b40: 27 20 3f 20 2d 48 55 47 45 5f 56 41 4c 20 3a 20  ' ? -HUGE_VAL : 
2b50: 2b 48 55 47 45 5f 56 41 4c 3b 0a 20 20 20 20 7d  +HUGE_VAL;.    }
2b60: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72   .    sqlite3_fr
2b70: 65 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20  ee(zBuf);.  }.  
2b80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
2b90: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72  ouble(context, r
2ba0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
2bb0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
2bc0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
2bd0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4d 61   using sqlite3Ma
2be0: 6c 6c 6f 63 28 29 2e 20 49 66 20 74 68 65 0a 2a  lloc(). If the.*
2bf0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  * allocation fai
2c00: 6c 73 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ls, call sqlite3
2c10: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
2c20: 6d 65 6d 28 29 20 74 6f 20 6e 6f 74 69 66 79 0a  mem() to notify.
2c30: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2c40: 68 61 6e 64 6c 65 20 74 68 61 74 20 6d 61 6c 6c  handle that mall
2c50: 6f 63 28 29 20 68 61 73 20 66 61 69 6c 65 64 20  oc() has failed 
2c60: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2c70: 0a 2a 2a 20 49 66 20 6e 42 79 74 65 20 69 73 20  .** If nByte is 
2c80: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
2c90: 6d 61 78 69 6d 75 6d 20 73 74 72 69 6e 67 20 6f  maximum string o
2ca0: 72 20 62 6c 6f 62 20 6c 65 6e 67 74 68 2c 20 74  r blob length, t
2cb0: 68 65 6e 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20  hen.** raise an 
2cc0: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 65 78  SQLITE_TOOBIG ex
2cd0: 63 65 70 74 69 6f 6e 20 61 6e 64 20 72 65 74 75  ception and retu
2ce0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
2cf0: 69 63 20 76 6f 69 64 20 2a 63 6f 6e 74 65 78 74  ic void *context
2d00: 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 63  Malloc(sqlite3_c
2d10: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2d20: 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 63   i64 nByte){.  c
2d30: 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65  har *z;.  sqlite
2d40: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
2d50: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
2d60: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61 73  e(context);.  as
2d70: 73 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b  sert( nByte>0 );
2d80: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 42 79  .  testcase( nBy
2d90: 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  te==db->aLimit[S
2da0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
2db0: 54 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61 73  TH] );.  testcas
2dc0: 65 28 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61 4c  e( nByte==db->aL
2dd0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
2de0: 54 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20  T_LENGTH]+1 );. 
2df0: 20 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61   if( nByte>db->a
2e00: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
2e10: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
2e20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2e30: 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f  _error_toobig(co
2e40: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7a 20 3d 20  ntext);.    z = 
2e50: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
2e60: 7a 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  z = sqlite3Mallo
2e70: 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  c(nByte);.    if
2e80: 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  ( !z ){.      sq
2e90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2ea0: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
2eb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2ec0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
2ed0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2ee0: 20 6f 66 20 74 68 65 20 75 70 70 65 72 28 29 20   of the upper() 
2ef0: 61 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20  and lower() SQL 
2f00: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  functions..*/.st
2f10: 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72 46  atic void upperF
2f20: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
2f30: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
2f40: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
2f50: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
2f60: 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e   char *z1;.  con
2f70: 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69  st char *z2;.  i
2f80: 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45  nt i, n;.  UNUSE
2f90: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
2fa0: 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a  );.  z2 = (char*
2fb0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2fc0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
2fd0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
2fe0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
2ff0: 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ;.  /* Verify th
3000: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f  at the call to _
3010: 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74  bytes() does not
3020: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
3030: 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20  _text() pointer 
3040: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d  */.  assert( z2=
3050: 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  =(char*)sqlite3_
3060: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
3070: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20  0]) );.  if( z2 
3080: 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74  ){.    z1 = cont
3090: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
30a0: 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a  t, ((i64)n)+1);.
30b0: 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20      if( z1 ){.  
30c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
30d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30e0: 7a 31 5b 69 5d 20 3d 20 28 63 68 61 72 29 73 71  z1[i] = (char)sq
30f0: 6c 69 74 65 33 54 6f 75 70 70 65 72 28 7a 32 5b  lite3Toupper(z2[
3100: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
3110: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3120: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
3130: 7a 31 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66  z1, n, sqlite3_f
3140: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ree);.    }.  }.
3150: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f  }.static void lo
3160: 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  werFunc(sqlite3_
3170: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3180: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
3190: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
31a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20  ){.  char *z1;. 
31b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
31c0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55  .  int i, n;.  U
31d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
31e0: 61 72 67 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63  argc);.  z2 = (c
31f0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
3200: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
3210: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
3220: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
3230: 5b 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66  [0]);.  /* Verif
3240: 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  y that the call 
3250: 74 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65 73  to _bytes() does
3260: 20 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20   not invalidate 
3270: 74 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69 6e  the _text() poin
3280: 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ter */.  assert(
3290: 20 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69   z2==(char*)sqli
32a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
32b0: 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  rgv[0]) );.  if(
32c0: 20 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20   z2 ){.    z1 = 
32d0: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
32e0: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2b  ntext, ((i64)n)+
32f0: 31 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20 29  1);.    if( z1 )
3300: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
3310: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
3320: 20 20 20 20 7a 31 5b 69 5d 20 3d 20 73 71 6c 69      z1[i] = sqli
3330: 74 65 33 54 6f 6c 6f 77 65 72 28 7a 32 5b 69 5d  te3Tolower(z2[i]
3340: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3350: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3360: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31  text(context, z1
3370: 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  , n, sqlite3_fre
3380: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
3390: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 66 75 6e 63  ./*.** Some func
33a0: 74 69 6f 6e 73 20 6c 69 6b 65 20 43 4f 41 4c 45  tions like COALE
33b0: 53 43 45 28 29 20 61 6e 64 20 49 46 4e 55 4c 4c  SCE() and IFNULL
33c0: 28 29 20 61 6e 64 20 55 4e 4c 49 4b 45 4c 59 28  () and UNLIKELY(
33d0: 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
33e0: 64 0a 2a 2a 20 61 73 20 56 44 42 45 20 63 6f 64  d.** as VDBE cod
33f0: 65 20 73 6f 20 74 68 61 74 20 75 6e 75 73 65 64  e so that unused
3400: 20 61 72 67 75 6d 65 6e 74 20 76 61 6c 75 65 73   argument values
3410: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
3420: 62 65 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2a 20  be computed..** 
3430: 48 6f 77 65 76 65 72 2c 20 77 65 20 73 74 69 6c  However, we stil
3440: 6c 20 6e 65 65 64 20 73 6f 6d 65 20 6b 69 6e 64  l need some kind
3450: 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70   of function imp
3460: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  lementation for 
3470: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  this.** routines
3480: 20 69 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   in the function
3490: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6e 6f 6f   table.  The noo
34a0: 70 46 75 6e 63 20 6d 61 63 72 6f 20 70 72 6f 76  pFunc macro prov
34b0: 69 64 65 73 20 74 68 69 73 2e 0a 2a 2a 20 6e 6f  ides this..** no
34c0: 6f 70 46 75 6e 63 20 77 69 6c 6c 20 6e 65 76 65  opFunc will neve
34d0: 72 20 62 65 20 63 61 6c 6c 65 64 20 73 6f 20 69  r be called so i
34e0: 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  t doesn't matter
34f0: 20 77 68 61 74 20 74 68 65 20 69 6d 70 6c 65 6d   what the implem
3500: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 2e 20  entation.** is. 
3510: 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   We might as wel
3520: 6c 20 75 73 65 20 74 68 65 20 22 76 65 72 73 69  l use the "versi
3530: 6f 6e 28 29 22 20 66 75 6e 63 74 69 6f 6e 20 61  on()" function a
3540: 73 20 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a  s a substitute..
3550: 2a 2f 0a 23 64 65 66 69 6e 65 20 6e 6f 6f 70 46  */.#define noopF
3560: 75 6e 63 20 76 65 72 73 69 6f 6e 46 75 6e 63 20  unc versionFunc 
3570: 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
3580: 66 75 6e 63 74 69 6f 6e 20 2d 20 6e 65 76 65 72  function - never
3590: 20 63 61 6c 6c 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a   called */../*.*
35a0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
35b0: 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20 52   of random().  R
35c0: 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 69  eturn a random i
35d0: 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61  nteger.  .*/.sta
35e0: 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46  tic void randomF
35f0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
3600: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3610: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
3620: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3630: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
3640: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 3b 0a  sqlite_int64 r;.
3650: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3660: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
3670: 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74 65  Used2);.  sqlite
3680: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
3690: 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 69  eof(r), &r);.  i
36a0: 66 28 20 72 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  f( r<0 ){.    /*
36b0: 20 57 65 20 6e 65 65 64 20 74 6f 20 70 72 65 76   We need to prev
36c0: 65 6e 74 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d  ent a random num
36d0: 62 65 72 20 6f 66 20 30 78 38 30 30 30 30 30 30  ber of 0x8000000
36e0: 30 30 30 30 30 30 30 30 30 20 0a 20 20 20 20 2a  000000000 .    *
36f0: 2a 20 28 6f 72 20 2d 39 32 32 33 33 37 32 30 33  * (or -922337203
3700: 36 38 35 34 37 37 35 38 30 38 29 20 73 69 6e 63  6854775808) sinc
3710: 65 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 61 62  e when you do ab
3720: 73 28 29 20 6f 66 20 74 68 61 74 0a 20 20 20 20  s() of that.    
3730: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 79 6f 75  ** number of you
3740: 20 67 65 74 20 74 68 65 20 73 61 6d 65 20 76 61   get the same va
3750: 6c 75 65 20 62 61 63 6b 20 61 67 61 69 6e 2e 20  lue back again. 
3760: 20 54 6f 20 64 6f 20 74 68 69 73 0a 20 20 20 20   To do this.    
3770: 2a 2a 20 69 6e 20 61 20 77 61 79 20 74 68 61 74  ** in a way that
3780: 20 69 73 20 74 65 73 74 61 62 6c 65 2c 20 6d 61   is testable, ma
3790: 73 6b 20 74 68 65 20 73 69 67 6e 20 62 69 74 20  sk the sign bit 
37a0: 6f 66 66 20 6f 66 20 6e 65 67 61 74 69 76 65 0a  off of negative.
37b0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 2c 20 72      ** values, r
37c0: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 70 6f  esulting in a po
37d0: 73 69 74 69 76 65 20 76 61 6c 75 65 2e 20 20 54  sitive value.  T
37e0: 68 65 6e 20 74 61 6b 65 20 74 68 65 20 0a 20 20  hen take the .  
37f0: 20 20 2a 2a 20 32 73 20 63 6f 6d 70 6c 65 6d 65    ** 2s compleme
3800: 6e 74 20 6f 66 20 74 68 61 74 20 70 6f 73 69 74  nt of that posit
3810: 69 76 65 20 76 61 6c 75 65 2e 20 20 54 68 65 20  ive value.  The 
3820: 65 6e 64 20 72 65 73 75 6c 74 20 63 61 6e 0a 20  end result can. 
3830: 20 20 20 2a 2a 20 74 68 65 72 65 66 6f 72 65 20     ** therefore 
3840: 62 65 20 6e 6f 20 6c 65 73 73 20 74 68 61 6e 20  be no less than 
3850: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
3860: 35 38 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  5807..    */.   
3870: 20 72 20 3d 20 2d 28 72 20 26 20 4c 41 52 47 45   r = -(r & LARGE
3880: 53 54 5f 49 4e 54 36 34 29 3b 0a 20 20 7d 0a 20  ST_INT64);.  }. 
3890: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
38a0: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 72  int64(context, r
38b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
38c0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61  ementation of ra
38d0: 6e 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52 65  ndomblob(N).  Re
38e0: 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62 6c  turn a random bl
38f0: 6f 62 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e 20  ob.** that is N 
3900: 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73  bytes long..*/.s
3910: 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f  tatic void rando
3920: 6d 42 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33  mBlob(.  sqlite3
3930: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
3940: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
3950: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3960: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
3970: 65 33 5f 69 6e 74 36 34 20 6e 3b 0a 20 20 75 6e  e3_int64 n;.  un
3980: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a  signed char *p;.
3990: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
39a0: 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
39b0: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
39c0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
39d0: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
39e0: 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 29 7b 0a  );.  if( n<1 ){.
39f0: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20      n = 1;.  }. 
3a00: 20 70 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c   p = contextMall
3a10: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a  oc(context, n);.
3a20: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
3a30: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
3a40: 73 28 6e 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c  s(n, p);.    sql
3a50: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
3a60: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
3a70: 29 70 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66  )p, n, sqlite3_f
3a80: 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ree);.  }.}../*.
3a90: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3aa0: 6e 20 6f 66 20 74 68 65 20 6c 61 73 74 5f 69 6e  n of the last_in
3ab0: 73 65 72 74 5f 72 6f 77 69 64 28 29 20 53 51 4c  sert_rowid() SQL
3ac0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
3ad0: 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
3ae0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
3af0: 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  he sqlite3_last_
3b00: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 41  insert_rowid() A
3b10: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
3b20: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3b30: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 0a 20  _insert_rowid(. 
3b40: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3b50: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
3b60: 74 20 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71  t NotUsed, .  sq
3b70: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f  lite3_value **No
3b80: 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69  tUsed2.){.  sqli
3b90: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
3ba0: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
3bb0: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
3bc0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3bd0: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
3be0: 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20  ed2);.  /* IMP: 
3bf0: 52 2d 35 31 35 31 33 2d 31 32 30 32 36 20 54 68  R-51513-12026 Th
3c00: 65 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  e last_insert_ro
3c10: 77 69 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69  wid() SQL functi
3c20: 6f 6e 20 69 73 20 61 0a 20 20 2a 2a 20 77 72 61  on is a.  ** wra
3c30: 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20  pper around the 
3c40: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
3c50: 65 72 74 5f 72 6f 77 69 64 28 29 20 43 2f 43 2b  ert_rowid() C/C+
3c60: 2b 20 69 6e 74 65 72 66 61 63 65 0a 20 20 2a 2a  + interface.  **
3c70: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
3c80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3c90: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71  nt64(context, sq
3ca0: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
3cb0: 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a  t_rowid(db));.}.
3cc0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
3cd0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61  ation of the cha
3ce0: 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74  nges() SQL funct
3cf0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20  ion..**.** IMP: 
3d00: 52 2d 36 32 30 37 33 2d 31 31 32 30 39 20 54 68  R-62073-11209 Th
3d10: 65 20 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20  e changes() SQL 
3d20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
3d30: 61 70 70 65 72 0a 2a 2a 20 61 72 6f 75 6e 64 20  apper.** around 
3d40: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  the sqlite3_chan
3d50: 67 65 73 28 29 20 43 2f 43 2b 2b 20 66 75 6e 63  ges() C/C++ func
3d60: 74 69 6f 6e 20 61 6e 64 20 68 65 6e 63 65 20 66  tion and hence f
3d70: 6f 6c 6c 6f 77 73 20 74 68 65 20 73 61 6d 65 0a  ollows the same.
3d80: 2a 2a 20 72 75 6c 65 73 20 66 6f 72 20 63 6f 75  ** rules for cou
3d90: 6e 74 69 6e 67 20 63 68 61 6e 67 65 73 2e 0a 2a  nting changes..*
3da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
3db0: 61 6e 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33  anges(.  sqlite3
3dc0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
3dd0: 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64  t,.  int NotUsed
3de0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
3df0: 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a  e **NotUsed2.){.
3e00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3e10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
3e20: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
3e30: 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t);.  UNUSED_PAR
3e40: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
3e50: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73 71   NotUsed2);.  sq
3e60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
3e70: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
3e80: 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a  3_changes(db));.
3e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
3ea0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ntation of the t
3eb0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 53  otal_changes() S
3ec0: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
3ed0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
3ee0: 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73  s.** the same as
3ef0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 6f 74   the sqlite3_tot
3f00: 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49  al_changes() API
3f10: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
3f20: 61 74 69 63 20 76 6f 69 64 20 74 6f 74 61 6c 5f  atic void total_
3f30: 63 68 61 6e 67 65 73 28 0a 20 20 73 71 6c 69 74  changes(.  sqlit
3f40: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3f50: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
3f60: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
3f70: 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29  lue **NotUsed2.)
3f80: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
3f90: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
3fa0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
3fb0: 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ext);.  UNUSED_P
3fc0: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
3fd0: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
3fe0: 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 37 35 36 2d  /* IMP: R-52756-
3ff0: 34 31 39 39 33 20 54 68 69 73 20 66 75 6e 63 74  41993 This funct
4000: 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
4010: 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a   around the.  **
4020: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
4030: 68 61 6e 67 65 73 28 29 20 43 2f 43 2b 2b 20 69  hanges() C/C++ i
4040: 6e 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73  nterface. */.  s
4050: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
4060: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
4070: 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
4080: 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (db));.}../*.** 
4090: 41 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69  A structure defi
40a0: 6e 69 6e 67 20 68 6f 77 20 74 6f 20 64 6f 20 47  ning how to do G
40b0: 4c 4f 42 2d 73 74 79 6c 65 20 63 6f 6d 70 61 72  LOB-style compar
40c0: 69 73 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  isons..*/.struct
40d0: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 7b 0a 20   compareInfo {. 
40e0: 20 75 38 20 6d 61 74 63 68 41 6c 6c 3b 20 20 20   u8 matchAll;   
40f0: 20 20 20 20 20 20 20 2f 2a 20 22 2a 22 20 6f 72         /* "*" or
4100: 20 22 25 22 20 2a 2f 0a 20 20 75 38 20 6d 61 74   "%" */.  u8 mat
4110: 63 68 4f 6e 65 3b 20 20 20 20 20 20 20 20 20 20  chOne;          
4120: 2f 2a 20 22 3f 22 20 6f 72 20 22 5f 22 20 2a 2f  /* "?" or "_" */
4130: 0a 20 20 75 38 20 6d 61 74 63 68 53 65 74 3b 20  .  u8 matchSet; 
4140: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 5b 22 20           /* "[" 
4150: 6f 72 20 30 20 2a 2f 0a 20 20 75 38 20 6e 6f 43  or 0 */.  u8 noC
4160: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
4170: 2f 2a 20 74 72 75 65 20 74 6f 20 69 67 6e 6f 72  /* true to ignor
4180: 65 20 63 61 73 65 20 64 69 66 66 65 72 65 6e 63  e case differenc
4190: 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
41a0: 46 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f  For LIKE and GLO
41b0: 42 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20 45 42  B matching on EB
41c0: 43 44 49 43 20 6d 61 63 68 69 6e 65 73 2c 20 61  CDIC machines, a
41d0: 73 73 75 6d 65 20 74 68 61 74 20 65 76 65 72 79  ssume that every
41e0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 69 73  .** character is
41f0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74   exactly one byt
4200: 65 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c 73 6f  e in size.  Also
4210: 2c 20 70 72 6f 76 64 65 20 74 68 65 20 55 74 66  , provde the Utf
4220: 38 52 65 61 64 28 29 0a 2a 2a 20 6d 61 63 72 6f  8Read().** macro
4230: 20 66 6f 72 20 66 61 73 74 20 72 65 61 64 69 6e   for fast readin
4240: 67 20 6f 66 20 74 68 65 20 6e 65 78 74 20 63 68  g of the next ch
4250: 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 63  aracter in the c
4260: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
4270: 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 63 68 61  .** the next cha
4280: 72 61 63 74 65 72 20 69 73 20 41 53 43 49 49 2e  racter is ASCII.
4290: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
42a0: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 29 0a 23  SQLITE_EBCDIC).#
42b0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 55   define sqlite3U
42c0: 74 66 38 52 65 61 64 28 41 29 20 20 20 20 20 20  tf8Read(A)      
42d0: 20 20 28 2a 28 28 2a 41 29 2b 2b 29 29 0a 23 20    (*((*A)++)).# 
42e0: 64 65 66 69 6e 65 20 55 74 66 38 52 65 61 64 28  define Utf8Read(
42f0: 41 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A)              
4300: 20 28 2a 28 41 2b 2b 29 29 0a 23 65 6c 73 65 0a   (*(A++)).#else.
4310: 23 20 64 65 66 69 6e 65 20 55 74 66 38 52 65 61  # define Utf8Rea
4320: 64 28 41 29 20 20 20 20 20 20 20 20 20 20 20 20  d(A)            
4330: 20 20 20 28 41 5b 30 5d 3c 30 78 38 30 3f 2a 28     (A[0]<0x80?*(
4340: 41 2b 2b 29 3a 73 71 6c 69 74 65 33 55 74 66 38  A++):sqlite3Utf8
4350: 52 65 61 64 28 26 41 29 29 0a 23 65 6e 64 69 66  Read(&A)).#endif
4360: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  ..static const s
4370: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
4380: 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20 27  o globInfo = { '
4390: 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30 20  *', '?', '[', 0 
43a0: 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65 63  };./* The correc
43b0: 74 20 53 51 4c 2d 39 32 20 62 65 68 61 76 69 6f  t SQL-92 behavio
43c0: 72 20 69 73 20 66 6f 72 20 74 68 65 20 4c 49 4b  r is for the LIK
43d0: 45 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 69 67  E operator to ig
43e0: 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20 54  nore.** case.  T
43f0: 68 75 73 20 20 27 61 27 20 4c 49 4b 45 20 27 41  hus  'a' LIKE 'A
4400: 27 20 77 6f 75 6c 64 20 62 65 20 74 72 75 65 2e  ' would be true.
4410: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
4420: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
4430: 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d  nfo likeInfoNorm
4440: 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20   = { '%', '_',  
4450: 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20 53   0, 1 };./* If S
4460: 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49  QLITE_CASE_SENSI
4470: 54 49 56 45 5f 4c 49 4b 45 20 69 73 20 64 65 66  TIVE_LIKE is def
4480: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20 4c  ined, then the L
4490: 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  IKE operator.** 
44a0: 69 73 20 63 61 73 65 20 73 65 6e 73 69 74 69 76  is case sensitiv
44b0: 65 20 63 61 75 73 69 6e 67 20 27 61 27 20 4c 49  e causing 'a' LI
44c0: 4b 45 20 27 41 27 20 74 6f 20 62 65 20 66 61 6c  KE 'A' to be fal
44d0: 73 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  se */.static con
44e0: 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  st struct compar
44f0: 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41 6c  eInfo likeInfoAl
4500: 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20  t = { '%', '_', 
4510: 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a    0, 0 };../*.**
4520: 20 50 6f 73 73 69 62 6c 65 20 65 72 72 6f 72 20   Possible error 
4530: 72 65 74 75 72 6e 73 20 66 72 6f 6d 20 70 61 74  returns from pat
4540: 74 65 72 6e 4d 61 74 63 68 28 29 0a 2a 2f 0a 23  ternMatch().*/.#
4550: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41  define SQLITE_MA
4560: 54 43 48 20 20 20 20 20 20 20 20 20 20 20 20 20  TCH             
4570: 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  0.#define SQLITE
4580: 5f 4e 4f 4d 41 54 43 48 20 20 20 20 20 20 20 20  _NOMATCH        
4590: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c     1.#define SQL
45a0: 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d 41  ITE_NOWILDCARDMA
45b0: 54 43 48 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 43  TCH   2../*.** C
45c0: 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38  ompare two UTF-8
45d0: 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75   strings for equ
45e0: 61 6c 69 74 79 20 77 68 65 72 65 20 74 68 65 20  ality where the 
45f0: 66 69 72 73 74 20 73 74 72 69 6e 67 20 69 73 0a  first string is.
4600: 2a 2a 20 61 20 47 4c 4f 42 20 6f 72 20 4c 49 4b  ** a GLOB or LIK
4610: 45 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 52  E expression.  R
4620: 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a  eturn values:.**
4630: 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4d 41  .**    SQLITE_MA
4640: 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 20  TCH:            
4650: 4d 61 74 63 68 0a 2a 2a 20 20 20 20 53 51 4c 49  Match.**    SQLI
4660: 54 45 5f 4e 4f 4d 41 54 43 48 3a 20 20 20 20 20  TE_NOMATCH:     
4670: 20 20 20 20 20 4e 6f 20 6d 61 74 63 68 0a 2a 2a       No match.**
4680: 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c      SQLITE_NOWIL
4690: 44 43 41 52 44 4d 41 54 43 48 3a 20 20 4e 6f 20  DCARDMATCH:  No 
46a0: 6d 61 74 63 68 20 69 6e 20 73 70 69 74 65 20 6f  match in spite o
46b0: 66 20 68 61 76 69 6e 67 20 2a 20 6f 72 20 25 20  f having * or % 
46c0: 77 69 6c 64 63 61 72 64 73 2e 0a 2a 2a 0a 2a 2a  wildcards..**.**
46d0: 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a   Globbing rules:
46e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20  .**.**      '*' 
46f0: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e        Matches an
4700: 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65  y sequence of ze
4710: 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61  ro or more chara
4720: 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  cters..**.**    
4730: 20 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63    '?'       Matc
4740: 68 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  hes exactly one 
4750: 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a  character..**.**
4760: 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20       [...]      
4770: 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72  Matches one char
4780: 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65  acter from the e
4790: 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a  nclosed list of.
47a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
47b0: 20 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a    characters..**
47c0: 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20  .**     [^...]  
47d0: 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
47e0: 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20  haracter not in 
47f0: 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73  the enclosed lis
4800: 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68  t..**.** With th
4810: 65 20 5b 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e  e [...] and [^..
4820: 2e 5d 20 6d 61 74 63 68 69 6e 67 2c 20 61 20 27  .] matching, a '
4830: 5d 27 20 63 68 61 72 61 63 74 65 72 20 63 61 6e  ]' character can
4840: 20 62 65 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20   be included.** 
4850: 69 6e 20 74 68 65 20 6c 69 73 74 20 62 79 20 6d  in the list by m
4860: 61 6b 69 6e 67 20 69 74 20 74 68 65 20 66 69 72  aking it the fir
4870: 73 74 20 63 68 61 72 61 63 74 65 72 20 61 66 74  st character aft
4880: 65 72 20 27 5b 27 20 6f 72 20 27 5e 27 2e 20 20  er '[' or '^'.  
4890: 41 0a 2a 2a 20 72 61 6e 67 65 20 6f 66 20 63 68  A.** range of ch
48a0: 61 72 61 63 74 65 72 73 20 63 61 6e 20 62 65 20  aracters can be 
48b0: 73 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20  specified using 
48c0: 27 2d 27 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  '-'.  Example:.*
48d0: 2a 20 22 5b 61 2d 7a 5d 22 20 6d 61 74 63 68 65  * "[a-z]" matche
48e0: 73 20 61 6e 79 20 73 69 6e 67 6c 65 20 6c 6f 77  s any single low
48f0: 65 72 2d 63 61 73 65 20 6c 65 74 74 65 72 2e 20  er-case letter. 
4900: 20 54 6f 20 6d 61 74 63 68 20 61 20 27 2d 27 2c   To match a '-',
4910: 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20   make.** it the 
4920: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 69  last character i
4930: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  n the list..**.*
4940: 2a 20 4c 69 6b 65 20 6d 61 74 63 68 69 6e 67 20  * Like matching 
4950: 72 75 6c 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  rules:.** .**   
4960: 20 20 20 27 25 27 20 20 20 20 20 20 20 4d 61 74     '%'       Mat
4970: 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63  ches any sequenc
4980: 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  e of zero or mor
4990: 65 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 0a  e characters.**.
49a0: 2a 2a 2a 20 20 20 20 20 27 5f 27 20 20 20 20 20  ***     '_'     
49b0: 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 6f 6e    Matches any on
49c0: 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 0a 2a  e character.**.*
49d0: 2a 20 20 20 20 20 20 45 63 20 20 20 20 20 20 20  *      Ec       
49e0: 20 57 68 65 72 65 20 45 20 69 73 20 74 68 65 20   Where E is the 
49f0: 22 65 73 63 22 20 63 68 61 72 61 63 74 65 72 20  "esc" character 
4a00: 61 6e 64 20 63 20 69 73 20 61 6e 79 20 6f 74 68  and c is any oth
4a10: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
4a20: 20 20 20 20 20 63 68 61 72 61 63 74 65 72 2c 20       character, 
4a30: 69 6e 63 6c 75 64 69 6e 67 20 27 25 27 2c 20 27  including '%', '
4a40: 5f 27 2c 20 61 6e 64 20 65 73 63 2c 20 6d 61 74  _', and esc, mat
4a50: 63 68 20 65 78 61 63 74 6c 79 20 63 2e 0a 2a 2a  ch exactly c..**
4a60: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 65 6e 74 73  .** The comments
4a70: 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 6f 75   within this rou
4a80: 74 69 6e 65 20 75 73 75 61 6c 6c 79 20 61 73 73  tine usually ass
4a90: 75 6d 65 20 67 6c 6f 62 20 6d 61 74 63 68 69 6e  ume glob matchin
4aa0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
4ab0: 75 74 69 6e 65 20 69 73 20 75 73 75 61 6c 6c 79  utine is usually
4ac0: 20 71 75 69 63 6b 2c 20 62 75 74 20 63 61 6e 20   quick, but can 
4ad0: 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77  be N**2 in the w
4ae0: 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  orst case..*/.st
4af0: 61 74 69 63 20 69 6e 74 20 70 61 74 74 65 72 6e  atic int pattern
4b00: 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74  Compare(.  const
4b10: 20 75 38 20 2a 7a 50 61 74 74 65 72 6e 2c 20 20   u8 *zPattern,  
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4b30: 68 65 20 67 6c 6f 62 20 70 61 74 74 65 72 6e 20  he glob pattern 
4b40: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  */.  const u8 *z
4b50: 53 74 72 69 6e 67 2c 20 20 20 20 20 20 20 20 20  String,         
4b60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72        /* The str
4b70: 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  ing to compare a
4b80: 67 61 69 6e 73 74 20 74 68 65 20 67 6c 6f 62 20  gainst the glob 
4b90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  */.  const struc
4ba0: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70  t compareInfo *p
4bb0: 49 6e 66 6f 2c 20 2f 2a 20 49 6e 66 6f 72 6d 61  Info, /* Informa
4bc0: 74 69 6f 6e 20 61 62 6f 75 74 20 68 6f 77 20 74  tion about how t
4bd0: 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 65  o do the compare
4be0: 20 2a 2f 0a 20 20 75 33 32 20 6d 61 74 63 68 4f   */.  u32 matchO
4bf0: 74 68 65 72 20 20 20 20 20 20 20 20 20 20 20 20  ther            
4c00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 73         /* The es
4c10: 63 61 70 65 20 63 68 61 72 20 28 4c 49 4b 45 29  cape char (LIKE)
4c20: 20 6f 72 20 27 5b 27 20 28 47 4c 4f 42 29 20 2a   or '[' (GLOB) *
4c30: 2f 0a 29 7b 0a 20 20 75 33 32 20 63 2c 20 63 32  /.){.  u32 c, c2
4c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
4c60: 70 61 74 74 65 72 6e 20 61 6e 64 20 69 6e 70 75  pattern and inpu
4c70: 74 20 73 74 72 69 6e 67 20 63 68 61 72 73 20 2a  t string chars *
4c80: 2f 0a 20 20 75 33 32 20 6d 61 74 63 68 4f 6e 65  /.  u32 matchOne
4c90: 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 4f   = pInfo->matchO
4ca0: 6e 65 3b 20 20 2f 2a 20 22 3f 22 20 6f 72 20 22  ne;  /* "?" or "
4cb0: 5f 22 20 2a 2f 0a 20 20 75 33 32 20 6d 61 74 63  _" */.  u32 matc
4cc0: 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61  hAll = pInfo->ma
4cd0: 74 63 68 41 6c 6c 3b 20 20 2f 2a 20 22 2a 22 20  tchAll;  /* "*" 
4ce0: 6f 72 20 22 25 22 20 2a 2f 0a 20 20 75 38 20 6e  or "%" */.  u8 n
4cf0: 6f 43 61 73 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e  oCase = pInfo->n
4d00: 6f 43 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20  oCase;       /* 
4d10: 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73  True if uppercas
4d20: 65 3d 3d 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a  e==lowercase */.
4d30: 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 45 73 63    const u8 *zEsc
4d40: 61 70 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  aped = 0;       
4d50: 20 20 20 2f 2a 20 4f 6e 65 20 70 61 73 74 20 74     /* One past t
4d60: 68 65 20 6c 61 73 74 20 65 73 63 61 70 65 64 20  he last escaped 
4d70: 69 6e 70 75 74 20 63 68 61 72 20 2a 2f 0a 20 20  input char */.  
4d80: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 55  .  while( (c = U
4d90: 74 66 38 52 65 61 64 28 7a 50 61 74 74 65 72 6e  tf8Read(zPattern
4da0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
4db0: 20 63 3d 3d 6d 61 74 63 68 41 6c 6c 20 29 7b 20   c==matchAll ){ 
4dc0: 20 2f 2a 20 4d 61 74 63 68 20 22 2a 22 20 2a 2f   /* Match "*" */
4dd0: 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f  .      /* Skip o
4de0: 76 65 72 20 6d 75 6c 74 69 70 6c 65 20 22 2a 22  ver multiple "*"
4df0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
4e00: 68 65 20 70 61 74 74 65 72 6e 2e 20 20 49 66 20  he pattern.  If 
4e10: 74 68 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  there.      ** a
4e20: 72 65 20 61 6c 73 6f 20 22 3f 22 20 63 68 61 72  re also "?" char
4e30: 61 63 74 65 72 73 2c 20 73 6b 69 70 20 74 68 6f  acters, skip tho
4e40: 73 65 20 61 73 20 77 65 6c 6c 2c 20 62 75 74 20  se as well, but 
4e50: 63 6f 6e 73 75 6d 65 20 61 0a 20 20 20 20 20 20  consume a.      
4e60: 2a 2a 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63  ** single charac
4e70: 74 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ter of the input
4e80: 20 73 74 72 69 6e 67 20 66 6f 72 20 65 61 63 68   string for each
4e90: 20 22 3f 22 20 73 6b 69 70 70 65 64 20 2a 2f 0a   "?" skipped */.
4ea0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
4eb0: 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65 72  Utf8Read(zPatter
4ec0: 6e 29 29 20 3d 3d 20 6d 61 74 63 68 41 6c 6c 20  n)) == matchAll 
4ed0: 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68 4f 6e 65  || c == matchOne
4ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
4ef0: 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26 26 20 73  c==matchOne && s
4f00: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
4f10: 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a 20  zString)==0 ){. 
4f20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4f30: 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52  SQLITE_NOWILDCAR
4f40: 44 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20  DMATCH;.        
4f50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4f60: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
4f70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4f80: 45 5f 4d 41 54 43 48 3b 20 20 20 2f 2a 20 22 2a  E_MATCH;   /* "*
4f90: 22 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  " at the end of 
4fa0: 74 68 65 20 70 61 74 74 65 72 6e 20 6d 61 74 63  the pattern matc
4fb0: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  hes */.      }el
4fc0: 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f  se if( c==matchO
4fd0: 74 68 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ther ){.        
4fe0: 69 66 28 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68  if( pInfo->match
4ff0: 53 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Set==0 ){.      
5000: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
5010: 74 66 38 52 65 61 64 28 26 7a 50 61 74 74 65 72  tf8Read(&zPatter
5020: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n);.          if
5030: 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( c==0 ) return 
5040: 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52  SQLITE_NOWILDCAR
5050: 44 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20  DMATCH;.        
5060: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5070: 20 2f 2a 20 22 5b 2e 2e 2e 5d 22 20 69 6d 6d 65   /* "[...]" imme
5080: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20  diately follows 
5090: 74 68 65 20 22 2a 22 2e 20 20 57 65 20 68 61 76  the "*".  We hav
50a0: 65 20 74 6f 20 64 6f 20 61 20 73 6c 6f 77 0a 20  e to do a slow. 
50b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 63 75           ** recu
50c0: 72 73 69 76 65 20 73 65 61 72 63 68 20 69 6e 20  rsive search in 
50d0: 74 68 69 73 20 63 61 73 65 2c 20 62 75 74 20 69  this case, but i
50e0: 74 20 69 73 20 61 6e 20 75 6e 75 73 75 61 6c 20  t is an unusual 
50f0: 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  case. */.       
5100: 20 20 20 61 73 73 65 72 74 28 20 6d 61 74 63 68     assert( match
5110: 4f 74 68 65 72 3c 30 78 38 30 20 29 3b 20 20 2f  Other<0x80 );  /
5120: 2a 20 27 5b 27 20 69 73 20 61 20 73 69 6e 67 6c  * '[' is a singl
5130: 65 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  e-byte character
5140: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
5150: 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 29 7b  ile( *zString ){
5160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
5170: 20 62 4d 61 74 63 68 20 3d 20 70 61 74 74 65 72   bMatch = patter
5180: 6e 43 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65  nCompare(&zPatte
5190: 72 6e 5b 2d 31 5d 2c 7a 53 74 72 69 6e 67 2c 70  rn[-1],zString,p
51a0: 49 6e 66 6f 2c 6d 61 74 63 68 4f 74 68 65 72 29  Info,matchOther)
51b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
51c0: 28 20 62 4d 61 74 63 68 21 3d 53 51 4c 49 54 45  ( bMatch!=SQLITE
51d0: 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65 74 75 72  _NOMATCH ) retur
51e0: 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20 20 20 20  n bMatch;.      
51f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
5200: 50 5f 55 54 46 38 28 7a 53 74 72 69 6e 67 29 3b  P_UTF8(zString);
5210: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5220: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
5230: 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d  LITE_NOWILDCARDM
5240: 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ATCH;.        }.
5250: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
5260: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
5270: 76 61 72 69 61 62 6c 65 20 63 20 63 6f 6e 74 61  variable c conta
5280: 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 68  ins the first ch
5290: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a 20  aracter of the. 
52a0: 20 20 20 20 20 2a 2a 20 70 61 74 74 65 72 6e 20       ** pattern 
52b0: 73 74 72 69 6e 67 20 70 61 73 74 20 74 68 65 20  string past the 
52c0: 22 2a 22 2e 20 20 53 65 61 72 63 68 20 69 6e 20  "*".  Search in 
52d0: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
52e0: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
52f0: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  * first matching
5300: 20 63 68 61 72 61 63 74 65 72 20 61 6e 64 20 72   character and r
5310: 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6e 74 69  ecursively conti
5320: 6e 75 65 20 74 68 65 20 6d 61 74 63 68 20 66 72  nue the match fr
5330: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  om.      ** that
5340: 20 70 6f 69 6e 74 2e 0a 20 20 20 20 20 20 2a 2a   point..      **
5350: 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
5360: 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
5370: 20 73 65 61 72 63 68 2c 20 73 65 74 20 76 61 72   search, set var
5380: 69 61 62 6c 65 20 63 78 20 74 6f 20 62 65 20 74  iable cx to be t
5390: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 20 20 20  he same as.     
53a0: 20 2a 2a 20 63 20 62 75 74 20 69 6e 20 74 68 65   ** c but in the
53b0: 20 6f 74 68 65 72 20 63 61 73 65 20 61 6e 64 20   other case and 
53c0: 73 65 61 72 63 68 20 74 68 65 20 69 6e 70 75 74  search the input
53d0: 20 73 74 72 69 6e 67 20 66 6f 72 20 65 69 74 68   string for eith
53e0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 20 6f 72  er.      ** c or
53f0: 20 63 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   cx..      */.  
5400: 20 20 20 20 69 66 28 20 63 3c 3d 30 78 38 30 20      if( c<=0x80 
5410: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5420: 7a 53 74 6f 70 5b 33 5d 3b 0a 20 20 20 20 20 20  zStop[3];.      
5430: 20 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 20 20    int bMatch;.  
5440: 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65        if( noCase
5450: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
5460: 74 6f 70 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  top[0] = sqlite3
5470: 54 6f 75 70 70 65 72 28 63 29 3b 0a 20 20 20 20  Toupper(c);.    
5480: 20 20 20 20 20 20 7a 53 74 6f 70 5b 31 5d 20 3d        zStop[1] =
5490: 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28   sqlite3Tolower(
54a0: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53  c);.          zS
54b0: 74 6f 70 5b 32 5d 20 3d 20 30 3b 0a 20 20 20 20  top[2] = 0;.    
54c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
54d0: 20 20 20 20 20 7a 53 74 6f 70 5b 30 5d 20 3d 20       zStop[0] = 
54e0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  c;.          zSt
54f0: 6f 70 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  op[1] = 0;.     
5500: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69     }.        whi
5510: 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 20 20 20  le(1){.         
5520: 20 7a 53 74 72 69 6e 67 20 2b 3d 20 73 74 72 63   zString += strc
5530: 73 70 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  spn((const char*
5540: 29 7a 53 74 72 69 6e 67 2c 20 7a 53 74 6f 70 29  )zString, zStop)
5550: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5560: 7a 53 74 72 69 6e 67 5b 30 5d 3d 3d 30 20 29 20  zString[0]==0 ) 
5570: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
5580: 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20 20 20 20   zString++;.    
5590: 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20 70        bMatch = p
55a0: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 50  atternCompare(zP
55b0: 61 74 74 65 72 6e 2c 7a 53 74 72 69 6e 67 2c 70  attern,zString,p
55c0: 49 6e 66 6f 2c 6d 61 74 63 68 4f 74 68 65 72 29  Info,matchOther)
55d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
55e0: 62 4d 61 74 63 68 21 3d 53 51 4c 49 54 45 5f 4e  bMatch!=SQLITE_N
55f0: 4f 4d 41 54 43 48 20 29 20 72 65 74 75 72 6e 20  OMATCH ) return 
5600: 62 4d 61 74 63 68 3b 0a 20 20 20 20 20 20 20 20  bMatch;.        
5610: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
5620: 20 20 20 20 20 20 20 69 6e 74 20 62 4d 61 74 63         int bMatc
5630: 68 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  h;.        while
5640: 28 20 28 63 32 20 3d 20 55 74 66 38 52 65 61 64  ( (c2 = Utf8Read
5650: 28 7a 53 74 72 69 6e 67 29 29 21 3d 30 20 29 7b  (zString))!=0 ){
5660: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
5670: 32 21 3d 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b  2!=c ) continue;
5680: 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74 63  .          bMatc
5690: 68 20 3d 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  h = patternCompa
56a0: 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72  re(zPattern,zStr
56b0: 69 6e 67 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f  ing,pInfo,matchO
56c0: 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ther);.         
56d0: 20 69 66 28 20 62 4d 61 74 63 68 21 3d 53 51 4c   if( bMatch!=SQL
56e0: 49 54 45 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65  ITE_NOMATCH ) re
56f0: 74 75 72 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20  turn bMatch;.   
5700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5710: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5720: 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d 41 54  TE_NOWILDCARDMAT
5730: 43 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  CH;.    }.    if
5740: 28 20 63 3d 3d 6d 61 74 63 68 4f 74 68 65 72 20  ( c==matchOther 
5750: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  ){.      if( pIn
5760: 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3d 3d 30 20  fo->matchSet==0 
5770: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73  ){.        c = s
5780: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
5790: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
57a0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65     if( c==0 ) re
57b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 41  turn SQLITE_NOMA
57c0: 54 43 48 3b 0a 20 20 20 20 20 20 20 20 7a 45 73  TCH;.        zEs
57d0: 63 61 70 65 64 20 3d 20 7a 50 61 74 74 65 72 6e  caped = zPattern
57e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
57f0: 20 20 20 20 20 20 20 75 33 32 20 70 72 69 6f 72         u32 prior
5800: 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
5810: 69 6e 74 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20  int seen = 0;.  
5820: 20 20 20 20 20 20 69 6e 74 20 69 6e 76 65 72 74        int invert
5830: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20   = 0;.        c 
5840: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
5850: 64 28 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  d(&zString);.   
5860: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
5870: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5880: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20 63  MATCH;.        c
5890: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
58a0: 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a  ead(&zPattern);.
58b0: 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
58c0: 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '^' ){.         
58d0: 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20   invert = 1;.   
58e0: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
58f0: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61  te3Utf8Read(&zPa
5900: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  ttern);.        
5910: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  }.        if( c2
5920: 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  ==']' ){.       
5930: 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20     if( c==']' ) 
5940: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
5950: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
5960: 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74 65  Utf8Read(&zPatte
5970: 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rn);.        }. 
5980: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32         while( c2
5990: 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20   && c2!=']' ){. 
59a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d           if( c2=
59b0: 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e  ='-' && zPattern
59c0: 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74  [0]!=']' && zPat
59d0: 74 65 72 6e 5b 30 5d 21 3d 30 20 26 26 20 70 72  tern[0]!=0 && pr
59e0: 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
59f0: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
5a00: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61  te3Utf8Read(&zPa
5a10: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  ttern);.        
5a20: 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72      if( c>=prior
5a30: 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65  _c && c<=c2 ) se
5a40: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
5a50: 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b      prior_c = 0;
5a60: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5a70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
5a80: 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20  ( c==c2 ){.     
5a90: 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20           seen = 
5aa0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
5ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
5ac0: 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20  or_c = c2;.     
5ad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5ae0: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
5af0: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
5b00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5b10: 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c      if( c2==0 ||
5b20: 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29   (seen ^ invert)
5b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
5b40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5b50: 4f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20  OMATCH;.        
5b60: 7d 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  }.        contin
5b70: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
5b80: 7d 0a 20 20 20 20 63 32 20 3d 20 55 74 66 38 52  }.    c2 = Utf8R
5b90: 65 61 64 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  ead(zString);.  
5ba0: 20 20 69 66 28 20 63 3d 3d 63 32 20 29 20 63 6f    if( c==c2 ) co
5bb0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
5bc0: 6e 6f 43 61 73 65 20 20 26 26 20 73 71 6c 69 74  noCase  && sqlit
5bd0: 65 33 54 6f 6c 6f 77 65 72 28 63 29 3d 3d 73 71  e3Tolower(c)==sq
5be0: 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63 32 29  lite3Tolower(c2)
5bf0: 20 26 26 20 63 3c 30 78 38 30 20 26 26 20 63 32   && c<0x80 && c2
5c00: 3c 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 63  <0x80 ){.      c
5c10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
5c20: 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f     if( c==matchO
5c30: 6e 65 20 26 26 20 7a 50 61 74 74 65 72 6e 21 3d  ne && zPattern!=
5c40: 7a 45 73 63 61 70 65 64 20 26 26 20 63 32 21 3d  zEscaped && c2!=
5c50: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5c60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5c70: 4e 4f 4d 41 54 43 48 3b 0a 20 20 7d 0a 20 20 72  NOMATCH;.  }.  r
5c80: 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d  eturn *zString==
5c90: 30 20 3f 20 53 51 4c 49 54 45 5f 4d 41 54 43 48  0 ? SQLITE_MATCH
5ca0: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43   : SQLITE_NOMATC
5cb0: 48 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  H;.}../*.** The 
5cc0: 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
5cd0: 29 20 69 6e 74 65 72 66 61 63 65 2e 20 20 52 65  ) interface.  Re
5ce0: 74 75 72 6e 20 30 20 6f 6e 20 61 20 6d 61 74 63  turn 0 on a matc
5cf0: 68 20 28 6c 69 6b 65 20 73 74 72 63 6d 70 28 29  h (like strcmp()
5d00: 29 20 61 6e 64 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  ) and.** non-zer
5d10: 6f 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  o if there is no
5d20: 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73   match..*/.int s
5d30: 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 63  qlite3_strglob(c
5d40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
5d50: 50 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63  Pattern, const c
5d60: 68 61 72 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20  har *zString){. 
5d70: 20 72 65 74 75 72 6e 20 70 61 74 74 65 72 6e 43   return patternC
5d80: 6f 6d 70 61 72 65 28 28 75 38 2a 29 7a 47 6c 6f  ompare((u8*)zGlo
5d90: 62 50 61 74 74 65 72 6e 2c 20 28 75 38 2a 29 7a  bPattern, (u8*)z
5da0: 53 74 72 69 6e 67 2c 20 26 67 6c 6f 62 49 6e 66  String, &globInf
5db0: 6f 2c 20 27 5b 27 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  o, '[');.}../*.*
5dc0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 74  * The sqlite3_st
5dd0: 72 6c 69 6b 65 28 29 20 69 6e 74 65 72 66 61 63  rlike() interfac
5de0: 65 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  e.  Return 0 on 
5df0: 61 20 6d 61 74 63 68 20 61 6e 64 20 6e 6f 6e 2d  a match and non-
5e00: 7a 65 72 6f 20 66 6f 72 0a 2a 2a 20 61 20 6d 69  zero for.** a mi
5e10: 73 73 20 2d 20 6c 69 6b 65 20 73 74 72 63 6d 70  ss - like strcmp
5e20: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
5e30: 65 33 5f 73 74 72 6c 69 6b 65 28 63 6f 6e 73 74  e3_strlike(const
5e40: 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c   char *zPattern,
5e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
5e60: 72 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  r, unsigned int 
5e70: 65 73 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  esc){.  return p
5e80: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 28 75  atternCompare((u
5e90: 38 2a 29 7a 50 61 74 74 65 72 6e 2c 20 28 75 38  8*)zPattern, (u8
5ea0: 2a 29 7a 53 74 72 2c 20 26 6c 69 6b 65 49 6e 66  *)zStr, &likeInf
5eb0: 6f 4e 6f 72 6d 2c 20 65 73 63 29 3b 0a 7d 0a 0a  oNorm, esc);.}..
5ec0: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
5ed0: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
5ee0: 74 68 61 74 20 74 68 65 20 4c 49 4b 45 20 6f 70  that the LIKE op
5ef0: 65 72 61 74 6f 72 20 28 6f 72 20 47 4c 4f 42 20  erator (or GLOB 
5f00: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6a 75 73 74  which is.** just
5f10: 20 61 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20   a variation of 
5f20: 4c 49 4b 45 29 20 67 65 74 73 20 63 61 6c 6c 65  LIKE) gets calle
5f30: 64 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  d.  This is used
5f40: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
5f50: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
5f60: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
5f70: 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75  sqlite3_like_cou
5f80: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
5f90: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
5fa0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6b  ation of the lik
5fb0: 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  e() SQL function
5fc0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
5fd0: 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74   implements.** t
5fe0: 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49 4b 45  he build-in LIKE
5ff0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
6000: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
6010: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  o the function i
6020: 73 20 74 68 65 0a 2a 2a 20 70 61 74 74 65 72 6e  s the.** pattern
6030: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
6040: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
6050: 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20 74 68 65  string.  So, the
6060: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a   SQL statements:
6070: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20 4c  .**.**       A L
6080: 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69  IKE B.**.** is i
6090: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 6c 69  mplemented as li
60a0: 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54  ke(B,A)..**.** T
60b0: 68 69 73 20 73 61 6d 65 20 66 75 6e 63 74 69 6f  his same functio
60c0: 6e 20 28 77 69 74 68 20 61 20 64 69 66 66 65 72  n (with a differ
60d0: 65 6e 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  ent compareInfo 
60e0: 73 74 72 75 63 74 75 72 65 29 20 63 6f 6d 70 75  structure) compu
60f0: 74 65 73 0a 2a 2a 20 74 68 65 20 47 4c 4f 42 20  tes.** the GLOB 
6100: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
6110: 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e  tic void likeFun
6120: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
6130: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
6140: 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73    int argc, .  s
6150: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6160: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
6170: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41  nsigned char *zA
6180: 2c 20 2a 7a 42 3b 0a 20 20 75 33 32 20 65 73 63  , *zB;.  u32 esc
6190: 61 70 65 3b 0a 20 20 69 6e 74 20 6e 50 61 74 3b  ape;.  int nPat;
61a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
61b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
61c0: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
61d0: 78 74 29 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  xt);.  struct co
61e0: 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f  mpareInfo *pInfo
61f0: 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
6200: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 0a  data(context);..
6210: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 49  #ifdef SQLITE_LI
6220: 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f  KE_DOESNT_MATCH_
6230: 42 4c 4f 42 53 0a 20 20 69 66 28 20 73 71 6c 69  BLOBS.  if( sqli
6240: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
6250: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
6260: 42 4c 4f 42 0a 20 20 20 7c 7c 20 73 71 6c 69 74  BLOB.   || sqlit
6270: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
6280: 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 42  gv[1])==SQLITE_B
6290: 4c 4f 42 0a 20 20 29 7b 0a 23 69 66 64 65 66 20  LOB.  ){.#ifdef 
62a0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
62b0: 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75  sqlite3_like_cou
62c0: 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt++;.#endif.   
62d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
62e0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  int(context, 0);
62f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6300: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c 69  .#endif..  /* Li
6310: 6d 69 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  mit the length o
6320: 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c  f the LIKE or GL
6330: 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 20 61 76  OB pattern to av
6340: 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a  oid problems.  *
6350: 2a 20 6f 66 20 64 65 65 70 20 72 65 63 75 72 73  * of deep recurs
6360: 69 6f 6e 20 61 6e 64 20 4e 2a 4e 20 62 65 68 61  ion and N*N beha
6370: 76 69 6f 72 20 69 6e 20 70 61 74 74 65 72 6e 43  vior in patternC
6380: 6f 6d 70 61 72 65 28 29 2e 0a 20 20 2a 2f 0a 20  ompare()..  */. 
6390: 20 6e 50 61 74 20 3d 20 73 71 6c 69 74 65 33 5f   nPat = sqlite3_
63a0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
63b0: 5b 30 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  [0]);.  testcase
63c0: 28 20 6e 50 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d  ( nPat==db->aLim
63d0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
63e0: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
63f0: 47 54 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61  GTH] );.  testca
6400: 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d 3e 61 4c  se( nPat==db->aL
6410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
6420: 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
6430: 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66  ENGTH]+1 );.  if
6440: 28 20 6e 50 61 74 20 3e 20 64 62 2d 3e 61 4c 69  ( nPat > db->aLi
6450: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
6460: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
6470: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c  NGTH] ){.    sql
6480: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
6490: 72 28 63 6f 6e 74 65 78 74 2c 20 22 4c 49 4b 45  r(context, "LIKE
64a0: 20 6f 72 20 47 4c 4f 42 20 70 61 74 74 65 72 6e   or GLOB pattern
64b0: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 22 2c 20 2d   too complex", -
64c0: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
64d0: 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3d 3d    }.  if( argc==
64e0: 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  3 ){.    /* The 
64f0: 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72  escape character
6500: 20 73 74 72 69 6e 67 20 6d 75 73 74 20 63 6f 6e   string must con
6510: 73 69 73 74 20 6f 66 20 61 20 73 69 6e 67 6c 65  sist of a single
6520: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
6530: 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69  ..    ** Otherwi
6540: 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
6550: 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
6560: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
6570: 68 61 72 20 2a 7a 45 73 63 20 3d 20 73 71 6c 69  har *zEsc = sqli
6580: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6590: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[2]);.    if(
65a0: 20 7a 45 73 63 3d 3d 30 20 29 20 72 65 74 75 72   zEsc==0 ) retur
65b0: 6e 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  n;.    if( sqlit
65c0: 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 28 63  e3Utf8CharLen((c
65d0: 68 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29 21 3d  har*)zEsc, -1)!=
65e0: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
65f0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
6600: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  context, .      
6610: 20 20 20 20 22 45 53 43 41 50 45 20 65 78 70 72      "ESCAPE expr
6620: 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  ession must be a
6630: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
6640: 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72  r", -1);.      r
6650: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
6660: 20 65 73 63 61 70 65 20 3d 20 73 71 6c 69 74 65   escape = sqlite
6670: 33 55 74 66 38 52 65 61 64 28 26 7a 45 73 63 29  3Utf8Read(&zEsc)
6680: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  ;.  }else{.    e
6690: 73 63 61 70 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d  scape = pInfo->m
66a0: 61 74 63 68 53 65 74 3b 0a 20 20 7d 0a 20 20 7a  atchSet;.  }.  z
66b0: 42 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  B = sqlite3_valu
66c0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
66d0: 0a 20 20 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f  .  zA = sqlite3_
66e0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
66f0: 31 5d 29 3b 0a 20 20 69 66 28 20 7a 41 20 26 26  1]);.  if( zA &&
6700: 20 7a 42 20 29 7b 0a 23 69 66 64 65 66 20 53 51   zB ){.#ifdef SQ
6710: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
6720: 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
6730: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  ++;.#endif.    s
6740: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6750: 74 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20  t(context,.     
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
6780: 7a 42 2c 20 7a 41 2c 20 70 49 6e 66 6f 2c 20 65  zB, zA, pInfo, e
6790: 73 63 61 70 65 29 3d 3d 53 51 4c 49 54 45 5f 4d  scape)==SQLITE_M
67a0: 41 54 43 48 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ATCH);.  }.}../*
67b0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
67c0: 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46  on of the NULLIF
67d0: 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20  (x,y) function. 
67e0: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
67f0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
6800: 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72 67 75  ment if the argu
6810: 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66 65 72  ments are differ
6820: 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ent.  The result
6830: 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a   is NULL if the.
6840: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ** arguments are
6850: 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20 6f   equal to each o
6860: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
6870: 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28  void nullifFunc(
6880: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
6890: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
68a0: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
68b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
68c0: 67 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  gv.){.  CollSeq 
68d0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
68e0: 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63  GetFuncCollSeq(c
68f0: 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45  ontext);.  UNUSE
6900: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
6910: 73 65 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  sed);.  if( sqli
6920: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72  te3MemCompare(ar
6930: 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20  gv[0], argv[1], 
6940: 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20  pColl)!=0 ){.   
6950: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6960: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
6970: 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a  rgv[0]);.  }.}..
6980: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
6990: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
69a0: 74 65 5f 76 65 72 73 69 6f 6e 28 29 20 66 75 6e  te_version() fun
69b0: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75  ction.  The resu
69c0: 6c 74 20 69 73 20 74 68 65 20 76 65 72 73 69 6f  lt is the versio
69d0: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 53 51 4c 69  n.** of the SQLi
69e0: 74 65 20 6c 69 62 72 61 72 79 20 74 68 61 74 20  te library that 
69f0: 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73  is running..*/.s
6a00: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 73 69  tatic void versi
6a10: 6f 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  onFunc(.  sqlite
6a20: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6a30: 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  xt,.  int NotUse
6a40: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  d,.  sqlite3_val
6a50: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
6a60: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6a70: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
6a80: 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d  tUsed2);.  /* IM
6a90: 50 3a 20 52 2d 34 38 36 39 39 2d 34 38 36 31 37  P: R-48699-48617
6aa0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6ab0: 73 20 61 6e 20 53 51 4c 20 77 72 61 70 70 65 72  s an SQL wrapper
6ac0: 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a   around the.  **
6ad0: 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
6ae0: 69 6f 6e 28 29 20 43 2d 69 6e 74 65 72 66 61 63  ion() C-interfac
6af0: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  e. */.  sqlite3_
6b00: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6b10: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62  ext, sqlite3_lib
6b20: 76 65 72 73 69 6f 6e 28 29 2c 20 2d 31 2c 20 53  version(), -1, S
6b30: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d  QLITE_STATIC);.}
6b40: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6b50: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  tation of the sq
6b60: 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 28 29  lite_source_id()
6b70: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 72   function. The r
6b80: 65 73 75 6c 74 20 69 73 20 61 20 73 74 72 69 6e  esult is a strin
6b90: 67 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  g.** that identi
6ba0: 66 69 65 73 20 74 68 65 20 70 61 72 74 69 63 75  fies the particu
6bb0: 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  lar version of t
6bc0: 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 75  he source code u
6bd0: 73 65 64 20 74 6f 20 62 75 69 6c 64 0a 2a 2a 20  sed to build.** 
6be0: 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  SQLite..*/.stati
6bf0: 63 20 76 6f 69 64 20 73 6f 75 72 63 65 69 64 46  c void sourceidF
6c00: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
6c10: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6c20: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
6c30: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6c40: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
6c50: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6c60: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
6c70: 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20  ed2);.  /* IMP: 
6c80: 52 2d 32 34 34 37 30 2d 33 31 31 33 36 20 54 68  R-24470-31136 Th
6c90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
6ca0: 6e 20 53 51 4c 20 77 72 61 70 70 65 72 20 61 72  n SQL wrapper ar
6cb0: 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71  ound the.  ** sq
6cc0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
6cd0: 20 43 20 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f   C interface. */
6ce0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6cf0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6d00: 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
6d10: 28 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  (), -1, SQLITE_S
6d20: 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TATIC);.}../*.**
6d30: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
6d40: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6c 6f  of the sqlite_lo
6d50: 67 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  g() function.  T
6d60: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
6d70: 20 61 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74   around.** sqlit
6d80: 65 33 5f 6c 6f 67 28 29 2e 20 20 54 68 65 20 72  e3_log().  The r
6d90: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 4e  eturn value is N
6da0: 55 4c 4c 2e 20 20 54 68 65 20 66 75 6e 63 74 69  ULL.  The functi
6db0: 6f 6e 20 65 78 69 73 74 73 20 70 75 72 65 6c 79  on exists purely
6dc0: 20 66 6f 72 0a 2a 2a 20 69 74 73 20 73 69 64 65   for.** its side
6dd0: 2d 65 66 66 65 63 74 73 2e 0a 2a 2f 0a 73 74 61  -effects..*/.sta
6de0: 74 69 63 20 76 6f 69 64 20 65 72 72 6c 6f 67 46  tic void errlogF
6df0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
6e00: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6e10: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
6e20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6e30: 72 67 76 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  rgv.){.  UNUSED_
6e40: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
6e50: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6e60: 54 45 52 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  TER(context);.  
6e70: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 73 71 6c 69  sqlite3_log(sqli
6e80: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
6e90: 67 76 5b 30 5d 29 2c 20 22 25 73 22 2c 20 73 71  gv[0]), "%s", sq
6ea0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6eb0: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f  (argv[1]));.}../
6ec0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
6ed0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
6ee0: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
6ef0: 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e  used() function.
6f00: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
6f10: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  s an integer tha
6f20: 74 20 69 64 65 6e 74 69 66 69 65 73 20 69 66 20  t identifies if 
6f30: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  the compiler opt
6f40: 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20  ion.** was used 
6f50: 74 6f 20 62 75 69 6c 64 20 53 51 4c 69 74 65 2e  to build SQLite.
6f60: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
6f70: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
6f80: 50 54 49 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74  PTION_DIAGS.stat
6f90: 69 63 20 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f  ic void compileo
6fa0: 70 74 69 6f 6e 75 73 65 64 46 75 6e 63 28 0a 20  ptionusedFunc(. 
6fb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6fc0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6fd0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
6fe0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6ff0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7000: 4f 70 74 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  OptName;.  asser
7010: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
7020: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
7030: 28 61 72 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50  (argc);.  /* IMP
7040: 3a 20 52 2d 33 39 35 36 34 2d 33 36 33 30 35 20  : R-39564-36305 
7050: 54 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69  The sqlite_compi
7060: 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 20  leoption_used() 
7070: 53 51 4c 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  SQL.  ** functio
7080: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
7090: 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65  round the sqlite
70a0: 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
70b0: 75 73 65 64 28 29 20 43 2f 43 2b 2b 0a 20 20 2a  used() C/C++.  *
70c0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  * function..  */
70d0: 0a 20 20 69 66 28 20 28 7a 4f 70 74 4e 61 6d 65  .  if( (zOptName
70e0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
70f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
7100: 78 74 28 61 72 67 76 5b 30 5d 29 29 21 3d 30 20  xt(argv[0]))!=0 
7110: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
7120: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7130: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  t, sqlite3_compi
7140: 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 7a 4f  leoption_used(zO
7150: 70 74 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a  ptName));.  }.}.
7160: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7170: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
7180: 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a  ION_DIAGS */../*
7190: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
71a0: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
71b0: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67  _compileoption_g
71c0: 65 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  et() function. .
71d0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
71e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
71f0: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 63 6f  dentifies the co
7200: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 0a  mpiler options .
7210: 2a 2a 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  ** used to build
7220: 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e   SQLite..*/.#ifn
7230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7240: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
7250: 41 47 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AGS.static void 
7260: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74  compileoptionget
7270: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
7280: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
7290: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
72a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
72b0: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  argv.){.  int n;
72c0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
72d0: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
72e0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
72f0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 39 32    /* IMP: R-0492
7300: 32 2d 32 34 30 37 36 20 54 68 65 20 73 71 6c 69  2-24076 The sqli
7310: 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  te_compileoption
7320: 5f 67 65 74 28 29 20 53 51 4c 20 66 75 6e 63 74  _get() SQL funct
7330: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 77 72  ion.  ** is a wr
7340: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65  apper around the
7350: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
7360: 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20 43 2f 43  option_get() C/C
7370: 2b 2b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ++ function..  *
7380: 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  /.  n = sqlite3_
7390: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
73a0: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ]);.  sqlite3_re
73b0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
73c0: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  t, sqlite3_compi
73d0: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 6e 29 2c  leoption_get(n),
73e0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
73f0: 49 43 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  IC);.}.#endif /*
7400: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
7410: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
7420: 20 2a 2f 0a 0a 2f 2a 20 41 72 72 61 79 20 66 6f   */../* Array fo
7430: 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f  r converting fro
7440: 6d 20 68 61 6c 66 2d 62 79 74 65 73 20 28 6e 79  m half-bytes (ny
7450: 62 62 6c 65 73 29 20 69 6e 74 6f 20 41 53 43 49  bbles) into ASCI
7460: 49 20 68 65 78 0a 2a 2a 20 64 69 67 69 74 73 2e  I hex.** digits.
7470: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
7480: 20 63 68 61 72 20 68 65 78 64 69 67 69 74 73 5b   char hexdigits[
7490: 5d 20 3d 20 7b 0a 20 20 27 30 27 2c 20 27 31 27  ] = {.  '0', '1'
74a0: 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34 27 2c  , '2', '3', '4',
74b0: 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a   '5', '6', '7',.
74c0: 20 20 27 38 27 2c 20 27 39 27 2c 20 27 41 27 2c    '8', '9', 'A',
74d0: 20 27 42 27 2c 20 27 43 27 2c 20 27 44 27 2c 20   'B', 'C', 'D', 
74e0: 27 45 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f 2a  'E', 'F' .};../*
74f0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
7500: 6f 6e 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28  on of the QUOTE(
7510: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  ) function.  Thi
7520: 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  s function takes
7530: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67   a single.** arg
7540: 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61  ument.  If the a
7550: 72 67 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72  rgument is numer
7560: 69 63 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  ic, the return v
7570: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
7580: 20 61 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d   as.** the argum
7590: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67  ent.  If the arg
75a0: 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
75b0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
75c0: 69 73 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  is the string.**
75d0: 20 22 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77   "NULL".  Otherw
75e0: 69 73 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e  ise, the argumen
75f0: 74 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  t is enclosed in
7600: 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77   single quotes w
7610: 69 74 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75  ith.** single-qu
7620: 6f 74 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a  ote escapes..*/.
7630: 73 74 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74  static void quot
7640: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
7650: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
7660: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
7670: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
7680: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7690: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
76a0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
76b0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
76c0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
76d0: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
76e0: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
76f0: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
7700: 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 63 68 61  1, r2;.      cha
7710: 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20  r zBuf[50];.    
7720: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 5f 76    r1 = sqlite3_v
7730: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
7740: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  [0]);.      sqli
7750: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
7760: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
7770: 20 22 25 21 2e 31 35 67 22 2c 20 72 31 29 3b 0a   "%!.15g", r1);.
7780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f        sqlite3Ato
7790: 46 28 7a 42 75 66 2c 20 26 72 32 2c 20 32 30 2c  F(zBuf, &r2, 20,
77a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
77b0: 20 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20       if( r1!=r2 
77c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
77d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
77e0: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
77f0: 22 25 21 2e 32 30 65 22 2c 20 72 31 29 3b 0a 20  "%!.20e", r1);. 
7800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7810: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7820: 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20  (context, zBuf, 
7830: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
7840: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65  IENT);.      bre
7850: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7860: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
7870: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
7880: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
7890: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
78a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
78b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
78c0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
78d0: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20      char *zText 
78e0: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
78f0: 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73  const *zBlob = s
7900: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
7910: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
7920: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
7930: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
7940: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
7950: 20 20 61 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d    assert( zBlob=
7960: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  =sqlite3_value_b
7970: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  lob(argv[0]) ); 
7980: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
7990: 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 7a  hange */.      z
79a0: 54 65 78 74 20 3d 20 28 63 68 61 72 20 2a 29 63  Text = (char *)c
79b0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
79c0: 74 65 78 74 2c 20 28 32 2a 28 69 36 34 29 6e 42  text, (2*(i64)nB
79d0: 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20 20 20 20  lob)+4); .      
79e0: 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
79f0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
7a00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7a10: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Blob; i++){.    
7a20: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32        zText[(i*2
7a30: 29 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73  )+2] = hexdigits
7a40: 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30  [(zBlob[i]>>4)&0
7a50: 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x0F];.          
7a60: 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d  zText[(i*2)+3] =
7a70: 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f   hexdigits[(zBlo
7a80: 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20  b[i])&0x0F];.   
7a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
7aa0: 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32  Text[(nBlob*2)+2
7ab0: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
7ac0: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
7ad0: 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  )+3] = '\0';.   
7ae0: 20 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20       zText[0] = 
7af0: 27 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  'X';.        zTe
7b00: 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  xt[1] = '\'';.  
7b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7b20: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
7b30: 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51  t, zText, -1, SQ
7b40: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
7b50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7b60: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
7b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7b80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7b90: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
7ba0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a  .      int i,j;.
7bb0: 20 20 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20        u64 n;.   
7bc0: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
7bd0: 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73  d char *zArg = s
7be0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
7bf0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
7c00: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20    char *z;..    
7c10: 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20    if( zArg==0 ) 
7c20: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
7c30: 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67  r(i=0, n=0; zArg
7c40: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a  [i]; i++){ if( z
7c50: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  Arg[i]=='\'' ) n
7c60: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20  ++; }.      z = 
7c70: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
7c80: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 69 29 2b  ntext, ((i64)i)+
7c90: 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a 20 20 20  ((i64)n)+3);.   
7ca0: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
7cb0: 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b      z[0] = '\'';
7cc0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
7cd0: 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20  , j=1; zArg[i]; 
7ce0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7cf0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d  z[j++] = zArg[i]
7d00: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7d10: 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  zArg[i]=='\'' ){
7d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  .            z[j
7d30: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
7d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7d50: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  }.        z[j++]
7d60: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
7d70: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
7d80: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7d90: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
7da0: 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  z, j, sqlite3_fr
7db0: 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ee);.      }.   
7dc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7dd0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
7de0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
7df0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
7e00: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
7e10: 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  _NULL );.      s
7e20: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7e30: 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c  xt(context, "NUL
7e40: 4c 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54  L", 4, SQLITE_ST
7e50: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
7e60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
7e70: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 63 6f  ./*.** The unico
7e80: 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  de() function.  
7e90: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67  Return the integ
7ea0: 65 72 20 75 6e 69 63 6f 64 65 20 63 6f 64 65 2d  er unicode code-
7eb0: 70 6f 69 6e 74 20 76 61 6c 75 65 0a 2a 2a 20 66  point value.** f
7ec0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 68 61  or the first cha
7ed0: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e  racter of the in
7ee0: 70 75 74 20 73 74 72 69 6e 67 2e 20 0a 2a 2f 0a  put string. .*/.
7ef0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 63  static void unic
7f00: 6f 64 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  odeFunc(.  sqlit
7f10: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7f20: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
7f30: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7f40: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
7f50: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
7f60: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   *z = sqlite3_va
7f70: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
7f80: 29 3b 0a 20 20 28 76 6f 69 64 29 61 72 67 63 3b  );.  (void)argc;
7f90: 0a 20 20 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d  .  if( z && z[0]
7fa0: 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c   ) sqlite3_resul
7fb0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
7fc0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
7fd0: 7a 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  z));.}../*.** Th
7fe0: 65 20 63 68 61 72 28 29 20 66 75 6e 63 74 69 6f  e char() functio
7ff0: 6e 20 74 61 6b 65 73 20 7a 65 72 6f 20 6f 72 20  n takes zero or 
8000: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2c 20  more arguments, 
8010: 65 61 63 68 20 6f 66 20 77 68 69 63 68 20 69 73  each of which is
8020: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 20  .** an integer. 
8030: 20 49 74 20 63 6f 6e 73 74 72 75 63 74 73 20 61   It constructs a
8040: 20 73 74 72 69 6e 67 20 77 68 65 72 65 20 65 61   string where ea
8050: 63 68 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  ch character of 
8060: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  the string.** is
8070: 20 74 68 65 20 75 6e 69 63 6f 64 65 20 63 68 61   the unicode cha
8080: 72 61 63 74 65 72 20 66 6f 72 20 74 68 65 20 63  racter for the c
8090: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 74  orresponding int
80a0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  eger argument..*
80b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
80c0: 61 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  arFunc(.  sqlite
80d0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
80e0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
80f0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8100: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 75 6e 73 69  **argv.){.  unsi
8110: 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 2a 7a  gned char *z, *z
8120: 4f 75 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Out;.  int i;.  
8130: 7a 4f 75 74 20 3d 20 7a 20 3d 20 73 71 6c 69 74  zOut = z = sqlit
8140: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 61 72 67  e3_malloc64( arg
8150: 63 2a 34 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a  c*4+1 );.  if( z
8160: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8170: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
8180: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
8190: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
81a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
81b0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  c; i++){.    sql
81c0: 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
81d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 3b 0a 20 20    unsigned c;.  
81e0: 20 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    x = sqlite3_va
81f0: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 69  lue_int64(argv[i
8200: 5d 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 30 20  ]);.    if( x<0 
8210: 7c 7c 20 78 3e 30 78 31 30 66 66 66 66 20 29 20  || x>0x10ffff ) 
8220: 78 20 3d 20 30 78 66 66 66 64 3b 0a 20 20 20 20  x = 0xfffd;.    
8230: 63 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 28 78  c = (unsigned)(x
8240: 20 26 20 30 78 31 66 66 66 66 66 29 3b 0a 20 20   & 0x1fffff);.  
8250: 20 20 69 66 28 20 63 3c 30 78 30 30 30 38 30 20    if( c<0x00080 
8260: 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  ){.      *zOut++
8270: 20 3d 20 28 75 38 29 28 63 26 30 78 46 46 29 3b   = (u8)(c&0xFF);
8280: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
8290: 3c 30 78 30 30 38 30 30 20 29 7b 0a 20 20 20 20  <0x00800 ){.    
82a0: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 43 30    *zOut++ = 0xC0
82b0: 20 2b 20 28 75 38 29 28 28 63 3e 3e 36 29 26 30   + (u8)((c>>6)&0
82c0: 78 31 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75  x1F);.      *zOu
82d0: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38  t++ = 0x80 + (u8
82e0: 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20  )(c & 0x3F);.   
82f0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31   }else if( c<0x1
8300: 30 30 30 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a  0000 ){.      *z
8310: 4f 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28  Out++ = 0xE0 + (
8320: 75 38 29 28 28 63 3e 3e 31 32 29 26 30 78 30 46  u8)((c>>12)&0x0F
8330: 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  );.      *zOut++
8340: 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 28   = 0x80 + (u8)((
8350: 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 0a 20  c>>6) & 0x3F);. 
8360: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
8370: 78 38 30 20 2b 20 28 75 38 29 28 63 20 26 20 30  x80 + (u8)(c & 0
8380: 78 33 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  x3F);.    }else{
8390: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
83a0: 20 30 78 46 30 20 2b 20 28 75 38 29 28 28 63 3e   0xF0 + (u8)((c>
83b0: 3e 31 38 29 20 26 20 30 78 30 37 29 3b 0a 20 20  >18) & 0x07);.  
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 28 63 3e 3e 31 32  80 + (u8)((c>>12
83e0: 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20  ) & 0x3F);.     
83f0: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20   *zOut++ = 0x80 
8400: 2b 20 28 75 38 29 28 28 63 3e 3e 36 29 20 26 20  + (u8)((c>>6) & 
8410: 30 78 33 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f  0x3F);.      *zO
8420: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75  ut++ = 0x80 + (u
8430: 38 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20  8)(c & 0x3F);.  
8440: 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20    }             
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 20 20 73         \.  }.  s
8480: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
8490: 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 63  xt64(context, (c
84a0: 68 61 72 2a 29 7a 2c 20 7a 4f 75 74 2d 7a 2c 20  har*)z, zOut-z, 
84b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20 53 51  sqlite3_free, SQ
84c0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 7d 0a 0a 2f  LITE_UTF8);.}../
84d0: 2a 0a 2a 2a 20 54 68 65 20 68 65 78 28 29 20 66  *.** The hex() f
84e0: 75 6e 63 74 69 6f 6e 2e 20 20 49 6e 74 65 72 70  unction.  Interp
84f0: 72 65 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ret the argument
8500: 20 61 73 20 61 20 62 6c 6f 62 2e 20 20 52 65 74   as a blob.  Ret
8510: 75 72 6e 0a 2a 2a 20 61 20 68 65 78 61 64 65 63  urn.** a hexadec
8520: 69 6d 61 6c 20 72 65 6e 64 65 72 69 6e 67 20 61  imal rendering a
8530: 73 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69  s text..*/.stati
8540: 63 20 76 6f 69 64 20 68 65 78 46 75 6e 63 28 0a  c void hexFunc(.
8550: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
8560: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
8570: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
8580: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
8590: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
85a0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
85b0: 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 63 68  har *pBlob;.  ch
85c0: 61 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a 20 20  ar *zHex, *z;.  
85d0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
85e0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
85f0: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 70  METER(argc);.  p
8600: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
8610: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
8620: 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  ]);.  n = sqlite
8630: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
8640: 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[0]);.  assert
8650: 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33  ( pBlob==sqlite3
8660: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
8670: 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65  [0]) );  /* No e
8680: 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a  ncoding change *
8690: 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20 63  /.  z = zHex = c
86a0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
86b0: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2a 32  text, ((i64)n)*2
86c0: 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a 48 65   + 1);.  if( zHe
86d0: 78 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  x ){.    for(i=0
86e0: 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42 6c 6f  ; i<n; i++, pBlo
86f0: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  b++){.      unsi
8700: 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 2a 70  gned char c = *p
8710: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 2a 28 7a 2b  Blob;.      *(z+
8720: 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  +) = hexdigits[(
8730: 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20  c>>4)&0xf];.    
8740: 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69    *(z++) = hexdi
8750: 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a 20 20 20  gits[c&0xf];.   
8760: 20 7d 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20   }.    *z = 0;. 
8770: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8780: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
8790: 7a 48 65 78 2c 20 6e 2a 32 2c 20 73 71 6c 69 74  zHex, n*2, sqlit
87a0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a  e3_free);.  }.}.
87b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a 65 72 6f 62  ./*.** The zerob
87c0: 6c 6f 62 28 4e 29 20 66 75 6e 63 74 69 6f 6e 20  lob(N) function 
87d0: 72 65 74 75 72 6e 73 20 61 20 7a 65 72 6f 2d 66  returns a zero-f
87e0: 69 6c 6c 65 64 20 62 6c 6f 62 20 6f 66 20 73 69  illed blob of si
87f0: 7a 65 20 4e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  ze N bytes..*/.s
8800: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 62  tatic void zerob
8810: 6c 6f 62 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  lobFunc(.  sqlit
8820: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
8830: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
8840: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8850: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 36 34   **argv.){.  i64
8860: 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   n;.  int rc;.  
8870: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
8880: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
8890: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e  METER(argc);.  n
88a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
88b0: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
88c0: 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d  .  if( n<0 ) n =
88d0: 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
88e0: 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c  e3_result_zerobl
88f0: 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 6e 29  ob64(context, n)
8900: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 30 32 39  ; /* IMP: R-0029
8910: 33 2d 36 34 39 39 34 20 2a 2f 0a 20 20 69 66 28  3-64994 */.  if(
8920: 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
8930: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
8940: 63 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63  code(context, rc
8950: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8960: 54 68 65 20 72 65 70 6c 61 63 65 28 29 20 66 75  The replace() fu
8970: 6e 63 74 69 6f 6e 2e 20 20 54 68 72 65 65 20 61  nction.  Three a
8980: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 6c 6c  rguments are all
8990: 20 73 74 72 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a   strings: call.*
89a0: 2a 20 74 68 65 6d 20 41 2c 20 42 2c 20 61 6e 64  * them A, B, and
89b0: 20 43 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69   C. The result i
89c0: 73 20 61 6c 73 6f 20 61 20 73 74 72 69 6e 67 20  s also a string 
89d0: 77 68 69 63 68 20 69 73 20 64 65 72 69 76 65 64  which is derived
89e0: 0a 2a 2a 20 66 72 6f 6d 20 41 20 62 79 20 72 65  .** from A by re
89f0: 70 6c 61 63 69 6e 67 20 65 76 65 72 79 20 6f 63  placing every oc
8a00: 63 75 72 72 65 6e 63 65 20 6f 66 20 42 20 77 69  currence of B wi
8a10: 74 68 20 43 2e 20 20 54 68 65 20 6d 61 74 63 68  th C.  The match
8a20: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 78 61 63  .** must be exac
8a30: 74 2e 20 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65  t.  Collating se
8a40: 71 75 65 6e 63 65 73 20 61 72 65 20 6e 6f 74 20  quences are not 
8a50: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
8a60: 76 6f 69 64 20 72 65 70 6c 61 63 65 46 75 6e 63  void replaceFunc
8a70: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
8a80: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
8a90: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
8aa0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8ab0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
8ac0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72 3b  gned char *zStr;
8ad0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
8ae0: 6e 70 75 74 20 73 74 72 69 6e 67 20 41 20 2a 2f  nput string A */
8af0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
8b00: 64 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e  d char *zPattern
8b10: 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74 74  ;    /* The patt
8b20: 65 72 6e 20 73 74 72 69 6e 67 20 42 20 2a 2f 0a  ern string B */.
8b30: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
8b40: 20 63 68 61 72 20 2a 7a 52 65 70 3b 20 20 20 20   char *zRep;    
8b50: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 70 6c 61      /* The repla
8b60: 63 65 6d 65 6e 74 20 73 74 72 69 6e 67 20 43 20  cement string C 
8b70: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
8b80: 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20  ar *zOut;       
8b90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75         /* The ou
8ba0: 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tput */.  int nS
8bb0: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
8bc0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 53     /* Size of zS
8bd0: 74 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  tr */.  int nPat
8be0: 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tern;           
8bf0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 50 61 74   /* Size of zPat
8c00: 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  tern */.  int nR
8c10: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
8c20: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 52     /* Size of zR
8c30: 65 70 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 75 74  ep */.  i64 nOut
8c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8c50: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65   /* Maximum size
8c60: 20 6f 66 20 7a 4f 75 74 20 2a 2f 0a 20 20 69 6e   of zOut */.  in
8c70: 74 20 6c 6f 6f 70 4c 69 6d 69 74 3b 20 20 20 20  t loopLimit;    
8c80: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 7a         /* Last z
8c90: 53 74 72 5b 5d 20 74 68 61 74 20 6d 69 67 68 74  Str[] that might
8ca0: 20 6d 61 74 63 68 20 7a 50 61 74 74 65 72 6e 5b   match zPattern[
8cb0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ] */.  int i, j;
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
8ce0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
8cf0: 6e 74 45 78 70 61 6e 64 3b 20 20 20 20 20 20 2f  ntExpand;      /
8d00: 2a 20 4e 75 6d 62 65 72 20 7a 4f 75 74 20 65 78  * Number zOut ex
8d10: 70 61 6e 73 69 6f 6e 73 20 2a 2f 0a 20 20 73 71  pansions */.  sq
8d20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
8d30: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
8d40: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
8d50: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
8d60: 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =3 );.  UNUSED_P
8d70: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
8d80: 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33    zStr = sqlite3
8d90: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8da0: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53 74 72  [0]);.  if( zStr
8db0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8dc0: 6e 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  nStr = sqlite3_v
8dd0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
8de0: 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0]);.  assert( z
8df0: 53 74 72 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  Str==sqlite3_val
8e00: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
8e10: 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64   );  /* No encod
8e20: 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ing change */.  
8e30: 7a 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74  zPattern = sqlit
8e40: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8e50: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50  gv[1]);.  if( zP
8e60: 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20  attern==0 ){.   
8e70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8e80: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8e90: 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [1])==SQLITE_NUL
8ea0: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
8eb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8ec0: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
8ed0: 78 74 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  xt)->mallocFaile
8ee0: 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
8ef0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74 74  .  }.  if( zPatt
8f00: 65 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ern[0]==0 ){.   
8f10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8f20: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8f30: 5b 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  [1])!=SQLITE_NUL
8f40: 4c 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  L );.    sqlite3
8f50: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
8f60: 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b  ntext, argv[0]);
8f70: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8f80: 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73 71  .  nPattern = sq
8f90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8fa0: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73  s(argv[1]);.  as
8fb0: 73 65 72 74 28 20 7a 50 61 74 74 65 72 6e 3d 3d  sert( zPattern==
8fc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8fd0: 78 74 28 61 72 67 76 5b 31 5d 29 20 29 3b 20 20  xt(argv[1]) );  
8fe0: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
8ff0: 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65 70 20  hange */.  zRep 
9000: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
9010: 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20  text(argv[2]);. 
9020: 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20 72   if( zRep==0 ) r
9030: 65 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20 3d 20  eturn;.  nRep = 
9040: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
9050: 74 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  tes(argv[2]);.  
9060: 61 73 73 65 72 74 28 20 7a 52 65 70 3d 3d 73 71  assert( zRep==sq
9070: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
9080: 28 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20 20 6e  (argv[2]) );.  n
9090: 4f 75 74 20 3d 20 6e 53 74 72 20 2b 20 31 3b 0a  Out = nStr + 1;.
90a0: 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3c 53    assert( nOut<S
90b0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
90c0: 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63 6f 6e   );.  zOut = con
90d0: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
90e0: 78 74 2c 20 28 69 36 34 29 6e 4f 75 74 29 3b 0a  xt, (i64)nOut);.
90f0: 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b    if( zOut==0 ){
9100: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9110: 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e  .  loopLimit = n
9120: 53 74 72 20 2d 20 6e 50 61 74 74 65 72 6e 3b 20  Str - nPattern; 
9130: 20 0a 20 20 63 6e 74 45 78 70 61 6e 64 20 3d 20   .  cntExpand = 
9140: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
9150: 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b  i<=loopLimit; i+
9160: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 74 72  +){.    if( zStr
9170: 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30 5d  [i]!=zPattern[0]
9180: 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74 72   || memcmp(&zStr
9190: 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e  [i], zPattern, n
91a0: 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20 20 20  Pattern) ){.    
91b0: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53    zOut[j++] = zS
91c0: 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  tr[i];.    }else
91d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 70  {.      if( nRep
91e0: 3e 6e 50 61 74 74 65 72 6e 20 29 7b 0a 20 20 20  >nPattern ){.   
91f0: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 6e 52 65       nOut += nRe
9200: 70 20 2d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  p - nPattern;.  
9210: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9220: 6e 4f 75 74 2d 31 3d 3d 64 62 2d 3e 61 4c 69 6d  nOut-1==db->aLim
9230: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
9240: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20  LENGTH] );.     
9250: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 75     testcase( nOu
9260: 74 2d 32 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  t-2==db->aLimit[
9270: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
9280: 47 54 48 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  GTH] );.        
9290: 69 66 28 20 6e 4f 75 74 2d 31 3e 64 62 2d 3e 61  if( nOut-1>db->a
92a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
92b0: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
92c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
92d0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f  result_error_too
92e0: 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  big(context);.  
92f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9300: 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
9310: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9330: 63 6e 74 45 78 70 61 6e 64 2b 2b 3b 0a 20 20 20  cntExpand++;.   
9340: 20 20 20 20 20 69 66 28 20 28 63 6e 74 45 78 70       if( (cntExp
9350: 61 6e 64 26 28 63 6e 74 45 78 70 61 6e 64 2d 31  and&(cntExpand-1
9360: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
9370: 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 73     /* Grow the s
9380: 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ize of the outpu
9390: 74 20 62 75 66 66 65 72 20 6f 6e 6c 79 20 6f 6e  t buffer only on
93a0: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 0a 20   substitutions. 
93b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 6f 73           ** whos
93c0: 65 20 69 6e 64 65 78 20 69 73 20 61 20 70 6f 77  e index is a pow
93d0: 65 72 20 6f 66 20 74 77 6f 3a 20 31 2c 20 32 2c  er of two: 1, 2,
93e0: 20 34 2c 20 38 2c 20 31 36 2c 20 33 32 2c 20 2e   4, 8, 16, 32, .
93f0: 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .. */.          
9400: 75 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20  u8 *zOld;.      
9410: 20 20 20 20 7a 4f 6c 64 20 3d 20 7a 4f 75 74 3b      zOld = zOut;
9420: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 20  .          zOut 
9430: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
9440: 63 36 34 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e  c64(zOut, (int)n
9450: 4f 75 74 20 2b 20 28 6e 4f 75 74 20 2d 20 6e 53  Out + (nOut - nS
9460: 74 72 20 2d 20 31 29 29 3b 0a 20 20 20 20 20 20  tr - 1));.      
9470: 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20      if( zOut==0 
9480: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
9490: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
94a0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
94b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
94c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c  sqlite3_free(zOl
94d0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
94e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
94f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9500: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
9510: 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65  py(&zOut[j], zRe
9520: 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20  p, nRep);.      
9530: 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20  j += nRep;.     
9540: 20 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31   i += nPattern-1
9550: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
9560: 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31  sert( j+nStr-i+1
9570: 3c 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63  <=nOut );.  memc
9580: 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53  py(&zOut[j], &zS
9590: 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a  tr[i], nStr-i);.
95a0: 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b    j += nStr - i;
95b0: 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f  .  assert( j<=nO
95c0: 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20  ut );.  zOut[j] 
95d0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
95e0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
95f0: 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c  xt, (char*)zOut,
9600: 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   j, sqlite3_free
9610: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
9620: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
9630: 65 20 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28  e TRIM(), LTRIM(
9640: 29 2c 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66  ), and RTRIM() f
9650: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65  unctions..** The
9660: 20 75 73 65 72 64 61 74 61 20 69 73 20 30 78 31   userdata is 0x1
9670: 20 66 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20   for left trim, 
9680: 30 78 32 20 66 6f 72 20 72 69 67 68 74 20 74 72  0x2 for right tr
9690: 69 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68  im, 0x3 for both
96a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
96b0: 20 74 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c   trimFunc(.  sql
96c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
96d0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
96e0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
96f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
9700: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
9710: 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20  ar *zIn;        
9720: 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67   /* Input string
9730: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
9740: 67 6e 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72  gned char *zChar
9750: 53 65 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f  Set;    /* Set o
9760: 66 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20  f characters to 
9770: 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  trim */.  int nI
9780: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
9790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
97a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
97b0: 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74  n input */.  int
97c0: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
97e0: 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32  * 1: trimleft  2
97f0: 3a 20 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20  : trimright  3: 
9800: 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  trim */.  int i;
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9830: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
9840: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9850: 61 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  aLen = 0;       
9860: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
9870: 65 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69  each character i
9880: 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20  n zCharSet */.  
9890: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
98a0: 61 7a 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20  azChar = 0;     
98b0: 20 20 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20    /* Individual 
98c0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43  characters in zC
98d0: 68 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20  harSet */.  int 
98e0: 6e 43 68 61 72 3b 20 20 20 20 20 20 20 20 20 20  nChar;          
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9900: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
9910: 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65  cters in zCharSe
9920: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69  t */..  if( sqli
9930: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
9940: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
9950: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  NULL ){.    retu
9960: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20  rn;.  }.  zIn = 
9970: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
9980: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
9990: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75  f( zIn==0 ) retu
99a0: 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69  rn;.  nIn = sqli
99b0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
99c0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65  argv[0]);.  asse
99d0: 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33  rt( zIn==sqlite3
99e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
99f0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72  [0]) );.  if( ar
9a00: 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61  gc==1 ){.    sta
9a10: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
9a20: 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d  ed char lenOne[]
9a30: 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74   = { 1 };.    st
9a40: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
9a50: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f 6e 65  ar * const azOne
9a60: 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20  [] = { (u8*)" " 
9a70: 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31  };.    nChar = 1
9a80: 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38  ;.    aLen = (u8
9a90: 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a  *)lenOne;.    az
9aa0: 43 68 61 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  Char = (unsigned
9ab0: 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a   char **)azOne;.
9ac0: 20 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20 30      zCharSet = 0
9ad0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a  ;.  }else if( (z
9ae0: 43 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74 65  CharSet = sqlite
9af0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9b00: 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20 20  v[1]))==0 ){.   
9b10: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
9b20: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  {.    const unsi
9b30: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
9b40: 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74    for(z=zCharSet
9b50: 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e  , nChar=0; *z; n
9b60: 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 53  Char++){.      S
9b70: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
9b80: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
9b90: 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20  ( nChar>0 ){.   
9ba0: 20 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e 74     azChar = cont
9bb0: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
9bc0: 74 2c 20 28 28 69 36 34 29 6e 43 68 61 72 29 2a  t, ((i64)nChar)*
9bd0: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31  (sizeof(char*)+1
9be0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
9bf0: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Char==0 ){.     
9c00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
9c10: 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20   }.      aLen = 
9c20: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9c30: 26 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a  &azChar[nChar];.
9c40: 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61        for(z=zCha
9c50: 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a  rSet, nChar=0; *
9c60: 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20  z; nChar++){.   
9c70: 20 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61       azChar[nCha
9c80: 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  r] = (unsigned c
9c90: 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20 20  har *)z;.       
9ca0: 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46   SQLITE_SKIP_UTF
9cb0: 38 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c  8(z);.        aL
9cc0: 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75 38 29  en[nChar] = (u8)
9cd0: 28 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61  (z - azChar[nCha
9ce0: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r]);.      }.   
9cf0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68   }.  }.  if( nCh
9d00: 61 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c 61 67  ar>0 ){.    flag
9d10: 73 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  s = SQLITE_PTR_T
9d20: 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f 75 73  O_INT(sqlite3_us
9d30: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
9d40: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
9d50: 20 26 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68   & 1 ){.      wh
9d60: 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20  ile( nIn>0 ){.  
9d70: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
9d80: 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
9d90: 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
9da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
9db0: 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20   = aLen[i];.    
9dc0: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e        if( len<=n
9dd0: 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a 49 6e  In && memcmp(zIn
9de0: 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e  , azChar[i], len
9df0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
9e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9e10: 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62  if( i>=nChar ) b
9e20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49  reak;.        zI
9e30: 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  n += len;.      
9e40: 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20    nIn -= len;.  
9e50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9e60: 69 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b  if( flags & 2 ){
9e70: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49  .      while( nI
9e80: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  n>0 ){.        i
9e90: 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nt len = 0;.    
9ea0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9eb0: 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Char; i++){.    
9ec0: 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e        len = aLen
9ed0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
9ee0: 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d  f( len<=nIn && m
9ef0: 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c  emcmp(&zIn[nIn-l
9f00: 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65  en],azChar[i],le
9f10: 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  n)==0 ) break;. 
9f20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9f30: 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20   if( i>=nChar ) 
9f40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e  break;.        n
9f50: 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  In -= len;.     
9f60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9f70: 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20   zCharSet ){.   
9f80: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9f90: 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20  azChar);.    }. 
9fa0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
9fb0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
9fc0: 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49  , (char*)zIn, nI
9fd0: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
9fe0: 45 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ENT);.}...#ifdef
9ff0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
a000: 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
a010: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 75  ION./*.** The "u
a020: 6e 6b 6e 6f 77 6e 22 20 66 75 6e 63 74 69 6f 6e  nknown" function
a030: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
a040: 79 20 73 75 62 73 74 69 74 75 74 65 64 20 69 6e  y substituted in
a050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 6e 79   place of.** any
a060: 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 66 75   unrecognized fu
a070: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 77 68 65 6e  nction name when
a080: 20 64 6f 69 6e 67 20 61 6e 20 45 58 50 4c 41 49   doing an EXPLAI
a090: 4e 20 6f 72 20 45 58 50 4c 41 49 4e 20 51 55 45  N or EXPLAIN QUE
a0a0: 52 59 20 50 4c 41 4e 0a 2a 2a 20 77 68 65 6e 20  RY PLAN.** when 
a0b0: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
a0c0: 45 5f 55 4e 4b 4e 4f 57 4e 5f 46 55 4e 43 54 49  E_UNKNOWN_FUNCTI
a0d0: 4f 4e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ON compile-time 
a0e0: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
a0f0: 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  ** When the "sql
a100: 69 74 65 33 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69  ite3" command-li
a110: 6e 65 20 73 68 65 6c 6c 20 69 73 20 62 75 69 6c  ne shell is buil
a120: 74 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  t using this fun
a130: 63 74 69 6f 6e 61 6c 69 74 79 2c 0a 2a 2a 20 74  ctionality,.** t
a140: 68 61 74 20 61 6c 6c 6f 77 73 20 61 6e 20 45 58  hat allows an EX
a150: 50 4c 41 49 4e 20 6f 72 20 45 58 50 4c 41 49 4e  PLAIN or EXPLAIN
a160: 20 51 55 45 52 59 20 50 4c 41 4e 20 66 6f 72 20   QUERY PLAN for 
a170: 63 6f 6d 70 6c 65 78 20 71 75 65 72 69 65 73 0a  complex queries.
a180: 2a 2a 20 69 6e 76 6f 6c 76 69 6e 67 20 61 70 70  ** involving app
a190: 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  lication-defined
a1a0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
a1b0: 20 65 78 61 6d 69 6e 65 64 20 69 6e 20 61 20 67   examined in a g
a1c0: 65 6e 65 72 69 63 0a 2a 2a 20 73 71 6c 69 74 65  eneric.** sqlite
a1d0: 33 20 73 68 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  3 shell..*/.stat
a1e0: 69 63 20 76 6f 69 64 20 75 6e 6b 6e 6f 77 6e 46  ic void unknownF
a1f0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
a200: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
a210: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
a220: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
a230: 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f  rgv.){.  /* no-o
a240: 70 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  p */.}.#endif /*
a250: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
a260: 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49  KNOWN_SQL_FUNCTI
a270: 4f 4e 2a 2f 0a 0a 0a 2f 2a 20 49 4d 50 3a 20 52  ON*/.../* IMP: R
a280: 2d 32 35 33 36 31 2d 31 36 31 35 30 20 54 68 69  -25361-16150 Thi
a290: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6d  s function is om
a2a0: 69 74 74 65 64 20 66 72 6f 6d 20 53 51 4c 69 74  itted from SQLit
a2b0: 65 20 62 79 20 64 65 66 61 75 6c 74 2e 20 49 74  e by default. It
a2c0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  .** is only avai
a2d0: 6c 61 62 6c 65 20 69 66 20 74 68 65 20 53 51 4c  lable if the SQL
a2e0: 49 54 45 5f 53 4f 55 4e 44 45 58 20 63 6f 6d 70  ITE_SOUNDEX comp
a2f0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
a300: 69 73 20 75 73 65 64 0a 2a 2a 20 77 68 65 6e 20  is used.** when 
a310: 53 51 4c 69 74 65 20 69 73 20 62 75 69 6c 74 2e  SQLite is built.
a320: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
a330: 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  E_SOUNDEX./*.** 
a340: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f 75 6e  Compute the soun
a350: 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  dex encoding of 
a360: 61 20 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d  a word..**.** IM
a370: 50 3a 20 52 2d 35 39 37 38 32 2d 30 30 30 37 32  P: R-59782-00072
a380: 20 54 68 65 20 73 6f 75 6e 64 65 78 28 58 29 20   The soundex(X) 
a390: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a3a0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
a3b0: 73 20 74 68 65 0a 2a 2a 20 73 6f 75 6e 64 65 78  s the.** soundex
a3c0: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
a3d0: 20 73 74 72 69 6e 67 20 58 2e 20 0a 2a 2f 0a 73   string X. .*/.s
a3e0: 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 6e 64  tatic void sound
a3f0: 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  exFunc(.  sqlite
a400: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
a410: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
a420: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a430: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72  **argv.){.  char
a440: 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20 63   zResult[8];.  c
a450: 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20 20  onst u8 *zIn;.  
a460: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74  int i, j;.  stat
a470: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
a480: 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d 20 3d  d char iCode[] =
a490: 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20   {.    0, 0, 0, 
a4a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 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 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
a4d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 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 0a 20 20 20 20 30  , 0, 0, 0,.    0
a500: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a510: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a520: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
a530: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a540: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a550: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a560: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20  0,.    0, 0, 1, 
a570: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30  2, 3, 0, 1, 2, 0
a580: 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c  , 0, 2, 2, 4, 5,
a590: 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c   5, 0,.    1, 2,
a5a0: 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   6, 2, 3, 0, 1, 
a5b0: 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30  0, 2, 0, 2, 0, 0
a5c0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
a5d0: 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c  , 0, 1, 2, 3, 0,
a5e0: 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20   1, 2, 0, 0, 2, 
a5f0: 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20  2, 4, 5, 5, 0,. 
a600: 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33     1, 2, 6, 2, 3
a610: 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 1, 0, 2, 0,
a620: 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   2, 0, 0, 0, 0, 
a630: 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74  0,.  };.  assert
a640: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a  ( argc==1 );.  z
a650: 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  In = (u8*)sqlite
a660: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
a670: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e  v[0]);.  if( zIn
a680: 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75 38 2a  ==0 ) zIn = (u8*
a690: 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  )"";.  for(i=0; 
a6a0: 7a 49 6e 5b 69 5d 20 26 26 20 21 73 71 6c 69 74  zIn[i] && !sqlit
a6b0: 65 33 49 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d  e3Isalpha(zIn[i]
a6c0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  ); i++){}.  if( 
a6d0: 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75 38  zIn[i] ){.    u8
a6e0: 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43 6f 64   prevcode = iCod
a6f0: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
a700: 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20 3d      zResult[0] =
a710: 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28   sqlite3Toupper(
a720: 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f 72  zIn[i]);.    for
a730: 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49 6e  (j=1; j<4 && zIn
a740: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
a750: 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f 64   int code = iCod
a760: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
a770: 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 3e 30        if( code>0
a780: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a790: 63 6f 64 65 21 3d 70 72 65 76 63 6f 64 65 20 29  code!=prevcode )
a7a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  {.          prev
a7b0: 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20 20  code = code;.   
a7c0: 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a         zResult[j
a7d0: 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30 27  ++] = code + '0'
a7e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a7f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a800: 20 70 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a 20   prevcode = 0;. 
a810: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a820: 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a 20   while( j<4 ){. 
a830: 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b       zResult[j++
a840: 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a 20  ] = '0';.    }. 
a850: 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d 20     zResult[j] = 
a860: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
a870: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
a880: 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c 20  xt, zResult, 4, 
a890: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
a8a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a8b0: 2f 2a 20 49 4d 50 3a 20 52 2d 36 34 38 39 34 2d  /* IMP: R-64894-
a8c0: 35 30 33 32 31 20 54 68 65 20 73 74 72 69 6e 67  50321 The string
a8d0: 20 22 3f 30 30 30 22 20 69 73 20 72 65 74 75 72   "?000" is retur
a8e0: 6e 65 64 20 69 66 20 74 68 65 20 61 72 67 75 6d  ned if the argum
a8f0: 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 4e 55  ent.    ** is NU
a900: 4c 4c 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e  LL or contains n
a910: 6f 20 41 53 43 49 49 20 61 6c 70 68 61 62 65 74  o ASCII alphabet
a920: 69 63 20 63 68 61 72 61 63 74 65 72 73 2e 20 2a  ic characters. *
a930: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  /.    sqlite3_re
a940: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
a950: 74 2c 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51  t, "?000", 4, SQ
a960: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
a970: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
a980: 4c 49 54 45 5f 53 4f 55 4e 44 45 58 20 2a 2f 0a  LITE_SOUNDEX */.
a990: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a9a0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
a9b0: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63  ION./*.** A func
a9c0: 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 73 20  tion that loads 
a9d0: 61 20 73 68 61 72 65 64 2d 6c 69 62 72 61 72 79  a shared-library
a9e0: 20 65 78 74 65 6e 73 69 6f 6e 20 74 68 65 6e 20   extension then 
a9f0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f  returns NULL..*/
aa00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61  .static void loa
aa10: 64 45 78 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e  dExt(sqlite3_con
aa20: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
aa30: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
aa40: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
aa50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
aa60: 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
aa70: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
aa80: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
aa90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
aaa0: 50 72 6f 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  Proc;.  sqlite3 
aab0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
aac0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
aad0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72  context);.  char
aae0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
aaf0: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74 68    /* Disallow th
ab00: 65 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e load_extension
ab10: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
ab20: 75 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 49 54  unless the SQLIT
ab30: 45 5f 4c 6f 61 64 45 78 74 46 75 6e 63 0a 20 20  E_LoadExtFunc.  
ab40: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ** flag is set. 
ab50: 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33   See the sqlite3
ab60: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
ab70: 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20  ension() API..  
ab80: 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  */.  if( (db->fl
ab90: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 6f 61  ags & SQLITE_Loa
aba0: 64 45 78 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a  dExtFunc)==0 ){.
abb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
abc0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
abd0: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
abe0: 64 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  d", -1);.    ret
abf0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
ac00: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  argc==2 ){.    z
ac10: 50 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68  Proc = (const ch
ac20: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
ac30: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
ac40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
ac50: 50 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Proc = 0;.  }.  
ac60: 69 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c  if( zFile && sql
ac70: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
ac80: 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  ion(db, zFile, z
ac90: 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20  Proc, &zErrMsg) 
aca0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
acb0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
acc0: 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31  ext, zErrMsg, -1
acd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ace0: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
acf0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
ad00: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
ad10: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
ad20: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
ad30: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61  the context of a
ad40: 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67  .** sum() or avg
ad50: 28 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d  () aggregate com
ad60: 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  putation..*/.typ
ad70: 65 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43  edef struct SumC
ad80: 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63  tx SumCtx;.struc
ad90: 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75  t SumCtx {.  dou
ada0: 62 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f  ble rSum;      /
adb0: 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * Floating point
adc0: 20 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53   sum */.  i64 iS
add0: 75 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  um;         /* I
ade0: 6e 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20  nteger sum */   
adf0: 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20  .  i64 cnt;     
ae00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ae10: 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65  f elements summe
ae20: 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c  d */.  u8 overfl
ae30: 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ow;      /* True
ae40: 20 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72   if integer over
ae50: 66 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75  flow seen */.  u
ae60: 38 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20  8 approx;       
ae70: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d   /* True if non-
ae80: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 61  integer value wa
ae90: 73 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73  s input to the s
aea0: 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  um */.};../*.** 
aeb0: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f  Routines used to
aec0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d   compute the sum
aed0: 2c 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74  , average, and t
aee0: 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  otal..**.** The 
aef0: 53 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  SUM() function f
af00: 6f 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b  ollows the (brok
af10: 65 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64  en) SQL standard
af20: 20 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20   which means.** 
af30: 74 68 61 74 20 69 74 20 72 65 74 75 72 6e 73 20  that it returns 
af40: 4e 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20  NULL if it sums 
af50: 6f 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20  over no inputs. 
af60: 20 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a   TOTAL returns.*
af70: 2a 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61  * 0.0 in that ca
af80: 73 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  se.  In addition
af90: 2c 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72  , TOTAL always r
afa0: 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77  eturns a float w
afb0: 68 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68  here.** SUM migh
afc0: 74 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  t return an inte
afd0: 67 65 72 20 69 66 20 69 74 20 6e 65 76 65 72 20  ger if it never 
afe0: 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f  encounters a flo
aff0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
b000: 61 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76  alue.  TOTAL nev
b010: 65 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55  er fails, but SU
b020: 4d 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20  M might through 
b030: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a  an exception if.
b040: 2a 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20  ** it overflows 
b050: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  an integer..*/.s
b060: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74  tatic void sumSt
b070: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
b080: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
b090: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
b0a0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
b0b0: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74  SumCtx *p;.  int
b0c0: 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28   type;.  assert(
b0d0: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
b0e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
b0f0: 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  rgc);.  p = sqli
b100: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
b110: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
b120: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79  izeof(*p));.  ty
b130: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
b140: 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
b150: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
b160: 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54  p && type!=SQLIT
b170: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d  E_NULL ){.    p-
b180: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20  >cnt++;.    if( 
b190: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  type==SQLITE_INT
b1a0: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36  EGER ){.      i6
b1b0: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
b1c0: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
b1d0: 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  ]);.      p->rSu
b1e0: 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66  m += v;.      if
b1f0: 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e  ( (p->approx|p->
b200: 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20  overflow)==0 && 
b210: 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28  sqlite3AddInt64(
b220: 26 70 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b 0a  &p->iSum, v) ){.
b230: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 70 72 6f          p->appro
b240: 78 20 3d 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20  x = p->overflow 
b250: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
b260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
b270: 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33  >rSum += sqlite3
b280: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
b290: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d  gv[0]);.      p-
b2a0: 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20  >approx = 1;.   
b2b0: 20 7d 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64 65 66   }.  }.}.#ifndef
b2c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
b2d0: 44 4f 57 46 55 4e 43 0a 73 74 61 74 69 63 20 76  DOWFUNC.static v
b2e0: 6f 69 64 20 73 75 6d 49 6e 76 65 72 73 65 28 73  oid sumInverse(s
b2f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
b300: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
b310: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
b320: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43 74  **argv){.  SumCt
b330: 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70 65  x *p;.  int type
b340: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
b350: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
b360: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
b370: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
b380: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
b390: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
b3a0: 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  (*p));.  type = 
b3b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75  sqlite3_value_nu
b3c0: 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76 5b  meric_type(argv[
b3d0: 30 5d 29 3b 0a 20 20 2f 2a 20 70 20 69 73 20 61  0]);.  /* p is a
b3e0: 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
b3f0: 65 63 61 75 73 65 20 73 75 6d 53 74 65 70 28 29  ecause sumStep()
b400: 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
b410: 63 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 20 2a  called first.  *
b420: 2a 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  * to initialize 
b430: 69 74 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  it */.  if( ALWA
b440: 59 53 28 70 29 20 26 26 20 74 79 70 65 21 3d 53  YS(p) && type!=S
b450: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
b460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 63 6e 74    assert( p->cnt
b470: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 63 6e 74  >0 );.    p->cnt
b480: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
b490: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  type==SQLITE_INT
b4a0: 45 47 45 52 20 7c 7c 20 70 2d 3e 61 70 70 72 6f  EGER || p->appro
b4b0: 78 20 29 3b 0a 20 20 20 20 69 66 28 20 74 79 70  x );.    if( typ
b4c0: 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  e==SQLITE_INTEGE
b4d0: 52 20 26 26 20 70 2d 3e 61 70 70 72 6f 78 3d 3d  R && p->approx==
b4e0: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76  0 ){.      i64 v
b4f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
b500: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
b510: 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2d  .      p->rSum -
b520: 3d 20 76 3b 0a 20 20 20 20 20 20 70 2d 3e 69 53  = v;.      p->iS
b530: 75 6d 20 2d 3d 20 76 3b 0a 20 20 20 20 7d 65 6c  um -= v;.    }el
b540: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  se{.      p->rSu
b550: 6d 20 2d 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  m -= sqlite3_val
b560: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
b570: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ]);.    }.  }.}.
b580: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
b590: 75 6d 49 6e 76 65 72 73 65 20 30 0a 23 65 6e 64  umInverse 0.#end
b5a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b5b0: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
b5c0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46  static void sumF
b5d0: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
b5e0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
b5f0: 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a  ){.  SumCtx *p;.
b600: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
b610: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
b620: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
b630: 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30  f( p && p->cnt>0
b640: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   ){.    if( p->o
b650: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
b660: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b670: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69  error(context,"i
b680: 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 22  nteger overflow"
b690: 2c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ,-1);.    }else 
b6a0: 69 66 28 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b  if( p->approx ){
b6b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
b6c0: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
b6d0: 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a  text, p->rSum);.
b6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b6f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b700: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70  int64(context, p
b710: 2d 3e 69 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20  ->iSum);.    }. 
b720: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
b730: 20 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c   avgFinalize(sql
b740: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
b750: 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78  ntext){.  SumCtx
b760: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
b770: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
b780: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
b790: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
b7a0: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  cnt>0 ){.    sql
b7b0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
b7c0: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72  le(context, p->r
b7d0: 53 75 6d 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63  Sum/(double)p->c
b7e0: 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nt);.  }.}.stati
b7f0: 63 20 76 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61  c void totalFina
b800: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
b810: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
b820: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
b830: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
b840: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
b850: 74 65 78 74 2c 20 30 29 3b 0a 20 20 2f 2a 20 28  text, 0);.  /* (
b860: 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65  double)0 In case
b870: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
b880: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
b890: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  . */.  sqlite3_r
b8a0: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
b8b0: 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75  text, p ? p->rSu
b8c0: 6d 20 3a 20 28 64 6f 75 62 6c 65 29 30 29 3b 0a  m : (double)0);.
b8d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
b8e0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
b8f0: 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20   keeps track of 
b900: 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  state informatio
b910: 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75  n for the.** cou
b920: 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66  nt() aggregate f
b930: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  unction..*/.type
b940: 64 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74  def struct Count
b950: 43 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74  Ctx CountCtx;.st
b960: 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a  ruct CountCtx {.
b970: 20 20 69 36 34 20 6e 3b 0a 23 69 66 64 65 66 20    i64 n;.#ifdef 
b980: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
b990: 6e 74 20 62 49 6e 76 65 72 73 65 3b 20 20 20 20  nt bInverse;    
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b9b0: 2a 20 54 72 75 65 20 69 66 20 78 49 6e 76 65 72  * True if xInver
b9c0: 73 65 28 29 20 65 76 65 72 20 63 61 6c 6c 65 64  se() ever called
b9d0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
b9e0: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
b9f0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
ba00: 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65  ount() aggregate
ba10: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
ba20: 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53  atic void countS
ba30: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
ba40: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
ba50: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
ba60: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
ba70: 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20   CountCtx *p;.  
ba80: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
ba90: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
baa0: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
bab0: 29 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d  ));.  if( (argc=
bac0: 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c  =0 || SQLITE_NUL
bad0: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
bae0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29 20  _type(argv[0])) 
baf0: 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  && p ){.    p->n
bb00: 2b 2b 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ++;.  }..#ifndef
bb10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
bb20: 52 45 43 41 54 45 44 0a 20 20 2f 2a 20 54 68 65  RECATED.  /* The
bb30: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
bb40: 74 65 5f 63 6f 75 6e 74 28 29 20 66 75 6e 63 74  te_count() funct
bb50: 69 6f 6e 20 69 73 20 64 65 70 72 65 63 61 74 65  ion is deprecate
bb60: 64 2e 20 20 42 75 74 20 6a 75 73 74 20 74 6f 20  d.  But just to 
bb70: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 69  make.  ** sure i
bb80: 74 20 73 74 69 6c 6c 20 6f 70 65 72 61 74 65 73  t still operates
bb90: 20 63 6f 72 72 65 63 74 6c 79 2c 20 76 65 72 69   correctly, veri
bba0: 66 79 20 74 68 61 74 20 69 74 73 20 63 6f 75 6e  fy that its coun
bbb0: 74 20 61 67 72 65 65 73 20 77 69 74 68 20 6f 75  t agrees with ou
bbc0: 72 20 0a 20 20 2a 2a 20 69 6e 74 65 72 6e 61 6c  r .  ** internal
bbd0: 20 63 6f 75 6e 74 20 77 68 65 6e 20 75 73 69 6e   count when usin
bbe0: 67 20 63 6f 75 6e 74 28 2a 29 20 61 6e 64 20 77  g count(*) and w
bbf0: 68 65 6e 20 74 68 65 20 74 6f 74 61 6c 20 63 6f  hen the total co
bc00: 75 6e 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  unt can be.  ** 
bc10: 65 78 70 72 65 73 73 65 64 20 61 73 20 61 20 33  expressed as a 3
bc20: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 2a  2-bit integer. *
bc30: 2f 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  /.  assert( argc
bc40: 3d 3d 31 20 7c 7c 20 70 3d 3d 30 20 7c 7c 20 70  ==1 || p==0 || p
bc50: 2d 3e 6e 3e 30 78 37 66 66 66 66 66 66 66 20 7c  ->n>0x7fffffff |
bc60: 7c 20 70 2d 3e 62 49 6e 76 65 72 73 65 0a 20 20  | p->bInverse.  
bc70: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6e 3d          || p->n=
bc80: 3d 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  =sqlite3_aggrega
bc90: 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74  te_count(context
bca0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 20 20 20  ) );.#endif.}   
bcb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
bcc0: 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  ntFinalize(sqlit
bcd0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
bce0: 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78  ext){.  CountCtx
bcf0: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
bd00: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
bd10: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
bd20: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
bd30: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
bd40: 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b  , p ? p->n : 0);
bd50: 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .}.#ifndef SQLIT
bd60: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
bd70: 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  C.static void co
bd80: 75 6e 74 49 6e 76 65 72 73 65 28 73 71 6c 69 74  untInverse(sqlit
bd90: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
bda0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
bdb0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
bdc0: 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b  {.  CountCtx *p;
bdd0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
bde0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
bdf0: 28 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  (ctx, sizeof(*p)
be00: 29 3b 0a 20 20 2f 2a 20 70 20 69 73 20 61 6c 77  );.  /* p is alw
be10: 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 73 69 6e  ays non-NULL sin
be20: 63 65 20 63 6f 75 6e 74 53 74 65 70 28 29 20 77  ce countStep() w
be30: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61  ill have been ca
be40: 6c 6c 65 64 20 66 69 72 73 74 20 2a 2f 0a 20 20  lled first */.  
be50: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
be60: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
be70: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
be80: 61 72 67 76 5b 30 5d 29 29 20 26 26 20 41 4c 57  argv[0])) && ALW
be90: 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70 2d  AYS(p) ){.    p-
bea0: 3e 6e 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c  >n--;.#ifdef SQL
beb0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d  ITE_DEBUG.    p-
bec0: 3e 62 49 6e 76 65 72 73 65 20 3d 20 31 3b 0a 23  >bInverse = 1;.#
bed0: 65 6e 64 69 66 0a 20 20 7d 0a 7d 20 20 20 0a 23  endif.  }.}   .#
bee0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6f  else.# define co
bef0: 75 6e 74 49 6e 76 65 72 73 65 20 30 0a 23 65 6e  untInverse 0.#en
bf00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
bf10: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
bf20: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
bf30: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69   to implement mi
bf40: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67  n() and max() ag
bf50: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
bf60: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
bf70: 64 20 6d 69 6e 6d 61 78 53 74 65 70 28 0a 20 20  d minmaxStep(.  
bf80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
bf90: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
bfa0: 20 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c   NotUsed, .  sql
bfb0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
bfc0: 76 0a 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67  v.){.  Mem *pArg
bfd0: 20 20 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b    = (Mem *)argv[
bfe0: 30 5d 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74  0];.  Mem *pBest
bff0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
c000: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a  ETER(NotUsed);..
c010: 20 20 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a    pBest = (Mem *
c020: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
c030: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
c040: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73  xt, sizeof(*pBes
c050: 74 29 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73  t));.  if( !pBes
c060: 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  t ) return;..  i
c070: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
c080: 5f 74 79 70 65 28 70 41 72 67 29 3d 3d 53 51 4c  _type(pArg)==SQL
c090: 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
c0a0: 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73  if( pBest->flags
c0b0: 20 29 20 73 71 6c 69 74 65 33 53 6b 69 70 41 63   ) sqlite3SkipAc
c0c0: 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f  cumulatorLoad(co
c0d0: 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 20  ntext);.  }else 
c0e0: 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73  if( pBest->flags
c0f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b   ){.    int max;
c100: 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20  .    int cmp;.  
c110: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
c120: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e   = sqlite3GetFun
c130: 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74  cCollSeq(context
c140: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73  );.    /* This s
c150: 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  tep function is 
c160: 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
c170: 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28  e min() and max(
c180: 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20 20  ) aggregates,.  
c190: 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69    ** the only di
c1a0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
c1b0: 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20 74   the two being t
c1c0: 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f 66  hat the sense of
c1d0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70   the.    ** comp
c1e0: 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72 74  arison is invert
c1f0: 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78 28  ed. For the max(
c200: 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65  ) aggregate, the
c210: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
c220: 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e 63  user_data() func
c230: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76 6f  tion returns (vo
c240: 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e  id *)-1. For min
c250: 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 74  () it.    ** ret
c260: 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62 2c  urns (void *)db,
c270: 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68 65   where db is the
c280: 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61   sqlite3* databa
c290: 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20  se pointer..    
c2a0: 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68 65  ** Therefore the
c2b0: 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
c2c0: 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27 6d  sets variable 'm
c2d0: 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68 65  ax' to 1 for the
c2e0: 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61 67   max().    ** ag
c2f0: 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66 6f  gregate, or 0 fo
c300: 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  r min()..    */.
c310: 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74 65      max = sqlite
c320: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
c330: 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70  ext)!=0;.    cmp
c340: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
c350: 70 61 72 65 28 70 42 65 73 74 2c 20 70 41 72 67  pare(pBest, pArg
c360: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66  , pColl);.    if
c370: 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30 29  ( (max && cmp<0)
c380: 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d 70   || (!max && cmp
c390: 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >0) ){.      sql
c3a0: 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
c3b0: 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20  pBest, pArg);.  
c3c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
c3d0: 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d 75  qlite3SkipAccumu
c3e0: 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78  latorLoad(contex
c3f0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
c400: 65 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 64 62  e{.    pBest->db
c410: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
c420: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
c430: 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  text);.    sqlit
c440: 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42  e3VdbeMemCopy(pB
c450: 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a  est, pArg);.  }.
c460: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69  }.static void mi
c470: 6e 4d 61 78 56 61 6c 75 65 46 69 6e 61 6c 69 7a  nMaxValueFinaliz
c480: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
c490: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
c4a0: 62 56 61 6c 75 65 29 7b 0a 20 20 73 71 6c 69 74  bValue){.  sqlit
c4b0: 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a  e3_value *pRes;.
c4c0: 20 20 70 52 65 73 20 3d 20 28 73 71 6c 69 74 65    pRes = (sqlite
c4d0: 33 5f 76 61 6c 75 65 20 2a 29 73 71 6c 69 74 65  3_value *)sqlite
c4e0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
c4f0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
c500: 0a 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20  .  if( pRes ){. 
c510: 20 20 20 69 66 28 20 70 52 65 73 2d 3e 66 6c 61     if( pRes->fla
c520: 67 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  gs ){.      sqli
c530: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
c540: 28 63 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b  (context, pRes);
c550: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
c560: 56 61 6c 75 65 3d 3d 30 20 29 20 73 71 6c 69 74  Value==0 ) sqlit
c570: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
c580: 28 70 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 23 69  (pRes);.  }.}.#i
c590: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c5a0: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 73 74 61  T_WINDOWFUNC.sta
c5b0: 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 56  tic void minMaxV
c5c0: 61 6c 75 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  alue(sqlite3_con
c5d0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
c5e0: 20 20 6d 69 6e 4d 61 78 56 61 6c 75 65 46 69 6e    minMaxValueFin
c5f0: 61 6c 69 7a 65 28 63 6f 6e 74 65 78 74 2c 20 31  alize(context, 1
c600: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
c610: 69 6e 65 20 6d 69 6e 4d 61 78 56 61 6c 75 65 20  ine minMaxValue 
c620: 30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  0.#endif /* SQLI
c630: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
c640: 4e 43 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  NC */.static voi
c650: 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65  d minMaxFinalize
c660: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c670: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 6d 69   *context){.  mi
c680: 6e 4d 61 78 56 61 6c 75 65 46 69 6e 61 6c 69 7a  nMaxValueFinaliz
c690: 65 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 7d  e(context, 0);.}
c6a0: 0a 0a 2f 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63 6f  ../*.** group_co
c6b0: 6e 63 61 74 28 45 58 50 52 2c 20 3f 53 45 50 41  ncat(EXPR, ?SEPA
c6c0: 52 41 54 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74 69  RATOR?).*/.stati
c6d0: 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63  c void groupConc
c6e0: 61 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  atStep(.  sqlite
c6f0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
c700: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
c710: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
c720: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
c730: 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20  t char *zVal;.  
c740: 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d  StrAccum *pAccum
c750: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
c760: 7a 53 65 70 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  zSep;.  int nVal
c770: 2c 20 6e 53 65 70 3b 0a 20 20 61 73 73 65 72 74  , nSep;.  assert
c780: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67  ( argc==1 || arg
c790: 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 73 71  c==2 );.  if( sq
c7a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c7b0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
c7c0: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
c7d0: 0a 20 20 70 41 63 63 75 6d 20 3d 20 28 53 74 72  .  pAccum = (Str
c7e0: 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61  Accum*)sqlite3_a
c7f0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
c800: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
c810: 28 2a 70 41 63 63 75 6d 29 29 3b 0a 0a 20 20 69  (*pAccum));..  i
c820: 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20  f( pAccum ){.   
c830: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
c840: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
c850: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
c860: 29 3b 0a 20 20 20 20 69 6e 74 20 66 69 72 73 74  );.    int first
c870: 54 65 72 6d 20 3d 20 70 41 63 63 75 6d 2d 3e 6d  Term = pAccum->m
c880: 78 41 6c 6c 6f 63 3d 3d 30 3b 0a 20 20 20 20 70  xAlloc==0;.    p
c890: 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d  Accum->mxAlloc =
c8a0: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
c8b0: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
c8c0: 3b 0a 20 20 20 20 69 66 28 20 21 66 69 72 73 74  ;.    if( !first
c8d0: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66  Term ){.      if
c8e0: 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20  ( argc==2 ){.   
c8f0: 20 20 20 20 20 7a 53 65 70 20 3d 20 28 63 68 61       zSep = (cha
c900: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
c910: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
c920: 20 20 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73          nSep = s
c930: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
c940: 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  es(argv[1]);.   
c950: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c960: 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20    zSep = ",";.  
c970: 20 20 20 20 20 20 6e 53 65 70 20 3d 20 31 3b 0a        nSep = 1;.
c980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c990: 28 20 7a 53 65 70 20 29 20 73 71 6c 69 74 65 33  ( zSep ) sqlite3
c9a0: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 41 63 63  _str_append(pAcc
c9b0: 75 6d 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b  um, zSep, nSep);
c9c0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20  .    }.    zVal 
c9d0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
c9e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
c9f0: 5b 30 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d  [0]);.    nVal =
ca00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
ca10: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
ca20: 20 20 20 69 66 28 20 7a 56 61 6c 20 29 20 73 71     if( zVal ) sq
ca30: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
ca40: 28 70 41 63 63 75 6d 2c 20 7a 56 61 6c 2c 20 6e  (pAccum, zVal, n
ca50: 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 23 69 66 6e  Val);.  }.}.#ifn
ca60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ca70: 57 49 4e 44 4f 57 46 55 4e 43 0a 73 74 61 74 69  WINDOWFUNC.stati
ca80: 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63  c void groupConc
ca90: 61 74 49 6e 76 65 72 73 65 28 0a 20 20 73 71 6c  atInverse(.  sql
caa0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
cab0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
cac0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
cad0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
cae0: 6e 74 20 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  nt n;.  StrAccum
caf0: 20 2a 70 41 63 63 75 6d 3b 0a 20 20 61 73 73 65   *pAccum;.  asse
cb00: 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61  rt( argc==1 || a
cb10: 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20  rgc==2 );.  if( 
cb20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
cb30: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
cb40: 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72  ITE_NULL ) retur
cb50: 6e 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20 28 53  n;.  pAccum = (S
cb60: 74 72 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33  trAccum*)sqlite3
cb70: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
cb80: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
cb90: 6f 66 28 2a 70 41 63 63 75 6d 29 29 3b 0a 20 20  of(*pAccum));.  
cba0: 2f 2a 20 70 41 63 63 75 6d 20 69 73 20 61 6c 77  /* pAccum is alw
cbb0: 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 73 69 6e  ays non-NULL sin
cbc0: 63 65 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74  ce groupConcatSt
cbd0: 65 70 28 29 20 77 69 6c 6c 20 68 61 76 65 20 61  ep() will have a
cbe0: 6c 77 61 79 73 0a 20 20 2a 2a 20 72 75 6e 20 66  lways.  ** run f
cbf0: 72 69 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  rist to initiali
cc00: 7a 65 20 69 74 20 2a 2f 0a 20 20 69 66 28 20 41  ze it */.  if( A
cc10: 4c 57 41 59 53 28 70 41 63 63 75 6d 29 20 29 7b  LWAYS(pAccum) ){
cc20: 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
cc30: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
cc40: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 61  v[0]);.    if( a
cc50: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  rgc==2 ){.      
cc60: 6e 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  n += sqlite3_val
cc70: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d  ue_bytes(argv[1]
cc80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
cc90: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
cca0: 20 20 20 69 66 28 20 6e 3e 3d 28 69 6e 74 29 70     if( n>=(int)p
ccb0: 41 63 63 75 6d 2d 3e 6e 43 68 61 72 20 29 7b 0a  Accum->nChar ){.
ccc0: 20 20 20 20 20 20 70 41 63 63 75 6d 2d 3e 6e 43        pAccum->nC
ccd0: 68 61 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  har = 0;.    }el
cce0: 73 65 7b 0a 20 20 20 20 20 20 70 41 63 63 75 6d  se{.      pAccum
ccf0: 2d 3e 6e 43 68 61 72 20 2d 3d 20 6e 3b 0a 20 20  ->nChar -= n;.  
cd00: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 41 63 63      memmove(pAcc
cd10: 75 6d 2d 3e 7a 54 65 78 74 2c 20 26 70 41 63 63  um->zText, &pAcc
cd20: 75 6d 2d 3e 7a 54 65 78 74 5b 6e 5d 2c 20 70 41  um->zText[n], pA
cd30: 63 63 75 6d 2d 3e 6e 43 68 61 72 29 3b 0a 20 20  ccum->nChar);.  
cd40: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 41 63 63    }.    if( pAcc
cd50: 75 6d 2d 3e 6e 43 68 61 72 3d 3d 30 20 29 20 70  um->nChar==0 ) p
cd60: 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d  Accum->mxAlloc =
cd70: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   0;.  }.}.#else.
cd80: 23 20 64 65 66 69 6e 65 20 67 72 6f 75 70 43 6f  # define groupCo
cd90: 6e 63 61 74 49 6e 76 65 72 73 65 20 30 0a 23 65  ncatInverse 0.#e
cda0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
cdb0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
cdc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72  /.static void gr
cdd0: 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a  oupConcatFinaliz
cde0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
cdf0: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
ce00: 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b  trAccum *pAccum;
ce10: 0a 20 20 70 41 63 63 75 6d 20 3d 20 73 71 6c 69  .  pAccum = sqli
ce20: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
ce30: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
ce40: 29 3b 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20  );.  if( pAccum 
ce50: 29 7b 0a 20 20 20 20 69 66 28 20 70 41 63 63 75  ){.    if( pAccu
ce60: 6d 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53 51 4c  m->accError==SQL
ce70: 49 54 45 5f 54 4f 4f 42 49 47 20 29 7b 0a 20 20  ITE_TOOBIG ){.  
ce80: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
ce90: 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28  lt_error_toobig(
cea0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65  context);.    }e
ceb0: 6c 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d 3e  lse if( pAccum->
cec0: 61 63 63 45 72 72 6f 72 3d 3d 53 51 4c 49 54 45  accError==SQLITE
ced0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
cee0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
cef0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
cf00: 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  xt);.    }else{ 
cf10: 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65     .      sqlite
cf20: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
cf30: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53 74  ntext, sqlite3St
cf40: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 70 41 63  rAccumFinish(pAc
cf50: 63 75 6d 29 2c 20 2d 31 2c 20 0a 20 20 20 20 20  cum), -1, .     
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
cf80: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
cf90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cfa0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 73  MIT_WINDOWFUNC.s
cfb0: 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75 70  tatic void group
cfc0: 43 6f 6e 63 61 74 56 61 6c 75 65 28 73 71 6c 69  ConcatValue(sqli
cfd0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
cfe0: 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  text){.  sqlite3
cff0: 5f 73 74 72 20 2a 70 41 63 63 75 6d 3b 0a 20 20  _str *pAccum;.  
d000: 70 41 63 63 75 6d 20 3d 20 28 73 71 6c 69 74 65  pAccum = (sqlite
d010: 33 5f 73 74 72 2a 29 73 71 6c 69 74 65 33 5f 61  3_str*)sqlite3_a
d020: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
d030: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
d040: 69 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20  if( pAccum ){.  
d050: 20 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61 63    if( pAccum->ac
d060: 63 45 72 72 6f 72 3d 3d 53 51 4c 49 54 45 5f 54  cError==SQLITE_T
d070: 4f 4f 42 49 47 20 29 7b 0a 20 20 20 20 20 20 73  OOBIG ){.      s
d080: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
d090: 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65  ror_toobig(conte
d0a0: 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  xt);.    }else i
d0b0: 66 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72  f( pAccum->accEr
d0c0: 72 6f 72 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  ror==SQLITE_NOME
d0d0: 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M ){.      sqlit
d0e0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
d0f0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
d100: 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20      }else{    . 
d110: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d120: 2a 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33  *zText = sqlite3
d130: 5f 73 74 72 5f 76 61 6c 75 65 28 70 41 63 63 75  _str_value(pAccu
d140: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
d150: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
d160: 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31  ntext, zText, -1
d170: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d180: 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  NT);.    }.  }.}
d190: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
d1a0: 67 72 6f 75 70 43 6f 6e 63 61 74 56 61 6c 75 65  groupConcatValue
d1b0: 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   0.#endif /* SQL
d1c0: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
d1d0: 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  UNC */../*.** Th
d1e0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
d1f0: 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  per-connection f
d200: 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 72 61  unction registra
d210: 74 69 6f 6e 2e 20 20 4d 6f 73 74 0a 2a 2a 20 6f  tion.  Most.** o
d220: 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66  f the built-in f
d230: 75 6e 63 74 69 6f 6e 73 20 61 62 6f 76 65 20 61  unctions above a
d240: 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 67  re part of the g
d250: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73  lobal function s
d260: 65 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  et..** This rout
d270: 69 6e 65 20 6f 6e 6c 79 20 64 65 61 6c 73 20 77  ine only deals w
d280: 69 74 68 20 74 68 6f 73 65 20 74 68 61 74 20 61  ith those that a
d290: 72 65 20 6e 6f 74 20 67 6c 6f 62 61 6c 2e 0a 2a  re not global..*
d2a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
d2b0: 67 69 73 74 65 72 50 65 72 43 6f 6e 6e 65 63 74  gisterPerConnect
d2c0: 69 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  ionBuiltinFuncti
d2d0: 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ons(sqlite3 *db)
d2e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
d2f0: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
d300: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 4d 41 54 43  nction(db, "MATC
d310: 48 22 2c 20 32 29 3b 0a 20 20 61 73 73 65 72 74  H", 2);.  assert
d320: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
d330: 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  EM || rc==SQLITE
d340: 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  _OK );.  if( rc=
d350: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
d360: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
d370: 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 7d 0a  ault(db);.  }.}.
d380: 0a 2f 2a 0a 2a 2a 20 52 65 2d 72 65 67 69 73 74  ./*.** Re-regist
d390: 65 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  er the built-in 
d3a0: 4c 49 4b 45 20 66 75 6e 63 74 69 6f 6e 73 2e 20  LIKE functions. 
d3b0: 20 54 68 65 20 63 61 73 65 53 65 6e 73 69 74 69   The caseSensiti
d3c0: 76 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ve.** parameter 
d3d0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
d3e0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49  er or not the LI
d3f0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63  KE operator is c
d400: 61 73 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65  ase.** sensitive
d410: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d420: 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e  3RegisterLikeFun
d430: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
d440: 64 62 2c 20 69 6e 74 20 63 61 73 65 53 65 6e 73  db, int caseSens
d450: 69 74 69 76 65 29 7b 0a 20 20 73 74 72 75 63 74  itive){.  struct
d460: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49   compareInfo *pI
d470: 6e 66 6f 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  nfo;.  int flags
d480: 3b 0a 20 20 69 66 28 20 63 61 73 65 53 65 6e 73  ;.  if( caseSens
d490: 69 74 69 76 65 20 29 7b 0a 20 20 20 20 70 49 6e  itive ){.    pIn
d4a0: 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d  fo = (struct com
d4b0: 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49  pareInfo*)&likeI
d4c0: 6e 66 6f 41 6c 74 3b 0a 20 20 20 20 66 6c 61 67  nfoAlt;.    flag
d4d0: 73 20 3d 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s = SQLITE_FUNC_
d4e0: 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55  LIKE | SQLITE_FU
d4f0: 4e 43 5f 43 41 53 45 3b 0a 20 20 7d 65 6c 73 65  NC_CASE;.  }else
d500: 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73  {.    pInfo = (s
d510: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
d520: 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d  o*)&likeInfoNorm
d530: 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51  ;.    flags = SQ
d540: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 3b 0a  LITE_FUNC_LIKE;.
d550: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 72 65    }.  sqlite3Cre
d560: 61 74 65 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b  ateFunc(db, "lik
d570: 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  e", 2, SQLITE_UT
d580: 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46  F8, pInfo, likeF
d590: 75 6e 63 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  unc, 0, 0, 0, 0,
d5a0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72   0);.  sqlite3Cr
d5b0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 6c 69  eateFunc(db, "li
d5c0: 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55  ke", 3, SQLITE_U
d5d0: 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65  TF8, pInfo, like
d5e0: 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Func, 0, 0, 0, 0
d5f0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  , 0);.  sqlite3F
d600: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
d610: 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54  "like", 2, SQLIT
d620: 45 5f 55 54 46 38 2c 20 30 29 2d 3e 66 75 6e 63  E_UTF8, 0)->func
d630: 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a  Flags |= flags;.
d640: 20 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e    sqlite3FindFun
d650: 63 74 69 6f 6e 28 64 62 2c 20 22 6c 69 6b 65 22  ction(db, "like"
d660: 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 3, SQLITE_UTF8
d670: 2c 20 30 29 2d 3e 66 75 6e 63 46 6c 61 67 73 20  , 0)->funcFlags 
d680: 7c 3d 20 66 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a  |= flags;.}../*.
d690: 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73 20  ** pExpr points 
d6a0: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
d6b0: 20 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74   which implement
d6c0: 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  s a function.  I
d6d0: 66 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72 6f  f.** it is appro
d6e0: 70 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79 20  priate to apply 
d6f0: 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  the LIKE optimiz
d700: 61 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66 75  ation to that fu
d710: 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73  nction.** then s
d720: 65 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75 67  et aWc[0] throug
d730: 68 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65 20  h aWc[2] to the 
d740: 77 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74  wildcard charact
d750: 65 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65  ers and the.** e
d760: 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72 20  scape character 
d770: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
d780: 54 52 55 45 2e 20 20 49 66 20 74 68 65 20 66 75  TRUE.  If the fu
d790: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20  nction is not a 
d7a0: 0a 2a 2a 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66  .** LIKE-style f
d7b0: 75 6e 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 74  unction then ret
d7c0: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a  urn FALSE..**.**
d7d0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
d7e0: 22 61 20 4c 49 4b 45 20 62 20 45 53 43 41 50 45  "a LIKE b ESCAPE
d7f0: 20 63 22 20 69 73 20 6f 6e 6c 79 20 63 6f 6e 73   c" is only cons
d800: 69 64 65 72 65 64 20 61 20 76 61 6c 69 64 20 4c  idered a valid L
d810: 49 4b 45 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  IKE.** operator 
d820: 69 66 20 63 20 69 73 20 61 20 73 74 72 69 6e 67  if c is a string
d830: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73   literal that is
d840: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74   exactly one byt
d850: 65 20 69 6e 20 6c 65 6e 67 74 68 2e 0a 2a 2a 20  e in length..** 
d860: 54 68 61 74 20 6f 6e 65 20 62 79 74 65 20 69 73  That one byte is
d870: 20 73 74 6f 72 65 64 20 69 6e 20 61 57 63 5b 33   stored in aWc[3
d880: 5d 2e 20 20 61 57 63 5b 33 5d 20 69 73 20 73 65  ].  aWc[3] is se
d890: 74 20 74 6f 20 7a 65 72 6f 20 69 66 20 74 68 65  t to zero if the
d8a0: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 45 53 43 41  re is.** no ESCA
d8b0: 50 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  PE clause..**.**
d8c0: 20 2a 70 49 73 4e 6f 63 61 73 65 20 69 73 20 73   *pIsNocase is s
d8d0: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 75 70  et to true if up
d8e0: 70 65 72 63 61 73 65 20 61 6e 64 20 6c 6f 77 65  percase and lowe
d8f0: 72 63 61 73 65 20 61 72 65 20 65 71 75 69 76 61  rcase are equiva
d900: 6c 65 6e 74 20 66 6f 72 0a 2a 2a 20 74 68 65 20  lent for.** the 
d910: 66 75 6e 63 74 69 6f 6e 20 28 64 65 66 61 75 6c  function (defaul
d920: 74 20 66 6f 72 20 4c 49 4b 45 29 2e 20 20 49 66  t for LIKE).  If
d930: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d 61   the function ma
d940: 6b 65 73 20 74 68 65 20 64 69 73 74 69 6e 63 74  kes the distinct
d950: 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 75  ion.** between u
d960: 70 70 65 72 63 61 73 65 20 61 6e 64 20 6c 6f 77  ppercase and low
d970: 65 72 63 61 73 65 20 28 61 73 20 64 6f 65 73 20  ercase (as does 
d980: 47 4c 4f 42 29 20 74 68 65 6e 20 2a 70 49 73 4e  GLOB) then *pIsN
d990: 6f 63 61 73 65 20 69 73 20 73 65 74 20 74 6f 0a  ocase is set to.
d9a0: 2a 2a 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74  ** false..*/.int
d9b0: 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75   sqlite3IsLikeFu
d9c0: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
d9d0: 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  db, Expr *pExpr,
d9e0: 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73 65 2c   int *pIsNocase,
d9f0: 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20 20 46   char *aWc){.  F
da00: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
da10: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 69 66 28  int nExpr;.  if(
da20: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46   pExpr->op!=TK_F
da30: 55 4e 43 54 49 4f 4e 20 7c 7c 20 21 70 45 78 70  UNCTION || !pExp
da40: 72 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  r->x.pList ){.  
da50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
da60: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
da70: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
da80: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
da90: 29 3b 0a 20 20 6e 45 78 70 72 20 3d 20 70 45 78  );.  nExpr = pEx
daa0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
dab0: 70 72 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c  pr;.  pDef = sql
dac0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
dad0: 28 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  (db, pExpr->u.zT
dae0: 6f 6b 65 6e 2c 20 6e 45 78 70 72 2c 20 53 51 4c  oken, nExpr, SQL
daf0: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
db00: 69 66 28 20 4e 45 56 45 52 28 70 44 65 66 3d 3d  if( NEVER(pDef==
db10: 30 29 20 7c 7c 20 28 70 44 65 66 2d 3e 66 75 6e  0) || (pDef->fun
db20: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
db30: 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d 30 20 29 7b  FUNC_LIKE)==0 ){
db40: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
db50: 20 7d 0a 20 20 69 66 28 20 6e 45 78 70 72 3c 33   }.  if( nExpr<3
db60: 20 29 7b 0a 20 20 20 20 61 57 63 5b 33 5d 20 3d   ){.    aWc[3] =
db70: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
db80: 20 45 78 70 72 20 2a 70 45 73 63 61 70 65 20 3d   Expr *pEscape =
db90: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
dba0: 3e 61 5b 32 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[2].pExpr;.   
dbb0: 20 63 68 61 72 20 2a 7a 45 73 63 61 70 65 3b 0a   char *zEscape;.
dbc0: 20 20 20 20 69 66 28 20 70 45 73 63 61 70 65 2d      if( pEscape-
dbd0: 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
dbe0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a   return 0;.    z
dbf0: 45 73 63 61 70 65 20 3d 20 70 45 73 63 61 70 65  Escape = pEscape
dc00: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
dc10: 69 66 28 20 7a 45 73 63 61 70 65 5b 30 5d 3d 3d  if( zEscape[0]==
dc20: 30 20 7c 7c 20 7a 45 73 63 61 70 65 5b 31 5d 21  0 || zEscape[1]!
dc30: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
dc40: 20 20 20 61 57 63 5b 33 5d 20 3d 20 7a 45 73 63     aWc[3] = zEsc
dc50: 61 70 65 5b 30 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  ape[0];.  }..  /
dc60: 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73  * The memcpy() s
dc70: 74 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73  tatement assumes
dc80: 20 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61   that the wildca
dc90: 72 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72  rd characters ar
dca0: 65 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  e.  ** the first
dcb0: 20 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74   three statement
dcc0: 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65  s in the compare
dcd0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
dce0: 20 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   The.  ** assert
dcf0: 73 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  s() that follow 
dd00: 76 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75  verify that assu
dd10: 6d 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65  mption.  */.  me
dd20: 6d 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e  mcpy(aWc, pDef->
dd30: 70 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20  pUserData, 3);. 
dd40: 20 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29   assert( (char*)
dd50: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20  &likeInfoAlt == 
dd60: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
dd70: 41 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a  Alt.matchAll );.
dd80: 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61    assert( &((cha
dd90: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29  r*)&likeInfoAlt)
dda0: 5b 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c  [1] == (char*)&l
ddb0: 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68  ikeInfoAlt.match
ddc0: 4f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  One );.  assert(
ddd0: 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49   &((char*)&likeI
dde0: 6e 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63  nfoAlt)[2] == (c
ddf0: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
de00: 74 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20  t.matchSet );.  
de10: 2a 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44  *pIsNocase = (pD
de20: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
de30: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45  SQLITE_FUNC_CASE
de40: 29 3d 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  )==0;.  return 1
de50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f  ;.}../*.** All o
de60: 66 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74  f the FuncDef st
de70: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
de80: 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61  aBuiltinFunc[] a
de90: 72 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  rray above.** to
dea0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
deb0: 74 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e  tion hash table.
dec0: 20 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 74    This occurs at
ded0: 20 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a   start-time (as.
dee0: 2a 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65  ** a consequence
def0: 20 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   of calling sqli
df00: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
df10: 29 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  )..**.** After t
df20: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
df30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
df40: 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
df50: 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a  unctions(void){.
df60: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    /*.  ** The fo
df70: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f  llowing array ho
df80: 6c 64 73 20 46 75 6e 63 44 65 66 20 73 74 72 75  lds FuncDef stru
df90: 63 74 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f  ctures for all o
dfa0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a  f the functions.
dfb0: 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20    ** defined in 
dfc0: 74 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a  this file..  **.
dfd0: 20 20 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63    ** The array c
dfe0: 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e  annot be constan
dff0: 74 20 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20  t since changes 
e000: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a  are made to the.
e010: 20 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61    ** FuncDef.pHa
e020: 73 68 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73  sh elements at s
e030: 74 61 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20  tart-time.  The 
e040: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73  elements of this
e050: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20   array.  ** are 
e060: 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
e070: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69  initialization i
e080: 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2a  s complete..  **
e090: 0a 20 20 2a 2a 20 46 6f 72 20 70 65 61 6b 20 65  .  ** For peak e
e0a0: 66 66 69 63 69 65 6e 63 79 2c 20 70 75 74 20 74  fficiency, put t
e0b0: 68 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74  he most frequent
e0c0: 6c 79 20 75 73 65 64 20 66 75 6e 63 74 69 6f 6e  ly used function
e0d0: 20 6c 61 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74   last..  */.  st
e0e0: 61 74 69 63 20 46 75 6e 63 44 65 66 20 61 42 75  atic FuncDef aBu
e0f0: 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a  iltinFunc[] = {.
e100: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f  #ifdef SQLITE_SO
e110: 55 4e 44 45 58 0a 20 20 20 20 46 55 4e 43 54 49  UNDEX.    FUNCTI
e120: 4f 4e 28 73 6f 75 6e 64 65 78 2c 20 20 20 20 20  ON(soundex,     
e130: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
e140: 73 6f 75 6e 64 65 78 46 75 6e 63 20 20 20 20 20  soundexFunc     
e150: 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   ),.#endif.#ifnd
e160: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
e170: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
e180: 20 20 56 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64    VFUNCTION(load
e190: 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 31  _extension,    1
e1a0: 2c 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20  , 0, 0, loadExt 
e1b0: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
e1c0: 56 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65  VFUNCTION(load_e
e1d0: 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 32 2c 20  xtension,    2, 
e1e0: 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20  0, 0, loadExt   
e1f0: 20 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66         ),.#endif
e200: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
e210: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
e220: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c      FUNCTION(sql
e230: 69 74 65 5f 63 72 79 70 74 2c 20 20 20 20 20 20  ite_crypt,      
e240: 20 32 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 65   2, 0, 0, sqlite
e250: 33 43 72 79 70 74 46 75 6e 63 20 29 2c 0a 23 65  3CryptFunc ),.#e
e260: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
e270: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
e280: 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20 20  OPTION_DIAGS.   
e290: 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74   DFUNCTION(sqlit
e2a0: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
e2b0: 75 73 65 64 2c 31 2c 20 30 2c 20 30 2c 20 63 6f  used,1, 0, 0, co
e2c0: 6d 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46  mpileoptionusedF
e2d0: 75 6e 63 20 20 29 2c 0a 20 20 20 20 44 46 55 4e  unc  ),.    DFUN
e2e0: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d  CTION(sqlite_com
e2f0: 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 2c 20  pileoption_get, 
e300: 31 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65  1, 0, 0, compile
e310: 6f 70 74 69 6f 6e 67 65 74 46 75 6e 63 20 20 29  optiongetFunc  )
e320: 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ,.#endif /* SQLI
e330: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
e340: 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 20  PTION_DIAGS */. 
e350: 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 75 6e 6c     FUNCTION2(unl
e360: 69 6b 65 6c 79 2c 20 20 20 20 20 20 20 20 20 20  ikely,          
e370: 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e  1, 0, 0, noopFun
e380: 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  c,  SQLITE_FUNC_
e390: 55 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20 46  UNLIKELY),.    F
e3a0: 55 4e 43 54 49 4f 4e 32 28 6c 69 6b 65 6c 69 68  UNCTION2(likelih
e3b0: 6f 6f 64 2c 20 20 20 20 20 20 20 20 32 2c 20 30  ood,        2, 0
e3c0: 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20  , 0, noopFunc,  
e3d0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49  SQLITE_FUNC_UNLI
e3e0: 4b 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e 43 54  KELY),.    FUNCT
e3f0: 49 4f 4e 32 28 6c 69 6b 65 6c 79 2c 20 20 20 20  ION2(likely,    
e400: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
e410: 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49   noopFunc,  SQLI
e420: 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59  TE_FUNC_UNLIKELY
e430: 29 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ),.#ifdef SQLITE
e440: 5f 44 45 42 55 47 0a 20 20 20 20 46 55 4e 43 54  _DEBUG.    FUNCT
e450: 49 4f 4e 32 28 61 66 66 69 6e 69 74 79 2c 20 20  ION2(affinity,  
e460: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
e470: 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49   noopFunc,  SQLI
e480: 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59  TE_FUNC_AFFINITY
e490: 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  ),.#endif.#ifdef
e4a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
e4b0: 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20  FFSET_SQL_FUNC. 
e4c0: 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 73 71 6c     FUNCTION2(sql
e4d0: 69 74 65 5f 6f 66 66 73 65 74 2c 20 20 20 20 20  ite_offset,     
e4e0: 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e  1, 0, 0, noopFun
e4f0: 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  c,  SQLITE_FUNC_
e500: 4f 46 46 53 45 54 7c 0a 20 20 20 20 20 20 20 20  OFFSET|.        
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
e540: 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29  ITE_FUNC_TYPEOF)
e550: 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 55 4e  ,.#endif.    FUN
e560: 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20  CTION(ltrim,    
e570: 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20            1, 1, 
e580: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
e590: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
e5a0: 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20 20 20  ION(ltrim,      
e5b0: 20 20 20 20 20 20 20 20 32 2c 20 31 2c 20 30 2c          2, 1, 0,
e5c0: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
e5d0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
e5e0: 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20  N(rtrim,        
e5f0: 20 20 20 20 20 20 31 2c 20 32 2c 20 30 2c 20 74        1, 2, 0, t
e600: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
e610: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
e620: 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20  rtrim,          
e630: 20 20 20 20 32 2c 20 32 2c 20 30 2c 20 74 72 69      2, 2, 0, tri
e640: 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c  mFunc         ),
e650: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72  .    FUNCTION(tr
e660: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
e670: 20 20 31 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46    1, 3, 0, trimF
e680: 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20  unc         ),. 
e690: 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72 69 6d     FUNCTION(trim
e6a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e6b0: 32 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46 75 6e  2, 3, 0, trimFun
e6c0: 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  c         ),.   
e6d0: 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20   FUNCTION(min,  
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
e6f0: 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e   0, 1, minmaxFun
e700: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
e710: 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20 20 20  UNCTION(min,    
e720: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
e730: 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20  , 1, 0          
e740: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 57 41 47        ),.    WAG
e750: 47 52 45 47 41 54 45 28 6d 69 6e 2c 20 31 2c 20  GREGATE(min, 1, 
e760: 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70  0, 1, minmaxStep
e770: 2c 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65  , minMaxFinalize
e780: 2c 20 6d 69 6e 4d 61 78 56 61 6c 75 65 2c 20 30  , minMaxValue, 0
e790: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e7c0: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 20 29  TE_FUNC_MINMAX )
e7d0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d  ,.    FUNCTION(m
e7e0: 61 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ax,             
e7f0: 20 20 2d 31 2c 20 31 2c 20 31 2c 20 6d 69 6e 6d    -1, 1, 1, minm
e800: 61 78 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  axFunc       ),.
e810: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 61 78      FUNCTION(max
e820: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e830: 20 30 2c 20 31 2c 20 31 2c 20 30 20 20 20 20 20   0, 1, 1, 0     
e840: 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20             ),.  
e850: 20 20 57 41 47 47 52 45 47 41 54 45 28 6d 61 78    WAGGREGATE(max
e860: 2c 20 31 2c 20 31 2c 20 31 2c 20 6d 69 6e 6d 61  , 1, 1, 1, minma
e870: 78 53 74 65 70 2c 20 6d 69 6e 4d 61 78 46 69 6e  xStep, minMaxFin
e880: 61 6c 69 7a 65 2c 20 6d 69 6e 4d 61 78 56 61 6c  alize, minMaxVal
e890: 75 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ue, 0,.         
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8c0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
e8d0: 4d 41 58 20 29 2c 0a 20 20 20 20 46 55 4e 43 54  MAX ),.    FUNCT
e8e0: 49 4f 4e 32 28 74 79 70 65 6f 66 2c 20 20 20 20  ION2(typeof,    
e8f0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
e900: 20 74 79 70 65 6f 66 46 75 6e 63 2c 20 20 53 51   typeofFunc,  SQ
e910: 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
e920: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32  ),.    FUNCTION2
e930: 28 6c 65 6e 67 74 68 2c 20 20 20 20 20 20 20 20  (length,        
e940: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 65 6e      1, 0, 0, len
e950: 67 74 68 46 75 6e 63 2c 20 20 53 51 4c 49 54 45  gthFunc,  SQLITE
e960: 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 29 2c 0a 20  _FUNC_LENGTH),. 
e970: 20 20 20 46 55 4e 43 54 49 4f 4e 28 69 6e 73 74     FUNCTION(inst
e980: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
e990: 32 2c 20 30 2c 20 30 2c 20 69 6e 73 74 72 46 75  2, 0, 0, instrFu
e9a0: 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  nc        ),.   
e9b0: 20 46 55 4e 43 54 49 4f 4e 28 70 72 69 6e 74 66   FUNCTION(printf
e9c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c  ,            -1,
e9d0: 20 30 2c 20 30 2c 20 70 72 69 6e 74 66 46 75 6e   0, 0, printfFun
e9e0: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
e9f0: 55 4e 43 54 49 4f 4e 28 75 6e 69 63 6f 64 65 2c  UNCTION(unicode,
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
ea10: 2c 20 30 2c 20 75 6e 69 63 6f 64 65 46 75 6e 63  , 0, unicodeFunc
ea20: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
ea30: 43 54 49 4f 4e 28 63 68 61 72 2c 20 20 20 20 20  CTION(char,     
ea40: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20           -1, 0, 
ea50: 30 2c 20 63 68 61 72 46 75 6e 63 20 20 20 20 20  0, charFunc     
ea60: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
ea70: 49 4f 4e 28 61 62 73 2c 20 20 20 20 20 20 20 20  ION(abs,        
ea80: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
ea90: 20 61 62 73 46 75 6e 63 20 20 20 20 20 20 20 20   absFunc        
eaa0: 20 20 29 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c    ),.#ifndef SQL
eab0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
eac0: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 46 55 4e 43  G_POINT.    FUNC
ead0: 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20 20 20  TION(round,     
eae0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
eaf0: 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 20 20 20  , roundFunc     
eb00: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
eb10: 4f 4e 28 72 6f 75 6e 64 2c 20 20 20 20 20 20 20  ON(round,       
eb20: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
eb30: 72 6f 75 6e 64 46 75 6e 63 20 20 20 20 20 20 20  roundFunc       
eb40: 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 46   ),.#endif.    F
eb50: 55 4e 43 54 49 4f 4e 28 75 70 70 65 72 2c 20 20  UNCTION(upper,  
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
eb70: 2c 20 30 2c 20 75 70 70 65 72 46 75 6e 63 20 20  , 0, upperFunc  
eb80: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
eb90: 43 54 49 4f 4e 28 6c 6f 77 65 72 2c 20 20 20 20  CTION(lower,    
eba0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
ebb0: 30 2c 20 6c 6f 77 65 72 46 75 6e 63 20 20 20 20  0, lowerFunc    
ebc0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
ebd0: 49 4f 4e 28 68 65 78 2c 20 20 20 20 20 20 20 20  ION(hex,        
ebe0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
ebf0: 20 68 65 78 46 75 6e 63 20 20 20 20 20 20 20 20   hexFunc        
ec00: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
ec10: 4e 32 28 69 66 6e 75 6c 6c 2c 20 20 20 20 20 20  N2(ifnull,      
ec20: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 6e        2, 0, 0, n
ec30: 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45  oopFunc,  SQLITE
ec40: 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c  _FUNC_COALESCE),
ec50: 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 72  .    VFUNCTION(r
ec60: 61 6e 64 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  andom,          
ec70: 20 20 30 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f    0, 0, 0, rando
ec80: 6d 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  mFunc       ),. 
ec90: 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 72 61 6e     VFUNCTION(ran
eca0: 64 6f 6d 62 6c 6f 62 2c 20 20 20 20 20 20 20 20  domblob,        
ecb0: 31 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 42  1, 0, 0, randomB
ecc0: 6c 6f 62 20 20 20 20 20 20 20 29 2c 0a 20 20 20  lob       ),.   
ecd0: 20 46 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c 69 66   FUNCTION(nullif
ece0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  ,             2,
ecf0: 20 30 2c 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e   0, 1, nullifFun
ed00: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 44  c       ),.    D
ed10: 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f  FUNCTION(sqlite_
ed20: 76 65 72 73 69 6f 6e 2c 20 20 20 20 30 2c 20 30  version,    0, 0
ed30: 2c 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63  , 0, versionFunc
ed40: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 44 46 55        ),.    DFU
ed50: 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 73 6f  NCTION(sqlite_so
ed60: 75 72 63 65 5f 69 64 2c 20 20 30 2c 20 30 2c 20  urce_id,  0, 0, 
ed70: 30 2c 20 73 6f 75 72 63 65 69 64 46 75 6e 63 20  0, sourceidFunc 
ed80: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
ed90: 49 4f 4e 28 73 71 6c 69 74 65 5f 6c 6f 67 2c 20  ION(sqlite_log, 
eda0: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c          2, 0, 0,
edb0: 20 65 72 72 6c 6f 67 46 75 6e 63 20 20 20 20 20   errlogFunc     
edc0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
edd0: 4e 28 71 75 6f 74 65 2c 20 20 20 20 20 20 20 20  N(quote,        
ede0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 71        1, 0, 0, q
edf0: 75 6f 74 65 46 75 6e 63 20 20 20 20 20 20 20 20  uoteFunc        
ee00: 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e  ),.    VFUNCTION
ee10: 28 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  (last_insert_row
ee20: 69 64 2c 20 30 2c 20 30 2c 20 30 2c 20 6c 61 73  id, 0, 0, 0, las
ee30: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 29 2c  t_insert_rowid),
ee40: 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 63  .    VFUNCTION(c
ee50: 68 61 6e 67 65 73 2c 20 20 20 20 20 20 20 20 20  hanges,         
ee60: 20 20 30 2c 20 30 2c 20 30 2c 20 63 68 61 6e 67    0, 0, 0, chang
ee70: 65 73 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20  es          ),. 
ee80: 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 74 6f 74     VFUNCTION(tot
ee90: 61 6c 5f 63 68 61 6e 67 65 73 2c 20 20 20 20 20  al_changes,     
eea0: 30 2c 20 30 2c 20 30 2c 20 74 6f 74 61 6c 5f 63  0, 0, 0, total_c
eeb0: 68 61 6e 67 65 73 20 20 20 20 29 2c 0a 20 20 20  hanges    ),.   
eec0: 20 46 55 4e 43 54 49 4f 4e 28 72 65 70 6c 61 63   FUNCTION(replac
eed0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 33 2c  e,            3,
eee0: 20 30 2c 20 30 2c 20 72 65 70 6c 61 63 65 46 75   0, 0, replaceFu
eef0: 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  nc      ),.    F
ef00: 55 4e 43 54 49 4f 4e 28 7a 65 72 6f 62 6c 6f 62  UNCTION(zeroblob
ef10: 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30  ,           1, 0
ef20: 2c 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46 75 6e  , 0, zeroblobFun
ef30: 63 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e  c     ),.    FUN
ef40: 43 54 49 4f 4e 28 73 75 62 73 74 72 2c 20 20 20  CTION(substr,   
ef50: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
ef60: 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20 20 20  0, substrFunc   
ef70: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
ef80: 49 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20 20  ION(substr,     
ef90: 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20 30 2c          3, 0, 0,
efa0: 20 73 75 62 73 74 72 46 75 6e 63 20 20 20 20 20   substrFunc     
efb0: 20 20 29 2c 0a 20 20 20 20 57 41 47 47 52 45 47    ),.    WAGGREG
efc0: 41 54 45 28 73 75 6d 2c 20 20 20 31 2c 30 2c 30  ATE(sum,   1,0,0
efd0: 2c 20 73 75 6d 53 74 65 70 2c 20 73 75 6d 46 69  , sumStep, sumFi
efe0: 6e 61 6c 69 7a 65 2c 20 73 75 6d 46 69 6e 61 6c  nalize, sumFinal
eff0: 69 7a 65 2c 20 73 75 6d 49 6e 76 65 72 73 65 2c  ize, sumInverse,
f000: 20 30 29 2c 0a 20 20 20 20 57 41 47 47 52 45 47   0),.    WAGGREG
f010: 41 54 45 28 74 6f 74 61 6c 2c 20 31 2c 30 2c 30  ATE(total, 1,0,0
f020: 2c 20 73 75 6d 53 74 65 70 2c 74 6f 74 61 6c 46  , sumStep,totalF
f030: 69 6e 61 6c 69 7a 65 2c 74 6f 74 61 6c 46 69 6e  inalize,totalFin
f040: 61 6c 69 7a 65 2c 73 75 6d 49 6e 76 65 72 73 65  alize,sumInverse
f050: 2c 20 30 29 2c 0a 20 20 20 20 57 41 47 47 52 45  , 0),.    WAGGRE
f060: 47 41 54 45 28 61 76 67 2c 20 20 20 31 2c 30 2c  GATE(avg,   1,0,
f070: 30 2c 20 73 75 6d 53 74 65 70 2c 20 61 76 67 46  0, sumStep, avgF
f080: 69 6e 61 6c 69 7a 65 2c 20 61 76 67 46 69 6e 61  inalize, avgFina
f090: 6c 69 7a 65 2c 20 73 75 6d 49 6e 76 65 72 73 65  lize, sumInverse
f0a0: 2c 20 30 29 2c 0a 20 20 20 20 57 41 47 47 52 45  , 0),.    WAGGRE
f0b0: 47 41 54 45 28 63 6f 75 6e 74 2c 20 30 2c 30 2c  GATE(count, 0,0,
f0c0: 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 0a 20  0, countStep, . 
f0d0: 20 20 20 20 20 20 20 63 6f 75 6e 74 46 69 6e 61         countFina
f0e0: 6c 69 7a 65 2c 20 63 6f 75 6e 74 46 69 6e 61 6c  lize, countFinal
f0f0: 69 7a 65 2c 20 63 6f 75 6e 74 49 6e 76 65 72 73  ize, countInvers
f100: 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  e, SQLITE_FUNC_C
f110: 4f 55 4e 54 20 20 29 2c 0a 20 20 20 20 57 41 47  OUNT  ),.    WAG
f120: 47 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 31  GREGATE(count, 1
f130: 2c 30 2c 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c  ,0,0, countStep,
f140: 20 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 46   .        countF
f150: 69 6e 61 6c 69 7a 65 2c 20 63 6f 75 6e 74 46 69  inalize, countFi
f160: 6e 61 6c 69 7a 65 2c 20 63 6f 75 6e 74 49 6e 76  nalize, countInv
f170: 65 72 73 65 2c 20 30 20 20 29 2c 0a 20 20 20 20  erse, 0  ),.    
f180: 57 41 47 47 52 45 47 41 54 45 28 67 72 6f 75 70  WAGGREGATE(group
f190: 5f 63 6f 6e 63 61 74 2c 20 31 2c 20 30 2c 20 30  _concat, 1, 0, 0
f1a0: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65  , groupConcatSte
f1b0: 70 2c 20 0a 20 20 20 20 20 20 20 20 67 72 6f 75  p, .        grou
f1c0: 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 2c  pConcatFinalize,
f1d0: 20 67 72 6f 75 70 43 6f 6e 63 61 74 56 61 6c 75   groupConcatValu
f1e0: 65 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 49 6e  e, groupConcatIn
f1f0: 76 65 72 73 65 2c 20 30 29 2c 0a 20 20 20 20 57  verse, 0),.    W
f200: 41 47 47 52 45 47 41 54 45 28 67 72 6f 75 70 5f  AGGREGATE(group_
f210: 63 6f 6e 63 61 74 2c 20 32 2c 20 30 2c 20 30 2c  concat, 2, 0, 0,
f220: 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70   groupConcatStep
f230: 2c 20 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  , .        group
f240: 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 2c 20  ConcatFinalize, 
f250: 67 72 6f 75 70 43 6f 6e 63 61 74 56 61 6c 75 65  groupConcatValue
f260: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 49 6e 76  , groupConcatInv
f270: 65 72 73 65 2c 20 30 29 2c 0a 20 20 0a 20 20 20  erse, 0),.  .   
f280: 20 4c 49 4b 45 46 55 4e 43 28 67 6c 6f 62 2c 20   LIKEFUNC(glob, 
f290: 32 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c 20 53 51  2, &globInfo, SQ
f2a0: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53  LITE_FUNC_LIKE|S
f2b0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
f2c0: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
f2d0: 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c  CASE_SENSITIVE_L
f2e0: 49 4b 45 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43  IKE.    LIKEFUNC
f2f0: 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49  (like, 2, &likeI
f300: 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46  nfoAlt, SQLITE_F
f310: 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f  UNC_LIKE|SQLITE_
f320: 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20 20 20  FUNC_CASE),.    
f330: 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33  LIKEFUNC(like, 3
f340: 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20  , &likeInfoAlt, 
f350: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
f360: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53  |SQLITE_FUNC_CAS
f370: 45 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 4c 49  E),.#else.    LI
f380: 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20  KEFUNC(like, 2, 
f390: 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53  &likeInfoNorm, S
f3a0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29  QLITE_FUNC_LIKE)
f3b0: 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c  ,.    LIKEFUNC(l
f3c0: 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66  ike, 3, &likeInf
f3d0: 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55  oNorm, SQLITE_FU
f3e0: 4e 43 5f 4c 49 4b 45 29 2c 0a 23 65 6e 64 69 66  NC_LIKE),.#endif
f3f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f400: 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51  NABLE_UNKNOWN_SQ
f410: 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 46  L_FUNCTION.    F
f420: 55 4e 43 54 49 4f 4e 28 75 6e 6b 6e 6f 77 6e 2c  UNCTION(unknown,
f430: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30             -1, 0
f440: 2c 20 30 2c 20 75 6e 6b 6e 6f 77 6e 46 75 6e 63  , 0, unknownFunc
f450: 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a        ),.#endif.
f460: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61      FUNCTION(coa
f470: 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 20  lesce,          
f480: 20 31 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20   1, 0, 0, 0     
f490: 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20             ),.  
f4a0: 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65    FUNCTION(coale
f4b0: 73 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  sce,           0
f4c0: 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20  , 0, 0, 0       
f4d0: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
f4e0: 46 55 4e 43 54 49 4f 4e 32 28 63 6f 61 6c 65 73  FUNCTION2(coales
f4f0: 63 65 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20  ce,         -1, 
f500: 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20  0, 0, noopFunc, 
f510: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
f520: 4c 45 53 43 45 29 2c 0a 20 20 7d 3b 0a 23 69 66  LESCE),.  };.#if
f530: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f540: 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 73 71  _ALTERTABLE.  sq
f550: 6c 69 74 65 33 41 6c 74 65 72 46 75 6e 63 74 69  lite3AlterFuncti
f560: 6f 6e 73 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ons();.#endif.  
f570: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75 6e  sqlite3WindowFun
f580: 63 74 69 6f 6e 73 28 29 3b 0a 23 69 66 20 64 65  ctions();.#if de
f590: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
f5a0: 42 4c 45 5f 53 54 41 54 33 29 20 7c 7c 20 64 65  BLE_STAT3) || de
f5b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
f5c0: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 73 71 6c  BLE_STAT4).  sql
f5d0: 69 74 65 33 41 6e 61 6c 79 7a 65 46 75 6e 63 74  ite3AnalyzeFunct
f5e0: 69 6f 6e 73 28 29 3b 0a 23 65 6e 64 69 66 0a 20  ions();.#endif. 
f5f0: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
f600: 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69 6f 6e  DateTimeFunction
f610: 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e  s();.  sqlite3In
f620: 73 65 72 74 42 75 69 6c 74 69 6e 46 75 6e 63 73  sertBuiltinFuncs
f630: 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 2c 20 41  (aBuiltinFunc, A
f640: 72 72 61 79 53 69 7a 65 28 61 42 75 69 6c 74 69  rraySize(aBuilti
f650: 6e 46 75 6e 63 29 29 3b 0a 0a 23 69 66 20 30 20  nFunc));..#if 0 
f660: 20 2f 2a 20 45 6e 61 62 6c 65 20 74 6f 20 70 72   /* Enable to pr
f670: 69 6e 74 20 6f 75 74 20 68 6f 77 20 74 68 65 20  int out how the 
f680: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
f690: 6e 73 20 61 72 65 20 68 61 73 68 65 64 20 2a 2f  ns are hashed */
f6a0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
f6b0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a      FuncDef *p;.
f6c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
f6d0: 51 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53 48 5f  QLITE_FUNC_HASH_
f6e0: 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  SZ; i++){.      
f6f0: 70 72 69 6e 74 66 28 22 46 55 4e 43 2d 48 41 53  printf("FUNC-HAS
f700: 48 20 25 30 32 64 3a 22 2c 20 69 29 3b 0a 20 20  H %02d:", i);.  
f710: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
f720: 33 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  3BuiltinFunction
f730: 73 2e 61 5b 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e  s.a[i]; p; p=p->
f740: 75 2e 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20  u.pHash){.      
f750: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
f760: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61  3Strlen30(p->zNa
f770: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  me);.        int
f780: 20 68 20 3d 20 70 2d 3e 7a 4e 61 6d 65 5b 30 5d   h = p->zName[0]
f790: 20 2b 20 6e 3b 0a 20 20 20 20 20 20 20 20 70 72   + n;.        pr
f7a0: 69 6e 74 66 28 22 20 25 73 28 25 64 29 22 2c 20  intf(" %s(%d)", 
f7b0: 70 2d 3e 7a 4e 61 6d 65 2c 20 68 29 3b 0a 20 20  p->zName, h);.  
f7c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e      }.      prin
f7d0: 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  tf("\n");.    }.
f7e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a             }.#endif.}.