/ Hex Artifact Content
Login

Artifact 0fb9a2d678d3c8aba89b46468b309cd7e8fa9806a369a30aa89024660845bb13:


0000: 2f 2a 0a 2a 2a 20 32 30 30 32 20 46 65 62 72 75  /*.** 2002 Febru
0010: 61 72 79 20 32 33 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 23.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
0190: 43 2d 6c 61 6e 67 75 61 67 65 20 69 6d 70 6c 65  C-language imple
01a0: 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 6d  mentations for m
01b0: 61 6e 79 20 6f 66 20 74 68 65 20 53 51 4c 0a 2a  any of the SQL.*
01c0: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6f 66 20 53  * functions of S
01d0: 51 4c 69 74 65 2e 20 20 28 53 6f 6d 65 20 66 75  QLite.  (Some fu
01e0: 6e 63 74 69 6f 6e 2c 20 61 6e 64 20 69 6e 20 70  nction, and in p
01f0: 61 72 74 69 63 75 6c 61 72 20 74 68 65 20 64 61  articular the da
0200: 74 65 20 61 6e 64 0a 2a 2a 20 74 69 6d 65 20 66  te and.** time f
0210: 75 6e 63 74 69 6f 6e 73 2c 20 61 72 65 20 69 6d  unctions, are im
0220: 70 6c 65 6d 65 6e 74 65 64 20 73 65 70 61 72 61  plemented separa
0230: 74 65 6c 79 2e 29 0a 2a 2f 0a 23 69 6e 63 6c 75  tely.).*/.#inclu
0240: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0250: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
0260: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  b.h>.#include <a
0270: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0280: 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 2f  e "vdbeInt.h"../
0290: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
02a0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
02b0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
02c0: 74 68 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  th a function..*
02d0: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
02e0: 20 2a 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63   *sqlite3GetFunc
02f0: 43 6f 6c 6c 53 65 71 28 73 71 6c 69 74 65 33 5f  CollSeq(sqlite3_
0300: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0310: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
0320: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 6e 74  ;.  assert( cont
0330: 65 78 74 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  ext->pVdbe!=0 );
0340: 0a 20 20 70 4f 70 20 3d 20 26 63 6f 6e 74 65 78  .  pOp = &contex
0350: 74 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 63 6f  t->pVdbe->aOp[co
0360: 6e 74 65 78 74 2d 3e 69 4f 70 2d 31 5d 3b 0a 20  ntext->iOp-1];. 
0370: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
0380: 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71  code==OP_CollSeq
0390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
03a0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f  p->p4type==P4_CO
03b0: 4c 4c 53 45 51 20 29 3b 0a 20 20 72 65 74 75 72  LLSEQ );.  retur
03c0: 6e 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  n pOp->p4.pColl;
03d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
03e0: 74 65 20 74 68 61 74 20 74 68 65 20 61 63 63 75  te that the accu
03f0: 6d 75 6c 61 74 6f 72 20 6c 6f 61 64 20 73 68 6f  mulator load sho
0400: 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20 6f  uld be skipped o
0410: 6e 20 74 68 69 73 0a 2a 2a 20 69 74 65 72 61 74  n this.** iterat
0420: 69 6f 6e 20 6f 66 20 74 68 65 20 61 67 67 72 65  ion of the aggre
0430: 67 61 74 65 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74  gate loop..*/.st
0440: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
0450: 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74 6f 72  3SkipAccumulator
0460: 4c 6f 61 64 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Load(sqlite3_con
0470: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
0480: 20 20 63 6f 6e 74 65 78 74 2d 3e 73 6b 69 70 46    context->skipF
0490: 6c 61 67 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  lag = 1;.}../*.*
04a0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
04b0: 20 6f 66 20 74 68 65 20 6e 6f 6e 2d 61 67 67 72   of the non-aggr
04c0: 65 67 61 74 65 20 6d 69 6e 28 29 20 61 6e 64 20  egate min() and 
04d0: 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 0a  max() functions.
04e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
04f0: 69 6e 6d 61 78 46 75 6e 63 28 0a 20 20 73 71 6c  inmaxFunc(.  sql
0500: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0510: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
0520: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
0530: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
0540: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  nt i;.  int mask
0550: 3b 20 20 20 20 2f 2a 20 30 20 66 6f 72 20 6d 69  ;    /* 0 for mi
0560: 6e 28 29 20 6f 72 20 30 78 66 66 66 66 66 66 66  n() or 0xfffffff
0570: 66 20 66 6f 72 20 6d 61 78 28 29 20 2a 2f 0a 20  f for max() */. 
0580: 20 69 6e 74 20 69 42 65 73 74 3b 0a 20 20 43 6f   int iBest;.  Co
0590: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
05a0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3e 31 20   assert( argc>1 
05b0: 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69  );.  mask = sqli
05c0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
05d0: 6e 74 65 78 74 29 3d 3d 30 20 3f 20 30 20 3a 20  ntext)==0 ? 0 : 
05e0: 2d 31 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  -1;.  pColl = sq
05f0: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
0600: 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  Seq(context);.  
0610: 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 20 29 3b  assert( pColl );
0620: 0a 20 20 61 73 73 65 72 74 28 20 6d 61 73 6b 3d  .  assert( mask=
0630: 3d 2d 31 20 7c 7c 20 6d 61 73 6b 3d 3d 30 20 29  =-1 || mask==0 )
0640: 3b 0a 20 20 69 42 65 73 74 20 3d 20 30 3b 0a 20  ;.  iBest = 0;. 
0650: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
0660: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
0670: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
0680: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
0690: 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
06a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
06b0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
06c0: 5b 69 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [i])==SQLITE_NUL
06d0: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  L ) return;.    
06e0: 69 66 28 20 28 73 71 6c 69 74 65 33 4d 65 6d 43  if( (sqlite3MemC
06f0: 6f 6d 70 61 72 65 28 61 72 67 76 5b 69 42 65 73  ompare(argv[iBes
0700: 74 5d 2c 20 61 72 67 76 5b 69 5d 2c 20 70 43 6f  t], argv[i], pCo
0710: 6c 6c 29 5e 6d 61 73 6b 29 3e 3d 30 20 29 7b 0a  ll)^mask)>=0 ){.
0720: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
0730: 6d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  mask==0 );.     
0740: 20 69 42 65 73 74 20 3d 20 69 3b 0a 20 20 20 20   iBest = i;.    
0750: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
0760: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
0770: 74 65 78 74 2c 20 61 72 67 76 5b 69 42 65 73 74  text, argv[iBest
0780: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ]);.}../*.** Ret
0790: 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20  urn the type of 
07a0: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
07b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 79 70  .static void typ
07c0: 65 6f 66 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  eofFunc(.  sqlit
07d0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
07e0: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
07f0: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
0800: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
0810: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0820: 72 20 2a 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 20  r *azType[] = { 
0830: 22 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c  "integer", "real
0840: 22 2c 20 22 74 65 78 74 22 2c 20 22 62 6c 6f 62  ", "text", "blob
0850: 22 2c 20 22 6e 75 6c 6c 22 20 7d 3b 0a 20 20 69  ", "null" };.  i
0860: 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt i = sqlite3_v
0870: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
0880: 5d 29 20 2d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ]) - 1;.  UNUSED
0890: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
08a0: 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ed);.  assert( i
08b0: 3e 3d 30 20 26 26 20 69 3c 41 72 72 61 79 53 69  >=0 && i<ArraySi
08c0: 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20  ze(azType) );.  
08d0: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 49  assert( SQLITE_I
08e0: 4e 54 45 47 45 52 3d 3d 31 20 29 3b 0a 20 20 61  NTEGER==1 );.  a
08f0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 4c  ssert( SQLITE_FL
0900: 4f 41 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65  OAT==2 );.  asse
0910: 72 74 28 20 53 51 4c 49 54 45 5f 54 45 58 54 3d  rt( SQLITE_TEXT=
0920: 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =3 );.  assert( 
0930: 53 51 4c 49 54 45 5f 42 4c 4f 42 3d 3d 34 20 29  SQLITE_BLOB==4 )
0940: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
0950: 54 45 5f 4e 55 4c 4c 3d 3d 35 20 29 3b 0a 20 20  TE_NULL==5 );.  
0960: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
0970: 52 2d 30 31 34 37 30 2d 36 30 34 38 32 20 54 68  R-01470-60482 Th
0980: 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  e sqlite3_value_
0990: 74 79 70 65 28 56 29 20 69 6e 74 65 72 66 61 63  type(V) interfac
09a0: 65 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 74  e returns.  ** t
09b0: 68 65 20 64 61 74 61 74 79 70 65 20 63 6f 64 65  he datatype code
09c0: 20 66 6f 72 20 74 68 65 20 69 6e 69 74 69 61 6c   for the initial
09d0: 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 68 65   datatype of the
09e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
09f0: 62 6a 65 63 74 0a 20 20 2a 2a 20 56 2e 20 54 68  bject.  ** V. Th
0a00: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
0a10: 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
0a20: 45 5f 49 4e 54 45 47 45 52 2c 20 53 51 4c 49 54  E_INTEGER, SQLIT
0a30: 45 5f 46 4c 4f 41 54 2c 0a 20 20 2a 2a 20 53 51  E_FLOAT,.  ** SQ
0a40: 4c 49 54 45 5f 54 45 58 54 2c 20 53 51 4c 49 54  LITE_TEXT, SQLIT
0a50: 45 5f 42 4c 4f 42 2c 20 6f 72 20 53 51 4c 49 54  E_BLOB, or SQLIT
0a60: 45 5f 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 73 71 6c  E_NULL. */.  sql
0a70: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
0a80: 28 63 6f 6e 74 65 78 74 2c 20 61 7a 54 79 70 65  (context, azType
0a90: 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
0aa0: 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  STATIC);.}.../*.
0ab0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
0ac0: 6e 20 6f 66 20 74 68 65 20 6c 65 6e 67 74 68 28  n of the length(
0ad0: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74  ) function.*/.st
0ae0: 61 74 69 63 20 76 6f 69 64 20 6c 65 6e 67 74 68  atic void length
0af0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
0b00: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0b10: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
0b20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0b30: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6c 65  argv.){.  int le
0b40: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  n;..  assert( ar
0b50: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
0b60: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
0b70: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  );.  switch( sql
0b80: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
0b90: 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20  argv[0]) ){.    
0ba0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
0bb0: 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
0bc0: 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  E_INTEGER:.    c
0bd0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
0be0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
0bf0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
0c00: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
0c10: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
0c20: 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ]));.      break
0c30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
0c40: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a   SQLITE_TEXT: {.
0c50: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
0c60: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73  gned char *z = s
0c70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
0c80: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
0c90: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
0ca0: 75 72 6e 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d  urn;.      len =
0cb0: 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
0cc0: 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 6c   *z ){.        l
0cd0: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 53 51  en++;.        SQ
0ce0: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
0cf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
0d00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0d10: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e  int(context, len
0d20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0d30: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
0d40: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
0d50: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
0d60: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 62  ontext);.      b
0d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
0d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
0d90: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61  ntation of the a
0da0: 62 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  bs() function..*
0db0: 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d 32 33 39 37  *.** IMP: R-2397
0dc0: 39 2d 32 36 38 35 35 20 54 68 65 20 61 62 73 28  9-26855 The abs(
0dd0: 58 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  X) function retu
0de0: 72 6e 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65  rns the absolute
0df0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
0e00: 20 6e 75 6d 65 72 69 63 20 61 72 67 75 6d 65 6e   numeric argumen
0e10: 74 20 58 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  t X. .*/.static 
0e20: 76 6f 69 64 20 61 62 73 46 75 6e 63 28 73 71 6c  void absFunc(sql
0e30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0e40: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
0e50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0e60: 2a 61 72 67 76 29 7b 0a 20 20 61 73 73 65 72 74  *argv){.  assert
0e70: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55  ( argc==1 );.  U
0e80: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0e90: 61 72 67 63 29 3b 0a 20 20 73 77 69 74 63 68 28  argc);.  switch(
0ea0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
0eb0: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a  ype(argv[0]) ){.
0ec0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0ed0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
0ee0: 20 69 36 34 20 69 56 61 6c 20 3d 20 73 71 6c 69   i64 iVal = sqli
0ef0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
0f00: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
0f10: 69 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20  if( iVal<0 ){.  
0f20: 20 20 20 20 20 20 69 66 28 20 69 56 61 6c 3d 3d        if( iVal==
0f30: 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29  SMALLEST_INT64 )
0f40: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
0f50: 4d 50 3a 20 52 2d 33 31 36 37 36 2d 34 35 35 30  MP: R-31676-4550
0f60: 39 20 49 66 20 58 20 69 73 20 74 68 65 20 69 6e  9 If X is the in
0f70: 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33  teger -922337203
0f80: 36 38 35 34 37 37 35 38 30 38 0a 20 20 20 20 20  6854775808.     
0f90: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 62 73       ** then abs
0fa0: 28 58 29 20 74 68 72 6f 77 73 20 61 6e 20 69 6e  (X) throws an in
0fb0: 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 65  teger overflow e
0fc0: 72 72 6f 72 20 73 69 6e 63 65 20 74 68 65 72 65  rror since there
0fd0: 20 69 73 20 6e 6f 0a 20 20 20 20 20 20 20 20 20   is no.         
0fe0: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 70   ** equivalent p
0ff0: 6f 73 69 74 69 76 65 20 36 34 2d 62 69 74 20 74  ositive 64-bit t
1000: 77 6f 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 76 61  wo complement va
1010: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lue. */.        
1020: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1030: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
1040: 22 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f  "integer overflo
1050: 77 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  w", -1);.       
1060: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
1070: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 56 61     }.        iVa
1080: 6c 20 3d 20 2d 69 56 61 6c 3b 0a 20 20 20 20 20  l = -iVal;.     
1090: 20 7d 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65   } .      sqlite
10a0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
10b0: 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20  ontext, iVal);. 
10c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10d0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
10e0: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
10f0: 2f 2a 20 49 4d 50 3a 20 52 2d 33 37 34 33 34 2d  /* IMP: R-37434-
1100: 31 39 39 32 39 20 41 62 73 28 58 29 20 72 65 74  19929 Abs(X) ret
1110: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 58 20 69  urns NULL if X i
1120: 73 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20  s NULL. */.     
1130: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1140: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
1150: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1160: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
1170: 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73  .      /* Becaus
1180: 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  e sqlite3_value_
1190: 64 6f 75 62 6c 65 28 29 20 72 65 74 75 72 6e 73  double() returns
11a0: 20 30 2e 30 20 69 66 20 74 68 65 20 61 72 67 75   0.0 if the argu
11b0: 6d 65 6e 74 20 69 73 20 6e 6f 74 0a 20 20 20 20  ment is not.    
11c0: 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 74    ** something t
11d0: 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6e 76 65  hat can be conve
11e0: 72 74 65 64 20 69 6e 74 6f 20 61 20 6e 75 6d 62  rted into a numb
11f0: 65 72 2c 20 77 65 20 68 61 76 65 3a 0a 20 20 20  er, we have:.   
1200: 20 20 20 2a 2a 20 49 4d 50 3a 20 52 2d 30 31 39     ** IMP: R-019
1210: 39 32 2d 30 30 35 31 39 20 41 62 73 28 58 29 20  92-00519 Abs(X) 
1220: 72 65 74 75 72 6e 73 20 30 2e 30 20 69 66 20 58  returns 0.0 if X
1230: 20 69 73 20 61 20 73 74 72 69 6e 67 20 6f 72 20   is a string or 
1240: 62 6c 6f 62 0a 20 20 20 20 20 20 2a 2a 20 74 68  blob.      ** th
1250: 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  at cannot be con
1260: 76 65 72 74 65 64 20 74 6f 20 61 20 6e 75 6d 65  verted to a nume
1270: 72 69 63 20 76 61 6c 75 65 2e 0a 20 20 20 20 20  ric value..     
1280: 20 2a 2f 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   */.      double
1290: 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   rVal = sqlite3_
12a0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
12b0: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[0]);.      if(
12c0: 20 72 56 61 6c 3c 30 20 29 20 72 56 61 6c 20 3d   rVal<0 ) rVal =
12d0: 20 2d 72 56 61 6c 3b 0a 20 20 20 20 20 20 73 71   -rVal;.      sq
12e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
12f0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 56 61  ble(context, rVa
1300: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1320: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1330: 6f 6e 20 6f 66 20 74 68 65 20 69 6e 73 74 72 28  on of the instr(
1340: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
1350: 2a 20 69 6e 73 74 72 28 68 61 79 73 74 61 63 6b  * instr(haystack
1360: 2c 6e 65 65 64 6c 65 29 20 66 69 6e 64 73 20 74  ,needle) finds t
1370: 68 65 20 66 69 72 73 74 20 6f 63 63 75 72 72 65  he first occurre
1380: 6e 63 65 20 6f 66 20 6e 65 65 64 6c 65 0a 2a 2a  nce of needle.**
1390: 20 69 6e 20 68 61 79 73 74 61 63 6b 20 61 6e 64   in haystack and
13a0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
13b0: 62 65 72 20 6f 66 20 70 72 65 76 69 6f 75 73 20  ber of previous 
13c0: 63 68 61 72 61 63 74 65 72 73 20 70 6c 75 73 20  characters plus 
13d0: 31 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 6e 65  1,.** or 0 if ne
13e0: 65 64 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  edle does not oc
13f0: 63 75 72 20 77 69 74 68 69 6e 20 68 61 79 73 74  cur within hayst
1400: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f  ack..**.** If bo
1410: 74 68 20 68 61 79 73 74 61 63 6b 20 61 6e 64 20  th haystack and 
1420: 6e 65 65 64 6c 65 20 61 72 65 20 42 4c 4f 42 73  needle are BLOBs
1430: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1440: 74 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t is one more th
1450: 61 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  an.** the number
1460: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 61 79   of bytes in hay
1470: 73 74 61 63 6b 20 70 72 69 6f 72 20 74 6f 20 74  stack prior to t
1480: 68 65 20 66 69 72 73 74 20 6f 63 63 75 72 72 65  he first occurre
1490: 6e 63 65 20 6f 66 20 6e 65 65 64 6c 65 2c 0a 2a  nce of needle,.*
14a0: 2a 20 6f 72 20 30 20 69 66 20 6e 65 65 64 6c 65  * or 0 if needle
14b0: 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 69 6e   never occurs in
14c0: 20 68 61 79 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74   haystack..*/.st
14d0: 61 74 69 63 20 76 6f 69 64 20 69 6e 73 74 72 46  atic void instrF
14e0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
14f0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1500: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
1510: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1520: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
1530: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 48  nsigned char *zH
1540: 61 79 73 74 61 63 6b 3b 0a 20 20 63 6f 6e 73 74  aystack;.  const
1550: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1560: 7a 4e 65 65 64 6c 65 3b 0a 20 20 69 6e 74 20 6e  zNeedle;.  int n
1570: 48 61 79 73 74 61 63 6b 3b 0a 20 20 69 6e 74 20  Haystack;.  int 
1580: 6e 4e 65 65 64 6c 65 3b 0a 20 20 69 6e 74 20 74  nNeedle;.  int t
1590: 79 70 65 48 61 79 73 74 61 63 6b 2c 20 74 79 70  ypeHaystack, typ
15a0: 65 4e 65 65 64 6c 65 3b 0a 20 20 69 6e 74 20 4e  eNeedle;.  int N
15b0: 20 3d 20 31 3b 0a 20 20 69 6e 74 20 69 73 54 65   = 1;.  int isTe
15c0: 78 74 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  xt;..  UNUSED_PA
15d0: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
15e0: 20 74 79 70 65 48 61 79 73 74 61 63 6b 20 3d 20   typeHaystack = 
15f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1600: 70 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74  pe(argv[0]);.  t
1610: 79 70 65 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69  ypeNeedle = sqli
1620: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1630: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 74  rgv[1]);.  if( t
1640: 79 70 65 48 61 79 73 74 61 63 6b 3d 3d 53 51 4c  ypeHaystack==SQL
1650: 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 74 79 70 65  ITE_NULL || type
1660: 4e 65 65 64 6c 65 3d 3d 53 51 4c 49 54 45 5f 4e  Needle==SQLITE_N
1670: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
1680: 6e 48 61 79 73 74 61 63 6b 20 3d 20 73 71 6c 69  nHaystack = sqli
1690: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
16a0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 4e 65 65  argv[0]);.  nNee
16b0: 64 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  dle = sqlite3_va
16c0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31  lue_bytes(argv[1
16d0: 5d 29 3b 0a 20 20 69 66 28 20 6e 4e 65 65 64 6c  ]);.  if( nNeedl
16e0: 65 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 74  e>0 ){.    if( t
16f0: 79 70 65 48 61 79 73 74 61 63 6b 3d 3d 53 51 4c  ypeHaystack==SQL
1700: 49 54 45 5f 42 4c 4f 42 20 26 26 20 74 79 70 65  ITE_BLOB && type
1710: 4e 65 65 64 6c 65 3d 3d 53 51 4c 49 54 45 5f 42  Needle==SQLITE_B
1720: 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 7a 48 61  LOB ){.      zHa
1730: 79 73 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  ystack = sqlite3
1740: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
1750: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7a 4e 65 65  [0]);.      zNee
1760: 64 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  dle = sqlite3_va
1770: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d  lue_blob(argv[1]
1780: 29 3b 0a 20 20 20 20 20 20 69 73 54 65 78 74 20  );.      isText 
1790: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
17a0: 20 20 20 20 20 20 7a 48 61 79 73 74 61 63 6b 20        zHaystack 
17b0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
17c0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
17d0: 20 20 20 20 20 7a 4e 65 65 64 6c 65 20 3d 20 73       zNeedle = s
17e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
17f0: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
1800: 20 20 69 73 54 65 78 74 20 3d 20 31 3b 0a 20 20    isText = 1;.  
1810: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 65 65    }.    if( zNee
1820: 64 6c 65 3d 3d 30 20 7c 7c 20 28 6e 48 61 79 73  dle==0 || (nHays
1830: 74 61 63 6b 20 26 26 20 7a 48 61 79 73 74 61 63  tack && zHaystac
1840: 6b 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  k==0) ) return;.
1850: 20 20 20 20 77 68 69 6c 65 28 20 6e 4e 65 65 64      while( nNeed
1860: 6c 65 3c 3d 6e 48 61 79 73 74 61 63 6b 20 26 26  le<=nHaystack &&
1870: 20 6d 65 6d 63 6d 70 28 7a 48 61 79 73 74 61 63   memcmp(zHaystac
1880: 6b 2c 20 7a 4e 65 65 64 6c 65 2c 20 6e 4e 65 65  k, zNeedle, nNee
1890: 64 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  dle)!=0 ){.     
18a0: 20 4e 2b 2b 3b 0a 20 20 20 20 20 20 64 6f 7b 0a   N++;.      do{.
18b0: 20 20 20 20 20 20 20 20 6e 48 61 79 73 74 61 63          nHaystac
18c0: 6b 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 48 61  k--;.        zHa
18d0: 79 73 74 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  ystack++;.      
18e0: 7d 77 68 69 6c 65 28 20 69 73 54 65 78 74 20 26  }while( isText &
18f0: 26 20 28 7a 48 61 79 73 74 61 63 6b 5b 30 5d 26  & (zHaystack[0]&
1900: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20  0xc0)==0x80 );. 
1910: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 65     }.    if( nNe
1920: 65 64 6c 65 3e 6e 48 61 79 73 74 61 63 6b 20 29  edle>nHaystack )
1930: 20 4e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71   N = 0;.  }.  sq
1940: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1950: 28 63 6f 6e 74 65 78 74 2c 20 4e 29 3b 0a 7d 0a  (context, N);.}.
1960: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1970: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 69  ation of the pri
1980: 6e 74 66 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ntf() function..
1990: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
19a0: 72 69 6e 74 66 46 75 6e 63 28 0a 20 20 73 71 6c  rintfFunc(.  sql
19b0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
19c0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
19d0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
19e0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50  ue **argv.){.  P
19f0: 72 69 6e 74 66 41 72 67 75 6d 65 6e 74 73 20 78  rintfArguments x
1a00: 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 73 74 72  ;.  StrAccum str
1a10: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1a20: 7a 46 6f 72 6d 61 74 3b 0a 20 20 69 6e 74 20 6e  zFormat;.  int n
1a30: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1a40: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
1a50: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
1a60: 65 78 74 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  ext);..  if( arg
1a70: 63 3e 3d 31 20 26 26 20 28 7a 46 6f 72 6d 61 74  c>=1 && (zFormat
1a80: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1a90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1aa0: 78 74 28 61 72 67 76 5b 30 5d 29 29 21 3d 30 20  xt(argv[0]))!=0 
1ab0: 29 7b 0a 20 20 20 20 78 2e 6e 41 72 67 20 3d 20  ){.    x.nArg = 
1ac0: 61 72 67 63 2d 31 3b 0a 20 20 20 20 78 2e 6e 55  argc-1;.    x.nU
1ad0: 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 78 2e 61  sed = 0;.    x.a
1ae0: 70 41 72 67 20 3d 20 61 72 67 76 2b 31 3b 0a 20  pArg = argv+1;. 
1af0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
1b00: 75 6d 49 6e 69 74 28 26 73 74 72 2c 20 64 62 2c  umInit(&str, db,
1b10: 20 30 2c 20 30 2c 20 64 62 2d 3e 61 4c 69 6d 69   0, 0, db->aLimi
1b20: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
1b30: 45 4e 47 54 48 5d 29 3b 0a 20 20 20 20 73 74 72  ENGTH]);.    str
1b40: 2e 70 72 69 6e 74 66 46 6c 61 67 73 20 3d 20 53  .printfFlags = S
1b50: 51 4c 49 54 45 5f 50 52 49 4e 54 46 5f 53 51 4c  QLITE_PRINTF_SQL
1b60: 46 55 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65  FUNC;.    sqlite
1b70: 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 7a  3XPrintf(&str, z
1b80: 46 6f 72 6d 61 74 2c 20 26 78 29 3b 0a 20 20 20  Format, &x);.   
1b90: 20 6e 20 3d 20 73 74 72 2e 6e 43 68 61 72 3b 0a   n = str.nChar;.
1ba0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1bb0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1bc0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1bd0: 46 69 6e 69 73 68 28 26 73 74 72 29 2c 20 6e 2c  Finish(&str), n,
1be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bf0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1c00: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1c10: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1c20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ation of the sub
1c30: 73 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  str() function..
1c40: 2a 2a 0a 2a 2a 20 73 75 62 73 74 72 28 78 2c 70  **.** substr(x,p
1c50: 31 2c 70 32 29 20 20 72 65 74 75 72 6e 73 20 70  1,p2)  returns p
1c60: 32 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  2 characters of 
1c70: 78 5b 5d 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  x[] beginning wi
1c80: 74 68 20 70 31 2e 0a 2a 2a 20 70 31 20 69 73 20  th p1..** p1 is 
1c90: 31 2d 69 6e 64 65 78 65 64 2e 20 20 53 6f 20 73  1-indexed.  So s
1ca0: 75 62 73 74 72 28 78 2c 31 2c 31 29 20 72 65 74  ubstr(x,1,1) ret
1cb0: 75 72 6e 73 20 74 68 65 20 66 69 72 73 74 20 63  urns the first c
1cc0: 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 78  haracter.** of x
1cd0: 2e 20 20 49 66 20 78 20 69 73 20 74 65 78 74 2c  .  If x is text,
1ce0: 20 74 68 65 6e 20 77 65 20 61 63 74 75 61 6c 6c   then we actuall
1cf0: 79 20 63 6f 75 6e 74 20 55 54 46 2d 38 20 63 68  y count UTF-8 ch
1d00: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20 49 66 20  aracters..** If 
1d10: 78 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  x is a blob, the
1d20: 6e 20 77 65 20 63 6f 75 6e 74 20 62 79 74 65 73  n we count bytes
1d30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 31 20 69 73  ..**.** If p1 is
1d40: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
1d50: 77 65 20 62 65 67 69 6e 20 61 62 73 28 70 31 29  we begin abs(p1)
1d60: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
1d70: 20 78 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   x[]..**.** If p
1d80: 32 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 72  2 is negative, r
1d90: 65 74 75 72 6e 20 74 68 65 20 70 32 20 63 68 61  eturn the p2 cha
1da0: 72 61 63 74 65 72 73 20 70 72 65 63 65 64 69 6e  racters precedin
1db0: 67 20 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  g p1..*/.static 
1dc0: 76 6f 69 64 20 73 75 62 73 74 72 46 75 6e 63 28  void substrFunc(
1dd0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1de0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
1df0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
1e00: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1e10: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
1e20: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  ned char *z;.  c
1e30: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1e40: 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 6c 65  ar *z2;.  int le
1e50: 6e 3b 0a 20 20 69 6e 74 20 70 30 74 79 70 65 3b  n;.  int p0type;
1e60: 0a 20 20 69 36 34 20 70 31 2c 20 70 32 3b 0a 20  .  i64 p1, p2;. 
1e70: 20 69 6e 74 20 6e 65 67 50 32 20 3d 20 30 3b 0a   int negP2 = 0;.
1e80: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
1e90: 3d 33 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =3 || argc==2 );
1ea0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
1eb0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31  alue_type(argv[1
1ec0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a  ])==SQLITE_NULL.
1ed0: 20 20 20 7c 7c 20 28 61 72 67 63 3d 3d 33 20 26     || (argc==3 &
1ee0: 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
1ef0: 74 79 70 65 28 61 72 67 76 5b 32 5d 29 3d 3d 53  type(argv[2])==S
1f00: 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 20 20 29 7b  QLITE_NULL).  ){
1f10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1f20: 0a 20 20 70 30 74 79 70 65 20 3d 20 73 71 6c 69  .  p0type = sqli
1f30: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1f40: 72 67 76 5b 30 5d 29 3b 0a 20 20 70 31 20 3d 20  rgv[0]);.  p1 = 
1f50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1f60: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66  t(argv[1]);.  if
1f70: 28 20 70 30 74 79 70 65 3d 3d 53 51 4c 49 54 45  ( p0type==SQLITE
1f80: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 6c 65 6e  _BLOB ){.    len
1f90: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1fa0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
1fb0: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
1fc0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
1fd0: 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  [0]);.    if( z=
1fe0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
1ff0: 20 61 73 73 65 72 74 28 20 6c 65 6e 3d 3d 73 71   assert( len==sq
2000: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
2010: 73 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20  s(argv[0]) );.  
2020: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
2030: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2040: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
2050: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
2060: 6e 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  n;.    len = 0;.
2070: 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a      if( p1<0 ){.
2080: 20 20 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20        for(z2=z; 
2090: 2a 7a 32 3b 20 6c 65 6e 2b 2b 29 7b 0a 20 20 20  *z2; len++){.   
20a0: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50       SQLITE_SKIP
20b0: 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 20  _UTF8(z2);.     
20c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
20d0: 64 65 66 20 53 51 4c 49 54 45 5f 53 55 42 53 54  def SQLITE_SUBST
20e0: 52 5f 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 0a  R_COMPATIBILITY.
20f0: 20 20 2f 2a 20 49 66 20 53 55 42 53 54 52 5f 43    /* If SUBSTR_C
2100: 4f 4d 50 41 54 49 42 49 4c 49 54 59 20 69 73 20  OMPATIBILITY is 
2110: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 73 75 62  defined then sub
2120: 73 74 72 28 58 2c 30 2c 4e 29 20 77 6f 72 6b 20  str(X,0,N) work 
2130: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
2140: 20 61 73 20 73 75 62 73 74 72 28 58 2c 31 2c 4e   as substr(X,1,N
2150: 29 20 2d 20 69 74 20 72 65 74 75 72 6e 73 20 74  ) - it returns t
2160: 68 65 20 66 69 72 73 74 20 4e 20 63 68 61 72 61  he first N chara
2170: 63 74 65 72 73 20 6f 66 20 58 2e 20 20 54 68 69  cters of X.  Thi
2180: 73 0a 20 20 2a 2a 20 69 73 20 65 73 73 65 6e 74  s.  ** is essent
2190: 69 61 6c 6c 79 20 61 20 62 61 63 6b 2d 6f 75 74  ially a back-out
21a0: 20 6f 66 20 74 68 65 20 62 75 67 2d 66 69 78 20   of the bug-fix 
21b0: 69 6e 20 63 68 65 63 6b 2d 69 6e 20 5b 35 66 63  in check-in [5fc
21c0: 31 32 35 64 33 36 32 64 66 34 62 38 5d 0a 20 20  125d362df4b8].  
21d0: 2a 2a 20 66 72 6f 6d 20 32 30 30 39 2d 30 32 2d  ** from 2009-02-
21e0: 30 32 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  02 for compatibi
21f0: 6c 69 74 79 20 6f 66 20 61 70 70 6c 69 63 61 74  lity of applicat
2200: 69 6f 6e 73 20 74 68 61 74 20 65 78 70 6c 6f 69  ions that exploi
2210: 74 65 64 20 74 68 65 0a 20 20 2a 2a 20 6f 6c 64  ted the.  ** old
2220: 20 62 75 67 67 79 20 62 65 68 61 76 69 6f 72 2e   buggy behavior.
2230: 20 2a 2f 0a 20 20 69 66 28 20 70 31 3d 3d 30 20   */.  if( p1==0 
2240: 29 20 70 31 20 3d 20 31 3b 20 2f 2a 20 3c 72 64  ) p1 = 1; /* <rd
2250: 61 72 3a 2f 2f 70 72 6f 62 6c 65 6d 2f 36 37 37  ar://problem/677
2260: 38 33 33 39 3e 20 2a 2f 0a 23 65 6e 64 69 66 0a  8339> */.#endif.
2270: 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b    if( argc==3 ){
2280: 0a 20 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65  .    p2 = sqlite
2290: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
22a0: 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 32  [2]);.    if( p2
22b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20 3d  <0 ){.      p2 =
22c0: 20 2d 70 32 3b 0a 20 20 20 20 20 20 6e 65 67 50   -p2;.      negP
22d0: 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2 = 1;.    }.  }
22e0: 65 6c 73 65 7b 0a 20 20 20 20 70 32 20 3d 20 73  else{.    p2 = s
22f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
2300: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
2310: 29 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  )->aLimit[SQLITE
2320: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a  _LIMIT_LENGTH];.
2330: 20 20 7d 0a 20 20 69 66 28 20 70 31 3c 30 20 29    }.  if( p1<0 )
2340: 7b 0a 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b  {.    p1 += len;
2350: 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b  .    if( p1<0 ){
2360: 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b  .      p2 += p1;
2370: 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20  .      if( p2<0 
2380: 29 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  ) p2 = 0;.      
2390: 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  p1 = 0;.    }.  
23a0: 7d 65 6c 73 65 20 69 66 28 20 70 31 3e 30 20 29  }else if( p1>0 )
23b0: 7b 0a 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 65  {.    p1--;.  }e
23c0: 6c 73 65 20 69 66 28 20 70 32 3e 30 20 29 7b 0a  lse if( p2>0 ){.
23d0: 20 20 20 20 70 32 2d 2d 3b 0a 20 20 7d 0a 20 20      p2--;.  }.  
23e0: 69 66 28 20 6e 65 67 50 32 20 29 7b 0a 20 20 20  if( negP2 ){.   
23f0: 20 70 31 20 2d 3d 20 70 32 3b 0a 20 20 20 20 69   p1 -= p2;.    i
2400: 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20  f( p1<0 ){.     
2410: 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20   p2 += p1;.     
2420: 20 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   p1 = 0;.    }. 
2430: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 31 3e   }.  assert( p1>
2440: 3d 30 20 26 26 20 70 32 3e 3d 30 20 29 3b 0a 20  =0 && p2>=0 );. 
2450: 20 69 66 28 20 70 30 74 79 70 65 21 3d 53 51 4c   if( p0type!=SQL
2460: 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
2470: 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 70 31 20  while( *z && p1 
2480: 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ){.      SQLITE_
2490: 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20  SKIP_UTF8(z);.  
24a0: 20 20 20 20 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a      p1--;.    }.
24b0: 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a      for(z2=z; *z
24c0: 32 20 26 26 20 70 32 3b 20 70 32 2d 2d 29 7b 0a  2 && p2; p2--){.
24d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
24e0: 50 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20  P_UTF8(z2);.    
24f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  }.    sqlite3_re
2500: 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74  sult_text64(cont
2510: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a  ext, (char*)z, z
2520: 32 2d 7a 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  2-z, SQLITE_TRAN
2530: 53 49 45 4e 54 2c 0a 20 20 20 20 20 20 20 20 20  SIENT,.         
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
2560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
2570: 70 31 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20 20 20  p1+p2>len ){.   
2580: 20 20 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a     p2 = len-p1;.
2590: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29        if( p2<0 )
25a0: 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   p2 = 0;.    }. 
25b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
25c0: 74 5f 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74  t_blob64(context
25d0: 2c 20 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c  , (char*)&z[p1],
25e0: 20 28 75 36 34 29 70 32 2c 20 53 51 4c 49 54 45   (u64)p2, SQLITE
25f0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
2600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
2610: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2620: 72 6f 75 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e  round() function
2630: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2640: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
2650: 5f 50 4f 49 4e 54 0a 73 74 61 74 69 63 20 76 6f  _POINT.static vo
2660: 69 64 20 72 6f 75 6e 64 46 75 6e 63 28 73 71 6c  id roundFunc(sql
2670: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
2680: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
2690: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
26a0: 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 6e 20  *argv){.  int n 
26b0: 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b  = 0;.  double r;
26c0: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20  .  char *zBuf;. 
26d0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
26e0: 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20   || argc==2 );. 
26f0: 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a   if( argc==2 ){.
2700: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
2710: 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL==sqlite3_val
2720: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29  ue_type(argv[1])
2730: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e   ) return;.    n
2740: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2750: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
2760: 20 20 20 69 66 28 20 6e 3e 33 30 20 29 20 6e 20     if( n>30 ) n 
2770: 3d 20 33 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c  = 30;.    if( n<
2780: 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  0 ) n = 0;.  }. 
2790: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
27a0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
27b0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
27c0: 72 65 74 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71  return;.  r = sq
27d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
27e0: 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f  le(argv[0]);.  /
27f0: 2a 20 49 66 20 59 3d 3d 30 20 61 6e 64 20 58 20  * If Y==0 and X 
2800: 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 36 34  will fit in a 64
2810: 2d 62 69 74 20 69 6e 74 2c 0a 20 20 2a 2a 20 68  -bit int,.  ** h
2820: 61 6e 64 6c 65 20 74 68 65 20 72 6f 75 6e 64 69  andle the roundi
2830: 6e 67 20 64 69 72 65 63 74 6c 79 2c 0a 20 20 2a  ng directly,.  *
2840: 2a 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 20  * otherwise use 
2850: 70 72 69 6e 74 66 2e 0a 20 20 2a 2f 0a 20 20 69  printf..  */.  i
2860: 66 28 20 6e 3d 3d 30 20 26 26 20 72 3e 3d 30 20  f( n==0 && r>=0 
2870: 26 26 20 72 3c 4c 41 52 47 45 53 54 5f 49 4e 54  && r<LARGEST_INT
2880: 36 34 2d 31 20 29 7b 0a 20 20 20 20 72 20 3d 20  64-1 ){.    r = 
2890: 28 64 6f 75 62 6c 65 29 28 28 73 71 6c 69 74 65  (double)((sqlite
28a0: 5f 69 6e 74 36 34 29 28 72 2b 30 2e 35 29 29 3b  _int64)(r+0.5));
28b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
28c0: 30 20 26 26 20 72 3c 30 20 26 26 20 28 2d 72 29  0 && r<0 && (-r)
28d0: 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2d 31  <LARGEST_INT64-1
28e0: 20 29 7b 0a 20 20 20 20 72 20 3d 20 2d 28 64 6f   ){.    r = -(do
28f0: 75 62 6c 65 29 28 28 73 71 6c 69 74 65 5f 69 6e  uble)((sqlite_in
2900: 74 36 34 29 28 28 2d 72 29 2b 30 2e 35 29 29 3b  t64)((-r)+0.5));
2910: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 42  .  }else{.    zB
2920: 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  uf = sqlite3_mpr
2930: 69 6e 74 66 28 22 25 2e 2a 66 22 2c 6e 2c 72 29  intf("%.*f",n,r)
2940: 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d  ;.    if( zBuf==
2950: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2960: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
2970: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
2980: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2990: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 41    }.    sqlite3A
29a0: 74 6f 46 28 7a 42 75 66 2c 20 26 72 2c 20 73 71  toF(zBuf, &r, sq
29b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
29c0: 75 66 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  uf), SQLITE_UTF8
29d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
29e0: 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 20  ree(zBuf);.  }. 
29f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2a00: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
2a10: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r);.}.#endif../*
2a20: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
2a30: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
2a40: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4d  e using sqlite3M
2a50: 61 6c 6c 6f 63 28 29 2e 20 49 66 20 74 68 65 0a  alloc(). If the.
2a60: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ** allocation fa
2a70: 69 6c 73 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  ils, call 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 29 20 74 6f 20 6e 6f 74 69 66 79  omem() to notify
2aa0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
2ab0: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6d 61 6c   handle that mal
2ac0: 6c 6f 63 28 29 20 68 61 73 20 66 61 69 6c 65 64  loc() has failed
2ad0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
2ae0: 2e 0a 2a 2a 20 49 66 20 6e 42 79 74 65 20 69 73  ..** If nByte is
2af0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2b00: 20 6d 61 78 69 6d 75 6d 20 73 74 72 69 6e 67 20   maximum string 
2b10: 6f 72 20 62 6c 6f 62 20 6c 65 6e 67 74 68 2c 20  or blob length, 
2b20: 74 68 65 6e 0a 2a 2a 20 72 61 69 73 65 20 61 6e  then.** raise an
2b30: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 65   SQLITE_TOOBIG e
2b40: 78 63 65 70 74 69 6f 6e 20 61 6e 64 20 72 65 74  xception and ret
2b50: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
2b60: 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 74 65 78  tic void *contex
2b70: 74 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f  tMalloc(sqlite3_
2b80: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2b90: 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
2ba0: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74  char *z;.  sqlit
2bb0: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
2bc0: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
2bd0: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61  le(context);.  a
2be0: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29  ssert( nByte>0 )
2bf0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 42  ;.  testcase( nB
2c00: 79 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  yte==db->aLimit[
2c10: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
2c20: 47 54 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61  GTH] );.  testca
2c30: 73 65 28 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61  se( nByte==db->a
2c40: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
2c50: 49 54 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a  IT_LENGTH]+1 );.
2c60: 20 20 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e    if( nByte>db->
2c70: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2c80: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
2c90: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2ca0: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
2cb0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7a 20 3d  ontext);.    z =
2cc0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2cd0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   z = sqlite3Mall
2ce0: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  oc(nByte);.    i
2cf0: 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 73  f( !z ){.      s
2d00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2d10: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
2d20: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2d30: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
2d40: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2d50: 6e 20 6f 66 20 74 68 65 20 75 70 70 65 72 28 29  n of the upper()
2d60: 20 61 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c   and lower() SQL
2d70: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
2d80: 74 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72  tatic void upper
2d90: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
2da0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
2db0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
2dc0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
2dd0: 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f    char *z1;.  co
2de0: 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
2df0: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53  int i, n;.  UNUS
2e00: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
2e10: 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72  c);.  z2 = (char
2e20: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2e30: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
2e40: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
2e50: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
2e60: 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  );.  /* Verify t
2e70: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
2e80: 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f  _bytes() does no
2e90: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  t invalidate the
2ea0: 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72   _text() pointer
2eb0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32   */.  assert( z2
2ec0: 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  ==(char*)sqlite3
2ed0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
2ee0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32  [0]) );.  if( z2
2ef0: 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e   ){.    z1 = con
2f00: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
2f10: 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b  xt, ((i64)n)+1);
2f20: 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20  .    if( z1 ){. 
2f30: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2f40: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2f50: 20 7a 31 5b 69 5d 20 3d 20 28 63 68 61 72 29 73   z1[i] = (char)s
2f60: 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 7a 32  qlite3Toupper(z2
2f70: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
2f80: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2f90: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
2fa0: 20 7a 31 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f   z1, n, sqlite3_
2fb0: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
2fc0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
2fd0: 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33  owerFunc(sqlite3
2fe0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
2ff0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
3000: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
3010: 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a  v){.  char *z1;.
3020: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
3030: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
3040: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3050: 28 61 72 67 63 29 3b 0a 20 20 7a 32 20 3d 20 28  (argc);.  z2 = (
3060: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
3070: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
3080: 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
3090: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
30a0: 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69  v[0]);.  /* Veri
30b0: 66 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  fy that the call
30c0: 20 74 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65   to _bytes() doe
30d0: 73 20 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65  s not invalidate
30e0: 20 74 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69   the _text() poi
30f0: 6e 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  nter */.  assert
3100: 28 20 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c  ( z2==(char*)sql
3110: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
3120: 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66  argv[0]) );.  if
3130: 28 20 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d  ( z2 ){.    z1 =
3140: 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63   contextMalloc(c
3150: 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29  ontext, ((i64)n)
3160: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20  +1);.    if( z1 
3170: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
3180: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3190: 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20 73 71 6c       z1[i] = sql
31a0: 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 32 5b 69  ite3Tolower(z2[i
31b0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
31c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
31d0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
31e0: 31 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72  1, n, sqlite3_fr
31f0: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ee);.    }.  }.}
3200: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 66 75 6e  ../*.** Some fun
3210: 63 74 69 6f 6e 73 20 6c 69 6b 65 20 43 4f 41 4c  ctions like COAL
3220: 45 53 43 45 28 29 20 61 6e 64 20 49 46 4e 55 4c  ESCE() and IFNUL
3230: 4c 28 29 20 61 6e 64 20 55 4e 4c 49 4b 45 4c 59  L() and UNLIKELY
3240: 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  () are implement
3250: 65 64 0a 2a 2a 20 61 73 20 56 44 42 45 20 63 6f  ed.** as VDBE co
3260: 64 65 20 73 6f 20 74 68 61 74 20 75 6e 75 73 65  de so that unuse
3270: 64 20 61 72 67 75 6d 65 6e 74 20 76 61 6c 75 65  d argument value
3280: 73 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  s do not have to
3290: 20 62 65 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2a   be computed..**
32a0: 20 48 6f 77 65 76 65 72 2c 20 77 65 20 73 74 69   However, we sti
32b0: 6c 6c 20 6e 65 65 64 20 73 6f 6d 65 20 6b 69 6e  ll need some kin
32c0: 64 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 69 6d  d of function im
32d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  plementation for
32e0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
32f0: 73 20 69 6e 20 74 68 65 20 66 75 6e 63 74 69 6f  s in the functio
3300: 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6e 6f  n table.  The no
3310: 6f 70 46 75 6e 63 20 6d 61 63 72 6f 20 70 72 6f  opFunc macro pro
3320: 76 69 64 65 73 20 74 68 69 73 2e 0a 2a 2a 20 6e  vides this..** n
3330: 6f 6f 70 46 75 6e 63 20 77 69 6c 6c 20 6e 65 76  oopFunc will nev
3340: 65 72 20 62 65 20 63 61 6c 6c 65 64 20 73 6f 20  er be called so 
3350: 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  it doesn't matte
3360: 72 20 77 68 61 74 20 74 68 65 20 69 6d 70 6c 65  r what the imple
3370: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 2e  mentation.** is.
3380: 20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65    We might as we
3390: 6c 6c 20 75 73 65 20 74 68 65 20 22 76 65 72 73  ll use the "vers
33a0: 69 6f 6e 28 29 22 20 66 75 6e 63 74 69 6f 6e 20  ion()" function 
33b0: 61 73 20 61 20 73 75 62 73 74 69 74 75 74 65 2e  as a substitute.
33c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 6e 6f 6f 70  .*/.#define noop
33d0: 46 75 6e 63 20 76 65 72 73 69 6f 6e 46 75 6e 63  Func versionFunc
33e0: 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
33f0: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 6e 65 76 65   function - neve
3400: 72 20 63 61 6c 6c 65 64 20 2a 2f 0a 0a 2f 2a 0a  r called */../*.
3410: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3420: 6e 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20  n of random().  
3430: 52 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20  Return a random 
3440: 69 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74  integer.  .*/.st
3450: 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d  atic void random
3460: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
3470: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3480: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
3490: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
34a0: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
34b0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 3b   sqlite_int64 r;
34c0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
34d0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
34e0: 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74  tUsed2);.  sqlit
34f0: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
3500: 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
3510: 69 66 28 20 72 3c 30 20 29 7b 0a 20 20 20 20 2f  if( r<0 ){.    /
3520: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 70 72 65  * We need to pre
3530: 76 65 6e 74 20 61 20 72 61 6e 64 6f 6d 20 6e 75  vent a random nu
3540: 6d 62 65 72 20 6f 66 20 30 78 38 30 30 30 30 30  mber of 0x800000
3550: 30 30 30 30 30 30 30 30 30 30 20 0a 20 20 20 20  0000000000 .    
3560: 2a 2a 20 28 6f 72 20 2d 39 32 32 33 33 37 32 30  ** (or -92233720
3570: 33 36 38 35 34 37 37 35 38 30 38 29 20 73 69 6e  36854775808) sin
3580: 63 65 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 61  ce when you do a
3590: 62 73 28 29 20 6f 66 20 74 68 61 74 0a 20 20 20  bs() of that.   
35a0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 79 6f   ** number of yo
35b0: 75 20 67 65 74 20 74 68 65 20 73 61 6d 65 20 76  u get the same v
35c0: 61 6c 75 65 20 62 61 63 6b 20 61 67 61 69 6e 2e  alue back again.
35d0: 20 20 54 6f 20 64 6f 20 74 68 69 73 0a 20 20 20    To do this.   
35e0: 20 2a 2a 20 69 6e 20 61 20 77 61 79 20 74 68 61   ** in a way tha
35f0: 74 20 69 73 20 74 65 73 74 61 62 6c 65 2c 20 6d  t is testable, m
3600: 61 73 6b 20 74 68 65 20 73 69 67 6e 20 62 69 74  ask the sign bit
3610: 20 6f 66 66 20 6f 66 20 6e 65 67 61 74 69 76 65   off of negative
3620: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 2c 20  .    ** values, 
3630: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 70  resulting in a p
3640: 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2e 20 20  ositive value.  
3650: 54 68 65 6e 20 74 61 6b 65 20 74 68 65 20 0a 20  Then take the . 
3660: 20 20 20 2a 2a 20 32 73 20 63 6f 6d 70 6c 65 6d     ** 2s complem
3670: 65 6e 74 20 6f 66 20 74 68 61 74 20 70 6f 73 69  ent of that posi
3680: 74 69 76 65 20 76 61 6c 75 65 2e 20 20 54 68 65  tive value.  The
3690: 20 65 6e 64 20 72 65 73 75 6c 74 20 63 61 6e 0a   end result can.
36a0: 20 20 20 20 2a 2a 20 74 68 65 72 65 66 6f 72 65      ** therefore
36b0: 20 62 65 20 6e 6f 20 6c 65 73 73 20 74 68 61 6e   be no less than
36c0: 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37   -92233720368547
36d0: 37 35 38 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20  75807..    */.  
36e0: 20 20 72 20 3d 20 2d 28 72 20 26 20 4c 41 52 47    r = -(r & LARG
36f0: 45 53 54 5f 49 4e 54 36 34 29 3b 0a 20 20 7d 0a  EST_INT64);.  }.
3700: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3710: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
3720: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  r);.}../*.** Imp
3730: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72  lementation of r
3740: 61 6e 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52  andomblob(N).  R
3750: 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62  eturn a random b
3760: 6c 6f 62 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e  lob.** that is N
3770: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a   bytes long..*/.
3780: 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64  static void rand
3790: 6f 6d 42 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65  omBlob(.  sqlite
37a0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
37b0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
37c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
37d0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
37e0: 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  n;.  unsigned ch
37f0: 61 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  ar *p;.  assert(
3800: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
3810: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
3820: 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  rgc);.  n = sqli
3830: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
3840: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c  gv[0]);.  if( n<
3850: 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 31 3b 0a  1 ){.    n = 1;.
3860: 20 20 7d 0a 20 20 70 20 3d 20 63 6f 6e 74 65 78    }.  p = contex
3870: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
3880: 20 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   n);.  if( p ){.
3890: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
38a0: 6f 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a 20 20  omness(n, p);.  
38b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
38c0: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28  _blob(context, (
38d0: 63 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71 6c 69  char*)p, n, sqli
38e0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d  te3_free);.  }.}
38f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
3900: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
3910: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
3920: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
3930: 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
3940: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
3950: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
3960: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
3970: 64 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  d() API function
3980: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3990: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
39a0: 69 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  id(.  sqlite3_co
39b0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
39c0: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20  .  int NotUsed, 
39d0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
39e0: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
39f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
3a00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
3a10: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
3a20: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
3a30: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
3a40: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20  NotUsed2);.  /* 
3a50: 49 4d 50 3a 20 52 2d 35 31 35 31 33 2d 31 32 30  IMP: R-51513-120
3a60: 32 36 20 54 68 65 20 6c 61 73 74 5f 69 6e 73 65  26 The last_inse
3a70: 72 74 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66  rt_rowid() SQL f
3a80: 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 20 20 2a  unction is a.  *
3a90: 2a 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  * wrapper around
3aa0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73   the sqlite3_las
3ab0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
3ac0: 20 43 2f 43 2b 2b 20 69 6e 74 65 72 66 61 63 65   C/C++ interface
3ad0: 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  .  ** function. 
3ae0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  */.  sqlite3_res
3af0: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
3b00: 74 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  t, sqlite3_last_
3b10: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29  insert_rowid(db)
3b20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
3b30: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
3b40: 65 20 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20  e changes() SQL 
3b50: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
3b60: 49 4d 50 3a 20 52 2d 36 32 30 37 33 2d 31 31 32  IMP: R-62073-112
3b70: 30 39 20 54 68 65 20 63 68 61 6e 67 65 73 28 29  09 The changes()
3b80: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73   SQL function is
3b90: 20 61 20 77 72 61 70 70 65 72 0a 2a 2a 20 61 72   a wrapper.** ar
3ba0: 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33  ound the sqlite3
3bb0: 5f 63 68 61 6e 67 65 73 28 29 20 43 2f 43 2b 2b  _changes() C/C++
3bc0: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 68 65   function and he
3bd0: 6e 63 65 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  nce follows the 
3be0: 73 61 6d 65 0a 2a 2a 20 72 75 6c 65 73 20 66 6f  same.** rules fo
3bf0: 72 20 63 6f 75 6e 74 69 6e 67 20 63 68 61 6e 67  r counting chang
3c00: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
3c10: 69 64 20 63 68 61 6e 67 65 73 28 0a 20 20 73 71  id changes(.  sq
3c20: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3c30: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
3c40: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
3c50: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
3c60: 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  2.){.  sqlite3 *
3c70: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
3c80: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
3c90: 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45  ontext);.  UNUSE
3ca0: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
3cb0: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
3cc0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
3cd0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
3ce0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
3cf0: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  b));.}../*.** Im
3d00: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
3d10: 74 68 65 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  the total_change
3d20: 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  s() SQL function
3d30: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
3d40: 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 73 61  lue is.** the sa
3d50: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
3d60: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
3d70: 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  ) API function..
3d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
3d90: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 0a 20 20  otal_changes(.  
3da0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3db0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
3dc0: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
3dd0: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
3de0: 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ed2.){.  sqlite3
3df0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
3e00: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
3e10: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55  (context);.  UNU
3e20: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
3e30: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
3e40: 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  );.  /* IMP: R-5
3e50: 32 37 35 36 2d 34 31 39 39 33 20 54 68 69 73 20  2756-41993 This 
3e60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
3e70: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65  apper around the
3e80: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 6f  .  ** sqlite3_to
3e90: 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 43 2f  tal_changes() C/
3ea0: 43 2b 2b 20 69 6e 74 65 72 66 61 63 65 2e 20 2a  C++ interface. *
3eb0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
3ec0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
3ed0: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
3ee0: 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f  anges(db));.}../
3ef0: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
3f00: 20 64 65 66 69 6e 69 6e 67 20 68 6f 77 20 74 6f   defining how to
3f10: 20 64 6f 20 47 4c 4f 42 2d 73 74 79 6c 65 20 63   do GLOB-style c
3f20: 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f 0a 73  omparisons..*/.s
3f30: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
3f40: 6f 20 7b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c  o {.  u8 matchAl
3f50: 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22  l;          /* "
3f60: 2a 22 20 6f 72 20 22 25 22 20 2a 2f 0a 20 20 75  *" or "%" */.  u
3f70: 38 20 6d 61 74 63 68 4f 6e 65 3b 20 20 20 20 20  8 matchOne;     
3f80: 20 20 20 20 20 2f 2a 20 22 3f 22 20 6f 72 20 22       /* "?" or "
3f90: 5f 22 20 2a 2f 0a 20 20 75 38 20 6d 61 74 63 68  _" */.  u8 match
3fa0: 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Set;          /*
3fb0: 20 22 5b 22 20 6f 72 20 30 20 2a 2f 0a 20 20 75   "[" or 0 */.  u
3fc0: 38 20 6e 6f 43 61 73 65 3b 20 20 20 20 20 20 20  8 noCase;       
3fd0: 20 20 20 20 20 2f 2a 20 74 72 75 65 20 74 6f 20       /* true to 
3fe0: 69 67 6e 6f 72 65 20 63 61 73 65 20 64 69 66 66  ignore case diff
3ff0: 65 72 65 6e 63 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  erences */.};../
4000: 2a 0a 2a 2a 20 46 6f 72 20 4c 49 4b 45 20 61 6e  *.** For LIKE an
4010: 64 20 47 4c 4f 42 20 6d 61 74 63 68 69 6e 67 20  d GLOB matching 
4020: 6f 6e 20 45 42 43 44 49 43 20 6d 61 63 68 69 6e  on EBCDIC machin
4030: 65 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  es, assume that 
4040: 65 76 65 72 79 0a 2a 2a 20 63 68 61 72 61 63 74  every.** charact
4050: 65 72 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  er is exactly on
4060: 65 20 62 79 74 65 20 69 6e 20 73 69 7a 65 2e 20  e byte in size. 
4070: 20 41 6c 73 6f 2c 20 70 72 6f 76 64 65 20 74 68   Also, provde th
4080: 65 20 55 74 66 38 52 65 61 64 28 29 0a 2a 2a 20  e Utf8Read().** 
4090: 6d 61 63 72 6f 20 66 6f 72 20 66 61 73 74 20 72  macro for fast r
40a0: 65 61 64 69 6e 67 20 6f 66 20 74 68 65 20 6e 65  eading of the ne
40b0: 78 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  xt character in 
40c0: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
40d0: 77 68 65 72 65 0a 2a 2a 20 74 68 65 20 6e 65 78  where.** the nex
40e0: 74 20 63 68 61 72 61 63 74 65 72 20 69 73 20 41  t character is A
40f0: 53 43 49 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  SCII..*/.#if def
4100: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 42 43 44  ined(SQLITE_EBCD
4110: 49 43 29 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  IC).# define sql
4120: 69 74 65 33 55 74 66 38 52 65 61 64 28 41 29 20  ite3Utf8Read(A) 
4130: 20 20 20 20 20 20 20 28 2a 28 28 2a 41 29 2b 2b         (*((*A)++
4140: 29 29 0a 23 20 64 65 66 69 6e 65 20 55 74 66 38  )).# define Utf8
4150: 52 65 61 64 28 41 29 20 20 20 20 20 20 20 20 20  Read(A)         
4160: 20 20 20 20 20 20 28 2a 28 41 2b 2b 29 29 0a 23        (*(A++)).#
4170: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 74  else.# define Ut
4180: 66 38 52 65 61 64 28 41 29 20 20 20 20 20 20 20  f8Read(A)       
4190: 20 20 20 20 20 20 20 20 28 41 5b 30 5d 3c 30 78          (A[0]<0x
41a0: 38 30 3f 2a 28 41 2b 2b 29 3a 73 71 6c 69 74 65  80?*(A++):sqlite
41b0: 33 55 74 66 38 52 65 61 64 28 26 41 29 29 0a 23  3Utf8Read(&A)).#
41c0: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f  endif..static co
41d0: 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61  nst struct compa
41e0: 72 65 49 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f 20  reInfo globInfo 
41f0: 3d 20 7b 20 27 2a 27 2c 20 27 3f 27 2c 20 27 5b  = { '*', '?', '[
4200: 27 2c 20 30 20 7d 3b 0a 2f 2a 20 54 68 65 20 63  ', 0 };./* The c
4210: 6f 72 72 65 63 74 20 53 51 4c 2d 39 32 20 62 65  orrect SQL-92 be
4220: 68 61 76 69 6f 72 20 69 73 20 66 6f 72 20 74 68  havior is for th
4230: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
4240: 74 6f 20 69 67 6e 6f 72 65 0a 2a 2a 20 63 61 73  to ignore.** cas
4250: 65 2e 20 20 54 68 75 73 20 20 27 61 27 20 4c 49  e.  Thus  'a' LI
4260: 4b 45 20 27 41 27 20 77 6f 75 6c 64 20 62 65 20  KE 'A' would be 
4270: 74 72 75 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20  true. */.static 
4280: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d  const struct com
4290: 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66  pareInfo likeInf
42a0: 6f 4e 6f 72 6d 20 3d 20 7b 20 27 25 27 2c 20 27  oNorm = { '%', '
42b0: 5f 27 2c 20 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a  _',   0, 1 };./*
42c0: 20 49 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f   If SQLITE_CASE_
42d0: 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 20 69  SENSITIVE_LIKE i
42e0: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
42f0: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
4300: 72 0a 2a 2a 20 69 73 20 63 61 73 65 20 73 65 6e  r.** is case sen
4310: 73 69 74 69 76 65 20 63 61 75 73 69 6e 67 20 27  sitive causing '
4320: 61 27 20 4c 49 4b 45 20 27 41 27 20 74 6f 20 62  a' LIKE 'A' to b
4330: 65 20 66 61 6c 73 65 20 2a 2f 0a 73 74 61 74 69  e false */.stati
4340: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63  c const struct c
4350: 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49  ompareInfo likeI
4360: 6e 66 6f 41 6c 74 20 3d 20 7b 20 27 25 27 2c 20  nfoAlt = { '%', 
4370: 27 5f 27 2c 20 20 20 30 2c 20 30 20 7d 3b 0a 0a  '_',   0, 0 };..
4380: 2f 2a 0a 2a 2a 20 50 6f 73 73 69 62 6c 65 20 65  /*.** Possible e
4390: 72 72 6f 72 20 72 65 74 75 72 6e 73 20 66 72 6f  rror returns fro
43a0: 6d 20 70 61 74 74 65 72 6e 4d 61 74 63 68 28 29  m patternMatch()
43b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
43c0: 54 45 5f 4d 41 54 43 48 20 20 20 20 20 20 20 20  TE_MATCH        
43d0: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53       0.#define S
43e0: 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 20 20 20  QLITE_NOMATCH   
43f0: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
4400: 65 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43  e SQLITE_NOWILDC
4410: 41 52 44 4d 41 54 43 48 20 20 20 32 0a 0a 2f 2a  ARDMATCH   2../*
4420: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
4430: 55 54 46 2d 38 20 73 74 72 69 6e 67 73 20 66 6f  UTF-8 strings fo
4440: 72 20 65 71 75 61 6c 69 74 79 20 77 68 65 72 65  r equality where
4450: 20 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e   the first strin
4460: 67 20 69 73 0a 2a 2a 20 61 20 47 4c 4f 42 20 6f  g is.** a GLOB o
4470: 72 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f  r LIKE expressio
4480: 6e 2e 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65  n.  Return value
4490: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49  s:.**.**    SQLI
44a0: 54 45 5f 4d 41 54 43 48 3a 20 20 20 20 20 20 20  TE_MATCH:       
44b0: 20 20 20 20 20 4d 61 74 63 68 0a 2a 2a 20 20 20       Match.**   
44c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3a   SQLITE_NOMATCH:
44d0: 20 20 20 20 20 20 20 20 20 20 4e 6f 20 6d 61 74            No mat
44e0: 63 68 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ch.**    SQLITE_
44f0: 4e 4f 57 49 4c 44 43 41 52 44 4d 41 54 43 48 3a  NOWILDCARDMATCH:
4500: 20 20 4e 6f 20 6d 61 74 63 68 20 69 6e 20 73 70    No match in sp
4510: 69 74 65 20 6f 66 20 68 61 76 69 6e 67 20 2a 20  ite of having * 
4520: 6f 72 20 25 20 77 69 6c 64 63 61 72 64 73 2e 0a  or % wildcards..
4530: 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72  **.** Globbing r
4540: 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ules:.**.**     
4550: 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68   '*'       Match
4560: 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
4570: 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
4580: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
4590: 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20 20  *      '?'      
45a0: 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c 79   Matches exactly
45b0: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a   one character..
45c0: 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20  **.**     [...] 
45d0: 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65       Matches one
45e0: 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20   character from 
45f0: 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73  the enclosed lis
4600: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
4610: 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65 72         character
4620: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e  s..**.**     [^.
4630: 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20  ..]     Matches 
4640: 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f  one character no
4650: 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65  t in the enclose
4660: 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  d list..**.** Wi
4670: 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e 64  th the [...] and
4680: 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e 67   [^...] matching
4690: 2c 20 61 20 27 5d 27 20 63 68 61 72 61 63 74 65  , a ']' characte
46a0: 72 20 63 61 6e 20 62 65 20 69 6e 63 6c 75 64 65  r can be include
46b0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74  d.** in the list
46c0: 20 62 79 20 6d 61 6b 69 6e 67 20 69 74 20 74 68   by making it th
46d0: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
46e0: 72 20 61 66 74 65 72 20 27 5b 27 20 6f 72 20 27  r after '[' or '
46f0: 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65 20  ^'.  A.** range 
4700: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 63 61  of characters ca
4710: 6e 20 62 65 20 73 70 65 63 69 66 69 65 64 20 75  n be specified u
4720: 73 69 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d 70  sing '-'.  Examp
4730: 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20 6d  le:.** "[a-z]" m
4740: 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c  atches any singl
4750: 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65 74  e lower-case let
4760: 74 65 72 2e 20 20 54 6f 20 6d 61 74 63 68 20 61  ter.  To match a
4770: 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69 74   '-', make.** it
4780: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
4790: 74 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  ter in the list.
47a0: 0a 2a 2a 0a 2a 2a 20 4c 69 6b 65 20 6d 61 74 63  .**.** Like matc
47b0: 68 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 20 0a  hing rules:.** .
47c0: 2a 2a 20 20 20 20 20 20 27 25 27 20 20 20 20 20  **      '%'     
47d0: 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65    Matches any se
47e0: 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f  quence of zero o
47f0: 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72  r more character
4800: 73 0a 2a 2a 0a 2a 2a 2a 20 20 20 20 20 27 5f 27  s.**.***     '_'
4810: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
4820: 6e 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  ny one character
4830: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 63 20 20  .**.**      Ec  
4840: 20 20 20 20 20 20 57 68 65 72 65 20 45 20 69 73        Where E is
4850: 20 74 68 65 20 22 65 73 63 22 20 63 68 61 72 61   the "esc" chara
4860: 63 74 65 72 20 61 6e 64 20 63 20 69 73 20 61 6e  cter and c is an
4870: 79 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  y other.**      
4880: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63            charac
4890: 74 65 72 2c 20 69 6e 63 6c 75 64 69 6e 67 20 27  ter, including '
48a0: 25 27 2c 20 27 5f 27 2c 20 61 6e 64 20 65 73 63  %', '_', and esc
48b0: 2c 20 6d 61 74 63 68 20 65 78 61 63 74 6c 79 20  , match exactly 
48c0: 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d  c..**.** The com
48d0: 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 69  ments within thi
48e0: 73 20 72 6f 75 74 69 6e 65 20 75 73 75 61 6c 6c  s routine usuall
48f0: 79 20 61 73 73 75 6d 65 20 67 6c 6f 62 20 6d 61  y assume glob ma
4900: 74 63 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  tching..**.** Th
4910: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4920: 75 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74  ually quick, but
4930: 20 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20   can be N**2 in 
4940: 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a  the worst case..
4950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4960: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 0a 20 20  tternCompare(.  
4970: 63 6f 6e 73 74 20 75 38 20 2a 7a 50 61 74 74 65  const u8 *zPatte
4980: 72 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rn,             
4990: 20 2f 2a 20 54 68 65 20 67 6c 6f 62 20 70 61 74   /* The glob pat
49a0: 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tern */.  const 
49b0: 75 38 20 2a 7a 53 74 72 69 6e 67 2c 20 20 20 20  u8 *zString,    
49c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
49d0: 65 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70  e string to comp
49e0: 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  are against the 
49f0: 67 6c 6f 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  glob */.  const 
4a00: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
4a10: 66 6f 20 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49 6e  fo *pInfo, /* In
4a20: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4a30: 68 6f 77 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  how to do the co
4a40: 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 6d  mpare */.  u32 m
4a50: 61 74 63 68 4f 74 68 65 72 20 20 20 20 20 20 20  atchOther       
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4a70: 68 65 20 65 73 63 61 70 65 20 63 68 61 72 20 28  he escape char (
4a80: 4c 49 4b 45 29 20 6f 72 20 27 5b 27 20 28 47 4c  LIKE) or '[' (GL
4a90: 4f 42 29 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  OB) */.){.  u32 
4aa0: 63 2c 20 63 32 3b 20 20 20 20 20 20 20 20 20 20  c, c2;          
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ac0: 4e 65 78 74 20 70 61 74 74 65 72 6e 20 61 6e 64  Next pattern and
4ad0: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63 68   input string ch
4ae0: 61 72 73 20 2a 2f 0a 20 20 75 33 32 20 6d 61 74  ars */.  u32 mat
4af0: 63 68 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d  chOne = pInfo->m
4b00: 61 74 63 68 4f 6e 65 3b 20 20 2f 2a 20 22 3f 22  atchOne;  /* "?"
4b10: 20 6f 72 20 22 5f 22 20 2a 2f 0a 20 20 75 33 32   or "_" */.  u32
4b20: 20 6d 61 74 63 68 41 6c 6c 20 3d 20 70 49 6e 66   matchAll = pInf
4b30: 6f 2d 3e 6d 61 74 63 68 41 6c 6c 3b 20 20 2f 2a  o->matchAll;  /*
4b40: 20 22 2a 22 20 6f 72 20 22 25 22 20 2a 2f 0a 20   "*" or "%" */. 
4b50: 20 75 38 20 6e 6f 43 61 73 65 20 3d 20 70 49 6e   u8 noCase = pIn
4b60: 66 6f 2d 3e 6e 6f 43 61 73 65 3b 20 20 20 20 20  fo->noCase;     
4b70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70    /* True if upp
4b80: 65 72 63 61 73 65 3d 3d 6c 6f 77 65 72 63 61 73  ercase==lowercas
4b90: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  e */.  const u8 
4ba0: 2a 7a 45 73 63 61 70 65 64 20 3d 20 30 3b 20 20  *zEscaped = 0;  
4bb0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 70          /* One p
4bc0: 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 73 63  ast the last esc
4bd0: 61 70 65 64 20 69 6e 70 75 74 20 63 68 61 72 20  aped input char 
4be0: 2a 2f 0a 20 20 0a 20 20 77 68 69 6c 65 28 20 28  */.  .  while( (
4bf0: 63 20 3d 20 55 74 66 38 52 65 61 64 28 7a 50 61  c = Utf8Read(zPa
4c00: 74 74 65 72 6e 29 29 21 3d 30 20 29 7b 0a 20 20  ttern))!=0 ){.  
4c10: 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 41 6c    if( c==matchAl
4c20: 6c 20 29 7b 20 20 2f 2a 20 4d 61 74 63 68 20 22  l ){  /* Match "
4c30: 2a 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 53  *" */.      /* S
4c40: 6b 69 70 20 6f 76 65 72 20 6d 75 6c 74 69 70 6c  kip over multipl
4c50: 65 20 22 2a 22 20 63 68 61 72 61 63 74 65 72 73  e "*" characters
4c60: 20 69 6e 20 74 68 65 20 70 61 74 74 65 72 6e 2e   in the pattern.
4c70: 20 20 49 66 20 74 68 65 72 65 0a 20 20 20 20 20    If there.     
4c80: 20 2a 2a 20 61 72 65 20 61 6c 73 6f 20 22 3f 22   ** are also "?"
4c90: 20 63 68 61 72 61 63 74 65 72 73 2c 20 73 6b 69   characters, ski
4ca0: 70 20 74 68 6f 73 65 20 61 73 20 77 65 6c 6c 2c  p those as well,
4cb0: 20 62 75 74 20 63 6f 6e 73 75 6d 65 20 61 0a 20   but consume a. 
4cc0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63       ** single c
4cd0: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
4ce0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 66 6f 72  input string for
4cf0: 20 65 61 63 68 20 22 3f 22 20 73 6b 69 70 70 65   each "?" skippe
4d00: 64 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  d */.      while
4d10: 28 20 28 63 3d 55 74 66 38 52 65 61 64 28 7a 50  ( (c=Utf8Read(zP
4d20: 61 74 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74 63  attern)) == matc
4d30: 68 41 6c 6c 20 7c 7c 20 63 20 3d 3d 20 6d 61 74  hAll || c == mat
4d40: 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  chOne ){.       
4d50: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65   if( c==matchOne
4d60: 20 26 26 20 73 71 6c 69 74 65 33 55 74 66 38 52   && sqlite3Utf8R
4d70: 65 61 64 28 26 7a 53 74 72 69 6e 67 29 3d 3d 30  ead(&zString)==0
4d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
4d90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49  turn SQLITE_NOWI
4da0: 4c 44 43 41 52 44 4d 41 54 43 48 3b 0a 20 20 20  LDCARDMATCH;.   
4db0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4dc0: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
4dd0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4de0: 53 51 4c 49 54 45 5f 4d 41 54 43 48 3b 20 20 20  SQLITE_MATCH;   
4df0: 2f 2a 20 22 2a 22 20 61 74 20 74 68 65 20 65 6e  /* "*" at the en
4e00: 64 20 6f 66 20 74 68 65 20 70 61 74 74 65 72 6e  d of the pattern
4e10: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
4e20: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 6d    }else if( c==m
4e30: 61 74 63 68 4f 74 68 65 72 20 29 7b 0a 20 20 20  atchOther ){.   
4e40: 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e       if( pInfo->
4e50: 6d 61 74 63 68 53 65 74 3d 3d 30 20 29 7b 0a 20  matchSet==0 ){. 
4e60: 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
4e70: 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50  ite3Utf8Read(&zP
4e80: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20  attern);.       
4e90: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65     if( c==0 ) re
4ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49  turn SQLITE_NOWI
4eb0: 4c 44 43 41 52 44 4d 41 54 43 48 3b 0a 20 20 20  LDCARDMATCH;.   
4ec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4ed0: 20 20 20 20 20 20 2f 2a 20 22 5b 2e 2e 2e 5d 22        /* "[...]"
4ee0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4ef0: 6c 6f 77 73 20 74 68 65 20 22 2a 22 2e 20 20 57  lows the "*".  W
4f00: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 73  e have to do a s
4f10: 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  low.          **
4f20: 20 72 65 63 75 72 73 69 76 65 20 73 65 61 72 63   recursive searc
4f30: 68 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20  h in this case, 
4f40: 62 75 74 20 69 74 20 69 73 20 61 6e 20 75 6e 75  but it is an unu
4f50: 73 75 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20  sual case. */.  
4f60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
4f70: 6d 61 74 63 68 4f 74 68 65 72 3c 30 78 38 30 20  matchOther<0x80 
4f80: 29 3b 20 20 2f 2a 20 27 5b 27 20 69 73 20 61 20  );  /* '[' is a 
4f90: 73 69 6e 67 6c 65 2d 62 79 74 65 20 63 68 61 72  single-byte char
4fa0: 61 63 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  acter */.       
4fb0: 20 20 20 77 68 69 6c 65 28 20 2a 7a 53 74 72 69     while( *zStri
4fc0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ng ){.          
4fd0: 20 20 69 6e 74 20 62 4d 61 74 63 68 20 3d 20 70    int bMatch = p
4fe0: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 26 7a  atternCompare(&z
4ff0: 50 61 74 74 65 72 6e 5b 2d 31 5d 2c 7a 53 74 72  Pattern[-1],zStr
5000: 69 6e 67 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f  ing,pInfo,matchO
5010: 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ther);.         
5020: 20 20 20 69 66 28 20 62 4d 61 74 63 68 21 3d 53     if( bMatch!=S
5030: 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 20 29 20  QLITE_NOMATCH ) 
5040: 72 65 74 75 72 6e 20 62 4d 61 74 63 68 3b 0a 20  return bMatch;. 
5050: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
5060: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 53 74 72  E_SKIP_UTF8(zStr
5070: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ing);.          
5080: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  }.          retu
5090: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44  rn SQLITE_NOWILD
50a0: 43 41 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 20  CARDMATCH;.     
50b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
50c0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
50d0: 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 20 63 20  oint variable c 
50e0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72  contains the fir
50f0: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
5100: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 74  the.      ** pat
5110: 74 65 72 6e 20 73 74 72 69 6e 67 20 70 61 73 74  tern string past
5120: 20 74 68 65 20 22 2a 22 2e 20 20 53 65 61 72 63   the "*".  Searc
5130: 68 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73  h in the input s
5140: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tring for the.  
5150: 20 20 20 20 2a 2a 20 66 69 72 73 74 20 6d 61 74      ** first mat
5160: 63 68 69 6e 67 20 63 68 61 72 61 63 74 65 72 20  ching character 
5170: 61 6e 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  and recursively 
5180: 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 6d 61 74  continue the mat
5190: 63 68 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  ch from.      **
51a0: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 20 20 20   that point..   
51b0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
51c0: 6f 72 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73  or a case-insens
51d0: 69 74 69 76 65 20 73 65 61 72 63 68 2c 20 73 65  itive search, se
51e0: 74 20 76 61 72 69 61 62 6c 65 20 63 78 20 74 6f  t variable cx to
51f0: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
5200: 20 20 20 20 20 20 2a 2a 20 63 20 62 75 74 20 69        ** c but i
5210: 6e 20 74 68 65 20 6f 74 68 65 72 20 63 61 73 65  n the other case
5220: 20 61 6e 64 20 73 65 61 72 63 68 20 74 68 65 20   and search the 
5230: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 66 6f 72  input string for
5240: 20 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a   either.      **
5250: 20 63 20 6f 72 20 63 78 2e 0a 20 20 20 20 20 20   c or cx..      
5260: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 63 3c 3d  */.      if( c<=
5270: 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0x80 ){.        
5280: 63 68 61 72 20 7a 53 74 6f 70 5b 33 5d 3b 0a 20  char zStop[3];. 
5290: 20 20 20 20 20 20 20 69 6e 74 20 62 4d 61 74 63         int bMatc
52a0: 68 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  h;.        if( n
52b0: 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  oCase ){.       
52c0: 20 20 20 7a 53 74 6f 70 5b 30 5d 20 3d 20 73 71     zStop[0] = sq
52d0: 6c 69 74 65 33 54 6f 75 70 70 65 72 28 63 29 3b  lite3Toupper(c);
52e0: 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 6f 70  .          zStop
52f0: 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c  [1] = sqlite3Tol
5300: 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20 20  ower(c);.       
5310: 20 20 20 7a 53 74 6f 70 5b 32 5d 20 3d 20 30 3b     zStop[2] = 0;
5320: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
5330: 20 20 20 20 20 20 20 20 20 20 7a 53 74 6f 70 5b            zStop[
5340: 30 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  0] = c;.        
5350: 20 20 7a 53 74 6f 70 5b 31 5d 20 3d 20 30 3b 0a    zStop[1] = 0;.
5360: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5370: 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20    while(1){.    
5380: 20 20 20 20 20 20 7a 53 74 72 69 6e 67 20 2b 3d        zString +=
5390: 20 73 74 72 63 73 70 6e 28 28 63 6f 6e 73 74 20   strcspn((const 
53a0: 63 68 61 72 2a 29 7a 53 74 72 69 6e 67 2c 20 7a  char*)zString, z
53b0: 53 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Stop);.         
53c0: 20 69 66 28 20 7a 53 74 72 69 6e 67 5b 30 5d 3d   if( zString[0]=
53d0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
53e0: 20 20 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b        zString++;
53f0: 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74 63  .          bMatc
5400: 68 20 3d 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  h = patternCompa
5410: 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72  re(zPattern,zStr
5420: 69 6e 67 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f  ing,pInfo,matchO
5430: 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ther);.         
5440: 20 69 66 28 20 62 4d 61 74 63 68 21 3d 53 51 4c   if( bMatch!=SQL
5450: 49 54 45 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65  ITE_NOMATCH ) re
5460: 74 75 72 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20  turn bMatch;.   
5470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5480: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
5490: 62 4d 61 74 63 68 3b 0a 20 20 20 20 20 20 20 20  bMatch;.        
54a0: 77 68 69 6c 65 28 20 28 63 32 20 3d 20 55 74 66  while( (c2 = Utf
54b0: 38 52 65 61 64 28 7a 53 74 72 69 6e 67 29 29 21  8Read(zString))!
54c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
54d0: 69 66 28 20 63 32 21 3d 63 20 29 20 63 6f 6e 74  if( c2!=c ) cont
54e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
54f0: 62 4d 61 74 63 68 20 3d 20 70 61 74 74 65 72 6e  bMatch = pattern
5500: 43 6f 6d 70 61 72 65 28 7a 50 61 74 74 65 72 6e  Compare(zPattern
5510: 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 6d  ,zString,pInfo,m
5520: 61 74 63 68 4f 74 68 65 72 29 3b 0a 20 20 20 20  atchOther);.    
5530: 20 20 20 20 20 20 69 66 28 20 62 4d 61 74 63 68        if( bMatch
5540: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48  !=SQLITE_NOMATCH
5550: 20 29 20 72 65 74 75 72 6e 20 62 4d 61 74 63 68   ) return bMatch
5560: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5570: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
5580: 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41   SQLITE_NOWILDCA
5590: 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 7d 0a 20  RDMATCH;.    }. 
55a0: 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f     if( c==matchO
55b0: 74 68 65 72 20 29 7b 0a 20 20 20 20 20 20 69 66  ther ){.      if
55c0: 28 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65  ( pInfo->matchSe
55d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
55e0: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  c = sqlite3Utf8R
55f0: 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a  ead(&zPattern);.
5600: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
5610: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5620: 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  _NOMATCH;.      
5630: 20 20 7a 45 73 63 61 70 65 64 20 3d 20 7a 50 61    zEscaped = zPa
5640: 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  ttern;.      }el
5650: 73 65 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20  se{.        u32 
5660: 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
5670: 20 20 20 20 20 69 6e 74 20 73 65 65 6e 20 3d 20       int seen = 
5680: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
5690: 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  nvert = 0;.     
56a0: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74     c = sqlite3Ut
56b0: 66 38 52 65 61 64 28 26 7a 53 74 72 69 6e 67 29  f8Read(&zString)
56c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
56d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
56e0: 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 20 20  TE_NOMATCH;.    
56f0: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
5700: 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74 65  Utf8Read(&zPatte
5710: 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rn);.        if(
5720: 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20   c2=='^' ){.    
5730: 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31        invert = 1
5740: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d  ;.          c2 =
5750: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
5760: 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20  (&zPattern);.   
5770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5780: 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20  f( c2==']' ){.  
5790: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
57a0: 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  ]' ) seen = 1;. 
57b0: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
57c0: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
57d0: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
57e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c    }.        whil
57f0: 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27  e( c2 && c2!=']'
5800: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
5810: 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 50 61  ( c2=='-' && zPa
5820: 74 74 65 72 6e 5b 30 5d 21 3d 27 5d 27 20 26 26  ttern[0]!=']' &&
5830: 20 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d 30 20   zPattern[0]!=0 
5840: 26 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a  && prior_c>0 ){.
5850: 20 20 20 20 20 20 20 20 20 20 20 20 63 32 20 3d              c2 =
5860: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
5870: 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20  (&zPattern);.   
5880: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
5890: 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
58a0: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
58b0: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
58c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
58d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
58e0: 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a     if( c==c2 ){.
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
5900: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
5910: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5920: 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a    prior_c = c2;.
5930: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5940: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
5950: 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74  e3Utf8Read(&zPat
5960: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tern);.        }
5970: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
5980: 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e  =0 || (seen ^ in
5990: 76 65 72 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  vert)==0 ){.    
59a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
59b0: 49 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 20  ITE_NOMATCH;.   
59c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
59d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
59e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 32 20 3d 20  .    }.    c2 = 
59f0: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
5a00: 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 63 32  );.    if( c==c2
5a10: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5a20: 20 69 66 28 20 6e 6f 43 61 73 65 20 20 26 26 20   if( noCase  && 
5a30: 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63  sqlite3Tolower(c
5a40: 29 3d 3d 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65  )==sqlite3Tolowe
5a50: 72 28 63 32 29 20 26 26 20 63 3c 30 78 38 30 20  r(c2) && c<0x80 
5a60: 26 26 20 63 32 3c 30 78 38 30 20 29 7b 0a 20 20  && c2<0x80 ){.  
5a70: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
5a80: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 6d    }.    if( c==m
5a90: 61 74 63 68 4f 6e 65 20 26 26 20 7a 50 61 74 74  atchOne && zPatt
5aa0: 65 72 6e 21 3d 7a 45 73 63 61 70 65 64 20 26 26  ern!=zEscaped &&
5ab0: 20 63 32 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75   c2!=0 ) continu
5ac0: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
5ad0: 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20  LITE_NOMATCH;.  
5ae0: 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72  }.  return *zStr
5af0: 69 6e 67 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f  ing==0 ? SQLITE_
5b00: 4d 41 54 43 48 20 3a 20 53 51 4c 49 54 45 5f 4e  MATCH : SQLITE_N
5b10: 4f 4d 41 54 43 48 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  OMATCH;.}../*.**
5b20: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 74 72   The sqlite3_str
5b30: 67 6c 6f 62 28 29 20 69 6e 74 65 72 66 61 63 65  glob() interface
5b40: 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 61  .  Return 0 on a
5b50: 20 6d 61 74 63 68 20 28 6c 69 6b 65 20 73 74 72   match (like str
5b60: 63 6d 70 28 29 29 20 61 6e 64 0a 2a 2a 20 6e 6f  cmp()) and.** no
5b70: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  n-zero if there 
5b80: 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a  is no match..*/.
5b90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 72 67  int sqlite3_strg
5ba0: 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lob(const char *
5bb0: 7a 47 6c 6f 62 50 61 74 74 65 72 6e 2c 20 63 6f  zGlobPattern, co
5bc0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 69 6e  nst char *zStrin
5bd0: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 74  g){.  return pat
5be0: 74 65 72 6e 43 6f 6d 70 61 72 65 28 28 75 38 2a  ternCompare((u8*
5bf0: 29 7a 47 6c 6f 62 50 61 74 74 65 72 6e 2c 20 28  )zGlobPattern, (
5c00: 75 38 2a 29 7a 53 74 72 69 6e 67 2c 20 26 67 6c  u8*)zString, &gl
5c10: 6f 62 49 6e 66 6f 2c 20 27 5b 27 29 3b 0a 7d 0a  obInfo, '[');.}.
5c20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ./*.** The sqlit
5c30: 65 33 5f 73 74 72 6c 69 6b 65 28 29 20 69 6e 74  e3_strlike() int
5c40: 65 72 66 61 63 65 2e 20 20 52 65 74 75 72 6e 20  erface.  Return 
5c50: 30 20 6f 6e 20 61 20 6d 61 74 63 68 20 61 6e 64  0 on a match and
5c60: 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 0a 2a 2a   non-zero for.**
5c70: 20 61 20 6d 69 73 73 20 2d 20 6c 69 6b 65 20 73   a miss - like s
5c80: 74 72 63 6d 70 28 29 2e 0a 2a 2f 0a 69 6e 74 20  trcmp()..*/.int 
5c90: 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
5ca0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
5cb0: 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  tern, const char
5cc0: 20 2a 7a 53 74 72 2c 20 75 6e 73 69 67 6e 65 64   *zStr, unsigned
5cd0: 20 69 6e 74 20 65 73 63 29 7b 0a 20 20 72 65 74   int esc){.  ret
5ce0: 75 72 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  urn patternCompa
5cf0: 72 65 28 28 75 38 2a 29 7a 50 61 74 74 65 72 6e  re((u8*)zPattern
5d00: 2c 20 28 75 38 2a 29 7a 53 74 72 2c 20 26 6c 69  , (u8*)zStr, &li
5d10: 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 65 73 63 29  keInfoNorm, esc)
5d20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  ;.}../*.** Count
5d30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
5d40: 69 6d 65 73 20 74 68 61 74 20 74 68 65 20 4c 49  imes that the LI
5d50: 4b 45 20 6f 70 65 72 61 74 6f 72 20 28 6f 72 20  KE operator (or 
5d60: 47 4c 4f 42 20 77 68 69 63 68 20 69 73 0a 2a 2a  GLOB which is.**
5d70: 20 6a 75 73 74 20 61 20 76 61 72 69 61 74 69 6f   just a variatio
5d80: 6e 20 6f 66 20 4c 49 4b 45 29 20 67 65 74 73 20  n of LIKE) gets 
5d90: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
5da0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
5db0: 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  g.** only..*/.#i
5dc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
5dd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b  .int sqlite3_lik
5de0: 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  e_count = 0;.#en
5df0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  dif.../*.** Impl
5e00: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
5e10: 65 20 6c 69 6b 65 28 29 20 53 51 4c 20 66 75 6e  e like() SQL fun
5e20: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
5e30: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73  ction implements
5e40: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2d 69 6e  .** the build-in
5e50: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 20   LIKE operator. 
5e60: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
5e70: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
5e80: 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ion is the.** pa
5e90: 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 73 65  ttern and the se
5ea0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
5eb0: 20 74 68 65 20 73 74 72 69 6e 67 2e 20 20 53 6f   the string.  So
5ec0: 2c 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  , the SQL statem
5ed0: 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ents:.**.**     
5ee0: 20 20 41 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a    A LIKE B.**.**
5ef0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
5f00: 61 73 20 6c 69 6b 65 28 42 2c 41 29 2e 0a 2a 2a  as like(B,A)..**
5f10: 0a 2a 2a 20 54 68 69 73 20 73 61 6d 65 20 66 75  .** This same fu
5f20: 6e 63 74 69 6f 6e 20 28 77 69 74 68 20 61 20 64  nction (with a d
5f30: 69 66 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 65  ifferent compare
5f40: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 29 20  Info structure) 
5f50: 63 6f 6d 70 75 74 65 73 0a 2a 2a 20 74 68 65 20  computes.** the 
5f60: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  GLOB operator..*
5f70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69  /.static void li
5f80: 6b 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  keFunc(.  sqlite
5f90: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
5fa0: 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
5fb0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
5fc0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
5fd0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5fe0: 72 20 2a 7a 41 2c 20 2a 7a 42 3b 0a 20 20 75 33  r *zA, *zB;.  u3
5ff0: 32 20 65 73 63 61 70 65 3b 0a 20 20 69 6e 74 20  2 escape;.  int 
6000: 6e 50 61 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  nPat;.  sqlite3 
6010: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
6020: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
6030: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 74 72 75  context);.  stru
6040: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a  ct compareInfo *
6050: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f  pInfo = sqlite3_
6060: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
6070: 74 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  t);..#ifdef SQLI
6080: 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d  TE_LIKE_DOESNT_M
6090: 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 69 66 28  ATCH_BLOBS.  if(
60a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
60b0: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
60c0: 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 20 7c 7c 20  LITE_BLOB.   || 
60d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
60e0: 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c  pe(argv[1])==SQL
60f0: 49 54 45 5f 42 4c 4f 42 0a 20 20 29 7b 0a 23 69  ITE_BLOB.  ){.#i
6100: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
6110: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b  .    sqlite3_lik
6120: 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  e_count++;.#endi
6130: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  f.    sqlite3_re
6140: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
6150: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
6160: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a  ;.  }.#endif.  z
6170: 42 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  B = sqlite3_valu
6180: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
6190: 0a 20 20 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f  .  zA = sqlite3_
61a0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
61b0: 31 5d 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74  1]);..  /* Limit
61c0: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
61d0: 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20  he LIKE or GLOB 
61e0: 70 61 74 74 65 72 6e 20 74 6f 20 61 76 6f 69 64  pattern to avoid
61f0: 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f   problems.  ** o
6200: 66 20 64 65 65 70 20 72 65 63 75 72 73 69 6f 6e  f deep recursion
6210: 20 61 6e 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f   and N*N behavio
6220: 72 20 69 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70  r in patternComp
6230: 61 72 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 50  are()..  */.  nP
6240: 61 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  at = sqlite3_val
6250: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
6260: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
6270: 50 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  Pat==db->aLimit[
6280: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
6290: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
62a0: 5d 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ] );.  testcase(
62b0: 20 6e 50 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69   nPat==db->aLimi
62c0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
62d0: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
62e0: 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  TH]+1 );.  if( n
62f0: 50 61 74 20 3e 20 64 62 2d 3e 61 4c 69 6d 69 74  Pat > db->aLimit
6300: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  [SQLITE_LIMIT_LI
6310: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
6320: 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  H] ){.    sqlite
6330: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
6340: 6f 6e 74 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72  ontext, "LIKE or
6350: 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f   GLOB pattern to
6360: 6f 20 63 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b  o complex", -1);
6370: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6380: 0a 20 20 61 73 73 65 72 74 28 20 7a 42 3d 3d 73  .  assert( zB==s
6390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
63a0: 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f  t(argv[0]) );  /
63b0: 2a 20 45 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e  * Encoding did n
63c0: 6f 74 20 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20  ot change */..  
63d0: 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20  if( argc==3 ){. 
63e0: 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65     /* The escape
63f0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
6400: 67 20 6d 75 73 74 20 63 6f 6e 73 69 73 74 20 6f  g must consist o
6410: 66 20 61 20 73 69 6e 67 6c 65 20 55 54 46 2d 38  f a single UTF-8
6420: 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20   character..    
6430: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
6440: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20  turn an error.. 
6450: 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20     */.    const 
6460: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
6470: 45 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Esc = sqlite3_va
6480: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d  lue_text(argv[2]
6490: 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 73 63 3d  );.    if( zEsc=
64a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
64b0: 20 69 66 28 20 73 71 6c 69 74 65 33 55 74 66 38   if( sqlite3Utf8
64c0: 43 68 61 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a  CharLen((char*)z
64d0: 45 73 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20  Esc, -1)!=1 ){. 
64e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
64f0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
6500: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 45  t, .          "E
6510: 53 43 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e  SCAPE expression
6520: 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c   must be a singl
6530: 65 20 63 68 61 72 61 63 74 65 72 22 2c 20 2d 31  e character", -1
6540: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
6550: 0a 20 20 20 20 7d 0a 20 20 20 20 65 73 63 61 70  .    }.    escap
6560: 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  e = sqlite3Utf8R
6570: 65 61 64 28 26 7a 45 73 63 29 3b 0a 20 20 7d 65  ead(&zEsc);.  }e
6580: 6c 73 65 7b 0a 20 20 20 20 65 73 63 61 70 65 20  lse{.    escape 
6590: 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65  = pInfo->matchSe
65a0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20  t;.  }.  if( zA 
65b0: 26 26 20 7a 42 20 29 7b 0a 23 69 66 64 65 66 20  && zB ){.#ifdef 
65c0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
65d0: 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75  sqlite3_like_cou
65e0: 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt++;.#endif.   
65f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6600: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20  int(context,.   
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6620: 20 20 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72     patternCompar
6630: 65 28 7a 42 2c 20 7a 41 2c 20 70 49 6e 66 6f 2c  e(zB, zA, pInfo,
6640: 20 65 73 63 61 70 65 29 3d 3d 53 51 4c 49 54 45   escape)==SQLITE
6650: 5f 4d 41 54 43 48 29 3b 0a 20 20 7d 0a 7d 0a 0a  _MATCH);.  }.}..
6660: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
6670: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c  tion of the NULL
6680: 49 46 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e  IF(x,y) function
6690: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
66a0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
66b0: 67 75 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72  gument if the ar
66c0: 67 75 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66  guments are diff
66d0: 65 72 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75  erent.  The resu
66e0: 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  lt is NULL if th
66f0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61  e.** arguments a
6700: 72 65 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68  re equal to each
6710: 20 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   other..*/.stati
6720: 63 20 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e  c void nullifFun
6730: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
6740: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6750: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20   int NotUsed,.  
6760: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6770: 61 72 67 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  argv.){.  CollSe
6780: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
6790: 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71  e3GetFuncCollSeq
67a0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55  (context);.  UNU
67b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
67c0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 73 71  tUsed);.  if( sq
67d0: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
67e0: 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d  argv[0], argv[1]
67f0: 2c 20 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20  , pColl)!=0 ){. 
6800: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6810: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
6820: 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d   argv[0]);.  }.}
6830: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6840: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  tation of the sq
6850: 6c 69 74 65 5f 76 65 72 73 69 6f 6e 28 29 20 66  lite_version() f
6860: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65  unction.  The re
6870: 73 75 6c 74 20 69 73 20 74 68 65 20 76 65 72 73  sult is the vers
6880: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 53 51  ion.** of the SQ
6890: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 74 68 61  Lite library tha
68a0: 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2f  t is running..*/
68b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72  .static void ver
68c0: 73 69 6f 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69  sionFunc(.  sqli
68d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
68e0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55  text,.  int NotU
68f0: 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  sed,.  sqlite3_v
6900: 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a  alue **NotUsed2.
6910: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
6920: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
6930: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20  NotUsed2);.  /* 
6940: 49 4d 50 3a 20 52 2d 34 38 36 39 39 2d 34 38 36  IMP: R-48699-486
6950: 31 37 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  17 This function
6960: 20 69 73 20 61 6e 20 53 51 4c 20 77 72 61 70 70   is an SQL wrapp
6970: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20  er around the.  
6980: 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  ** sqlite3_libve
6990: 72 73 69 6f 6e 28 29 20 43 2d 69 6e 74 65 72 66  rsion() C-interf
69a0: 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ace. */.  sqlite
69b0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
69c0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c  ntext, sqlite3_l
69d0: 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 2d 31 2c  ibversion(), -1,
69e0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
69f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
6a00: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
6a10: 73 71 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64  sqlite_source_id
6a20: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  () function. The
6a30: 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 74 72   result is a str
6a40: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e  ing.** that iden
6a50: 74 69 66 69 65 73 20 74 68 65 20 70 61 72 74 69  tifies the parti
6a60: 63 75 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f 66  cular version of
6a70: 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   the source code
6a80: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 0a 2a   used to build.*
6a90: 2a 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61  * SQLite..*/.sta
6aa0: 74 69 63 20 76 6f 69 64 20 73 6f 75 72 63 65 69  tic void sourcei
6ab0: 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  dFunc(.  sqlite3
6ac0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6ad0: 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64  t,.  int NotUsed
6ae0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
6af0: 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a  e **NotUsed2.){.
6b00: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6b10: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
6b20: 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50  Used2);.  /* IMP
6b30: 3a 20 52 2d 32 34 34 37 30 2d 33 31 31 33 36 20  : R-24470-31136 
6b40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6b50: 20 61 6e 20 53 51 4c 20 77 72 61 70 70 65 72 20   an SQL wrapper 
6b60: 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20  around the.  ** 
6b70: 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
6b80: 28 29 20 43 20 69 6e 74 65 72 66 61 63 65 2e 20  () C interface. 
6b90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  */.  sqlite3_res
6ba0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
6bb0: 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  , sqlite3_source
6bc0: 69 64 28 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45  id(), -1, SQLITE
6bd0: 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a  _STATIC);.}../*.
6be0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
6bf0: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
6c00: 6c 6f 67 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  log() function. 
6c10: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
6c20: 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c  er around.** sql
6c30: 69 74 65 33 5f 6c 6f 67 28 29 2e 20 20 54 68 65  ite3_log().  The
6c40: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
6c50: 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 75 6e 63   NULL.  The func
6c60: 74 69 6f 6e 20 65 78 69 73 74 73 20 70 75 72 65  tion exists pure
6c70: 6c 79 20 66 6f 72 0a 2a 2a 20 69 74 73 20 73 69  ly for.** its si
6c80: 64 65 2d 65 66 66 65 63 74 73 2e 0a 2a 2f 0a 73  de-effects..*/.s
6c90: 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c 6f  tatic void errlo
6ca0: 67 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  gFunc(.  sqlite3
6cb0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6cc0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
6cd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6ce0: 2a 61 72 67 76 0a 29 7b 0a 20 20 55 4e 55 53 45  *argv.){.  UNUSE
6cf0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
6d00: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
6d10: 4d 45 54 45 52 28 63 6f 6e 74 65 78 74 29 3b 0a  METER(context);.
6d20: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 73 71    sqlite3_log(sq
6d30: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
6d40: 61 72 67 76 5b 30 5d 29 2c 20 22 25 73 22 2c 20  argv[0]), "%s", 
6d50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6d60: 78 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 7d 0a  xt(argv[1]));.}.
6d70: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
6d80: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c  ation of the sql
6d90: 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  ite_compileoptio
6da0: 6e 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f  n_used() functio
6db0: 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  n..** The result
6dc0: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74   is an integer t
6dd0: 68 61 74 20 69 64 65 6e 74 69 66 69 65 73 20 69  hat identifies i
6de0: 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f  f the compiler o
6df0: 70 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65  ption.** was use
6e00: 64 20 74 6f 20 62 75 69 6c 64 20 53 51 4c 69 74  d to build SQLit
6e10: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
6e20: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
6e30: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 73 74  EOPTION_DIAGS.st
6e40: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 69 6c  atic void compil
6e50: 65 6f 70 74 69 6f 6e 75 73 65 64 46 75 6e 63 28  eoptionusedFunc(
6e60: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
6e70: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
6e80: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
6e90: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
6ea0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6eb0: 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 61 73 73  *zOptName;.  ass
6ec0: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a  ert( argc==1 );.
6ed0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6ee0: 45 52 28 61 72 67 63 29 3b 0a 20 20 2f 2a 20 49  ER(argc);.  /* I
6ef0: 4d 50 3a 20 52 2d 33 39 35 36 34 2d 33 36 33 30  MP: R-39564-3630
6f00: 35 20 54 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d  5 The sqlite_com
6f10: 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28  pileoption_used(
6f20: 29 20 53 51 4c 0a 20 20 2a 2a 20 66 75 6e 63 74  ) SQL.  ** funct
6f30: 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
6f40: 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69   around the sqli
6f50: 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  te3_compileoptio
6f60: 6e 5f 75 73 65 64 28 29 20 43 2f 43 2b 2b 0a 20  n_used() C/C++. 
6f70: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
6f80: 2a 2f 0a 20 20 69 66 28 20 28 7a 4f 70 74 4e 61  */.  if( (zOptNa
6f90: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
6fa0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6fb0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 21 3d  text(argv[0]))!=
6fc0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
6fd0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
6fe0: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d  ext, sqlite3_com
6ff0: 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28  pileoption_used(
7000: 7a 4f 70 74 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  zOptName));.  }.
7010: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7020: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
7030: 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a  PTION_DIAGS */..
7040: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
7050: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
7060: 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  te_compileoption
7070: 5f 67 65 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  _get() function.
7080: 20 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20   .** The result 
7090: 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  is a string that
70a0: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
70b0: 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73  compiler options
70c0: 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20 62 75 69   .** used to bui
70d0: 6c 64 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  ld SQLite..*/.#i
70e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
70f0: 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
7100: 44 49 41 47 53 0a 73 74 61 74 69 63 20 76 6f 69  DIAGS.static voi
7110: 64 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67  d compileoptiong
7120: 65 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  etFunc(.  sqlite
7130: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7140: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
7150: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
7160: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
7170: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  n;.  assert( arg
7180: 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==1 );.  UNUSED
7190: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
71a0: 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34  ;.  /* IMP: R-04
71b0: 39 32 32 2d 32 34 30 37 36 20 54 68 65 20 73 71  922-24076 The sq
71c0: 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  lite_compileopti
71d0: 6f 6e 5f 67 65 74 28 29 20 53 51 4c 20 66 75 6e  on_get() SQL fun
71e0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20  ction.  ** is a 
71f0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
7200: 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  he sqlite3_compi
7210: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20 43  leoption_get() C
7220: 2f 43 2b 2b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  /C++ function.. 
7230: 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65   */.  n = sqlite
7240: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
7250: 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  [0]);.  sqlite3_
7260: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
7270: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d  ext, sqlite3_com
7280: 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 6e  pileoption_get(n
7290: 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ), -1, SQLITE_ST
72a0: 41 54 49 43 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ATIC);.}.#endif 
72b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
72c0: 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
72d0: 47 53 20 2a 2f 0a 0a 2f 2a 20 41 72 72 61 79 20  GS */../* Array 
72e0: 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 66  for converting f
72f0: 72 6f 6d 20 68 61 6c 66 2d 62 79 74 65 73 20 28  rom half-bytes (
7300: 6e 79 62 62 6c 65 73 29 20 69 6e 74 6f 20 41 53  nybbles) into AS
7310: 43 49 49 20 68 65 78 0a 2a 2a 20 64 69 67 69 74  CII hex.** digit
7320: 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s. */.static con
7330: 73 74 20 63 68 61 72 20 68 65 78 64 69 67 69 74  st char hexdigit
7340: 73 5b 5d 20 3d 20 7b 0a 20 20 27 30 27 2c 20 27  s[] = {.  '0', '
7350: 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34  1', '2', '3', '4
7360: 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27  ', '5', '6', '7'
7370: 2c 0a 20 20 27 38 27 2c 20 27 39 27 2c 20 27 41  ,.  '8', '9', 'A
7380: 27 2c 20 27 42 27 2c 20 27 43 27 2c 20 27 44 27  ', 'B', 'C', 'D'
7390: 2c 20 27 45 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a  , 'E', 'F' .};..
73a0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
73b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 51 55 4f 54  tion of the QUOT
73c0: 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  E() function.  T
73d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  his function tak
73e0: 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61  es a single.** a
73f0: 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65  rgument.  If the
7400: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 75 6d   argument is num
7410: 65 72 69 63 2c 20 74 68 65 20 72 65 74 75 72 6e  eric, the return
7420: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
7430: 6d 65 20 61 73 0a 2a 2a 20 74 68 65 20 61 72 67  me as.** the arg
7440: 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61  ument.  If the a
7450: 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c  rgument is NULL,
7460: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
7470: 65 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 0a  e is the string.
7480: 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20 4f 74 68 65  ** "NULL".  Othe
7490: 72 77 69 73 65 2c 20 74 68 65 20 61 72 67 75 6d  rwise, the argum
74a0: 65 6e 74 20 69 73 20 65 6e 63 6c 6f 73 65 64 20  ent is enclosed 
74b0: 69 6e 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73  in single quotes
74c0: 20 77 69 74 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d   with.** single-
74d0: 71 75 6f 74 65 20 65 73 63 61 70 65 73 2e 0a 2a  quote escapes..*
74e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 71 75  /.static void qu
74f0: 6f 74 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  oteFunc(sqlite3_
7500: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
7510: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
7520: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
7530: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ){.  assert( arg
7540: 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==1 );.  UNUSED
7550: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
7560: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
7570: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
7580: 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63  rgv[0]) ){.    c
7590: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
75a0: 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  : {.      double
75b0: 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 63   r1, r2;.      c
75c0: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
75d0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
75e0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
75f0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71  gv[0]);.      sq
7600: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
7610: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
7620: 66 2c 20 22 25 21 2e 31 35 67 22 2c 20 72 31 29  f, "%!.15g", r1)
7630: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  ;.      sqlite3A
7640: 74 6f 46 28 7a 42 75 66 2c 20 26 72 32 2c 20 32  toF(zBuf, &r2, 2
7650: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  0, SQLITE_UTF8);
7660: 0a 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72  .      if( r1!=r
7670: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 ){.        sql
7680: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
7690: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
76a0: 2c 20 22 25 21 2e 32 30 65 22 2c 20 72 31 29 3b  , "%!.20e", r1);
76b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
76c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
76d0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  xt(context, zBuf
76e0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
76f0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62  NSIENT);.      b
7700: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7710: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
7720: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  GER: {.      sql
7730: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
7740: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
7750: 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0]);.      break
7760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7770: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
7780: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78        char *zTex
7790: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  t = 0;.      cha
77a0: 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d  r const *zBlob =
77b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
77c0: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  lob(argv[0]);.  
77d0: 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20      int nBlob = 
77e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
77f0: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
7800: 20 20 20 20 61 73 73 65 72 74 28 20 7a 42 6c 6f      assert( zBlo
7810: 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  b==sqlite3_value
7820: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29  _blob(argv[0]) )
7830: 3b 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67  ; /* No encoding
7840: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20   change */.     
7850: 20 7a 54 65 78 74 20 3d 20 28 63 68 61 72 20 2a   zText = (char *
7860: 29 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63  )contextMalloc(c
7870: 6f 6e 74 65 78 74 2c 20 28 32 2a 28 69 36 34 29  ontext, (2*(i64)
7880: 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20 20  nBlob)+4); .    
7890: 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20    if( zText ){. 
78a0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
78b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
78c0: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20  <nBlob; i++){.  
78d0: 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69          zText[(i
78e0: 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64 69 67 69  *2)+2] = hexdigi
78f0: 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29  ts[(zBlob[i]>>4)
7900: 26 30 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20  &0x0F];.        
7910: 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d    zText[(i*2)+3]
7920: 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42   = hexdigits[(zB
7930: 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20  lob[i])&0x0F];. 
7940: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7950: 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29   zText[(nBlob*2)
7960: 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  +2] = '\'';.    
7970: 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62      zText[(nBlob
7980: 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20  *2)+3] = '\0';. 
7990: 20 20 20 20 20 20 20 7a 54 65 78 74 5b 30 5d 20         zText[0] 
79a0: 3d 20 27 58 27 3b 0a 20 20 20 20 20 20 20 20 7a  = 'X';.        z
79b0: 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a  Text[1] = '\'';.
79c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
79d0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
79e0: 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  ext, zText, -1, 
79f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
7a00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7a10: 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a  e3_free(zText);.
7a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7a30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7a40: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
7a50: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 6a   {.      int i,j
7a60: 3b 0a 20 20 20 20 20 20 75 36 34 20 6e 3b 0a 20  ;.      u64 n;. 
7a70: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
7a80: 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  ned char *zArg =
7a90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
7aa0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
7ab0: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20      char *z;..  
7ac0: 20 20 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20      if( zArg==0 
7ad0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
7ae0: 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41  for(i=0, n=0; zA
7af0: 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28  rg[i]; i++){ if(
7b00: 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29   zArg[i]=='\'' )
7b10: 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20   n++; }.      z 
7b20: 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28  = contextMalloc(
7b30: 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29 69  context, ((i64)i
7b40: 29 2b 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a 20  )+((i64)n)+3);. 
7b50: 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20       if( z ){.  
7b60: 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27        z[0] = '\'
7b70: 27 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ';.        for(i
7b80: 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d  =0, j=1; zArg[i]
7b90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7ba0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b    z[j++] = zArg[
7bb0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
7bc0: 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20  ( zArg[i]=='\'' 
7bd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
7be0: 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [j++] = '\'';.  
7bf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7c00: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b    }.        z[j+
7c10: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20  +] = '\'';.     
7c20: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
7c30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7c40: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
7c50: 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f  , z, j, sqlite3_
7c60: 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  free);.      }. 
7c70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7c80: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
7c90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
7ca0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
7cb0: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
7cc0: 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TE_NULL );.     
7cd0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7ce0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e  text(context, "N
7cf0: 55 4c 4c 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  ULL", 4, SQLITE_
7d00: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62  STATIC);.      b
7d10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
7d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69  }../*.** The uni
7d30: 63 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  code() function.
7d40: 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 74    Return the int
7d50: 65 67 65 72 20 75 6e 69 63 6f 64 65 20 63 6f 64  eger unicode cod
7d60: 65 2d 70 6f 69 6e 74 20 76 61 6c 75 65 0a 2a 2a  e-point value.**
7d70: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
7d80: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
7d90: 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 20 0a 2a  input string. .*
7da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
7db0: 69 63 6f 64 65 46 75 6e 63 28 0a 20 20 73 71 6c  icodeFunc(.  sql
7dc0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7dd0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
7de0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
7df0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
7e00: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7e10: 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
7e20: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
7e30: 30 5d 29 3b 0a 20 20 28 76 6f 69 64 29 61 72 67  0]);.  (void)arg
7e40: 63 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 7a 5b  c;.  if( z && z[
7e50: 30 5d 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73  0] ) sqlite3_res
7e60: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
7e70: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
7e80: 28 26 7a 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (&z));.}../*.** 
7e90: 54 68 65 20 63 68 61 72 28 29 20 66 75 6e 63 74  The char() funct
7ea0: 69 6f 6e 20 74 61 6b 65 73 20 7a 65 72 6f 20 6f  ion takes zero o
7eb0: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
7ec0: 2c 20 65 61 63 68 20 6f 66 20 77 68 69 63 68 20  , each of which 
7ed0: 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  is.** an integer
7ee0: 2e 20 20 49 74 20 63 6f 6e 73 74 72 75 63 74 73  .  It constructs
7ef0: 20 61 20 73 74 72 69 6e 67 20 77 68 65 72 65 20   a string where 
7f00: 65 61 63 68 20 63 68 61 72 61 63 74 65 72 20 6f  each character o
7f10: 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  f the string.** 
7f20: 69 73 20 74 68 65 20 75 6e 69 63 6f 64 65 20 63  is the unicode c
7f30: 68 61 72 61 63 74 65 72 20 66 6f 72 20 74 68 65  haracter for the
7f40: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
7f50: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e  nteger argument.
7f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7f70: 63 68 61 72 46 75 6e 63 28 0a 20 20 73 71 6c 69  charFunc(.  sqli
7f80: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7f90: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
7fa0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
7fb0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 75 6e  e **argv.){.  un
7fc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20  signed char *z, 
7fd0: 2a 7a 4f 75 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  *zOut;.  int i;.
7fe0: 20 20 7a 4f 75 74 20 3d 20 7a 20 3d 20 73 71 6c    zOut = z = sql
7ff0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 61  ite3_malloc64( a
8000: 72 67 63 2a 34 2b 31 20 29 3b 0a 20 20 69 66 28  rgc*4+1 );.  if(
8010: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   z==0 ){.    sql
8020: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8030: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
8040: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8050: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  }.  for(i=0; i<a
8060: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rgc; i++){.    s
8070: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a  qlite3_int64 x;.
8080: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 3b 0a      unsigned c;.
8090: 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 5f      x = sqlite3_
80a0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
80b0: 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 78 3c  [i]);.    if( x<
80c0: 30 20 7c 7c 20 78 3e 30 78 31 30 66 66 66 66 20  0 || x>0x10ffff 
80d0: 29 20 78 20 3d 20 30 78 66 66 66 64 3b 0a 20 20  ) x = 0xfffd;.  
80e0: 20 20 63 20 3d 20 28 75 6e 73 69 67 6e 65 64 29    c = (unsigned)
80f0: 28 78 20 26 20 30 78 31 66 66 66 66 66 29 3b 0a  (x & 0x1fffff);.
8100: 20 20 20 20 69 66 28 20 63 3c 30 78 30 30 30 38      if( c<0x0008
8110: 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74  0 ){.      *zOut
8120: 2b 2b 20 3d 20 28 75 38 29 28 63 26 30 78 46 46  ++ = (u8)(c&0xFF
8130: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8140: 20 63 3c 30 78 30 30 38 30 30 20 29 7b 0a 20 20   c<0x00800 ){.  
8150: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
8160: 43 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 36 29  C0 + (u8)((c>>6)
8170: 26 30 78 31 46 29 3b 0a 20 20 20 20 20 20 2a 7a  &0x1F);.      *z
8180: 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28  Out++ = 0x80 + (
8190: 75 38 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20  u8)(c & 0x3F);. 
81a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 30     }else if( c<0
81b0: 78 31 30 30 30 30 20 29 7b 0a 20 20 20 20 20 20  x10000 ){.      
81c0: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b  *zOut++ = 0xE0 +
81d0: 20 28 75 38 29 28 28 63 3e 3e 31 32 29 26 30 78   (u8)((c>>12)&0x
81e0: 30 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74  0F);.      *zOut
81f0: 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29  ++ = 0x80 + (u8)
8200: 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b  ((c>>6) & 0x3F);
8210: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
8220: 20 30 78 38 30 20 2b 20 28 75 38 29 28 63 20 26   0x80 + (u8)(c &
8230: 20 30 78 33 46 29 3b 0a 20 20 20 20 7d 65 6c 73   0x3F);.    }els
8240: 65 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  e{.      *zOut++
8250: 20 3d 20 30 78 46 30 20 2b 20 28 75 38 29 28 28   = 0xF0 + (u8)((
8260: 63 3e 3e 31 38 29 20 26 20 30 78 30 37 29 3b 0a  c>>18) & 0x07);.
8270: 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20        *zOut++ = 
8280: 30 78 38 30 20 2b 20 28 75 38 29 28 28 63 3e 3e  0x80 + (u8)((c>>
8290: 31 32 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20  12) & 0x3F);.   
82a0: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38     *zOut++ = 0x8
82b0: 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 36 29 20  0 + (u8)((c>>6) 
82c0: 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20 20 2a  & 0x3F);.      *
82d0: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
82e0: 28 75 38 29 28 63 20 26 20 30 78 33 46 29 3b 0a  (u8)(c & 0x3F);.
82f0: 20 20 20 20 7d 20 20 20 20 20 20 20 20 20 20 20      }           
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 20           \.  }. 
8330: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8340: 74 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  text64(context, 
8350: 28 63 68 61 72 2a 29 7a 2c 20 7a 4f 75 74 2d 7a  (char*)z, zOut-z
8360: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20  , sqlite3_free, 
8370: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 7d 0a  SQLITE_UTF8);.}.
8380: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 78 28 29  ./*.** The hex()
8390: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 6e 74 65   function.  Inte
83a0: 72 70 72 65 74 20 74 68 65 20 61 72 67 75 6d 65  rpret the argume
83b0: 6e 74 20 61 73 20 61 20 62 6c 6f 62 2e 20 20 52  nt as a blob.  R
83c0: 65 74 75 72 6e 0a 2a 2a 20 61 20 68 65 78 61 64  eturn.** a hexad
83d0: 65 63 69 6d 61 6c 20 72 65 6e 64 65 72 69 6e 67  ecimal rendering
83e0: 20 61 73 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61   as text..*/.sta
83f0: 74 69 63 20 76 6f 69 64 20 68 65 78 46 75 6e 63  tic void hexFunc
8400: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
8410: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
8420: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
8430: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8440: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  .){.  int i, n;.
8450: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
8460: 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20   char *pBlob;.  
8470: 63 68 61 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a  char *zHex, *z;.
8480: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
8490: 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
84a0: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
84b0: 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   pBlob = sqlite3
84c0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
84d0: 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  [0]);.  n = sqli
84e0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
84f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65  argv[0]);.  asse
8500: 72 74 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74  rt( pBlob==sqlit
8510: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
8520: 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f  gv[0]) );  /* No
8530: 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65   encoding change
8540: 20 2a 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d   */.  z = zHex =
8550: 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63   contextMalloc(c
8560: 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29  ontext, ((i64)n)
8570: 2a 32 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a  *2 + 1);.  if( z
8580: 48 65 78 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Hex ){.    for(i
8590: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42  =0; i<n; i++, pB
85a0: 6c 6f 62 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e  lob++){.      un
85b0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20  signed char c = 
85c0: 2a 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 2a 28  *pBlob;.      *(
85d0: 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73  z++) = hexdigits
85e0: 5b 28 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20  [(c>>4)&0xf];.  
85f0: 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78      *(z++) = hex
8600: 64 69 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a 20  digits[c&0xf];. 
8610: 20 20 20 7d 0a 20 20 20 20 2a 7a 20 3d 20 30 3b     }.    *z = 0;
8620: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8630: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
8640: 2c 20 7a 48 65 78 2c 20 6e 2a 32 2c 20 73 71 6c  , zHex, n*2, sql
8650: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a  ite3_free);.  }.
8660: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a 65 72  }../*.** The zer
8670: 6f 62 6c 6f 62 28 4e 29 20 66 75 6e 63 74 69 6f  oblob(N) functio
8680: 6e 20 72 65 74 75 72 6e 73 20 61 20 7a 65 72 6f  n returns a zero
8690: 2d 66 69 6c 6c 65 64 20 62 6c 6f 62 20 6f 66 20  -filled blob of 
86a0: 73 69 7a 65 20 4e 20 62 79 74 65 73 2e 0a 2a 2f  size N bytes..*/
86b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
86c0: 6f 62 6c 6f 62 46 75 6e 63 28 0a 20 20 73 71 6c  oblobFunc(.  sql
86d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
86e0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
86f0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
8700: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
8710: 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  64 n;.  int rc;.
8720: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
8730: 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
8740: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
8750: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
8760: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
8770: 29 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e  );.  if( n<0 ) n
8780: 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
8790: 69 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f  ite3_result_zero
87a0: 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20  blob64(context, 
87b0: 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 30  n); /* IMP: R-00
87c0: 32 39 33 2d 36 34 39 39 34 20 2a 2f 0a 20 20 69  293-64994 */.  i
87d0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
87e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
87f0: 72 5f 63 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20  r_code(context, 
8800: 72 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rc);.  }.}../*.*
8810: 2a 20 54 68 65 20 72 65 70 6c 61 63 65 28 29 20  * The replace() 
8820: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 72 65 65  function.  Three
8830: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
8840: 6c 6c 20 73 74 72 69 6e 67 73 3a 20 63 61 6c 6c  ll strings: call
8850: 0a 2a 2a 20 74 68 65 6d 20 41 2c 20 42 2c 20 61  .** them A, B, a
8860: 6e 64 20 43 2e 20 54 68 65 20 72 65 73 75 6c 74  nd C. The result
8870: 20 69 73 20 61 6c 73 6f 20 61 20 73 74 72 69 6e   is also a strin
8880: 67 20 77 68 69 63 68 20 69 73 20 64 65 72 69 76  g which is deriv
8890: 65 64 0a 2a 2a 20 66 72 6f 6d 20 41 20 62 79 20  ed.** from A by 
88a0: 72 65 70 6c 61 63 69 6e 67 20 65 76 65 72 79 20  replacing every 
88b0: 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 42 20  occurrence of B 
88c0: 77 69 74 68 20 43 2e 20 20 54 68 65 20 6d 61 74  with C.  The mat
88d0: 63 68 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 78  ch.** must be ex
88e0: 61 63 74 2e 20 20 43 6f 6c 6c 61 74 69 6e 67 20  act.  Collating 
88f0: 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 6e 6f  sequences are no
8900: 74 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  t used..*/.stati
8910: 63 20 76 6f 69 64 20 72 65 70 6c 61 63 65 46 75  c void replaceFu
8920: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
8930: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
8940: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
8950: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
8960: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  gv.){.  const un
8970: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74  signed char *zSt
8980: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r;        /* The
8990: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 41 20   input string A 
89a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  */.  const unsig
89b0: 6e 65 64 20 63 68 61 72 20 2a 7a 50 61 74 74 65  ned char *zPatte
89c0: 72 6e 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61  rn;    /* The pa
89d0: 74 74 65 72 6e 20 73 74 72 69 6e 67 20 42 20 2a  ttern string B *
89e0: 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  /.  const unsign
89f0: 65 64 20 63 68 61 72 20 2a 7a 52 65 70 3b 20 20  ed char *zRep;  
8a00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 70        /* The rep
8a10: 6c 61 63 65 6d 65 6e 74 20 73 74 72 69 6e 67 20  lacement string 
8a20: 43 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  C */.  unsigned 
8a30: 63 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20  char *zOut;     
8a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8a50: 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
8a60: 6e 53 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  nStr;           
8a70: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
8a80: 7a 53 74 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  zStr */.  int nP
8a90: 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20  attern;         
8aa0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 50     /* Size of zP
8ab0: 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  attern */.  int 
8ac0: 6e 52 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nRep;           
8ad0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
8ae0: 7a 52 65 70 20 2a 2f 0a 20 20 69 36 34 20 6e 4f  zRep */.  i64 nO
8af0: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
8b00: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69     /* Maximum si
8b10: 7a 65 20 6f 66 20 7a 4f 75 74 20 2a 2f 0a 20 20  ze of zOut */.  
8b20: 69 6e 74 20 6c 6f 6f 70 4c 69 6d 69 74 3b 20 20  int loopLimit;  
8b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
8b40: 20 7a 53 74 72 5b 5d 20 74 68 61 74 20 6d 69 67   zStr[] that mig
8b50: 68 74 20 6d 61 74 63 68 20 7a 50 61 74 74 65 72  ht match zPatter
8b60: 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  n[] */.  int i, 
8b70: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
8b80: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8b90: 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
8ba0: 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 55 4e   argc==3 );.  UN
8bb0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
8bc0: 72 67 63 29 3b 0a 20 20 7a 53 74 72 20 3d 20 73  rgc);.  zStr = s
8bd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8be0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
8bf0: 28 20 7a 53 74 72 3d 3d 30 20 29 20 72 65 74 75  ( zStr==0 ) retu
8c00: 72 6e 3b 0a 20 20 6e 53 74 72 20 3d 20 73 71 6c  rn;.  nStr = sql
8c10: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8c20: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73  (argv[0]);.  ass
8c30: 65 72 74 28 20 7a 53 74 72 3d 3d 73 71 6c 69 74  ert( zStr==sqlit
8c40: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8c50: 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f  gv[0]) );  /* No
8c60: 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65   encoding change
8c70: 20 2a 2f 0a 20 20 7a 50 61 74 74 65 72 6e 20 3d   */.  zPattern =
8c80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8c90: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
8ca0: 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20  if( zPattern==0 
8cb0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
8cc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8cd0: 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49  e(argv[1])==SQLI
8ce0: 54 45 5f 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20  TE_NULL.        
8cf0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63      || sqlite3_c
8d00: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
8d10: 28 63 6f 6e 74 65 78 74 29 2d 3e 6d 61 6c 6c 6f  (context)->mallo
8d20: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
8d30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
8d40: 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 30 20   zPattern[0]==0 
8d50: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
8d60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8d70: 65 28 61 72 67 76 5b 31 5d 29 21 3d 53 51 4c 49  e(argv[1])!=SQLI
8d80: 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 73  TE_NULL );.    s
8d90: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
8da0: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  lue(context, arg
8db0: 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  v[0]);.    retur
8dc0: 6e 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 74 65 72  n;.  }.  nPatter
8dd0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
8de0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29  e_bytes(argv[1])
8df0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50 61 74  ;.  assert( zPat
8e00: 74 65 72 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61  tern==sqlite3_va
8e10: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
8e20: 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f  ) );  /* No enco
8e30: 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20  ding change */. 
8e40: 20 7a 52 65 70 20 3d 20 73 71 6c 69 74 65 33 5f   zRep = sqlite3_
8e50: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8e60: 32 5d 29 3b 0a 20 20 69 66 28 20 7a 52 65 70 3d  2]);.  if( zRep=
8e70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e  =0 ) return;.  n
8e80: 52 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Rep = sqlite3_va
8e90: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 32  lue_bytes(argv[2
8ea0: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 52  ]);.  assert( zR
8eb0: 65 70 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ep==sqlite3_valu
8ec0: 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 20  e_text(argv[2]) 
8ed0: 29 3b 0a 20 20 6e 4f 75 74 20 3d 20 6e 53 74 72  );.  nOut = nStr
8ee0: 20 2b 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   + 1;.  assert( 
8ef0: 6e 4f 75 74 3c 53 51 4c 49 54 45 5f 4d 41 58 5f  nOut<SQLITE_MAX_
8f00: 4c 45 4e 47 54 48 20 29 3b 0a 20 20 7a 4f 75 74  LENGTH );.  zOut
8f10: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
8f20: 28 63 6f 6e 74 65 78 74 2c 20 28 69 36 34 29 6e  (context, (i64)n
8f30: 4f 75 74 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74  Out);.  if( zOut
8f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
8f50: 6e 3b 0a 20 20 7d 0a 20 20 6c 6f 6f 70 4c 69 6d  n;.  }.  loopLim
8f60: 69 74 20 3d 20 6e 53 74 72 20 2d 20 6e 50 61 74  it = nStr - nPat
8f70: 74 65 72 6e 3b 20 20 0a 20 20 66 6f 72 28 69 3d  tern;  .  for(i=
8f80: 6a 3d 30 3b 20 69 3c 3d 6c 6f 6f 70 4c 69 6d 69  j=0; i<=loopLimi
8f90: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
8fa0: 20 7a 53 74 72 5b 69 5d 21 3d 7a 50 61 74 74 65   zStr[i]!=zPatte
8fb0: 72 6e 5b 30 5d 20 7c 7c 20 6d 65 6d 63 6d 70 28  rn[0] || memcmp(
8fc0: 26 7a 53 74 72 5b 69 5d 2c 20 7a 50 61 74 74 65  &zStr[i], zPatte
8fd0: 72 6e 2c 20 6e 50 61 74 74 65 72 6e 29 20 29 7b  rn, nPattern) ){
8fe0: 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d  .      zOut[j++]
8ff0: 20 3d 20 7a 53 74 72 5b 69 5d 3b 0a 20 20 20 20   = zStr[i];.    
9000: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
9010: 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20 73 71 6c  *zOld;.      sql
9020: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
9030: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
9040: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
9050: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 6e 52 65       nOut += nRe
9060: 70 20 2d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  p - nPattern;.  
9070: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f      testcase( nO
9080: 75 74 2d 31 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  ut-1==db->aLimit
9090: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
90a0: 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20 20 74  NGTH] );.      t
90b0: 65 73 74 63 61 73 65 28 20 6e 4f 75 74 2d 32 3d  estcase( nOut-2=
90c0: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
90d0: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
90e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
90f0: 75 74 2d 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ut-1>db->aLimit[
9100: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
9110: 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  GTH] ){.        
9120: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
9130: 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74  rror_toobig(cont
9140: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ext);.        sq
9150: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
9160: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9180: 7a 4f 6c 64 20 3d 20 7a 4f 75 74 3b 0a 20 20 20  zOld = zOut;.   
9190: 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
91a0: 33 5f 72 65 61 6c 6c 6f 63 36 34 28 7a 4f 75 74  3_realloc64(zOut
91b0: 2c 20 28 69 6e 74 29 6e 4f 75 74 29 3b 0a 20 20  , (int)nOut);.  
91c0: 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20      if( zOut==0 
91d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
91e0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
91f0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
9200: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9210: 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 20 20  free(zOld);.    
9220: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
9230: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79    }.      memcpy
9240: 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65 70 2c  (&zOut[j], zRep,
9250: 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20 6a 20   nRep);.      j 
9260: 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20 20 69  += nRep;.      i
9270: 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31 3b 0a   += nPattern-1;.
9280: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
9290: 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31 3d 3d  rt( j+nStr-i+1==
92a0: 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63 70 79  nOut );.  memcpy
92b0: 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53 74 72  (&zOut[j], &zStr
92c0: 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a 20 20  [i], nStr-i);.  
92d0: 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b 0a 20  j += nStr - i;. 
92e0: 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f 75 74   assert( j<=nOut
92f0: 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20   );.  zOut[j] = 
9300: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  0;.  sqlite3_res
9310: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
9320: 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20 6a  , (char*)zOut, j
9330: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
9340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
9350: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
9360: 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28 29 2c  TRIM(), LTRIM(),
9370: 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66 75 6e   and RTRIM() fun
9380: 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 75  ctions..** The u
9390: 73 65 72 64 61 74 61 20 69 73 20 30 78 31 20 66  serdata is 0x1 f
93a0: 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20 30 78  or left trim, 0x
93b0: 32 20 66 6f 72 20 72 69 67 68 74 20 74 72 69 6d  2 for right trim
93c0: 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68 2e 0a  , 0x3 for both..
93d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
93e0: 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  rimFunc(.  sqlit
93f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
9400: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
9410: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
9420: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
9430: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
9440: 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f   *zIn;         /
9450: 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20 2a  * Input string *
9460: 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  /.  const unsign
9470: 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72 53 65  ed char *zCharSe
9480: 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20  t;    /* Set of 
9490: 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 74 72  characters to tr
94a0: 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 3b  im */.  int nIn;
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
94d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
94e0: 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 66  input */.  int f
94f0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9510: 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32 3a 20  1: trimleft  2: 
9520: 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20 74 72  trimright  3: tr
9530: 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  im */.  int i;  
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9560: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
9570: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4c  nsigned char *aL
9580: 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
9590: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 65 61   /* Length of ea
95a0: 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ch character in 
95b0: 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 75 6e  zCharSet */.  un
95c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 61 7a  signed char **az
95d0: 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Char = 0;       
95e0: 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20 63 68  /* Individual ch
95f0: 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68 61  aracters in zCha
9600: 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  rSet */.  int nC
9610: 68 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  har;            
9620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9630: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
9640: 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65 74 20  ers in zCharSet 
9650: 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  */..  if( sqlite
9660: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
9670: 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[0])==SQLITE_NU
9680: 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
9690: 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20 73 71  ;.  }.  zIn = sq
96a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
96b0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
96c0: 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e   zIn==0 ) return
96d0: 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65  ;.  nIn = sqlite
96e0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
96f0: 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[0]);.  assert
9700: 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  ( zIn==sqlite3_v
9710: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
9720: 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63  ]) );.  if( argc
9730: 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==1 ){.    stati
9740: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
9750: 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d 20 3d   char lenOne[] =
9760: 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74 61 74   { 1 };.    stat
9770: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ic unsigned char
9780: 20 2a 20 63 6f 6e 73 74 20 61 7a 4f 6e 65 5b 5d   * const azOne[]
9790: 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20 7d 3b   = { (u8*)" " };
97a0: 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31 3b 0a  .    nChar = 1;.
97b0: 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38 2a 29      aLen = (u8*)
97c0: 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a 43 68  lenOne;.    azCh
97d0: 61 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ar = (unsigned c
97e0: 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a 20 20  har **)azOne;.  
97f0: 20 20 7a 43 68 61 72 53 65 74 20 3d 20 30 3b 0a    zCharSet = 0;.
9800: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 43 68    }else if( (zCh
9810: 61 72 53 65 74 20 3d 20 73 71 6c 69 74 65 33 5f  arSet = sqlite3_
9820: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
9830: 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  1]))==0 ){.    r
9840: 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eturn;.  }else{.
9850: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
9860: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  ed char *z;.    
9870: 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20  for(z=zCharSet, 
9880: 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68  nChar=0; *z; nCh
9890: 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51 4c  ar++){.      SQL
98a0: 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29  ITE_SKIP_UTF8(z)
98b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
98c0: 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20 20  nChar>0 ){.     
98d0: 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e 74 65 78   azChar = contex
98e0: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
98f0: 20 28 28 69 36 34 29 6e 43 68 61 72 29 2a 28 73   ((i64)nChar)*(s
9900: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31 29 29  izeof(char*)+1))
9910: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43 68  ;.      if( azCh
9920: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ar==0 ){.       
9930: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
9940: 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20 28 75  .      aLen = (u
9950: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 61  nsigned char*)&a
9960: 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a 20 20  zChar[nChar];.  
9970: 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53      for(z=zCharS
9980: 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b  et, nChar=0; *z;
9990: 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20   nChar++){.     
99a0: 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d     azChar[nChar]
99b0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
99c0: 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20 20 20 53  r *)z;.        S
99d0: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
99e0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c 65 6e  z);.        aLen
99f0: 5b 6e 43 68 61 72 5d 20 3d 20 28 75 38 29 28 7a  [nChar] = (u8)(z
9a00: 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d   - azChar[nChar]
9a10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9a20: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68 61 72  .  }.  if( nChar
9a30: 3e 30 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  >0 ){.    flags 
9a40: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
9a50: 49 4e 54 28 73 71 6c 69 74 65 33 5f 75 73 65 72  INT(sqlite3_user
9a60: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 29 3b  _data(context));
9a70: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
9a80: 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c   1 ){.      whil
9a90: 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20  e( nIn>0 ){.    
9aa0: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b      int len = 0;
9ab0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
9ac0: 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b  ; i<nChar; i++){
9ad0: 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  .          len =
9ae0: 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20   aLen[i];.      
9af0: 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49 6e      if( len<=nIn
9b00: 20 26 26 20 6d 65 6d 63 6d 70 28 7a 49 6e 2c 20   && memcmp(zIn, 
9b10: 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e 29 3d  azChar[i], len)=
9b20: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
9b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
9b40: 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62 72 65  ( i>=nChar ) bre
9b50: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49 6e 20  ak;.        zIn 
9b60: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20  += len;.        
9b70: 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20  nIn -= len;.    
9b80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9b90: 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b 0a 20  ( flags & 2 ){. 
9ba0: 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e       while( nIn>
9bb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
9bc0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20   len = 0;.      
9bd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68    for(i=0; i<nCh
9be0: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
9bf0: 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69      len = aLen[i
9c00: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
9c10: 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65 6d   len<=nIn && mem
9c20: 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c 65 6e  cmp(&zIn[nIn-len
9c30: 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65 6e 29  ],azChar[i],len)
9c40: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
9c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
9c60: 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62 72  f( i>=nChar ) br
9c70: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e  eak;.        nIn
9c80: 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d   -= len;.      }
9c90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
9ca0: 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20 20 20  CharSet ){.     
9cb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
9cc0: 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Char);.    }.  }
9cd0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
9ce0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
9cf0: 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49 6e 2c  (char*)zIn, nIn,
9d00: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9d10: 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  T);.}...#ifdef S
9d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b  QLITE_ENABLE_UNK
9d30: 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f  NOWN_SQL_FUNCTIO
9d40: 4e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 75 6e 6b  N./*.** The "unk
9d50: 6e 6f 77 6e 22 20 66 75 6e 63 74 69 6f 6e 20 69  nown" function i
9d60: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
9d70: 73 75 62 73 74 69 74 75 74 65 64 20 69 6e 20 70  substituted in p
9d80: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 6e 79 20 75  lace of.** any u
9d90: 6e 72 65 63 6f 67 6e 69 7a 65 64 20 66 75 6e 63  nrecognized func
9da0: 74 69 6f 6e 20 6e 61 6d 65 20 77 68 65 6e 20 64  tion name when d
9db0: 6f 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20  oing an EXPLAIN 
9dc0: 6f 72 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  or EXPLAIN QUERY
9dd0: 20 50 4c 41 4e 0a 2a 2a 20 77 68 65 6e 20 74 68   PLAN.** when th
9de0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
9df0: 55 4e 4b 4e 4f 57 4e 5f 46 55 4e 43 54 49 4f 4e  UNKNOWN_FUNCTION
9e00: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
9e10: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2a  tion is used..**
9e20: 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74   When the "sqlit
9e30: 65 33 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  e3" command-line
9e40: 20 73 68 65 6c 6c 20 69 73 20 62 75 69 6c 74 20   shell is built 
9e50: 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  using this funct
9e60: 69 6f 6e 61 6c 69 74 79 2c 0a 2a 2a 20 74 68 61  ionality,.** tha
9e70: 74 20 61 6c 6c 6f 77 73 20 61 6e 20 45 58 50 4c  t allows an EXPL
9e80: 41 49 4e 20 6f 72 20 45 58 50 4c 41 49 4e 20 51  AIN or EXPLAIN Q
9e90: 55 45 52 59 20 50 4c 41 4e 20 66 6f 72 20 63 6f  UERY PLAN for co
9ea0: 6d 70 6c 65 78 20 71 75 65 72 69 65 73 0a 2a 2a  mplex queries.**
9eb0: 20 69 6e 76 6f 6c 76 69 6e 67 20 61 70 70 6c 69   involving appli
9ec0: 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 66  cation-defined f
9ed0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 65  unctions to be e
9ee0: 78 61 6d 69 6e 65 64 20 69 6e 20 61 20 67 65 6e  xamined in a gen
9ef0: 65 72 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 20  eric.** sqlite3 
9f00: 73 68 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  shell..*/.static
9f10: 20 76 6f 69 64 20 75 6e 6b 6e 6f 77 6e 46 75 6e   void unknownFun
9f20: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
9f30: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
9f40: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
9f50: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
9f60: 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  v.){.  /* no-op 
9f70: 2a 2f 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 53 51  */.}.#endif /*SQ
9f80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e  LITE_ENABLE_UNKN
9f90: 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e  OWN_SQL_FUNCTION
9fa0: 2a 2f 0a 0a 0a 2f 2a 20 49 4d 50 3a 20 52 2d 32  */.../* IMP: R-2
9fb0: 35 33 36 31 2d 31 36 31 35 30 20 54 68 69 73 20  5361-16150 This 
9fc0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6d 69 74  function is omit
9fd0: 74 65 64 20 66 72 6f 6d 20 53 51 4c 69 74 65 20  ted from SQLite 
9fe0: 62 79 20 64 65 66 61 75 6c 74 2e 20 49 74 0a 2a  by default. It.*
9ff0: 2a 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  * is only availa
a000: 62 6c 65 20 69 66 20 74 68 65 20 53 51 4c 49 54  ble if the SQLIT
a010: 45 5f 53 4f 55 4e 44 45 58 20 63 6f 6d 70 69 6c  E_SOUNDEX compil
a020: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
a030: 20 75 73 65 64 0a 2a 2a 20 77 68 65 6e 20 53 51   used.** when SQ
a040: 4c 69 74 65 20 69 73 20 62 75 69 6c 74 2e 0a 2a  Lite is built..*
a050: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
a060: 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 43 6f  SOUNDEX./*.** Co
a070: 6d 70 75 74 65 20 74 68 65 20 73 6f 75 6e 64 65  mpute the sounde
a080: 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  x encoding of a 
a090: 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a  word..**.** IMP:
a0a0: 20 52 2d 35 39 37 38 32 2d 30 30 30 37 32 20 54   R-59782-00072 T
a0b0: 68 65 20 73 6f 75 6e 64 65 78 28 58 29 20 66 75  he soundex(X) fu
a0c0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
a0d0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
a0e0: 74 68 65 0a 2a 2a 20 73 6f 75 6e 64 65 78 20 65  the.** soundex e
a0f0: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 73  ncoding of the s
a100: 74 72 69 6e 67 20 58 2e 20 0a 2a 2f 0a 73 74 61  tring X. .*/.sta
a110: 74 69 63 20 76 6f 69 64 20 73 6f 75 6e 64 65 78  tic void soundex
a120: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
a130: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
a140: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
a150: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
a160: 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a  argv.){.  char z
a170: 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20 63 6f 6e  Result[8];.  con
a180: 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20 20 69 6e  st u8 *zIn;.  in
a190: 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74 69 63  t i, j;.  static
a1a0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
a1b0: 63 68 61 72 20 69 43 6f 64 65 5b 5d 20 3d 20 7b  char iCode[] = {
a1c0: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
a1d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a1e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a1f0: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30  , 0,.    0, 0, 0
a200: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a210: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a220: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
a230: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a240: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a250: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
a260: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a270: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a280: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a290: 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c  .    0, 0, 1, 2,
a2a0: 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20   3, 0, 1, 2, 0, 
a2b0: 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35  0, 2, 2, 4, 5, 5
a2c0: 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36  , 0,.    1, 2, 6
a2d0: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c  , 2, 3, 0, 1, 0,
a2e0: 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20   2, 0, 2, 0, 0, 
a2f0: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
a300: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31  0, 1, 2, 3, 0, 1
a310: 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c  , 2, 0, 0, 2, 2,
a320: 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20   4, 5, 5, 0,.   
a330: 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20   1, 2, 6, 2, 3, 
a340: 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32  0, 1, 0, 2, 0, 2
a350: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a360: 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20  .  };.  assert( 
a370: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a 49 6e  argc==1 );.  zIn
a380: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 5f   = (u8*)sqlite3_
a390: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
a3a0: 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d  0]);.  if( zIn==
a3b0: 30 20 29 20 7a 49 6e 20 3d 20 28 75 38 2a 29 22  0 ) zIn = (u8*)"
a3c0: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49  ";.  for(i=0; zI
a3d0: 6e 5b 69 5d 20 26 26 20 21 73 71 6c 69 74 65 33  n[i] && !sqlite3
a3e0: 49 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d 29 3b  Isalpha(zIn[i]);
a3f0: 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 49   i++){}.  if( zI
a400: 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75 38 20 70  n[i] ){.    u8 p
a410: 72 65 76 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b  revcode = iCode[
a420: 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20  zIn[i]&0x7f];.  
a430: 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20 3d 20 73    zResult[0] = s
a440: 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 7a 49  qlite3Toupper(zI
a450: 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f 72 28 6a  n[i]);.    for(j
a460: 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49 6e 5b 69  =1; j<4 && zIn[i
a470: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
a480: 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b  nt code = iCode[
a490: 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20  zIn[i]&0x7f];.  
a4a0: 20 20 20 20 69 66 28 20 63 6f 64 65 3e 30 20 29      if( code>0 )
a4b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
a4c0: 64 65 21 3d 70 72 65 76 63 6f 64 65 20 29 7b 0a  de!=prevcode ){.
a4d0: 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 6f            prevco
a4e0: 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20 20 20 20  de = code;.     
a4f0: 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b       zResult[j++
a500: 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30 27 3b 0a  ] = code + '0';.
a510: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a520: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a530: 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20  revcode = 0;.   
a540: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
a550: 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a 20 20 20  hile( j<4 ){.   
a560: 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20     zResult[j++] 
a570: 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '0';.    }.   
a580: 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d 20 30 3b   zResult[j] = 0;
a590: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
a5a0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
a5b0: 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c 20 53 51  , zResult, 4, SQ
a5c0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
a5d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
a5e0: 20 49 4d 50 3a 20 52 2d 36 34 38 39 34 2d 35 30   IMP: R-64894-50
a5f0: 33 32 31 20 54 68 65 20 73 74 72 69 6e 67 20 22  321 The string "
a600: 3f 30 30 30 22 20 69 73 20 72 65 74 75 72 6e 65  ?000" is returne
a610: 64 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  d if the argumen
a620: 74 0a 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c 4c  t.    ** is NULL
a630: 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   or contains no 
a640: 41 53 43 49 49 20 61 6c 70 68 61 62 65 74 69 63  ASCII alphabetic
a650: 20 63 68 61 72 61 63 74 65 72 73 2e 20 2a 2f 0a   characters. */.
a660: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
a670: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
a680: 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51 4c 49   "?000", 4, SQLI
a690: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  TE_STATIC);.  }.
a6a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a6b0: 54 45 5f 53 4f 55 4e 44 45 58 20 2a 2f 0a 0a 23  TE_SOUNDEX */..#
a6c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a6d0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
a6e0: 4e 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63 74 69  N./*.** A functi
a6f0: 6f 6e 20 74 68 61 74 20 6c 6f 61 64 73 20 61 20  on that loads a 
a700: 73 68 61 72 65 64 2d 6c 69 62 72 61 72 79 20 65  shared-library e
a710: 78 74 65 6e 73 69 6f 6e 20 74 68 65 6e 20 72 65  xtension then re
a720: 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  turns NULL..*/.s
a730: 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61 64 45  tatic void loadE
a740: 78 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  xt(sqlite3_conte
a750: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
a760: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
a770: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
a780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
a790: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
a7a0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
a7b0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
a7c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
a7d0: 6f 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  oc;.  sqlite3 *d
a7e0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
a7f0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
a800: 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72 20 2a  ntext);.  char *
a810: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
a820: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74 68 65 20  /* Disallow the 
a830: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29  load_extension()
a840: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 75 6e   SQL function un
a850: 6c 65 73 73 20 74 68 65 20 53 51 4c 49 54 45 5f  less the SQLITE_
a860: 4c 6f 61 64 45 78 74 46 75 6e 63 0a 20 20 2a 2a  LoadExtFunc.  **
a870: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20 53   flag is set.  S
a880: 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65  ee the sqlite3_e
a890: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
a8a0: 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f  sion() API..  */
a8b0: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
a8c0: 73 20 26 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45  s & SQLITE_LoadE
a8d0: 78 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20  xtFunc)==0 ){.  
a8e0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a8f0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
a900: 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 22  "not authorized"
a910: 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
a920: 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 72  n;.  }..  if( ar
a930: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72  gc==2 ){.    zPr
a940: 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  oc = (const char
a950: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
a960: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
a970: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72    }else{.    zPr
a980: 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  oc = 0;.  }.  if
a990: 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c 69 74  ( zFile && sqlit
a9a0: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
a9b0: 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  n(db, zFile, zPr
a9c0: 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20 29 7b  oc, &zErrMsg) ){
a9d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
a9e0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
a9f0: 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b  t, zErrMsg, -1);
aa00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
aa10: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  e(zErrMsg);.  }.
aa20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
aa30: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
aa40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
aa50: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68  ructure holds th
aa60: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a  e context of a.*
aa70: 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29  * sum() or avg()
aa80: 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75   aggregate compu
aa90: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  tation..*/.typed
aaa0: 65 66 20 73 74 72 75 63 74 20 53 75 6d 43 74 78  ef struct SumCtx
aab0: 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20   SumCtx;.struct 
aac0: 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c  SumCtx {.  doubl
aad0: 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20  e rSum;      /* 
aae0: 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73  Floating point s
aaf0: 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d  um */.  i64 iSum
ab00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
ab10: 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20  eger sum */   . 
ab20: 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20 20 20   i64 cnt;       
ab30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ab40: 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20  elements summed 
ab50: 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f 77  */.  u8 overflow
ab60: 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
ab70: 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c  f integer overfl
ab80: 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20  ow seen */.  u8 
ab90: 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20 20 2f  approx;        /
aba0: 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e  * True if non-in
abb0: 74 65 67 65 72 20 76 61 6c 75 65 20 77 61 73 20  teger value was 
abc0: 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73 75 6d  input to the sum
abd0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f   */.};../*.** Ro
abe0: 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63  utines used to c
abf0: 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d 2c 20  ompute the sum, 
ac00: 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74 6f 74  average, and tot
ac10: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55  al..**.** The SU
ac20: 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c  M() function fol
ac30: 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b 65 6e  lows the (broken
ac40: 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64 20 77  ) SQL standard w
ac50: 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  hich means.** th
ac60: 61 74 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55  at it returns NU
ac70: 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20 6f 76  LL if it sums ov
ac80: 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54  er no inputs.  T
ac90: 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20  OTAL returns.** 
aca0: 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61 73 65  0.0 in that case
acb0: 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20  .  In addition, 
acc0: 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72 65 74  TOTAL always ret
acd0: 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77 68 65  urns a float whe
ace0: 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20  re.** SUM might 
acf0: 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
ad00: 72 20 69 66 20 69 74 20 6e 65 76 65 72 20 65 6e  r if it never en
ad10: 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f 61 74  counters a float
ad20: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
ad30: 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65 72  ue.  TOTAL never
ad40: 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55 4d 20   fails, but SUM 
ad50: 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20 61 6e  might through an
ad60: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a   exception if.**
ad70: 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e   it overflows an
ad80: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
ad90: 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70  tic void sumStep
ada0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
adb0: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
adc0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
add0: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75  ue **argv){.  Su
ade0: 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74  mCtx *p;.  int t
adf0: 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ype;.  assert( a
ae00: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
ae10: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
ae20: 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  c);.  p = sqlite
ae30: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
ae40: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
ae50: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79 70 65  eof(*p));.  type
ae60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
ae70: 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61 72  _numeric_type(ar
ae80: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 20  gv[0]);.  if( p 
ae90: 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54 45 5f  && type!=SQLITE_
aea0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63  NULL ){.    p->c
aeb0: 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74 79  nt++;.    if( ty
aec0: 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
aed0: 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ER ){.      i64 
aee0: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
aef0: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
af00: 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20  ;.      p->rSum 
af10: 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  += v;.      if( 
af20: 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76  (p->approx|p->ov
af30: 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20 73 71  erflow)==0 && sq
af40: 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26 70  lite3AddInt64(&p
af50: 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b 0a 20 20  ->iSum, v) ){.  
af60: 20 20 20 20 20 20 70 2d 3e 6f 76 65 72 66 6c 6f        p->overflo
af70: 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  w = 1;.      }. 
af80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
af90: 70 2d 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74  p->rSum += sqlit
afa0: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
afb0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
afc0: 70 2d 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20  p->approx = 1;. 
afd0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
afe0: 63 20 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69  c void sumFinali
aff0: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
b000: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
b010: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  SumCtx *p;.  p =
b020: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
b030: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
b040: 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  xt, 0);.  if( p 
b050: 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20  && p->cnt>0 ){. 
b060: 20 20 20 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c     if( p->overfl
b070: 6f 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ow ){.      sqli
b080: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
b090: 28 63 6f 6e 74 65 78 74 2c 22 69 6e 74 65 67 65  (context,"intege
b0a0: 72 20 6f 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b  r overflow",-1);
b0b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
b0c0: 2d 3e 61 70 70 72 6f 78 20 29 7b 0a 20 20 20 20  ->approx ){.    
b0d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
b0e0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
b0f0: 20 70 2d 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d   p->rSum);.    }
b100: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
b110: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
b120: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75  (context, p->iSu
b130: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  m);.    }.  }.}.
b140: 73 74 61 74 69 63 20 76 6f 69 64 20 61 76 67 46  static void avgF
b150: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
b160: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
b170: 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a  ){.  SumCtx *p;.
b180: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
b190: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
b1a0: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
b1b0: 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30  f( p && p->cnt>0
b1c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b1d0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
b1e0: 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28  ntext, p->rSum/(
b1f0: 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a  double)p->cnt);.
b200: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
b210: 64 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28  d totalFinalize(
b220: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
b230: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d  *context){.  Sum
b240: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
b250: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
b260: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
b270: 20 30 29 3b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c   0);.  /* (doubl
b280: 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53  e)0 In case of S
b290: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
b2a0: 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a  ING_POINT... */.
b2b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
b2c0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
b2d0: 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 28   p ? p->rSum : (
b2e0: 64 6f 75 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a  double)0);.}../*
b2f0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
b300: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
b310: 73 20 74 72 61 63 6b 20 6f 66 20 73 74 61 74 65  s track of state
b320: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
b330: 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20   the.** count() 
b340: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
b350: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
b360: 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 43  truct CountCtx C
b370: 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20  ountCtx;.struct 
b380: 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 36 34  CountCtx {.  i64
b390: 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f   n;.};../*.** Ro
b3a0: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
b3b0: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 28 29 20  ent the count() 
b3c0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
b3d0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
b3e0: 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73 71 6c  id countStep(sql
b3f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
b400: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
b410: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b420: 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43  *argv){.  CountC
b430: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
b440: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
b450: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
b460: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
b470: 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53  f( (argc==0 || S
b480: 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69  QLITE_NULL!=sqli
b490: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
b4a0: 72 67 76 5b 30 5d 29 29 20 26 26 20 70 20 29 7b  rgv[0])) && p ){
b4b0: 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d  .    p->n++;.  }
b4c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b4d0: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
b4e0: 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
b4f0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
b500: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  t() function is 
b510: 64 65 70 72 65 63 61 74 65 64 2e 20 20 42 75 74  deprecated.  But
b520: 20 6a 75 73 74 20 74 6f 20 6d 61 6b 65 0a 20 20   just to make.  
b530: 2a 2a 20 73 75 72 65 20 69 74 20 73 74 69 6c 6c  ** sure it still
b540: 20 6f 70 65 72 61 74 65 73 20 63 6f 72 72 65 63   operates correc
b550: 74 6c 79 2c 20 76 65 72 69 66 79 20 74 68 61 74  tly, verify that
b560: 20 69 74 73 20 63 6f 75 6e 74 20 61 67 72 65 65   its count agree
b570: 73 20 77 69 74 68 20 6f 75 72 20 0a 20 20 2a 2a  s with our .  **
b580: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 75 6e 74 20   internal count 
b590: 77 68 65 6e 20 75 73 69 6e 67 20 63 6f 75 6e 74  when using count
b5a0: 28 2a 29 20 61 6e 64 20 77 68 65 6e 20 74 68 65  (*) and when the
b5b0: 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 63 61 6e   total count can
b5c0: 20 62 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73   be.  ** express
b5d0: 65 64 20 61 73 20 61 20 33 32 2d 62 69 74 20 69  ed as a 32-bit i
b5e0: 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 61 73 73  nteger. */.  ass
b5f0: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20  ert( argc==1 || 
b600: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78 37  p==0 || p->n>0x7
b610: 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 20  fffffff.        
b620: 20 20 7c 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69 74    || p->n==sqlit
b630: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75  e3_aggregate_cou
b640: 6e 74 28 63 6f 6e 74 65 78 74 29 20 29 3b 0a 23  nt(context) );.#
b650: 65 6e 64 69 66 0a 7d 20 20 20 0a 73 74 61 74 69  endif.}   .stati
b660: 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61  c void countFina
b670: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
b680: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
b690: 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20    CountCtx *p;. 
b6a0: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
b6b0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
b6c0: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 73 71  ontext, 0);.  sq
b6d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
b6e0: 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20  64(context, p ? 
b6f0: 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a  p->n : 0);.}../*
b700: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
b710: 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20  implement min() 
b720: 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65 67  and max() aggreg
b730: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
b740: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69  /.static void mi
b750: 6e 6d 61 78 53 74 65 70 28 0a 20 20 73 71 6c 69  nmaxStep(.  sqli
b760: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
b770: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74  text, .  int Not
b780: 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74 65 33  Used, .  sqlite3
b790: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
b7a0: 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20  .  Mem *pArg  = 
b7b0: 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a  (Mem *)argv[0];.
b7c0: 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20    Mem *pBest;.  
b7d0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
b7e0: 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20 20 70 42  (NotUsed);..  pB
b7f0: 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c  est = (Mem *)sql
b800: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
b810: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
b820: 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 29 3b  sizeof(*pBest));
b830: 0a 20 20 69 66 28 20 21 70 42 65 73 74 20 29 20  .  if( !pBest ) 
b840: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
b850: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
b860: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
b870: 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_NULL ){.    i
b880: 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20  f( pBest->flags 
b890: 29 20 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63  ) sqlite3SkipAcc
b8a0: 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e  umulatorLoad(con
b8b0: 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  text);.  }else i
b8c0: 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20  f( pBest->flags 
b8d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a  ){.    int max;.
b8e0: 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20      int cmp;.   
b8f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
b900: 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63  = sqlite3GetFunc
b910: 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29  CollSeq(context)
b920: 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74  ;.    /* This st
b930: 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ep function is u
b940: 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
b950: 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29   min() and max()
b960: 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20 20 20   aggregates,.   
b970: 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69 66   ** the only dif
b980: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
b990: 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20 74 68  the two being th
b9a0: 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20  at the sense of 
b9b0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61  the.    ** compa
b9c0: 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72 74 65  rison is inverte
b9d0: 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78 28 29  d. For the max()
b9e0: 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 0a   aggregate, the.
b9f0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75      ** sqlite3_u
ba00: 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e 63 74  ser_data() funct
ba10: 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76 6f 69  ion returns (voi
ba20: 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28  d *)-1. For min(
ba30: 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) it.    ** retu
ba40: 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62 2c 20  rns (void *)db, 
ba50: 77 68 65 72 65 20 64 62 20 69 73 20 74 68 65 20  where db is the 
ba60: 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73  sqlite3* databas
ba70: 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a  e pointer..    *
ba80: 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68 65 20  * Therefore the 
ba90: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 73  next statement s
baa0: 65 74 73 20 76 61 72 69 61 62 6c 65 20 27 6d 61  ets variable 'ma
bab0: 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68 65 20  x' to 1 for the 
bac0: 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61 67 67  max().    ** agg
bad0: 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66 6f 72  regate, or 0 for
bae0: 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20   min()..    */. 
baf0: 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74 65 33     max = sqlite3
bb00: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
bb10: 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20  xt)!=0;.    cmp 
bb20: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
bb30: 61 72 65 28 70 42 65 73 74 2c 20 70 41 72 67 2c  are(pBest, pArg,
bb40: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pColl);.    if(
bb50: 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30 29 20   (max && cmp<0) 
bb60: 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d 70 3e  || (!max && cmp>
bb70: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
bb80: 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70  te3VdbeMemCopy(p
bb90: 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 20  Best, pArg);.   
bba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
bbb0: 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d 75 6c  lite3SkipAccumul
bbc0: 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78 74  atorLoad(context
bbd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
bbe0: 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 64 62 20  {.    pBest->db 
bbf0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
bc00: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
bc10: 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
bc20: 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65  3VdbeMemCopy(pBe
bc30: 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d  st, pArg);.  }.}
bc40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e  .static void min
bc50: 4d 61 78 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  MaxFinalize(sqli
bc60: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
bc70: 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  text){.  sqlite3
bc80: 5f 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20  _value *pRes;.  
bc90: 70 52 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f  pRes = (sqlite3_
bca0: 76 61 6c 75 65 20 2a 29 73 71 6c 69 74 65 33 5f  value *)sqlite3_
bcb0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
bcc0: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
bcd0: 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20   if( pRes ){.   
bce0: 20 69 66 28 20 70 52 65 73 2d 3e 66 6c 61 67 73   if( pRes->flags
bcf0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
bd00: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
bd10: 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b 0a 20  ontext, pRes);. 
bd20: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
bd30: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
bd40: 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Res);.  }.}../*.
bd50: 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  ** group_concat(
bd60: 45 58 50 52 2c 20 3f 53 45 50 41 52 41 54 4f 52  EXPR, ?SEPARATOR
bd70: 3f 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ?).*/.static voi
bd80: 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65  d groupConcatSte
bd90: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
bda0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
bdb0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
bdc0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
bdd0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
bde0: 72 20 2a 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63  r *zVal;.  StrAc
bdf0: 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63  cum *pAccum;.  c
be00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
be10: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65  .  int nVal, nSe
be20: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  p;.  assert( arg
be30: 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20  c==1 || argc==2 
be40: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
be50: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
be60: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
be70: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 41  L ) return;.  pA
be80: 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63 75 6d  ccum = (StrAccum
be90: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
bea0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
beb0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63  ext, sizeof(*pAc
bec0: 63 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20 70 41  cum));..  if( pA
bed0: 63 63 75 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  ccum ){.    sqli
bee0: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
bef0: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
bf00: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
bf10: 20 20 69 6e 74 20 66 69 72 73 74 54 65 72 6d 20    int firstTerm 
bf20: 3d 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f  = pAccum->mxAllo
bf30: 63 3d 3d 30 3b 0a 20 20 20 20 70 41 63 63 75 6d  c==0;.    pAccum
bf40: 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e  ->mxAlloc = db->
bf50: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
bf60: 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20  MIT_LENGTH];.   
bf70: 20 69 66 28 20 21 66 69 72 73 74 54 65 72 6d 20   if( !firstTerm 
bf80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72 67  ){.      if( arg
bf90: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  c==2 ){.        
bfa0: 7a 53 65 70 20 3d 20 28 63 68 61 72 2a 29 73 71  zSep = (char*)sq
bfb0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
bfc0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20  (argv[1]);.     
bfd0: 20 20 20 6e 53 65 70 20 3d 20 73 71 6c 69 74 65     nSep = sqlite
bfe0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
bff0: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65  gv[1]);.      }e
c000: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  lse{.        zSe
c010: 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 20  p = ",";.       
c020: 20 6e 53 65 70 20 3d 20 31 3b 0a 20 20 20 20 20   nSep = 1;.     
c030: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 65   }.      if( zSe
c040: 70 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  p ) sqlite3StrAc
c050: 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d  cumAppend(pAccum
c060: 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20  , zSep, nSep);. 
c070: 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20 3d 20     }.    zVal = 
c080: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
c090: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
c0a0: 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20 73  ]);.    nVal = s
c0b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
c0c0: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
c0d0: 20 69 66 28 20 7a 56 61 6c 20 29 20 73 71 6c 69   if( zVal ) sqli
c0e0: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
c0f0: 64 28 70 41 63 63 75 6d 2c 20 7a 56 61 6c 2c 20  d(pAccum, zVal, 
c100: 6e 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  nVal);.  }.}.sta
c110: 74 69 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f  tic void groupCo
c120: 6e 63 61 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c  ncatFinalize(sql
c130: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
c140: 6e 74 65 78 74 29 7b 0a 20 20 53 74 72 41 63 63  ntext){.  StrAcc
c150: 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 70 41  um *pAccum;.  pA
c160: 63 63 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 61  ccum = sqlite3_a
c170: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
c180: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
c190: 69 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20  if( pAccum ){.  
c1a0: 20 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61 63    if( pAccum->ac
c1b0: 63 45 72 72 6f 72 3d 3d 53 54 52 41 43 43 55 4d  cError==STRACCUM
c1c0: 5f 54 4f 4f 42 49 47 20 29 7b 0a 20 20 20 20 20  _TOOBIG ){.     
c1d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c1e0: 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e  error_toobig(con
c1f0: 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  text);.    }else
c200: 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61 63 63   if( pAccum->acc
c210: 45 72 72 6f 72 3d 3d 53 54 52 41 43 43 55 4d 5f  Error==STRACCUM_
c220: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
c230: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
c240: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
c250: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20  t);.    }else{  
c260: 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33    .      sqlite3
c270: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
c280: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53 74 72  text, sqlite3Str
c290: 41 63 63 75 6d 46 69 6e 69 73 68 28 70 41 63 63  AccumFinish(pAcc
c2a0: 75 6d 29 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  um), -1, .      
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c2d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
c2e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c2f0: 6e 65 20 64 6f 65 73 20 70 65 72 2d 63 6f 6e 6e  ne does per-conn
c300: 65 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  ection function 
c310: 72 65 67 69 73 74 72 61 74 69 6f 6e 2e 20 20 4d  registration.  M
c320: 6f 73 74 0a 2a 2a 20 6f 66 20 74 68 65 20 62 75  ost.** of the bu
c330: 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ilt-in functions
c340: 20 61 62 6f 76 65 20 61 72 65 20 70 61 72 74 20   above are part 
c350: 6f 66 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75  of the global fu
c360: 6e 63 74 69 6f 6e 20 73 65 74 2e 0a 2a 2a 20 54  nction set..** T
c370: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
c380: 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 6f 73   deals with thos
c390: 65 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 67  e that are not g
c3a0: 6c 6f 62 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lobal..*/.void s
c3b0: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 50 65  qlite3RegisterPe
c3c0: 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74  rConnectionBuilt
c3d0: 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69  inFunctions(sqli
c3e0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
c3f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65  rc = sqlite3_ove
c400: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64  rload_function(d
c410: 62 2c 20 22 4d 41 54 43 48 22 2c 20 32 29 3b 0a  b, "MATCH", 2);.
c420: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
c430: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63  LITE_NOMEM || rc
c440: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
c450: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c460: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
c470: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
c480: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
c490: 65 74 20 74 68 65 20 4c 49 4b 45 4f 50 54 20 66  et the LIKEOPT f
c4a0: 6c 61 67 20 6f 6e 20 74 68 65 20 32 2d 61 72 67  lag on the 2-arg
c4b0: 75 6d 65 6e 74 20 66 75 6e 63 74 69 6f 6e 20 77  ument function w
c4c0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61  ith the given na
c4d0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
c4e0: 69 64 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61  id setLikeOptFla
c4f0: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  g(sqlite3 *db, c
c500: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
c510: 2c 20 75 38 20 66 6c 61 67 56 61 6c 29 7b 0a 20  , u8 flagVal){. 
c520: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
c530: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
c540: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
c550: 20 7a 4e 61 6d 65 2c 20 32 2c 20 53 51 4c 49 54   zName, 2, SQLIT
c560: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66  E_UTF8, 0);.  if
c570: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 29  ( ALWAYS(pDef) )
c580: 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63  {.    pDef->func
c590: 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67 56 61 6c  Flags |= flagVal
c5a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
c5b0: 65 67 69 73 74 65 72 20 74 68 65 20 62 75 69 6c  egister the buil
c5c0: 74 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20 47 4c  t-in LIKE and GL
c5d0: 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  OB functions.  T
c5e0: 68 65 20 63 61 73 65 53 65 6e 73 69 74 69 76 65  he caseSensitive
c5f0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 64 65  .** parameter de
c600: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
c610: 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49 4b 45   or not the LIKE
c620: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63 61 73   operator is cas
c630: 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65 2e 20  e.** sensitive. 
c640: 20 47 4c 4f 42 20 69 73 20 61 6c 77 61 79 73 20   GLOB is always 
c650: 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2e 0a  case sensitive..
c660: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
c670: 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74  egisterLikeFunct
c680: 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ions(sqlite3 *db
c690: 2c 20 69 6e 74 20 63 61 73 65 53 65 6e 73 69 74  , int caseSensit
c6a0: 69 76 65 29 7b 0a 20 20 73 74 72 75 63 74 20 63  ive){.  struct c
c6b0: 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66  ompareInfo *pInf
c6c0: 6f 3b 0a 20 20 69 66 28 20 63 61 73 65 53 65 6e  o;.  if( caseSen
c6d0: 73 69 74 69 76 65 20 29 7b 0a 20 20 20 20 70 49  sitive ){.    pI
c6e0: 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f  nfo = (struct co
c6f0: 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65  mpareInfo*)&like
c700: 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c 73 65  InfoAlt;.  }else
c710: 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73  {.    pInfo = (s
c720: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
c730: 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d  o*)&likeInfoNorm
c740: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
c750: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 6c  reateFunc(db, "l
c760: 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ike", 2, SQLITE_
c770: 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b  UTF8, pInfo, lik
c780: 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b  eFunc, 0, 0, 0);
c790: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
c7a0: 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c  Func(db, "like",
c7b0: 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   3, SQLITE_UTF8,
c7c0: 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63   pInfo, likeFunc
c7d0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
c7e0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
c7f0: 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32 2c 20 53  db, "glob", 2, S
c800: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
c810: 20 20 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61     (struct compa
c820: 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62 49 6e 66  reInfo*)&globInf
c830: 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20  o, likeFunc, 0, 
c840: 30 2c 20 30 29 3b 0a 20 20 73 65 74 4c 69 6b 65  0, 0);.  setLike
c850: 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67 6c 6f  OptFlag(db, "glo
c860: 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  b", SQLITE_FUNC_
c870: 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55  LIKE | SQLITE_FU
c880: 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65 74 4c  NC_CASE);.  setL
c890: 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22  ikeOptFlag(db, "
c8a0: 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20 63 61  like", .      ca
c8b0: 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20 28 53  seSensitive ? (S
c8c0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20  QLITE_FUNC_LIKE 
c8d0: 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  | SQLITE_FUNC_CA
c8e0: 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46 55 4e  SE) : SQLITE_FUN
c8f0: 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_LIKE);.}../*.*
c900: 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73 20 74  * pExpr points t
c910: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
c920: 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74 73  which implements
c930: 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66   a function.  If
c940: 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72 6f 70  .** it is approp
c950: 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79 20 74  riate to apply t
c960: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
c970: 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66 75 6e  tion to that fun
c980: 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73 65  ction.** then se
c990: 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75 67 68  t aWc[0] through
c9a0: 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65 20 77   aWc[2] to the w
c9b0: 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65  ildcard characte
c9c0: 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 73  rs and the.** es
c9d0: 63 61 70 65 20 63 68 61 72 61 63 74 65 72 20 61  cape character a
c9e0: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54  nd then return T
c9f0: 52 55 45 2e 20 20 49 66 20 74 68 65 20 66 75 6e  RUE.  If the fun
ca00: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 0a  ction is not a .
ca10: 2a 2a 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75  ** LIKE-style fu
ca20: 6e 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 74 75  nction then retu
ca30: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a 20  rn FALSE..**.** 
ca40: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
ca50: 61 20 4c 49 4b 45 20 62 20 45 53 43 41 50 45 20  a LIKE b ESCAPE 
ca60: 63 22 20 69 73 20 6f 6e 6c 79 20 63 6f 6e 73 69  c" is only consi
ca70: 64 65 72 65 64 20 61 20 76 61 6c 69 64 20 4c 49  dered a valid LI
ca80: 4b 45 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  KE.** operator i
ca90: 66 20 63 20 69 73 20 61 20 73 74 72 69 6e 67 20  f c is a string 
caa0: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73 20  literal that is 
cab0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74 65  exactly one byte
cac0: 20 69 6e 20 6c 65 6e 67 74 68 2e 0a 2a 2a 20 54   in length..** T
cad0: 68 61 74 20 6f 6e 65 20 62 79 74 65 20 69 73 20  hat one byte is 
cae0: 73 74 6f 72 65 64 20 69 6e 20 61 57 63 5b 33 5d  stored in aWc[3]
caf0: 2e 20 20 61 57 63 5b 33 5d 20 69 73 20 73 65 74  .  aWc[3] is set
cb00: 20 74 6f 20 7a 65 72 6f 20 69 66 20 74 68 65 72   to zero if ther
cb10: 65 20 69 73 0a 2a 2a 20 6e 6f 20 45 53 43 41 50  e is.** no ESCAP
cb20: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
cb30: 2a 70 49 73 4e 6f 63 61 73 65 20 69 73 20 73 65  *pIsNocase is se
cb40: 74 20 74 6f 20 74 72 75 65 20 69 66 20 75 70 70  t to true if upp
cb50: 65 72 63 61 73 65 20 61 6e 64 20 6c 6f 77 65 72  ercase and lower
cb60: 63 61 73 65 20 61 72 65 20 65 71 75 69 76 61 6c  case are equival
cb70: 65 6e 74 20 66 6f 72 0a 2a 2a 20 74 68 65 20 66  ent for.** the f
cb80: 75 6e 63 74 69 6f 6e 20 28 64 65 66 61 75 6c 74  unction (default
cb90: 20 66 6f 72 20 4c 49 4b 45 29 2e 20 20 49 66 20   for LIKE).  If 
cba0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d 61 6b  the function mak
cbb0: 65 73 20 74 68 65 20 64 69 73 74 69 6e 63 74 69  es the distincti
cbc0: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 75 70  on.** between up
cbd0: 70 65 72 63 61 73 65 20 61 6e 64 20 6c 6f 77 65  percase and lowe
cbe0: 72 63 61 73 65 20 28 61 73 20 64 6f 65 73 20 47  rcase (as does G
cbf0: 4c 4f 42 29 20 74 68 65 6e 20 2a 70 49 73 4e 6f  LOB) then *pIsNo
cc00: 63 61 73 65 20 69 73 20 73 65 74 20 74 6f 0a 2a  case is set to.*
cc10: 2a 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  * false..*/.int 
cc20: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
cc30: 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  ction(sqlite3 *d
cc40: 62 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  b, Expr *pExpr, 
cc50: 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73 65 2c 20  int *pIsNocase, 
cc60: 63 68 61 72 20 2a 61 57 63 29 7b 0a 20 20 46 75  char *aWc){.  Fu
cc70: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 69  ncDef *pDef;.  i
cc80: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  nt nExpr;.  if( 
cc90: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55  pExpr->op!=TK_FU
cca0: 4e 43 54 49 4f 4e 20 7c 7c 20 21 70 45 78 70 72  NCTION || !pExpr
ccb0: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
ccc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
ccd0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
cce0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
ccf0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
cd00: 3b 0a 20 20 6e 45 78 70 72 20 3d 20 70 45 78 70  ;.  nExpr = pExp
cd10: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
cd20: 72 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69  r;.  pDef = sqli
cd30: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
cd40: 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  db, pExpr->u.zTo
cd50: 6b 65 6e 2c 20 6e 45 78 70 72 2c 20 53 51 4c 49  ken, nExpr, SQLI
cd60: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69  TE_UTF8, 0);.  i
cd70: 66 28 20 4e 45 56 45 52 28 70 44 65 66 3d 3d 30  f( NEVER(pDef==0
cd80: 29 20 7c 7c 20 28 70 44 65 66 2d 3e 66 75 6e 63  ) || (pDef->func
cd90: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
cda0: 55 4e 43 5f 4c 49 4b 45 29 3d 3d 30 20 29 7b 0a  UNC_LIKE)==0 ){.
cdb0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cdc0: 7d 0a 20 20 69 66 28 20 6e 45 78 70 72 3c 33 20  }.  if( nExpr<3 
cdd0: 29 7b 0a 20 20 20 20 61 57 63 5b 33 5d 20 3d 20  ){.    aWc[3] = 
cde0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
cdf0: 45 78 70 72 20 2a 70 45 73 63 61 70 65 20 3d 20  Expr *pEscape = 
ce00: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
ce10: 61 5b 32 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[2].pExpr;.    
ce20: 63 68 61 72 20 2a 7a 45 73 63 61 70 65 3b 0a 20  char *zEscape;. 
ce30: 20 20 20 69 66 28 20 70 45 73 63 61 70 65 2d 3e     if( pEscape->
ce40: 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 20  op!=TK_STRING ) 
ce50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a 45  return 0;.    zE
ce60: 73 63 61 70 65 20 3d 20 70 45 73 63 61 70 65 2d  scape = pEscape-
ce70: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  >u.zToken;.    i
ce80: 66 28 20 7a 45 73 63 61 70 65 5b 30 5d 3d 3d 30  f( zEscape[0]==0
ce90: 20 7c 7c 20 7a 45 73 63 61 70 65 5b 31 5d 21 3d   || zEscape[1]!=
cea0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ceb0: 20 20 61 57 63 5b 33 5d 20 3d 20 7a 45 73 63 61    aWc[3] = zEsca
cec0: 70 65 5b 30 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pe[0];.  }..  /*
ced0: 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73 74   The memcpy() st
cee0: 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73 20  atement assumes 
cef0: 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61 72  that the wildcar
cf00: 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65  d characters are
cf10: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
cf20: 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74 73  three statements
cf30: 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65 49   in the compareI
cf40: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
cf50: 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 73  The.  ** asserts
cf60: 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76  () that follow v
cf70: 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75 6d  erify that assum
cf80: 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ption.  */.  mem
cf90: 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e 70  cpy(aWc, pDef->p
cfa0: 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20 20  UserData, 3);.  
cfb0: 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29 26  assert( (char*)&
cfc0: 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28  likeInfoAlt == (
cfd0: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
cfe0: 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20  lt.matchAll );. 
cff0: 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61 72   assert( &((char
d000: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b  *)&likeInfoAlt)[
d010: 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69  1] == (char*)&li
d020: 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f  keInfoAlt.matchO
d030: 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
d040: 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  &((char*)&likeIn
d050: 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68  foAlt)[2] == (ch
d060: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
d070: 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20 2a  .matchSet );.  *
d080: 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44 65  pIsNocase = (pDe
d090: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
d0a0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
d0b0: 3d 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ==0;.  return 1;
d0c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  .}../*.** All of
d0d0: 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74 72   the FuncDef str
d0e0: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 61  uctures in the a
d0f0: 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61 72  BuiltinFunc[] ar
d100: 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ray above.** to 
d110: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
d120: 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 20  ion hash table. 
d130: 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 74 20   This occurs at 
d140: 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a 2a  start-time (as.*
d150: 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  * a consequence 
d160: 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  of calling sqlit
d170: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 29  e3_initialize())
d180: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
d190: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 0a  is routine runs.
d1a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
d1b0: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
d1c0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
d1d0: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c   /*.  ** The fol
d1e0: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
d1f0: 64 73 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ds FuncDef struc
d200: 74 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66  tures for all of
d210: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20   the functions. 
d220: 20 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74   ** defined in t
d230: 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  his file..  **. 
d240: 20 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63 61   ** The array ca
d250: 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  nnot be constant
d260: 20 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61   since changes a
d270: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20  re made to the. 
d280: 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73   ** FuncDef.pHas
d290: 68 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74  h elements at st
d2a0: 61 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65  art-time.  The e
d2b0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20  lements of this 
d2c0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72  array.  ** are r
d2d0: 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69  ead-only after i
d2e0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73  nitialization is
d2f0: 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2a 0a   complete..  **.
d300: 20 20 2a 2a 20 46 6f 72 20 70 65 61 6b 20 65 66    ** For peak ef
d310: 66 69 63 69 65 6e 63 79 2c 20 70 75 74 20 74 68  ficiency, put th
d320: 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 6c  e most frequentl
d330: 79 20 75 73 65 64 20 66 75 6e 63 74 69 6f 6e 20  y used function 
d340: 6c 61 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61  last..  */.  sta
d350: 74 69 63 20 46 75 6e 63 44 65 66 20 61 42 75 69  tic FuncDef aBui
d360: 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 23  ltinFunc[] = {.#
d370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55  ifdef SQLITE_SOU
d380: 4e 44 45 58 0a 20 20 20 20 46 55 4e 43 54 49 4f  NDEX.    FUNCTIO
d390: 4e 28 73 6f 75 6e 64 65 78 2c 20 20 20 20 20 20  N(soundex,      
d3a0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73        1, 0, 0, s
d3b0: 6f 75 6e 64 65 78 46 75 6e 63 20 20 20 20 20 20  oundexFunc      
d3c0: 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  ),.#endif.#ifnde
d3d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
d3e0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
d3f0: 20 56 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f   VFUNCTION(load_
d400: 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 31 2c  extension,    1,
d410: 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20   0, 0, loadExt  
d420: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56          ),.    V
d430: 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78  FUNCTION(load_ex
d440: 74 65 6e 73 69 6f 6e 2c 20 20 20 20 32 2c 20 30  tension,    2, 0
d450: 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20  , 0, loadExt    
d460: 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a        ),.#endif.
d470: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
d480: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
d490: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69     FUNCTION(sqli
d4a0: 74 65 5f 63 72 79 70 74 2c 20 20 20 20 20 20 20  te_crypt,       
d4b0: 32 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33  2, 0, 0, sqlite3
d4c0: 43 72 79 70 74 46 75 6e 63 20 29 2c 0a 23 65 6e  CryptFunc ),.#en
d4d0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
d4e0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
d4f0: 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20 20 20  PTION_DIAGS.    
d500: 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65  DFUNCTION(sqlite
d510: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
d520: 73 65 64 2c 31 2c 20 30 2c 20 30 2c 20 63 6f 6d  sed,1, 0, 0, com
d530: 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46 75  pileoptionusedFu
d540: 6e 63 20 20 29 2c 0a 20 20 20 20 44 46 55 4e 43  nc  ),.    DFUNC
d550: 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70  TION(sqlite_comp
d560: 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 2c 20 31  ileoption_get, 1
d570: 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f  , 0, 0, compileo
d580: 70 74 69 6f 6e 67 65 74 46 75 6e 63 20 20 29 2c  ptiongetFunc  ),
d590: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d5a0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
d5b0: 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 20 20  TION_DIAGS */.  
d5c0: 20 20 46 55 4e 43 54 49 4f 4e 32 28 75 6e 6c 69    FUNCTION2(unli
d5d0: 6b 65 6c 79 2c 20 20 20 20 20 20 20 20 20 20 31  kely,          1
d5e0: 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63  , 0, 0, noopFunc
d5f0: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55  ,  SQLITE_FUNC_U
d600: 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20 46 55  NLIKELY),.    FU
d610: 4e 43 54 49 4f 4e 32 28 6c 69 6b 65 6c 69 68 6f  NCTION2(likeliho
d620: 6f 64 2c 20 20 20 20 20 20 20 20 32 2c 20 30 2c  od,        2, 0,
d630: 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53   0, noopFunc,  S
d640: 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
d650: 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  ELY),.    FUNCTI
d660: 4f 4e 32 28 6c 69 6b 65 6c 79 2c 20 20 20 20 20  ON2(likely,     
d670: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
d680: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
d690: 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29  E_FUNC_UNLIKELY)
d6a0: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
d6b0: 44 45 42 55 47 0a 20 20 20 20 46 55 4e 43 54 49  DEBUG.    FUNCTI
d6c0: 4f 4e 32 28 61 66 66 69 6e 69 74 79 2c 20 20 20  ON2(affinity,   
d6d0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
d6e0: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
d6f0: 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 29  E_FUNC_AFFINITY)
d700: 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 55 4e  ,.#endif.    FUN
d710: 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20  CTION(ltrim,    
d720: 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20            1, 1, 
d730: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
d740: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
d750: 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20 20 20  ION(ltrim,      
d760: 20 20 20 20 20 20 20 20 32 2c 20 31 2c 20 30 2c          2, 1, 0,
d770: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
d780: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
d790: 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20  N(rtrim,        
d7a0: 20 20 20 20 20 20 31 2c 20 32 2c 20 30 2c 20 74        1, 2, 0, t
d7b0: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
d7c0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
d7d0: 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20  rtrim,          
d7e0: 20 20 20 20 32 2c 20 32 2c 20 30 2c 20 74 72 69      2, 2, 0, tri
d7f0: 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c  mFunc         ),
d800: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72  .    FUNCTION(tr
d810: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
d820: 20 20 31 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46    1, 3, 0, trimF
d830: 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20  unc         ),. 
d840: 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72 69 6d     FUNCTION(trim
d850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d860: 32 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46 75 6e  2, 3, 0, trimFun
d870: 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  c         ),.   
d880: 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20   FUNCTION(min,  
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
d8a0: 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e   0, 1, minmaxFun
d8b0: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
d8c0: 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20 20 20  UNCTION(min,    
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
d8e0: 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20  , 1, 0          
d8f0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47        ),.    AGG
d900: 52 45 47 41 54 45 32 28 6d 69 6e 2c 20 20 20 20  REGATE2(min,    
d910: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
d920: 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20  1, minmaxStep,  
d930: 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69      minMaxFinali
d940: 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
d970: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
d980: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
d990: 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20 20  (max,           
d9a0: 20 20 20 20 2d 31 2c 20 31 2c 20 31 2c 20 6d 69      -1, 1, 1, mi
d9b0: 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20 29  nmaxFunc       )
d9c0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d  ,.    FUNCTION(m
d9d0: 61 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ax,             
d9e0: 20 20 20 30 2c 20 31 2c 20 31 2c 20 30 20 20 20     0, 1, 1, 0   
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a               ),.
da00: 20 20 20 20 41 47 47 52 45 47 41 54 45 32 28 6d      AGGREGATE2(m
da10: 61 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ax,             
da20: 20 31 2c 20 31 2c 20 31 2c 20 6d 69 6e 6d 61 78   1, 1, 1, minmax
da30: 53 74 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61  Step,      minMa
da40: 78 46 69 6e 61 6c 69 7a 65 2c 0a 20 20 20 20 20  xFinalize,.     
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43       SQLITE_FUNC
da80: 5f 4d 49 4e 4d 41 58 20 29 2c 0a 20 20 20 20 46  _MINMAX ),.    F
da90: 55 4e 43 54 49 4f 4e 32 28 74 79 70 65 6f 66 2c  UNCTION2(typeof,
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
dab0: 2c 20 30 2c 20 74 79 70 65 6f 66 46 75 6e 63 2c  , 0, typeofFunc,
dac0: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59    SQLITE_FUNC_TY
dad0: 50 45 4f 46 29 2c 0a 20 20 20 20 46 55 4e 43 54  PEOF),.    FUNCT
dae0: 49 4f 4e 32 28 6c 65 6e 67 74 68 2c 20 20 20 20  ION2(length,    
daf0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
db00: 20 6c 65 6e 67 74 68 46 75 6e 63 2c 20 20 53 51   lengthFunc,  SQ
db10: 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
db20: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
db30: 69 6e 73 74 72 2c 20 20 20 20 20 20 20 20 20 20  instr,          
db40: 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 69 6e 73      2, 0, 0, ins
db50: 74 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  trFunc        ),
db60: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 70 72  .    FUNCTION(pr
db70: 69 6e 74 66 2c 20 20 20 20 20 20 20 20 20 20 20  intf,           
db80: 20 2d 31 2c 20 30 2c 20 30 2c 20 70 72 69 6e 74   -1, 0, 0, print
db90: 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  fFunc       ),. 
dba0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 6e 69 63     FUNCTION(unic
dbb0: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
dbc0: 31 2c 20 30 2c 20 30 2c 20 75 6e 69 63 6f 64 65  1, 0, 0, unicode
dbd0: 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20  Func      ),.   
dbe0: 20 46 55 4e 43 54 49 4f 4e 28 63 68 61 72 2c 20   FUNCTION(char, 
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
dc00: 20 30 2c 20 30 2c 20 63 68 61 72 46 75 6e 63 20   0, 0, charFunc 
dc10: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
dc20: 55 4e 43 54 49 4f 4e 28 61 62 73 2c 20 20 20 20  UNCTION(abs,    
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
dc40: 2c 20 30 2c 20 61 62 73 46 75 6e 63 20 20 20 20  , 0, absFunc    
dc50: 20 20 20 20 20 20 29 2c 0a 23 69 66 6e 64 65 66        ),.#ifndef
dc60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
dc70: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
dc80: 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20  FUNCTION(round, 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
dca0: 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20  0, 0, roundFunc 
dcb0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
dcc0: 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20  NCTION(round,   
dcd0: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
dce0: 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 20   0, roundFunc   
dcf0: 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a 20       ),.#endif. 
dd00: 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 70 70 65     FUNCTION(uppe
dd10: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
dd20: 31 2c 20 30 2c 20 30 2c 20 75 70 70 65 72 46 75  1, 0, 0, upperFu
dd30: 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  nc        ),.   
dd40: 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77 65 72 2c   FUNCTION(lower,
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
dd60: 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46 75 6e 63   0, 0, lowerFunc
dd70: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
dd80: 55 4e 43 54 49 4f 4e 28 68 65 78 2c 20 20 20 20  UNCTION(hex,    
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
dda0: 2c 20 30 2c 20 68 65 78 46 75 6e 63 20 20 20 20  , 0, hexFunc    
ddb0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
ddc0: 43 54 49 4f 4e 32 28 69 66 6e 75 6c 6c 2c 20 20  CTION2(ifnull,  
ddd0: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
dde0: 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51  0, noopFunc,  SQ
ddf0: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
de00: 43 45 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49  CE),.    VFUNCTI
de10: 4f 4e 28 72 61 6e 64 6f 6d 2c 20 20 20 20 20 20  ON(random,      
de20: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 72        0, 0, 0, r
de30: 61 6e 64 6f 6d 46 75 6e 63 20 20 20 20 20 20 20  andomFunc       
de40: 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e  ),.    VFUNCTION
de50: 28 72 61 6e 64 6f 6d 62 6c 6f 62 2c 20 20 20 20  (randomblob,    
de60: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 72 61 6e      1, 0, 0, ran
de70: 64 6f 6d 42 6c 6f 62 20 20 20 20 20 20 20 29 2c  domBlob       ),
de80: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6e 75  .    FUNCTION(nu
de90: 6c 6c 69 66 2c 20 20 20 20 20 20 20 20 20 20 20  llif,           
dea0: 20 20 32 2c 20 30 2c 20 31 2c 20 6e 75 6c 6c 69    2, 0, 1, nulli
deb0: 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  fFunc       ),. 
dec0: 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c     DFUNCTION(sql
ded0: 69 74 65 5f 76 65 72 73 69 6f 6e 2c 20 20 20 20  ite_version,    
dee0: 30 2c 20 30 2c 20 30 2c 20 76 65 72 73 69 6f 6e  0, 0, 0, version
def0: 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20  Func      ),.   
df00: 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74   DFUNCTION(sqlit
df10: 65 5f 73 6f 75 72 63 65 5f 69 64 2c 20 20 30 2c  e_source_id,  0,
df20: 20 30 2c 20 30 2c 20 73 6f 75 72 63 65 69 64 46   0, 0, sourceidF
df30: 75 6e 63 20 20 20 20 20 29 2c 0a 20 20 20 20 46  unc     ),.    F
df40: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 6c  UNCTION(sqlite_l
df50: 6f 67 2c 20 20 20 20 20 20 20 20 20 32 2c 20 30  og,         2, 0
df60: 2c 20 30 2c 20 65 72 72 6c 6f 67 46 75 6e 63 20  , 0, errlogFunc 
df70: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
df80: 43 54 49 4f 4e 28 71 75 6f 74 65 2c 20 20 20 20  CTION(quote,    
df90: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
dfa0: 30 2c 20 71 75 6f 74 65 46 75 6e 63 20 20 20 20  0, quoteFunc    
dfb0: 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43      ),.    VFUNC
dfc0: 54 49 4f 4e 28 6c 61 73 74 5f 69 6e 73 65 72 74  TION(last_insert
dfd0: 5f 72 6f 77 69 64 2c 20 30 2c 20 30 2c 20 30 2c  _rowid, 0, 0, 0,
dfe0: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
dff0: 69 64 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49  id),.    VFUNCTI
e000: 4f 4e 28 63 68 61 6e 67 65 73 2c 20 20 20 20 20  ON(changes,     
e010: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 63        0, 0, 0, c
e020: 68 61 6e 67 65 73 20 20 20 20 20 20 20 20 20 20  hanges          
e030: 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e  ),.    VFUNCTION
e040: 28 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 2c 20  (total_changes, 
e050: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 74 6f 74      0, 0, 0, tot
e060: 61 6c 5f 63 68 61 6e 67 65 73 20 20 20 20 29 2c  al_changes    ),
e070: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 65  .    FUNCTION(re
e080: 70 6c 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  place,          
e090: 20 20 33 2c 20 30 2c 20 30 2c 20 72 65 70 6c 61    3, 0, 0, repla
e0a0: 63 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20  ceFunc      ),. 
e0b0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 7a 65 72 6f     FUNCTION(zero
e0c0: 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 20 20  blob,           
e0d0: 31 2c 20 30 2c 20 30 2c 20 7a 65 72 6f 62 6c 6f  1, 0, 0, zeroblo
e0e0: 62 46 75 6e 63 20 20 20 20 20 29 2c 0a 20 20 20  bFunc     ),.   
e0f0: 20 46 55 4e 43 54 49 4f 4e 28 73 75 62 73 74 72   FUNCTION(substr
e100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  ,             2,
e110: 20 30 2c 20 30 2c 20 73 75 62 73 74 72 46 75 6e   0, 0, substrFun
e120: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
e130: 55 4e 43 54 49 4f 4e 28 73 75 62 73 74 72 2c 20  UNCTION(substr, 
e140: 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20 30              3, 0
e150: 2c 20 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20  , 0, substrFunc 
e160: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47        ),.    AGG
e170: 52 45 47 41 54 45 28 73 75 6d 2c 20 20 20 20 20  REGATE(sum,     
e180: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
e190: 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20  0, sumStep,     
e1a0: 20 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a 65 20      sumFinalize 
e1b0: 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47     ),.    AGGREG
e1c0: 41 54 45 28 74 6f 74 61 6c 2c 20 20 20 20 20 20  ATE(total,      
e1d0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
e1e0: 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20  sumStep,        
e1f0: 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 20 20   totalFinalize  
e200: 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41    ),.    AGGREGA
e210: 54 45 28 61 76 67 2c 20 20 20 20 20 20 20 20 20  TE(avg,         
e220: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73        1, 0, 0, s
e230: 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20 20  umStep,         
e240: 61 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20 29  avgFinalize    )
e250: 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 32  ,.    AGGREGATE2
e260: 28 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  (count,         
e270: 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f 75 6e     0, 0, 0, coun
e280: 74 53 74 65 70 2c 20 20 20 20 20 20 20 63 6f 75  tStep,       cou
e290: 6e 74 46 69 6e 61 6c 69 7a 65 2c 0a 20 20 20 20  ntFinalize,.    
e2a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
e2b0: 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 20 20 29 2c  E_FUNC_COUNT  ),
e2c0: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 63  .    AGGREGATE(c
e2d0: 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ount,           
e2e0: 20 20 31 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74    1, 0, 0, count
e2f0: 53 74 65 70 2c 20 20 20 20 20 20 20 63 6f 75 6e  Step,       coun
e300: 74 46 69 6e 61 6c 69 7a 65 20 20 29 2c 0a 20 20  tFinalize  ),.  
e310: 20 20 41 47 47 52 45 47 41 54 45 28 67 72 6f 75    AGGREGATE(grou
e320: 70 5f 63 6f 6e 63 61 74 2c 20 20 20 20 20 20 31  p_concat,      1
e330: 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e  , 0, 0, groupCon
e340: 63 61 74 53 74 65 70 2c 20 67 72 6f 75 70 43 6f  catStep, groupCo
e350: 6e 63 61 74 46 69 6e 61 6c 69 7a 65 29 2c 0a 20  ncatFinalize),. 
e360: 20 20 20 41 47 47 52 45 47 41 54 45 28 67 72 6f     AGGREGATE(gro
e370: 75 70 5f 63 6f 6e 63 61 74 2c 20 20 20 20 20 20  up_concat,      
e380: 32 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f  2, 0, 0, groupCo
e390: 6e 63 61 74 53 74 65 70 2c 20 67 72 6f 75 70 43  ncatStep, groupC
e3a0: 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 29 2c 0a  oncatFinalize),.
e3b0: 20 20 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28    .    LIKEFUNC(
e3c0: 67 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f 62 49 6e  glob, 2, &globIn
e3d0: 66 6f 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  fo, SQLITE_FUNC_
e3e0: 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43  LIKE|SQLITE_FUNC
e3f0: 5f 43 41 53 45 29 2c 0a 23 69 66 64 65 66 20 53  _CASE),.#ifdef S
e400: 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49  QLITE_CASE_SENSI
e410: 54 49 56 45 5f 4c 49 4b 45 0a 20 20 20 20 4c 49  TIVE_LIKE.    LI
e420: 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20  KEFUNC(like, 2, 
e430: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51  &likeInfoAlt, SQ
e440: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53  LITE_FUNC_LIKE|S
e450: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
e460: 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c  ,.    LIKEFUNC(l
e470: 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66  ike, 3, &likeInf
e480: 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e  oAlt, SQLITE_FUN
e490: 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55  C_LIKE|SQLITE_FU
e4a0: 4e 43 5f 43 41 53 45 29 2c 0a 23 65 6c 73 65 0a  NC_CASE),.#else.
e4b0: 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b      LIKEFUNC(lik
e4c0: 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e  e, 2, &likeInfoN
e4d0: 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  orm, SQLITE_FUNC
e4e0: 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c 49 4b 45  _LIKE),.    LIKE
e4f0: 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c  FUNC(like, 3, &l
e500: 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c  ikeInfoNorm, SQL
e510: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a  ITE_FUNC_LIKE),.
e520: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
e530: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e  LITE_ENABLE_UNKN
e540: 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e  OWN_SQL_FUNCTION
e550: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 6e  .    FUNCTION(un
e560: 6b 6e 6f 77 6e 2c 20 20 20 20 20 20 20 20 20 20  known,          
e570: 20 2d 31 2c 20 30 2c 20 30 2c 20 75 6e 6b 6e 6f   -1, 0, 0, unkno
e580: 77 6e 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 23  wnFunc      ),.#
e590: 65 6e 64 69 66 0a 20 20 20 20 46 55 4e 43 54 49  endif.    FUNCTI
e5a0: 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20  ON(coalesce,    
e5b0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
e5c0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e5d0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e5e0: 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20  (coalesce,      
e5f0: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 20       0, 0, 0, 0 
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
e610: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  ,.    FUNCTION2(
e620: 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20  coalesce,       
e630: 20 20 2d 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70    -1, 0, 0, noop
e640: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
e650: 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a 20 20  NC_COALESCE),.  
e660: 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  };.#ifndef SQLIT
e670: 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
e680: 45 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72  E.  sqlite3Alter
e690: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 65 6e  Functions();.#en
e6a0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
e6b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
e6c0: 41 54 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  AT3) || defined(
e6d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
e6e0: 41 54 34 29 0a 20 20 73 71 6c 69 74 65 33 41 6e  AT4).  sqlite3An
e6f0: 61 6c 79 7a 65 46 75 6e 63 74 69 6f 6e 73 28 29  alyzeFunctions()
e700: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
e710: 65 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69  e3RegisterDateTi
e720: 6d 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20  meFunctions();. 
e730: 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74 42 75   sqlite3InsertBu
e740: 69 6c 74 69 6e 46 75 6e 63 73 28 61 42 75 69 6c  iltinFuncs(aBuil
e750: 74 69 6e 46 75 6e 63 2c 20 41 72 72 61 79 53 69  tinFunc, ArraySi
e760: 7a 65 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 29  ze(aBuiltinFunc)
e770: 29 3b 0a 0a 23 69 66 20 30 20 20 2f 2a 20 45 6e  );..#if 0  /* En
e780: 61 62 6c 65 20 74 6f 20 70 72 69 6e 74 20 6f 75  able to print ou
e790: 74 20 68 6f 77 20 74 68 65 20 62 75 69 6c 74 2d  t how the built-
e7a0: 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  in functions are
e7b0: 20 68 61 73 68 65 64 20 2a 2f 0a 20 20 7b 0a 20   hashed */.  {. 
e7c0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 75     int i;.    Fu
e7d0: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 66 6f  ncDef *p;.    fo
e7e0: 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f  r(i=0; i<SQLITE_
e7f0: 46 55 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b  FUNC_HASH_SZ; i+
e800: 2b 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  +){.      printf
e810: 28 22 46 55 4e 43 2d 48 41 53 48 20 25 30 32 64  ("FUNC-HASH %02d
e820: 3a 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 66 6f  :", i);.      fo
e830: 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69 6c 74  r(p=sqlite3Built
e840: 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b 69 5d  inFunctions.a[i]
e850: 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48 61 73  ; p; p=p->u.pHas
e860: 68 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  h){.        int 
e870: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
e880: 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  n30(p->zName);. 
e890: 20 20 20 20 20 20 20 69 6e 74 20 68 20 3d 20 70         int h = p
e8a0: 2d 3e 7a 4e 61 6d 65 5b 30 5d 20 2b 20 6e 3b 0a  ->zName[0] + n;.
e8b0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
e8c0: 20 25 73 28 25 64 29 22 2c 20 70 2d 3e 7a 4e 61   %s(%d)", p->zNa
e8d0: 6d 65 2c 20 68 29 3b 0a 20 20 20 20 20 20 7d 0a  me, h);.      }.
e8e0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e        printf("\n
e8f0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ");.    }.  }.#e
e900: 6e 64 69 66 0a 7d 0a                             ndif.}.