/ Hex Artifact Content
Login

Artifact 43916c1d8e6da5d107d91d2b212577d4f69a876a:


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: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
0820: 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
0830: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
0840: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
0850: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
0860: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
0870: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
0880: 3a 20 7a 20 3d 20 22 69 6e 74 65 67 65 72 22 3b  : z = "integer";
0890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
08a0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 20 20   SQLITE_TEXT:   
08b0: 20 7a 20 3d 20 22 74 65 78 74 22 3b 20 20 20 20   z = "text";    
08c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
08d0: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 20 20  SQLITE_FLOAT:   
08e0: 7a 20 3d 20 22 72 65 61 6c 22 3b 20 20 20 20 62  z = "real";    b
08f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0900: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 20 20 20 7a  QLITE_BLOB:    z
0910: 20 3d 20 22 62 6c 6f 62 22 3b 20 20 20 20 62 72   = "blob";    br
0920: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
0930: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  :             z 
0940: 3d 20 22 6e 75 6c 6c 22 3b 20 20 20 20 62 72 65  = "null";    bre
0950: 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ak;.  }.  sqlite
0960: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
0970: 6e 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 53 51  ntext, z, -1, SQ
0980: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a  LITE_STATIC);.}.
0990: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
09a0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 65  tation of the le
09b0: 6e 67 74 68 28 29 20 66 75 6e 63 74 69 6f 6e 0a  ngth() function.
09c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
09d0: 65 6e 67 74 68 46 75 6e 63 28 0a 20 20 73 71 6c  engthFunc(.  sql
09e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
09f0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
0a00: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
0a10: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
0a20: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72  nt len;..  asser
0a30: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
0a40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
0a50: 28 61 72 67 63 29 3b 0a 20 20 73 77 69 74 63 68  (argc);.  switch
0a60: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
0a70: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
0a80: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0a90: 5f 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20  _BLOB:.    case 
0aa0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a  SQLITE_INTEGER:.
0ab0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0ac0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  FLOAT: {.      s
0ad0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
0ae0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
0af0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
0b00: 72 67 76 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[0]));.      
0b10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0b20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
0b30: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
0b40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0b50: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
0b60: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
0b70: 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  .      if( z==0 
0b80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
0b90: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  len = 0;.      w
0ba0: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
0bb0: 20 20 20 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 20      len++;.     
0bc0: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
0bd0: 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  TF8(z);.      }.
0be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0bf0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
0c00: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  , len);.      br
0c10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
0c20: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
0c30: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
0c40: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
0c50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0c60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
0c70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0c80: 74 68 65 20 61 62 73 28 29 20 66 75 6e 63 74 69  the abs() functi
0c90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52  on..**.** IMP: R
0ca0: 2d 32 33 39 37 39 2d 32 36 38 35 35 20 54 68 65  -23979-26855 The
0cb0: 20 61 62 73 28 58 29 20 66 75 6e 63 74 69 6f 6e   abs(X) function
0cc0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 61 62 73   returns the abs
0cd0: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 0a 2a  olute value of.*
0ce0: 2a 20 74 68 65 20 6e 75 6d 65 72 69 63 20 61 72  * the numeric ar
0cf0: 67 75 6d 65 6e 74 20 58 2e 20 0a 2a 2f 0a 73 74  gument X. .*/.st
0d00: 61 74 69 63 20 76 6f 69 64 20 61 62 73 46 75 6e  atic void absFun
0d10: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
0d20: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
0d30: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
0d40: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 61  lue **argv){.  a
0d50: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
0d60: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
0d70: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 73 77  ETER(argc);.  sw
0d80: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
0d90: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0da0: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
0db0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
0dc0: 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d        i64 iVal =
0dd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
0de0: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
0df0: 20 20 20 20 20 69 66 28 20 69 56 61 6c 3c 30 20       if( iVal<0 
0e00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
0e10: 56 61 6c 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  Val==SMALLEST_IN
0e20: 54 36 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  T64 ){.         
0e30: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 31 36 37 36   /* IMP: R-31676
0e40: 2d 34 35 35 30 39 20 49 66 20 58 20 69 73 20 74  -45509 If X is t
0e50: 68 65 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33  he integer -9223
0e60: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 0a  372036854775808.
0e70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
0e80: 6e 20 61 62 73 28 58 29 20 74 68 72 6f 77 73 20  n abs(X) throws 
0e90: 61 6e 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  an integer overf
0ea0: 6c 6f 77 20 65 72 72 6f 72 20 73 69 6e 63 65 20  low error since 
0eb0: 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20 20  there is no.    
0ec0: 20 20 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c        ** equival
0ed0: 65 6e 74 20 70 6f 73 69 74 69 76 65 20 36 34 2d  ent positive 64-
0ee0: 62 69 74 20 74 77 6f 20 63 6f 6d 70 6c 65 6d 65  bit two compleme
0ef0: 6e 74 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  nt value. */.   
0f00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
0f10: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
0f20: 65 78 74 2c 20 22 69 6e 74 65 67 65 72 20 6f 76  ext, "integer ov
0f30: 65 72 66 6c 6f 77 22 2c 20 2d 31 29 3b 0a 20 20  erflow", -1);.  
0f40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
0f50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0f60: 20 20 69 56 61 6c 20 3d 20 2d 69 56 61 6c 3b 0a    iVal = -iVal;.
0f70: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 73        } .      s
0f80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
0f90: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 69 56 61  t64(context, iVa
0fa0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
0fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
0fc0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
0fd0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
0fe0: 37 34 33 34 2d 31 39 39 32 39 20 41 62 73 28 58  7434-19929 Abs(X
0ff0: 29 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  ) returns NULL i
1000: 66 20 58 20 69 73 20 4e 55 4c 4c 2e 20 2a 2f 0a  f X is NULL. */.
1010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
1020: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
1030: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1040: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1050: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 42  lt: {.      /* B
1060: 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 76  ecause sqlite3_v
1070: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 29 20 72 65  alue_double() re
1080: 74 75 72 6e 73 20 30 2e 30 20 69 66 20 74 68 65  turns 0.0 if the
1090: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
10a0: 0a 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68  .      ** someth
10b0: 69 6e 67 20 74 68 61 74 20 63 61 6e 20 62 65 20  ing that can be 
10c0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
10d0: 20 6e 75 6d 62 65 72 2c 20 77 65 20 68 61 76 65   number, we have
10e0: 3a 0a 20 20 20 20 20 20 2a 2a 20 49 4d 50 3a 20  :.      ** IMP: 
10f0: 52 2d 30 31 39 39 32 2d 30 30 35 31 39 20 41 62  R-01992-00519 Ab
1100: 73 28 58 29 20 72 65 74 75 72 6e 73 20 30 2e 30  s(X) returns 0.0
1110: 20 69 66 20 58 20 69 73 20 61 20 73 74 72 69 6e   if X is a strin
1120: 67 20 6f 72 20 62 6c 6f 62 0a 20 20 20 20 20 20  g or blob.      
1130: 2a 2a 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ** that cannot b
1140: 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  e converted to a
1150: 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 2e 0a   numeric value..
1160: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
1170: 6f 75 62 6c 65 20 72 56 61 6c 20 3d 20 73 71 6c  ouble rVal = sql
1180: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
1190: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  e(argv[0]);.    
11a0: 20 20 69 66 28 20 72 56 61 6c 3c 30 20 29 20 72    if( rVal<0 ) r
11b0: 56 61 6c 20 3d 20 2d 72 56 61 6c 3b 0a 20 20 20  Val = -rVal;.   
11c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
11d0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
11e0: 2c 20 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 62  , rVal);.      b
11f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1200: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1210: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  ntation of the i
1220: 6e 73 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e  nstr() function.
1230: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 72 28 68 61 79  .**.** instr(hay
1240: 73 74 61 63 6b 2c 6e 65 65 64 6c 65 29 20 66 69  stack,needle) fi
1250: 6e 64 73 20 74 68 65 20 66 69 72 73 74 20 6f 63  nds the first oc
1260: 63 75 72 72 65 6e 63 65 20 6f 66 20 6e 65 65 64  currence of need
1270: 6c 65 0a 2a 2a 20 69 6e 20 68 61 79 73 74 61 63  le.** in haystac
1280: 6b 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  k and returns th
1290: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65 76  e number of prev
12a0: 69 6f 75 73 20 63 68 61 72 61 63 74 65 72 73 20  ious characters 
12b0: 70 6c 75 73 20 31 2c 0a 2a 2a 20 6f 72 20 30 20  plus 1,.** or 0 
12c0: 69 66 20 6e 65 65 64 6c 65 20 64 6f 65 73 20 6e  if needle does n
12d0: 6f 74 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20  ot occur within 
12e0: 68 61 79 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  haystack..**.** 
12f0: 49 66 20 62 6f 74 68 20 68 61 79 73 74 61 63 6b  If both haystack
1300: 20 61 6e 64 20 6e 65 65 64 6c 65 20 61 72 65 20   and needle are 
1310: 42 4c 4f 42 73 2c 20 74 68 65 6e 20 74 68 65 20  BLOBs, then the 
1320: 72 65 73 75 6c 74 20 69 73 20 6f 6e 65 20 6d 6f  result is one mo
1330: 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6e  re than.** the n
1340: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1350: 6e 20 68 61 79 73 74 61 63 6b 20 70 72 69 6f 72  n haystack prior
1360: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f 63   to the first oc
1370: 63 75 72 72 65 6e 63 65 20 6f 66 20 6e 65 65 64  currence of need
1380: 6c 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 6e  le,.** or 0 if n
1390: 65 65 64 6c 65 20 6e 65 76 65 72 20 6f 63 63 75  eedle never occu
13a0: 72 73 20 69 6e 20 68 61 79 73 74 61 63 6b 2e 0a  rs in haystack..
13b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
13c0: 6e 73 74 72 46 75 6e 63 28 0a 20 20 73 71 6c 69  nstrFunc(.  sqli
13d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
13e0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
13f0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1400: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
1410: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1420: 72 20 2a 7a 48 61 79 73 74 61 63 6b 3b 0a 20 20  r *zHaystack;.  
1430: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1440: 68 61 72 20 2a 7a 4e 65 65 64 6c 65 3b 0a 20 20  har *zNeedle;.  
1450: 69 6e 74 20 6e 48 61 79 73 74 61 63 6b 3b 0a 20  int nHaystack;. 
1460: 20 69 6e 74 20 6e 4e 65 65 64 6c 65 3b 0a 20 20   int nNeedle;.  
1470: 69 6e 74 20 74 79 70 65 48 61 79 73 74 61 63 6b  int typeHaystack
1480: 2c 20 74 79 70 65 4e 65 65 64 6c 65 3b 0a 20 20  , typeNeedle;.  
1490: 69 6e 74 20 4e 20 3d 20 31 3b 0a 20 20 69 6e 74  int N = 1;.  int
14a0: 20 69 73 54 65 78 74 3b 0a 0a 20 20 55 4e 55 53   isText;..  UNUS
14b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
14c0: 63 29 3b 0a 20 20 74 79 70 65 48 61 79 73 74 61  c);.  typeHaysta
14d0: 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ck = sqlite3_val
14e0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
14f0: 3b 0a 20 20 74 79 70 65 4e 65 65 64 6c 65 20 3d  ;.  typeNeedle =
1500: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1510: 79 70 65 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ype(argv[1]);.  
1520: 69 66 28 20 74 79 70 65 48 61 79 73 74 61 63 6b  if( typeHaystack
1530: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c 7c  ==SQLITE_NULL ||
1540: 20 74 79 70 65 4e 65 65 64 6c 65 3d 3d 53 51 4c   typeNeedle==SQL
1550: 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72  ITE_NULL ) retur
1560: 6e 3b 0a 20 20 6e 48 61 79 73 74 61 63 6b 20 3d  n;.  nHaystack =
1570: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
1580: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
1590: 20 6e 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69 74   nNeedle = sqlit
15a0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
15b0: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 74  rgv[1]);.  if( t
15c0: 79 70 65 48 61 79 73 74 61 63 6b 3d 3d 53 51 4c  ypeHaystack==SQL
15d0: 49 54 45 5f 42 4c 4f 42 20 26 26 20 74 79 70 65  ITE_BLOB && type
15e0: 4e 65 65 64 6c 65 3d 3d 53 51 4c 49 54 45 5f 42  Needle==SQLITE_B
15f0: 4c 4f 42 20 29 7b 0a 20 20 20 20 7a 48 61 79 73  LOB ){.    zHays
1600: 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76  tack = sqlite3_v
1610: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
1620: 5d 29 3b 0a 20 20 20 20 7a 4e 65 65 64 6c 65 20  ]);.    zNeedle 
1630: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1640: 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b 0a 20  blob(argv[1]);. 
1650: 20 20 20 69 73 54 65 78 74 20 3d 20 30 3b 0a 20     isText = 0;. 
1660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 48 61 79   }else{.    zHay
1670: 73 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  stack = sqlite3_
1680: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1690: 30 5d 29 3b 0a 20 20 20 20 7a 4e 65 65 64 6c 65  0]);.    zNeedle
16a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
16b0: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
16c0: 20 20 20 20 69 73 54 65 78 74 20 3d 20 31 3b 0a      isText = 1;.
16d0: 20 20 20 20 69 66 28 20 7a 4e 65 65 64 6c 65 3d      if( zNeedle=
16e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
16f0: 20 61 73 73 65 72 74 28 20 7a 48 61 79 73 74 61   assert( zHaysta
1700: 63 6b 20 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  ck );.  }.  whil
1710: 65 28 20 6e 4e 65 65 64 6c 65 3c 3d 6e 48 61 79  e( nNeedle<=nHay
1720: 73 74 61 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28  stack && memcmp(
1730: 7a 48 61 79 73 74 61 63 6b 2c 20 7a 4e 65 65 64  zHaystack, zNeed
1740: 6c 65 2c 20 6e 4e 65 65 64 6c 65 29 21 3d 30 20  le, nNeedle)!=0 
1750: 29 7b 0a 20 20 20 20 4e 2b 2b 3b 0a 20 20 20 20  ){.    N++;.    
1760: 64 6f 7b 0a 20 20 20 20 20 20 6e 48 61 79 73 74  do{.      nHayst
1770: 61 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 7a 48 61  ack--;.      zHa
1780: 79 73 74 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d 77  ystack++;.    }w
1790: 68 69 6c 65 28 20 69 73 54 65 78 74 20 26 26 20  hile( isText && 
17a0: 28 7a 48 61 79 73 74 61 63 6b 5b 30 5d 26 30 78  (zHaystack[0]&0x
17b0: 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20 20 7d  c0)==0x80 );.  }
17c0: 0a 20 20 69 66 28 20 6e 4e 65 65 64 6c 65 3e 6e  .  if( nNeedle>n
17d0: 48 61 79 73 74 61 63 6b 20 29 20 4e 20 3d 20 30  Haystack ) N = 0
17e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
17f0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
1800: 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  N);.}../*.** Imp
1810: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1820: 68 65 20 70 72 69 6e 74 66 28 29 20 66 75 6e 63  he printf() func
1830: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1840: 76 6f 69 64 20 70 72 69 6e 74 66 46 75 6e 63 28  void printfFunc(
1850: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1860: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
1870: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
1880: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1890: 29 7b 0a 20 20 50 72 69 6e 74 66 41 72 67 75 6d  ){.  PrintfArgum
18a0: 65 6e 74 73 20 78 3b 0a 20 20 53 74 72 41 63 63  ents x;.  StrAcc
18b0: 75 6d 20 73 74 72 3b 0a 20 20 63 6f 6e 73 74 20  um str;.  const 
18c0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 3b 0a 20  char *zFormat;. 
18d0: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
18e0: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
18f0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
1900: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 69  e(context);..  i
1910: 66 28 20 61 72 67 63 3e 3d 31 20 26 26 20 28 7a  f( argc>=1 && (z
1920: 46 6f 72 6d 61 74 20 3d 20 28 63 6f 6e 73 74 20  Format = (const 
1930: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
1940: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
1950: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 78 2e 6e  ))!=0 ){.    x.n
1960: 41 72 67 20 3d 20 61 72 67 63 2d 31 3b 0a 20 20  Arg = argc-1;.  
1970: 20 20 78 2e 6e 55 73 65 64 20 3d 20 30 3b 0a 20    x.nUsed = 0;. 
1980: 20 20 20 78 2e 61 70 41 72 67 20 3d 20 61 72 67     x.apArg = arg
1990: 76 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v+1;.    sqlite3
19a0: 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 74  StrAccumInit(&st
19b0: 72 2c 20 64 62 2c 20 30 2c 20 30 2c 20 64 62 2d  r, db, 0, 0, db-
19c0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
19d0: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20  IMIT_LENGTH]);. 
19e0: 20 20 20 73 74 72 2e 70 72 69 6e 74 66 46 6c 61     str.printfFla
19f0: 67 73 20 3d 20 53 51 4c 49 54 45 5f 50 52 49 4e  gs = SQLITE_PRIN
1a00: 54 46 5f 53 51 4c 46 55 4e 43 3b 0a 20 20 20 20  TF_SQLFUNC;.    
1a10: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
1a20: 73 74 72 2c 20 7a 46 6f 72 6d 61 74 2c 20 26 78  str, zFormat, &x
1a30: 29 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 2e 6e  );.    n = str.n
1a40: 43 68 61 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  Char;.    sqlite
1a50: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
1a60: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53 74  ntext, sqlite3St
1a70: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73 74  rAccumFinish(&st
1a80: 72 29 2c 20 6e 2c 0a 20 20 20 20 20 20 20 20 20  r), n,.         
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1aa0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
1ab0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70    }.}../*.** Imp
1ac0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1ad0: 68 65 20 73 75 62 73 74 72 28 29 20 66 75 6e 63  he substr() func
1ae0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 73  tion..**.** subs
1af0: 74 72 28 78 2c 70 31 2c 70 32 29 20 20 72 65 74  tr(x,p1,p2)  ret
1b00: 75 72 6e 73 20 70 32 20 63 68 61 72 61 63 74 65  urns p2 characte
1b10: 72 73 20 6f 66 20 78 5b 5d 20 62 65 67 69 6e 6e  rs of x[] beginn
1b20: 69 6e 67 20 77 69 74 68 20 70 31 2e 0a 2a 2a 20  ing with p1..** 
1b30: 70 31 20 69 73 20 31 2d 69 6e 64 65 78 65 64 2e  p1 is 1-indexed.
1b40: 20 20 53 6f 20 73 75 62 73 74 72 28 78 2c 31 2c    So substr(x,1,
1b50: 31 29 20 72 65 74 75 72 6e 73 20 74 68 65 20 66  1) returns the f
1b60: 69 72 73 74 20 63 68 61 72 61 63 74 65 72 0a 2a  irst character.*
1b70: 2a 20 6f 66 20 78 2e 20 20 49 66 20 78 20 69 73  * of x.  If x is
1b80: 20 74 65 78 74 2c 20 74 68 65 6e 20 77 65 20 61   text, then we a
1b90: 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 20 55 54  ctually count UT
1ba0: 46 2d 38 20 63 68 61 72 61 63 74 65 72 73 2e 0a  F-8 characters..
1bb0: 2a 2a 20 49 66 20 78 20 69 73 20 61 20 62 6c 6f  ** If x is a blo
1bc0: 62 2c 20 74 68 65 6e 20 77 65 20 63 6f 75 6e 74  b, then we count
1bd0: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   bytes..**.** If
1be0: 20 70 31 20 69 73 20 6e 65 67 61 74 69 76 65 2c   p1 is negative,
1bf0: 20 74 68 65 6e 20 77 65 20 62 65 67 69 6e 20 61   then we begin a
1c00: 62 73 28 70 31 29 20 66 72 6f 6d 20 74 68 65 20  bs(p1) from the 
1c10: 65 6e 64 20 6f 66 20 78 5b 5d 2e 0a 2a 2a 0a 2a  end of x[]..**.*
1c20: 2a 20 49 66 20 70 32 20 69 73 20 6e 65 67 61 74  * If p2 is negat
1c30: 69 76 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ive, return the 
1c40: 70 32 20 63 68 61 72 61 63 74 65 72 73 20 70 72  p2 characters pr
1c50: 65 63 65 64 69 6e 67 20 70 31 2e 0a 2a 2f 0a 73  eceding p1..*/.s
1c60: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1c70: 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  rFunc(.  sqlite3
1c80: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1c90: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
1ca0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1cb0: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
1cc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1cd0: 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  z;.  const unsig
1ce0: 6e 65 64 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  ned char *z2;.  
1cf0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 70  int len;.  int p
1d00: 30 74 79 70 65 3b 0a 20 20 69 36 34 20 70 31 2c  0type;.  i64 p1,
1d10: 20 70 32 3b 0a 20 20 69 6e 74 20 6e 65 67 50 32   p2;.  int negP2
1d20: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1d30: 20 61 72 67 63 3d 3d 33 20 7c 7c 20 61 72 67 63   argc==3 || argc
1d40: 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==2 );.  if( sql
1d50: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
1d60: 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45  argv[1])==SQLITE
1d70: 5f 4e 55 4c 4c 0a 20 20 20 7c 7c 20 28 61 72 67  _NULL.   || (arg
1d80: 63 3d 3d 33 20 26 26 20 73 71 6c 69 74 65 33 5f  c==3 && sqlite3_
1d90: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
1da0: 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  2])==SQLITE_NULL
1db0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
1dc0: 6e 3b 0a 20 20 7d 0a 20 20 70 30 74 79 70 65 20  n;.  }.  p0type 
1dd0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1de0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  type(argv[0]);. 
1df0: 20 70 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   p1 = sqlite3_va
1e00: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
1e10: 3b 0a 20 20 69 66 28 20 70 30 74 79 70 65 3d 3d  ;.  if( p0type==
1e20: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20  SQLITE_BLOB ){. 
1e30: 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
1e40: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
1e50: 76 5b 30 5d 29 3b 0a 20 20 20 20 7a 20 3d 20 73  v[0]);.    z = s
1e60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
1e70: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
1e80: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1e90: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  n;.    assert( l
1ea0: 65 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  en==sqlite3_valu
1eb0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
1ec0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1ed0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
1ee0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
1ef0: 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
1f00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6c 65 6e   return;.    len
1f10: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 31   = 0;.    if( p1
1f20: 3c 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  <0 ){.      for(
1f30: 7a 32 3d 7a 3b 20 2a 7a 32 3b 20 6c 65 6e 2b 2b  z2=z; *z2; len++
1f40: 29 7b 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  ){.        SQLIT
1f50: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 32 29 3b  E_SKIP_UTF8(z2);
1f60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f70: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1f80: 5f 53 55 42 53 54 52 5f 43 4f 4d 50 41 54 49 42  _SUBSTR_COMPATIB
1f90: 49 4c 49 54 59 0a 20 20 2f 2a 20 49 66 20 53 55  ILITY.  /* If SU
1fa0: 42 53 54 52 5f 43 4f 4d 50 41 54 49 42 49 4c 49  BSTR_COMPATIBILI
1fb0: 54 59 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  TY is defined th
1fc0: 65 6e 20 73 75 62 73 74 72 28 58 2c 30 2c 4e 29  en substr(X,0,N)
1fd0: 20 77 6f 72 6b 20 74 68 65 20 73 61 6d 65 20 61   work the same a
1fe0: 73 0a 20 20 2a 2a 20 61 73 20 73 75 62 73 74 72  s.  ** as substr
1ff0: 28 58 2c 31 2c 4e 29 20 2d 20 69 74 20 72 65 74  (X,1,N) - it ret
2000: 75 72 6e 73 20 74 68 65 20 66 69 72 73 74 20 4e  urns the first N
2010: 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 58   characters of X
2020: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20  .  This.  ** is 
2030: 65 73 73 65 6e 74 69 61 6c 6c 79 20 61 20 62 61  essentially a ba
2040: 63 6b 2d 6f 75 74 20 6f 66 20 74 68 65 20 62 75  ck-out of the bu
2050: 67 2d 66 69 78 20 69 6e 20 63 68 65 63 6b 2d 69  g-fix in check-i
2060: 6e 20 5b 35 66 63 31 32 35 64 33 36 32 64 66 34  n [5fc125d362df4
2070: 62 38 5d 0a 20 20 2a 2a 20 66 72 6f 6d 20 32 30  b8].  ** from 20
2080: 30 39 2d 30 32 2d 30 32 20 66 6f 72 20 63 6f 6d  09-02-02 for com
2090: 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 61 70  patibility of ap
20a0: 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 74 20  plications that 
20b0: 65 78 70 6c 6f 69 74 65 64 20 74 68 65 0a 20 20  exploited the.  
20c0: 2a 2a 20 6f 6c 64 20 62 75 67 67 79 20 62 65 68  ** old buggy beh
20d0: 61 76 69 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20  avior. */.  if( 
20e0: 70 31 3d 3d 30 20 29 20 70 31 20 3d 20 31 3b 20  p1==0 ) p1 = 1; 
20f0: 2f 2a 20 3c 72 64 61 72 3a 2f 2f 70 72 6f 62 6c  /* <rdar://probl
2100: 65 6d 2f 36 37 37 38 33 33 39 3e 20 2a 2f 0a 23  em/6778339> */.#
2110: 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67 63  endif.  if( argc
2120: 3d 3d 33 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==3 ){.    p2 = 
2130: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2140: 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20  t(argv[2]);.    
2150: 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20 20 20  if( p2<0 ){.    
2160: 20 20 70 32 20 3d 20 2d 70 32 3b 0a 20 20 20 20    p2 = -p2;.    
2170: 20 20 6e 65 67 50 32 20 3d 20 31 3b 0a 20 20 20    negP2 = 1;.   
2180: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2190: 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p2 = sqlite3_con
21a0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
21b0: 6f 6e 74 65 78 74 29 2d 3e 61 4c 69 6d 69 74 5b  ontext)->aLimit[
21c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
21d0: 47 54 48 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  GTH];.  }.  if( 
21e0: 70 31 3c 30 20 29 7b 0a 20 20 20 20 70 31 20 2b  p1<0 ){.    p1 +
21f0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28 20 70  = len;.    if( p
2200: 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20  1<0 ){.      p2 
2210: 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 69 66 28  += p1;.      if(
2220: 20 70 32 3c 30 20 29 20 70 32 20 3d 20 30 3b 0a   p2<0 ) p2 = 0;.
2230: 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20 20        p1 = 0;.  
2240: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2250: 70 31 3e 30 20 29 7b 0a 20 20 20 20 70 31 2d 2d  p1>0 ){.    p1--
2260: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32  ;.  }else if( p2
2270: 3e 30 20 29 7b 0a 20 20 20 20 70 32 2d 2d 3b 0a  >0 ){.    p2--;.
2280: 20 20 7d 0a 20 20 69 66 28 20 6e 65 67 50 32 20    }.  if( negP2 
2290: 29 7b 0a 20 20 20 20 70 31 20 2d 3d 20 70 32 3b  ){.    p1 -= p2;
22a0: 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b  .    if( p1<0 ){
22b0: 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b  .      p2 += p1;
22c0: 0a 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20  .      p1 = 0;. 
22d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
22e0: 74 28 20 70 31 3e 3d 30 20 26 26 20 70 32 3e 3d  t( p1>=0 && p2>=
22f0: 30 20 29 3b 0a 20 20 69 66 28 20 70 30 74 79 70  0 );.  if( p0typ
2300: 65 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e!=SQLITE_BLOB )
2310: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  {.    while( *z 
2320: 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 53  && p1 ){.      S
2330: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
2340: 7a 29 3b 0a 20 20 20 20 20 20 70 31 2d 2d 3b 0a  z);.      p1--;.
2350: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 7a 32      }.    for(z2
2360: 3d 7a 3b 20 2a 7a 32 20 26 26 20 70 32 3b 20 70  =z; *z2 && p2; p
2370: 32 2d 2d 29 7b 0a 20 20 20 20 20 20 53 51 4c 49  2--){.      SQLI
2380: 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 32 29  TE_SKIP_UTF8(z2)
2390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23a0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 36  te3_result_text6
23b0: 34 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  4(context, (char
23c0: 2a 29 7a 2c 20 7a 32 2d 7a 2c 20 53 51 4c 49 54  *)z, z2-z, SQLIT
23d0: 45 5f 54 52 41 4e 53 49 45 4e 54 2c 0a 20 20 20  E_TRANSIENT,.   
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54         SQLITE_UT
2400: 46 38 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  F8);.  }else{.  
2410: 20 20 69 66 28 20 70 31 2b 70 32 3e 6c 65 6e 20    if( p1+p2>len 
2420: 29 7b 0a 20 20 20 20 20 20 70 32 20 3d 20 6c 65  ){.      p2 = le
2430: 6e 2d 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n-p1;.      if( 
2440: 70 32 3c 30 20 29 20 70 32 20 3d 20 30 3b 0a 20  p2<0 ) p2 = 0;. 
2450: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2460: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 36 34 28 63  _result_blob64(c
2470: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 26  ontext, (char*)&
2480: 7a 5b 70 31 5d 2c 20 28 75 36 34 29 70 32 2c 20  z[p1], (u64)p2, 
2490: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
24a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
24b0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
24c0: 66 20 74 68 65 20 72 6f 75 6e 64 28 29 20 66 75  f the round() fu
24d0: 6e 63 74 69 6f 6e 0a 2a 2f 0a 23 69 66 6e 64 65  nction.*/.#ifnde
24e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
24f0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 73 74 61  OATING_POINT.sta
2500: 74 69 63 20 76 6f 69 64 20 72 6f 75 6e 64 46 75  tic void roundFu
2510: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
2520: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
2530: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
2540: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
2550: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 75  int n = 0;.  dou
2560: 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ble r;.  char *z
2570: 42 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 61  Buf;.  assert( a
2580: 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d  rgc==1 || argc==
2590: 32 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d  2 );.  if( argc=
25a0: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51  =2 ){.    if( SQ
25b0: 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74  LITE_NULL==sqlit
25c0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
25d0: 67 76 5b 31 5d 29 20 29 20 72 65 74 75 72 6e 3b  gv[1]) ) return;
25e0: 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
25f0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
2600: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 33  1]);.    if( n>3
2610: 30 20 29 20 6e 20 3d 20 33 30 3b 0a 20 20 20 20  0 ) n = 30;.    
2620: 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b  if( n<0 ) n = 0;
2630: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2640: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
2650: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
2660: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
2670: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
2680: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d  e_double(argv[0]
2690: 29 3b 0a 20 20 2f 2a 20 49 66 20 59 3d 3d 30 20  );.  /* If Y==0 
26a0: 61 6e 64 20 58 20 77 69 6c 6c 20 66 69 74 20 69  and X will fit i
26b0: 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 2c 0a  n a 64-bit int,.
26c0: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 65 20    ** handle the 
26d0: 72 6f 75 6e 64 69 6e 67 20 64 69 72 65 63 74 6c  rounding directl
26e0: 79 2c 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  y,.  ** otherwis
26f0: 65 20 75 73 65 20 70 72 69 6e 74 66 2e 0a 20 20  e use printf..  
2700: 2a 2f 0a 20 20 69 66 28 20 6e 3d 3d 30 20 26 26  */.  if( n==0 &&
2710: 20 72 3e 3d 30 20 26 26 20 72 3c 4c 41 52 47 45   r>=0 && r<LARGE
2720: 53 54 5f 49 4e 54 36 34 2d 31 20 29 7b 0a 20 20  ST_INT64-1 ){.  
2730: 20 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28 28    r = (double)((
2740: 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 28 72 2b  sqlite_int64)(r+
2750: 30 2e 35 29 29 3b 0a 20 20 7d 65 6c 73 65 20 69  0.5));.  }else i
2760: 66 28 20 6e 3d 3d 30 20 26 26 20 72 3c 30 20 26  f( n==0 && r<0 &
2770: 26 20 28 2d 72 29 3c 4c 41 52 47 45 53 54 5f 49  & (-r)<LARGEST_I
2780: 4e 54 36 34 2d 31 20 29 7b 0a 20 20 20 20 72 20  NT64-1 ){.    r 
2790: 3d 20 2d 28 64 6f 75 62 6c 65 29 28 28 73 71 6c  = -(double)((sql
27a0: 69 74 65 5f 69 6e 74 36 34 29 28 28 2d 72 29 2b  ite_int64)((-r)+
27b0: 30 2e 35 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0.5));.  }else{.
27c0: 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74      zBuf = sqlit
27d0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 66  e3_mprintf("%.*f
27e0: 22 2c 6e 2c 72 29 3b 0a 20 20 20 20 69 66 28 20  ",n,r);.    if( 
27f0: 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
2800: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2810: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
2820: 65 78 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ext);.      retu
2830: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
2840: 6c 69 74 65 33 41 74 6f 46 28 7a 42 75 66 2c 20  lite3AtoF(zBuf, 
2850: 26 72 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  &r, sqlite3Strle
2860: 6e 33 30 28 7a 42 75 66 29 2c 20 53 51 4c 49 54  n30(zBuf), SQLIT
2870: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 73 71 6c  E_UTF8);.    sql
2880: 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
2890: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
28a0: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
28b0: 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 23 65 6e 64  text, r);.}.#end
28c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  if../*.** Alloca
28d0: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
28e0: 66 20 73 70 61 63 65 20 75 73 69 6e 67 20 73 71  f space using sq
28f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
2900: 66 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  f the.** allocat
2910: 69 6f 6e 20 66 61 69 6c 73 2c 20 63 61 6c 6c 20  ion fails, call 
2920: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2930: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 29 20 74 6f 20  rror_nomem() to 
2940: 6e 6f 74 69 66 79 0a 2a 2a 20 74 68 65 20 64 61  notify.** the da
2950: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
2960: 61 74 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20  at malloc() has 
2970: 66 61 69 6c 65 64 20 61 6e 64 20 72 65 74 75 72  failed and retur
2980: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 6e 42  n NULL..** If nB
2990: 79 74 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  yte is larger th
29a0: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  an the maximum s
29b0: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6c 65  tring or blob le
29c0: 6e 67 74 68 2c 20 74 68 65 6e 0a 2a 2a 20 72 61  ngth, then.** ra
29d0: 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 54 4f  ise an SQLITE_TO
29e0: 4f 42 49 47 20 65 78 63 65 70 74 69 6f 6e 20 61  OBIG exception a
29f0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
2a00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
2a10: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 73 71  contextMalloc(sq
2a20: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
2a30: 6f 6e 74 65 78 74 2c 20 69 36 34 20 6e 42 79 74  ontext, i64 nByt
2a40: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  e){.  char *z;. 
2a50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
2a60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
2a70: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
2a80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
2a90: 74 65 3e 30 20 29 3b 0a 20 20 74 65 73 74 63 61  te>0 );.  testca
2aa0: 73 65 28 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61  se( nByte==db->a
2ab0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
2ac0: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20  IT_LENGTH] );.  
2ad0: 74 65 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d  testcase( nByte=
2ae0: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
2af0: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
2b00: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  +1 );.  if( nByt
2b10: 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  e>db->aLimit[SQL
2b20: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
2b30: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
2b40: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f  _result_error_to
2b50: 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20  obig(context);. 
2b60: 20 20 20 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c 73     z = 0;.  }els
2b70: 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  e{.    z = sqlit
2b80: 65 33 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  e3Malloc(nByte);
2b90: 0a 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20  .    if( !z ){. 
2ba0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2bb0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
2bc0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a  context);.    }.
2bd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
2be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2bf0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 75  ntation of the u
2c00: 70 70 65 72 28 29 20 61 6e 64 20 6c 6f 77 65 72  pper() and lower
2c10: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  () SQL functions
2c20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2c30: 20 75 70 70 65 72 46 75 6e 63 28 73 71 6c 69 74   upperFunc(sqlit
2c40: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
2c50: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
2c60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2c70: 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31  rgv){.  char *z1
2c80: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2c90: 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  z2;.  int i, n;.
2ca0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2cb0: 45 52 28 61 72 67 63 29 3b 0a 20 20 7a 32 20 3d  ER(argc);.  z2 =
2cc0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
2cd0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
2ce0: 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  0]);.  n = sqlit
2cf0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
2d00: 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20 56 65  rgv[0]);.  /* Ve
2d10: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 61  rify that the ca
2d20: 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28 29 20 64  ll to _bytes() d
2d30: 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c 69 64 61  oes not invalida
2d40: 74 65 20 74 68 65 20 5f 74 65 78 74 28 29 20 70  te the _text() p
2d50: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61 73 73 65  ointer */.  asse
2d60: 72 74 28 20 7a 32 3d 3d 28 63 68 61 72 2a 29 73  rt( z2==(char*)s
2d70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2d80: 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20  t(argv[0]) );.  
2d90: 69 66 28 20 7a 32 20 29 7b 0a 20 20 20 20 7a 31  if( z2 ){.    z1
2da0: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
2db0: 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29  (context, ((i64)
2dc0: 6e 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 7a  n)+1);.    if( z
2dd0: 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  1 ){.      for(i
2de0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
2df0: 20 20 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20 28         z1[i] = (
2e00: 63 68 61 72 29 73 71 6c 69 74 65 33 54 6f 75 70  char)sqlite3Toup
2e10: 70 65 72 28 7a 32 5b 69 5d 29 3b 0a 20 20 20 20  per(z2[i]);.    
2e20: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2e30: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
2e40: 6e 74 65 78 74 2c 20 7a 31 2c 20 6e 2c 20 73 71  ntext, z1, n, sq
2e50: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
2e60: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2e70: 76 6f 69 64 20 6c 6f 77 65 72 46 75 6e 63 28 73  void lowerFunc(s
2e80: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2e90: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
2ea0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
2eb0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72   **argv){.  char
2ec0: 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *z1;.  const ch
2ed0: 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c  ar *z2;.  int i,
2ee0: 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   n;.  UNUSED_PAR
2ef0: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
2f00: 7a 32 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  z2 = (char*)sqli
2f10: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
2f20: 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73  rgv[0]);.  n = s
2f30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2f40: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f  es(argv[0]);.  /
2f50: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
2f60: 65 20 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73  e call to _bytes
2f70: 28 29 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61  () does not inva
2f80: 6c 69 64 61 74 65 20 74 68 65 20 5f 74 65 78 74  lidate the _text
2f90: 28 29 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  () pointer */.  
2fa0: 61 73 73 65 72 74 28 20 7a 32 3d 3d 28 63 68 61  assert( z2==(cha
2fb0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
2fc0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29  _text(argv[0]) )
2fd0: 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b 0a 20 20  ;.  if( z2 ){.  
2fe0: 20 20 7a 31 20 3d 20 63 6f 6e 74 65 78 74 4d 61    z1 = contextMa
2ff0: 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28  lloc(context, ((
3000: 69 36 34 29 6e 29 2b 31 29 3b 0a 20 20 20 20 69  i64)n)+1);.    i
3010: 66 28 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 66  f( z1 ){.      f
3020: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
3030: 29 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b 69 5d  ){.        z1[i]
3040: 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65   = sqlite3Tolowe
3050: 72 28 7a 32 5b 69 5d 29 3b 0a 20 20 20 20 20 20  r(z2[i]);.      
3060: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
3070: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
3080: 65 78 74 2c 20 7a 31 2c 20 6e 2c 20 73 71 6c 69  ext, z1, n, sqli
3090: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d  te3_free);.    }
30a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  .  }.}../*.** So
30b0: 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 6c 69 6b  me functions lik
30c0: 65 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  e COALESCE() and
30d0: 20 49 46 4e 55 4c 4c 28 29 20 61 6e 64 20 55 4e   IFNULL() and UN
30e0: 4c 49 4b 45 4c 59 28 29 20 61 72 65 20 69 6d 70  LIKELY() are imp
30f0: 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 56  lemented.** as V
3100: 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74  DBE code so that
3110: 20 75 6e 75 73 65 64 20 61 72 67 75 6d 65 6e 74   unused argument
3120: 20 76 61 6c 75 65 73 20 64 6f 20 6e 6f 74 20 68   values do not h
3130: 61 76 65 20 74 6f 20 62 65 20 63 6f 6d 70 75 74  ave to be comput
3140: 65 64 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ed..** However, 
3150: 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 73 6f  we still need so
3160: 6d 65 20 6b 69 6e 64 20 6f 66 20 66 75 6e 63 74  me kind of funct
3170: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ion implementati
3180: 6f 6e 20 66 6f 72 20 74 68 69 73 0a 2a 2a 20 72  on for this.** r
3190: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 65 20 66  outines in the f
31a0: 75 6e 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20  unction table.  
31b0: 54 68 65 20 6e 6f 6f 70 46 75 6e 63 20 6d 61 63  The noopFunc mac
31c0: 72 6f 20 70 72 6f 76 69 64 65 73 20 74 68 69 73  ro provides this
31d0: 2e 0a 2a 2a 20 6e 6f 6f 70 46 75 6e 63 20 77 69  ..** noopFunc wi
31e0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 63 61 6c 6c  ll never be call
31f0: 65 64 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  ed so it doesn't
3200: 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65   matter what the
3210: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
3220: 2a 2a 20 69 73 2e 20 20 57 65 20 6d 69 67 68 74  ** is.  We might
3230: 20 61 73 20 77 65 6c 6c 20 75 73 65 20 74 68 65   as well use the
3240: 20 22 76 65 72 73 69 6f 6e 28 29 22 20 66 75 6e   "version()" fun
3250: 63 74 69 6f 6e 20 61 73 20 61 20 73 75 62 73 74  ction as a subst
3260: 69 74 75 74 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  itute..*/.#defin
3270: 65 20 6e 6f 6f 70 46 75 6e 63 20 76 65 72 73 69  e noopFunc versi
3280: 6f 6e 46 75 6e 63 20 20 20 2f 2a 20 53 75 62 73  onFunc   /* Subs
3290: 74 69 74 75 74 65 20 66 75 6e 63 74 69 6f 6e 20  titute function 
32a0: 2d 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 2a  - never called *
32b0: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
32c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f  ntation of rando
32d0: 6d 28 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72  m().  Return a r
32e0: 61 6e 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20 20  andom integer.  
32f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3300: 72 61 6e 64 6f 6d 46 75 6e 63 28 0a 20 20 73 71  randomFunc(.  sq
3310: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3320: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
3330: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
3340: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
3350: 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e  2.){.  sqlite_in
3360: 74 36 34 20 72 3b 0a 20 20 55 4e 55 53 45 44 5f  t64 r;.  UNUSED_
3370: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
3380: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
3390: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
33a0: 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26  ess(sizeof(r), &
33b0: 72 29 3b 0a 20 20 69 66 28 20 72 3c 30 20 29 7b  r);.  if( r<0 ){
33c0: 0a 20 20 20 20 2f 2a 20 57 65 20 6e 65 65 64 20  .    /* We need 
33d0: 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 61 6e  to prevent a ran
33e0: 64 6f 6d 20 6e 75 6d 62 65 72 20 6f 66 20 30 78  dom number of 0x
33f0: 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30  8000000000000000
3400: 20 0a 20 20 20 20 2a 2a 20 28 6f 72 20 2d 39 32   .    ** (or -92
3410: 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
3420: 38 29 20 73 69 6e 63 65 20 77 68 65 6e 20 79 6f  8) since when yo
3430: 75 20 64 6f 20 61 62 73 28 29 20 6f 66 20 74 68  u do abs() of th
3440: 61 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  at.    ** number
3450: 20 6f 66 20 79 6f 75 20 67 65 74 20 74 68 65 20   of you get the 
3460: 73 61 6d 65 20 76 61 6c 75 65 20 62 61 63 6b 20  same value back 
3470: 61 67 61 69 6e 2e 20 20 54 6f 20 64 6f 20 74 68  again.  To do th
3480: 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 77  is.    ** in a w
3490: 61 79 20 74 68 61 74 20 69 73 20 74 65 73 74 61  ay that is testa
34a0: 62 6c 65 2c 20 6d 61 73 6b 20 74 68 65 20 73 69  ble, mask the si
34b0: 67 6e 20 62 69 74 20 6f 66 66 20 6f 66 20 6e 65  gn bit off of ne
34c0: 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 76 61  gative.    ** va
34d0: 6c 75 65 73 2c 20 72 65 73 75 6c 74 69 6e 67 20  lues, resulting 
34e0: 69 6e 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  in a positive va
34f0: 6c 75 65 2e 20 20 54 68 65 6e 20 74 61 6b 65 20  lue.  Then take 
3500: 74 68 65 20 0a 20 20 20 20 2a 2a 20 32 73 20 63  the .    ** 2s c
3510: 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 61  omplement of tha
3520: 74 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  t positive value
3530: 2e 20 20 54 68 65 20 65 6e 64 20 72 65 73 75 6c  .  The end resul
3540: 74 20 63 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65  t can.    ** the
3550: 72 65 66 6f 72 65 20 62 65 20 6e 6f 20 6c 65 73  refore be no les
3560: 73 20 74 68 61 6e 20 2d 39 32 32 33 33 37 32 30  s than -92233720
3570: 33 36 38 35 34 37 37 35 38 30 37 2e 0a 20 20 20  36854775807..   
3580: 20 2a 2f 0a 20 20 20 20 72 20 3d 20 2d 28 72 20   */.    r = -(r 
3590: 26 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 29  & LARGEST_INT64)
35a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
35b0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
35c0: 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a  text, r);.}../*.
35d0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
35e0: 6e 20 6f 66 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  n of randomblob(
35f0: 4e 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61  N).  Return a ra
3600: 6e 64 6f 6d 20 62 6c 6f 62 0a 2a 2a 20 74 68 61  ndom blob.** tha
3610: 74 20 69 73 20 4e 20 62 79 74 65 73 20 6c 6f 6e  t is N bytes lon
3620: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
3630: 64 20 72 61 6e 64 6f 6d 42 6c 6f 62 28 0a 20 20  d randomBlob(.  
3640: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3650: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
3660: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
3670: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
3680: 20 20 69 6e 74 20 6e 3b 0a 20 20 75 6e 73 69 67    int n;.  unsig
3690: 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 61  ned char *p;.  a
36a0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
36b0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
36c0: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e 20  ETER(argc);.  n 
36d0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
36e0: 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  int(argv[0]);.  
36f0: 69 66 28 20 6e 3c 31 20 29 7b 0a 20 20 20 20 6e  if( n<1 ){.    n
3700: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 20 3d 20   = 1;.  }.  p = 
3710: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
3720: 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 69 66 28  ntext, n);.  if(
3730: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
3740: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20  3_randomness(n, 
3750: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
3760: 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74  result_blob(cont
3770: 65 78 74 2c 20 28 63 68 61 72 2a 29 70 2c 20 6e  ext, (char*)p, n
3780: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
3790: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
37a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
37b0: 74 68 65 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  the last_insert_
37c0: 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75 6e 63  rowid() SQL func
37d0: 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72  tion.  The retur
37e0: 6e 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68  n.** value is th
37f0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 71  e same as the sq
3800: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
3810: 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66 75  t_rowid() API fu
3820: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
3830: 63 20 76 6f 69 64 20 6c 61 73 74 5f 69 6e 73 65  c void last_inse
3840: 72 74 5f 72 6f 77 69 64 28 0a 20 20 73 71 6c 69  rt_rowid(.  sqli
3850: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3860: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74  text, .  int Not
3870: 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74 65 33  Used, .  sqlite3
3880: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
3890: 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  2.){.  sqlite3 *
38a0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
38b0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
38c0: 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45  ontext);.  UNUSE
38d0: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
38e0: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
38f0: 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 35  .  /* IMP: R-515
3900: 31 33 2d 31 32 30 32 36 20 54 68 65 20 6c 61 73  13-12026 The las
3910: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
3920: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73   SQL function is
3930: 20 61 0a 20 20 2a 2a 20 77 72 61 70 70 65 72 20   a.  ** wrapper 
3940: 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74  around the sqlit
3950: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
3960: 6f 77 69 64 28 29 20 43 2f 43 2b 2b 20 69 6e 74  owid() C/C++ int
3970: 65 72 66 61 63 65 0a 20 20 2a 2a 20 66 75 6e 63  erface.  ** func
3980: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  tion. */.  sqlit
3990: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
39a0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
39b0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
39c0: 69 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  id(db));.}../*.*
39d0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
39e0: 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 28   of the changes(
39f0: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a  ) SQL function..
3a00: 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d 36 32 30  **.** IMP: R-620
3a10: 37 33 2d 31 31 32 30 39 20 54 68 65 20 63 68 61  73-11209 The cha
3a20: 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74  nges() SQL funct
3a30: 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
3a40: 0a 2a 2a 20 61 72 6f 75 6e 64 20 74 68 65 20 73  .** around the s
3a50: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
3a60: 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69 6f 6e 20   C/C++ function 
3a70: 61 6e 64 20 68 65 6e 63 65 20 66 6f 6c 6c 6f 77  and hence follow
3a80: 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 72 75  s the same.** ru
3a90: 6c 65 73 20 66 6f 72 20 63 6f 75 6e 74 69 6e 67  les for counting
3aa0: 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 73 74 61   changes..*/.sta
3ab0: 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 73  tic void changes
3ac0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3ad0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
3ae0: 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73  int NotUsed,.  s
3af0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e  qlite3_value **N
3b00: 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c  otUsed2.){.  sql
3b10: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
3b20: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
3b30: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
3b40: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
3b50: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
3b60: 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  sed2);.  sqlite3
3b70: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
3b80: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ext, sqlite3_cha
3b90: 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  nges(db));.}../*
3ba0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
3bb0: 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 5f  on of the total_
3bc0: 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75  changes() SQL fu
3bd0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74  nction.  The ret
3be0: 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  urn value is.** 
3bf0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
3c00: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
3c10: 61 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e 63  anges() API func
3c20: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
3c30: 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61 6e 67  void total_chang
3c40: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  es(.  sqlite3_co
3c50: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
3c60: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
3c70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3c80: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
3c90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
3ca0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
3cb0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
3cc0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
3cd0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
3ce0: 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d  tUsed2);.  /* IM
3cf0: 50 3a 20 52 2d 35 32 37 35 36 2d 34 31 39 39 33  P: R-52756-41993
3d00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3d10: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
3d20: 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  nd the.  ** sqli
3d30: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
3d40: 73 28 29 20 43 2f 43 2b 2b 20 69 6e 74 65 72 66  s() C/C++ interf
3d50: 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ace. */.  sqlite
3d60: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
3d70: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f  text, sqlite3_to
3d80: 74 61 6c 5f 63 68 61 6e 67 65 73 28 64 62 29 29  tal_changes(db))
3d90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72  ;.}../*.** A str
3da0: 75 63 74 75 72 65 20 64 65 66 69 6e 69 6e 67 20  ucture defining 
3db0: 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f 42 2d 73  how to do GLOB-s
3dc0: 74 79 6c 65 20 63 6f 6d 70 61 72 69 73 6f 6e 73  tyle comparisons
3dd0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6d 70  ..*/.struct comp
3de0: 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20 6d  areInfo {.  u8 m
3df0: 61 74 63 68 41 6c 6c 3b 20 20 20 20 20 20 20 20  atchAll;        
3e00: 20 20 2f 2a 20 22 2a 22 20 6f 72 20 22 25 22 20    /* "*" or "%" 
3e10: 2a 2f 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e 65  */.  u8 matchOne
3e20: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 3f  ;          /* "?
3e30: 22 20 6f 72 20 22 5f 22 20 2a 2f 0a 20 20 75 38  " or "_" */.  u8
3e40: 20 6d 61 74 63 68 53 65 74 3b 20 20 20 20 20 20   matchSet;      
3e50: 20 20 20 20 2f 2a 20 22 5b 22 20 6f 72 20 30 20      /* "[" or 0 
3e60: 2a 2f 0a 20 20 75 38 20 6e 6f 43 61 73 65 3b 20  */.  u8 noCase; 
3e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
3e80: 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 63 61 73  ue to ignore cas
3e90: 65 20 64 69 66 66 65 72 65 6e 63 65 73 20 2a 2f  e differences */
3ea0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 4c  .};../*.** For L
3eb0: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6d 61 74  IKE and GLOB mat
3ec0: 63 68 69 6e 67 20 6f 6e 20 45 42 43 44 49 43 20  ching on EBCDIC 
3ed0: 6d 61 63 68 69 6e 65 73 2c 20 61 73 73 75 6d 65  machines, assume
3ee0: 20 74 68 61 74 20 65 76 65 72 79 0a 2a 2a 20 63   that every.** c
3ef0: 68 61 72 61 63 74 65 72 20 69 73 20 65 78 61 63  haracter is exac
3f00: 74 6c 79 20 6f 6e 65 20 62 79 74 65 20 69 6e 20  tly one byte in 
3f10: 73 69 7a 65 2e 20 20 41 6c 73 6f 2c 20 70 72 6f  size.  Also, pro
3f20: 76 64 65 20 74 68 65 20 55 74 66 38 52 65 61 64  vde the Utf8Read
3f30: 28 29 0a 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20  ().** macro for 
3f40: 66 61 73 74 20 72 65 61 64 69 6e 67 20 6f 66 20  fast reading of 
3f50: 74 68 65 20 6e 65 78 74 20 63 68 61 72 61 63 74  the next charact
3f60: 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  er in the common
3f70: 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 74   case where.** t
3f80: 68 65 20 6e 65 78 74 20 63 68 61 72 61 63 74 65  he next characte
3f90: 72 20 69 73 20 41 53 43 49 49 2e 0a 2a 2f 0a 23  r is ASCII..*/.#
3fa0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3fb0: 45 5f 45 42 43 44 49 43 29 0a 23 20 64 65 66 69  E_EBCDIC).# defi
3fc0: 6e 65 20 73 71 6c 69 74 65 33 55 74 66 38 52 65  ne sqlite3Utf8Re
3fd0: 61 64 28 41 29 20 20 20 20 20 20 20 20 28 2a 28  ad(A)        (*(
3fe0: 28 2a 41 29 2b 2b 29 29 0a 23 20 64 65 66 69 6e  (*A)++)).# defin
3ff0: 65 20 55 74 66 38 52 65 61 64 28 41 29 20 20 20  e Utf8Read(A)   
4000: 20 20 20 20 20 20 20 20 20 20 20 20 28 2a 28 41              (*(A
4010: 2b 2b 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  ++)).#else.# def
4020: 69 6e 65 20 55 74 66 38 52 65 61 64 28 41 29 20  ine Utf8Read(A) 
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 41                (A
4040: 5b 30 5d 3c 30 78 38 30 3f 2a 28 41 2b 2b 29 3a  [0]<0x80?*(A++):
4050: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
4060: 26 41 29 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61  &A)).#endif..sta
4070: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
4080: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 67 6c 6f   compareInfo glo
4090: 62 49 6e 66 6f 20 3d 20 7b 20 27 2a 27 2c 20 27  bInfo = { '*', '
40a0: 3f 27 2c 20 27 5b 27 2c 20 30 20 7d 3b 0a 2f 2a  ?', '[', 0 };./*
40b0: 20 54 68 65 20 63 6f 72 72 65 63 74 20 53 51 4c   The correct SQL
40c0: 2d 39 32 20 62 65 68 61 76 69 6f 72 20 69 73 20  -92 behavior is 
40d0: 66 6f 72 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  for the LIKE ope
40e0: 72 61 74 6f 72 20 74 6f 20 69 67 6e 6f 72 65 0a  rator to ignore.
40f0: 2a 2a 20 63 61 73 65 2e 20 20 54 68 75 73 20 20  ** case.  Thus  
4100: 27 61 27 20 4c 49 4b 45 20 27 41 27 20 77 6f 75  'a' LIKE 'A' wou
4110: 6c 64 20 62 65 20 74 72 75 65 2e 20 2a 2f 0a 73  ld be true. */.s
4120: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
4130: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c  ct compareInfo l
4140: 69 6b 65 49 6e 66 6f 4e 6f 72 6d 20 3d 20 7b 20  ikeInfoNorm = { 
4150: 27 25 27 2c 20 27 5f 27 2c 20 20 20 30 2c 20 31  '%', '_',   0, 1
4160: 20 7d 3b 0a 2f 2a 20 49 66 20 53 51 4c 49 54 45   };./* If SQLITE
4170: 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f  _CASE_SENSITIVE_
4180: 4c 49 4b 45 20 69 73 20 64 65 66 69 6e 65 64 2c  LIKE is defined,
4190: 20 74 68 65 6e 20 74 68 65 20 4c 49 4b 45 20 6f   then the LIKE o
41a0: 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 63 61  perator.** is ca
41b0: 73 65 20 73 65 6e 73 69 74 69 76 65 20 63 61 75  se sensitive cau
41c0: 73 69 6e 67 20 27 61 27 20 4c 49 4b 45 20 27 41  sing 'a' LIKE 'A
41d0: 27 20 74 6f 20 62 65 20 66 61 6c 73 65 20 2a 2f  ' to be false */
41e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74  .static const st
41f0: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
4200: 20 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 20 7b   likeInfoAlt = {
4210: 20 27 25 27 2c 20 27 5f 27 2c 20 20 20 30 2c 20   '%', '_',   0, 
4220: 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 6f 73 73  0 };../*.** Poss
4230: 69 62 6c 65 20 65 72 72 6f 72 20 72 65 74 75 72  ible error retur
4240: 6e 73 20 66 72 6f 6d 20 70 61 74 74 65 72 6e 4d  ns from patternM
4250: 61 74 63 68 28 29 0a 2a 2f 0a 23 64 65 66 69 6e  atch().*/.#defin
4260: 65 20 53 51 4c 49 54 45 5f 4d 41 54 43 48 20 20  e SQLITE_MATCH  
4270: 20 20 20 20 20 20 20 20 20 20 20 30 0a 23 64 65             0.#de
4280: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 41  fine SQLITE_NOMA
4290: 54 43 48 20 20 20 20 20 20 20 20 20 20 20 31 0a  TCH           1.
42a0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4e  #define SQLITE_N
42b0: 4f 57 49 4c 44 43 41 52 44 4d 41 54 43 48 20 20  OWILDCARDMATCH  
42c0: 20 32 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72   2../*.** Compar
42d0: 65 20 74 77 6f 20 55 54 46 2d 38 20 73 74 72 69  e two UTF-8 stri
42e0: 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69 74 79  ngs for equality
42f0: 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
4300: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 61 20   string is.** a 
4310: 47 4c 4f 42 20 6f 72 20 4c 49 4b 45 20 65 78 70  GLOB or LIKE exp
4320: 72 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ression.  Return
4330: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
4340: 20 20 53 51 4c 49 54 45 5f 4d 41 54 43 48 3a 20    SQLITE_MATCH: 
4350: 20 20 20 20 20 20 20 20 20 20 20 4d 61 74 63 68             Match
4360: 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  .**    SQLITE_NO
4370: 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20  MATCH:          
4380: 4e 6f 20 6d 61 74 63 68 0a 2a 2a 20 20 20 20 53  No match.**    S
4390: 51 4c 49 54 45 5f 4e 4f 57 49 4c 44 43 41 52 44  QLITE_NOWILDCARD
43a0: 4d 41 54 43 48 3a 20 20 4e 6f 20 6d 61 74 63 68  MATCH:  No match
43b0: 20 69 6e 20 73 70 69 74 65 20 6f 66 20 68 61 76   in spite of hav
43c0: 69 6e 67 20 2a 20 6f 72 20 25 20 77 69 6c 64 63  ing * or % wildc
43d0: 61 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  ards..**.** Glob
43e0: 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
43f0: 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
4400: 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
4410: 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
4420: 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
4430: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
4440: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
4450: 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
4460: 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
4470: 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
4480: 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
4490: 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
44a0: 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
44c0: 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
44d0: 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
44e0: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
44f0: 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
4500: 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
4510: 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e  .** With the [..
4520: 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61  .] and [^...] ma
4530: 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68  tching, a ']' ch
4540: 61 72 61 63 74 65 72 20 63 61 6e 20 62 65 20 69  aracter can be i
4550: 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68  ncluded.** in th
4560: 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67  e list by making
4570: 20 69 74 20 74 68 65 20 66 69 72 73 74 20 63 68   it the first ch
4580: 61 72 61 63 74 65 72 20 61 66 74 65 72 20 27 5b  aracter after '[
4590: 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20  ' or '^'.  A.** 
45a0: 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74  range of charact
45b0: 65 72 73 20 63 61 6e 20 62 65 20 73 70 65 63 69  ers can be speci
45c0: 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20  fied using '-'. 
45d0: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61   Example:.** "[a
45e0: 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79  -z]" matches any
45f0: 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61   single lower-ca
4600: 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d  se letter.  To m
4610: 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65  atch a '-', make
4620: 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20  .** it the last 
4630: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
4640: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6b   list..**.** Lik
4650: 65 20 6d 61 74 63 68 69 6e 67 20 72 75 6c 65 73  e matching rules
4660: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 27 25  :.** .**      '%
4670: 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
4680: 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20  any sequence of 
4690: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61  zero or more cha
46a0: 72 61 63 74 65 72 73 0a 2a 2a 0a 2a 2a 2a 20 20  racters.**.***  
46b0: 20 20 20 27 5f 27 20 20 20 20 20 20 20 4d 61 74     '_'       Mat
46c0: 63 68 65 73 20 61 6e 79 20 6f 6e 65 20 63 68 61  ches any one cha
46d0: 72 61 63 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 20  racter.**.**    
46e0: 20 20 45 63 20 20 20 20 20 20 20 20 57 68 65 72    Ec        Wher
46f0: 65 20 45 20 69 73 20 74 68 65 20 22 65 73 63 22  e E is the "esc"
4700: 20 63 68 61 72 61 63 74 65 72 20 61 6e 64 20 63   character and c
4710: 20 69 73 20 61 6e 79 20 6f 74 68 65 72 0a 2a 2a   is any other.**
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 63 68 61 72 61 63 74 65 72 2c 20 69 6e 63 6c 75  character, inclu
4740: 64 69 6e 67 20 27 25 27 2c 20 27 5f 27 2c 20 61  ding '%', '_', a
4750: 6e 64 20 65 73 63 2c 20 6d 61 74 63 68 20 65 78  nd esc, match ex
4760: 61 63 74 6c 79 20 63 2e 0a 2a 2a 0a 2a 2a 20 54  actly c..**.** T
4770: 68 65 20 63 6f 6d 6d 65 6e 74 73 20 77 69 74 68  he comments with
4780: 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  in this routine 
4790: 75 73 75 61 6c 6c 79 20 61 73 73 75 6d 65 20 67  usually assume g
47a0: 6c 6f 62 20 6d 61 74 63 68 69 6e 67 2e 0a 2a 2a  lob matching..**
47b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
47c0: 20 69 73 20 75 73 75 61 6c 6c 79 20 71 75 69 63   is usually quic
47d0: 6b 2c 20 62 75 74 20 63 61 6e 20 62 65 20 4e 2a  k, but can be N*
47e0: 2a 32 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20  *2 in the worst 
47f0: 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
4800: 69 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  int patternCompa
4810: 72 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  re(.  const u8 *
4820: 7a 50 61 74 74 65 72 6e 2c 20 20 20 20 20 20 20  zPattern,       
4830: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 6c         /* The gl
4840: 6f 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20  ob pattern */.  
4850: 63 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72 69 6e  const u8 *zStrin
4860: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
4870: 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20 74   /* The string t
4880: 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
4890: 74 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20 20  t the glob */.  
48a0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d  const struct com
48b0: 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 2c  pareInfo *pInfo,
48c0: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
48d0: 61 62 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20  about how to do 
48e0: 74 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20  the compare */. 
48f0: 20 75 33 32 20 6d 61 74 63 68 4f 74 68 65 72 20   u32 matchOther 
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20    /* The escape 
4920: 63 68 61 72 20 28 4c 49 4b 45 29 20 6f 72 20 27  char (LIKE) or '
4930: 5b 27 20 28 47 4c 4f 42 29 20 2a 2f 0a 29 7b 0a  [' (GLOB) */.){.
4940: 20 20 75 33 32 20 63 2c 20 63 32 3b 20 20 20 20    u32 c, c2;    
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 20 20 20 2f 2a 20 4e 65 78 74 20 70 61 74 74 65     /* Next patte
4970: 72 6e 20 61 6e 64 20 69 6e 70 75 74 20 73 74 72  rn and input str
4980: 69 6e 67 20 63 68 61 72 73 20 2a 2f 0a 20 20 75  ing chars */.  u
4990: 33 32 20 6d 61 74 63 68 4f 6e 65 20 3d 20 70 49  32 matchOne = pI
49a0: 6e 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65 3b 20 20  nfo->matchOne;  
49b0: 2f 2a 20 22 3f 22 20 6f 72 20 22 5f 22 20 2a 2f  /* "?" or "_" */
49c0: 0a 20 20 75 33 32 20 6d 61 74 63 68 41 6c 6c 20  .  u32 matchAll 
49d0: 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c  = pInfo->matchAl
49e0: 6c 3b 20 20 2f 2a 20 22 2a 22 20 6f 72 20 22 25  l;  /* "*" or "%
49f0: 22 20 2a 2f 0a 20 20 75 38 20 6e 6f 43 61 73 65  " */.  u8 noCase
4a00: 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43 61 73 65   = pInfo->noCase
4a10: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
4a20: 69 66 20 75 70 70 65 72 63 61 73 65 3d 3d 6c 6f  if uppercase==lo
4a30: 77 65 72 63 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  wercase */.  con
4a40: 73 74 20 75 38 20 2a 7a 45 73 63 61 70 65 64 20  st u8 *zEscaped 
4a50: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
4a60: 20 4f 6e 65 20 70 61 73 74 20 74 68 65 20 6c 61   One past the la
4a70: 73 74 20 65 73 63 61 70 65 64 20 69 6e 70 75 74  st escaped input
4a80: 20 63 68 61 72 20 2a 2f 0a 20 20 0a 20 20 77 68   char */.  .  wh
4a90: 69 6c 65 28 20 28 63 20 3d 20 55 74 66 38 52 65  ile( (c = Utf8Re
4aa0: 61 64 28 7a 50 61 74 74 65 72 6e 29 29 21 3d 30  ad(zPattern))!=0
4ab0: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 6d   ){.    if( c==m
4ac0: 61 74 63 68 41 6c 6c 20 29 7b 20 20 2f 2a 20 4d  atchAll ){  /* M
4ad0: 61 74 63 68 20 22 2a 22 20 2a 2f 0a 20 20 20 20  atch "*" */.    
4ae0: 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 6d    /* Skip over m
4af0: 75 6c 74 69 70 6c 65 20 22 2a 22 20 63 68 61 72  ultiple "*" char
4b00: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 70 61  acters in the pa
4b10: 74 74 65 72 6e 2e 20 20 49 66 20 74 68 65 72 65  ttern.  If there
4b20: 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  .      ** are al
4b30: 73 6f 20 22 3f 22 20 63 68 61 72 61 63 74 65 72  so "?" character
4b40: 73 2c 20 73 6b 69 70 20 74 68 6f 73 65 20 61 73  s, skip those as
4b50: 20 77 65 6c 6c 2c 20 62 75 74 20 63 6f 6e 73 75   well, but consu
4b60: 6d 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  me a.      ** si
4b70: 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 20 6f  ngle character o
4b80: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
4b90: 6e 67 20 66 6f 72 20 65 61 63 68 20 22 3f 22 20  ng for each "?" 
4ba0: 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20  skipped */.     
4bb0: 20 77 68 69 6c 65 28 20 28 63 3d 55 74 66 38 52   while( (c=Utf8R
4bc0: 65 61 64 28 7a 50 61 74 74 65 72 6e 29 29 20 3d  ead(zPattern)) =
4bd0: 3d 20 6d 61 74 63 68 41 6c 6c 20 7c 7c 20 63 20  = matchAll || c 
4be0: 3d 3d 20 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20  == matchOne ){. 
4bf0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 6d 61         if( c==ma
4c00: 74 63 68 4f 6e 65 20 26 26 20 73 71 6c 69 74 65  tchOne && sqlite
4c10: 33 55 74 66 38 52 65 61 64 28 26 7a 53 74 72 69  3Utf8Read(&zStri
4c20: 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ng)==0 ){.      
4c30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4c40: 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d 41 54 43  E_NOWILDCARDMATC
4c50: 48 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  H;.        }.   
4c60: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
4c70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
4c80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 41 54  eturn SQLITE_MAT
4c90: 43 48 3b 20 20 20 2f 2a 20 22 2a 22 20 61 74 20  CH;   /* "*" at 
4ca0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
4cb0: 61 74 74 65 72 6e 20 6d 61 74 63 68 65 73 20 2a  attern matches *
4cc0: 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  /.      }else if
4cd0: 28 20 63 3d 3d 6d 61 74 63 68 4f 74 68 65 72 20  ( c==matchOther 
4ce0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
4cf0: 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3d 3d  Info->matchSet==
4d00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
4d10: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
4d20: 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ad(&zPattern);. 
4d30: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
4d40: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
4d50: 45 5f 4e 4f 57 49 4c 44 43 41 52 44 4d 41 54 43  E_NOWILDCARDMATC
4d60: 48 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  H;.        }else
4d70: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22  {.          /* "
4d80: 5b 2e 2e 2e 5d 22 20 69 6d 6d 65 64 69 61 74 65  [...]" immediate
4d90: 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 22  ly follows the "
4da0: 2a 22 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  *".  We have to 
4db0: 64 6f 20 61 20 73 6c 6f 77 0a 20 20 20 20 20 20  do a slow.      
4dc0: 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
4dd0: 20 73 65 61 72 63 68 20 69 6e 20 74 68 69 73 20   search in this 
4de0: 63 61 73 65 2c 20 62 75 74 20 69 74 20 69 73 20  case, but it is 
4df0: 61 6e 20 75 6e 75 73 75 61 6c 20 63 61 73 65 2e  an unusual case.
4e00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
4e10: 73 65 72 74 28 20 6d 61 74 63 68 4f 74 68 65 72  sert( matchOther
4e20: 3c 30 78 38 30 20 29 3b 20 20 2f 2a 20 27 5b 27  <0x80 );  /* '['
4e30: 20 69 73 20 61 20 73 69 6e 67 6c 65 2d 62 79 74   is a single-byt
4e40: 65 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  e character */. 
4e50: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
4e60: 2a 7a 53 74 72 69 6e 67 20 29 7b 0a 20 20 20 20  *zString ){.    
4e70: 20 20 20 20 20 20 20 20 69 6e 74 20 62 4d 61 74          int bMat
4e80: 63 68 20 3d 20 70 61 74 74 65 72 6e 43 6f 6d 70  ch = patternComp
4e90: 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 2d 31  are(&zPattern[-1
4ea0: 5d 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c  ],zString,pInfo,
4eb0: 6d 61 74 63 68 4f 74 68 65 72 29 3b 0a 20 20 20  matchOther);.   
4ec0: 20 20 20 20 20 20 20 20 20 69 66 28 20 62 4d 61           if( bMa
4ed0: 74 63 68 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 41  tch!=SQLITE_NOMA
4ee0: 54 43 48 20 29 20 72 65 74 75 72 6e 20 62 4d 61  TCH ) return bMa
4ef0: 74 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tch;.           
4f00: 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46   SQLITE_SKIP_UTF
4f10: 38 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  8(zString);.    
4f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4f30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4f40: 4e 4f 57 49 4c 44 43 41 52 44 4d 41 54 43 48 3b  NOWILDCARDMATCH;
4f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4f60: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 20   }..      /* At 
4f70: 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61  this point varia
4f80: 62 6c 65 20 63 20 63 6f 6e 74 61 69 6e 73 20 74  ble c contains t
4f90: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
4fa0: 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  er of the.      
4fb0: 2a 2a 20 70 61 74 74 65 72 6e 20 73 74 72 69 6e  ** pattern strin
4fc0: 67 20 70 61 73 74 20 74 68 65 20 22 2a 22 2e 20  g past the "*". 
4fd0: 20 53 65 61 72 63 68 20 69 6e 20 74 68 65 20 69   Search in the i
4fe0: 6e 70 75 74 20 73 74 72 69 6e 67 20 66 6f 72 20  nput string for 
4ff0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 72  the.      ** fir
5000: 73 74 20 6d 61 74 63 68 69 6e 67 20 63 68 61 72  st matching char
5010: 61 63 74 65 72 20 61 6e 64 20 72 65 63 75 72 73  acter and recurs
5020: 69 76 65 6c 79 20 63 6f 6e 74 69 6e 75 65 20 74  ively continue t
5030: 68 65 20 6d 61 74 63 68 20 66 72 6f 6d 0a 20 20  he match from.  
5040: 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e      ** that poin
5050: 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
5060: 20 20 2a 2a 20 46 6f 72 20 61 20 63 61 73 65 2d    ** For a case-
5070: 69 6e 73 65 6e 73 69 74 69 76 65 20 73 65 61 72  insensitive sear
5080: 63 68 2c 20 73 65 74 20 76 61 72 69 61 62 6c 65  ch, set variable
5090: 20 63 78 20 74 6f 20 62 65 20 74 68 65 20 73 61   cx to be the sa
50a0: 6d 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63  me as.      ** c
50b0: 20 62 75 74 20 69 6e 20 74 68 65 20 6f 74 68 65   but in the othe
50c0: 72 20 63 61 73 65 20 61 6e 64 20 73 65 61 72 63  r case and searc
50d0: 68 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  h the input stri
50e0: 6e 67 20 66 6f 72 20 65 69 74 68 65 72 0a 20 20  ng for either.  
50f0: 20 20 20 20 2a 2a 20 63 20 6f 72 20 63 78 2e 0a      ** c or cx..
5100: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
5110: 66 28 20 63 3c 3d 30 78 38 30 20 29 7b 0a 20 20  f( c<=0x80 ){.  
5120: 20 20 20 20 20 20 75 33 32 20 63 78 3b 0a 20 20        u32 cx;.  
5130: 20 20 20 20 20 20 69 6e 74 20 62 4d 61 74 63 68        int bMatch
5140: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 6f  ;.        if( no
5150: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
5160: 20 20 63 78 20 3d 20 73 71 6c 69 74 65 33 54 6f    cx = sqlite3To
5170: 75 70 70 65 72 28 63 29 3b 0a 20 20 20 20 20 20  upper(c);.      
5180: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 54      c = sqlite3T
5190: 6f 6c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20  olower(c);.     
51a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
51b0: 20 20 20 20 63 78 20 3d 20 63 3b 0a 20 20 20 20      cx = c;.    
51c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68      }.        wh
51d0: 69 6c 65 28 20 28 63 32 20 3d 20 2a 28 7a 53 74  ile( (c2 = *(zSt
51e0: 72 69 6e 67 2b 2b 29 29 21 3d 30 20 29 7b 0a 20  ring++))!=0 ){. 
51f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 32 21           if( c2!
5200: 3d 63 20 26 26 20 63 32 21 3d 63 78 20 29 20 63  =c && c2!=cx ) c
5210: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
5220: 20 20 20 62 4d 61 74 63 68 20 3d 20 70 61 74 74     bMatch = patt
5230: 65 72 6e 43 6f 6d 70 61 72 65 28 7a 50 61 74 74  ernCompare(zPatt
5240: 65 72 6e 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66  ern,zString,pInf
5250: 6f 2c 6d 61 74 63 68 4f 74 68 65 72 29 3b 0a 20  o,matchOther);. 
5260: 20 20 20 20 20 20 20 20 20 69 66 28 20 62 4d 61           if( bMa
5270: 74 63 68 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 41  tch!=SQLITE_NOMA
5280: 54 43 48 20 29 20 72 65 74 75 72 6e 20 62 4d 61  TCH ) return bMa
5290: 74 63 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tch;.        }. 
52a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
52b0: 20 20 20 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a      int bMatch;.
52c0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
52d0: 63 32 20 3d 20 55 74 66 38 52 65 61 64 28 7a 53  c2 = Utf8Read(zS
52e0: 74 72 69 6e 67 29 29 21 3d 30 20 29 7b 0a 20 20  tring))!=0 ){.  
52f0: 20 20 20 20 20 20 20 20 69 66 28 20 63 32 21 3d          if( c2!=
5300: 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  c ) continue;.  
5310: 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d          bMatch =
5320: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
5330: 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72 69 6e 67  zPattern,zString
5340: 2c 70 49 6e 66 6f 2c 6d 61 74 63 68 4f 74 68 65  ,pInfo,matchOthe
5350: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
5360: 28 20 62 4d 61 74 63 68 21 3d 53 51 4c 49 54 45  ( bMatch!=SQLITE
5370: 5f 4e 4f 4d 41 54 43 48 20 29 20 72 65 74 75 72  _NOMATCH ) retur
5380: 6e 20 62 4d 61 74 63 68 3b 0a 20 20 20 20 20 20  n bMatch;.      
5390: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
53a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
53b0: 4e 4f 57 49 4c 44 43 41 52 44 4d 41 54 43 48 3b  NOWILDCARDMATCH;
53c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
53d0: 3d 3d 6d 61 74 63 68 4f 74 68 65 72 20 29 7b 0a  ==matchOther ){.
53e0: 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d        if( pInfo-
53f0: 3e 6d 61 74 63 68 53 65 74 3d 3d 30 20 29 7b 0a  >matchSet==0 ){.
5400: 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
5410: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61  te3Utf8Read(&zPa
5420: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  ttern);.        
5430: 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72  if( c==0 ) retur
5440: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48  n SQLITE_NOMATCH
5450: 3b 0a 20 20 20 20 20 20 20 20 7a 45 73 63 61 70  ;.        zEscap
5460: 65 64 20 3d 20 7a 50 61 74 74 65 72 6e 3b 0a 20  ed = zPattern;. 
5470: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5480: 20 20 20 20 75 33 32 20 70 72 69 6f 72 5f 63 20      u32 prior_c 
5490: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
54a0: 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20   seen = 0;.     
54b0: 20 20 20 69 6e 74 20 69 6e 76 65 72 74 20 3d 20     int invert = 
54c0: 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73  0;.        c = s
54d0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
54e0: 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20  zString);.      
54f0: 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
5500: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 41 54  urn SQLITE_NOMAT
5510: 43 48 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d  CH;.        c2 =
5520: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
5530: 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20  (&zPattern);.   
5540: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27       if( c2=='^'
5550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
5560: 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vert = 1;.      
5570: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
5580: 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74 65  Utf8Read(&zPatte
5590: 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rn);.        }. 
55a0: 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27         if( c2=='
55b0: 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]' ){.          
55c0: 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65  if( c==']' ) see
55d0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
55e0: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
55f0: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
5600: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5610: 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26      while( c2 &&
5620: 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20   c2!=']' ){.    
5630: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d        if( c2=='-
5640: 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 30 5d  ' && zPattern[0]
5650: 21 3d 27 5d 27 20 26 26 20 7a 50 61 74 74 65 72  !=']' && zPatter
5660: 6e 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72  n[0]!=0 && prior
5670: 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  _c>0 ){.        
5680: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
5690: 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74 65  Utf8Read(&zPatte
56a0: 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rn);.           
56b0: 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20   if( c>=prior_c 
56c0: 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20  && c<=c2 ) seen 
56d0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
56e0: 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20   prior_c = 0;.  
56f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5700: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
5710: 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==c2 ){.        
5720: 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
5730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5740: 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
5750: 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
5760: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 32    }.          c2
5770: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
5780: 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ad(&zPattern);. 
5790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
57a0: 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73   if( c2==0 || (s
57b0: 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30  een ^ invert)==0
57c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
57d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 41  turn SQLITE_NOMA
57e0: 54 43 48 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  TCH;.        }. 
57f0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
5800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5810: 20 20 20 63 32 20 3d 20 55 74 66 38 52 65 61 64     c2 = Utf8Read
5820: 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 69  (zString);.    i
5830: 66 28 20 63 3d 3d 63 32 20 29 20 63 6f 6e 74 69  f( c==c2 ) conti
5840: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6e 6f 43  nue;.    if( noC
5850: 61 73 65 20 20 26 26 20 73 71 6c 69 74 65 33 54  ase  && sqlite3T
5860: 6f 6c 6f 77 65 72 28 63 29 3d 3d 73 71 6c 69 74  olower(c)==sqlit
5870: 65 33 54 6f 6c 6f 77 65 72 28 63 32 29 20 26 26  e3Tolower(c2) &&
5880: 20 63 3c 30 78 38 30 20 26 26 20 63 32 3c 30 78   c<0x80 && c2<0x
5890: 38 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  80 ){.      cont
58a0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
58b0: 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20  if( c==matchOne 
58c0: 26 26 20 7a 50 61 74 74 65 72 6e 21 3d 7a 45 73  && zPattern!=zEs
58d0: 63 61 70 65 64 20 26 26 20 63 32 21 3d 30 20 29  caped && c2!=0 )
58e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72   continue;.    r
58f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5900: 41 54 43 48 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ATCH;.  }.  retu
5910: 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 3f  rn *zString==0 ?
5920: 20 53 51 4c 49 54 45 5f 4d 41 54 43 48 20 3a 20   SQLITE_MATCH : 
5930: 53 51 4c 49 54 45 5f 4e 4f 4d 41 54 43 48 3b 0a  SQLITE_NOMATCH;.
5940: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  }../*.** The sql
5950: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29 20 69  ite3_strglob() i
5960: 6e 74 65 72 66 61 63 65 2e 20 20 52 65 74 75 72  nterface.  Retur
5970: 6e 20 30 20 6f 6e 20 61 20 6d 61 74 63 68 20 28  n 0 on a match (
5980: 6c 69 6b 65 20 73 74 72 63 6d 70 28 29 29 20 61  like strcmp()) a
5990: 6e 64 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  nd.** non-zero i
59a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
59b0: 74 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  tch..*/.int sqli
59c0: 74 65 33 5f 73 74 72 67 6c 6f 62 28 63 6f 6e 73  te3_strglob(cons
59d0: 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 50 61 74  t char *zGlobPat
59e0: 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  tern, const char
59f0: 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20 20 72 65   *zString){.  re
5a00: 74 75 72 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70  turn patternComp
5a10: 61 72 65 28 28 75 38 2a 29 7a 47 6c 6f 62 50 61  are((u8*)zGlobPa
5a20: 74 74 65 72 6e 2c 20 28 75 38 2a 29 7a 53 74 72  ttern, (u8*)zStr
5a30: 69 6e 67 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c 20  ing, &globInfo, 
5a40: 27 5b 27 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  '[');.}../*.** T
5a50: 68 65 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  he sqlite3_strli
5a60: 6b 65 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20  ke() interface. 
5a70: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 61 20 6d   Return 0 on a m
5a80: 61 74 63 68 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72  atch and non-zer
5a90: 6f 20 66 6f 72 0a 2a 2a 20 61 20 6d 69 73 73 20  o for.** a miss 
5aa0: 2d 20 6c 69 6b 65 20 73 74 72 63 6d 70 28 29 2e  - like strcmp().
5ab0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
5ac0: 73 74 72 6c 69 6b 65 28 63 6f 6e 73 74 20 63 68  strlike(const ch
5ad0: 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c 20 63 6f  ar *zPattern, co
5ae0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20  nst char *zStr, 
5af0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 65 73 63  unsigned int esc
5b00: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 74 74  ){.  return patt
5b10: 65 72 6e 43 6f 6d 70 61 72 65 28 28 75 38 2a 29  ernCompare((u8*)
5b20: 7a 50 61 74 74 65 72 6e 2c 20 28 75 38 2a 29 7a  zPattern, (u8*)z
5b30: 53 74 72 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f  Str, &likeInfoNo
5b40: 72 6d 2c 20 65 73 63 29 3b 0a 7d 0a 0a 2f 2a 0a  rm, esc);.}../*.
5b50: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
5b60: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
5b70: 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  t the LIKE opera
5b80: 74 6f 72 20 28 6f 72 20 47 4c 4f 42 20 77 68 69  tor (or GLOB whi
5b90: 63 68 20 69 73 0a 2a 2a 20 6a 75 73 74 20 61 20  ch is.** just a 
5ba0: 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 4c 49 4b  variation of LIK
5bb0: 45 29 20 67 65 74 73 20 63 61 6c 6c 65 64 2e 20  E) gets called. 
5bc0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
5bd0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c  r testing.** onl
5be0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
5bf0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
5c00: 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20  ite3_like_count 
5c10: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  = 0;.#endif.../*
5c20: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5c30: 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6b 65 28 29  on of the like()
5c40: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
5c50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d  This function im
5c60: 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20  plements.** the 
5c70: 62 75 69 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70  build-in LIKE op
5c80: 65 72 61 74 6f 72 2e 20 20 54 68 65 20 66 69 72  erator.  The fir
5c90: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
5ca0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  he function is t
5cb0: 68 65 0a 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e  he.** pattern an
5cc0: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  d the second arg
5cd0: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 73 74 72  ument is the str
5ce0: 69 6e 67 2e 20 20 53 6f 2c 20 74 68 65 20 53 51  ing.  So, the SQ
5cf0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a  L statements:.**
5d00: 0a 2a 2a 20 20 20 20 20 20 20 41 20 4c 49 4b 45  .**       A LIKE
5d10: 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c   B.**.** is impl
5d20: 65 6d 65 6e 74 65 64 20 61 73 20 6c 69 6b 65 28  emented as like(
5d30: 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  B,A)..**.** This
5d40: 20 73 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20 28   same function (
5d50: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
5d60: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74 72   compareInfo str
5d70: 75 63 74 75 72 65 29 20 63 6f 6d 70 75 74 65 73  ucture) computes
5d80: 0a 2a 2a 20 74 68 65 20 47 4c 4f 42 20 6f 70 65  .** the GLOB ope
5d90: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
5da0: 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e 63 28 0a   void likeFunc(.
5db0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5dc0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
5dd0: 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69  nt argc, .  sqli
5de0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5df0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
5e00: 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 2c 20 2a  gned char *zA, *
5e10: 7a 42 3b 0a 20 20 75 33 32 20 65 73 63 61 70 65  zB;.  u32 escape
5e20: 3b 0a 20 20 69 6e 74 20 6e 50 61 74 3b 0a 20 20  ;.  int nPat;.  
5e30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
5e40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
5e50: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
5e60: 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61  ;.  struct compa
5e70: 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  reInfo *pInfo = 
5e80: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
5e90: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 23 69 66  a(context);..#if
5ea0: 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
5eb0: 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
5ec0: 42 53 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  BS.  if( sqlite3
5ed0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
5ee0: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  [0])==SQLITE_BLO
5ef0: 42 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f  B.   || sqlite3_
5f00: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
5f10: 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  1])==SQLITE_BLOB
5f20: 0a 20 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  .  ){.#ifdef SQL
5f30: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
5f40: 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b  ite3_like_count+
5f50: 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  +;.#endif.    sq
5f60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5f70: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
5f80: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
5f90: 6e 64 69 66 0a 20 20 7a 42 20 3d 20 73 71 6c 69  ndif.  zB = sqli
5fa0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5fb0: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20  rgv[0]);.  zA = 
5fc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5fd0: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20  xt(argv[1]);..  
5fe0: 2f 2a 20 4c 69 6d 69 74 20 74 68 65 20 6c 65 6e  /* Limit the len
5ff0: 67 74 68 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  gth of the LIKE 
6000: 6f 72 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20  or GLOB pattern 
6010: 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
6020: 73 0a 20 20 2a 2a 20 6f 66 20 64 65 65 70 20 72  s.  ** of deep r
6030: 65 63 75 72 73 69 6f 6e 20 61 6e 64 20 4e 2a 4e  ecursion and N*N
6040: 20 62 65 68 61 76 69 6f 72 20 69 6e 20 70 61 74   behavior in pat
6050: 74 65 72 6e 43 6f 6d 70 61 72 65 28 29 2e 0a 20  ternCompare().. 
6060: 20 2a 2f 0a 20 20 6e 50 61 74 20 3d 20 73 71 6c   */.  nPat = sql
6070: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
6080: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74 65 73  (argv[0]);.  tes
6090: 74 63 61 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d  tcase( nPat==db-
60a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
60b0: 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
60c0: 4e 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74  N_LENGTH] );.  t
60d0: 65 73 74 63 61 73 65 28 20 6e 50 61 74 3d 3d 64  estcase( nPat==d
60e0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
60f0: 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
6100: 45 52 4e 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b  ERN_LENGTH]+1 );
6110: 0a 20 20 69 66 28 20 6e 50 61 74 20 3e 20 64 62  .  if( nPat > db
6120: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
6130: 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
6140: 52 4e 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  RN_LENGTH] ){.  
6150: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6160: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
6170: 22 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61  "LIKE or GLOB pa
6180: 74 74 65 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c 65  ttern too comple
6190: 78 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  x", -1);.    ret
61a0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
61b0: 74 28 20 7a 42 3d 3d 73 71 6c 69 74 65 33 5f 76  t( zB==sqlite3_v
61c0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
61d0: 5d 29 20 29 3b 20 20 2f 2a 20 45 6e 63 6f 64 69  ]) );  /* Encodi
61e0: 6e 67 20 64 69 64 20 6e 6f 74 20 63 68 61 6e 67  ng did not chang
61f0: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 61 72 67 63  e */..  if( argc
6200: 3d 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==3 ){.    /* Th
6210: 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74  e escape charact
6220: 65 72 20 73 74 72 69 6e 67 20 6d 75 73 74 20 63  er string must c
6230: 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69 6e 67  onsist of a sing
6240: 6c 65 20 55 54 46 2d 38 20 63 68 61 72 61 63 74  le UTF-8 charact
6250: 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  er..    ** Other
6260: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
6270: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
6280: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
6290: 20 63 68 61 72 20 2a 7a 45 73 63 20 3d 20 73 71   char *zEsc = sq
62a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
62b0: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69  (argv[2]);.    i
62c0: 66 28 20 7a 45 73 63 3d 3d 30 20 29 20 72 65 74  f( zEsc==0 ) ret
62d0: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  urn;.    if( sql
62e0: 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
62f0: 28 63 68 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29  (char*)zEsc, -1)
6300: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
6310: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
6320: 72 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20  r(context, .    
6330: 20 20 20 20 20 20 22 45 53 43 41 50 45 20 65 78        "ESCAPE ex
6340: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
6350: 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   a single charac
6360: 74 65 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ter", -1);.     
6370: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
6380: 20 20 20 65 73 63 61 70 65 20 3d 20 73 71 6c 69     escape = sqli
6390: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 45 73  te3Utf8Read(&zEs
63a0: 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  c);.  }else{.   
63b0: 20 65 73 63 61 70 65 20 3d 20 70 49 6e 66 6f 2d   escape = pInfo-
63c0: 3e 6d 61 74 63 68 53 65 74 3b 0a 20 20 7d 0a 20  >matchSet;.  }. 
63d0: 20 69 66 28 20 7a 41 20 26 26 20 7a 42 20 29 7b   if( zA && zB ){
63e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
63f0: 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
6400: 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  like_count++;.#e
6410: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
6420: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
6430: 65 78 74 2c 20 70 61 74 74 65 72 6e 43 6f 6d 70  ext, patternComp
6440: 61 72 65 28 7a 42 2c 20 7a 41 2c 20 70 49 6e 66  are(zB, zA, pInf
6450: 6f 2c 20 65 73 63 61 70 65 29 3d 3d 53 51 4c 49  o, escape)==SQLI
6460: 54 45 5f 4d 41 54 43 48 29 3b 0a 20 20 7d 0a 7d  TE_MATCH);.  }.}
6470: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6480: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4e 55  tation of the NU
6490: 4c 4c 49 46 28 78 2c 79 29 20 66 75 6e 63 74 69  LLIF(x,y) functi
64a0: 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  on.  The result 
64b0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
64c0: 61 72 67 75 6d 65 6e 74 20 69 66 20 74 68 65 20  argument if the 
64d0: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 64 69  arguments are di
64e0: 66 66 65 72 65 6e 74 2e 20 20 54 68 65 20 72 65  fferent.  The re
64f0: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20  sult is NULL if 
6500: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  the.** arguments
6510: 20 61 72 65 20 65 71 75 61 6c 20 74 6f 20 65 61   are equal to ea
6520: 63 68 20 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61  ch other..*/.sta
6530: 74 69 63 20 76 6f 69 64 20 6e 75 6c 6c 69 66 46  tic void nullifF
6540: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
6550: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6560: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
6570: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6580: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 43 6f 6c 6c  **argv.){.  Coll
6590: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
65a0: 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53  ite3GetFuncCollS
65b0: 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55  eq(context);.  U
65c0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
65d0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
65e0: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
65f0: 65 28 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b  e(argv[0], argv[
6600: 31 5d 2c 20 70 43 6f 6c 6c 29 21 3d 30 20 29 7b  1], pColl)!=0 ){
6610: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
6620: 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78  ult_value(contex
6630: 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  t, argv[0]);.  }
6640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
6650: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
6660: 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 28 29  sqlite_version()
6670: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
6680: 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 65  result is the ve
6690: 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  rsion.** of the 
66a0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 74  SQLite library t
66b0: 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  hat is running..
66c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
66d0: 65 72 73 69 6f 6e 46 75 6e 63 28 0a 20 20 73 71  ersionFunc(.  sq
66e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
66f0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
6700: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
6710: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
6720: 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  2.){.  UNUSED_PA
6730: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
6740: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f  , NotUsed2);.  /
6750: 2a 20 49 4d 50 3a 20 52 2d 34 38 36 39 39 2d 34  * IMP: R-48699-4
6760: 38 36 31 37 20 54 68 69 73 20 66 75 6e 63 74 69  8617 This functi
6770: 6f 6e 20 69 73 20 61 6e 20 53 51 4c 20 77 72 61  on is an SQL wra
6780: 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a  pper around the.
6790: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 69 62    ** sqlite3_lib
67a0: 76 65 72 73 69 6f 6e 28 29 20 43 2d 69 6e 74 65  version() C-inte
67b0: 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  rface. */.  sqli
67c0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
67d0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
67e0: 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 2d  _libversion(), -
67f0: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
6800: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
6810: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
6820: 65 20 73 71 6c 69 74 65 5f 73 6f 75 72 63 65 5f  e sqlite_source_
6830: 69 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54  id() function. T
6840: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73  he result is a s
6850: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 69 64  tring.** that id
6860: 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 72  entifies the par
6870: 74 69 63 75 6c 61 72 20 76 65 72 73 69 6f 6e 20  ticular version 
6880: 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  of the source co
6890: 64 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  de used to build
68a0: 0a 2a 2a 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73  .** SQLite..*/.s
68b0: 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 72 63  tatic void sourc
68c0: 65 69 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  eidFunc(.  sqlit
68d0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
68e0: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
68f0: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
6900: 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29  lue **NotUsed2.)
6910: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
6920: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
6930: 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49  otUsed2);.  /* I
6940: 4d 50 3a 20 52 2d 32 34 34 37 30 2d 33 31 31 33  MP: R-24470-3113
6950: 36 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  6 This function 
6960: 69 73 20 61 6e 20 53 51 4c 20 77 72 61 70 70 65  is an SQL wrappe
6970: 72 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a  r around the.  *
6980: 2a 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  * sqlite3_source
6990: 69 64 28 29 20 43 20 69 6e 74 65 72 66 61 63 65  id() C interface
69a0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  . */.  sqlite3_r
69b0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
69c0: 78 74 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75 72  xt, sqlite3_sour
69d0: 63 65 69 64 28 29 2c 20 2d 31 2c 20 53 51 4c 49  ceid(), -1, SQLI
69e0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f  TE_STATIC);.}../
69f0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
6a00: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
6a10: 65 5f 6c 6f 67 28 29 20 66 75 6e 63 74 69 6f 6e  e_log() function
6a20: 2e 20 20 54 68 69 73 20 69 73 20 61 20 77 72 61  .  This is a wra
6a30: 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 73  pper around.** s
6a40: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 2e 20 20 54  qlite3_log().  T
6a50: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
6a60: 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 75  is NULL.  The fu
6a70: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 70 75  nction exists pu
6a80: 72 65 6c 79 20 66 6f 72 0a 2a 2a 20 69 74 73 20  rely for.** its 
6a90: 73 69 64 65 2d 65 66 66 65 63 74 73 2e 0a 2a 2f  side-effects..*/
6aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 72 72  .static void err
6ab0: 6c 6f 67 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  logFunc(.  sqlit
6ac0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6ad0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
6ae0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
6af0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 55 4e 55   **argv.){.  UNU
6b00: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
6b10: 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gc);.  UNUSED_PA
6b20: 52 41 4d 45 54 45 52 28 63 6f 6e 74 65 78 74 29  RAMETER(context)
6b30: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
6b40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
6b50: 74 28 61 72 67 76 5b 30 5d 29 2c 20 22 25 73 22  t(argv[0]), "%s"
6b60: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
6b70: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a  text(argv[1]));.
6b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
6b90: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
6ba0: 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74  qlite_compileopt
6bb0: 69 6f 6e 5f 75 73 65 64 28 29 20 66 75 6e 63 74  ion_used() funct
6bc0: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  ion..** The resu
6bd0: 6c 74 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  lt is an integer
6be0: 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 73   that identifies
6bf0: 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   if the compiler
6c00: 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75   option.** was u
6c10: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 53 51 4c  sed to build SQL
6c20: 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ite..*/.#ifndef 
6c30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
6c40: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a  ILEOPTION_DIAGS.
6c50: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
6c60: 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46 75 6e  ileoptionusedFun
6c70: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
6c80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6c90: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6ca0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6cb0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
6cc0: 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 61  r *zOptName;.  a
6cd0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
6ce0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
6cf0: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 2f 2a  ETER(argc);.  /*
6d00: 20 49 4d 50 3a 20 52 2d 33 39 35 36 34 2d 33 36   IMP: R-39564-36
6d10: 33 30 35 20 54 68 65 20 73 71 6c 69 74 65 5f 63  305 The sqlite_c
6d20: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
6d30: 64 28 29 20 53 51 4c 0a 20 20 2a 2a 20 66 75 6e  d() SQL.  ** fun
6d40: 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
6d50: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71  er around the sq
6d60: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
6d70: 69 6f 6e 5f 75 73 65 64 28 29 20 43 2f 43 2b 2b  ion_used() C/C++
6d80: 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  .  ** function..
6d90: 20 20 2a 2f 0a 20 20 69 66 28 20 28 7a 4f 70 74    */.  if( (zOpt
6da0: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
6db0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
6dc0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29  e_text(argv[0]))
6dd0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
6de0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
6df0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63  ntext, sqlite3_c
6e00: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
6e10: 64 28 7a 4f 70 74 4e 61 6d 65 29 29 3b 0a 20 20  d(zOptName));.  
6e20: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
6e30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
6e40: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f  EOPTION_DIAGS */
6e50: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6e60: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  tation of the sq
6e70: 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  lite_compileopti
6e80: 6f 6e 5f 67 65 74 28 29 20 66 75 6e 63 74 69 6f  on_get() functio
6e90: 6e 2e 20 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  n. .** The resul
6ea0: 74 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68  t is a string th
6eb0: 61 74 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  at identifies th
6ec0: 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f  e compiler optio
6ed0: 6e 73 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20 62  ns .** used to b
6ee0: 75 69 6c 64 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  uild SQLite..*/.
6ef0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6f00: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
6f10: 4e 5f 44 49 41 47 53 0a 73 74 61 74 69 63 20 76  N_DIAGS.static v
6f20: 6f 69 64 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  oid compileoptio
6f30: 6e 67 65 74 46 75 6e 63 28 0a 20 20 73 71 6c 69  ngetFunc(.  sqli
6f40: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6f50: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
6f60: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
6f70: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
6f80: 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t n;.  assert( a
6f90: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
6fa0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
6fb0: 63 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  c);.  /* IMP: R-
6fc0: 30 34 39 32 32 2d 32 34 30 37 36 20 54 68 65 20  04922-24076 The 
6fd0: 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70  sqlite_compileop
6fe0: 74 69 6f 6e 5f 67 65 74 28 29 20 53 51 4c 20 66  tion_get() SQL f
6ff0: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
7000: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
7010: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6d   the sqlite3_com
7020: 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29  pileoption_get()
7030: 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69 6f 6e 2e   C/C++ function.
7040: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69  .  */.  n = sqli
7050: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
7060: 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65  gv[0]);.  sqlite
7070: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
7080: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63  ntext, sqlite3_c
7090: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74  ompileoption_get
70a0: 28 6e 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  (n), -1, SQLITE_
70b0: 53 54 41 54 49 43 29 3b 0a 7d 0a 23 65 6e 64 69  STATIC);.}.#endi
70c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
70d0: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
70e0: 49 41 47 53 20 2a 2f 0a 0a 2f 2a 20 41 72 72 61  IAGS */../* Arra
70f0: 79 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67  y for converting
7100: 20 66 72 6f 6d 20 68 61 6c 66 2d 62 79 74 65 73   from half-bytes
7110: 20 28 6e 79 62 62 6c 65 73 29 20 69 6e 74 6f 20   (nybbles) into 
7120: 41 53 43 49 49 20 68 65 78 0a 2a 2a 20 64 69 67  ASCII hex.** dig
7130: 69 74 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63  its. */.static c
7140: 6f 6e 73 74 20 63 68 61 72 20 68 65 78 64 69 67  onst char hexdig
7150: 69 74 73 5b 5d 20 3d 20 7b 0a 20 20 27 30 27 2c  its[] = {.  '0',
7160: 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20   '1', '2', '3', 
7170: 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27  '4', '5', '6', '
7180: 37 27 2c 0a 20 20 27 38 27 2c 20 27 39 27 2c 20  7',.  '8', '9', 
7190: 27 41 27 2c 20 27 42 27 2c 20 27 43 27 2c 20 27  'A', 'B', 'C', '
71a0: 44 27 2c 20 27 45 27 2c 20 27 46 27 20 0a 7d 3b  D', 'E', 'F' .};
71b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
71c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 51 55  tation of the QU
71d0: 4f 54 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  OTE() function. 
71e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   This function t
71f0: 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  akes a single.**
7200: 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74   argument.  If t
7210: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  he argument is n
7220: 75 6d 65 72 69 63 2c 20 74 68 65 20 72 65 74 75  umeric, the retu
7230: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
7240: 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68 65 20 61  same as.** the a
7250: 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65  rgument.  If the
7260: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
7270: 4c 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  L, the return va
7280: 6c 75 65 20 69 73 20 74 68 65 20 73 74 72 69 6e  lue is the strin
7290: 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20 4f 74  g.** "NULL".  Ot
72a0: 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 72 67  herwise, the arg
72b0: 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c 6f 73 65  ument is enclose
72c0: 64 20 69 6e 20 73 69 6e 67 6c 65 20 71 75 6f 74  d in single quot
72d0: 65 73 20 77 69 74 68 0a 2a 2a 20 73 69 6e 67 6c  es with.** singl
72e0: 65 2d 71 75 6f 74 65 20 65 73 63 61 70 65 73 2e  e-quote escapes.
72f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7300: 71 75 6f 74 65 46 75 6e 63 28 73 71 6c 69 74 65  quoteFunc(sqlite
7310: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7320: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
7330: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7340: 67 76 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61  gv){.  assert( a
7350: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
7360: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
7370: 63 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  c);.  switch( sq
7380: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
7390: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
73a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
73b0: 41 54 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62  AT: {.      doub
73c0: 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20  le r1, r2;.     
73d0: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
73e0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
73f0: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
7400: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
7410: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7420: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
7430: 42 75 66 2c 20 22 25 21 2e 31 35 67 22 2c 20 72  Buf, "%!.15g", r
7440: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
7450: 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 32 2c  3AtoF(zBuf, &r2,
7460: 20 32 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   20, SQLITE_UTF8
7470: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 31 21  );.      if( r1!
7480: 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =r2 ){.        s
7490: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
74a0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
74b0: 75 66 2c 20 22 25 21 2e 32 30 65 22 2c 20 72 31  uf, "%!.20e", r1
74c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
74d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
74e0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42  text(context, zB
74f0: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
7500: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
7510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7520: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
7530: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  TEGER: {.      s
7540: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
7550: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  lue(context, arg
7560: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  v[0]);.      bre
7570: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7580: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
7590: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
75a0: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ext = 0;.      c
75b0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62  har const *zBlob
75c0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
75d0: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
75e0: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
75f0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
7600: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
7610: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 42        assert( zB
7620: 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  lob==sqlite3_val
7630: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
7640: 20 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69   ); /* No encodi
7650: 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20  ng change */.   
7660: 20 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61 72     zText = (char
7670: 20 2a 29 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   *)contextMalloc
7680: 28 63 6f 6e 74 65 78 74 2c 20 28 32 2a 28 69 36  (context, (2*(i6
7690: 34 29 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20 20  4)nBlob)+4); .  
76a0: 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b      if( zText ){
76b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
76c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
76d0: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a   i<nBlob; i++){.
76e0: 20 20 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b            zText[
76f0: 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64 69  (i*2)+2] = hexdi
7700: 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e  gits[(zBlob[i]>>
7710: 34 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20 20  4)&0x0F];.      
7720: 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b      zText[(i*2)+
7730: 33 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  3] = hexdigits[(
7740: 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d 3b  zBlob[i])&0x0F];
7750: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7760: 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a     zText[(nBlob*
7770: 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  2)+2] = '\'';.  
7780: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c        zText[(nBl
7790: 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27 3b  ob*2)+3] = '\0';
77a0: 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 30  .        zText[0
77b0: 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20 20 20 20  ] = 'X';.       
77c0: 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27 27   zText[1] = '\''
77d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
77e0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
77f0: 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31  ntext, zText, -1
7800: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
7810: 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  NT);.        sql
7820: 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29  ite3_free(zText)
7830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7840: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7850: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
7860: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  T: {.      int i
7870: 2c 6a 3b 0a 20 20 20 20 20 20 75 36 34 20 6e 3b  ,j;.      u64 n;
7880: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
7890: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67  igned char *zArg
78a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
78b0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
78c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a        char *z;..
78d0: 20 20 20 20 20 20 69 66 28 20 7a 41 72 67 3d 3d        if( zArg==
78e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
78f0: 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b 20    for(i=0, n=0; 
7900: 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69  zArg[i]; i++){ i
7910: 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27  f( zArg[i]=='\''
7920: 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20   ) n++; }.      
7930: 7a 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  z = contextMallo
7940: 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34  c(context, ((i64
7950: 29 69 29 2b 28 28 69 36 34 29 6e 29 2b 33 29 3b  )i)+((i64)n)+3);
7960: 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  .      if( z ){.
7970: 20 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20 27          z[0] = '
7980: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  \'';.        for
7990: 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b  (i=0, j=1; zArg[
79a0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
79b0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72      z[j++] = zAr
79c0: 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g[i];.          
79d0: 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27  if( zArg[i]=='\'
79e0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
79f0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[j++] = '\'';.
7a00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
7a20: 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20  j++] = '\'';.   
7a30: 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20       z[j] = 0;. 
7a40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
7a50: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
7a60: 78 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74 65  xt, z, j, sqlite
7a70: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d  3_free);.      }
7a80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7a90: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
7aa0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
7ab0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
7ac0: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
7ad0: 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  LITE_NULL );.   
7ae0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7af0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
7b00: 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51 4c 49 54  "NULL", 4, SQLIT
7b10: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
7b20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7b30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75  }.}../*.** The u
7b40: 6e 69 63 6f 64 65 28 29 20 66 75 6e 63 74 69 6f  nicode() functio
7b50: 6e 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  n.  Return the i
7b60: 6e 74 65 67 65 72 20 75 6e 69 63 6f 64 65 20 63  nteger unicode c
7b70: 6f 64 65 2d 70 6f 69 6e 74 20 76 61 6c 75 65 0a  ode-point value.
7b80: 2a 2a 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ** for the first
7b90: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
7ba0: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 20  e input string. 
7bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7bc0: 75 6e 69 63 6f 64 65 46 75 6e 63 28 0a 20 20 73  unicodeFunc(.  s
7bd0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7be0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
7bf0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
7c00: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
7c10: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7c20: 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
7c30: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7c40: 76 5b 30 5d 29 3b 0a 20 20 28 76 6f 69 64 29 61  v[0]);.  (void)a
7c50: 72 67 63 3b 0a 20 20 69 66 28 20 7a 20 26 26 20  rgc;.  if( z && 
7c60: 7a 5b 30 5d 20 29 20 73 71 6c 69 74 65 33 5f 72  z[0] ) sqlite3_r
7c70: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7c80: 74 2c 20 73 71 6c 69 74 65 33 55 74 66 38 52 65  t, sqlite3Utf8Re
7c90: 61 64 28 26 7a 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ad(&z));.}../*.*
7ca0: 2a 20 54 68 65 20 63 68 61 72 28 29 20 66 75 6e  * The char() fun
7cb0: 63 74 69 6f 6e 20 74 61 6b 65 73 20 7a 65 72 6f  ction takes zero
7cc0: 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e   or more argumen
7cd0: 74 73 2c 20 65 61 63 68 20 6f 66 20 77 68 69 63  ts, each of whic
7ce0: 68 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  h is.** an integ
7cf0: 65 72 2e 20 20 49 74 20 63 6f 6e 73 74 72 75 63  er.  It construc
7d00: 74 73 20 61 20 73 74 72 69 6e 67 20 77 68 65 72  ts a string wher
7d10: 65 20 65 61 63 68 20 63 68 61 72 61 63 74 65 72  e each character
7d20: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a   of the string.*
7d30: 2a 20 69 73 20 74 68 65 20 75 6e 69 63 6f 64 65  * is the unicode
7d40: 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 74   character for t
7d50: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7d60: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
7d70: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
7d80: 64 20 63 68 61 72 46 75 6e 63 28 0a 20 20 73 71  d charFunc(.  sq
7d90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7da0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
7db0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7dc0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7dd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
7de0: 2c 20 2a 7a 4f 75 74 3b 0a 20 20 69 6e 74 20 69  , *zOut;.  int i
7df0: 3b 0a 20 20 7a 4f 75 74 20 3d 20 7a 20 3d 20 73  ;.  zOut = z = s
7e00: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
7e10: 20 61 72 67 63 2a 34 2b 31 20 29 3b 0a 20 20 69   argc*4+1 );.  i
7e20: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( z==0 ){.    s
7e30: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
7e40: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
7e50: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
7e60: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
7e70: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
7e80: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78   sqlite3_int64 x
7e90: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
7ea0: 3b 0a 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65  ;.    x = sqlite
7eb0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
7ec0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[i]);.    if( 
7ed0: 78 3c 30 20 7c 7c 20 78 3e 30 78 31 30 66 66 66  x<0 || x>0x10fff
7ee0: 66 20 29 20 78 20 3d 20 30 78 66 66 66 64 3b 0a  f ) x = 0xfffd;.
7ef0: 20 20 20 20 63 20 3d 20 28 75 6e 73 69 67 6e 65      c = (unsigne
7f00: 64 29 28 78 20 26 20 30 78 31 66 66 66 66 66 29  d)(x & 0x1fffff)
7f10: 3b 0a 20 20 20 20 69 66 28 20 63 3c 30 78 30 30  ;.    if( c<0x00
7f20: 30 38 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a 4f  080 ){.      *zO
7f30: 75 74 2b 2b 20 3d 20 28 75 38 29 28 63 26 30 78  ut++ = (u8)(c&0x
7f40: 46 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  FF);.    }else i
7f50: 66 28 20 63 3c 30 78 30 30 38 30 30 20 29 7b 0a  f( c<0x00800 ){.
7f60: 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20        *zOut++ = 
7f70: 30 78 43 30 20 2b 20 28 75 38 29 28 28 63 3e 3e  0xC0 + (u8)((c>>
7f80: 36 29 26 30 78 31 46 29 3b 0a 20 20 20 20 20 20  6)&0x1F);.      
7f90: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
7fa0: 20 28 75 38 29 28 63 20 26 20 30 78 33 46 29 3b   (u8)(c & 0x3F);
7fb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
7fc0: 3c 30 78 31 30 30 30 30 20 29 7b 0a 20 20 20 20  <0x10000 ){.    
7fd0: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 45 30    *zOut++ = 0xE0
7fe0: 20 2b 20 28 75 38 29 28 28 63 3e 3e 31 32 29 26   + (u8)((c>>12)&
7ff0: 30 78 30 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f  0x0F);.      *zO
8000: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75  ut++ = 0x80 + (u
8010: 38 29 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46  8)((c>>6) & 0x3F
8020: 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  );.      *zOut++
8030: 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 63   = 0x80 + (u8)(c
8040: 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 7d 65   & 0x3F);.    }e
8050: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74  lse{.      *zOut
8060: 2b 2b 20 3d 20 30 78 46 30 20 2b 20 28 75 38 29  ++ = 0xF0 + (u8)
8070: 28 28 63 3e 3e 31 38 29 20 26 20 30 78 30 37 29  ((c>>18) & 0x07)
8080: 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  ;.      *zOut++ 
8090: 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 28 63  = 0x80 + (u8)((c
80a0: 3e 3e 31 32 29 20 26 20 30 78 33 46 29 3b 0a 20  >>12) & 0x3F);. 
80b0: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
80c0: 78 38 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 36  x80 + (u8)((c>>6
80d0: 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20  ) & 0x3F);.     
80e0: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20   *zOut++ = 0x80 
80f0: 2b 20 28 75 38 29 28 63 20 26 20 30 78 33 46 29  + (u8)(c & 0x3F)
8100: 3b 0a 20 20 20 20 7d 20 20 20 20 20 20 20 20 20  ;.    }         
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8130: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
8140: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
8150: 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78 74  t_text64(context
8160: 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a 4f 75 74  , (char*)z, zOut
8170: 2d 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -z, sqlite3_free
8180: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
8190: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 78  }../*.** The hex
81a0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 6e  () function.  In
81b0: 74 65 72 70 72 65 74 20 74 68 65 20 61 72 67 75  terpret the argu
81c0: 6d 65 6e 74 20 61 73 20 61 20 62 6c 6f 62 2e 20  ment as a blob. 
81d0: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 68 65 78   Return.** a hex
81e0: 61 64 65 63 69 6d 61 6c 20 72 65 6e 64 65 72 69  adecimal renderi
81f0: 6e 67 20 61 73 20 74 65 78 74 2e 0a 2a 2f 0a 73  ng as text..*/.s
8200: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 46 75  tatic void hexFu
8210: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
8220: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
8230: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
8240: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
8250: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  gv.){.  int i, n
8260: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
8270: 65 64 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a  ed char *pBlob;.
8280: 20 20 63 68 61 72 20 2a 7a 48 65 78 2c 20 2a 7a    char *zHex, *z
8290: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
82a0: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
82b0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
82c0: 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  pBlob = sqlit
82d0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
82e0: 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71  gv[0]);.  n = sq
82f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8300: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73  s(argv[0]);.  as
8310: 73 65 72 74 28 20 70 42 6c 6f 62 3d 3d 73 71 6c  sert( pBlob==sql
8320: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
8330: 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20  argv[0]) );  /* 
8340: 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e  No encoding chan
8350: 67 65 20 2a 2f 0a 20 20 7a 20 3d 20 7a 48 65 78  ge */.  z = zHex
8360: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
8370: 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29  (context, ((i64)
8380: 6e 29 2a 32 20 2b 20 31 29 3b 0a 20 20 69 66 28  n)*2 + 1);.  if(
8390: 20 7a 48 65 78 20 29 7b 0a 20 20 20 20 66 6f 72   zHex ){.    for
83a0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20  (i=0; i<n; i++, 
83b0: 70 42 6c 6f 62 2b 2b 29 7b 0a 20 20 20 20 20 20  pBlob++){.      
83c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20  unsigned char c 
83d0: 3d 20 2a 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20  = *pBlob;.      
83e0: 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67 69  *(z++) = hexdigi
83f0: 74 73 5b 28 63 3e 3e 34 29 26 30 78 66 5d 3b 0a  ts[(c>>4)&0xf];.
8400: 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68        *(z++) = h
8410: 65 78 64 69 67 69 74 73 5b 63 26 30 78 66 5d 3b  exdigits[c&0xf];
8420: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 20 3d 20  .    }.    *z = 
8430: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
8440: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
8450: 78 74 2c 20 7a 48 65 78 2c 20 6e 2a 32 2c 20 73  xt, zHex, n*2, s
8460: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
8470: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a  }.}../*.** The z
8480: 65 72 6f 62 6c 6f 62 28 4e 29 20 66 75 6e 63 74  eroblob(N) funct
8490: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 7a 65  ion returns a ze
84a0: 72 6f 2d 66 69 6c 6c 65 64 20 62 6c 6f 62 20 6f  ro-filled blob o
84b0: 66 20 73 69 7a 65 20 4e 20 62 79 74 65 73 2e 0a  f size N bytes..
84c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
84d0: 65 72 6f 62 6c 6f 62 46 75 6e 63 28 0a 20 20 73  eroblobFunc(.  s
84e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
84f0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
8500: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
8510: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
8520: 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63   i64 n;.  int rc
8530: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
8540: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
8550: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
8560: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
8570: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
8580: 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29  0]);.  if( n<0 )
8590: 20 6e 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73   n = 0;.  rc = s
85a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65  qlite3_result_ze
85b0: 72 6f 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74  roblob64(context
85c0: 2c 20 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  , n); /* IMP: R-
85d0: 30 30 32 39 33 2d 36 34 39 39 34 20 2a 2f 0a 20  00293-64994 */. 
85e0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
85f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8600: 72 6f 72 5f 63 6f 64 65 28 63 6f 6e 74 65 78 74  ror_code(context
8610: 2c 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , rc);.  }.}../*
8620: 0a 2a 2a 20 54 68 65 20 72 65 70 6c 61 63 65 28  .** The replace(
8630: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 72  ) function.  Thr
8640: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ee arguments are
8650: 20 61 6c 6c 20 73 74 72 69 6e 67 73 3a 20 63 61   all strings: ca
8660: 6c 6c 0a 2a 2a 20 74 68 65 6d 20 41 2c 20 42 2c  ll.** them A, B,
8670: 20 61 6e 64 20 43 2e 20 54 68 65 20 72 65 73 75   and C. The resu
8680: 6c 74 20 69 73 20 61 6c 73 6f 20 61 20 73 74 72  lt is also a str
8690: 69 6e 67 20 77 68 69 63 68 20 69 73 20 64 65 72  ing which is der
86a0: 69 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 41 20 62  ived.** from A b
86b0: 79 20 72 65 70 6c 61 63 69 6e 67 20 65 76 65 72  y replacing ever
86c0: 79 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20  y occurrence of 
86d0: 42 20 77 69 74 68 20 43 2e 20 20 54 68 65 20 6d  B with C.  The m
86e0: 61 74 63 68 0a 2a 2a 20 6d 75 73 74 20 62 65 20  atch.** must be 
86f0: 65 78 61 63 74 2e 20 20 43 6f 6c 6c 61 74 69 6e  exact.  Collatin
8700: 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20  g sequences are 
8710: 6e 6f 74 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61  not used..*/.sta
8720: 74 69 63 20 76 6f 69 64 20 72 65 70 6c 61 63 65  tic void replace
8730: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
8740: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
8750: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
8760: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8770: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
8780: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
8790: 53 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Str;        /* T
87a0: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
87b0: 41 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73  A */.  const uns
87c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 50 61 74  igned char *zPat
87d0: 74 65 72 6e 3b 20 20 20 20 2f 2a 20 54 68 65 20  tern;    /* The 
87e0: 70 61 74 74 65 72 6e 20 73 74 72 69 6e 67 20 42  pattern string B
87f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
8800: 67 6e 65 64 20 63 68 61 72 20 2a 7a 52 65 70 3b  gned char *zRep;
8810: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
8820: 65 70 6c 61 63 65 6d 65 6e 74 20 73 74 72 69 6e  eplacement strin
8830: 67 20 43 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  g C */.  unsigne
8840: 64 20 63 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20  d char *zOut;   
8850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8860: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  e output */.  in
8870: 74 20 6e 53 74 72 3b 20 20 20 20 20 20 20 20 20  t nStr;         
8880: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8890: 66 20 7a 53 74 72 20 2a 2f 0a 20 20 69 6e 74 20  f zStr */.  int 
88a0: 6e 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20  nPattern;       
88b0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
88c0: 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e  zPattern */.  in
88d0: 74 20 6e 52 65 70 3b 20 20 20 20 20 20 20 20 20  t nRep;         
88e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
88f0: 66 20 7a 52 65 70 20 2a 2f 0a 20 20 69 36 34 20  f zRep */.  i64 
8900: 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
8910: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
8920: 73 69 7a 65 20 6f 66 20 7a 4f 75 74 20 2a 2f 0a  size of zOut */.
8930: 20 20 69 6e 74 20 6c 6f 6f 70 4c 69 6d 69 74 3b    int loopLimit;
8940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
8950: 73 74 20 7a 53 74 72 5b 5d 20 74 68 61 74 20 6d  st zStr[] that m
8960: 69 67 68 74 20 6d 61 74 63 68 20 7a 50 61 74 74  ight match zPatt
8970: 65 72 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ern[] */.  int i
8980: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
8990: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
89a0: 74 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ters */..  asser
89b0: 74 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20  t( argc==3 );.  
89c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
89d0: 28 61 72 67 63 29 3b 0a 20 20 7a 53 74 72 20 3d  (argc);.  zStr =
89e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
89f0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
8a00: 69 66 28 20 7a 53 74 72 3d 3d 30 20 29 20 72 65  if( zStr==0 ) re
8a10: 74 75 72 6e 3b 0a 20 20 6e 53 74 72 20 3d 20 73  turn;.  nStr = s
8a20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
8a30: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61  es(argv[0]);.  a
8a40: 73 73 65 72 74 28 20 7a 53 74 72 3d 3d 73 71 6c  ssert( zStr==sql
8a50: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8a60: 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20  argv[0]) );  /* 
8a70: 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e  No encoding chan
8a80: 67 65 20 2a 2f 0a 20 20 7a 50 61 74 74 65 72 6e  ge */.  zPattern
8a90: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8aa0: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
8ab0: 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d    if( zPattern==
8ac0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
8ad0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8ae0: 79 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51  ype(argv[1])==SQ
8af0: 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20 20 20  LITE_NULL.      
8b00: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
8b10: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
8b20: 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e 6d 61 6c  le(context)->mal
8b30: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
8b40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
8b50: 66 28 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d  f( zPattern[0]==
8b60: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
8b70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8b80: 79 70 65 28 61 72 67 76 5b 31 5d 29 21 3d 53 51  ype(argv[1])!=SQ
8b90: 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  LITE_NULL );.   
8ba0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8bb0: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
8bc0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74  rgv[0]);.    ret
8bd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 74  urn;.  }.  nPatt
8be0: 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ern = sqlite3_va
8bf0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31  lue_bytes(argv[1
8c00: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50  ]);.  assert( zP
8c10: 61 74 74 65 72 6e 3d 3d 73 71 6c 69 74 65 33 5f  attern==sqlite3_
8c20: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8c30: 31 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e  1]) );  /* No en
8c40: 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f  coding change */
8c50: 0a 20 20 7a 52 65 70 20 3d 20 73 71 6c 69 74 65  .  zRep = sqlite
8c60: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8c70: 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 52 65  v[2]);.  if( zRe
8c80: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
8c90: 20 6e 52 65 70 20 3d 20 73 71 6c 69 74 65 33 5f   nRep = sqlite3_
8ca0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
8cb0: 5b 32 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [2]);.  assert( 
8cc0: 7a 52 65 70 3d 3d 73 71 6c 69 74 65 33 5f 76 61  zRep==sqlite3_va
8cd0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d  lue_text(argv[2]
8ce0: 29 20 29 3b 0a 20 20 6e 4f 75 74 20 3d 20 6e 53  ) );.  nOut = nS
8cf0: 74 72 20 2b 20 31 3b 0a 20 20 61 73 73 65 72 74  tr + 1;.  assert
8d00: 28 20 6e 4f 75 74 3c 53 51 4c 49 54 45 5f 4d 41  ( nOut<SQLITE_MA
8d10: 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 7a 4f  X_LENGTH );.  zO
8d20: 75 74 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c  ut = contextMall
8d30: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 69 36 34  oc(context, (i64
8d40: 29 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 7a 4f  )nOut);.  if( zO
8d50: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ut==0 ){.    ret
8d60: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 6f 6f 70 4c  urn;.  }.  loopL
8d70: 69 6d 69 74 20 3d 20 6e 53 74 72 20 2d 20 6e 50  imit = nStr - nP
8d80: 61 74 74 65 72 6e 3b 20 20 0a 20 20 66 6f 72 28  attern;  .  for(
8d90: 69 3d 6a 3d 30 3b 20 69 3c 3d 6c 6f 6f 70 4c 69  i=j=0; i<=loopLi
8da0: 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  mit; i++){.    i
8db0: 66 28 20 7a 53 74 72 5b 69 5d 21 3d 7a 50 61 74  f( zStr[i]!=zPat
8dc0: 74 65 72 6e 5b 30 5d 20 7c 7c 20 6d 65 6d 63 6d  tern[0] || memcm
8dd0: 70 28 26 7a 53 74 72 5b 69 5d 2c 20 7a 50 61 74  p(&zStr[i], zPat
8de0: 74 65 72 6e 2c 20 6e 50 61 74 74 65 72 6e 29 20  tern, nPattern) 
8df0: 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b  ){.      zOut[j+
8e00: 2b 5d 20 3d 20 7a 53 74 72 5b 69 5d 3b 0a 20 20  +] = zStr[i];.  
8e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
8e20: 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20 73  8 *zOld;.      s
8e30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
8e40: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
8e50: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
8e60: 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 6e  .      nOut += n
8e70: 52 65 70 20 2d 20 6e 50 61 74 74 65 72 6e 3b 0a  Rep - nPattern;.
8e80: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8e90: 6e 4f 75 74 2d 31 3d 3d 64 62 2d 3e 61 4c 69 6d  nOut-1==db->aLim
8ea0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8eb0: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20  LENGTH] );.     
8ec0: 20 74 65 73 74 63 61 73 65 28 20 6e 4f 75 74 2d   testcase( nOut-
8ed0: 32 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  2==db->aLimit[SQ
8ee0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
8ef0: 48 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  H] );.      if( 
8f00: 6e 4f 75 74 2d 31 3e 64 62 2d 3e 61 4c 69 6d 69  nOut-1>db->aLimi
8f10: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
8f20: 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20  ENGTH] ){.      
8f30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8f40: 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f  _error_toobig(co
8f50: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
8f60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
8f70: 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
8f80: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
8f90: 20 20 7a 4f 6c 64 20 3d 20 7a 4f 75 74 3b 0a 20    zOld = zOut;. 
8fa0: 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69       zOut = sqli
8fb0: 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 7a 4f  te3_realloc64(zO
8fc0: 75 74 2c 20 28 69 6e 74 29 6e 4f 75 74 29 3b 0a  ut, (int)nOut);.
8fd0: 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d        if( zOut==
8fe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
8ff0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
9000: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
9010: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9020: 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20  3_free(zOld);.  
9030: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9040: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
9050: 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65  py(&zOut[j], zRe
9060: 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20  p, nRep);.      
9070: 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20  j += nRep;.     
9080: 20 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31   i += nPattern-1
9090: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
90a0: 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31  sert( j+nStr-i+1
90b0: 3d 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63  ==nOut );.  memc
90c0: 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53  py(&zOut[j], &zS
90d0: 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a  tr[i], nStr-i);.
90e0: 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b    j += nStr - i;
90f0: 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f  .  assert( j<=nO
9100: 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20  ut );.  zOut[j] 
9110: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
9120: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
9130: 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c  xt, (char*)zOut,
9140: 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   j, sqlite3_free
9150: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
9160: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
9170: 65 20 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28  e TRIM(), LTRIM(
9180: 29 2c 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66  ), and RTRIM() f
9190: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65  unctions..** The
91a0: 20 75 73 65 72 64 61 74 61 20 69 73 20 30 78 31   userdata is 0x1
91b0: 20 66 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20   for left trim, 
91c0: 30 78 32 20 66 6f 72 20 72 69 67 68 74 20 74 72  0x2 for right tr
91d0: 69 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68  im, 0x3 for both
91e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
91f0: 20 74 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c   trimFunc(.  sql
9200: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
9210: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
9220: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
9230: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
9240: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
9250: 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20  ar *zIn;        
9260: 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67   /* Input string
9270: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
9280: 67 6e 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72  gned char *zChar
9290: 53 65 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f  Set;    /* Set o
92a0: 66 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20  f characters to 
92b0: 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  trim */.  int nI
92c0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
92e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
92f0: 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74  n input */.  int
9300: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9320: 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32  * 1: trimleft  2
9330: 3a 20 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20  : trimright  3: 
9340: 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  trim */.  int i;
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9370: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
9380: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9390: 61 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  aLen = 0;       
93a0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
93b0: 65 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69  each character i
93c0: 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20  n zCharSet */.  
93d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
93e0: 61 7a 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20  azChar = 0;     
93f0: 20 20 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20    /* Individual 
9400: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43  characters in zC
9410: 68 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20  harSet */.  int 
9420: 6e 43 68 61 72 3b 20 20 20 20 20 20 20 20 20 20  nChar;          
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9440: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
9450: 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65  cters in zCharSe
9460: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69  t */..  if( sqli
9470: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
9480: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
9490: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  NULL ){.    retu
94a0: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20  rn;.  }.  zIn = 
94b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
94c0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
94d0: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75  f( zIn==0 ) retu
94e0: 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69  rn;.  nIn = sqli
94f0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
9500: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65  argv[0]);.  asse
9510: 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33  rt( zIn==sqlite3
9520: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9530: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72  [0]) );.  if( ar
9540: 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61  gc==1 ){.    sta
9550: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
9560: 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d  ed char lenOne[]
9570: 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74   = { 1 };.    st
9580: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
9590: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f 6e 65  ar * const azOne
95a0: 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20  [] = { (u8*)" " 
95b0: 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31  };.    nChar = 1
95c0: 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38  ;.    aLen = (u8
95d0: 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a  *)lenOne;.    az
95e0: 43 68 61 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  Char = (unsigned
95f0: 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a   char **)azOne;.
9600: 20 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20 30      zCharSet = 0
9610: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a  ;.  }else if( (z
9620: 43 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74 65  CharSet = sqlite
9630: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9640: 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20 20  v[1]))==0 ){.   
9650: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
9660: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  {.    const unsi
9670: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
9680: 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74    for(z=zCharSet
9690: 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e  , nChar=0; *z; n
96a0: 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 53  Char++){.      S
96b0: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
96c0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
96d0: 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20  ( nChar>0 ){.   
96e0: 20 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e 74     azChar = cont
96f0: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
9700: 74 2c 20 28 28 69 36 34 29 6e 43 68 61 72 29 2a  t, ((i64)nChar)*
9710: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31  (sizeof(char*)+1
9720: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
9730: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Char==0 ){.     
9740: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
9750: 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20   }.      aLen = 
9760: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9770: 26 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a  &azChar[nChar];.
9780: 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61        for(z=zCha
9790: 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a  rSet, nChar=0; *
97a0: 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20  z; nChar++){.   
97b0: 20 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61       azChar[nCha
97c0: 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  r] = (unsigned c
97d0: 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20 20  har *)z;.       
97e0: 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46   SQLITE_SKIP_UTF
97f0: 38 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c  8(z);.        aL
9800: 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75 38 29  en[nChar] = (u8)
9810: 28 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61  (z - azChar[nCha
9820: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r]);.      }.   
9830: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68   }.  }.  if( nCh
9840: 61 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c 61 67  ar>0 ){.    flag
9850: 73 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  s = SQLITE_PTR_T
9860: 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f 75 73  O_INT(sqlite3_us
9870: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
9880: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
9890: 20 26 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68   & 1 ){.      wh
98a0: 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20  ile( nIn>0 ){.  
98b0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
98c0: 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
98d0: 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
98e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
98f0: 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20   = aLen[i];.    
9900: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e        if( len<=n
9910: 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a 49 6e  In && memcmp(zIn
9920: 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e  , azChar[i], len
9930: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
9940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9950: 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62  if( i>=nChar ) b
9960: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49  reak;.        zI
9970: 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  n += len;.      
9980: 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20    nIn -= len;.  
9990: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
99a0: 69 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b  if( flags & 2 ){
99b0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49  .      while( nI
99c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  n>0 ){.        i
99d0: 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nt len = 0;.    
99e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
99f0: 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Char; i++){.    
9a00: 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e        len = aLen
9a10: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
9a20: 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d  f( len<=nIn && m
9a30: 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c  emcmp(&zIn[nIn-l
9a40: 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65  en],azChar[i],le
9a50: 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  n)==0 ) break;. 
9a60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9a70: 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20   if( i>=nChar ) 
9a80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e  break;.        n
9a90: 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  In -= len;.     
9aa0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9ab0: 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20   zCharSet ){.   
9ac0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9ad0: 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20  azChar);.    }. 
9ae0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
9af0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
9b00: 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49  , (char*)zIn, nI
9b10: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
9b20: 45 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ENT);.}...#ifdef
9b30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
9b40: 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
9b50: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 75  ION./*.** The "u
9b60: 6e 6b 6e 6f 77 6e 22 20 66 75 6e 63 74 69 6f 6e  nknown" function
9b70: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
9b80: 79 20 73 75 62 73 74 69 74 75 74 65 64 20 69 6e  y substituted in
9b90: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 6e 79   place of.** any
9ba0: 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 66 75   unrecognized fu
9bb0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 77 68 65 6e  nction name when
9bc0: 20 64 6f 69 6e 67 20 61 6e 20 45 58 50 4c 41 49   doing an EXPLAI
9bd0: 4e 20 6f 72 20 45 58 50 4c 41 49 4e 20 51 55 45  N or EXPLAIN QUE
9be0: 52 59 20 50 4c 41 4e 0a 2a 2a 20 77 68 65 6e 20  RY PLAN.** when 
9bf0: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
9c00: 45 5f 55 4e 4b 4e 4f 57 4e 5f 46 55 4e 43 54 49  E_UNKNOWN_FUNCTI
9c10: 4f 4e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ON compile-time 
9c20: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
9c30: 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  ** When the "sql
9c40: 69 74 65 33 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69  ite3" command-li
9c50: 6e 65 20 73 68 65 6c 6c 20 69 73 20 62 75 69 6c  ne shell is buil
9c60: 74 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  t using this fun
9c70: 63 74 69 6f 6e 61 6c 69 74 79 2c 0a 2a 2a 20 74  ctionality,.** t
9c80: 68 61 74 20 61 6c 6c 6f 77 73 20 61 6e 20 45 58  hat allows an EX
9c90: 50 4c 41 49 4e 20 6f 72 20 45 58 50 4c 41 49 4e  PLAIN or EXPLAIN
9ca0: 20 51 55 45 52 59 20 50 4c 41 4e 20 66 6f 72 20   QUERY PLAN for 
9cb0: 63 6f 6d 70 6c 65 78 20 71 75 65 72 69 65 73 0a  complex queries.
9cc0: 2a 2a 20 69 6e 76 6f 6c 76 69 6e 67 20 61 70 70  ** involving app
9cd0: 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  lication-defined
9ce0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
9cf0: 20 65 78 61 6d 69 6e 65 64 20 69 6e 20 61 20 67   examined in a g
9d00: 65 6e 65 72 69 63 0a 2a 2a 20 73 71 6c 69 74 65  eneric.** sqlite
9d10: 33 20 73 68 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  3 shell..*/.stat
9d20: 69 63 20 76 6f 69 64 20 75 6e 6b 6e 6f 77 6e 46  ic void unknownF
9d30: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
9d40: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
9d50: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
9d60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
9d70: 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f  rgv.){.  /* no-o
9d80: 70 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  p */.}.#endif /*
9d90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
9da0: 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49  KNOWN_SQL_FUNCTI
9db0: 4f 4e 2a 2f 0a 0a 0a 2f 2a 20 49 4d 50 3a 20 52  ON*/.../* IMP: R
9dc0: 2d 32 35 33 36 31 2d 31 36 31 35 30 20 54 68 69  -25361-16150 Thi
9dd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6d  s function is om
9de0: 69 74 74 65 64 20 66 72 6f 6d 20 53 51 4c 69 74  itted from SQLit
9df0: 65 20 62 79 20 64 65 66 61 75 6c 74 2e 20 49 74  e by default. It
9e00: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  .** is only avai
9e10: 6c 61 62 6c 65 20 69 66 20 74 68 65 20 53 51 4c  lable if the SQL
9e20: 49 54 45 5f 53 4f 55 4e 44 45 58 20 63 6f 6d 70  ITE_SOUNDEX comp
9e30: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
9e40: 69 73 20 75 73 65 64 0a 2a 2a 20 77 68 65 6e 20  is used.** when 
9e50: 53 51 4c 69 74 65 20 69 73 20 62 75 69 6c 74 2e  SQLite is built.
9e60: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
9e70: 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  E_SOUNDEX./*.** 
9e80: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f 75 6e  Compute the soun
9e90: 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  dex encoding of 
9ea0: 61 20 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d  a word..**.** IM
9eb0: 50 3a 20 52 2d 35 39 37 38 32 2d 30 30 30 37 32  P: R-59782-00072
9ec0: 20 54 68 65 20 73 6f 75 6e 64 65 78 28 58 29 20   The soundex(X) 
9ed0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9ee0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
9ef0: 73 20 74 68 65 0a 2a 2a 20 73 6f 75 6e 64 65 78  s the.** soundex
9f00: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
9f10: 20 73 74 72 69 6e 67 20 58 2e 20 0a 2a 2f 0a 73   string X. .*/.s
9f20: 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 6e 64  tatic void sound
9f30: 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  exFunc(.  sqlite
9f40: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
9f50: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
9f60: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
9f70: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72  **argv.){.  char
9f80: 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20 63   zResult[8];.  c
9f90: 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20 20  onst u8 *zIn;.  
9fa0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74  int i, j;.  stat
9fb0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
9fc0: 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d 20 3d  d char iCode[] =
9fd0: 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20   {.    0, 0, 0, 
9fe0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9ff0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a000: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
a010: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a020: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a030: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
a040: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a050: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a060: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
a070: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a080: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a090: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a0a0: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20  0,.    0, 0, 1, 
a0b0: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30  2, 3, 0, 1, 2, 0
a0c0: 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c  , 0, 2, 2, 4, 5,
a0d0: 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c   5, 0,.    1, 2,
a0e0: 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   6, 2, 3, 0, 1, 
a0f0: 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30  0, 2, 0, 2, 0, 0
a100: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
a110: 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c  , 0, 1, 2, 3, 0,
a120: 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20   1, 2, 0, 0, 2, 
a130: 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20  2, 4, 5, 5, 0,. 
a140: 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33     1, 2, 6, 2, 3
a150: 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 1, 0, 2, 0,
a160: 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   2, 0, 0, 0, 0, 
a170: 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74  0,.  };.  assert
a180: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 7a  ( argc==1 );.  z
a190: 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  In = (u8*)sqlite
a1a0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
a1b0: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e  v[0]);.  if( zIn
a1c0: 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75 38 2a  ==0 ) zIn = (u8*
a1d0: 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  )"";.  for(i=0; 
a1e0: 7a 49 6e 5b 69 5d 20 26 26 20 21 73 71 6c 69 74  zIn[i] && !sqlit
a1f0: 65 33 49 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d  e3Isalpha(zIn[i]
a200: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  ); i++){}.  if( 
a210: 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75 38  zIn[i] ){.    u8
a220: 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43 6f 64   prevcode = iCod
a230: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
a240: 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20 3d      zResult[0] =
a250: 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28   sqlite3Toupper(
a260: 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f 72  zIn[i]);.    for
a270: 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49 6e  (j=1; j<4 && zIn
a280: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
a290: 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f 64   int code = iCod
a2a0: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
a2b0: 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 3e 30        if( code>0
a2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a2d0: 63 6f 64 65 21 3d 70 72 65 76 63 6f 64 65 20 29  code!=prevcode )
a2e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  {.          prev
a2f0: 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20 20  code = code;.   
a300: 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a         zResult[j
a310: 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30 27  ++] = code + '0'
a320: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a330: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a340: 20 70 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a 20   prevcode = 0;. 
a350: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a360: 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a 20   while( j<4 ){. 
a370: 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b       zResult[j++
a380: 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a 20  ] = '0';.    }. 
a390: 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d 20     zResult[j] = 
a3a0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
a3b0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
a3c0: 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c 20  xt, zResult, 4, 
a3d0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
a3e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a3f0: 2f 2a 20 49 4d 50 3a 20 52 2d 36 34 38 39 34 2d  /* IMP: R-64894-
a400: 35 30 33 32 31 20 54 68 65 20 73 74 72 69 6e 67  50321 The string
a410: 20 22 3f 30 30 30 22 20 69 73 20 72 65 74 75 72   "?000" is retur
a420: 6e 65 64 20 69 66 20 74 68 65 20 61 72 67 75 6d  ned if the argum
a430: 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 4e 55  ent.    ** is NU
a440: 4c 4c 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e  LL or contains n
a450: 6f 20 41 53 43 49 49 20 61 6c 70 68 61 62 65 74  o ASCII alphabet
a460: 69 63 20 63 68 61 72 61 63 74 65 72 73 2e 20 2a  ic characters. *
a470: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  /.    sqlite3_re
a480: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
a490: 74 2c 20 22 3f 30 30 30 22 2c 20 34 2c 20 53 51  t, "?000", 4, SQ
a4a0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
a4b0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
a4c0: 4c 49 54 45 5f 53 4f 55 4e 44 45 58 20 2a 2f 0a  LITE_SOUNDEX */.
a4d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a4e0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
a4f0: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63  ION./*.** A func
a500: 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 73 20  tion that loads 
a510: 61 20 73 68 61 72 65 64 2d 6c 69 62 72 61 72 79  a shared-library
a520: 20 65 78 74 65 6e 73 69 6f 6e 20 74 68 65 6e 20   extension then 
a530: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f  returns NULL..*/
a540: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61  .static void loa
a550: 64 45 78 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e  dExt(sqlite3_con
a560: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
a570: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
a580: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
a590: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
a5a0: 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
a5b0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
a5c0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
a5d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a5e0: 50 72 6f 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  Proc;.  sqlite3 
a5f0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
a600: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
a610: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72  context);.  char
a620: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
a630: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74 68    /* Disallow th
a640: 65 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e load_extension
a650: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
a660: 75 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 49 54  unless the SQLIT
a670: 45 5f 4c 6f 61 64 45 78 74 46 75 6e 63 0a 20 20  E_LoadExtFunc.  
a680: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ** flag is set. 
a690: 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33   See the sqlite3
a6a0: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
a6b0: 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20  ension() API..  
a6c0: 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  */.  if( (db->fl
a6d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 6f 61  ags & SQLITE_Loa
a6e0: 64 45 78 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a  dExtFunc)==0 ){.
a6f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
a700: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
a710: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
a720: 64 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  d", -1);.    ret
a730: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
a740: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  argc==2 ){.    z
a750: 50 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68  Proc = (const ch
a760: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
a770: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
a780: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
a790: 50 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Proc = 0;.  }.  
a7a0: 69 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c  if( zFile && sql
a7b0: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
a7c0: 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  ion(db, zFile, z
a7d0: 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20  Proc, &zErrMsg) 
a7e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
a7f0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
a800: 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31  ext, zErrMsg, -1
a810: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
a820: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
a830: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
a840: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
a850: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
a860: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
a870: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61  the context of a
a880: 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67  .** sum() or avg
a890: 28 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d  () aggregate com
a8a0: 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  putation..*/.typ
a8b0: 65 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43  edef struct SumC
a8c0: 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63  tx SumCtx;.struc
a8d0: 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75  t SumCtx {.  dou
a8e0: 62 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f  ble rSum;      /
a8f0: 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * Floating point
a900: 20 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53   sum */.  i64 iS
a910: 75 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  um;         /* I
a920: 6e 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20  nteger sum */   
a930: 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20  .  i64 cnt;     
a940: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a950: 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65  f elements summe
a960: 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c  d */.  u8 overfl
a970: 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ow;      /* True
a980: 20 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72   if integer over
a990: 66 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75  flow seen */.  u
a9a0: 38 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20  8 approx;       
a9b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d   /* True if non-
a9c0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 61  integer value wa
a9d0: 73 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73  s input to the s
a9e0: 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  um */.};../*.** 
a9f0: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f  Routines used to
aa00: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d   compute the sum
aa10: 2c 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74  , average, and t
aa20: 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  otal..**.** The 
aa30: 53 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  SUM() function f
aa40: 6f 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b  ollows the (brok
aa50: 65 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64  en) SQL standard
aa60: 20 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20   which means.** 
aa70: 74 68 61 74 20 69 74 20 72 65 74 75 72 6e 73 20  that it returns 
aa80: 4e 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20  NULL if it sums 
aa90: 6f 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20  over no inputs. 
aaa0: 20 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a   TOTAL returns.*
aab0: 2a 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61  * 0.0 in that ca
aac0: 73 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  se.  In addition
aad0: 2c 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72  , TOTAL always r
aae0: 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77  eturns a float w
aaf0: 68 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68  here.** SUM migh
ab00: 74 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  t return an inte
ab10: 67 65 72 20 69 66 20 69 74 20 6e 65 76 65 72 20  ger if it never 
ab20: 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f  encounters a flo
ab30: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
ab40: 61 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76  alue.  TOTAL nev
ab50: 65 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55  er fails, but SU
ab60: 4d 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20  M might through 
ab70: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a  an exception if.
ab80: 2a 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20  ** it overflows 
ab90: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  an integer..*/.s
aba0: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74  tatic void sumSt
abb0: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
abc0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
abd0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
abe0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
abf0: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74  SumCtx *p;.  int
ac00: 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28   type;.  assert(
ac10: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
ac20: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
ac30: 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  rgc);.  p = sqli
ac40: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
ac50: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
ac60: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79  izeof(*p));.  ty
ac70: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
ac80: 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
ac90: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
aca0: 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54  p && type!=SQLIT
acb0: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d  E_NULL ){.    p-
acc0: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20  >cnt++;.    if( 
acd0: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  type==SQLITE_INT
ace0: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36  EGER ){.      i6
acf0: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
ad00: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
ad10: 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  ]);.      p->rSu
ad20: 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66  m += v;.      if
ad30: 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e  ( (p->approx|p->
ad40: 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20  overflow)==0 && 
ad50: 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28  sqlite3AddInt64(
ad60: 26 70 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b 0a  &p->iSum, v) ){.
ad70: 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72 66          p->overf
ad80: 6c 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  low = 1;.      }
ad90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ada0: 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73 71 6c    p->rSum += sql
adb0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
adc0: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  e(argv[0]);.    
add0: 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20 31 3b    p->approx = 1;
ade0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
adf0: 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e 61  tic void sumFina
ae00: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
ae10: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
ae20: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
ae30: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
ae40: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
ae50: 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  text, 0);.  if( 
ae60: 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b  p && p->cnt>0 ){
ae70: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 76 65 72  .    if( p->over
ae80: 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 73 71  flow ){.      sq
ae90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
aea0: 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69 6e 74 65  or(context,"inte
aeb0: 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c 2d 31  ger overflow",-1
aec0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
aed0: 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b 0a 20 20   p->approx ){.  
aee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
aef0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
af00: 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a 20 20 20  t, p->rSum);.   
af10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
af20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
af30: 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 69  64(context, p->i
af40: 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sum);.    }.  }.
af50: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 76  }.static void av
af60: 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  gFinalize(sqlite
af70: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
af80: 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70  xt){.  SumCtx *p
af90: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
afa0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
afb0: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
afc0: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74   if( p && p->cnt
afd0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
afe0: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
aff0: 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d  context, p->rSum
b000: 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29  /(double)p->cnt)
b010: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
b020: 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a  oid totalFinaliz
b030: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
b040: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
b050: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  umCtx *p;.  p = 
b060: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
b070: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
b080: 74 2c 20 30 29 3b 0a 20 20 2f 2a 20 28 64 6f 75  t, 0);.  /* (dou
b090: 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66  ble)0 In case of
b0a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
b0b0: 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
b0c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
b0d0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
b0e0: 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20 3a  t, p ? p->rSum :
b0f0: 20 28 64 6f 75 62 6c 65 29 30 29 3b 0a 7d 0a 0a   (double)0);.}..
b100: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
b110: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
b120: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73 74 61  eps track of sta
b130: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  te information f
b140: 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74 28  or the.** count(
b150: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
b160: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
b170: 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78   struct CountCtx
b180: 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63   CountCtx;.struc
b190: 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69  t CountCtx {.  i
b1a0: 36 34 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  64 n;.};../*.** 
b1b0: 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c  Routines to impl
b1c0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 28  ement the count(
b1d0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
b1e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
b1f0: 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73  void countStep(s
b200: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
b210: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
b220: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
b230: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e   **argv){.  Coun
b240: 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  tCtx *p;.  p = s
b250: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
b260: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
b270: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
b280: 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c   if( (argc==0 ||
b290: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
b2a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
b2b0: 28 61 72 67 76 5b 30 5d 29 29 20 26 26 20 70 20  (argv[0])) && p 
b2c0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
b2d0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
b2e0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
b2f0: 45 44 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69  ED.  /* The sqli
b300: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
b310: 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  unt() function i
b320: 73 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 42  s deprecated.  B
b330: 75 74 20 6a 75 73 74 20 74 6f 20 6d 61 6b 65 0a  ut just to make.
b340: 20 20 2a 2a 20 73 75 72 65 20 69 74 20 73 74 69    ** sure it sti
b350: 6c 6c 20 6f 70 65 72 61 74 65 73 20 63 6f 72 72  ll operates corr
b360: 65 63 74 6c 79 2c 20 76 65 72 69 66 79 20 74 68  ectly, verify th
b370: 61 74 20 69 74 73 20 63 6f 75 6e 74 20 61 67 72  at its count agr
b380: 65 65 73 20 77 69 74 68 20 6f 75 72 20 0a 20 20  ees with our .  
b390: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 63 6f 75 6e  ** internal coun
b3a0: 74 20 77 68 65 6e 20 75 73 69 6e 67 20 63 6f 75  t when using cou
b3b0: 6e 74 28 2a 29 20 61 6e 64 20 77 68 65 6e 20 74  nt(*) and when t
b3c0: 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 63  he total count c
b3d0: 61 6e 20 62 65 0a 20 20 2a 2a 20 65 78 70 72 65  an be.  ** expre
b3e0: 73 73 65 64 20 61 73 20 61 20 33 32 2d 62 69 74  ssed as a 32-bit
b3f0: 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 61   integer. */.  a
b400: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
b410: 7c 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30  | p==0 || p->n>0
b420: 78 37 66 66 66 66 66 66 66 0a 20 20 20 20 20 20  x7fffffff.      
b430: 20 20 20 20 7c 7c 20 70 2d 3e 6e 3d 3d 73 71 6c      || p->n==sql
b440: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
b450: 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 20 29 3b  ount(context) );
b460: 0a 23 65 6e 64 69 66 0a 7d 20 20 20 0a 73 74 61  .#endif.}   .sta
b470: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69  tic void countFi
b480: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
b490: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
b4a0: 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b  {.  CountCtx *p;
b4b0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
b4c0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
b4d0: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
b4e0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
b4f0: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 20  nt64(context, p 
b500: 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a  ? p->n : 0);.}..
b510: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
b520: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28  o implement min(
b530: 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72  ) and max() aggr
b540: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
b550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b560: 6d 69 6e 6d 61 78 53 74 65 70 28 0a 20 20 73 71  minmaxStep(.  sq
b570: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
b580: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e  ontext, .  int N
b590: 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74  otUsed, .  sqlit
b5a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
b5b0: 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20  ){.  Mem *pArg  
b5c0: 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d  = (Mem *)argv[0]
b5d0: 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a  ;.  Mem *pBest;.
b5e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
b5f0: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20 20  ER(NotUsed);..  
b600: 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73  pBest = (Mem *)s
b610: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
b620: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
b630: 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29  , sizeof(*pBest)
b640: 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73 74 20  );.  if( !pBest 
b650: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
b660: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
b670: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
b680: 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
b690: 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67   if( pBest->flag
b6a0: 73 20 29 20 73 71 6c 69 74 65 33 53 6b 69 70 41  s ) sqlite3SkipA
b6b0: 63 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63  ccumulatorLoad(c
b6c0: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65  ontext);.  }else
b6d0: 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67   if( pBest->flag
b6e0: 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78  s ){.    int max
b6f0: 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20  ;.    int cmp;. 
b700: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
b710: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75  l = sqlite3GetFu
b720: 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78  ncCollSeq(contex
b730: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  t);.    /* This 
b740: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73  step function is
b750: 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
b760: 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  he min() and max
b770: 28 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20  () aggregates,. 
b780: 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64     ** the only d
b790: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
b7a0: 6e 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20  n the two being 
b7b0: 74 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f  that the sense o
b7c0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  f the.    ** com
b7d0: 70 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72  parison is inver
b7e0: 74 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78  ted. For the max
b7f0: 28 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  () aggregate, th
b800: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
b810: 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e  _user_data() fun
b820: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76  ction returns (v
b830: 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69  oid *)-1. For mi
b840: 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65  n() it.    ** re
b850: 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62  turns (void *)db
b860: 2c 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68  , where db is th
b870: 65 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62  e sqlite3* datab
b880: 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20  ase pointer..   
b890: 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68   ** Therefore th
b8a0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
b8b0: 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27   sets variable '
b8c0: 6d 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68  max' to 1 for th
b8d0: 65 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61  e max().    ** a
b8e0: 67 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66  ggregate, or 0 f
b8f0: 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  or min()..    */
b900: 0a 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74  .    max = sqlit
b910: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
b920: 74 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d  text)!=0;.    cm
b930: 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  p = sqlite3MemCo
b940: 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70 41 72  mpare(pBest, pAr
b950: 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  g, pColl);.    i
b960: 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30  f( (max && cmp<0
b970: 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d  ) || (!max && cm
b980: 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  p>0) ){.      sq
b990: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
b9a0: 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20  (pBest, pArg);. 
b9b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b9c0: 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d  sqlite3SkipAccum
b9d0: 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65  ulatorLoad(conte
b9e0: 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  xt);.    }.  }el
b9f0: 73 65 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 64  se{.    pBest->d
ba00: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
ba10: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
ba20: 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69  ntext);.    sqli
ba30: 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70  te3VdbeMemCopy(p
ba40: 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d  Best, pArg);.  }
ba50: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  .}.static void m
ba60: 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 28 73 71  inMaxFinalize(sq
ba70: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
ba80: 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74  ontext){.  sqlit
ba90: 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a  e3_value *pRes;.
baa0: 20 20 70 52 65 73 20 3d 20 28 73 71 6c 69 74 65    pRes = (sqlite
bab0: 33 5f 76 61 6c 75 65 20 2a 29 73 71 6c 69 74 65  3_value *)sqlite
bac0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
bad0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
bae0: 0a 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20  .  if( pRes ){. 
baf0: 20 20 20 69 66 28 20 70 52 65 73 2d 3e 66 6c 61     if( pRes->fla
bb00: 67 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  gs ){.      sqli
bb10: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
bb20: 28 63 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b  (context, pRes);
bb30: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bb40: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
bb50: 28 70 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pRes);.  }.}../
bb60: 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e 63 61  *.** group_conca
bb70: 74 28 45 58 50 52 2c 20 3f 53 45 50 41 52 41 54  t(EXPR, ?SEPARAT
bb80: 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  OR?).*/.static v
bb90: 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 53  oid groupConcatS
bba0: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
bbb0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
bbc0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
bbd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
bbe0: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
bbf0: 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 53 74 72  har *zVal;.  Str
bc00: 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20  Accum *pAccum;. 
bc10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
bc20: 70 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 6e  p;.  int nVal, n
bc30: 53 65 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  Sep;.  assert( a
bc40: 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d  rgc==1 || argc==
bc50: 32 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  2 );.  if( sqlit
bc60: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
bc70: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
bc80: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
bc90: 70 41 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63  pAccum = (StrAcc
bca0: 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  um*)sqlite3_aggr
bcb0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
bcc0: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
bcd0: 41 63 63 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20  Accum));..  if( 
bce0: 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20 73 71  pAccum ){.    sq
bcf0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
bd00: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
bd10: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
bd20: 20 20 20 20 69 6e 74 20 66 69 72 73 74 54 65 72      int firstTer
bd30: 6d 20 3d 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c  m = pAccum->mxAl
bd40: 6c 6f 63 3d 3d 30 3b 0a 20 20 20 20 70 41 63 63  loc==0;.    pAcc
bd50: 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20 64 62  um->mxAlloc = db
bd60: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
bd70: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20  LIMIT_LENGTH];. 
bd80: 20 20 20 69 66 28 20 21 66 69 72 73 74 54 65 72     if( !firstTer
bd90: 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  m ){.      if( a
bda0: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  rgc==2 ){.      
bdb0: 20 20 7a 53 65 70 20 3d 20 28 63 68 61 72 2a 29    zSep = (char*)
bdc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
bdd0: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  xt(argv[1]);.   
bde0: 20 20 20 20 20 6e 53 65 70 20 3d 20 73 71 6c 69       nSep = sqli
bdf0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
be00: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20  argv[1]);.      
be10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
be20: 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20  Sep = ",";.     
be30: 20 20 20 6e 53 65 70 20 3d 20 31 3b 0a 20 20 20     nSep = 1;.   
be40: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
be50: 53 65 70 20 29 20 73 71 6c 69 74 65 33 53 74 72  Sep ) sqlite3Str
be60: 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63  AccumAppend(pAcc
be70: 75 6d 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b  um, zSep, nSep);
be80: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20  .    }.    zVal 
be90: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
bea0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
beb0: 5b 30 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d  [0]);.    nVal =
bec0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
bed0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
bee0: 20 20 20 69 66 28 20 7a 56 61 6c 20 29 20 73 71     if( zVal ) sq
bef0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
bf00: 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 56 61 6c  end(pAccum, zVal
bf10: 2c 20 6e 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73  , nVal);.  }.}.s
bf20: 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75 70  tatic void group
bf30: 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 28 73  ConcatFinalize(s
bf40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
bf50: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74 72 41  context){.  StrA
bf60: 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20  ccum *pAccum;.  
bf70: 70 41 63 63 75 6d 20 3d 20 73 71 6c 69 74 65 33  pAccum = sqlite3
bf80: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
bf90: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
bfa0: 20 20 69 66 28 20 70 41 63 63 75 6d 20 29 7b 0a    if( pAccum ){.
bfb0: 20 20 20 20 69 66 28 20 70 41 63 63 75 6d 2d 3e      if( pAccum->
bfc0: 61 63 63 45 72 72 6f 72 3d 3d 53 54 52 41 43 43  accError==STRACC
bfd0: 55 4d 5f 54 4f 4f 42 49 47 20 29 7b 0a 20 20 20  UM_TOOBIG ){.   
bfe0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
bff0: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
c000: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ontext);.    }el
c010: 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 61  se if( pAccum->a
c020: 63 63 45 72 72 6f 72 3d 3d 53 54 52 41 43 43 55  ccError==STRACCU
c030: 4d 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  M_NOMEM ){.     
c040: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c050: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
c060: 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ext);.    }else{
c070: 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
c080: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
c090: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53  ontext, sqlite3S
c0a0: 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 70 41  trAccumFinish(pA
c0b0: 63 63 75 6d 29 2c 20 2d 31 2c 20 0a 20 20 20 20  ccum), -1, .    
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
c0e0: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ee);.    }.  }.}
c0f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
c100: 74 69 6e 65 20 64 6f 65 73 20 70 65 72 2d 63 6f  tine does per-co
c110: 6e 6e 65 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f  nnection functio
c120: 6e 20 72 65 67 69 73 74 72 61 74 69 6f 6e 2e 20  n registration. 
c130: 20 4d 6f 73 74 0a 2a 2a 20 6f 66 20 74 68 65 20   Most.** of the 
c140: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
c150: 6e 73 20 61 62 6f 76 65 20 61 72 65 20 70 61 72  ns above are par
c160: 74 20 6f 66 20 74 68 65 20 67 6c 6f 62 61 6c 20  t of the global 
c170: 66 75 6e 63 74 69 6f 6e 20 73 65 74 2e 0a 2a 2a  function set..**
c180: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   This routine on
c190: 6c 79 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  ly deals with th
c1a0: 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ose that are not
c1b0: 20 67 6c 6f 62 61 6c 2e 0a 2a 2f 0a 76 6f 69 64   global..*/.void
c1c0: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
c1d0: 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69  PerConnectionBui
c1e0: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73 71  ltinFunctions(sq
c1f0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
c200: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f  t rc = sqlite3_o
c210: 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
c220: 28 64 62 2c 20 22 4d 41 54 43 48 22 2c 20 32 29  (db, "MATCH", 2)
c230: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
c240: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
c250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
c260: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c270: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
c280: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
c290: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
c2a0: 20 53 65 74 20 74 68 65 20 4c 49 4b 45 4f 50 54   Set the LIKEOPT
c2b0: 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 32 2d 61   flag on the 2-a
c2c0: 72 67 75 6d 65 6e 74 20 66 75 6e 63 74 69 6f 6e  rgument function
c2d0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
c2e0: 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
c2f0: 76 6f 69 64 20 73 65 74 4c 69 6b 65 4f 70 74 46  void setLikeOptF
c300: 6c 61 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  lag(sqlite3 *db,
c310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
c320: 6d 65 2c 20 75 38 20 66 6c 61 67 56 61 6c 29 7b  me, u8 flagVal){
c330: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  .  FuncDef *pDef
c340: 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74  ;.  pDef = sqlit
c350: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
c360: 62 2c 20 7a 4e 61 6d 65 2c 20 32 2c 20 53 51 4c  b, zName, 2, SQL
c370: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
c380: 69 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29  if( ALWAYS(pDef)
c390: 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 75   ){.    pDef->fu
c3a0: 6e 63 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67 56  ncFlags |= flagV
c3b0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
c3c0: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 62 75   Register the bu
c3d0: 69 6c 74 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20  ilt-in LIKE and 
c3e0: 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20  GLOB functions. 
c3f0: 20 54 68 65 20 63 61 73 65 53 65 6e 73 69 74 69   The caseSensiti
c400: 76 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ve.** parameter 
c410: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
c420: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49  er or not the LI
c430: 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63  KE operator is c
c440: 61 73 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65  ase.** sensitive
c450: 2e 20 20 47 4c 4f 42 20 69 73 20 61 6c 77 61 79  .  GLOB is alway
c460: 73 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65  s case sensitive
c470: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c480: 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e  3RegisterLikeFun
c490: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
c4a0: 64 62 2c 20 69 6e 74 20 63 61 73 65 53 65 6e 73  db, int caseSens
c4b0: 69 74 69 76 65 29 7b 0a 20 20 73 74 72 75 63 74  itive){.  struct
c4c0: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49   compareInfo *pI
c4d0: 6e 66 6f 3b 0a 20 20 69 66 28 20 63 61 73 65 53  nfo;.  if( caseS
c4e0: 65 6e 73 69 74 69 76 65 20 29 7b 0a 20 20 20 20  ensitive ){.    
c4f0: 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20  pInfo = (struct 
c500: 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69  compareInfo*)&li
c510: 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c  keInfoAlt;.  }el
c520: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20  se{.    pInfo = 
c530: 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  (struct compareI
c540: 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f  nfo*)&likeInfoNo
c550: 72 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rm;.  }.  sqlite
c560: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
c570: 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54  "like", 2, SQLIT
c580: 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c  E_UTF8, pInfo, l
c590: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30  ikeFunc, 0, 0, 0
c5a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61  );.  sqlite3Crea
c5b0: 74 65 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65  teFunc(db, "like
c5c0: 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
c5d0: 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75  8, pInfo, likeFu
c5e0: 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nc, 0, 0, 0);.  
c5f0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
c600: 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32 2c  c(db, "glob", 2,
c610: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
c620: 20 20 20 20 20 28 73 74 72 75 63 74 20 63 6f 6d       (struct com
c630: 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62 49  pareInfo*)&globI
c640: 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30  nfo, likeFunc, 0
c650: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 65 74 4c 69  , 0, 0);.  setLi
c660: 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67  keOptFlag(db, "g
c670: 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e  lob", SQLITE_FUN
c680: 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f  C_LIKE | SQLITE_
c690: 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65  FUNC_CASE);.  se
c6a0: 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c  tLikeOptFlag(db,
c6b0: 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20   "like", .      
c6c0: 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20  caseSensitive ? 
c6d0: 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b  (SQLITE_FUNC_LIK
c6e0: 45 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  E | SQLITE_FUNC_
c6f0: 43 41 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46  CASE) : SQLITE_F
c700: 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a  UNC_LIKE);.}../*
c710: 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73  .** pExpr points
c720: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
c730: 6e 20 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e  n which implemen
c740: 74 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ts a function.  
c750: 49 66 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72  If.** it is appr
c760: 6f 70 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79  opriate to apply
c770: 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69   the LIKE optimi
c780: 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66  zation to that f
c790: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20  unction.** then 
c7a0: 73 65 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75  set aWc[0] throu
c7b0: 67 68 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65  gh aWc[2] to the
c7c0: 20 77 69 6c 64 63 61 72 64 20 63 68 61 72 61 63   wildcard charac
c7d0: 74 65 72 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75  ters and.** retu
c7e0: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 74 68 65  rn TRUE.  If the
c7f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
c800: 20 61 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75   a LIKE-style fu
c810: 6e 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 72  nction then.** r
c820: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a  eturn FALSE..**.
c830: 2a 2a 20 2a 70 49 73 4e 6f 63 61 73 65 20 69 73  ** *pIsNocase is
c840: 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
c850: 75 70 70 65 72 63 61 73 65 20 61 6e 64 20 6c 6f  uppercase and lo
c860: 77 65 72 63 61 73 65 20 61 72 65 20 65 71 75 69  wercase are equi
c870: 76 61 6c 65 6e 74 20 66 6f 72 0a 2a 2a 20 74 68  valent for.** th
c880: 65 20 66 75 6e 63 74 69 6f 6e 20 28 64 65 66 61  e function (defa
c890: 75 6c 74 20 66 6f 72 20 4c 49 4b 45 29 2e 20 20  ult for LIKE).  
c8a0: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
c8b0: 6d 61 6b 65 73 20 74 68 65 20 64 69 73 74 69 6e  makes the distin
c8c0: 63 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e  ction.** between
c8d0: 20 75 70 70 65 72 63 61 73 65 20 61 6e 64 20 6c   uppercase and l
c8e0: 6f 77 65 72 63 61 73 65 20 28 61 73 20 64 6f 65  owercase (as doe
c8f0: 73 20 47 4c 4f 42 29 20 74 68 65 6e 20 2a 70 49  s GLOB) then *pI
c900: 73 4e 6f 63 61 73 65 20 69 73 20 73 65 74 20 74  sNocase is set t
c910: 6f 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69  o.** false..*/.i
c920: 6e 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  nt sqlite3IsLike
c930: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
c940: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70   *db, Expr *pExp
c950: 72 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73  r, int *pIsNocas
c960: 65 2c 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20  e, char *aWc){. 
c970: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
c980: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
c990: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 0a 20 20  =TK_FUNCTION .  
c9a0: 20 7c 7c 20 21 70 45 78 70 72 2d 3e 78 2e 70 4c   || !pExpr->x.pL
c9b0: 69 73 74 20 0a 20 20 20 7c 7c 20 70 45 78 70 72  ist .   || pExpr
c9c0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
c9d0: 21 3d 32 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  !=2.  ){.    ret
c9e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
c9f0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
ca00: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
ca10: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
ca20: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
ca30: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  ndFunction(db, p
ca40: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
ca50: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
ca60: 30 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  0);.  if( NEVER(
ca70: 70 44 65 66 3d 3d 30 29 20 7c 7c 20 28 70 44 65  pDef==0) || (pDe
ca80: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
ca90: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29  QLITE_FUNC_LIKE)
caa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
cab0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
cac0: 68 65 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74  he memcpy() stat
cad0: 65 6d 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68  ement assumes th
cae0: 61 74 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  at the wildcard 
caf0: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 0a 20  characters are. 
cb00: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 68   ** the first th
cb10: 72 65 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ree statements i
cb20: 6e 20 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66  n the compareInf
cb30: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
cb40: 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29  e.  ** asserts()
cb50: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72   that follow ver
cb60: 69 66 79 20 74 68 61 74 20 61 73 73 75 6d 70 74  ify that assumpt
cb70: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  ion.  */.  memcp
cb80: 79 28 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73  y(aWc, pDef->pUs
cb90: 65 72 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73  erData, 3);.  as
cba0: 73 65 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69  sert( (char*)&li
cbb0: 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68  keInfoAlt == (ch
cbc0: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
cbd0: 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61  .matchAll );.  a
cbe0: 73 73 65 72 74 28 20 26 28 28 63 68 61 72 2a 29  ssert( &((char*)
cbf0: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d  &likeInfoAlt)[1]
cc00: 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65   == (char*)&like
cc10: 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65  InfoAlt.matchOne
cc20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28   );.  assert( &(
cc30: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
cc40: 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72  Alt)[2] == (char
cc50: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d  *)&likeInfoAlt.m
cc60: 61 74 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49  atchSet );.  *pI
cc70: 73 4e 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d  sNocase = (pDef-
cc80: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
cc90: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d  ITE_FUNC_CASE)==
cca0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
ccb0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ../*.** All of t
ccc0: 68 65 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  he FuncDef struc
ccd0: 74 75 72 65 73 20 69 6e 20 74 68 65 20 61 42 75  tures in the aBu
cce0: 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61 72 72 61  iltinFunc[] arra
ccf0: 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 74 68  y above.** to th
cd00: 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  e global functio
cd10: 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 54  n hash table.  T
cd20: 68 69 73 20 6f 63 63 75 72 73 20 61 74 20 73 74  his occurs at st
cd30: 61 72 74 2d 74 69 6d 65 20 28 61 73 0a 2a 2a 20  art-time (as.** 
cd40: 61 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66  a consequence of
cd50: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
cd60: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 29 2e 0a  _initialize())..
cd70: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
cd80: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 0a 2a 2f   routine runs.*/
cd90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67  .void sqlite3Reg
cda0: 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63  isterBuiltinFunc
cdb0: 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 2f  tions(void){.  /
cdc0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
cdd0: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
cde0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
cdf0: 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  res for all of t
ce00: 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a  he functions.  *
ce10: 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  * defined in thi
ce20: 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s file..  **.  *
ce30: 2a 20 54 68 65 20 61 72 72 61 79 20 63 61 6e 6e  * The array cann
ce40: 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 73  ot be constant s
ce50: 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61 72 65  ince changes are
ce60: 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20 20 2a   made to the.  *
ce70: 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73 68 20  * FuncDef.pHash 
ce80: 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74 61 72  elements at star
ce90: 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65 6c 65  t-time.  The ele
cea0: 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20 61 72  ments of this ar
ceb0: 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72 65 61  ray.  ** are rea
cec0: 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69 6e 69  d-only after ini
ced0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20 63  tialization is c
cee0: 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2a 0a 20 20  omplete..  **.  
cef0: 2a 2a 20 46 6f 72 20 70 65 61 6b 20 65 66 66 69  ** For peak effi
cf00: 63 69 65 6e 63 79 2c 20 70 75 74 20 74 68 65 20  ciency, put the 
cf10: 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 6c 79 20  most frequently 
cf20: 75 73 65 64 20 66 75 6e 63 74 69 6f 6e 20 6c 61  used function la
cf30: 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  st..  */.  stati
cf40: 63 20 46 75 6e 63 44 65 66 20 61 42 75 69 6c 74  c FuncDef aBuilt
cf50: 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 23 69 66  inFunc[] = {.#if
cf60: 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44  def SQLITE_SOUND
cf70: 45 58 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  EX.    FUNCTION(
cf80: 73 6f 75 6e 64 65 78 2c 20 20 20 20 20 20 20 20  soundex,        
cf90: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 6f 75      1, 0, 0, sou
cfa0: 6e 64 65 78 46 75 6e 63 20 20 20 20 20 20 29 2c  ndexFunc      ),
cfb0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
cfc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
cfd0: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 56  _EXTENSION.    V
cfe0: 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78  FUNCTION(load_ex
cff0: 74 65 6e 73 69 6f 6e 2c 20 20 20 20 31 2c 20 30  tension,    1, 0
d000: 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20  , 0, loadExt    
d010: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55        ),.    VFU
d020: 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65  NCTION(load_exte
d030: 6e 73 69 6f 6e 2c 20 20 20 20 32 2c 20 30 2c 20  nsion,    2, 0, 
d040: 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20  0, loadExt      
d050: 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69      ),.#endif.#i
d060: 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
d070: 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20  THENTICATION.   
d080: 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65   FUNCTION(sqlite
d090: 5f 63 72 79 70 74 2c 20 20 20 20 20 20 20 32 2c  _crypt,       2,
d0a0: 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33 43 72   0, 0, sqlite3Cr
d0b0: 79 70 74 46 75 6e 63 20 29 2c 0a 23 65 6e 64 69  yptFunc ),.#endi
d0c0: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
d0d0: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
d0e0: 49 4f 4e 5f 44 49 41 47 53 0a 20 20 20 20 44 46  ION_DIAGS.    DF
d0f0: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63  UNCTION(sqlite_c
d100: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
d110: 64 2c 31 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69  d,1, 0, 0, compi
d120: 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46 75 6e 63  leoptionusedFunc
d130: 20 20 29 2c 0a 20 20 20 20 44 46 55 4e 43 54 49    ),.    DFUNCTI
d140: 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c  ON(sqlite_compil
d150: 65 6f 70 74 69 6f 6e 5f 67 65 74 2c 20 31 2c 20  eoption_get, 1, 
d160: 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f 70 74  0, 0, compileopt
d170: 69 6f 6e 67 65 74 46 75 6e 63 20 20 29 2c 0a 23  iongetFunc  ),.#
d180: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d190: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
d1a0: 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 20 20 20 20  ON_DIAGS */.    
d1b0: 46 55 4e 43 54 49 4f 4e 32 28 75 6e 6c 69 6b 65  FUNCTION2(unlike
d1c0: 6c 79 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  ly,          1, 
d1d0: 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20  0, 0, noopFunc, 
d1e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c   SQLITE_FUNC_UNL
d1f0: 49 4b 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e 43  IKELY),.    FUNC
d200: 54 49 4f 4e 32 28 6c 69 6b 65 6c 69 68 6f 6f 64  TION2(likelihood
d210: 2c 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30  ,        2, 0, 0
d220: 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c  , noopFunc,  SQL
d230: 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
d240: 59 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  Y),.    FUNCTION
d250: 32 28 6c 69 6b 65 6c 79 2c 20 20 20 20 20 20 20  2(likely,       
d260: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6e 6f       1, 0, 0, no
d270: 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  opFunc,  SQLITE_
d280: 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a  FUNC_UNLIKELY),.
d290: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72      FUNCTION(ltr
d2a0: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
d2b0: 20 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75   1, 1, 0, trimFu
d2c0: 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  nc         ),.  
d2d0: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d    FUNCTION(ltrim
d2e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ,              2
d2f0: 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 1, 0, trimFunc
d300: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
d310: 46 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20  FUNCTION(rtrim, 
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
d330: 32 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  2, 0, trimFunc  
d340: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
d350: 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20  NCTION(rtrim,   
d360: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 32 2c             2, 2,
d370: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
d380: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
d390: 54 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20  TION(trim,      
d3a0: 20 20 20 20 20 20 20 20 20 31 2c 20 33 2c 20 30           1, 3, 0
d3b0: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
d3c0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
d3d0: 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20  ON(trim,        
d3e0: 20 20 20 20 20 20 20 32 2c 20 33 2c 20 30 2c 20         2, 3, 0, 
d3f0: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
d400: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
d410: 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  (min,           
d420: 20 20 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69      -1, 0, 1, mi
d430: 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20 29  nmaxFunc       )
d440: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d  ,.    FUNCTION(m
d450: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
d460: 20 20 20 30 2c 20 30 2c 20 31 2c 20 30 20 20 20     0, 0, 1, 0   
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a               ),.
d480: 20 20 20 20 41 47 47 52 45 47 41 54 45 32 28 6d      AGGREGATE2(m
d490: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
d4a0: 20 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78   1, 0, 1, minmax
d4b0: 53 74 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61  Step,      minMa
d4c0: 78 46 69 6e 61 6c 69 7a 65 2c 0a 20 20 20 20 20  xFinalize,.     
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43       SQLITE_FUNC
d500: 5f 4d 49 4e 4d 41 58 20 29 2c 0a 20 20 20 20 46  _MINMAX ),.    F
d510: 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20  UNCTION(max,    
d520: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 31             -1, 1
d530: 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20  , 1, minmaxFunc 
d540: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
d550: 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20  CTION(max,      
d560: 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20            0, 1, 
d570: 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  1, 0            
d580: 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45      ),.    AGGRE
d590: 47 41 54 45 32 28 6d 61 78 2c 20 20 20 20 20 20  GATE2(max,      
d5a0: 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 31 2c          1, 1, 1,
d5b0: 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 20   minmaxStep,    
d5c0: 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65    minMaxFinalize
d5d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
d600: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 20 29  TE_FUNC_MINMAX )
d610: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  ,.    FUNCTION2(
d620: 74 79 70 65 6f 66 2c 20 20 20 20 20 20 20 20 20  typeof,         
d630: 20 20 20 31 2c 20 30 2c 20 30 2c 20 74 79 70 65     1, 0, 0, type
d640: 6f 66 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  ofFunc,  SQLITE_
d650: 46 55 4e 43 5f 54 59 50 45 4f 46 29 2c 0a 20 20  FUNC_TYPEOF),.  
d660: 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c 65 6e 67    FUNCTION2(leng
d670: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  th,            1
d680: 2c 20 30 2c 20 30 2c 20 6c 65 6e 67 74 68 46 75  , 0, 0, lengthFu
d690: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
d6a0: 5f 4c 45 4e 47 54 48 29 2c 0a 20 20 20 20 46 55  _LENGTH),.    FU
d6b0: 4e 43 54 49 4f 4e 28 69 6e 73 74 72 2c 20 20 20  NCTION(instr,   
d6c0: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
d6d0: 20 30 2c 20 69 6e 73 74 72 46 75 6e 63 20 20 20   0, instrFunc   
d6e0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
d6f0: 54 49 4f 4e 28 70 72 69 6e 74 66 2c 20 20 20 20  TION(printf,    
d700: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30          -1, 0, 0
d710: 2c 20 70 72 69 6e 74 66 46 75 6e 63 20 20 20 20  , printfFunc    
d720: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
d730: 4f 4e 28 75 6e 69 63 6f 64 65 2c 20 20 20 20 20  ON(unicode,     
d740: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
d750: 75 6e 69 63 6f 64 65 46 75 6e 63 20 20 20 20 20  unicodeFunc     
d760: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
d770: 28 63 68 61 72 2c 20 20 20 20 20 20 20 20 20 20  (char,          
d780: 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 63 68      -1, 0, 0, ch
d790: 61 72 46 75 6e 63 20 20 20 20 20 20 20 20 20 29  arFunc         )
d7a0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 61  ,.    FUNCTION(a
d7b0: 62 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  bs,             
d7c0: 20 20 20 31 2c 20 30 2c 20 30 2c 20 61 62 73 46     1, 0, 0, absF
d7d0: 75 6e 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a  unc          ),.
d7e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d7f0: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
d800: 4e 54 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  NT.    FUNCTION(
d810: 72 6f 75 6e 64 2c 20 20 20 20 20 20 20 20 20 20  round,          
d820: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 72 6f 75      1, 0, 0, rou
d830: 6e 64 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  ndFunc        ),
d840: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f  .    FUNCTION(ro
d850: 75 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  und,            
d860: 20 20 32 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64    2, 0, 0, round
d870: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 23  Func        ),.#
d880: 65 6e 64 69 66 0a 20 20 20 20 46 55 4e 43 54 49  endif.    FUNCTI
d890: 4f 4e 28 75 70 70 65 72 2c 20 20 20 20 20 20 20  ON(upper,       
d8a0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
d8b0: 75 70 70 65 72 46 75 6e 63 20 20 20 20 20 20 20  upperFunc       
d8c0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
d8d0: 28 6c 6f 77 65 72 2c 20 20 20 20 20 20 20 20 20  (lower,         
d8e0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f       1, 0, 0, lo
d8f0: 77 65 72 46 75 6e 63 20 20 20 20 20 20 20 20 29  werFunc        )
d900: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 68  ,.    FUNCTION(h
d910: 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
d920: 20 20 20 31 2c 20 30 2c 20 30 2c 20 68 65 78 46     1, 0, 0, hexF
d930: 75 6e 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a  unc          ),.
d940: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 69 66      FUNCTION2(if
d950: 6e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  null,           
d960: 20 32 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75   2, 0, 0, noopFu
d970: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
d980: 5f 43 4f 41 4c 45 53 43 45 29 2c 0a 20 20 20 20  _COALESCE),.    
d990: 56 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64 6f 6d  VFUNCTION(random
d9a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  ,            0, 
d9b0: 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 46 75 6e 63  0, 0, randomFunc
d9c0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46         ),.    VF
d9d0: 55 4e 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 62 6c  UNCTION(randombl
d9e0: 6f 62 2c 20 20 20 20 20 20 20 20 31 2c 20 30 2c  ob,        1, 0,
d9f0: 20 30 2c 20 72 61 6e 64 6f 6d 42 6c 6f 62 20 20   0, randomBlob  
da00: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
da10: 54 49 4f 4e 28 6e 75 6c 6c 69 66 2c 20 20 20 20  TION(nullif,    
da20: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 31           2, 0, 1
da30: 2c 20 6e 75 6c 6c 69 66 46 75 6e 63 20 20 20 20  , nullifFunc    
da40: 20 20 20 29 2c 0a 20 20 20 20 44 46 55 4e 43 54     ),.    DFUNCT
da50: 49 4f 4e 28 73 71 6c 69 74 65 5f 76 65 72 73 69  ION(sqlite_versi
da60: 6f 6e 2c 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  on,    0, 0, 0, 
da70: 76 65 72 73 69 6f 6e 46 75 6e 63 20 20 20 20 20  versionFunc     
da80: 20 29 2c 0a 20 20 20 20 44 46 55 4e 43 54 49 4f   ),.    DFUNCTIO
da90: 4e 28 73 71 6c 69 74 65 5f 73 6f 75 72 63 65 5f  N(sqlite_source_
daa0: 69 64 2c 20 20 30 2c 20 30 2c 20 30 2c 20 73 6f  id,  0, 0, 0, so
dab0: 75 72 63 65 69 64 46 75 6e 63 20 20 20 20 20 29  urceidFunc     )
dac0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  ,.    FUNCTION(s
dad0: 71 6c 69 74 65 5f 6c 6f 67 2c 20 20 20 20 20 20  qlite_log,      
dae0: 20 20 20 32 2c 20 30 2c 20 30 2c 20 65 72 72 6c     2, 0, 0, errl
daf0: 6f 67 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  ogFunc       ),.
db00: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 71 75 6f      FUNCTION(quo
db10: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
db20: 20 31 2c 20 30 2c 20 30 2c 20 71 75 6f 74 65 46   1, 0, 0, quoteF
db30: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20  unc        ),.  
db40: 20 20 56 46 55 4e 43 54 49 4f 4e 28 6c 61 73 74    VFUNCTION(last
db50: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 2c 20 30  _insert_rowid, 0
db60: 2c 20 30 2c 20 30 2c 20 6c 61 73 74 5f 69 6e 73  , 0, 0, last_ins
db70: 65 72 74 5f 72 6f 77 69 64 29 2c 0a 20 20 20 20  ert_rowid),.    
db80: 56 46 55 4e 43 54 49 4f 4e 28 63 68 61 6e 67 65  VFUNCTION(change
db90: 73 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  s,           0, 
dba0: 30 2c 20 30 2c 20 63 68 61 6e 67 65 73 20 20 20  0, 0, changes   
dbb0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46         ),.    VF
dbc0: 55 4e 43 54 49 4f 4e 28 74 6f 74 61 6c 5f 63 68  UNCTION(total_ch
dbd0: 61 6e 67 65 73 2c 20 20 20 20 20 30 2c 20 30 2c  anges,     0, 0,
dbe0: 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65   0, total_change
dbf0: 73 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43  s    ),.    FUNC
dc00: 54 49 4f 4e 28 72 65 70 6c 61 63 65 2c 20 20 20  TION(replace,   
dc10: 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20 30           3, 0, 0
dc20: 2c 20 72 65 70 6c 61 63 65 46 75 6e 63 20 20 20  , replaceFunc   
dc30: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
dc40: 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c 20 20 20 20  ON(zeroblob,    
dc50: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
dc60: 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 20 20 20 20  zeroblobFunc    
dc70: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
dc80: 28 73 75 62 73 74 72 2c 20 20 20 20 20 20 20 20  (substr,        
dc90: 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 73 75       2, 0, 0, su
dca0: 62 73 74 72 46 75 6e 63 20 20 20 20 20 20 20 29  bstrFunc       )
dcb0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  ,.    FUNCTION(s
dcc0: 75 62 73 74 72 2c 20 20 20 20 20 20 20 20 20 20  ubstr,          
dcd0: 20 20 20 33 2c 20 30 2c 20 30 2c 20 73 75 62 73     3, 0, 0, subs
dce0: 74 72 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  trFunc       ),.
dcf0: 20 20 20 20 41 47 47 52 45 47 41 54 45 28 73 75      AGGREGATE(su
dd00: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
dd10: 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65   1, 0, 0, sumSte
dd20: 70 2c 20 20 20 20 20 20 20 20 20 73 75 6d 46 69  p,         sumFi
dd30: 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20  nalize    ),.   
dd40: 20 41 47 47 52 45 47 41 54 45 28 74 6f 74 61 6c   AGGREGATE(total
dd50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  ,             1,
dd60: 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20   0, 0, sumStep, 
dd70: 20 20 20 20 20 20 20 20 74 6f 74 61 6c 46 69 6e          totalFin
dd80: 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20 20  alize    ),.    
dd90: 41 47 47 52 45 47 41 54 45 28 61 76 67 2c 20 20  AGGREGATE(avg,  
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
ddb0: 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20  0, 0, sumStep,  
ddc0: 20 20 20 20 20 20 20 61 76 67 46 69 6e 61 6c 69         avgFinali
ddd0: 7a 65 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47  ze    ),.    AGG
dde0: 52 45 47 41 54 45 32 28 63 6f 75 6e 74 2c 20 20  REGATE2(count,  
ddf0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
de00: 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20  0, countStep,   
de10: 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a      countFinaliz
de20: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
de30: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f    SQLITE_FUNC_CO
de40: 55 4e 54 20 20 29 2c 0a 20 20 20 20 41 47 47 52  UNT  ),.    AGGR
de50: 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 20 20 20  EGATE(count,    
de60: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
de70: 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20 20  , countStep,    
de80: 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65     countFinalize
de90: 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41    ),.    AGGREGA
dea0: 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c  TE(group_concat,
deb0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 67        1, 0, 0, g
dec0: 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 2c 20  roupConcatStep, 
ded0: 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c  groupConcatFinal
dee0: 69 7a 65 29 2c 0a 20 20 20 20 41 47 47 52 45 47  ize),.    AGGREG
def0: 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ATE(group_concat
df00: 2c 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20  ,      2, 0, 0, 
df10: 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 2c  groupConcatStep,
df20: 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61   groupConcatFina
df30: 6c 69 7a 65 29 2c 0a 20 20 0a 20 20 20 20 4c 49  lize),.  .    LI
df40: 4b 45 46 55 4e 43 28 67 6c 6f 62 2c 20 32 2c 20  KEFUNC(glob, 2, 
df50: 26 67 6c 6f 62 49 6e 66 6f 2c 20 53 51 4c 49 54  &globInfo, SQLIT
df60: 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49  E_FUNC_LIKE|SQLI
df70: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 23  TE_FUNC_CASE),.#
df80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 41 53  ifdef SQLITE_CAS
df90: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
dfa0: 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69  .    LIKEFUNC(li
dfb0: 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f  ke, 2, &likeInfo
dfc0: 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  Alt, SQLITE_FUNC
dfd0: 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e  _LIKE|SQLITE_FUN
dfe0: 43 5f 43 41 53 45 29 2c 0a 20 20 20 20 4c 49 4b  C_CASE),.    LIK
dff0: 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26  EFUNC(like, 3, &
e000: 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c  likeInfoAlt, SQL
e010: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51  ITE_FUNC_LIKE|SQ
e020: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c  LITE_FUNC_CASE),
e030: 0a 23 65 6c 73 65 0a 20 20 20 20 4c 49 4b 45 46  .#else.    LIKEF
e040: 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69  UNC(like, 2, &li
e050: 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49  keInfoNorm, SQLI
e060: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20  TE_FUNC_LIKE),. 
e070: 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65     LIKEFUNC(like
e080: 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f  , 3, &likeInfoNo
e090: 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rm, SQLITE_FUNC_
e0a0: 4c 49 4b 45 29 2c 0a 23 65 6e 64 69 66 0a 23 69  LIKE),.#endif.#i
e0b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e0c0: 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46  LE_UNKNOWN_SQL_F
e0d0: 55 4e 43 54 49 4f 4e 0a 20 20 20 20 46 55 4e 43  UNCTION.    FUNC
e0e0: 54 49 4f 4e 28 75 6e 6b 6e 6f 77 6e 2c 20 20 20  TION(unknown,   
e0f0: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30          -1, 0, 0
e100: 2c 20 75 6e 6b 6e 6f 77 6e 46 75 6e 63 20 20 20  , unknownFunc   
e110: 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20     ),.#endif.   
e120: 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73   FUNCTION(coales
e130: 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c  ce,           1,
e140: 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20   0, 0, 0        
e150: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
e160: 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65  UNCTION(coalesce
e170: 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30  ,           0, 0
e180: 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20  , 0, 0          
e190: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
e1a0: 43 54 49 4f 4e 32 28 63 6f 61 6c 65 73 63 65 2c  CTION2(coalesce,
e1b0: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20           -1, 0, 
e1c0: 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51  0, noopFunc,  SQ
e1d0: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
e1e0: 43 45 29 2c 0a 20 20 7d 3b 0a 23 69 66 6e 64 65  CE),.  };.#ifnde
e1f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
e200: 54 45 52 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  TERTABLE.  sqlit
e210: 65 33 41 6c 74 65 72 46 75 6e 63 74 69 6f 6e 73  e3AlterFunctions
e220: 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ();.#endif.#if d
e230: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
e240: 41 42 4c 45 5f 53 54 41 54 33 29 20 7c 7c 20 64  ABLE_STAT3) || d
e250: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
e260: 41 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 73 71  ABLE_STAT4).  sq
e270: 6c 69 74 65 33 41 6e 61 6c 79 7a 65 46 75 6e 63  lite3AnalyzeFunc
e280: 74 69 6f 6e 73 28 29 3b 0a 23 65 6e 64 69 66 0a  tions();.#endif.
e290: 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
e2a0: 72 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69 6f  rDateTimeFunctio
e2b0: 6e 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  ns();.  sqlite3I
e2c0: 6e 73 65 72 74 42 75 69 6c 74 69 6e 46 75 6e 63  nsertBuiltinFunc
e2d0: 73 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 2c 20  s(aBuiltinFunc, 
e2e0: 41 72 72 61 79 53 69 7a 65 28 61 42 75 69 6c 74  ArraySize(aBuilt
e2f0: 69 6e 46 75 6e 63 29 29 3b 0a 0a 23 69 66 20 30  inFunc));..#if 0
e300: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 6f 20 70    /* Enable to p
e310: 72 69 6e 74 20 6f 75 74 20 68 6f 77 20 74 68 65  rint out how the
e320: 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
e330: 6f 6e 73 20 61 72 65 20 68 61 73 68 65 64 20 2a  ons are hashed *
e340: 2f 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  /.  {.    int i;
e350: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  .    FuncDef *p;
e360: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e370: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53 48  SQLITE_FUNC_HASH
e380: 5f 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _SZ; i++){.     
e390: 20 70 72 69 6e 74 66 28 22 46 55 4e 43 2d 48 41   printf("FUNC-HA
e3a0: 53 48 20 25 30 32 64 3a 22 2c 20 69 29 3b 0a 20  SH %02d:", i);. 
e3b0: 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74       for(p=sqlit
e3c0: 65 33 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  e3BuiltinFunctio
e3d0: 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20 70 3d 70 2d  ns.a[i]; p; p=p-
e3e0: 3e 75 2e 70 48 61 73 68 29 7b 0a 20 20 20 20 20  >u.pHash){.     
e3f0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
e400: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e  e3Strlen30(p->zN
e410: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  ame);.        in
e420: 74 20 68 20 3d 20 70 2d 3e 7a 4e 61 6d 65 5b 30  t h = p->zName[0
e430: 5d 20 2b 20 6e 3b 0a 20 20 20 20 20 20 20 20 70  ] + n;.        p
e440: 72 69 6e 74 66 28 22 20 25 73 28 25 64 29 22 2c  rintf(" %s(%d)",
e450: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 68 29 3b 0a 20   p->zName, h);. 
e460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69       }.      pri
e470: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  ntf("\n");.    }
e480: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a        .  }.#endif.}.