/ Hex Artifact Content
Login

Artifact b4d259af627e3cd9510cf08db37f0bcc88b1887c735169c74490c3739d5cf5c6:


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: 75 33 32 20 63 78 3b 0a 20 20 20 20 20 20 20 20  u32 cx;.        
5290: 69 6e 74 20 62 4d 61 74 63 68 3b 0a 20 20 20 20  int bMatch;.    
52a0: 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29      if( noCase )
52b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 78 20 3d  {.          cx =
52c0: 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28   sqlite3Toupper(
52d0: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  c);.          c 
52e0: 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72  = sqlite3Tolower
52f0: 28 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  (c);.        }el
5300: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 78  se{.          cx
5310: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = c;.        }.
5320: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
5330: 63 32 20 3d 20 2a 28 7a 53 74 72 69 6e 67 2b 2b  c2 = *(zString++
5340: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
5350: 20 20 20 69 66 28 20 63 32 21 3d 63 20 26 26 20     if( c2!=c && 
5360: 63 32 21 3d 63 78 20 29 20 63 6f 6e 74 69 6e 75  c2!=cx ) continu
5370: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61  e;.          bMa
5380: 74 63 68 20 3d 20 70 61 74 74 65 72 6e 43 6f 6d  tch = patternCom
5390: 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a 53  pare(zPattern,zS
53a0: 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 6d 61 74 63  tring,pInfo,matc
53b0: 68 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20  hOther);.       
53c0: 20 20 20 69 66 28 20 62 4d 61 74 63 68 21 3d 53     if( bMatch!=S
53d0: 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 20 29 20  QLITE_NOMATCH ) 
53e0: 72 65 74 75 72 6e 20 62 4d 61 74 63 68 3b 0a 20  return bMatch;. 
53f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
5410: 74 20 62 4d 61 74 63 68 3b 0a 20 20 20 20 20 20  t bMatch;.      
5420: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 55    while( (c2 = U
5430: 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 29  tf8Read(zString)
5440: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
5450: 20 20 69 66 28 20 63 32 21 3d 63 20 29 20 63 6f    if( c2!=c ) co
5460: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5470: 20 20 62 4d 61 74 63 68 20 3d 20 70 61 74 74 65    bMatch = patte
5480: 72 6e 43 6f 6d 70 61 72 65 28 7a 50 61 74 74 65  rnCompare(zPatte
5490: 72 6e 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f  rn,zString,pInfo
54a0: 2c 6d 61 74 63 68 4f 74 68 65 72 29 3b 0a 20 20  ,matchOther);.  
54b0: 20 20 20 20 20 20 20 20 69 66 28 20 62 4d 61 74          if( bMat
54c0: 63 68 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 41 54  ch!=SQLITE_NOMAT
54d0: 43 48 20 29 20 72 65 74 75 72 6e 20 62 4d 61 74  CH ) return bMat
54e0: 63 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ch;.        }.  
54f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
5500: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 57 49 4c 44  rn SQLITE_NOWILD
5510: 43 41 52 44 4d 41 54 43 48 3b 0a 20 20 20 20 7d  CARDMATCH;.    }
5520: 0a 20 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63  .    if( c==matc
5530: 68 4f 74 68 65 72 20 29 7b 0a 20 20 20 20 20 20  hOther ){.      
5540: 69 66 28 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68  if( pInfo->match
5550: 53 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Set==0 ){.      
5560: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66    c = sqlite3Utf
5570: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
5580: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
5590: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
55a0: 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20 20 20  TE_NOMATCH;.    
55b0: 20 20 20 20 7a 45 73 63 61 70 65 64 20 3d 20 7a      zEscaped = z
55c0: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 7d  Pattern;.      }
55d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 33  else{.        u3
55e0: 32 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20  2 prior_c = 0;. 
55f0: 20 20 20 20 20 20 20 69 6e 74 20 73 65 65 6e 20         int seen 
5600: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
5610: 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20   invert = 0;.   
5620: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
5630: 55 74 66 38 52 65 61 64 28 26 7a 53 74 72 69 6e  Utf8Read(&zStrin
5640: 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g);.        if( 
5650: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  c==0 ) return SQ
5660: 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20 20  LITE_NOMATCH;.  
5670: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
5680: 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74  e3Utf8Read(&zPat
5690: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  tern);.        i
56a0: 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20  f( c2=='^' ){.  
56b0: 20 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d          invert =
56c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 32   1;.          c2
56d0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
56e0: 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ad(&zPattern);. 
56f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5700: 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a   if( c2==']' ){.
5710: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
5720: 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b  =']' ) seen = 1;
5730: 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
5740: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
5750: 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  &zPattern);.    
5760: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68      }.        wh
5770: 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27  ile( c2 && c2!='
5780: 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]' ){.          
5790: 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a  if( c2=='-' && z
57a0: 50 61 74 74 65 72 6e 5b 30 5d 21 3d 27 5d 27 20  Pattern[0]!=']' 
57b0: 26 26 20 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d  && zPattern[0]!=
57c0: 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20 29  0 && prior_c>0 )
57d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 32  {.            c2
57e0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
57f0: 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ad(&zPattern);. 
5800: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
5810: 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d  >=prior_c && c<=
5820: 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  c2 ) seen = 1;. 
5830: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72             prior
5840: 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
5850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5860: 20 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29       if( c==c2 )
5870: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5880: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
5890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
58a0: 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32      prior_c = c2
58b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
58c0: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
58d0: 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50  ite3Utf8Read(&zP
58e0: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20  attern);.       
58f0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
5900: 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20  2==0 || (seen ^ 
5910: 69 6e 76 65 72 74 29 3d 3d 30 20 29 7b 0a 20 20  invert)==0 ){.  
5920: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
5930: 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a 20  QLITE_NOMATCH;. 
5940: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5950: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5960: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 32 20   }.    }.    c2 
5970: 3d 20 55 74 66 38 52 65 61 64 28 7a 53 74 72 69  = Utf8Read(zStri
5980: 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ng);.    if( c==
5990: 63 32 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  c2 ) continue;. 
59a0: 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 20 26     if( noCase  &
59b0: 26 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72  & sqlite3Tolower
59c0: 28 63 29 3d 3d 73 71 6c 69 74 65 33 54 6f 6c 6f  (c)==sqlite3Tolo
59d0: 77 65 72 28 63 32 29 20 26 26 20 63 3c 30 78 38  wer(c2) && c<0x8
59e0: 30 20 26 26 20 63 32 3c 30 78 38 30 20 29 7b 0a  0 && c2<0x80 ){.
59f0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
5a00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
5a10: 3d 6d 61 74 63 68 4f 6e 65 20 26 26 20 7a 50 61  =matchOne && zPa
5a20: 74 74 65 72 6e 21 3d 7a 45 73 63 61 70 65 64 20  ttern!=zEscaped 
5a30: 26 26 20 63 32 21 3d 30 20 29 20 63 6f 6e 74 69  && c2!=0 ) conti
5a40: 6e 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  nue;.    return 
5a50: 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a  SQLITE_NOMATCH;.
5a60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53    }.  return *zS
5a70: 74 72 69 6e 67 3d 3d 30 20 3f 20 53 51 4c 49 54  tring==0 ? SQLIT
5a80: 45 5f 4d 41 54 43 48 20 3a 20 53 51 4c 49 54 45  E_MATCH : SQLITE
5a90: 5f 4e 4f 4d 41 54 43 48 3b 0a 7d 0a 0a 2f 2a 0a  _NOMATCH;.}../*.
5aa0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  ** The sqlite3_s
5ab0: 74 72 67 6c 6f 62 28 29 20 69 6e 74 65 72 66 61  trglob() interfa
5ac0: 63 65 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e  ce.  Return 0 on
5ad0: 20 61 20 6d 61 74 63 68 20 28 6c 69 6b 65 20 73   a match (like s
5ae0: 74 72 63 6d 70 28 29 29 20 61 6e 64 0a 2a 2a 20  trcmp()) and.** 
5af0: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 72  non-zero if ther
5b00: 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a  e is no match..*
5b10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  /.int sqlite3_st
5b20: 72 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61 72  rglob(const char
5b30: 20 2a 7a 47 6c 6f 62 50 61 74 74 65 72 6e 2c 20   *zGlobPattern, 
5b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
5b50: 69 6e 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ing){.  return p
5b60: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 28 75  atternCompare((u
5b70: 38 2a 29 7a 47 6c 6f 62 50 61 74 74 65 72 6e 2c  8*)zGlobPattern,
5b80: 20 28 75 38 2a 29 7a 53 74 72 69 6e 67 2c 20 26   (u8*)zString, &
5b90: 67 6c 6f 62 49 6e 66 6f 2c 20 27 5b 27 29 3b 0a  globInfo, '[');.
5ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  }../*.** The sql
5bb0: 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 29 20 69  ite3_strlike() i
5bc0: 6e 74 65 72 66 61 63 65 2e 20 20 52 65 74 75 72  nterface.  Retur
5bd0: 6e 20 30 20 6f 6e 20 61 20 6d 61 74 63 68 20 61  n 0 on a match a
5be0: 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 0a  nd non-zero for.
5bf0: 2a 2a 20 61 20 6d 69 73 73 20 2d 20 6c 69 6b 65  ** a miss - like
5c00: 20 73 74 72 63 6d 70 28 29 2e 0a 2a 2f 0a 69 6e   strcmp()..*/.in
5c10: 74 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  t sqlite3_strlik
5c20: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  e(const char *zP
5c30: 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68  attern, const ch
5c40: 61 72 20 2a 7a 53 74 72 2c 20 75 6e 73 69 67 6e  ar *zStr, unsign
5c50: 65 64 20 69 6e 74 20 65 73 63 29 7b 0a 20 20 72  ed int esc){.  r
5c60: 65 74 75 72 6e 20 70 61 74 74 65 72 6e 43 6f 6d  eturn patternCom
5c70: 70 61 72 65 28 28 75 38 2a 29 7a 50 61 74 74 65  pare((u8*)zPatte
5c80: 72 6e 2c 20 28 75 38 2a 29 7a 53 74 72 2c 20 26  rn, (u8*)zStr, &
5c90: 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 65 73  likeInfoNorm, es
5ca0: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  c);.}../*.** Cou
5cb0: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
5cc0: 20 74 69 6d 65 73 20 74 68 61 74 20 74 68 65 20   times that the 
5cd0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 28 6f  LIKE operator (o
5ce0: 72 20 47 4c 4f 42 20 77 68 69 63 68 20 69 73 0a  r GLOB which is.
5cf0: 2a 2a 20 6a 75 73 74 20 61 20 76 61 72 69 61 74  ** just a variat
5d00: 69 6f 6e 20 6f 66 20 4c 49 4b 45 29 20 67 65 74  ion of LIKE) get
5d10: 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  s called.  This 
5d20: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
5d30: 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ing.** only..*/.
5d40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
5d50: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  ST.int sqlite3_l
5d60: 69 6b 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ike_count = 0;.#
5d70: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  endif.../*.** Im
5d80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
5d90: 74 68 65 20 6c 69 6b 65 28 29 20 53 51 4c 20 66  the like() SQL f
5da0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66  unction.  This f
5db0: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
5dc0: 74 73 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2d  ts.** the build-
5dd0: 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  in LIKE operator
5de0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 61 72 67  .  The first arg
5df0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
5e00: 63 74 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a 20  ction is the.** 
5e10: 70 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20  pattern and the 
5e20: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5e30: 69 73 20 74 68 65 20 73 74 72 69 6e 67 2e 20 20  is the string.  
5e40: 53 6f 2c 20 74 68 65 20 53 51 4c 20 73 74 61 74  So, the SQL stat
5e50: 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ements:.**.**   
5e60: 20 20 20 20 41 20 4c 49 4b 45 20 42 0a 2a 2a 0a      A LIKE B.**.
5e70: 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ** is implemente
5e80: 64 20 61 73 20 6c 69 6b 65 28 42 2c 41 29 2e 0a  d as like(B,A)..
5e90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 61 6d 65 20  **.** This same 
5ea0: 66 75 6e 63 74 69 6f 6e 20 28 77 69 74 68 20 61  function (with a
5eb0: 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6d 70 61   different compa
5ec0: 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
5ed0: 29 20 63 6f 6d 70 75 74 65 73 0a 2a 2a 20 74 68  ) computes.** th
5ee0: 65 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 2e  e GLOB operator.
5ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f00: 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  likeFunc(.  sqli
5f10: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5f20: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67  text, .  int arg
5f30: 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  c, .  sqlite3_va
5f40: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5f50: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5f60: 68 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b 0a 20 20  har *zA, *zB;.  
5f70: 75 33 32 20 65 73 63 61 70 65 3b 0a 20 20 69 6e  u32 escape;.  in
5f80: 74 20 6e 50 61 74 3b 0a 20 20 73 71 6c 69 74 65  t nPat;.  sqlite
5f90: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
5fa0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
5fb0: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 74  e(context);.  st
5fc0: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
5fd0: 20 2a 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   *pInfo = sqlite
5fe0: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
5ff0: 65 78 74 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ext);..#ifdef SQ
6000: 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54  LITE_LIKE_DOESNT
6010: 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 69  _MATCH_BLOBS.  i
6020: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
6030: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
6040: 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 20 7c  SQLITE_BLOB.   |
6050: 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  | sqlite3_value_
6060: 74 79 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53  type(argv[1])==S
6070: 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 29 7b 0a  QLITE_BLOB.  ){.
6080: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
6090: 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ST.    sqlite3_l
60a0: 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ike_count++;.#en
60b0: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
60c0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
60d0: 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  xt, 0);.    retu
60e0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
60f0: 20 7a 42 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   zB = sqlite3_va
6100: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
6110: 29 3b 0a 20 20 7a 41 20 3d 20 73 71 6c 69 74 65  );.  zA = sqlite
6120: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6130: 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6d  v[1]);..  /* Lim
6140: 69 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  it the length of
6150: 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f   the LIKE or GLO
6160: 42 20 70 61 74 74 65 72 6e 20 74 6f 20 61 76 6f  B pattern to avo
6170: 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a  id problems.  **
6180: 20 6f 66 20 64 65 65 70 20 72 65 63 75 72 73 69   of deep recursi
6190: 6f 6e 20 61 6e 64 20 4e 2a 4e 20 62 65 68 61 76  on and N*N behav
61a0: 69 6f 72 20 69 6e 20 70 61 74 74 65 72 6e 43 6f  ior in patternCo
61b0: 6d 70 61 72 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  mpare()..  */.  
61c0: 6e 50 61 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  nPat = sqlite3_v
61d0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
61e0: 30 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0]);.  testcase(
61f0: 20 6e 50 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69   nPat==db->aLimi
6200: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
6210: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
6220: 54 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61 73  TH] );.  testcas
6230: 65 28 20 6e 50 61 74 3d 3d 64 62 2d 3e 61 4c 69  e( nPat==db->aLi
6240: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
6250: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
6260: 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28  NGTH]+1 );.  if(
6270: 20 6e 50 61 74 20 3e 20 64 62 2d 3e 61 4c 69 6d   nPat > db->aLim
6280: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
6290: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
62a0: 47 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  GTH] ){.    sqli
62b0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
62c0: 28 63 6f 6e 74 65 78 74 2c 20 22 4c 49 4b 45 20  (context, "LIKE 
62d0: 6f 72 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20  or GLOB pattern 
62e0: 74 6f 6f 20 63 6f 6d 70 6c 65 78 22 2c 20 2d 31  too complex", -1
62f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
6300: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 42 3d   }.  assert( zB=
6310: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
6320: 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  ext(argv[0]) ); 
6330: 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 64 69 64   /* Encoding did
6340: 20 6e 6f 74 20 63 68 61 6e 67 65 20 2a 2f 0a 0a   not change */..
6350: 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b    if( argc==3 ){
6360: 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61  .    /* The esca
6370: 70 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  pe character str
6380: 69 6e 67 20 6d 75 73 74 20 63 6f 6e 73 69 73 74  ing must consist
6390: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 55 54 46   of a single UTF
63a0: 2d 38 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20  -8 character..  
63b0: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
63c0: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  return an error.
63d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  .    */.    cons
63e0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
63f0: 2a 7a 45 73 63 20 3d 20 73 71 6c 69 74 65 33 5f  *zEsc = sqlite3_
6400: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6410: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 73  2]);.    if( zEs
6420: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  c==0 ) return;. 
6430: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 55 74     if( sqlite3Ut
6440: 66 38 43 68 61 72 4c 65 6e 28 28 63 68 61 72 2a  f8CharLen((char*
6450: 29 7a 45 73 63 2c 20 2d 31 29 21 3d 31 20 29 7b  )zEsc, -1)!=1 ){
6460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6470: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
6480: 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ext, .          
6490: 22 45 53 43 41 50 45 20 65 78 70 72 65 73 73 69  "ESCAPE expressi
64a0: 6f 6e 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e  on must be a sin
64b0: 67 6c 65 20 63 68 61 72 61 63 74 65 72 22 2c 20  gle character", 
64c0: 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  -1);.      retur
64d0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 73 63  n;.    }.    esc
64e0: 61 70 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66  ape = sqlite3Utf
64f0: 38 52 65 61 64 28 26 7a 45 73 63 29 3b 0a 20 20  8Read(&zEsc);.  
6500: 7d 65 6c 73 65 7b 0a 20 20 20 20 65 73 63 61 70  }else{.    escap
6510: 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68  e = pInfo->match
6520: 53 65 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  Set;.  }.  if( z
6530: 41 20 26 26 20 7a 42 20 29 7b 0a 23 69 66 64 65  A && zB ){.#ifde
6540: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
6550: 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63    sqlite3_like_c
6560: 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
6570: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6580: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 0a 20  t_int(context,. 
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65a0: 20 20 20 20 20 70 61 74 74 65 72 6e 43 6f 6d 70       patternComp
65b0: 61 72 65 28 7a 42 2c 20 7a 41 2c 20 70 49 6e 66  are(zB, zA, pInf
65c0: 6f 2c 20 65 73 63 61 70 65 29 3d 3d 53 51 4c 49  o, escape)==SQLI
65d0: 54 45 5f 4d 41 54 43 48 29 3b 0a 20 20 7d 0a 7d  TE_MATCH);.  }.}
65e0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
65f0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4e 55  tation of the NU
6600: 4c 4c 49 46 28 78 2c 79 29 20 66 75 6e 63 74 69  LLIF(x,y) functi
6610: 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  on.  The result 
6620: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
6630: 61 72 67 75 6d 65 6e 74 20 69 66 20 74 68 65 20  argument if the 
6640: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 64 69  arguments are di
6650: 66 66 65 72 65 6e 74 2e 20 20 54 68 65 20 72 65  fferent.  The re
6660: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20  sult is NULL if 
6670: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  the.** arguments
6680: 20 61 72 65 20 65 71 75 61 6c 20 74 6f 20 65 61   are equal to ea
6690: 63 68 20 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61  ch other..*/.sta
66a0: 74 69 63 20 76 6f 69 64 20 6e 75 6c 6c 69 66 46  tic void nullifF
66b0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
66c0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
66d0: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
66e0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
66f0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 43 6f 6c 6c  **argv.){.  Coll
6700: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
6710: 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53  ite3GetFuncCollS
6720: 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55  eq(context);.  U
6730: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6740: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
6750: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
6760: 65 28 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b  e(argv[0], argv[
6770: 31 5d 2c 20 70 43 6f 6c 6c 29 21 3d 30 20 29 7b  1], pColl)!=0 ){
6780: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
6790: 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78  ult_value(contex
67a0: 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  t, argv[0]);.  }
67b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
67c0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
67d0: 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 28 29  sqlite_version()
67e0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
67f0: 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 65  result is the ve
6800: 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  rsion.** of the 
6810: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 74  SQLite library t
6820: 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  hat is running..
6830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
6840: 65 72 73 69 6f 6e 46 75 6e 63 28 0a 20 20 73 71  ersionFunc(.  sq
6850: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6860: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
6870: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
6880: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
6890: 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  2.){.  UNUSED_PA
68a0: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
68b0: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f  , NotUsed2);.  /
68c0: 2a 20 49 4d 50 3a 20 52 2d 34 38 36 39 39 2d 34  * IMP: R-48699-4
68d0: 38 36 31 37 20 54 68 69 73 20 66 75 6e 63 74 69  8617 This functi
68e0: 6f 6e 20 69 73 20 61 6e 20 53 51 4c 20 77 72 61  on is an SQL wra
68f0: 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a  pper around the.
6900: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 69 62    ** sqlite3_lib
6910: 76 65 72 73 69 6f 6e 28 29 20 43 2d 69 6e 74 65  version() C-inte
6920: 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  rface. */.  sqli
6930: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
6940: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
6950: 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 2d  _libversion(), -
6960: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
6970: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
6980: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
6990: 65 20 73 71 6c 69 74 65 5f 73 6f 75 72 63 65 5f  e sqlite_source_
69a0: 69 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54  id() function. T
69b0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73  he result is a s
69c0: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 69 64  tring.** that id
69d0: 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 72  entifies the par
69e0: 74 69 63 75 6c 61 72 20 76 65 72 73 69 6f 6e 20  ticular version 
69f0: 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  of the source co
6a00: 64 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  de used to build
6a10: 0a 2a 2a 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73  .** SQLite..*/.s
6a20: 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 72 63  tatic void sourc
6a30: 65 69 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  eidFunc(.  sqlit
6a40: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6a50: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
6a60: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
6a70: 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29  lue **NotUsed2.)
6a80: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
6a90: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
6aa0: 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49  otUsed2);.  /* I
6ab0: 4d 50 3a 20 52 2d 32 34 34 37 30 2d 33 31 31 33  MP: R-24470-3113
6ac0: 36 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  6 This function 
6ad0: 69 73 20 61 6e 20 53 51 4c 20 77 72 61 70 70 65  is an SQL wrappe
6ae0: 72 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a  r around the.  *
6af0: 2a 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  * sqlite3_source
6b00: 69 64 28 29 20 43 20 69 6e 74 65 72 66 61 63 65  id() C interface
6b10: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  . */.  sqlite3_r
6b20: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
6b30: 78 74 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75 72  xt, sqlite3_sour
6b40: 63 65 69 64 28 29 2c 20 2d 31 2c 20 53 51 4c 49  ceid(), -1, SQLI
6b50: 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f  TE_STATIC);.}../
6b60: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
6b70: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
6b80: 65 5f 6c 6f 67 28 29 20 66 75 6e 63 74 69 6f 6e  e_log() function
6b90: 2e 20 20 54 68 69 73 20 69 73 20 61 20 77 72 61  .  This is a wra
6ba0: 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 73  pper around.** s
6bb0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 2e 20 20 54  qlite3_log().  T
6bc0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
6bd0: 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 75  is NULL.  The fu
6be0: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 70 75  nction exists pu
6bf0: 72 65 6c 79 20 66 6f 72 0a 2a 2a 20 69 74 73 20  rely for.** its 
6c00: 73 69 64 65 2d 65 66 66 65 63 74 73 2e 0a 2a 2f  side-effects..*/
6c10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 72 72  .static void err
6c20: 6c 6f 67 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  logFunc(.  sqlit
6c30: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6c40: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
6c50: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
6c60: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 55 4e 55   **argv.){.  UNU
6c70: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
6c80: 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gc);.  UNUSED_PA
6c90: 52 41 4d 45 54 45 52 28 63 6f 6e 74 65 78 74 29  RAMETER(context)
6ca0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
6cb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
6cc0: 74 28 61 72 67 76 5b 30 5d 29 2c 20 22 25 73 22  t(argv[0]), "%s"
6cd0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
6ce0: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a  text(argv[1]));.
6cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
6d00: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
6d10: 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74  qlite_compileopt
6d20: 69 6f 6e 5f 75 73 65 64 28 29 20 66 75 6e 63 74  ion_used() funct
6d30: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  ion..** The resu
6d40: 6c 74 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  lt is an integer
6d50: 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 73   that identifies
6d60: 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   if the compiler
6d70: 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75   option.** was u
6d80: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 53 51 4c  sed to build SQL
6d90: 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ite..*/.#ifndef 
6da0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
6db0: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a  ILEOPTION_DIAGS.
6dc0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
6dd0: 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46 75 6e  ileoptionusedFun
6de0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
6df0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6e00: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6e10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6e20: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
6e30: 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 61  r *zOptName;.  a
6e40: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
6e50: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
6e60: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 2f 2a  ETER(argc);.  /*
6e70: 20 49 4d 50 3a 20 52 2d 33 39 35 36 34 2d 33 36   IMP: R-39564-36
6e80: 33 30 35 20 54 68 65 20 73 71 6c 69 74 65 5f 63  305 The sqlite_c
6e90: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
6ea0: 64 28 29 20 53 51 4c 0a 20 20 2a 2a 20 66 75 6e  d() SQL.  ** fun
6eb0: 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
6ec0: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71  er around the sq
6ed0: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
6ee0: 69 6f 6e 5f 75 73 65 64 28 29 20 43 2f 43 2b 2b  ion_used() C/C++
6ef0: 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  .  ** function..
6f00: 20 20 2a 2f 0a 20 20 69 66 28 20 28 7a 4f 70 74    */.  if( (zOpt
6f10: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
6f20: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
6f30: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29  e_text(argv[0]))
6f40: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
6f50: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
6f60: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63  ntext, sqlite3_c
6f70: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
6f80: 64 28 7a 4f 70 74 4e 61 6d 65 29 29 3b 0a 20 20  d(zOptName));.  
6f90: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
6fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
6fb0: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f  EOPTION_DIAGS */
6fc0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6fd0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  tation of the sq
6fe0: 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  lite_compileopti
6ff0: 6f 6e 5f 67 65 74 28 29 20 66 75 6e 63 74 69 6f  on_get() functio
7000: 6e 2e 20 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  n. .** The resul
7010: 74 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68  t is a string th
7020: 61 74 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  at identifies th
7030: 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f  e compiler optio
7040: 6e 73 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20 62  ns .** used to b
7050: 75 69 6c 64 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  uild SQLite..*/.
7060: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7070: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
7080: 4e 5f 44 49 41 47 53 0a 73 74 61 74 69 63 20 76  N_DIAGS.static v
7090: 6f 69 64 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  oid compileoptio
70a0: 6e 67 65 74 46 75 6e 63 28 0a 20 20 73 71 6c 69  ngetFunc(.  sqli
70b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
70c0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
70d0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
70e0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
70f0: 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t n;.  assert( a
7100: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
7110: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
7120: 63 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  c);.  /* IMP: R-
7130: 30 34 39 32 32 2d 32 34 30 37 36 20 54 68 65 20  04922-24076 The 
7140: 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70  sqlite_compileop
7150: 74 69 6f 6e 5f 67 65 74 28 29 20 53 51 4c 20 66  tion_get() SQL f
7160: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
7170: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
7180: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6d   the sqlite3_com
7190: 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29  pileoption_get()
71a0: 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69 6f 6e 2e   C/C++ function.
71b0: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69  .  */.  n = sqli
71c0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
71d0: 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65  gv[0]);.  sqlite
71e0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
71f0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63  ntext, sqlite3_c
7200: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74  ompileoption_get
7210: 28 6e 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  (n), -1, SQLITE_
7220: 53 54 41 54 49 43 29 3b 0a 7d 0a 23 65 6e 64 69  STATIC);.}.#endi
7230: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7240: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
7250: 49 41 47 53 20 2a 2f 0a 0a 2f 2a 20 41 72 72 61  IAGS */../* Arra
7260: 79 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67  y for converting
7270: 20 66 72 6f 6d 20 68 61 6c 66 2d 62 79 74 65 73   from half-bytes
7280: 20 28 6e 79 62 62 6c 65 73 29 20 69 6e 74 6f 20   (nybbles) into 
7290: 41 53 43 49 49 20 68 65 78 0a 2a 2a 20 64 69 67  ASCII hex.** dig
72a0: 69 74 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63  its. */.static c
72b0: 6f 6e 73 74 20 63 68 61 72 20 68 65 78 64 69 67  onst char hexdig
72c0: 69 74 73 5b 5d 20 3d 20 7b 0a 20 20 27 30 27 2c  its[] = {.  '0',
72d0: 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20   '1', '2', '3', 
72e0: 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27  '4', '5', '6', '
72f0: 37 27 2c 0a 20 20 27 38 27 2c 20 27 39 27 2c 20  7',.  '8', '9', 
7300: 27 41 27 2c 20 27 42 27 2c 20 27 43 27 2c 20 27  'A', 'B', 'C', '
7310: 44 27 2c 20 27 45 27 2c 20 27 46 27 20 0a 7d 3b  D', 'E', 'F' .};
7320: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
7330: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 51 55  tation of the QU
7340: 4f 54 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  OTE() function. 
7350: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   This function t
7360: 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  akes a single.**
7370: 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74   argument.  If t
7380: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  he argument is n
7390: 75 6d 65 72 69 63 2c 20 74 68 65 20 72 65 74 75  umeric, the retu
73a0: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
73b0: 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68 65 20 61  same as.** the a
73c0: 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65  rgument.  If the
73d0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
73e0: 4c 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  L, the return va
73f0: 6c 75 65 20 69 73 20 74 68 65 20 73 74 72 69 6e  lue is the strin
7400: 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20 4f 74  g.** "NULL".  Ot
7410: 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 72 67  herwise, the arg
7420: 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c 6f 73 65  ument is enclose
7430: 64 20 69 6e 20 73 69 6e 67 6c 65 20 71 75 6f 74  d in single quot
7440: 65 73 20 77 69 74 68 0a 2a 2a 20 73 69 6e 67 6c  es with.** singl
7450: 65 2d 71 75 6f 74 65 20 65 73 63 61 70 65 73 2e  e-quote escapes.
7460: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7470: 71 75 6f 74 65 46 75 6e 63 28 73 71 6c 69 74 65  quoteFunc(sqlite
7480: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7490: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
74a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
74b0: 67 76 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61  gv){.  assert( a
74c0: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
74d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
74e0: 63 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  c);.  switch( sq
74f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
7500: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
7510: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
7520: 41 54 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62  AT: {.      doub
7530: 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20  le r1, r2;.     
7540: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
7550: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
7560: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
7570: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
7580: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7590: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
75a0: 42 75 66 2c 20 22 25 21 2e 31 35 67 22 2c 20 72  Buf, "%!.15g", r
75b0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
75c0: 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 32 2c  3AtoF(zBuf, &r2,
75d0: 20 32 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   20, SQLITE_UTF8
75e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 31 21  );.      if( r1!
75f0: 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =r2 ){.        s
7600: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7610: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
7620: 75 66 2c 20 22 25 21 2e 32 30 65 22 2c 20 72 31  uf, "%!.20e", r1
7630: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7640: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7650: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42  text(context, zB
7660: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
7670: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
7680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7690: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
76a0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  TEGER: {.      s
76b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
76c0: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  lue(context, arg
76d0: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  v[0]);.      bre
76e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
76f0: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
7700: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
7710: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ext = 0;.      c
7720: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62  har const *zBlob
7730: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7740: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
7750: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
7760: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
7770: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
7780: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 42        assert( zB
7790: 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  lob==sqlite3_val
77a0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
77b0: 20 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69   ); /* No encodi
77c0: 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20  ng change */.   
77d0: 20 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61 72     zText = (char
77e0: 20 2a 29 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   *)contextMalloc
77f0: 28 63 6f 6e 74 65 78 74 2c 20 28 32 2a 28 69 36  (context, (2*(i6
7800: 34 29 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20 20  4)nBlob)+4); .  
7810: 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b      if( zText ){
7820: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
7830: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
7840: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a   i<nBlob; i++){.
7850: 20 20 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b            zText[
7860: 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64 69  (i*2)+2] = hexdi
7870: 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e  gits[(zBlob[i]>>
7880: 34 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20 20  4)&0x0F];.      
7890: 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b      zText[(i*2)+
78a0: 33 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  3] = hexdigits[(
78b0: 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d 3b  zBlob[i])&0x0F];
78c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
78d0: 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a     zText[(nBlob*
78e0: 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  2)+2] = '\'';.  
78f0: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c        zText[(nBl
7900: 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27 3b  ob*2)+3] = '\0';
7910: 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 30  .        zText[0
7920: 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20 20 20 20  ] = 'X';.       
7930: 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27 27   zText[1] = '\''
7940: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7950: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
7960: 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31  ntext, zText, -1
7970: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
7980: 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  NT);.        sql
7990: 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29  ite3_free(zText)
79a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
79b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
79c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
79d0: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  T: {.      int i
79e0: 2c 6a 3b 0a 20 20 20 20 20 20 75 36 34 20 6e 3b  ,j;.      u64 n;
79f0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
7a00: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67  igned char *zArg
7a10: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7a20: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
7a30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a        char *z;..
7a40: 20 20 20 20 20 20 69 66 28 20 7a 41 72 67 3d 3d        if( zArg==
7a50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
7a60: 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b 20    for(i=0, n=0; 
7a70: 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69  zArg[i]; i++){ i
7a80: 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27  f( zArg[i]=='\''
7a90: 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20   ) n++; }.      
7aa0: 7a 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  z = contextMallo
7ab0: 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34  c(context, ((i64
7ac0: 29 69 29 2b 28 28 69 36 34 29 6e 29 2b 33 29 3b  )i)+((i64)n)+3);
7ad0: 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  .      if( z ){.
7ae0: 20 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20 27          z[0] = '
7af0: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  \'';.        for
7b00: 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b  (i=0, j=1; zArg[
7b10: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
7b20: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72      z[j++] = zAr
7b30: 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g[i];.          
7b40: 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27  if( zArg[i]=='\'
7b50: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
7b60: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[j++] = '\'';.
7b70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7b80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
7b90: 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20  j++] = '\'';.   
7ba0: 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20       z[j] = 0;. 
7bb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
7bc0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
7bd0: 78 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74 65  xt, z, j, sqlite
7be0: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d  3_free);.      }
7bf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7c00: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
7c10: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
7c20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
7c30: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
7c40: 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  LITE_NULL );.   
7c50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7c60: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
7c70: 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51 4c 49 54  "NULL", 4, SQLIT
7c80: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
7c90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7ca0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75  }.}../*.** The u
7cb0: 6e 69 63 6f 64 65 28 29 20 66 75 6e 63 74 69 6f  nicode() functio
7cc0: 6e 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  n.  Return the i
7cd0: 6e 74 65 67 65 72 20 75 6e 69 63 6f 64 65 20 63  nteger unicode c
7ce0: 6f 64 65 2d 70 6f 69 6e 74 20 76 61 6c 75 65 0a  ode-point value.
7cf0: 2a 2a 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ** for the first
7d00: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
7d10: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 20  e input string. 
7d20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7d30: 75 6e 69 63 6f 64 65 46 75 6e 63 28 0a 20 20 73  unicodeFunc(.  s
7d40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7d50: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
7d60: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
7d70: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
7d80: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7d90: 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
7da0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7db0: 76 5b 30 5d 29 3b 0a 20 20 28 76 6f 69 64 29 61  v[0]);.  (void)a
7dc0: 72 67 63 3b 0a 20 20 69 66 28 20 7a 20 26 26 20  rgc;.  if( z && 
7dd0: 7a 5b 30 5d 20 29 20 73 71 6c 69 74 65 33 5f 72  z[0] ) sqlite3_r
7de0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7df0: 74 2c 20 73 71 6c 69 74 65 33 55 74 66 38 52 65  t, sqlite3Utf8Re
7e00: 61 64 28 26 7a 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ad(&z));.}../*.*
7e10: 2a 20 54 68 65 20 63 68 61 72 28 29 20 66 75 6e  * The char() fun
7e20: 63 74 69 6f 6e 20 74 61 6b 65 73 20 7a 65 72 6f  ction takes zero
7e30: 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e   or more argumen
7e40: 74 73 2c 20 65 61 63 68 20 6f 66 20 77 68 69 63  ts, each of whic
7e50: 68 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  h is.** an integ
7e60: 65 72 2e 20 20 49 74 20 63 6f 6e 73 74 72 75 63  er.  It construc
7e70: 74 73 20 61 20 73 74 72 69 6e 67 20 77 68 65 72  ts a string wher
7e80: 65 20 65 61 63 68 20 63 68 61 72 61 63 74 65 72  e each character
7e90: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a   of the string.*
7ea0: 2a 20 69 73 20 74 68 65 20 75 6e 69 63 6f 64 65  * is the unicode
7eb0: 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 74   character for t
7ec0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7ed0: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
7ee0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
7ef0: 64 20 63 68 61 72 46 75 6e 63 28 0a 20 20 73 71  d charFunc(.  sq
7f00: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7f10: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
7f20: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7f30: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7f40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
7f50: 2c 20 2a 7a 4f 75 74 3b 0a 20 20 69 6e 74 20 69  , *zOut;.  int i
7f60: 3b 0a 20 20 7a 4f 75 74 20 3d 20 7a 20 3d 20 73  ;.  zOut = z = s
7f70: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
7f80: 20 61 72 67 63 2a 34 2b 31 20 29 3b 0a 20 20 69   argc*4+1 );.  i
7f90: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( z==0 ){.    s
7fa0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
7fb0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
7fc0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
7fd0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
7fe0: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
7ff0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78   sqlite3_int64 x
8000: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
8010: 3b 0a 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65  ;.    x = sqlite
8020: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
8030: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[i]);.    if( 
8040: 78 3c 30 20 7c 7c 20 78 3e 30 78 31 30 66 66 66  x<0 || x>0x10fff
8050: 66 20 29 20 78 20 3d 20 30 78 66 66 66 64 3b 0a  f ) x = 0xfffd;.
8060: 20 20 20 20 63 20 3d 20 28 75 6e 73 69 67 6e 65      c = (unsigne
8070: 64 29 28 78 20 26 20 30 78 31 66 66 66 66 66 29  d)(x & 0x1fffff)
8080: 3b 0a 20 20 20 20 69 66 28 20 63 3c 30 78 30 30  ;.    if( c<0x00
8090: 30 38 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a 4f  080 ){.      *zO
80a0: 75 74 2b 2b 20 3d 20 28 75 38 29 28 63 26 30 78  ut++ = (u8)(c&0x
80b0: 46 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  FF);.    }else i
80c0: 66 28 20 63 3c 30 78 30 30 38 30 30 20 29 7b 0a  f( c<0x00800 ){.
80d0: 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20        *zOut++ = 
80e0: 30 78 43 30 20 2b 20 28 75 38 29 28 28 63 3e 3e  0xC0 + (u8)((c>>
80f0: 36 29 26 30 78 31 46 29 3b 0a 20 20 20 20 20 20  6)&0x1F);.      
8100: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
8110: 20 28 75 38 29 28 63 20 26 20 30 78 33 46 29 3b   (u8)(c & 0x3F);
8120: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
8130: 3c 30 78 31 30 30 30 30 20 29 7b 0a 20 20 20 20  <0x10000 ){.    
8140: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 45 30    *zOut++ = 0xE0
8150: 20 2b 20 28 75 38 29 28 28 63 3e 3e 31 32 29 26   + (u8)((c>>12)&
8160: 30 78 30 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f  0x0F);.      *zO
8170: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75  ut++ = 0x80 + (u
8180: 38 29 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46  8)((c>>6) & 0x3F
8190: 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  );.      *zOut++
81a0: 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 63   = 0x80 + (u8)(c
81b0: 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 7d 65   & 0x3F);.    }e
81c0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74  lse{.      *zOut
81d0: 2b 2b 20 3d 20 30 78 46 30 20 2b 20 28 75 38 29  ++ = 0xF0 + (u8)
81e0: 28 28 63 3e 3e 31 38 29 20 26 20 30 78 30 37 29  ((c>>18) & 0x07)
81f0: 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  ;.      *zOut++ 
8200: 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 28 63  = 0x80 + (u8)((c
8210: 3e 3e 31 32 29 20 26 20 30 78 33 46 29 3b 0a 20  >>12) & 0x3F);. 
8220: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
8230: 78 38 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 36  x80 + (u8)((c>>6
8240: 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20  ) & 0x3F);.     
8250: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20   *zOut++ = 0x80 
8260: 2b 20 28 75 38 29 28 63 20 26 20 30 78 33 46 29  + (u8)(c & 0x3F)
8270: 3b 0a 20 20 20 20 7d 20 20 20 20 20 20 20 20 20  ;.    }         
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
82b0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
82c0: 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78 74  t_text64(context
82d0: 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a 4f 75 74  , (char*)z, zOut
82e0: 2d 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -z, sqlite3_free
82f0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
8300: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 78  }../*.** The hex
8310: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 6e  () function.  In
8320: 74 65 72 70 72 65 74 20 74 68 65 20 61 72 67 75  terpret the argu
8330: 6d 65 6e 74 20 61 73 20 61 20 62 6c 6f 62 2e 20  ment as a blob. 
8340: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 68 65 78   Return.** a hex
8350: 61 64 65 63 69 6d 61 6c 20 72 65 6e 64 65 72 69  adecimal renderi
8360: 6e 67 20 61 73 20 74 65 78 74 2e 0a 2a 2f 0a 73  ng as text..*/.s
8370: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 46 75  tatic void hexFu
8380: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
8390: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
83a0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
83b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
83c0: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  gv.){.  int i, n
83d0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
83e0: 65 64 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a  ed char *pBlob;.
83f0: 20 20 63 68 61 72 20 2a 7a 48 65 78 2c 20 2a 7a    char *zHex, *z
8400: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
8410: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
8420: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
8430: 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  pBlob = sqlit
8440: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
8450: 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71  gv[0]);.  n = sq
8460: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8470: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73  s(argv[0]);.  as
8480: 73 65 72 74 28 20 70 42 6c 6f 62 3d 3d 73 71 6c  sert( pBlob==sql
8490: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
84a0: 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20  argv[0]) );  /* 
84b0: 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e  No encoding chan
84c0: 67 65 20 2a 2f 0a 20 20 7a 20 3d 20 7a 48 65 78  ge */.  z = zHex
84d0: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
84e0: 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29  (context, ((i64)
84f0: 6e 29 2a 32 20 2b 20 31 29 3b 0a 20 20 69 66 28  n)*2 + 1);.  if(
8500: 20 7a 48 65 78 20 29 7b 0a 20 20 20 20 66 6f 72   zHex ){.    for
8510: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20  (i=0; i<n; i++, 
8520: 70 42 6c 6f 62 2b 2b 29 7b 0a 20 20 20 20 20 20  pBlob++){.      
8530: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20  unsigned char c 
8540: 3d 20 2a 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20  = *pBlob;.      
8550: 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67 69  *(z++) = hexdigi
8560: 74 73 5b 28 63 3e 3e 34 29 26 30 78 66 5d 3b 0a  ts[(c>>4)&0xf];.
8570: 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68        *(z++) = h
8580: 65 78 64 69 67 69 74 73 5b 63 26 30 78 66 5d 3b  exdigits[c&0xf];
8590: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 20 3d 20  .    }.    *z = 
85a0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
85b0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
85c0: 78 74 2c 20 7a 48 65 78 2c 20 6e 2a 32 2c 20 73  xt, zHex, n*2, s
85d0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
85e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a  }.}../*.** The z
85f0: 65 72 6f 62 6c 6f 62 28 4e 29 20 66 75 6e 63 74  eroblob(N) funct
8600: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 7a 65  ion returns a ze
8610: 72 6f 2d 66 69 6c 6c 65 64 20 62 6c 6f 62 20 6f  ro-filled blob o
8620: 66 20 73 69 7a 65 20 4e 20 62 79 74 65 73 2e 0a  f size N bytes..
8630: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
8640: 65 72 6f 62 6c 6f 62 46 75 6e 63 28 0a 20 20 73  eroblobFunc(.  s
8650: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8660: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
8670: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
8680: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
8690: 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63   i64 n;.  int rc
86a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
86b0: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
86c0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
86d0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
86e0: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
86f0: 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29  0]);.  if( n<0 )
8700: 20 6e 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73   n = 0;.  rc = s
8710: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65  qlite3_result_ze
8720: 72 6f 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74  roblob64(context
8730: 2c 20 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  , n); /* IMP: R-
8740: 30 30 32 39 33 2d 36 34 39 39 34 20 2a 2f 0a 20  00293-64994 */. 
8750: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
8760: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8770: 72 6f 72 5f 63 6f 64 65 28 63 6f 6e 74 65 78 74  ror_code(context
8780: 2c 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , rc);.  }.}../*
8790: 0a 2a 2a 20 54 68 65 20 72 65 70 6c 61 63 65 28  .** The replace(
87a0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 72  ) function.  Thr
87b0: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ee arguments are
87c0: 20 61 6c 6c 20 73 74 72 69 6e 67 73 3a 20 63 61   all strings: ca
87d0: 6c 6c 0a 2a 2a 20 74 68 65 6d 20 41 2c 20 42 2c  ll.** them A, B,
87e0: 20 61 6e 64 20 43 2e 20 54 68 65 20 72 65 73 75   and C. The resu
87f0: 6c 74 20 69 73 20 61 6c 73 6f 20 61 20 73 74 72  lt is also a str
8800: 69 6e 67 20 77 68 69 63 68 20 69 73 20 64 65 72  ing which is der
8810: 69 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 41 20 62  ived.** from A b
8820: 79 20 72 65 70 6c 61 63 69 6e 67 20 65 76 65 72  y replacing ever
8830: 79 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20  y occurrence of 
8840: 42 20 77 69 74 68 20 43 2e 20 20 54 68 65 20 6d  B with C.  The m
8850: 61 74 63 68 0a 2a 2a 20 6d 75 73 74 20 62 65 20  atch.** must be 
8860: 65 78 61 63 74 2e 20 20 43 6f 6c 6c 61 74 69 6e  exact.  Collatin
8870: 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20  g sequences are 
8880: 6e 6f 74 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61  not used..*/.sta
8890: 74 69 63 20 76 6f 69 64 20 72 65 70 6c 61 63 65  tic void replace
88a0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
88b0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
88c0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
88d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
88e0: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
88f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
8900: 53 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Str;        /* T
8910: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
8920: 41 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73  A */.  const uns
8930: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 50 61 74  igned char *zPat
8940: 74 65 72 6e 3b 20 20 20 20 2f 2a 20 54 68 65 20  tern;    /* The 
8950: 70 61 74 74 65 72 6e 20 73 74 72 69 6e 67 20 42  pattern string B
8960: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
8970: 67 6e 65 64 20 63 68 61 72 20 2a 7a 52 65 70 3b  gned char *zRep;
8980: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
8990: 65 70 6c 61 63 65 6d 65 6e 74 20 73 74 72 69 6e  eplacement strin
89a0: 67 20 43 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  g C */.  unsigne
89b0: 64 20 63 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20  d char *zOut;   
89c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
89d0: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  e output */.  in
89e0: 74 20 6e 53 74 72 3b 20 20 20 20 20 20 20 20 20  t nStr;         
89f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8a00: 66 20 7a 53 74 72 20 2a 2f 0a 20 20 69 6e 74 20  f zStr */.  int 
8a10: 6e 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20  nPattern;       
8a20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
8a30: 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e  zPattern */.  in
8a40: 74 20 6e 52 65 70 3b 20 20 20 20 20 20 20 20 20  t nRep;         
8a50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8a60: 66 20 7a 52 65 70 20 2a 2f 0a 20 20 69 36 34 20  f zRep */.  i64 
8a70: 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
8a80: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
8a90: 73 69 7a 65 20 6f 66 20 7a 4f 75 74 20 2a 2f 0a  size of zOut */.
8aa0: 20 20 69 6e 74 20 6c 6f 6f 70 4c 69 6d 69 74 3b    int loopLimit;
8ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
8ac0: 73 74 20 7a 53 74 72 5b 5d 20 74 68 61 74 20 6d  st zStr[] that m
8ad0: 69 67 68 74 20 6d 61 74 63 68 20 7a 50 61 74 74  ight match zPatt
8ae0: 65 72 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ern[] */.  int i
8af0: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
8b00: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8b10: 74 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ters */..  asser
8b20: 74 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20  t( argc==3 );.  
8b30: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8b40: 28 61 72 67 63 29 3b 0a 20 20 7a 53 74 72 20 3d  (argc);.  zStr =
8b50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8b60: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
8b70: 69 66 28 20 7a 53 74 72 3d 3d 30 20 29 20 72 65  if( zStr==0 ) re
8b80: 74 75 72 6e 3b 0a 20 20 6e 53 74 72 20 3d 20 73  turn;.  nStr = s
8b90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
8ba0: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61  es(argv[0]);.  a
8bb0: 73 73 65 72 74 28 20 7a 53 74 72 3d 3d 73 71 6c  ssert( zStr==sql
8bc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8bd0: 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20  argv[0]) );  /* 
8be0: 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e  No encoding chan
8bf0: 67 65 20 2a 2f 0a 20 20 7a 50 61 74 74 65 72 6e  ge */.  zPattern
8c00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8c10: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
8c20: 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d    if( zPattern==
8c30: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
8c40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8c50: 79 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51  ype(argv[1])==SQ
8c60: 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20 20 20  LITE_NULL.      
8c70: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
8c80: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
8c90: 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e 6d 61 6c  le(context)->mal
8ca0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
8cb0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
8cc0: 66 28 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d  f( zPattern[0]==
8cd0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
8ce0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8cf0: 79 70 65 28 61 72 67 76 5b 31 5d 29 21 3d 53 51  ype(argv[1])!=SQ
8d00: 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  LITE_NULL );.   
8d10: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8d20: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
8d30: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74  rgv[0]);.    ret
8d40: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 74  urn;.  }.  nPatt
8d50: 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ern = sqlite3_va
8d60: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31  lue_bytes(argv[1
8d70: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50  ]);.  assert( zP
8d80: 61 74 74 65 72 6e 3d 3d 73 71 6c 69 74 65 33 5f  attern==sqlite3_
8d90: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8da0: 31 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e  1]) );  /* No en
8db0: 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f  coding change */
8dc0: 0a 20 20 7a 52 65 70 20 3d 20 73 71 6c 69 74 65  .  zRep = sqlite
8dd0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8de0: 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 52 65  v[2]);.  if( zRe
8df0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
8e00: 20 6e 52 65 70 20 3d 20 73 71 6c 69 74 65 33 5f   nRep = sqlite3_
8e10: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
8e20: 5b 32 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [2]);.  assert( 
8e30: 7a 52 65 70 3d 3d 73 71 6c 69 74 65 33 5f 76 61  zRep==sqlite3_va
8e40: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d  lue_text(argv[2]
8e50: 29 20 29 3b 0a 20 20 6e 4f 75 74 20 3d 20 6e 53  ) );.  nOut = nS
8e60: 74 72 20 2b 20 31 3b 0a 20 20 61 73 73 65 72 74  tr + 1;.  assert
8e70: 28 20 6e 4f 75 74 3c 53 51 4c 49 54 45 5f 4d 41  ( nOut<SQLITE_MA
8e80: 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 7a 4f  X_LENGTH );.  zO
8e90: 75 74 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c  ut = contextMall
8ea0: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 69 36 34  oc(context, (i64
8eb0: 29 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 7a 4f  )nOut);.  if( zO
8ec0: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ut==0 ){.    ret
8ed0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 6f 6f 70 4c  urn;.  }.  loopL
8ee0: 69 6d 69 74 20 3d 20 6e 53 74 72 20 2d 20 6e 50  imit = nStr - nP
8ef0: 61 74 74 65 72 6e 3b 20 20 0a 20 20 66 6f 72 28  attern;  .  for(
8f00: 69 3d 6a 3d 30 3b 20 69 3c 3d 6c 6f 6f 70 4c 69  i=j=0; i<=loopLi
8f10: 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  mit; i++){.    i
8f20: 66 28 20 7a 53 74 72 5b 69 5d 21 3d 7a 50 61 74  f( zStr[i]!=zPat
8f30: 74 65 72 6e 5b 30 5d 20 7c 7c 20 6d 65 6d 63 6d  tern[0] || memcm
8f40: 70 28 26 7a 53 74 72 5b 69 5d 2c 20 7a 50 61 74  p(&zStr[i], zPat
8f50: 74 65 72 6e 2c 20 6e 50 61 74 74 65 72 6e 29 20  tern, nPattern) 
8f60: 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b  ){.      zOut[j+
8f70: 2b 5d 20 3d 20 7a 53 74 72 5b 69 5d 3b 0a 20 20  +] = zStr[i];.  
8f80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
8f90: 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20 73  8 *zOld;.      s
8fa0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
8fb0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
8fc0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
8fd0: 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 6e  .      nOut += n
8fe0: 52 65 70 20 2d 20 6e 50 61 74 74 65 72 6e 3b 0a  Rep - nPattern;.
8ff0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9000: 6e 4f 75 74 2d 31 3d 3d 64 62 2d 3e 61 4c 69 6d  nOut-1==db->aLim
9010: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
9020: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20  LENGTH] );.     
9030: 20 74 65 73 74 63 61 73 65 28 20 6e 4f 75 74 2d   testcase( nOut-
9040: 32 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  2==db->aLimit[SQ
9050: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
9060: 48 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  H] );.      if( 
9070: 6e 4f 75 74 2d 31 3e 64 62 2d 3e 61 4c 69 6d 69  nOut-1>db->aLimi
9080: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
9090: 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20  ENGTH] ){.      
90a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
90b0: 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f  _error_toobig(co
90c0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
90d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
90e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
90f0: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
9100: 20 20 7a 4f 6c 64 20 3d 20 7a 4f 75 74 3b 0a 20    zOld = zOut;. 
9110: 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69       zOut = sqli
9120: 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 7a 4f  te3_realloc64(zO
9130: 75 74 2c 20 28 69 6e 74 29 6e 4f 75 74 29 3b 0a  ut, (int)nOut);.
9140: 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d        if( zOut==
9150: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
9160: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
9170: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
9180: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9190: 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20  3_free(zOld);.  
91a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
91b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
91c0: 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65  py(&zOut[j], zRe
91d0: 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20  p, nRep);.      
91e0: 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20  j += nRep;.     
91f0: 20 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31   i += nPattern-1
9200: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
9210: 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31  sert( j+nStr-i+1
9220: 3d 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63  ==nOut );.  memc
9230: 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53  py(&zOut[j], &zS
9240: 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a  tr[i], nStr-i);.
9250: 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b    j += nStr - i;
9260: 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f  .  assert( j<=nO
9270: 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20  ut );.  zOut[j] 
9280: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
9290: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
92a0: 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c  xt, (char*)zOut,
92b0: 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   j, sqlite3_free
92c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
92d0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
92e0: 65 20 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28  e TRIM(), LTRIM(
92f0: 29 2c 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66  ), and RTRIM() f
9300: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65  unctions..** The
9310: 20 75 73 65 72 64 61 74 61 20 69 73 20 30 78 31   userdata is 0x1
9320: 20 66 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20   for left trim, 
9330: 30 78 32 20 66 6f 72 20 72 69 67 68 74 20 74 72  0x2 for right tr
9340: 69 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68  im, 0x3 for both
9350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9360: 20 74 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c   trimFunc(.  sql
9370: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
9380: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
9390: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
93a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
93b0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
93c0: 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20  ar *zIn;        
93d0: 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67   /* Input string
93e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
93f0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72  gned char *zChar
9400: 53 65 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f  Set;    /* Set o
9410: 66 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20  f characters to 
9420: 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  trim */.  int nI
9430: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
9440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9450: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
9460: 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74  n input */.  int
9470: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9490: 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32  * 1: trimleft  2
94a0: 3a 20 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20  : trimright  3: 
94b0: 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  trim */.  int i;
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
94e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
94f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9500: 61 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  aLen = 0;       
9510: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
9520: 65 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69  each character i
9530: 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20  n zCharSet */.  
9540: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
9550: 61 7a 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20  azChar = 0;     
9560: 20 20 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20    /* Individual 
9570: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43  characters in zC
9580: 68 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20  harSet */.  int 
9590: 6e 43 68 61 72 3b 20 20 20 20 20 20 20 20 20 20  nChar;          
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
95c0: 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65  cters in zCharSe
95d0: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69  t */..  if( sqli
95e0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
95f0: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
9600: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  NULL ){.    retu
9610: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20  rn;.  }.  zIn = 
9620: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
9630: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
9640: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75  f( zIn==0 ) retu
9650: 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69  rn;.  nIn = sqli
9660: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
9670: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65  argv[0]);.  asse
9680: 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33  rt( zIn==sqlite3
9690: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
96a0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72  [0]) );.  if( ar
96b0: 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61  gc==1 ){.    sta
96c0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
96d0: 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d  ed char lenOne[]
96e0: 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74   = { 1 };.    st
96f0: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
9700: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f 6e 65  ar * const azOne
9710: 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20  [] = { (u8*)" " 
9720: 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31  };.    nChar = 1
9730: 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38  ;.    aLen = (u8
9740: 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a  *)lenOne;.    az
9750: 43 68 61 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  Char = (unsigned
9760: 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a   char **)azOne;.
9770: 20 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20 30      zCharSet = 0
9780: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a  ;.  }else if( (z
9790: 43 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74 65  CharSet = sqlite
97a0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
97b0: 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20 20  v[1]))==0 ){.   
97c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
97d0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  {.    const unsi
97e0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
97f0: 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74    for(z=zCharSet
9800: 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e  , nChar=0; *z; n
9810: 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 53  Char++){.      S
9820: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
9830: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
9840: 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20  ( nChar>0 ){.   
9850: 20 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e 74     azChar = cont
9860: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
9870: 74 2c 20 28 28 69 36 34 29 6e 43 68 61 72 29 2a  t, ((i64)nChar)*
9880: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31  (sizeof(char*)+1
9890: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
98a0: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Char==0 ){.     
98b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
98c0: 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20   }.      aLen = 
98d0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
98e0: 26 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a  &azChar[nChar];.
98f0: 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61        for(z=zCha
9900: 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a  rSet, nChar=0; *
9910: 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20  z; nChar++){.   
9920: 20 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61       azChar[nCha
9930: 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  r] = (unsigned c
9940: 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20 20  har *)z;.       
9950: 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46   SQLITE_SKIP_UTF
9960: 38 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c  8(z);.        aL
9970: 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75 38 29  en[nChar] = (u8)
9980: 28 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61  (z - azChar[nCha
9990: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r]);.      }.   
99a0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68   }.  }.  if( nCh
99b0: 61 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c 61 67  ar>0 ){.    flag
99c0: 73 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  s = SQLITE_PTR_T
99d0: 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f 75 73  O_INT(sqlite3_us
99e0: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
99f0: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
9a00: 20 26 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68   & 1 ){.      wh
9a10: 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20  ile( nIn>0 ){.  
9a20: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
9a30: 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
9a40: 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
9a50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
9a60: 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20   = aLen[i];.    
9a70: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e        if( len<=n
9a80: 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a 49 6e  In && memcmp(zIn
9a90: 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e  , azChar[i], len
9aa0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
9ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9ac0: 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62  if( i>=nChar ) b
9ad0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49  reak;.        zI
9ae0: 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  n += len;.      
9af0: 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20    nIn -= len;.  
9b00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9b10: 69 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b  if( flags & 2 ){
9b20: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49  .      while( nI
9b30: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  n>0 ){.        i
9b40: 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nt len = 0;.    
9b50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9b60: 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Char; i++){.    
9b70: 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e        len = aLen
9b80: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
9b90: 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d  f( len<=nIn && m
9ba0: 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c  emcmp(&zIn[nIn-l
9bb0: 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65  en],azChar[i],le
9bc0: 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  n)==0 ) break;. 
9bd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9be0: 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20   if( i>=nChar ) 
9bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e  break;.        n
9c00: 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  In -= len;.     
9c10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9c20: 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20   zCharSet ){.   
9c30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9c40: 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20  azChar);.    }. 
9c50: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
9c60: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
9c70: 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49  , (char*)zIn, nI
9c80: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
9c90: 45 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ENT);.}...#ifdef
9ca0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
9cb0: 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
9cc0: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 75  ION./*.** The "u
9cd0: 6e 6b 6e 6f 77 6e 22 20 66 75 6e 63 74 69 6f 6e  nknown" function
9ce0: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
9cf0: 79 20 73 75 62 73 74 69 74 75 74 65 64 20 69 6e  y substituted in
9d00: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 6e 79   place of.** any
9d10: 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 66 75   unrecognized fu
9d20: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 77 68 65 6e  nction name when
9d30: 20 64 6f 69 6e 67 20 61 6e 20 45 58 50 4c 41 49   doing an EXPLAI
9d40: 4e 20 6f 72 20 45 58 50 4c 41 49 4e 20 51 55 45  N or EXPLAIN QUE
9d50: 52 59 20 50 4c 41 4e 0a 2a 2a 20 77 68 65 6e 20  RY PLAN.** when 
9d60: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
9d70: 45 5f 55 4e 4b 4e 4f 57 4e 5f 46 55 4e 43 54 49  E_UNKNOWN_FUNCTI
9d80: 4f 4e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ON compile-time 
9d90: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
9da0: 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  ** When the "sql
9db0: 69 74 65 33 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69  ite3" command-li
9dc0: 6e 65 20 73 68 65 6c 6c 20 69 73 20 62 75 69 6c  ne shell is buil
9dd0: 74 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  t using this fun
9de0: 63 74 69 6f 6e 61 6c 69 74 79 2c 0a 2a 2a 20 74  ctionality,.** t
9df0: 68 61 74 20 61 6c 6c 6f 77 73 20 61 6e 20 45 58  hat allows an EX
9e00: 50 4c 41 49 4e 20 6f 72 20 45 58 50 4c 41 49 4e  PLAIN or EXPLAIN
9e10: 20 51 55 45 52 59 20 50 4c 41 4e 20 66 6f 72 20   QUERY PLAN for 
9e20: 63 6f 6d 70 6c 65 78 20 71 75 65 72 69 65 73 0a  complex queries.
9e30: 2a 2a 20 69 6e 76 6f 6c 76 69 6e 67 20 61 70 70  ** involving app
9e40: 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  lication-defined
9e50: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
9e60: 20 65 78 61 6d 69 6e 65 64 20 69 6e 20 61 20 67   examined in a g
9e70: 65 6e 65 72 69 63 0a 2a 2a 20 73 71 6c 69 74 65  eneric.** sqlite
9e80: 33 20 73 68 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  3 shell..*/.stat
9e90: 69 63 20 76 6f 69 64 20 75 6e 6b 6e 6f 77 6e 46  ic void unknownF
9ea0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
9eb0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
9ec0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
9ed0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
9ee0: 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f  rgv.){.  /* no-o
9ef0: 70 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  p */.}.#endif /*
9f00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
9f10: 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49  KNOWN_SQL_FUNCTI
9f20: 4f 4e 2a 2f 0a 0a 0a 2f 2a 20 49 4d 50 3a 20 52  ON*/.../* IMP: R
9f30: 2d 32 35 33 36 31 2d 31 36 31 35 30 20 54 68 69  -25361-16150 Thi
9f40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6d  s function is om
9f50: 69 74 74 65 64 20 66 72 6f 6d 20 53 51 4c 69 74  itted from SQLit
9f60: 65 20 62 79 20 64 65 66 61 75 6c 74 2e 20 49 74  e by default. It
9f70: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  .** is only avai
9f80: 6c 61 62 6c 65 20 69 66 20 74 68 65 20 53 51 4c  lable if the SQL
9f90: 49 54 45 5f 53 4f 55 4e 44 45 58 20 63 6f 6d 70  ITE_SOUNDEX comp
9fa0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
9fb0: 69 73 20 75 73 65 64 0a 2a 2a 20 77 68 65 6e 20  is used.** when 
9fc0: 53 51 4c 69 74 65 20 69 73 20 62 75 69 6c 74 2e  SQLite is built.
9fd0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
9fe0: 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  E_SOUNDEX./*.** 
9ff0: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f 75 6e  Compute the soun
a000: 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  dex encoding of 
a010: 61 20 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d  a word..**.** IM
a020: 50 3a 20 52 2d 35 39 37 38 32 2d 30 30 30 37 32  P: R-59782-00072
a030: 20 54 68 65 20 73 6f 75 6e 64 65 78 28 58 29 20   The soundex(X) 
a040: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a050: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
a060: 73 20 74 68 65 0a 2a 2a 20 73 6f 75 6e 64 65 78  s the.** soundex
a070: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
a080: 20 73 74 72 69 6e 67 20 58 2e 20 0a 2a 2f 0a 73   string X. .*/.s
a090: 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 6e 64  tatic void sound
a0a0: 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  exFunc(.  sqlite
a0b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
a0c0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
a0d0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a0e0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72  **argv.){.  char
a0f0: 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20 63   zResult[8];.  c
a100: 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20 20  onst u8 *zIn;.  
a110: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74  int i, j;.  stat
a120: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
a130: 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d 20 3d  d char iCode[] =
a140: 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20   {.    0, 0, 0, 
a150: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a160: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a170: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
a180: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a190: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a1a0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
a1b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a1c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a1d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
a1e0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a1f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a200: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a210: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20  0,.    0, 0, 1, 
a220: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30  2, 3, 0, 1, 2, 0
a230: 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c  , 0, 2, 2, 4, 5,
a240: 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c   5, 0,.    1, 2,
a250: 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   6, 2, 3, 0, 1, 
a260: 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30  0, 2, 0, 2, 0, 0
a270: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
a280: 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c  , 0, 1, 2, 3, 0,
a290: 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20   1, 2, 0, 0, 2, 
a2a0: 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20  2, 4, 5, 5, 0,. 
a2b0: 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33     1, 2, 6, 2, 3
a2c0: 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 1, 0, 2, 0,
a2d0: 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   2, 0, 0, 0, 0, 
a2e0: 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74  0,.  };.  assert
a2f0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a  ( argc==1 );.  z
a300: 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  In = (u8*)sqlite
a310: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
a320: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e  v[0]);.  if( zIn
a330: 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75 38 2a  ==0 ) zIn = (u8*
a340: 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  )"";.  for(i=0; 
a350: 7a 49 6e 5b 69 5d 20 26 26 20 21 73 71 6c 69 74  zIn[i] && !sqlit
a360: 65 33 49 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d  e3Isalpha(zIn[i]
a370: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  ); i++){}.  if( 
a380: 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75 38  zIn[i] ){.    u8
a390: 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43 6f 64   prevcode = iCod
a3a0: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
a3b0: 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20 3d      zResult[0] =
a3c0: 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28   sqlite3Toupper(
a3d0: 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f 72  zIn[i]);.    for
a3e0: 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49 6e  (j=1; j<4 && zIn
a3f0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
a400: 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f 64   int code = iCod
a410: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
a420: 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 3e 30        if( code>0
a430: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a440: 63 6f 64 65 21 3d 70 72 65 76 63 6f 64 65 20 29  code!=prevcode )
a450: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  {.          prev
a460: 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20 20  code = code;.   
a470: 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a         zResult[j
a480: 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30 27  ++] = code + '0'
a490: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a4a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a4b0: 20 70 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a 20   prevcode = 0;. 
a4c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a4d0: 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a 20   while( j<4 ){. 
a4e0: 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b       zResult[j++
a4f0: 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a 20  ] = '0';.    }. 
a500: 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d 20     zResult[j] = 
a510: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
a520: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
a530: 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c 20  xt, zResult, 4, 
a540: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
a550: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a560: 2f 2a 20 49 4d 50 3a 20 52 2d 36 34 38 39 34 2d  /* IMP: R-64894-
a570: 35 30 33 32 31 20 54 68 65 20 73 74 72 69 6e 67  50321 The string
a580: 20 22 3f 30 30 30 22 20 69 73 20 72 65 74 75 72   "?000" is retur
a590: 6e 65 64 20 69 66 20 74 68 65 20 61 72 67 75 6d  ned if the argum
a5a0: 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 4e 55  ent.    ** is NU
a5b0: 4c 4c 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e  LL or contains n
a5c0: 6f 20 41 53 43 49 49 20 61 6c 70 68 61 62 65 74  o ASCII alphabet
a5d0: 69 63 20 63 68 61 72 61 63 74 65 72 73 2e 20 2a  ic characters. *
a5e0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  /.    sqlite3_re
a5f0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
a600: 74 2c 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51  t, "?000", 4, SQ
a610: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
a620: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
a630: 4c 49 54 45 5f 53 4f 55 4e 44 45 58 20 2a 2f 0a  LITE_SOUNDEX */.
a640: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a650: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
a660: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63  ION./*.** A func
a670: 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 73 20  tion that loads 
a680: 61 20 73 68 61 72 65 64 2d 6c 69 62 72 61 72 79  a shared-library
a690: 20 65 78 74 65 6e 73 69 6f 6e 20 74 68 65 6e 20   extension then 
a6a0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f  returns NULL..*/
a6b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61  .static void loa
a6c0: 64 45 78 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e  dExt(sqlite3_con
a6d0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
a6e0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
a6f0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
a700: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
a710: 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
a720: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
a730: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
a740: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a750: 50 72 6f 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  Proc;.  sqlite3 
a760: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
a770: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
a780: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72  context);.  char
a790: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
a7a0: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74 68    /* Disallow th
a7b0: 65 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e load_extension
a7c0: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
a7d0: 75 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 49 54  unless the SQLIT
a7e0: 45 5f 4c 6f 61 64 45 78 74 46 75 6e 63 0a 20 20  E_LoadExtFunc.  
a7f0: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ** flag is set. 
a800: 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33   See the sqlite3
a810: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
a820: 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20  ension() API..  
a830: 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  */.  if( (db->fl
a840: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 6f 61  ags & SQLITE_Loa
a850: 64 45 78 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a  dExtFunc)==0 ){.
a860: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
a870: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
a880: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
a890: 64 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  d", -1);.    ret
a8a0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
a8b0: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  argc==2 ){.    z
a8c0: 50 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68  Proc = (const ch
a8d0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
a8e0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
a8f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
a900: 50 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Proc = 0;.  }.  
a910: 69 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c  if( zFile && sql
a920: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
a930: 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  ion(db, zFile, z
a940: 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20  Proc, &zErrMsg) 
a950: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
a960: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
a970: 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31  ext, zErrMsg, -1
a980: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
a990: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
a9a0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
a9b0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
a9c0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
a9d0: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
a9e0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61  the context of a
a9f0: 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67  .** sum() or avg
aa00: 28 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d  () aggregate com
aa10: 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  putation..*/.typ
aa20: 65 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43  edef struct SumC
aa30: 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63  tx SumCtx;.struc
aa40: 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75  t SumCtx {.  dou
aa50: 62 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f  ble rSum;      /
aa60: 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * Floating point
aa70: 20 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53   sum */.  i64 iS
aa80: 75 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  um;         /* I
aa90: 6e 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20  nteger sum */   
aaa0: 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20  .  i64 cnt;     
aab0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
aac0: 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65  f elements summe
aad0: 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c  d */.  u8 overfl
aae0: 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ow;      /* True
aaf0: 20 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72   if integer over
ab00: 66 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75  flow seen */.  u
ab10: 38 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20  8 approx;       
ab20: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d   /* True if non-
ab30: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 61  integer value wa
ab40: 73 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73  s input to the s
ab50: 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  um */.};../*.** 
ab60: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f  Routines used to
ab70: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d   compute the sum
ab80: 2c 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74  , average, and t
ab90: 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  otal..**.** The 
aba0: 53 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  SUM() function f
abb0: 6f 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b  ollows the (brok
abc0: 65 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64  en) SQL standard
abd0: 20 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20   which means.** 
abe0: 74 68 61 74 20 69 74 20 72 65 74 75 72 6e 73 20  that it returns 
abf0: 4e 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20  NULL if it sums 
ac00: 6f 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20  over no inputs. 
ac10: 20 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a   TOTAL returns.*
ac20: 2a 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61  * 0.0 in that ca
ac30: 73 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  se.  In addition
ac40: 2c 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72  , TOTAL always r
ac50: 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77  eturns a float w
ac60: 68 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68  here.** SUM migh
ac70: 74 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  t return an inte
ac80: 67 65 72 20 69 66 20 69 74 20 6e 65 76 65 72 20  ger if it never 
ac90: 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f  encounters a flo
aca0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
acb0: 61 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76  alue.  TOTAL nev
acc0: 65 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55  er fails, but SU
acd0: 4d 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20  M might through 
ace0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a  an exception if.
acf0: 2a 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20  ** it overflows 
ad00: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  an integer..*/.s
ad10: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74  tatic void sumSt
ad20: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
ad30: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
ad40: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
ad50: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
ad60: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74  SumCtx *p;.  int
ad70: 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28   type;.  assert(
ad80: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
ad90: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
ada0: 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  rgc);.  p = sqli
adb0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
adc0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
add0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79  izeof(*p));.  ty
ade0: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
adf0: 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
ae00: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
ae10: 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54  p && type!=SQLIT
ae20: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d  E_NULL ){.    p-
ae30: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20  >cnt++;.    if( 
ae40: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  type==SQLITE_INT
ae50: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36  EGER ){.      i6
ae60: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
ae70: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
ae80: 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  ]);.      p->rSu
ae90: 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66  m += v;.      if
aea0: 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e  ( (p->approx|p->
aeb0: 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20  overflow)==0 && 
aec0: 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28  sqlite3AddInt64(
aed0: 26 70 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b 0a  &p->iSum, v) ){.
aee0: 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72 66          p->overf
aef0: 6c 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  low = 1;.      }
af00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
af10: 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73 71 6c    p->rSum += sql
af20: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
af30: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  e(argv[0]);.    
af40: 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20 31 3b    p->approx = 1;
af50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
af60: 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e 61  tic void sumFina
af70: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
af80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
af90: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
afa0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
afb0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
afc0: 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  text, 0);.  if( 
afd0: 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b  p && p->cnt>0 ){
afe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 76 65 72  .    if( p->over
aff0: 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 73 71  flow ){.      sq
b000: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
b010: 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69 6e 74 65  or(context,"inte
b020: 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c 2d 31  ger overflow",-1
b030: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
b040: 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b 0a 20 20   p->approx ){.  
b050: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b060: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
b070: 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a 20 20 20  t, p->rSum);.   
b080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
b090: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
b0a0: 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 69  64(context, p->i
b0b0: 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sum);.    }.  }.
b0c0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 76  }.static void av
b0d0: 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  gFinalize(sqlite
b0e0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
b0f0: 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70  xt){.  SumCtx *p
b100: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
b110: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
b120: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
b130: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74   if( p && p->cnt
b140: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
b150: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
b160: 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d  context, p->rSum
b170: 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29  /(double)p->cnt)
b180: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
b190: 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a  oid totalFinaliz
b1a0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
b1b0: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
b1c0: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  umCtx *p;.  p = 
b1d0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
b1e0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
b1f0: 74 2c 20 30 29 3b 0a 20 20 2f 2a 20 28 64 6f 75  t, 0);.  /* (dou
b200: 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66  ble)0 In case of
b210: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
b220: 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
b230: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
b240: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
b250: 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20 3a  t, p ? p->rSum :
b260: 20 28 64 6f 75 62 6c 65 29 30 29 3b 0a 7d 0a 0a   (double)0);.}..
b270: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
b280: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
b290: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73 74 61  eps track of sta
b2a0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  te information f
b2b0: 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74 28  or the.** count(
b2c0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
b2d0: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
b2e0: 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78   struct CountCtx
b2f0: 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63   CountCtx;.struc
b300: 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69  t CountCtx {.  i
b310: 36 34 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  64 n;.};../*.** 
b320: 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c  Routines to impl
b330: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 28  ement the count(
b340: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
b350: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
b360: 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73  void countStep(s
b370: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
b380: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
b390: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
b3a0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e   **argv){.  Coun
b3b0: 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  tCtx *p;.  p = s
b3c0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
b3d0: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
b3e0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
b3f0: 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c   if( (argc==0 ||
b400: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
b410: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
b420: 28 61 72 67 76 5b 30 5d 29 29 20 26 26 20 70 20  (argv[0])) && p 
b430: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
b440: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
b450: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
b460: 45 44 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69  ED.  /* The sqli
b470: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
b480: 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  unt() function i
b490: 73 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 42  s deprecated.  B
b4a0: 75 74 20 6a 75 73 74 20 74 6f 20 6d 61 6b 65 0a  ut just to make.
b4b0: 20 20 2a 2a 20 73 75 72 65 20 69 74 20 73 74 69    ** sure it sti
b4c0: 6c 6c 20 6f 70 65 72 61 74 65 73 20 63 6f 72 72  ll operates corr
b4d0: 65 63 74 6c 79 2c 20 76 65 72 69 66 79 20 74 68  ectly, verify th
b4e0: 61 74 20 69 74 73 20 63 6f 75 6e 74 20 61 67 72  at its count agr
b4f0: 65 65 73 20 77 69 74 68 20 6f 75 72 20 0a 20 20  ees with our .  
b500: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 63 6f 75 6e  ** internal coun
b510: 74 20 77 68 65 6e 20 75 73 69 6e 67 20 63 6f 75  t when using cou
b520: 6e 74 28 2a 29 20 61 6e 64 20 77 68 65 6e 20 74  nt(*) and when t
b530: 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 63  he total count c
b540: 61 6e 20 62 65 0a 20 20 2a 2a 20 65 78 70 72 65  an be.  ** expre
b550: 73 73 65 64 20 61 73 20 61 20 33 32 2d 62 69 74  ssed as a 32-bit
b560: 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 61   integer. */.  a
b570: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
b580: 7c 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30  | p==0 || p->n>0
b590: 78 37 66 66 66 66 66 66 66 0a 20 20 20 20 20 20  x7fffffff.      
b5a0: 20 20 20 20 7c 7c 20 70 2d 3e 6e 3d 3d 73 71 6c      || p->n==sql
b5b0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
b5c0: 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 20 29 3b  ount(context) );
b5d0: 0a 23 65 6e 64 69 66 0a 7d 20 20 20 0a 73 74 61  .#endif.}   .sta
b5e0: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69  tic void countFi
b5f0: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
b600: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
b610: 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b  {.  CountCtx *p;
b620: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
b630: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
b640: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
b650: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
b660: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 20  nt64(context, p 
b670: 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a  ? p->n : 0);.}..
b680: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
b690: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28  o implement min(
b6a0: 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72  ) and max() aggr
b6b0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
b6c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b6d0: 6d 69 6e 6d 61 78 53 74 65 70 28 0a 20 20 73 71  minmaxStep(.  sq
b6e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
b6f0: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e  ontext, .  int N
b700: 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74  otUsed, .  sqlit
b710: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
b720: 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20  ){.  Mem *pArg  
b730: 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d  = (Mem *)argv[0]
b740: 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a  ;.  Mem *pBest;.
b750: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
b760: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20 20  ER(NotUsed);..  
b770: 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73  pBest = (Mem *)s
b780: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
b790: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
b7a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29  , sizeof(*pBest)
b7b0: 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73 74 20  );.  if( !pBest 
b7c0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
b7d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
b7e0: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
b7f0: 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
b800: 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67   if( pBest->flag
b810: 73 20 29 20 73 71 6c 69 74 65 33 53 6b 69 70 41  s ) sqlite3SkipA
b820: 63 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63  ccumulatorLoad(c
b830: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65  ontext);.  }else
b840: 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67   if( pBest->flag
b850: 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78  s ){.    int max
b860: 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20  ;.    int cmp;. 
b870: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
b880: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75  l = sqlite3GetFu
b890: 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78  ncCollSeq(contex
b8a0: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  t);.    /* This 
b8b0: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73  step function is
b8c0: 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
b8d0: 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  he min() and max
b8e0: 28 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20  () aggregates,. 
b8f0: 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64     ** the only d
b900: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
b910: 6e 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20  n the two being 
b920: 74 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f  that the sense o
b930: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  f the.    ** com
b940: 70 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72  parison is inver
b950: 74 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78  ted. For the max
b960: 28 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  () aggregate, th
b970: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
b980: 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e  _user_data() fun
b990: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76  ction returns (v
b9a0: 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69  oid *)-1. For mi
b9b0: 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65  n() it.    ** re
b9c0: 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62  turns (void *)db
b9d0: 2c 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68  , where db is th
b9e0: 65 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62  e sqlite3* datab
b9f0: 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20  ase pointer..   
ba00: 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68   ** Therefore th
ba10: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
ba20: 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27   sets variable '
ba30: 6d 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68  max' to 1 for th
ba40: 65 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61  e max().    ** a
ba50: 67 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66  ggregate, or 0 f
ba60: 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  or min()..    */
ba70: 0a 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74  .    max = sqlit
ba80: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
ba90: 74 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d  text)!=0;.    cm
baa0: 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  p = sqlite3MemCo
bab0: 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70 41 72  mpare(pBest, pAr
bac0: 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  g, pColl);.    i
bad0: 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30  f( (max && cmp<0
bae0: 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d  ) || (!max && cm
baf0: 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  p>0) ){.      sq
bb00: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
bb10: 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20  (pBest, pArg);. 
bb20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bb30: 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d  sqlite3SkipAccum
bb40: 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65  ulatorLoad(conte
bb50: 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  xt);.    }.  }el
bb60: 73 65 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 64  se{.    pBest->d
bb70: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
bb80: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
bb90: 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69  ntext);.    sqli
bba0: 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70  te3VdbeMemCopy(p
bbb0: 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d  Best, pArg);.  }
bbc0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  .}.static void m
bbd0: 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 28 73 71  inMaxFinalize(sq
bbe0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
bbf0: 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74  ontext){.  sqlit
bc00: 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a  e3_value *pRes;.
bc10: 20 20 70 52 65 73 20 3d 20 28 73 71 6c 69 74 65    pRes = (sqlite
bc20: 33 5f 76 61 6c 75 65 20 2a 29 73 71 6c 69 74 65  3_value *)sqlite
bc30: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
bc40: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
bc50: 0a 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20  .  if( pRes ){. 
bc60: 20 20 20 69 66 28 20 70 52 65 73 2d 3e 66 6c 61     if( pRes->fla
bc70: 67 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  gs ){.      sqli
bc80: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
bc90: 28 63 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b  (context, pRes);
bca0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bcb0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
bcc0: 28 70 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pRes);.  }.}../
bcd0: 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e 63 61  *.** group_conca
bce0: 74 28 45 58 50 52 2c 20 3f 53 45 50 41 52 41 54  t(EXPR, ?SEPARAT
bcf0: 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  OR?).*/.static v
bd00: 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 53  oid groupConcatS
bd10: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
bd20: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
bd30: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
bd40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
bd50: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
bd60: 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 53 74 72  har *zVal;.  Str
bd70: 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20  Accum *pAccum;. 
bd80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
bd90: 70 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 6e  p;.  int nVal, n
bda0: 53 65 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  Sep;.  assert( a
bdb0: 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d  rgc==1 || argc==
bdc0: 32 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  2 );.  if( sqlit
bdd0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
bde0: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
bdf0: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
be00: 70 41 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63  pAccum = (StrAcc
be10: 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  um*)sqlite3_aggr
be20: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
be30: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
be40: 41 63 63 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20  Accum));..  if( 
be50: 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20 73 71  pAccum ){.    sq
be60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
be70: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
be80: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
be90: 20 20 20 20 69 6e 74 20 66 69 72 73 74 54 65 72      int firstTer
bea0: 6d 20 3d 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c  m = pAccum->mxAl
beb0: 6c 6f 63 3d 3d 30 3b 0a 20 20 20 20 70 41 63 63  loc==0;.    pAcc
bec0: 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20 64 62  um->mxAlloc = db
bed0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
bee0: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20  LIMIT_LENGTH];. 
bef0: 20 20 20 69 66 28 20 21 66 69 72 73 74 54 65 72     if( !firstTer
bf00: 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  m ){.      if( a
bf10: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  rgc==2 ){.      
bf20: 20 20 7a 53 65 70 20 3d 20 28 63 68 61 72 2a 29    zSep = (char*)
bf30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
bf40: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  xt(argv[1]);.   
bf50: 20 20 20 20 20 6e 53 65 70 20 3d 20 73 71 6c 69       nSep = sqli
bf60: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
bf70: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20  argv[1]);.      
bf80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
bf90: 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20  Sep = ",";.     
bfa0: 20 20 20 6e 53 65 70 20 3d 20 31 3b 0a 20 20 20     nSep = 1;.   
bfb0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
bfc0: 53 65 70 20 29 20 73 71 6c 69 74 65 33 53 74 72  Sep ) sqlite3Str
bfd0: 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63  AccumAppend(pAcc
bfe0: 75 6d 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b  um, zSep, nSep);
bff0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20  .    }.    zVal 
c000: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
c010: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
c020: 5b 30 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d  [0]);.    nVal =
c030: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
c040: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
c050: 20 20 20 69 66 28 20 7a 56 61 6c 20 29 20 73 71     if( zVal ) sq
c060: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
c070: 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 56 61 6c  end(pAccum, zVal
c080: 2c 20 6e 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73  , nVal);.  }.}.s
c090: 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75 70  tatic void group
c0a0: 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 28 73  ConcatFinalize(s
c0b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c0c0: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74 72 41  context){.  StrA
c0d0: 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20  ccum *pAccum;.  
c0e0: 70 41 63 63 75 6d 20 3d 20 73 71 6c 69 74 65 33  pAccum = sqlite3
c0f0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
c100: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
c110: 20 20 69 66 28 20 70 41 63 63 75 6d 20 29 7b 0a    if( pAccum ){.
c120: 20 20 20 20 69 66 28 20 70 41 63 63 75 6d 2d 3e      if( pAccum->
c130: 61 63 63 45 72 72 6f 72 3d 3d 53 54 52 41 43 43  accError==STRACC
c140: 55 4d 5f 54 4f 4f 42 49 47 20 29 7b 0a 20 20 20  UM_TOOBIG ){.   
c150: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
c160: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
c170: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ontext);.    }el
c180: 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61  se if( pAccum->a
c190: 63 63 45 72 72 6f 72 3d 3d 53 54 52 41 43 43 55  ccError==STRACCU
c1a0: 4d 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  M_NOMEM ){.     
c1b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c1c0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
c1d0: 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ext);.    }else{
c1e0: 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
c1f0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
c200: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53  ontext, sqlite3S
c210: 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 70 41  trAccumFinish(pA
c220: 63 63 75 6d 29 2c 20 2d 31 2c 20 0a 20 20 20 20  ccum), -1, .    
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
c250: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ee);.    }.  }.}
c260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
c270: 74 69 6e 65 20 64 6f 65 73 20 70 65 72 2d 63 6f  tine does per-co
c280: 6e 6e 65 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f  nnection functio
c290: 6e 20 72 65 67 69 73 74 72 61 74 69 6f 6e 2e 20  n registration. 
c2a0: 20 4d 6f 73 74 0a 2a 2a 20 6f 66 20 74 68 65 20   Most.** of the 
c2b0: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
c2c0: 6e 73 20 61 62 6f 76 65 20 61 72 65 20 70 61 72  ns above are par
c2d0: 74 20 6f 66 20 74 68 65 20 67 6c 6f 62 61 6c 20  t of the global 
c2e0: 66 75 6e 63 74 69 6f 6e 20 73 65 74 2e 0a 2a 2a  function set..**
c2f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   This routine on
c300: 6c 79 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  ly deals with th
c310: 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ose that are not
c320: 20 67 6c 6f 62 61 6c 2e 0a 2a 2f 0a 76 6f 69 64   global..*/.void
c330: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
c340: 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69  PerConnectionBui
c350: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73 71  ltinFunctions(sq
c360: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
c370: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f  t rc = sqlite3_o
c380: 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
c390: 28 64 62 2c 20 22 4d 41 54 43 48 22 2c 20 32 29  (db, "MATCH", 2)
c3a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
c3b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
c3c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
c3d0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c3e0: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
c3f0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
c400: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
c410: 20 53 65 74 20 74 68 65 20 4c 49 4b 45 4f 50 54   Set the LIKEOPT
c420: 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 32 2d 61   flag on the 2-a
c430: 72 67 75 6d 65 6e 74 20 66 75 6e 63 74 69 6f 6e  rgument function
c440: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
c450: 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
c460: 76 6f 69 64 20 73 65 74 4c 69 6b 65 4f 70 74 46  void setLikeOptF
c470: 6c 61 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  lag(sqlite3 *db,
c480: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
c490: 6d 65 2c 20 75 38 20 66 6c 61 67 56 61 6c 29 7b  me, u8 flagVal){
c4a0: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  .  FuncDef *pDef
c4b0: 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74  ;.  pDef = sqlit
c4c0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
c4d0: 62 2c 20 7a 4e 61 6d 65 2c 20 32 2c 20 53 51 4c  b, zName, 2, SQL
c4e0: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
c4f0: 69 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29  if( ALWAYS(pDef)
c500: 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 75   ){.    pDef->fu
c510: 6e 63 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67 56  ncFlags |= flagV
c520: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
c530: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 62 75   Register the bu
c540: 69 6c 74 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20  ilt-in LIKE and 
c550: 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20  GLOB functions. 
c560: 20 54 68 65 20 63 61 73 65 53 65 6e 73 69 74 69   The caseSensiti
c570: 76 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ve.** parameter 
c580: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
c590: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49  er or not the LI
c5a0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63  KE operator is c
c5b0: 61 73 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65  ase.** sensitive
c5c0: 2e 20 20 47 4c 4f 42 20 69 73 20 61 6c 77 61 79  .  GLOB is alway
c5d0: 73 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65  s case sensitive
c5e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c5f0: 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e  3RegisterLikeFun
c600: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
c610: 64 62 2c 20 69 6e 74 20 63 61 73 65 53 65 6e 73  db, int caseSens
c620: 69 74 69 76 65 29 7b 0a 20 20 73 74 72 75 63 74  itive){.  struct
c630: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49   compareInfo *pI
c640: 6e 66 6f 3b 0a 20 20 69 66 28 20 63 61 73 65 53  nfo;.  if( caseS
c650: 65 6e 73 69 74 69 76 65 20 29 7b 0a 20 20 20 20  ensitive ){.    
c660: 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20  pInfo = (struct 
c670: 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69  compareInfo*)&li
c680: 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c  keInfoAlt;.  }el
c690: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20  se{.    pInfo = 
c6a0: 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  (struct compareI
c6b0: 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f  nfo*)&likeInfoNo
c6c0: 72 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rm;.  }.  sqlite
c6d0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
c6e0: 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54  "like", 2, SQLIT
c6f0: 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c  E_UTF8, pInfo, l
c700: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30  ikeFunc, 0, 0, 0
c710: 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61  );.  sqlite3Crea
c720: 74 65 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65  teFunc(db, "like
c730: 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
c740: 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75  8, pInfo, likeFu
c750: 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nc, 0, 0, 0);.  
c760: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
c770: 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32 2c  c(db, "glob", 2,
c780: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
c790: 20 20 20 20 20 28 73 74 72 75 63 74 20 63 6f 6d       (struct com
c7a0: 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62 49  pareInfo*)&globI
c7b0: 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30  nfo, likeFunc, 0
c7c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 65 74 4c 69  , 0, 0);.  setLi
c7d0: 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67  keOptFlag(db, "g
c7e0: 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e  lob", SQLITE_FUN
c7f0: 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f  C_LIKE | SQLITE_
c800: 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65  FUNC_CASE);.  se
c810: 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c  tLikeOptFlag(db,
c820: 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20   "like", .      
c830: 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20  caseSensitive ? 
c840: 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b  (SQLITE_FUNC_LIK
c850: 45 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  E | SQLITE_FUNC_
c860: 43 41 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46  CASE) : SQLITE_F
c870: 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a  UNC_LIKE);.}../*
c880: 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73  .** pExpr points
c890: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
c8a0: 6e 20 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e  n which implemen
c8b0: 74 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ts a function.  
c8c0: 49 66 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72  If.** it is appr
c8d0: 6f 70 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79  opriate to apply
c8e0: 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69   the LIKE optimi
c8f0: 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66  zation to that f
c900: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20  unction.** then 
c910: 73 65 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75  set aWc[0] throu
c920: 67 68 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65  gh aWc[2] to the
c930: 20 77 69 6c 64 63 61 72 64 20 63 68 61 72 61 63   wildcard charac
c940: 74 65 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ters and the.** 
c950: 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72  escape character
c960: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
c970: 20 54 52 55 45 2e 20 20 49 66 20 74 68 65 20 66   TRUE.  If the f
c980: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  unction is not a
c990: 20 0a 2a 2a 20 4c 49 4b 45 2d 73 74 79 6c 65 20   .** LIKE-style 
c9a0: 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  function then re
c9b0: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a 2a  turn FALSE..**.*
c9c0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
c9d0: 20 22 61 20 4c 49 4b 45 20 62 20 45 53 43 41 50   "a LIKE b ESCAP
c9e0: 45 20 63 22 20 69 73 20 6f 6e 6c 79 20 63 6f 6e  E c" is only con
c9f0: 73 69 64 65 72 65 64 20 61 20 76 61 6c 69 64 20  sidered a valid 
ca00: 4c 49 4b 45 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  LIKE.** operator
ca10: 20 69 66 20 63 20 69 73 20 61 20 73 74 72 69 6e   if c is a strin
ca20: 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69  g literal that i
ca30: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79  s exactly one by
ca40: 74 65 20 69 6e 20 6c 65 6e 67 74 68 2e 0a 2a 2a  te in length..**
ca50: 20 54 68 61 74 20 6f 6e 65 20 62 79 74 65 20 69   That one byte i
ca60: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 57 63 5b  s stored in aWc[
ca70: 33 5d 2e 20 20 61 57 63 5b 33 5d 20 69 73 20 73  3].  aWc[3] is s
ca80: 65 74 20 74 6f 20 7a 65 72 6f 20 69 66 20 74 68  et to zero if th
ca90: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 45 53 43  ere is.** no ESC
caa0: 41 50 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  APE clause..**.*
cab0: 2a 20 2a 70 49 73 4e 6f 63 61 73 65 20 69 73 20  * *pIsNocase is 
cac0: 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 75  set to true if u
cad0: 70 70 65 72 63 61 73 65 20 61 6e 64 20 6c 6f 77  ppercase and low
cae0: 65 72 63 61 73 65 20 61 72 65 20 65 71 75 69 76  ercase are equiv
caf0: 61 6c 65 6e 74 20 66 6f 72 0a 2a 2a 20 74 68 65  alent for.** the
cb00: 20 66 75 6e 63 74 69 6f 6e 20 28 64 65 66 61 75   function (defau
cb10: 6c 74 20 66 6f 72 20 4c 49 4b 45 29 2e 20 20 49  lt for LIKE).  I
cb20: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d  f the function m
cb30: 61 6b 65 73 20 74 68 65 20 64 69 73 74 69 6e 63  akes the distinc
cb40: 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20  tion.** between 
cb50: 75 70 70 65 72 63 61 73 65 20 61 6e 64 20 6c 6f  uppercase and lo
cb60: 77 65 72 63 61 73 65 20 28 61 73 20 64 6f 65 73  wercase (as does
cb70: 20 47 4c 4f 42 29 20 74 68 65 6e 20 2a 70 49 73   GLOB) then *pIs
cb80: 4e 6f 63 61 73 65 20 69 73 20 73 65 74 20 74 6f  Nocase is set to
cb90: 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e  .** false..*/.in
cba0: 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46  t sqlite3IsLikeF
cbb0: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
cbc0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70 72  *db, Expr *pExpr
cbd0: 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73 65  , int *pIsNocase
cbe0: 2c 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20 20  , char *aWc){.  
cbf0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
cc00: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 69 66   int nExpr;.  if
cc10: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
cc20: 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 21 70 45 78  FUNCTION || !pEx
cc30: 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20  pr->x.pList ){. 
cc40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cc50: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
cc60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
cc70: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
cc80: 20 29 3b 0a 20 20 6e 45 78 70 72 20 3d 20 70 45   );.  nExpr = pE
cc90: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
cca0: 78 70 72 3b 0a 20 20 70 44 65 66 20 3d 20 73 71  xpr;.  pDef = sq
ccb0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
ccc0: 6e 28 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  n(db, pExpr->u.z
ccd0: 54 6f 6b 65 6e 2c 20 6e 45 78 70 72 2c 20 53 51  Token, nExpr, SQ
cce0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
ccf0: 20 69 66 28 20 4e 45 56 45 52 28 70 44 65 66 3d   if( NEVER(pDef=
cd00: 3d 30 29 20 7c 7c 20 28 70 44 65 66 2d 3e 66 75  =0) || (pDef->fu
cd10: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
cd20: 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d 30 20 29  _FUNC_LIKE)==0 )
cd30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cd40: 20 20 7d 0a 20 20 69 66 28 20 6e 45 78 70 72 3c    }.  if( nExpr<
cd50: 33 20 29 7b 0a 20 20 20 20 61 57 63 5b 33 5d 20  3 ){.    aWc[3] 
cd60: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
cd70: 20 20 45 78 70 72 20 2a 70 45 73 63 61 70 65 20    Expr *pEscape 
cd80: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
cd90: 2d 3e 61 5b 32 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[2].pExpr;.  
cda0: 20 20 63 68 61 72 20 2a 7a 45 73 63 61 70 65 3b    char *zEscape;
cdb0: 0a 20 20 20 20 69 66 28 20 70 45 73 63 61 70 65  .    if( pEscape
cdc0: 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op!=TK_STRING 
cdd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
cde0: 7a 45 73 63 61 70 65 20 3d 20 70 45 73 63 61 70  zEscape = pEscap
cdf0: 65 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  e->u.zToken;.   
ce00: 20 69 66 28 20 7a 45 73 63 61 70 65 5b 30 5d 3d   if( zEscape[0]=
ce10: 3d 30 20 7c 7c 20 7a 45 73 63 61 70 65 5b 31 5d  =0 || zEscape[1]
ce20: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
ce30: 20 20 20 20 61 57 63 5b 33 5d 20 3d 20 7a 45 73      aWc[3] = zEs
ce40: 63 61 70 65 5b 30 5d 3b 0a 20 20 7d 0a 0a 20 20  cape[0];.  }..  
ce50: 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20  /* The memcpy() 
ce60: 73 74 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65  statement assume
ce70: 73 20 74 68 61 74 20 74 68 65 20 77 69 6c 64 63  s that the wildc
ce80: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 61  ard characters a
ce90: 72 65 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  re.  ** the firs
cea0: 74 20 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e  t three statemen
ceb0: 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72  ts in the compar
cec0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  eInfo structure.
ced0: 20 20 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72    The.  ** asser
cee0: 74 73 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ts() that follow
cef0: 20 76 65 72 69 66 79 20 74 68 61 74 20 61 73 73   verify that ass
cf00: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d  umption.  */.  m
cf10: 65 6d 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d  emcpy(aWc, pDef-
cf20: 3e 70 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a  >pUserData, 3);.
cf30: 20 20 61 73 73 65 72 74 28 20 28 63 68 61 72 2a    assert( (char*
cf40: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d  )&likeInfoAlt ==
cf50: 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66   (char*)&likeInf
cf60: 6f 41 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b  oAlt.matchAll );
cf70: 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68  .  assert( &((ch
cf80: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
cf90: 29 5b 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26  )[1] == (char*)&
cfa0: 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63  likeInfoAlt.matc
cfb0: 68 4f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  hOne );.  assert
cfc0: 28 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65  ( &((char*)&like
cfd0: 49 6e 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28  InfoAlt)[2] == (
cfe0: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
cff0: 6c 74 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20  lt.matchSet );. 
d000: 20 2a 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70   *pIsNocase = (p
d010: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
d020: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53   SQLITE_FUNC_CAS
d030: 45 29 3d 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20  E)==0;.  return 
d040: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  1;.}../*.** All 
d050: 6f 66 20 74 68 65 20 46 75 6e 63 44 65 66 20 73  of the FuncDef s
d060: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
d070: 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20   aBuiltinFunc[] 
d080: 61 72 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74  array above.** t
d090: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  o the global fun
d0a0: 63 74 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65  ction hash table
d0b0: 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 20 61  .  This occurs a
d0c0: 74 20 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73  t start-time (as
d0d0: 0a 2a 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63  .** a consequenc
d0e0: 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c  e of calling sql
d0f0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
d100: 29 29 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ))..**.** After 
d110: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
d120: 73 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  s.*/.void sqlite
d130: 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
d140: 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b  Functions(void){
d150: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  /*.  ** The f
d160: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
d170: 6f 6c 64 73 20 46 75 6e 63 44 65 66 20 73 74 72  olds FuncDef str
d180: 75 63 74 75 72 65 73 20 66 6f 72 20 61 6c 6c 20  uctures for all 
d190: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  of the functions
d1a0: 0a 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e  .  ** defined in
d1b0: 20 74 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a   this file..  **
d1c0: 0a 20 20 2a 2a 20 54 68 65 20 61 72 72 61 79 20  .  ** The array 
d1d0: 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61  cannot be consta
d1e0: 6e 74 20 73 69 6e 63 65 20 63 68 61 6e 67 65 73  nt since changes
d1f0: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
d200: 0a 20 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48  .  ** FuncDef.pH
d210: 61 73 68 20 65 6c 65 6d 65 6e 74 73 20 61 74 20  ash elements at 
d220: 73 74 61 72 74 2d 74 69 6d 65 2e 20 20 54 68 65  start-time.  The
d230: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 69   elements of thi
d240: 73 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 72 65  s array.  ** are
d250: 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
d260: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
d270: 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a  is complete..  *
d280: 2a 0a 20 20 2a 2a 20 46 6f 72 20 70 65 61 6b 20  *.  ** For peak 
d290: 65 66 66 69 63 69 65 6e 63 79 2c 20 70 75 74 20  efficiency, put 
d2a0: 74 68 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e  the most frequen
d2b0: 74 6c 79 20 75 73 65 64 20 66 75 6e 63 74 69 6f  tly used functio
d2c0: 6e 20 6c 61 73 74 2e 0a 20 20 2a 2f 0a 20 20 73  n last..  */.  s
d2d0: 74 61 74 69 63 20 46 75 6e 63 44 65 66 20 61 42  tatic FuncDef aB
d2e0: 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b  uiltinFunc[] = {
d2f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
d300: 4f 55 4e 44 45 58 0a 20 20 20 20 46 55 4e 43 54  OUNDEX.    FUNCT
d310: 49 4f 4e 28 73 6f 75 6e 64 65 78 2c 20 20 20 20  ION(soundex,    
d320: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
d330: 20 73 6f 75 6e 64 65 78 46 75 6e 63 20 20 20 20   soundexFunc    
d340: 20 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e    ),.#endif.#ifn
d350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d360: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
d370: 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 6c 6f 61     VFUNCTION(loa
d380: 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20  d_extension,    
d390: 31 2c 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74  1, 0, 0, loadExt
d3a0: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
d3b0: 20 56 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f   VFUNCTION(load_
d3c0: 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 32 2c  extension,    2,
d3d0: 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20   0, 0, loadExt  
d3e0: 20 20 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69          ),.#endi
d3f0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  f.#if SQLITE_USE
d400: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
d410: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71  .    FUNCTION(sq
d420: 6c 69 74 65 5f 63 72 79 70 74 2c 20 20 20 20 20  lite_crypt,     
d430: 20 20 32 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74    2, 0, 0, sqlit
d440: 65 33 43 72 79 70 74 46 75 6e 63 20 29 2c 0a 23  e3CryptFunc ),.#
d450: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
d460: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
d470: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20  EOPTION_DIAGS.  
d480: 20 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69    DFUNCTION(sqli
d490: 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  te_compileoption
d4a0: 5f 75 73 65 64 2c 31 2c 20 30 2c 20 30 2c 20 63  _used,1, 0, 0, c
d4b0: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64  ompileoptionused
d4c0: 46 75 6e 63 20 20 29 2c 0a 20 20 20 20 44 46 55  Func  ),.    DFU
d4d0: 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63 6f  NCTION(sqlite_co
d4e0: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 2c  mpileoption_get,
d4f0: 20 31 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69 6c   1, 0, 0, compil
d500: 65 6f 70 74 69 6f 6e 67 65 74 46 75 6e 63 20 20  eoptiongetFunc  
d510: 29 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ),.#endif /* SQL
d520: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
d530: 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a  OPTION_DIAGS */.
d540: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 75 6e      FUNCTION2(un
d550: 6c 69 6b 65 6c 79 2c 20 20 20 20 20 20 20 20 20  likely,         
d560: 20 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75   1, 0, 0, noopFu
d570: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
d580: 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20  _UNLIKELY),.    
d590: 46 55 4e 43 54 49 4f 4e 32 28 6c 69 6b 65 6c 69  FUNCTION2(likeli
d5a0: 68 6f 6f 64 2c 20 20 20 20 20 20 20 20 32 2c 20  hood,        2, 
d5b0: 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20  0, 0, noopFunc, 
d5c0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c   SQLITE_FUNC_UNL
d5d0: 49 4b 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e 43  IKELY),.    FUNC
d5e0: 54 49 4f 4e 32 28 6c 69 6b 65 6c 79 2c 20 20 20  TION2(likely,   
d5f0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
d600: 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c  , noopFunc,  SQL
d610: 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
d620: 59 29 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Y),.#ifdef SQLIT
d630: 45 5f 44 45 42 55 47 0a 20 20 20 20 46 55 4e 43  E_DEBUG.    FUNC
d640: 54 49 4f 4e 32 28 61 66 66 69 6e 69 74 79 2c 20  TION2(affinity, 
d650: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
d660: 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c  , noopFunc,  SQL
d670: 49 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54  ITE_FUNC_AFFINIT
d680: 59 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 46  Y),.#endif.    F
d690: 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20  UNCTION(ltrim,  
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 31              1, 1
d6b0: 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20  , 0, trimFunc   
d6c0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
d6d0: 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20  CTION(ltrim,    
d6e0: 20 20 20 20 20 20 20 20 20 20 32 2c 20 31 2c 20            2, 1, 
d6f0: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
d700: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
d710: 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20  ION(rtrim,      
d720: 20 20 20 20 20 20 20 20 31 2c 20 32 2c 20 30 2c          1, 2, 0,
d730: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
d740: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
d750: 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20  N(rtrim,        
d760: 20 20 20 20 20 20 32 2c 20 32 2c 20 30 2c 20 74        2, 2, 0, t
d770: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
d780: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
d790: 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20  trim,           
d7a0: 20 20 20 20 31 2c 20 33 2c 20 30 2c 20 74 72 69      1, 3, 0, tri
d7b0: 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c  mFunc         ),
d7c0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72  .    FUNCTION(tr
d7d0: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
d7e0: 20 20 32 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46    2, 3, 0, trimF
d7f0: 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20  unc         ),. 
d800: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c     FUNCTION(min,
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
d820: 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 46  1, 0, 1, minmaxF
d830: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
d840: 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20   FUNCTION(min,  
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
d860: 20 30 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20   0, 1, 0        
d870: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41          ),.    A
d880: 47 47 52 45 47 41 54 45 32 28 6d 69 6e 2c 20 20  GGREGATE2(min,  
d890: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
d8a0: 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c  , 1, minmaxStep,
d8b0: 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61        minMaxFina
d8c0: 6c 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  lize,.          
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
d900: 41 58 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  AX ),.    FUNCTI
d910: 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20  ON(max,         
d920: 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 31 2c 20        -1, 1, 1, 
d930: 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20  minmaxFunc      
d940: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
d950: 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20 20  (max,           
d960: 20 20 20 20 20 30 2c 20 31 2c 20 31 2c 20 30 20       0, 1, 1, 0 
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
d980: 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 32  ,.    AGGREGATE2
d990: 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20 20  (max,           
d9a0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 6d 69 6e 6d     1, 1, 1, minm
d9b0: 61 78 53 74 65 70 2c 20 20 20 20 20 20 6d 69 6e  axStep,      min
d9c0: 4d 61 78 46 69 6e 61 6c 69 7a 65 2c 0a 20 20 20  MaxFinalize,.   
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55         SQLITE_FU
da00: 4e 43 5f 4d 49 4e 4d 41 58 20 29 2c 0a 20 20 20  NC_MINMAX ),.   
da10: 20 46 55 4e 43 54 49 4f 4e 32 28 74 79 70 65 6f   FUNCTION2(typeo
da20: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  f,            1,
da30: 20 30 2c 20 30 2c 20 74 79 70 65 6f 66 46 75 6e   0, 0, typeofFun
da40: 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  c,  SQLITE_FUNC_
da50: 54 59 50 45 4f 46 29 2c 0a 20 20 20 20 46 55 4e  TYPEOF),.    FUN
da60: 43 54 49 4f 4e 32 28 6c 65 6e 67 74 68 2c 20 20  CTION2(length,  
da70: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
da80: 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63 2c 20 20  0, lengthFunc,  
da90: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
daa0: 54 48 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f  TH),.    FUNCTIO
dab0: 4e 28 69 6e 73 74 72 2c 20 20 20 20 20 20 20 20  N(instr,        
dac0: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 69        2, 0, 0, i
dad0: 6e 73 74 72 46 75 6e 63 20 20 20 20 20 20 20 20  nstrFunc        
dae0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
daf0: 70 72 69 6e 74 66 2c 20 20 20 20 20 20 20 20 20  printf,         
db00: 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 70 72 69     -1, 0, 0, pri
db10: 6e 74 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c  ntfFunc       ),
db20: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 6e  .    FUNCTION(un
db30: 69 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  icode,          
db40: 20 20 31 2c 20 30 2c 20 30 2c 20 75 6e 69 63 6f    1, 0, 0, unico
db50: 64 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20  deFunc      ),. 
db60: 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 68 61 72     FUNCTION(char
db70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  ,              -
db80: 31 2c 20 30 2c 20 30 2c 20 63 68 61 72 46 75 6e  1, 0, 0, charFun
db90: 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  c         ),.   
dba0: 20 46 55 4e 43 54 49 4f 4e 28 61 62 73 2c 20 20   FUNCTION(abs,  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
dbc0: 20 30 2c 20 30 2c 20 61 62 73 46 75 6e 63 20 20   0, 0, absFunc  
dbd0: 20 20 20 20 20 20 20 20 29 2c 0a 23 69 66 6e 64          ),.#ifnd
dbe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
dbf0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
dc00: 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64    FUNCTION(round
dc10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
dc20: 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e  , 0, 0, roundFun
dc30: 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  c        ),.    
dc40: 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20  FUNCTION(round, 
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
dc60: 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20  0, 0, roundFunc 
dc70: 20 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66         ),.#endif
dc80: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 70  .    FUNCTION(up
dc90: 70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  per,            
dca0: 20 20 31 2c 20 30 2c 20 30 2c 20 75 70 70 65 72    1, 0, 0, upper
dcb0: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
dcc0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77 65     FUNCTION(lowe
dcd0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
dce0: 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46 75  1, 0, 0, lowerFu
dcf0: 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  nc        ),.   
dd00: 20 46 55 4e 43 54 49 4f 4e 28 68 65 78 2c 20 20   FUNCTION(hex,  
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
dd20: 20 30 2c 20 30 2c 20 68 65 78 46 75 6e 63 20 20   0, 0, hexFunc  
dd30: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
dd40: 55 4e 43 54 49 4f 4e 32 28 69 66 6e 75 6c 6c 2c  UNCTION2(ifnull,
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
dd60: 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20  , 0, noopFunc,  
dd70: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
dd80: 45 53 43 45 29 2c 0a 20 20 20 20 56 46 55 4e 43  ESCE),.    VFUNC
dd90: 54 49 4f 4e 28 72 61 6e 64 6f 6d 2c 20 20 20 20  TION(random,    
dda0: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
ddb0: 20 72 61 6e 64 6f 6d 46 75 6e 63 20 20 20 20 20   randomFunc     
ddc0: 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49    ),.    VFUNCTI
ddd0: 4f 4e 28 72 61 6e 64 6f 6d 62 6c 6f 62 2c 20 20  ON(randomblob,  
dde0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 72        1, 0, 0, r
ddf0: 61 6e 64 6f 6d 42 6c 6f 62 20 20 20 20 20 20 20  andomBlob       
de00: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
de10: 6e 75 6c 6c 69 66 2c 20 20 20 20 20 20 20 20 20  nullif,         
de20: 20 20 20 20 32 2c 20 30 2c 20 31 2c 20 6e 75 6c      2, 0, 1, nul
de30: 6c 69 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c  lifFunc       ),
de40: 0a 20 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 73  .    DFUNCTION(s
de50: 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 2c 20 20  qlite_version,  
de60: 20 20 30 2c 20 30 2c 20 30 2c 20 76 65 72 73 69    0, 0, 0, versi
de70: 6f 6e 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20  onFunc      ),. 
de80: 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c     DFUNCTION(sql
de90: 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 2c 20 20  ite_source_id,  
dea0: 30 2c 20 30 2c 20 30 2c 20 73 6f 75 72 63 65 69  0, 0, 0, sourcei
deb0: 64 46 75 6e 63 20 20 20 20 20 29 2c 0a 20 20 20  dFunc     ),.   
dec0: 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65   FUNCTION(sqlite
ded0: 5f 6c 6f 67 2c 20 20 20 20 20 20 20 20 20 32 2c  _log,         2,
dee0: 20 30 2c 20 30 2c 20 65 72 72 6c 6f 67 46 75 6e   0, 0, errlogFun
def0: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
df00: 55 4e 43 54 49 4f 4e 28 71 75 6f 74 65 2c 20 20  UNCTION(quote,  
df10: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
df20: 2c 20 30 2c 20 71 75 6f 74 65 46 75 6e 63 20 20  , 0, quoteFunc  
df30: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55        ),.    VFU
df40: 4e 43 54 49 4f 4e 28 6c 61 73 74 5f 69 6e 73 65  NCTION(last_inse
df50: 72 74 5f 72 6f 77 69 64 2c 20 30 2c 20 30 2c 20  rt_rowid, 0, 0, 
df60: 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  0, last_insert_r
df70: 6f 77 69 64 29 2c 0a 20 20 20 20 56 46 55 4e 43  owid),.    VFUNC
df80: 54 49 4f 4e 28 63 68 61 6e 67 65 73 2c 20 20 20  TION(changes,   
df90: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
dfa0: 20 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 20   changes        
dfb0: 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49    ),.    VFUNCTI
dfc0: 4f 4e 28 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  ON(total_changes
dfd0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 74  ,     0, 0, 0, t
dfe0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20 20 20 20  otal_changes    
dff0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
e000: 72 65 70 6c 61 63 65 2c 20 20 20 20 20 20 20 20  replace,        
e010: 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 72 65 70      3, 0, 0, rep
e020: 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20 29 2c  laceFunc      ),
e030: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 7a 65  .    FUNCTION(ze
e040: 72 6f 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 20  roblob,         
e050: 20 20 31 2c 20 30 2c 20 30 2c 20 7a 65 72 6f 62    1, 0, 0, zerob
e060: 6c 6f 62 46 75 6e 63 20 20 20 20 20 29 2c 0a 20  lobFunc     ),. 
e070: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62 73     FUNCTION(subs
e080: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
e090: 32 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72 46  2, 0, 0, substrF
e0a0: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
e0b0: 20 46 55 4e 43 54 49 4f 4e 28 73 75 62 73 74 72   FUNCTION(substr
e0c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 33 2c  ,             3,
e0d0: 20 30 2c 20 30 2c 20 73 75 62 73 74 72 46 75 6e   0, 0, substrFun
e0e0: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41  c       ),.    A
e0f0: 47 47 52 45 47 41 54 45 28 73 75 6d 2c 20 20 20  GGREGATE(sum,   
e100: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
e110: 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20  , 0, sumStep,   
e120: 20 20 20 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a        sumFinaliz
e130: 65 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52  e    ),.    AGGR
e140: 45 47 41 54 45 28 74 6f 74 61 6c 2c 20 20 20 20  EGATE(total,    
e150: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
e160: 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20  , sumStep,      
e170: 20 20 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65     totalFinalize
e180: 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45      ),.    AGGRE
e190: 47 41 54 45 28 61 76 67 2c 20 20 20 20 20 20 20  GATE(avg,       
e1a0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
e1b0: 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20   sumStep,       
e1c0: 20 20 61 76 67 46 69 6e 61 6c 69 7a 65 20 20 20    avgFinalize   
e1d0: 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54   ),.    AGGREGAT
e1e0: 45 32 28 63 6f 75 6e 74 2c 20 20 20 20 20 20 20  E2(count,       
e1f0: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f       0, 0, 0, co
e200: 75 6e 74 53 74 65 70 2c 20 20 20 20 20 20 20 63  untStep,       c
e210: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 0a 20 20  ountFinalize,.  
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
e230: 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 20 20  ITE_FUNC_COUNT  
e240: 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45  ),.    AGGREGATE
e250: 28 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  (count,         
e260: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 63 6f 75      1, 0, 0, cou
e270: 6e 74 53 74 65 70 2c 20 20 20 20 20 20 20 63 6f  ntStep,       co
e280: 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20 29 2c 0a  untFinalize  ),.
e290: 20 20 20 20 41 47 47 52 45 47 41 54 45 28 67 72      AGGREGATE(gr
e2a0: 6f 75 70 5f 63 6f 6e 63 61 74 2c 20 20 20 20 20  oup_concat,     
e2b0: 20 31 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43   1, 0, 0, groupC
e2c0: 6f 6e 63 61 74 53 74 65 70 2c 20 67 72 6f 75 70  oncatStep, group
e2d0: 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 29 2c  ConcatFinalize),
e2e0: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 67  .    AGGREGATE(g
e2f0: 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20 20 20 20  roup_concat,    
e300: 20 20 32 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70    2, 0, 0, group
e310: 43 6f 6e 63 61 74 53 74 65 70 2c 20 67 72 6f 75  ConcatStep, grou
e320: 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 29  pConcatFinalize)
e330: 2c 0a 20 20 0a 20 20 20 20 4c 49 4b 45 46 55 4e  ,.  .    LIKEFUN
e340: 43 28 67 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f 62  C(glob, 2, &glob
e350: 49 6e 66 6f 2c 20 53 51 4c 49 54 45 5f 46 55 4e  Info, SQLITE_FUN
e360: 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55  C_LIKE|SQLITE_FU
e370: 4e 43 5f 43 41 53 45 29 2c 0a 23 69 66 64 65 66  NC_CASE),.#ifdef
e380: 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e   SQLITE_CASE_SEN
e390: 53 49 54 49 56 45 5f 4c 49 4b 45 0a 20 20 20 20  SITIVE_LIKE.    
e3a0: 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32  LIKEFUNC(like, 2
e3b0: 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20  , &likeInfoAlt, 
e3c0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
e3d0: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53  |SQLITE_FUNC_CAS
e3e0: 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43  E),.    LIKEFUNC
e3f0: 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49  (like, 3, &likeI
e400: 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46  nfoAlt, SQLITE_F
e410: 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f  UNC_LIKE|SQLITE_
e420: 46 55 4e 43 5f 43 41 53 45 29 2c 0a 23 65 6c 73  FUNC_CASE),.#els
e430: 65 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c  e.    LIKEFUNC(l
e440: 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66  ike, 2, &likeInf
e450: 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55  oNorm, SQLITE_FU
e460: 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c 49  NC_LIKE),.    LI
e470: 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20  KEFUNC(like, 3, 
e480: 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53  &likeInfoNorm, S
e490: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29  QLITE_FUNC_LIKE)
e4a0: 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ,.#endif.#ifdef 
e4b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
e4c0: 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49  KNOWN_SQL_FUNCTI
e4d0: 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ON.    FUNCTION(
e4e0: 75 6e 6b 6e 6f 77 6e 2c 20 20 20 20 20 20 20 20  unknown,        
e4f0: 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 75 6e 6b     -1, 0, 0, unk
e500: 6e 6f 77 6e 46 75 6e 63 20 20 20 20 20 20 29 2c  nownFunc      ),
e510: 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 55 4e 43  .#endif.    FUNC
e520: 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20  TION(coalesce,  
e530: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
e540: 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  , 0             
e550: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
e560: 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20  ON(coalesce,    
e570: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
e580: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e590: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
e5a0: 32 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20  2(coalesce,     
e5b0: 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 6e 6f      -1, 0, 0, no
e5c0: 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  opFunc,  SQLITE_
e5d0: 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a  FUNC_COALESCE),.
e5e0: 20 20 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c    };.#ifndef SQL
e5f0: 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
e600: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c 74  BLE.  sqlite3Alt
e610: 65 72 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23  erFunctions();.#
e620: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
e630: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
e640: 53 54 41 54 33 29 20 7c 7c 20 64 65 66 69 6e 65  STAT3) || define
e650: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
e660: 53 54 41 54 34 29 0a 20 20 73 71 6c 69 74 65 33  STAT4).  sqlite3
e670: 41 6e 61 6c 79 7a 65 46 75 6e 63 74 69 6f 6e 73  AnalyzeFunctions
e680: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  ();.#endif.  sql
e690: 69 74 65 33 52 65 67 69 73 74 65 72 44 61 74 65  ite3RegisterDate
e6a0: 54 69 6d 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b  TimeFunctions();
e6b0: 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74  .  sqlite3Insert
e6c0: 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61 42 75  BuiltinFuncs(aBu
e6d0: 69 6c 74 69 6e 46 75 6e 63 2c 20 41 72 72 61 79  iltinFunc, Array
e6e0: 53 69 7a 65 28 61 42 75 69 6c 74 69 6e 46 75 6e  Size(aBuiltinFun
e6f0: 63 29 29 3b 0a 0a 23 69 66 20 30 20 20 2f 2a 20  c));..#if 0  /* 
e700: 45 6e 61 62 6c 65 20 74 6f 20 70 72 69 6e 74 20  Enable to print 
e710: 6f 75 74 20 68 6f 77 20 74 68 65 20 62 75 69 6c  out how the buil
e720: 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 61  t-in functions a
e730: 72 65 20 68 61 73 68 65 64 20 2a 2f 0a 20 20 7b  re hashed */.  {
e740: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
e750: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 20 20  FuncDef *p;.    
e760: 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54  for(i=0; i<SQLIT
e770: 45 5f 46 55 4e 43 5f 48 41 53 48 5f 53 5a 3b 20  E_FUNC_HASH_SZ; 
e780: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  i++){.      prin
e790: 74 66 28 22 46 55 4e 43 2d 48 41 53 48 20 25 30  tf("FUNC-HASH %0
e7a0: 32 64 3a 22 2c 20 69 29 3b 0a 20 20 20 20 20 20  2d:", i);.      
e7b0: 66 6f 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69  for(p=sqlite3Bui
e7c0: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b  ltinFunctions.a[
e7d0: 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48  i]; p; p=p->u.pH
e7e0: 61 73 68 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ash){.        in
e7f0: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
e800: 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 3b  len30(p->zName);
e810: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 68 20 3d  .        int h =
e820: 20 70 2d 3e 7a 4e 61 6d 65 5b 30 5d 20 2b 20 6e   p->zName[0] + n
e830: 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  ;.        printf
e840: 28 22 20 25 73 28 25 64 29 22 2c 20 70 2d 3e 7a  (" %s(%d)", p->z
e850: 4e 61 6d 65 2c 20 68 29 3b 0a 20 20 20 20 20 20  Name, h);.      
e860: 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  }.      printf("
e870: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
e880: 23 65 6e 64 69 66 0a 7d 0a                       #endif.}.